@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.
@@ -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.0.0"
5
+ version: "2.1.0"
6
6
  role: shared
7
7
  loading: always
8
8
  ---
9
9
 
10
- # Address Display Rules
10
+ # WoWok Output Rules
11
11
 
12
- ## Environment split (read first)
12
+ Post-process every WoWok tool response before showing it: resolve addresses, format monetary fields from `_money_display`, render tables consistently.
13
13
 
14
- Address rendering differs by environment — pick the correct mode:
14
+ # Addresses
15
+
16
+ ## Environment split (decide first)
15
17
 
16
18
  | Environment | Default display | Full address |
17
19
  |---|---|---|
18
- | **WoWok client** (rich renderer available) | Full address — the client converts it into an address chip (name, DEFAULT badge, type icon, popup) | Always |
19
- | **Other AI clients** (plain MCP clients, markdown only) | Name when resolved, otherwise SHORTID; DEFAULT marker on the default account | ONLY when the user explicitly asks |
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
- **Query Tool**: `query_toolkit` with `query_type: "local_names"`
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
- Returns: `{ account?: string, local_mark?: string, address: string }`
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
- - Named (account or local_mark resolved): display the name ONLY (WoWok client
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
- - Display the resolved name in full — the client does NOT truncate names.
35
+ | Full | SHORTID |
36
+ |---|---|
37
+ | `0xa1d42190…184fc97a33` | `A1D4-A33` |
38
+ | `0x10ef0000…000cda11` | `10EF-A11` |
39
+ | `0x2` | `2` |
95
40
 
96
- # Amount Formatting Rules
41
+ ## Resolution
97
42
 
98
- ## Primary Source: `_money_display`
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
- The MCP fund layer now annotates all monetary query results with `_money_display` — a map of field paths to `ChainValueDisplay` objects containing `{raw, display, symbol, decimals, precision_known, text}`. **Use `_money_display` directly when present** — it is the authoritative formatted display, consistent with the MCP's own precision resolution.
45
+ # Amounts
101
46
 
102
- - `precision_known === true` → `text` field already contains the complete formatted string: e.g. `"2.2 WOW (decimals: 9; raw: 2200000000)"`
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
- Supported query types with `_money_display`:
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
- ## Fallback (when `_money_display` is absent)
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
- **When in doubt, display raw value.**
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
- | Condition | Display | Example |
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
- **Formula**: `converted = raw / (10 ^ decimals)`
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
- # Event Display Format
62
+ Table template: `| # | Time | Sender | Service | Amount | Order |` — address cells follow the environment split.
128
63
 
129
- ## Table Format
64
+ Key fields of the common built-in events (authoritative list + triggers live in the MCP Event Semantics Registry):
130
65
 
131
- ```
132
- | # | Time | Sender | Service | Amount | Order |
133
- |---|------|--------|---------|--------|-------|
134
- | 1 | {time} | {addr-cell} | {addr-cell} | {amount} | {addr-cell} |
135
- ```
136
-
137
- **Address cells follow the environment split above**:
138
- - WoWok client → the cell contains the full address (rendered as an address chip automatically).
139
- - Other clients → the cell contains the resolved name or the SHORTID (default account tagged `(default)`); full addresses only when the user explicitly asked for them.
140
-
141
- ## Event Type Fields
142
-
143
- | Event Type | Key Fields |
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 Explanations
80
+ # Field glossary
155
81
 
156
- When user asks about field meanings:
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
- ## Addresses
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
- ## Amounts
165
- - **Raw**: Actual U64 integer stored on-chain
166
- - **Converted**: Human-readable after applying decimals
167
- - **Precision (N decimals)**: Number of decimal places
168
- - **`_money_display`**: MCP-annotated display map (see Amount Formatting Rules above)
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
- ## Time
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`.
@@ -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.0.0"
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 Object Dependency Graph (ODG) and phased execution plan. Deterministic-first: rules and scenario templates decide the shape; the LLM only clarifies ambiguity and translates free text into typed fields.
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, primary planner for L4 Harness Plan Loop
15
- > **Related Skills**: [wowok-onboard](../wowok-onboard/SKILL.md) (guided execution), [wowok-machine](../wowok-machine/SKILL.md) (workflow design), [wowok-provider](../wowok-provider/SKILL.md) (post-plan operations)
16
- > Industry modes, Guard design patterns, safety rules, and tool references now live in the MCP knowledge layer — query via `industry_pack_operation` (`recommend_industry` / `list_modes`) and `schema_query` (`get_guard_design_patterns` / `get_safety_rules` / `get_tool_reference`).
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
- ### What This Skill Does
20
+ Do not invent a plan format or gate names — the MCP owns the artifacts:
32
21
 
33
- - Classifies user intent against the Scenario Registry
34
- - Queries existing on-chain objects to decide reuse vs create per object
35
- - Emits an ODG with typed objects, dependencies, phases, and reversibility flags
36
- - Flags irreversible actions and fund-risk paths before handoff
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
- ### When to Invoke
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
- ## ODG Data Structure
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
- The ODG (Object Dependency Graph) is the single output artifact. Round state lives in the Goal / TaskProcess stream (`goal_operation`) and the ODG JSON itself is written to the local workspace via `workspace_operation`; the Harness consumes it phase-by-phase:
33
+ ## Invariants the plan must always satisfy
55
34
 
56
- ```json
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
- Each object has: `id`, `type`, `status` (planned/created/published), `reversible` (true/false), `dependencies` (other object IDs), `user_decisions` (typed fields). Phases gate progression — `risk_check` calls `goal_operation` action='aggregate_risks' (with planned objects/operations), `final_audit` runs the pre-publish audit checklist (see wowok-auditor).
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
- **Dependency-chain ordering rules (authoritative, verified from Move/SDK):**
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
- These rules are the single source of truth for the dependency chain; the phase list above is their concrete serialization. Hand-off to `wowok-onboard` (Review opening + at most 8 business questions) follows this same chain.
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".