@wowok/skills 3.2.0 → 3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/wowok-arbitrator/SKILL.md +60 -189
- package/wowok-auditor/SKILL.md +3 -3
- package/wowok-collaborator/SKILL.md +33 -73
- package/wowok-governance/SKILL.md +32 -71
- package/wowok-machine/SKILL.md +64 -206
- package/wowok-market/SKILL.md +25 -62
- package/wowok-messenger/SKILL.md +50 -172
- package/wowok-onboard/SKILL.md +50 -124
- package/wowok-order/SKILL.md +93 -211
- package/wowok-output/SKILL.md +59 -168
- package/wowok-planner/SKILL.md +26 -74
- package/wowok-provider/SKILL.md +66 -168
- package/wowok-supplier/SKILL.md +51 -76
package/wowok-output/SKILL.md
CHANGED
|
@@ -2,203 +2,94 @@
|
|
|
2
2
|
name: wowok-output
|
|
3
3
|
description: "WoWok output processing and display — post-processes all WoWok tool responses for human-readable presentation. Handles address resolution, name mapping, amount formatting, and data visualization. Use when: AI has received response from any WoWok MCP tool; Response contains addresses requiring name resolution; Response contains amounts requiring human-readable formatting; User queries on-chain data (events, objects, tables)."
|
|
4
4
|
metadata:
|
|
5
|
-
version: "2.
|
|
5
|
+
version: "2.1.0"
|
|
6
6
|
role: shared
|
|
7
7
|
loading: always
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
#
|
|
10
|
+
# WoWok Output Rules
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
Post-process every WoWok tool response before showing it: resolve addresses, format monetary fields from `_money_display`, render tables consistently.
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
# Addresses
|
|
15
|
+
|
|
16
|
+
## Environment split (decide first)
|
|
15
17
|
|
|
16
18
|
| Environment | Default display | Full address |
|
|
17
19
|
|---|---|---|
|
|
18
|
-
| **WoWok client** (rich renderer
|
|
19
|
-
| **Other
|
|
20
|
-
|
|
21
|
-
Rules that hold in BOTH environments:
|
|
22
|
-
- **NEVER truncate with `…`** (e.g. `0x00f6…a5839` is FORBIDDEN). It is neither a valid full address nor a valid SHORTID — it cannot be resolved, copied, or acted on. The only compact form allowed is the SHORTID transform defined below.
|
|
23
|
-
- The full 66-character address is ALWAYS present in the tool results injected into your context — nothing is lost when you display a name/SHORTID; you can produce the full address on request.
|
|
24
|
-
|
|
25
|
-
## Inside the WoWok client (rich rendering — authoritative)
|
|
26
|
-
|
|
27
|
-
The client renders EVERY complete `0x`-prefixed address in your reply
|
|
28
|
-
automatically as the canonical address chip — local name, DEFAULT badge,
|
|
29
|
-
first-byte object-type icon, and hover popup (Explorer / Analyze / AI / copy).
|
|
30
|
-
|
|
31
|
-
Therefore:
|
|
32
|
-
- Write the full address in prose OR in inline code — both become chips.
|
|
33
|
-
- Do NOT attach names, labels, short ids, or parentheses to an address (no `(default)`, no `Name 0x<full-address>`); the client resolves and renders name/type/DEFAULT state itself.
|
|
34
|
-
|
|
35
|
-
## Other AI clients (generic MCP clients — plain markdown, no custom renderer)
|
|
36
|
-
|
|
37
|
-
External clients render standard markdown only (no popup, no chips). Default to
|
|
38
|
-
a CONCISE display — full 66-char addresses are noisy and are not shown unless
|
|
39
|
-
asked:
|
|
40
|
-
|
|
41
|
-
- **Named** (account name or local_mark resolved via `local_names` / tool
|
|
42
|
-
results): show the NAME ONLY, e.g. `alice_wallet`. Never append an id.
|
|
43
|
-
- **Unnamed**: show the SHORTID (format below), e.g. `10EF-A11`.
|
|
44
|
-
- **Default account** (the on-chain default account, which has an empty name):
|
|
45
|
-
mark it as `(default)`, e.g. `(default) 10EF-A11`.
|
|
46
|
-
- In tables: name or SHORTID in the cell; the full address is omitted by default.
|
|
47
|
-
- **Full address on request**: when the user explicitly asks to see full /
|
|
48
|
-
detailed / complete addresses ("show the full address", "give me the complete
|
|
49
|
-
address", "copyable address"), output the COMPLETE `0x` + 64 hex chars
|
|
50
|
-
wrapped in inline code so it is one-click copyable in any markdown client.
|
|
51
|
-
When a name is known, put name + full address together:
|
|
52
|
-
**alice_wallet** `0xFULLADDRESS`.
|
|
53
|
-
|
|
54
|
-
## User override
|
|
55
|
-
|
|
56
|
-
- Other clients, "show full / long / complete addresses" → output the full inline-code address for that reply.
|
|
57
|
-
- Other clients, "use short / compact" → SHORTID (already the default for unnamed addresses).
|
|
58
|
-
- WoWok client: always full addresses regardless — the chip renderer handles display.
|
|
59
|
-
|
|
60
|
-
## SHORTID format
|
|
61
|
-
|
|
62
|
-
System-wide rule (identical to the client's `formatAddress`):
|
|
63
|
-
1. Remove the `0x` prefix → hex string
|
|
64
|
-
2. Keep the FIRST 4 and the LAST 3 hex chars, joined by `-`
|
|
65
|
-
3. Convert to UPPERCASE
|
|
66
|
-
4. 7 hex chars or fewer → the whole string, uppercased
|
|
67
|
-
5. Empty / missing → `--`
|
|
68
|
-
|
|
69
|
-
**Examples**:
|
|
70
|
-
| Full Address | SHORTID | Rule |
|
|
71
|
-
|---|---|---|
|
|
72
|
-
| `0xa1d421902a3e5f2e4da7590e8f243712b3b3479d1a07c48c2de543184fc97a33` | `A1D4-A33` | first 4 + `-` + last 3 |
|
|
73
|
-
| `0x10ef0000000000000000000000000000000000000000000000000000000cda11` | `10EF-A11` | first 4 + `-` + last 3 |
|
|
74
|
-
| `0x2` | `2` | ≤7 chars, as-is |
|
|
75
|
-
|
|
76
|
-
## Resolution priority
|
|
20
|
+
| **WoWok client** (rich chip renderer) | Full `0x`+64 hex in prose or inline code — the client converts it to a chip (name, DEFAULT badge, type icon, popup). Attach NO labels yourself | always |
|
|
21
|
+
| **Other / plain-markdown clients** | Resolved **name only**, else **SHORTID**; empty-name default account tagged `(default)` | only when the user explicitly asks |
|
|
77
22
|
|
|
78
|
-
|
|
23
|
+
Both environments:
|
|
24
|
+
- **NEVER hand-truncate with `…`** (`0x00f6…a5839` is forbidden — not resolvable, not copyable). SHORTID is the only compact form.
|
|
25
|
+
- The full address is always present in the tool result in context, so a name/SHORTID display loses nothing.
|
|
26
|
+
- Named → name ONLY, never `name 10EF-A11` and never append an id.
|
|
79
27
|
|
|
80
|
-
|
|
28
|
+
Explicit user overrides: "show full/complete/copyable address" → complete address in inline code (plus name when known: **alice_wallet** `0xFULL…`). "use short/compact" → SHORTID. WoWok client always stays full (the chip owns display).
|
|
81
29
|
|
|
82
|
-
|
|
83
|
-
renders the name chip itself; other clients show the name).
|
|
84
|
-
- Unnamed: WoWok client → full address (chip); other clients → SHORTID.
|
|
85
|
-
- The account with an empty name that is the on-chain default → other clients
|
|
86
|
-
tag it `(default)`; the WoWok client adds its DEFAULT badge automatically.
|
|
87
|
-
- When both an account name and a local_mark exist, prefer local_mark (object
|
|
88
|
-
names) for objects and the account name for user addresses.
|
|
30
|
+
## SHORTID (system rule, same as client `formatAddress`)
|
|
89
31
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
## Name Display
|
|
32
|
+
1. Strip `0x`; 2. first 4 + `-` + last 3 hex chars; 3. UPPERCASE; 4. ≤7 hex chars → whole string uppercased; 5. empty/missing → `--`.
|
|
33
|
+
Special: the blueprint sentinel `draft:<name>` is not an on-chain address — render `Draft`.
|
|
93
34
|
|
|
94
|
-
|
|
35
|
+
| Full | SHORTID |
|
|
36
|
+
|---|---|
|
|
37
|
+
| `0xa1d42190…184fc97a33` | `A1D4-A33` |
|
|
38
|
+
| `0x10ef0000…000cda11` | `10EF-A11` |
|
|
39
|
+
| `0x2` | `2` |
|
|
95
40
|
|
|
96
|
-
|
|
41
|
+
## Resolution
|
|
97
42
|
|
|
98
|
-
|
|
43
|
+
Batch-resolve with `query_toolkit` query_type=`local_names` → `{ account?, local_mark?, address }[]`. Prefer `local_mark` for objects, account name for user addresses. Unnamed → chip (WoWok client) or SHORTID + `(default)` for the empty-name on-chain default account elsewhere.
|
|
99
44
|
|
|
100
|
-
|
|
45
|
+
# Amounts
|
|
101
46
|
|
|
102
|
-
|
|
103
|
-
- `precision_known === false` → `text` contains the raw value with a retry hint; show as-is (the true raw value is authoritative)
|
|
47
|
+
## Primary: `_money_display`
|
|
104
48
|
|
|
105
|
-
|
|
106
|
-
- `account_balance` — balance and coin amounts
|
|
107
|
-
- `onchain_objects` — Treasury, Service, Order, Allocation, Payment, Reward, Arb, Discount monetary fields
|
|
108
|
-
- `onchain_table_item_treasury_history` / `onchain_table_item_reward_record` — table entry amounts
|
|
109
|
-
- `onchain_received` — CoinWrapper balances
|
|
110
|
-
- `onchain_transaction` — balance_changes (each change has its own `coin_type`)
|
|
111
|
-
- `onchain_events` — NewOrderEvent.amount (via the order's Service generic token type)
|
|
49
|
+
Monetary query results carry `_money_display`: a map of field paths → `{raw, display, symbol?, decimals?, token_type, precision_known, text}`. Use it directly — it is the authoritative precision-resolved display.
|
|
112
50
|
|
|
113
|
-
|
|
51
|
+
- `precision_known: true` → show `text` as-is, e.g. `2.2 WOW (decimals: 9; raw: 2200000000)`.
|
|
52
|
+
- `precision_known: false` → `display === raw`, no conversion happened; show the raw value (optionally retry token resolution via `token_list`).
|
|
114
53
|
|
|
115
|
-
|
|
54
|
+
Annotated query types: `account_balance`; `onchain_objects` (Treasury/Service/Order/Allocation/Payment/Reward/Arb/Discount monetary fields); `onchain_table_item_treasury_history`, `onchain_table_item_reward_record`; `onchain_received` (CoinWrapper); `onchain_transaction` (balance_changes, each with its own `coin_type`, signed); `onchain_events` (`NewOrderEvent.amount`, resolved via the order's Service token type).
|
|
116
55
|
|
|
117
|
-
|
|
118
|
-
|-----------|---------|---------|
|
|
119
|
-
| Token info UNAVAILABLE | Raw amount | `500000000` |
|
|
120
|
-
| Token info AVAILABLE | Converted + symbol + precision | `2.2 WOW (decimals: 9; raw: 2200000000)` |
|
|
56
|
+
## Fallback (no annotation)
|
|
121
57
|
|
|
122
|
-
|
|
123
|
-
**Format**: `{amount} {symbol} (decimals: {N}; raw: {raw})`
|
|
58
|
+
When in doubt, raw. Token info unavailable → raw integer (`500000000`). Available → `raw / 10^decimals`, formatted `{amount} {symbol} (decimals: {N}; raw: {raw})`.
|
|
124
59
|
|
|
125
|
-
|
|
60
|
+
# Events
|
|
126
61
|
|
|
127
|
-
#
|
|
62
|
+
Table template: `| # | Time | Sender | Service | Amount | Order |` — address cells follow the environment split.
|
|
128
63
|
|
|
129
|
-
|
|
64
|
+
Key fields of the common built-in events (authoritative list + triggers live in the MCP Event Semantics Registry):
|
|
130
65
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
|
144
|
-
|------------|------------|
|
|
145
|
-
| `NewOrderEvent` | sender, service, amount, object |
|
|
146
|
-
| `ProgressEvent` | order, operator, machine |
|
|
147
|
-
| `ArbEvent` | arbitration, voter, order, service |
|
|
148
|
-
| `DemandPresentEvent` | demand, presenter, service |
|
|
149
|
-
| `DemandFeedbackEvent` | demand, feedbacker |
|
|
150
|
-
| `NewEntityEvent` | entity |
|
|
151
|
-
|
|
152
|
-
---
|
|
66
|
+
| Event | Key fields |
|
|
67
|
+
|---|---|
|
|
68
|
+
| `NewOrderEvent` | sender (base), object (Order), service, amount, allocation, progress |
|
|
69
|
+
| `ProgressEvent` | object (Progress), machine, task (usually the Order), node, forward, hold |
|
|
70
|
+
| `ArbEvent` | object (Arb case), arbitration, order, status, indemnity_amount, compensation_time |
|
|
71
|
+
| `VoteEvent` | object (Arb), voter, agrees, weight |
|
|
72
|
+
| `FeedbackEvent` | object (Arb), feedback |
|
|
73
|
+
| `ArbitrationEvent` | object (service), location, description, fee, voting_guard_count |
|
|
74
|
+
| `DemandPresentEvent` | object (Demand), service (Option), recommend |
|
|
75
|
+
| `DemandFeedbackEvent` | object (Demand), service (Option), feedback, acceptance_score (0–100, Option) |
|
|
76
|
+
| `DemandChangedEvent` | object (Demand), location, description, rewards |
|
|
77
|
+
| `NewEntityEvent` | resource, referrer (Option) |
|
|
78
|
+
| `ServiceEvent` / `AllocationEvent` / `TreasuryEvent` / `NewPaymentEvent` / `RewardClaimEvent` / `RewardFundEvent` | resolve via the registry rather than guessing field names |
|
|
153
79
|
|
|
154
|
-
# Field
|
|
80
|
+
# Field glossary
|
|
155
81
|
|
|
156
|
-
|
|
82
|
+
- **Raw**: on-chain u64 in smallest units. **Converted**: after dividing by 10^decimals. **Decimals**: token precision.
|
|
83
|
+
- **Time**: Unix **milliseconds**; render in the user's local time.
|
|
84
|
+
- **Sender**: transaction initiator; **Service**: the ordered object; **Order object** (`object` field on `NewOrderEvent`): the order's unique id.
|
|
85
|
+
- **SHORTID**: compact display (first4-`-`-last3 uppercase); never `…` truncation.
|
|
157
86
|
|
|
158
|
-
|
|
159
|
-
- **Sender**: Account that initiated the transaction
|
|
160
|
-
- **Service**: Service object being ordered/interacted with
|
|
161
|
-
- **Order Object**: Unique on-chain identifier for this order
|
|
162
|
-
- **Short Address (SHORTID)**: Compact display form (first 4 + `-` + last 3 hex chars, uppercase). Default for unnamed addresses in other AI clients; the WoWok client applies it automatically inside its address chips. Never hand-truncate with `…`.
|
|
87
|
+
# Checklist
|
|
163
88
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
89
|
+
1. Collect unique addresses → one `local_names` batch.
|
|
90
|
+
2. Read `_money_display` first; only fall back to `token_list` + manual conversion when absent.
|
|
91
|
+
3. Apply the environment split (WoWok client: full addresses; others: name/SHORTID/`(default)`).
|
|
92
|
+
4. Keep event field names exact per the table above.
|
|
93
|
+
5. Render (tables: name/SHORTID cells unless full was requested).
|
|
169
94
|
|
|
170
|
-
|
|
171
|
-
- **Timestamp**: Unix milliseconds since epoch
|
|
172
|
-
- **Human-readable**: Converted local time
|
|
173
|
-
|
|
174
|
-
---
|
|
175
|
-
|
|
176
|
-
# Implementation Checklist
|
|
177
|
-
|
|
178
|
-
- [ ] Extract unique addresses from response
|
|
179
|
-
- [ ] Query `local_names` for resolution
|
|
180
|
-
- [ ] Check for `_money_display` annotations in query results (primary amount source)
|
|
181
|
-
- [ ] If `_money_display` absent, query `token_list` for manual amount formatting
|
|
182
|
-
- [ ] Address display: WoWok client → full `0x`+64 hex addresses (auto chips);
|
|
183
|
-
other clients → resolved name, or SHORTID for unnamed / `(default)` for the
|
|
184
|
-
default account; full inline-code address only when the user asks
|
|
185
|
-
- [ ] Never hand-truncate addresses with `…` — SHORTID is the only compact form
|
|
186
|
-
- [ ] Apply amount format rules (use `_money_display` first; fallback to conservative)
|
|
187
|
-
- [ ] Render final output
|
|
188
|
-
|
|
189
|
-
---
|
|
190
|
-
|
|
191
|
-
# Related Skills
|
|
192
|
-
|
|
193
|
-
| Skill / MCP Knowledge | Purpose |
|
|
194
|
-
|-------|---------|
|
|
195
|
-
| MCP `schema_query` action='get_safety_rules' | Pre-operation safety checks (sunk from wowok-safety) |
|
|
196
|
-
| MCP `schema_query` action='get_guard_design_patterns' | Guard design & validation (sunk from wowok-guard) |
|
|
197
|
-
| MCP `schema_query` action='get_tool_reference' | Tool selection patterns (sunk from wowok-tools) |
|
|
198
|
-
| [wowok-order](../wowok-order/SKILL.md) | Order lifecycle (buyer) |
|
|
199
|
-
| [wowok-provider](../wowok-provider/SKILL.md) | Service management (merchant) |
|
|
200
|
-
| [wowok-arbitrator](../wowok-arbitrator/SKILL.md) | Dispute resolution |
|
|
201
|
-
| [wowok-machine](../wowok-machine/SKILL.md) | Workflow design |
|
|
202
|
-
| [wowok-messenger](../wowok-messenger/SKILL.md) | Encrypted communication |
|
|
203
|
-
|
|
204
|
-
---
|
|
95
|
+
> Design patterns and tool selection stay in the MCP knowledge layer: `schema_query` `get_safety_rules` / `get_guard_design_patterns` / `get_tool_reference`.
|
package/wowok-planner/SKILL.md
CHANGED
|
@@ -2,94 +2,46 @@
|
|
|
2
2
|
name: wowok-planner
|
|
3
3
|
description: "WoWok Planning Skill — the planning component of the L4 Harness Plan Loop. Converts natural-language intent into an executable Object Dependency Graph (ODG) plus a phased plan. Deterministic-first: rule tables and scenario templates drive planning; the LLM only clarifies intent. Produces an ODG consumed by the Harness execution loop, with checkpoints between phases. Not for direct execution — hand off to wowok-onboard or wowok-provider once the ODG is confirmed. Use when: User describes a new service intent and needs a build plan; the Harness opens a Plan Loop cycle; User asks \"what do I need to create to support X\"; User wants to reuse existing objects for a new service; User asks for a dependency graph or execution phases; User resumes an interrupted planning session."
|
|
4
4
|
metadata:
|
|
5
|
-
version: "2.
|
|
5
|
+
version: "2.1.0"
|
|
6
6
|
role: shared
|
|
7
7
|
related: "wowok-onboard, wowok-auditor, wowok-provider"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# WoWok Planning Skill
|
|
11
11
|
|
|
12
|
-
Converts natural-language intent into an executable
|
|
12
|
+
Converts natural-language intent into an executable, dependency-ordered build plan. Deterministic-first: the MCP pipeline decides the shape; you only clarify ambiguity and translate free-text answers into typed fields. You NEVER execute chain transactions — the plan is materialized later via `onchain_operations`.
|
|
13
13
|
|
|
14
|
-
> **Layer**: L3 Skill,
|
|
15
|
-
> **Related
|
|
16
|
-
> Industry modes
|
|
14
|
+
> **Layer**: L3 Skill, planner for the L4 Harness Plan Loop
|
|
15
|
+
> **Related**: [wowok-onboard](../wowok-onboard/SKILL.md) (guided execution), [wowok-auditor](../wowok-auditor/SKILL.md) (pre-publish gate), [wowok-machine](../wowok-machine/SKILL.md), [wowok-provider](../wowok-provider/SKILL.md)
|
|
16
|
+
> Industry modes / Guard patterns / safety rules are MCP knowledge: `industry_pack_operation` (`recommend_industry` / `list_modes` / `derive_user_mode`) and `schema_query` (`get_guard_design_patterns` / `get_safety_rules` / `get_tool_reference`).
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
## Overview
|
|
21
|
-
|
|
22
|
-
The planner sits between the user's intent and the Harness execution loop. It does NOT execute MCP transactions directly — it produces an ODG document that the Harness consumes phase-by-phase. This separation enforces review-before-write: every irreversible action is visible in the plan before any transaction is signed.
|
|
23
|
-
|
|
24
|
-
### Design Philosophy
|
|
25
|
-
|
|
26
|
-
- **Deterministic-first**: Rule tables and scenario templates produce the ODG skeleton. The LLM is invoked only for (a) intent clarification when keywords are ambiguous, and (b) translating free-text answers into typed fields.
|
|
27
|
-
- **Scenario-driven**: The Scenario Registry maps common intent patterns to pre-built ODG templates. A fallback `general` template absorbs unmatched intents.
|
|
28
|
-
- **Plan-before-write**: The full ODG is confirmed through the phase review gates (`user_confirm` / `risk_check` / `final_audit`) before any publish-bound object is created. Reversibility is tracked per object. (Note: the R1–R10 rounds in MCP schemas are the Guard-authoring dialogue rounds — R1=intent, R2=table, R3=tree, R4=rely, R5=binding, R6=review, R7=CREATE, R8=test, R9=bind, R10=verify — not ODG plan phases; label local build checklists "Step n", never "Rn".)
|
|
29
|
-
- **Checkpointed**: Round state is anchored in a Goal (`goal_operation` create/approve/advance; the Harness TaskProcess stream persists every round), and the human-readable ODG JSON is written to the local workspace via `workspace_operation` so the Harness can resume on interruption. Do NOT use `local_info_operation` for this — that store is private customer-required info, not planning state.
|
|
18
|
+
## The planning pipeline (all under `goal_operation`)
|
|
30
19
|
|
|
31
|
-
|
|
20
|
+
Do not invent a plan format or gate names — the MCP owns the artifacts:
|
|
32
21
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
-
|
|
36
|
-
-
|
|
37
|
-
- Hands off to the Harness with a checkpoint plan and per-phase verification hooks
|
|
22
|
+
1. **Industry** (optional first): `industry_pack_operation` `recommend_industry` with the intent text; confirm one of the returned modes (`list_modes` to see all; `derive_user_mode` to fork a custom one).
|
|
23
|
+
2. **Guided wizard (default for merchants)**: `merchant_guide` — a stateless 10-step wizard (intent → industry → roles → deliverables → payment → trust → blueprint → score preview → harness checks → **creation_plan**). Pass the opaque `guide_state` back UNCHANGED each turn with the user's `guide_confirm`. Step 10 returns a topological `creation_plan` (order / object_type / depends_on / operation_hint) computed from the semantic graph — that order IS the plan.
|
|
24
|
+
3. **Object-level pipeline (advanced / harness)**: `analyze_intent` (C1: parsed intent, per-object puzzle snapshots, missing dimensions, `recommended_creation_order`) → `aggregate_risks` (C2: blocking RISK status — pass the puzzles through UNCHANGED) → `trace_substeps` (C3: substep DAG + coherence verdict). Omit `puzzles` and pass `intent` to run C1→C2 in one call.
|
|
25
|
+
4. **Materialize after GO**: create objects in `creation_plan` order via `onchain_operations` (that belongs to wowok-onboard / wowok-provider), then pass the pre-publish gate (wowok-auditor).
|
|
38
26
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
- User says "I want to build / set up / start / plan X"
|
|
42
|
-
- L4 Harness opens a new Plan Loop cycle
|
|
43
|
-
- User resumes an interrupted plan (read the Goal state and the workspace ODG file first)
|
|
44
|
-
- Do NOT invoke for: live order operations, dispute resolution, or post-publish tuning — those go to wowok-provider / wowok-arbitrator.
|
|
45
|
-
|
|
46
|
-
### Output Contract
|
|
47
|
-
|
|
48
|
-
A confirmed ODG JSON document (see §ODG Data Structure) with: scenario tag, complete object list with dependencies and reversibility, ordered phases, risk assessment, and a Harness handoff packet including checkpoint keys.
|
|
49
|
-
|
|
50
|
-
---
|
|
27
|
+
## Checkpoints & resumability
|
|
51
28
|
|
|
52
|
-
|
|
29
|
+
- Round state lives in a Goal: `goal_operation` `create` → `approve` / `advance` (plus `bind` / `pause` / `complete` / `abandon` as the lifecycle requires). Never fake completion outside the Goal.
|
|
30
|
+
- Persist human-readable plan artifacts with `workspace_operation` (`write` / `read` / `list`) so an interrupted session can resume. Do NOT use `local_info_operation` — that store is private customer-required info, not planning state.
|
|
31
|
+
- On resume: read the Goal state and the workspace artifact first, then continue from the furthest confirmed step.
|
|
53
32
|
|
|
54
|
-
|
|
33
|
+
## Invariants the plan must always satisfy
|
|
55
34
|
|
|
56
|
-
|
|
57
|
-
{
|
|
58
|
-
"task_id": "task_20260714_001",
|
|
59
|
-
"scenario": "freelance",
|
|
60
|
-
"version": 1,
|
|
61
|
-
"status": "confirmed",
|
|
62
|
-
"account": "merchant_v1",
|
|
63
|
-
"objects": [
|
|
64
|
-
{ "id": "obj_account", "type": "account", "status": "created", "reversible": true, "dependencies": [], "user_decisions": { "reuse": false, "network": "testnet" } },
|
|
65
|
-
{ "id": "obj_permission", "type": "permission", "status": "planned", "reversible": true, "dependencies": ["obj_account"], "user_decisions": { "reuse": false, "indexes": { "provider": 1000 } } },
|
|
66
|
-
{ "id": "obj_service", "type": "service", "status": "planned", "reversible": true, "dependencies": ["obj_permission"], "user_decisions": { "name": "...", "publish": "deferred", "note": "DRAFT first — Guards reference it by LocalMark NAME to break the Guard↔Service cycle" } },
|
|
67
|
-
{ "id": "obj_machine", "type": "machine", "status": "planned", "reversible": false, "dependencies": ["obj_service", "obj_permission"], "user_decisions": { "nodes": [...], "forwards": [...], "publish": "deferred" } },
|
|
68
|
-
{ "id": "obj_guard_*", "type": "guard", "status": "planned", "reversible": false, "dependencies": ["obj_machine", "obj_service"], "user_decisions": { "logic": "...", "note": "references machine node names + service name via LocalMark NAME" } },
|
|
69
|
-
{ "id": "obj_treasury", "type": "treasury", "status": "planned", "reversible": true, "dependencies": ["obj_permission"], "user_decisions": { "reuse": false, "note": "optional fund pool for organizations; referenced by order_allocators as Entity recipient" } },
|
|
70
|
-
{ "id": "obj_contact", "type": "contact", "status": "planned", "reversible": true, "dependencies": ["obj_permission", "obj_account"], "user_decisions": { "reuse": false, "messenger": true, "anti_spam": "open", "note": "Service.um → Contact → ims[]; messenger enabled + anti-spam configured" } },
|
|
71
|
-
{ "id": "obj_arbitration", "type": "arbitration", "status": "planned", "reversible": true, "dependencies": ["obj_permission"], "user_decisions": { "reuse": true, "note": "REUSE third-party; permission MUST differ from Service (E_ARBITRATION_PERMISSION_CONFLICT); compensation_fund > 0 requires non-empty arbitrations" } }
|
|
72
|
-
],
|
|
73
|
-
"phases": [
|
|
74
|
-
{ "phase": 1, "objects": ["obj_account", "obj_permission"], "gate": "user_confirm" },
|
|
75
|
-
{ "phase": 2, "objects": ["obj_service"], "gate": "user_confirm", "note": "Service DRAFT created BEFORE Machine so Guards can reference it by name" },
|
|
76
|
-
{ "phase": 3, "objects": ["obj_machine", "obj_guard_*"], "gate": "risk_check", "note": "Machine + Guards designed together; guards bound to forwards before publish" },
|
|
77
|
-
{ "phase": 4, "objects": ["publish_machine", "obj_treasury", "obj_allocator_*"], "gate": "allocation_audit", "note": "Machine published; Treasury (optional) created before order_allocators references it" },
|
|
78
|
-
{ "phase": 5, "objects": ["obj_contact", "obj_arbitration"], "gate": "user_confirm", "note": "Contact + third-party Arbitration configured BEFORE publish; arbitration.permission != service.permission" },
|
|
79
|
-
{ "phase": 6, "objects": ["publish_service"], "gate": "final_audit" }
|
|
80
|
-
],
|
|
81
|
-
"risk_assessment": { "critical": [], "warnings": [], "irreversible_count": 1 }
|
|
82
|
-
}
|
|
83
|
-
```
|
|
35
|
+
These are chain-enforced (the risk engine and auditor verify them — your plan must not fight them):
|
|
84
36
|
|
|
85
|
-
|
|
37
|
+
1. **Machine published and bound before Service publish** — `service.machine` needs a published Machine; the binding is immutable afterward.
|
|
38
|
+
2. **`order_allocators` set before `publish=true`** — permanently L1-locked at publish (no pause exception); personal merchants route to the Permission owner, organizations typically to a Treasury `Entity` recipient.
|
|
39
|
+
3. **Arbitration permission ≠ Service permission** (`E_ARBITRATION_PERMISSION_CONFLICT`); a positive compensation fund requires non-empty arbitrations (`E_ARBITRATION_NOT_SET_WITH_COMPENSATION_FUND`).
|
|
40
|
+
4. **Contact configured before Service publish** — `Service.um → Contact → ims[]`, with the messenger account enabled and anti-spam set.
|
|
41
|
+
5. Drafts may reference each other by LocalMark name while still unbound; respect the machine-derived `creation_plan` order when an edge is `required`.
|
|
86
42
|
|
|
87
|
-
|
|
88
|
-
1. **Service DRAFT is created BEFORE Machine** — Guards reference the Service by LocalMark NAME, so the Service skeleton must exist first to break the Guard↔Service circular dependency.
|
|
89
|
-
2. **Machine + Guards are designed together** (one phase) — a forward's Guard depends on the Machine's node names; the Allocator's Guard depends on both Machine and Service.
|
|
90
|
-
3. **Machine publishes before Service binds it** — `service.machine` must reference a *published* Machine.
|
|
91
|
-
4. **`order_allocators` is L1-locked** — set it before `service.publish`; personal merchants route to Permission owner, organizations route to a Treasury (`Entity` recipient).
|
|
92
|
-
5. **Contact (customer service)** is configured before Service publish — `Service.um → Contact → ims[]`, with the local account enabled as messenger and anti-spam set.
|
|
93
|
-
6. **Arbitration is third-party and before publish** — `arbitration.permission != service.permission` (`E_ARBITRATION_PERMISSION_CONFLICT`); `compensation_fund > 0` requires non-empty `arbitrations` (`E_ARBITRATION_NOT_SET_WITH_COMPENSATION_FUND`).
|
|
43
|
+
## Boundaries
|
|
94
44
|
|
|
95
|
-
|
|
45
|
+
- Invoke on: "I want to build / set up / plan X", a new Plan Loop cycle, or resuming an interrupted plan.
|
|
46
|
+
- Do NOT invoke for live order ops, disputes, or post-publish tuning → wowok-provider / wowok-arbitrator.
|
|
47
|
+
- Naming note: the **R1–R10** rounds in MCP schemas are the Guard-authoring dialogue rounds (R1=intent … R10=verify), NOT plan phases. Label your own checklists "Step n", never "Rn".
|