@wowok/skills 1.3.4 → 2.0.0

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.
@@ -1,6 +1,6 @@
1
1
  # Iceland Travel Service Example
2
2
 
3
- A complete example demonstrating how to create an Iceland travel service using WoWok protocol. This service integrates weather-dependent activities, insurance sub-orders, and multi-node workflow management.
3
+ A complete example demonstrating how to create an Iceland travel service using WoWok protocol. This service integrates weather-dependent activities and multi-node workflow management. (Note: "Buy Insurance" is just the name of the first workflow node in this example — there is no real insurance sub-order mechanism.)
4
4
 
5
5
  ---
6
6
 
@@ -320,13 +320,46 @@ Create a Permission object to manage access control for the travel service. Add
320
320
  }
321
321
  ```
322
322
 
323
- > **Note**: Permission indices 1000-1009 are used for different workflow forwards. Index 306 is a reserved administrative permission. The travel_provider account is granted all these permissions.
323
+ > **Note**: Permission indices 1000-1009 are used for different workflow forwards. Index 306 is the built-in `SERVICE_MACHINE` permission — it governs binding or changing a Service's Machine (`service::machine_set`), and is required in Step 5 when the Service binds `travel_machine`. The travel_provider account is granted all these permissions.
324
+
325
+ ---
326
+
327
+ ## Step 1.5: Create Arbitration Permission
328
+
329
+ Create a dedicated Permission object for the Arbitration. No special permission indices are needed — the creator (`travel_provider`) automatically becomes the admin of the new Permission.
330
+
331
+ > **Why a separate Permission?** When a Service binds an Arbitration, the contract asserts `arbitration.permission != service.permission` (error `E_ARBITRATION_PERMISSION_CONFLICT`). If the Arbitration shared the Service's permission, the Service owner would control dispute resolution, breaking fairness. The Arbitration must therefore use an independent Permission object.
332
+
333
+ **Prompt**: Create a Permission object named "travel_arbitration_permission" for the arbitration.
334
+
335
+ ```json
336
+ {
337
+ "tool": "onchain_operations",
338
+ "data": {
339
+ "operation_type": "permission",
340
+ "data": {
341
+ "object": {
342
+ "name": "travel_arbitration_permission",
343
+ "tags": ["travel", "arbitration"],
344
+ "replaceExistName": true
345
+ },
346
+ "description": "Independent permission for travel arbitration (must differ from the Service permission)"
347
+ },
348
+ "env": {
349
+ "account": "travel_provider",
350
+ "network": "testnet",
351
+ "no_cache": true,
352
+ "confirmed": true
353
+ }
354
+ }
355
+ }
356
+ ```
324
357
 
325
358
  ---
326
359
 
327
360
  ## Step 2: Create Arbitration Object
328
361
 
329
- Create an Arbitration object for dispute resolution.
362
+ Create an Arbitration object for dispute resolution. It uses the independent `travel_arbitration_permission` created in Step 1.5.
330
363
 
331
364
  **Prompt**: Create an Arbitration named "travel_arbitration".
332
365
 
@@ -338,7 +371,7 @@ Create an Arbitration object for dispute resolution.
338
371
  "data": {
339
372
  "object": {
340
373
  "name": "travel_arbitration",
341
- "permission": "travel_permission",
374
+ "permission": "travel_arbitration_permission",
342
375
  "replaceExistName": true
343
376
  },
344
377
  "description": "Arbitration for Iceland travel service disputes"
@@ -1063,7 +1096,7 @@ Create a Machine to define the travel service workflow with all nodes and forwar
1063
1096
  | Complete | Ice Scooting | complete_trip | 1002 | travel_complete_guard |
1064
1097
  | Cancel | Ice Scooting | cancel_trip | 1003 | travel_cancel_guard |
1065
1098
 
1066
- > **Note**: The `prev_node` field uses an empty string `""` to denote the entry point. Each node defines how to enter it from a previous node. The `threshold` field (required) specifies the minimum forward weight needed to trigger node advancement.
1099
+ > **Note**: The `prev_node` field uses an empty string `""` to denote the entry point. Each node defines how to enter it from a previous node. The `threshold` field (optional, defaults to `0`) specifies the minimum forward weight needed to trigger node advancement.
1067
1100
 
1068
1101
  ---
1069
1102
 
@@ -1114,7 +1147,6 @@ Configure the travel service (created unpublished in Step 2.5) with all bindings
1114
1147
  "allocators": [
1115
1148
  {
1116
1149
  "guard": "merchant_victory_guard",
1117
- "fix": "0",
1118
1150
  "sharing": [
1119
1151
  {
1120
1152
  "who": {"Entity": {"name_or_address": "travel_treasury"}},
@@ -1125,7 +1157,6 @@ Configure the travel service (created unpublished in Step 2.5) with all bindings
1125
1157
  },
1126
1158
  {
1127
1159
  "guard": "no_ice_scooting_guard",
1128
- "fix": "0",
1129
1160
  "sharing": [
1130
1161
  {
1131
1162
  "who": {"Entity": {"name_or_address": "travel_treasury"}},
@@ -1141,7 +1172,6 @@ Configure the travel service (created unpublished in Step 2.5) with all bindings
1141
1172
  },
1142
1173
  {
1143
1174
  "guard": "no_spa_guard",
1144
- "fix": "0",
1145
1175
  "sharing": [
1146
1176
  {
1147
1177
  "who": {"Entity": {"name_or_address": "travel_treasury"}},
@@ -1281,7 +1311,8 @@ Move from initial node ("") to "Buy Insurance" node.
1281
1311
  "operation": {
1282
1312
  "next_node_name": "Buy Insurance",
1283
1313
  "forward": "buy_insurance"
1284
- }
1314
+ },
1315
+ "op": "next"
1285
1316
  }
1286
1317
  },
1287
1318
  "env": {
@@ -1310,7 +1341,8 @@ Move from "Buy Insurance" to "SPA" node.
1310
1341
  "operation": {
1311
1342
  "next_node_name": "SPA",
1312
1343
  "forward": "go_spa"
1313
- }
1344
+ },
1345
+ "op": "next"
1314
1346
  }
1315
1347
  },
1316
1348
  "env": {
@@ -1339,7 +1371,8 @@ Move from "SPA" to "Ice Scooting" node. This forward has a Guard (`weather_check
1339
1371
  "operation": {
1340
1372
  "next_node_name": "Ice Scooting",
1341
1373
  "forward": "go_ice_scooting"
1342
- }
1374
+ },
1375
+ "op": "next"
1343
1376
  }
1344
1377
  },
1345
1378
  "submission": {
@@ -1395,7 +1428,8 @@ Move from "Ice Scooting" to "Complete" node. This forward has a Guard (`travel_c
1395
1428
  "operation": {
1396
1429
  "next_node_name": "Complete",
1397
1430
  "forward": "complete_trip"
1398
- }
1431
+ },
1432
+ "op": "next"
1399
1433
  }
1400
1434
  },
1401
1435
  "submission": {
@@ -1430,7 +1464,7 @@ Move from "Ice Scooting" to "Complete" node. This forward has a Guard (`travel_c
1430
1464
  }
1431
1465
  ```
1432
1466
 
1433
- > **Note**: Replace `<ORDER_OBJECT_ID>` with the actual Order object ID (e.g., `0x7cc9f2228e130c2f6b585bb9c4666fd4d03252d38048355678f46e31b682eb38`). You can query the Progress object to find the `task` field which contains the Order ID.
1467
+ > **Note**: Replace `<ORDER_OBJECT_ID>` with the actual Order object ID (a 64-hex-character string starting with `0x`). You can query the Progress object to find the `task` field which contains the Order ID.
1434
1468
  >
1435
1469
  > **Key**: The `submission` field is at the **top level** of the input (alongside `data` and `env`), NOT inside `data`. The `impack: true` means the Guard verification result affects the final outcome.
1436
1470
 
@@ -1451,7 +1485,8 @@ Move from "Ice Scooting" to "Complete" node. This forward has a Guard (`travel_c
1451
1485
  "operation": {
1452
1486
  "next_node_name": "Cancel",
1453
1487
  "forward": "cancel_trip"
1454
- }
1488
+ },
1489
+ "op": "next"
1455
1490
  }
1456
1491
  },
1457
1492
  "submission": {
@@ -1487,6 +1522,7 @@ Move from "Ice Scooting" to "Complete" node. This forward has a Guard (`travel_c
1487
1522
  | `data.object` | string | Progress object name/ID |
1488
1523
  | `data.operate.operation.next_node_name` | string | Target node name to move to |
1489
1524
  | `data.operate.operation.forward` | string | Forward name defined in Machine |
1525
+ | `data.operate.op` | string | **Required.** Operation type: `"next"` (advance the forward), `"hold"`, `"unhold"`, or `"adminUnhold"` |
1490
1526
  | `submission` | object | Guard verification data (top-level, required when forward has Guard) |
1491
1527
  | `env.no_cache` | boolean | Set to `true` to avoid stale cache issues |
1492
1528
 
@@ -1524,7 +1560,7 @@ The allocation Guard requires the Order ID as a submission (identifier: 0). Quer
1524
1560
 
1525
1561
  ### 8.2 Execute Allocation (Merchant Victory Path)
1526
1562
 
1527
- When the Progress is "Complete", the `merchant_victory_guard` passes, and 100% of funds go to the Service object.
1563
+ When the Progress is "Complete", the `merchant_victory_guard` passes, and 100% of funds go to the Treasury (`travel_treasury`).
1528
1564
 
1529
1565
  **Prompt**: Execute fund allocation with the merchant_victory_guard, submitting the Order ID.
1530
1566
 
@@ -1577,7 +1613,7 @@ When the Progress is "Complete", the `merchant_victory_guard` passes, and 100% o
1577
1613
 
1578
1614
  For refund scenarios (Cancel or SPA), use the corresponding Guard. The same submission structure applies — the Order ID is submitted to identifier 0.
1579
1615
 
1580
- **Cancel/Ice Scooting path** (80% Service, 20% Order):
1616
+ **Cancel/Ice Scooting path** (80% Treasury, 20% Order (escrow, claimable by the order owner)):
1581
1617
 
1582
1618
  ```json
1583
1619
  {
@@ -1601,7 +1637,7 @@ For refund scenarios (Cancel or SPA), use the corresponding Guard. The same subm
1601
1637
  }
1602
1638
  ```
1603
1639
 
1604
- **SPA path** (5% Service, 95% Order):
1640
+ **SPA path** (5% Treasury, 95% Order (escrow, claimable by the order owner)):
1605
1641
 
1606
1642
  ```json
1607
1643
  {
@@ -1660,6 +1696,57 @@ After allocation, query the Allocation and Payment objects to verify the fund di
1660
1696
 
1661
1697
  > **Important**: `alloc_by_guard` accepts Guard names (e.g., `"merchant_victory_guard"`) or Guard object IDs. The Guard must exist in the Allocation's `allocators` list. Only the first Guard that passes (first-Guard-wins) triggers fund distribution.
1662
1698
 
1699
+ ### 8.5 Claim Allocated Funds (Unwrap CoinWrapper)
1700
+
1701
+ Allocation does not deposit spendable coins directly. `alloc_by_guard` distributes **CoinWrapper objects** to each recipient address — these must be claimed/unwrapped before the funds are spendable:
1702
+
1703
+ - **Treasury share** (`Entity` → `travel_treasury`): the CoinWrapper is sent to the Treasury object address. The travel provider deposits it into the Treasury balance via the Treasury `receive` operation.
1704
+ - **Customer share** (`GuardIdentifier: 0` → the Order object address submitted at runtime, i.e. escrow): the CoinWrapper is sent to the Order object address. The order owner (Alice) claims it via the Order `receive` operation, which unwraps it and transfers the coins to her wallet.
1705
+
1706
+ **Prompt**: Alice claims the customer share escrowed to the Order (refund paths only).
1707
+
1708
+ ```json
1709
+ {
1710
+ "tool": "onchain_operations",
1711
+ "data": {
1712
+ "operation_type": "order",
1713
+ "data": {
1714
+ "object": "alice_travel_order",
1715
+ "receive": "recently"
1716
+ },
1717
+ "env": {
1718
+ "account": "alice",
1719
+ "network": "testnet",
1720
+ "no_cache": true,
1721
+ "confirmed": true
1722
+ }
1723
+ }
1724
+ }
1725
+ ```
1726
+
1727
+ **Prompt**: The travel provider deposits the Treasury's share into the Treasury balance.
1728
+
1729
+ ```json
1730
+ {
1731
+ "tool": "onchain_operations",
1732
+ "data": {
1733
+ "operation_type": "treasury",
1734
+ "data": {
1735
+ "object": "travel_treasury",
1736
+ "receive": "recently"
1737
+ },
1738
+ "env": {
1739
+ "account": "travel_provider",
1740
+ "network": "testnet",
1741
+ "no_cache": true,
1742
+ "confirmed": true
1743
+ }
1744
+ }
1745
+ }
1746
+ ```
1747
+
1748
+ > **Note**: `"receive": "recently"` auto-queries and claims all recently received CoinWrapper objects. For the Order, `receive` unwraps them and transfers the coins to the order owner (Alice); for the Treasury, `receive` deposits the unwrapped coins into the Treasury's balance. In the merchant-victory path (100% to Treasury) only the Treasury claim is needed; the Order claim applies only to refund paths (8.3) where the customer has a share.
1749
+
1663
1750
  ---
1664
1751
 
1665
1752
  ## Best Practices
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@wowok/skills",
3
- "version": "1.3.4",
4
- "description": "WoWok AI Skills for Claude and other AI assistants - Helping AI use WoWok MCP tools correctly",
3
+ "version": "2.0.0",
4
+ "description": "WoWok AI Skills for Claude and other AI assistants - Dialogue orchestration layer on top of the WoWok MCP server (rules/reference knowledge is served by MCP directly since v2.0.0)",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "bin": {
@@ -11,15 +11,11 @@
11
11
  "dist/",
12
12
  "wowok-provider/",
13
13
  "wowok-arbitrator/",
14
- "wowok-guard/",
15
- "wowok-tools/",
16
- "wowok-safety/",
17
14
  "wowok-machine/",
18
15
  "wowok-order/",
19
16
  "wowok-messenger/",
20
17
  "wowok-output/",
21
18
  "wowok-onboard/",
22
- "wowok-scenario/",
23
19
  "wowok-planner/",
24
20
  "wowok-auditor/",
25
21
  "examples/",
@@ -16,22 +16,47 @@ const path = require('path');
16
16
  const os = require('os');
17
17
  const { execSync } = require('child_process');
18
18
 
19
+ /**
20
+ * Retained skills (post GLM5-31 sink refactor) — only these are installed.
21
+ * The 4 rule-reference skills (wowok-safety/tools/scenario/guard) were sunk
22
+ * into the MCP knowledge layer and are served by the MCP server directly:
23
+ * - wowok-safety → schema_query action='get_safety_rules'
24
+ * - wowok-tools → schema_query action='get_tool_reference'
25
+ * - wowok-scenario → project_operation recommend_industry / create_project
26
+ * - wowok-guard → schema_query action='get_guard_design_patterns'
27
+ */
19
28
  const SKILL_DIRS = [
20
29
  'wowok-provider',
21
30
  'wowok-arbitrator',
22
31
  'wowok-order',
23
32
  'wowok-messenger',
24
- 'wowok-guard',
25
33
  'wowok-machine',
26
34
  'wowok-output',
27
- 'wowok-tools',
28
- 'wowok-safety',
29
35
  'wowok-onboard',
30
- 'wowok-scenario',
31
36
  'wowok-planner',
32
37
  'wowok-auditor',
33
38
  ];
34
39
 
40
+ /**
41
+ * Deprecated skills removed in the GLM5-31 sink refactor. They are NEVER
42
+ * installed, but preuninstall/init still clean them up from legacy installs
43
+ * and warn the user where the content now lives.
44
+ */
45
+ const LEGACY_SKILL_DIRS = [
46
+ 'wowok-guard',
47
+ 'wowok-tools',
48
+ 'wowok-safety',
49
+ 'wowok-scenario',
50
+ ];
51
+
52
+ /** Where each deprecated skill's content now lives (migration message). */
53
+ const SKILL_MIGRATION_MAP = {
54
+ 'wowok-safety': "MCP schema_query action='get_safety_rules'",
55
+ 'wowok-tools': "MCP schema_query action='get_tool_reference'",
56
+ 'wowok-scenario': "MCP project_operation action='recommend_industry' / 'create_project'",
57
+ 'wowok-guard': "MCP schema_query action='get_guard_design_patterns'",
58
+ };
59
+
35
60
  const CLIENT_DIRS = {
36
61
  claude: path.join(os.homedir(), '.claude', 'skills'),
37
62
  cursor: path.join(os.homedir(), '.cursor', 'rules'),
@@ -172,7 +197,9 @@ function installSkills(targetDir, target) {
172
197
  function uninstallSkills(targetDir) {
173
198
  let count = 0;
174
199
 
175
- for (const dir of SKILL_DIRS) {
200
+ // Remove both retained and legacy (deprecated) skills — legacy dirs may
201
+ // still exist from pre-refactor installs and must be cleaned up.
202
+ for (const dir of [...SKILL_DIRS, ...LEGACY_SKILL_DIRS]) {
176
203
  const dirPath = path.join(targetDir, dir);
177
204
  if (fs.existsSync(dirPath)) {
178
205
  removeDir(dirPath);
@@ -184,6 +211,23 @@ function uninstallSkills(targetDir) {
184
211
  return count;
185
212
  }
186
213
 
214
+ /**
215
+ * Detect deprecated skills still present in a target dir and print a
216
+ * migration hint (GLM5-31 §3.2). Returns the list of legacy dirs found.
217
+ */
218
+ function warnLegacySkills(targetDir) {
219
+ const found = LEGACY_SKILL_DIRS.filter((dir) => fs.existsSync(path.join(targetDir, dir)));
220
+ if (found.length > 0) {
221
+ console.warn(`[wowok-skills] ⚠ MIGRATION: deprecated skills detected in ${targetDir}:`);
222
+ for (const dir of found) {
223
+ console.warn(`[wowok-skills] - ${dir} → content now served by ${SKILL_MIGRATION_MAP[dir]}`);
224
+ }
225
+ console.warn('[wowok-skills] These skills are stale (MCP knowledge layer is the source of truth).');
226
+ console.warn('[wowok-skills] Remove them with: wowok-skills uninit (or delete the folders above)');
227
+ }
228
+ return found;
229
+ }
230
+
187
231
  function getTargets() {
188
232
  const envTargets = process.env.WOWOK_SKILLS_TARGETS;
189
233
  if (!envTargets) {
@@ -206,6 +250,8 @@ function main() {
206
250
  console.log(`[wowok-skills] → ${dir}`);
207
251
  const count = installSkills(dir, target);
208
252
  total += count;
253
+ // GLM5-31 §3.2: warn about stale pre-refactor skills still present.
254
+ warnLegacySkills(dir);
209
255
  }
210
256
 
211
257
  console.log(`[wowok-skills] Done — ${total} skills installed across ${targets.length} client(s).`);
@@ -256,7 +302,7 @@ function main() {
256
302
 
257
303
  function countExisting(targetDir) {
258
304
  let count = 0;
259
- for (const dir of SKILL_DIRS) {
305
+ for (const dir of [...SKILL_DIRS, ...LEGACY_SKILL_DIRS]) {
260
306
  if (fs.existsSync(path.join(targetDir, dir))) {
261
307
  count++;
262
308
  }
@@ -30,7 +30,7 @@ The following content has been pushed down to the MCP knowledge layer and is app
30
30
  |---------|---------------------|-------------|
31
31
  | Guard design rules (structural layers, data source classification, voting_guard table design) | `knowledge/guard-design-patterns.ts` (`GUARD_DESIGN_PATTERNS`) | `project_operation.evaluate_project` (via `assessGuardRisks`) |
32
32
  | Safety rules (confirmation levels, immutability, object reuse) | `knowledge/safety-rules.ts` (`CONFIRMATION_RULES`) | Pre-publish checks + `project_operation.evaluate_project` |
33
- | Arbitration-specific risks | `knowledge/arb-risk.ts` (`assessArbitrationRisks`) | `project_operation.evaluate_project` |
33
+ | Arbitration-specific risks | `knowledge/arbitration-risk.ts` (`assessArbitrationRisks`) | `project_operation.evaluate_project` |
34
34
 
35
35
  This Skill keeps the arbitration **conversation flow**, **evidence collection** scripts, and **dispute resolution** guidance — the MCP layer handles the rule evaluation.
36
36
 
@@ -234,7 +234,7 @@ All stem from the same root: **every on-chain object has a publish/create freeze
234
234
  | `refunded` (terminal) | `refund_routing` (routing) → Allocator fires |
235
235
  | N/A (dispute) | `arbiter_rule` (routing) → Arbitration off-Machine (no Allocator) |
236
236
 
237
- See [wowok-scenario](../wowok-scenario/SKILL.md) "Rental Mode Template (R-M1-11 Compliant)" for a complete 10-node rental topology.
237
+ A complete R-M1-11-compliant rental topology is auto-generated by `project_operation.create_project` with `project_industry='rental'` (MCP `knowledge/scenario-modes.ts`).
238
238
 
239
239
  ### Pre-Publish Validation Checklist
240
240
 
@@ -245,7 +245,7 @@ Before `publish: true`, verify:
245
245
  - [ ] **Every node has outgoing Forwards** (except terminals): no dead-end nodes
246
246
  - [ ] **Every node has incoming Pair** (except entry): no orphaned nodes
247
247
  - [ ] **All thresholds independently achievable**: no dead branches (competing Pair always wins first)
248
- - [ ] **⚠ R-M1-11 Compliance** (CRITICAL for deposit/refund scenarios): NO terminal nodes named `deposit_refunded`, `deposit_deducted`, `refunded`, or any name implying Machine-internal refund/deduction. Refund/deduction MUST flow through an **Allocator** triggered by a routing node (e.g., `return_approved`, `damage_confirmed`, `arbiter_rule`). Violating this causes funds to lock in the Machine with no Allocator path. See [wowok-scenario](../wowok-scenario/SKILL.md) "Rental Mode Template (R-M1-11 Compliant)".
248
+ - [ ] **⚠ R-M1-11 Compliance** (CRITICAL for deposit/refund scenarios): NO terminal nodes named `deposit_refunded`, `deposit_deducted`, `refunded`, or any name implying Machine-internal refund/deduction. Refund/deduction MUST flow through an **Allocator** triggered by a routing node (e.g., `return_approved`, `damage_confirmed`, `arbiter_rule`). Violating this causes funds to lock in the Machine with no Allocator path. Auto-enforced by MCP pre-publish checks and `project_operation.evaluate_project`.
249
249
  - [ ] All Guards exist on-chain and tested (use `gen_passport`)
250
250
  - [ ] `namedOperator` vs `permissionIndex` correct per Forward
251
251
  - [ ] Every Forward has at least one of `namedOperator` or `permissionIndex`
@@ -25,8 +25,9 @@ always: false
25
25
  End-to-end encrypted messaging with tamper-proof audit trails.
26
26
 
27
27
  > **Role**: Any WoWok participant
28
- > All 16 operations with full parameter types and constraints are in the MCP schema (`messenger_operation`). This document focuses on **design decisions and strategy** not captured by the schema.
29
- > **Related Skills**: [wowok-guard](../wowok-guard/SKILL.md) (guard design), [wowok-arbitrator](../wowok-arbitrator/SKILL.md) (WTS evidence in disputes), [wowok-order](../wowok-order/SKILL.md) (customer perspective), [wowok-provider](../wowok-provider/SKILL.md) (service provider perspective), [wowok-safety](../wowok-safety/SKILL.md) (safety)
28
+ > All 17 operations with full parameter types and constraints are in the MCP schema (`messenger_operation`). This document focuses on **design decisions and strategy** not captured by the schema.
29
+ > **Related Skills**: [wowok-arbitrator](../wowok-arbitrator/SKILL.md) (WTS evidence in disputes), [wowok-order](../wowok-order/SKILL.md) (customer perspective), [wowok-provider](../wowok-provider/SKILL.md) (service provider perspective)
30
+ > Guard design patterns and safety rules now live in the MCP knowledge layer — query via `schema_query` actions `get_guard_design_patterns` / `get_safety_rules`.
30
31
 
31
32
  ---
32
33
 
@@ -71,7 +72,7 @@ The on-chain **Contact** object (`operation_type: "contact"`) is the bridge betw
71
72
 
72
73
  **When to create**: Before Service publish, when `customer_required` is set (Service.um must point to a Contact). Reuse an existing Contact if you serve multiple Services with the same support channel.
73
74
 
74
- **Lifecycle**: Contact is mutable (unlike Proof/Guard). `im_add`/`im_remove` require permission index 453 (CONTACT_IM). No events emitted on IM mutations — poll `ims[]` field. If Contact is bound to `Permission.um` via `permission_um_set`, clear that binding BEFORE deleting the Contact (else dangling pointer). Full business guidance: [wowok-tools](../wowok-tools/SKILL.md) §"Contact (Service.um Bridge)".
75
+ **Lifecycle**: Contact is mutable (unlike Proof/Guard). `im_add`/`im_remove` require permission index 453 (CONTACT_IM). No events emitted on IM mutations — poll `ims[]` field. If Contact is bound to `Permission.um` via `permission_um_set`, clear that binding BEFORE deleting the Contact (else dangling pointer). Full field constraints: MCP `schema_query` action='get' name='contact'.
75
76
 
76
77
  ---
77
78
 
@@ -85,6 +86,7 @@ Two approaches, depending on need:
85
86
 
86
87
  - **Quick glance** — `watch_conversations` with `unreadOnly: true` lists all conversations with unread messages, sorted by activity. Each conversation shows a preview of the last messages.
87
88
  - **Deep dive** — `watch_messages` with a specific `peerAddress` to view the full conversation with a particular counterparty. Supports keyword search, time-range filtering, direction filter, and status filter.
89
+ - **Server sync** — `pull_messages` fetches the latest messages from the server into local storage (optional `limit` caps batch size). Use this first when the local view looks stale (e.g. after downtime or on a new device session), then read via `watch_conversations` / `watch_messages`.
88
90
 
89
91
  **Design note**: By default, retrieving messages auto-marks them as viewed (`viewedAt` timestamp). Set `skipAutoMarkViewed: true` if you want to peek without marking read.
90
92
 
@@ -78,6 +78,8 @@ The onboarding flow is backed by the MCP SQLite-based project pipeline. Each ste
78
78
  | 3. Build Graph | After R8 | `build_graph` → object dependency graph from added objects | — |
79
79
  | 4. Evaluate | After graph built | `evaluate_project` (evaluation_type='risk') → risk assessment | CRITICAL risks block R9 |
80
80
 
81
+ > **Async mode**: `build_graph` / `evaluate_project` accept `async_mode: true` for large projects — the call returns immediately with a `task_id`. Poll `query_task_status` with that `task_id` until `status: "completed"` before reading results / proceeding to the next step. Default is synchronous (`async_mode` omitted) — fine for the ≤10-object onboarding scale.
82
+
81
83
  ## R1-R10 Build Order
82
84
 
83
85
  | Round | Object | MCP Operation | Key Decision |
@@ -104,13 +106,13 @@ When the user describes their business (R2), match to one of the supported indus
104
106
  | `general` | `general` | Free-form / hybrid — no presets, full manual control |
105
107
  | `retail` | `general` (retail profile) | Physical goods sales with stock + WIP product listings |
106
108
  | `service` | `general` (service profile) | Intangible services (consulting, design) — milestone delivery |
107
- | `rental` | `rental` | Equipment / vehicle / property rental with deposit escrow + return inspection (R-M1-11 compliant — uses `return_approved`/`damage_confirmed`/`arbiter_rule` routing nodes, NO `deposit_refunded`/`deposit_deducted`/`refunded` terminal nodes; see [wowok-scenario](../wowok-scenario/SKILL.md) "Rental Mode Template") |
109
+ | `rental` | `rental` | Equipment / vehicle / property rental with deposit escrow + return inspection (R-M1-11 compliant — uses `return_approved`/`damage_confirmed`/`arbiter_rule` routing nodes, NO `deposit_refunded`/`deposit_deducted`/`refunded` terminal nodes; topology auto-applied by `project_operation.create_project` with `project_industry='rental'` from MCP `knowledge/scenario-modes.ts`) |
108
110
  | `freelance` | `freelance` | Design / dev / consulting — milestone allocation + acceptance gate |
109
111
  | `education` | `education` | Courses / training / tutoring — periodic release per session attendance |
110
112
  | `travel` | `travel` | Custom tours / multi-segment trips — multi-tier allocation per segment |
111
113
  | `subscription` | `subscription` | SaaS / content membership / periodic service — periodic charge + cancel guard |
112
114
 
113
- > If unsure which fits, default to `general`. Users can switch modes mid-onboarding (see wowok-scenario "Escape Hatch"). For mode composition (e.g., freelance + subscription retainer), see [wowok-scenario](../wowok-scenario/SKILL.md).
115
+ > If unsure which fits, call `project_operation` action='recommend_industry' with the user's business description — it returns top-3 industry matches with reference examples. To iterate a mode mid-onboarding, use action='derive_user_mode' / 'evolve_user_mode' (user mode registry in MCP).
114
116
 
115
117
  ---
116
118
 
@@ -138,9 +140,9 @@ Before declaring onboarding complete, verify ALL items. Each is a hard gate —
138
140
  | Error | Cause | Fix |
139
141
  |-------|-------|-----|
140
142
  | `dynamicFieldNotFound` | SDK cannot resolve a dynamic field reference | Set `env.account` (account not configured) — pass account in the tool call wrapper |
141
- | `Circular dependency` (Guard ↔ Service creation) | Guard needs Service address; Service needs Guard address | Use **LocalMark NAME** (not address) in Guard query table — see [wowok-guard](../wowok-guard/SKILL.md) "Circular Dependency Handling" |
143
+ | `Circular dependency` (Guard ↔ Service creation) | Guard needs Service address; Service needs Guard address | Use **LocalMark NAME** (not address) in Guard query table — pattern documented in MCP `schema_query` action='get_guard_design_patterns' |
142
144
  | `order.balance invalid` | Used wrong field for order amount | Use `order.amount` (not `order.balance` — `balance` is residual escrow, `amount` is original payment) |
143
145
  | Allocator `rate sum != 10000` | Rate-mode Allocator sharing percentages don't sum to 100% | Ensure all `sharing[].sharing` values in Rate mode sum to exactly **10000** basis points (e.g., 80% = 8000) |
144
- | `IMPACK_GUARD_NOT_FOUND` (gen_passport) | Repository query with `quote_guard = Some(addr)` | `impack_list` is empty during verify phase — only `quote_guard = None` passes; see [wowok-guard](../wowok-guard/SKILL.md) |
146
+ | `IMPACK_GUARD_NOT_FOUND` (gen_passport) | Repository query with `quote_guard = Some(addr)` | `impack_list` is empty during verify phase — only `quote_guard = None` passes; see MCP `schema_query` action='get_guard_design_patterns' |
145
147
  | `Permission denied` (Progress advance, abort code 5) | Wrong operation path for forward's `namedOperator` | Empty `namedOperator` → use `order.progress`; non-empty → use `progress.operate`; `permissionIndex` → use `progress.operate` |
146
- | Allocator never fires (refund stuck) — R-M1-11 violation | Machine has a node like `deposit_refunded` instead of routing node `return_approved`; or Allocator's `trigger_node` is missing/mispelled | Rename node to `return_approved` / `damage_confirmed`; bind Allocator to that node; see [wowok-scenario](../wowok-scenario/SKILL.md) "Rental Mode Template (R-M1-11 Compliant)" |
148
+ | Allocator never fires (refund stuck) — R-M1-11 violation | Machine has a node like `deposit_refunded` instead of routing node `return_approved`; or Allocator's `trigger_node` is missing/mispelled | Rename node to `return_approved` / `damage_confirmed`; bind Allocator to that node; R-M1-11 is auto-enforced by MCP pre-publish checks and `project_operation.evaluate_project` |
@@ -2,7 +2,7 @@
2
2
  name: wowok-order
3
3
  description: |
4
4
  WoWok Customer Guide — complete buyer order lifecycle: pre-purchase due diligence
5
- (E1-E10), consensus building, order creation, progress advancement, and arbitration.
5
+ (E1-E11), consensus building, order creation, progress advancement, and arbitration.
6
6
  when_to_use:
7
7
  - User is a customer/buyer placing or managing orders
8
8
  - User wants to evaluate services before purchasing
@@ -15,7 +15,8 @@ when_to_use:
15
15
  # WoWok Customer Guide
16
16
 
17
17
  > **Role**: Customer (Buyer/Order Holder)
18
- > **Provider Guide**: [wowok-provider](../wowok-provider/SKILL.md) | **Arbitration Guide**: [wowok-arbitrator](../wowok-arbitrator/SKILL.md) | **Guard Design**: [wowok-guard](../wowok-guard/SKILL.md) | **Machine**: [wowok-machine](../wowok-machine/SKILL.md) | **Messenger**: [wowok-messenger](../wowok-messenger/SKILL.md) | **Safety**: [wowok-safety](../wowok-safety/SKILL.md) | **Tools**: [wowok-tools](../wowok-tools/SKILL.md)
18
+ > **Provider Guide**: [wowok-provider](../wowok-provider/SKILL.md) | **Arbitration Guide**: [wowok-arbitrator](../wowok-arbitrator/SKILL.md) | **Machine**: [wowok-machine](../wowok-machine/SKILL.md) | **Messenger**: [wowok-messenger](../wowok-messenger/SKILL.md)
19
+ > Guard design patterns, safety rules, and tool references now live in the MCP knowledge layer — query via `schema_query` actions `get_guard_design_patterns`, `get_safety_rules`, `get_tool_reference`.
19
20
 
20
21
  ---
21
22
 
@@ -41,7 +42,7 @@ Allocation evaluates when Progress reaches **any** configured node (not just exi
41
42
 
42
43
  ## Phase 1: Pre-Purchase Due Diligence (MANDATORY GATE)
43
44
 
44
- > **⛔ Complete E1-E10 in order. User must explicitly confirm every item.**
45
+ > **⛔ Complete E1-E11 in order. User must explicitly confirm every item.**
45
46
  > **⚠️ = explain risk, wait for decision. 🔴 = strongly advise against purchase.**
46
47
 
47
48
  ---
@@ -62,7 +63,7 @@ From E1 `sales[]`. Skip `suspension === true` items.
62
63
 
63
64
  **WIP Verification** (mandatory when `wip_hash` non-empty):
64
65
 
65
- Use `wip_file` → `op: "verify"`, `wipFilePath: "<wip_url>"`, `hash_equal: "<wip_hash>"`.
66
+ Use `wip_file` → `type: "verify"`, `wipFilePath: "<wip_url>"`, `hash_equal: "<wip_hash>"`.
66
67
 
67
68
  - `wip_hash` empty → no on-chain commitment (auto-verified, weaker evidence)
68
69
  - Verification fails → 🔴 **WIP tampered after publish**
@@ -112,7 +113,7 @@ Use `wip_file` → `op: "verify"`, `wipFilePath: "<wip_url>"`, `hash_equal: "<wi
112
113
 
113
114
  ### E4 — Guards Analysis
114
115
 
115
- Guard structure and instruction reference: [wowok-guard](../wowok-guard/SKILL.md).
116
+ Guard structure and instruction reference: MCP `schema_query` action='get_guard_design_patterns' (design patterns) and action='get_guard_templates' (ready-made templates).
116
117
 
117
118
  **Step 1**: Collect unique Guard IDs from E3 Machine JSON (`forward.guard.guard`), E1 `order_allocators`, E1 `buy_guard`. Deduplicate.
118
119
 
@@ -200,9 +201,23 @@ For matched: present value, ask "correct?" and "OK to send?". For missing: ask u
200
201
 
201
202
  ---
202
203
 
204
+ ### E11 — Trust Score Synthesis (Preorder Advice)
205
+
206
+ Aggregate E1–E10 into a decision-grade assessment via `trust_score`:
207
+
208
+ `wowok({ tool: "trust_score", data: { service: "<service_id>", depth: "preorder", order_amount: "<planned_amount>" } })`
209
+
210
+ - Returns trust score + per-dimension risks + preorder advice (order confidence, game strategies, preference match, industry risks, `blocking_reminders`); non-empty `blocking_reminders` → ⛔ resolve with user BEFORE Phase 2.
211
+ - Comparing multiple candidates → add `compare_with: ["<id2>", ...]` (1–9, same `depth: "preorder"`): output gains a `comparison` block with per-metric bests — **NO overall ranking**; present trade-offs, the buyer decides.
212
+ - Optional `preferences` / `user_metrics` reflect the buyer's own priorities.
213
+
214
+ > Fast pre-screen: at E1 you may call `depth: "evaluate"` (default) for a quick score; 🔴 `risk_score` (<50) → advise early abort, skip E2–E10.
215
+
216
+ ---
217
+
203
218
  ### Pre-Purchase GATE
204
219
 
205
- **Abort conditions**: E1 `bPublished=false`/`bPaused=true` → ABORT; E8 `um=null` → ABORT; E3 no-refund + E6 no-arb → strongly advise ABORT; E4 ambiguous Guards → user MUST manually review.
220
+ **Abort conditions**: E1 `bPublished=false`/`bPaused=true` → ABORT; E8 `um=null` → ABORT; E3 no-refund + E6 no-arb → strongly advise ABORT; E4 ambiguous Guards → user MUST manually review; E11 `blocking_reminders` → resolve with user BEFORE proceeding.
206
221
 
207
222
  **Any ⚠️** → explain risk, wait for user decision. **All OK** → Phase 2.
208
223
 
@@ -369,7 +384,7 @@ For precise control, pass an explicit array of `{id, type}` objects, or pass the
369
384
 
370
385
  ### Phase Dependency
371
386
 
372
- E1 (Service) → E2 (Products/WIP), E8 (Contact), E10 (Privacy), E7 (Compensation), E6 (Arbitrations) run in parallel after E1. E3 (Machine) → E4 (Guards) → E5 (Allocators) is a strict chain. E9 (Reputation) follows E3.
387
+ E1 (Service) → E2 (Products/WIP), E8 (Contact), E10 (Privacy), E7 (Compensation), E6 (Arbitrations) run in parallel after E1. E3 (Machine) → E4 (Guards) → E5 (Allocators) is a strict chain. E9 (Reputation) follows E3. E11 (Trust Score) runs LAST — it aggregates all prior findings.
373
388
 
374
389
  ### ⚠️ Critical Attention Items
375
390
 
@@ -134,11 +134,11 @@ When user asks about field meanings:
134
134
 
135
135
  # Related Skills
136
136
 
137
- | Skill | Purpose |
137
+ | Skill / MCP Knowledge | Purpose |
138
138
  |-------|---------|
139
- | [wowok-safety](../wowok-safety/SKILL.md) | Pre-operation safety checks |
140
- | [wowok-guard](../wowok-guard/SKILL.md) | Guard design & validation |
141
- | [wowok-tools](../wowok-tools/SKILL.md) | Tool selection patterns |
139
+ | MCP `schema_query` action='get_safety_rules' | Pre-operation safety checks (sunk from wowok-safety) |
140
+ | MCP `schema_query` action='get_guard_design_patterns' | Guard design & validation (sunk from wowok-guard) |
141
+ | MCP `schema_query` action='get_tool_reference' | Tool selection patterns (sunk from wowok-tools) |
142
142
  | [wowok-order](../wowok-order/SKILL.md) | Order lifecycle (buyer) |
143
143
  | [wowok-provider](../wowok-provider/SKILL.md) | Service management (merchant) |
144
144
  | [wowok-arbitrator](../wowok-arbitrator/SKILL.md) | Dispute resolution |
@@ -26,7 +26,8 @@ when_to_use:
26
26
  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.
27
27
 
28
28
  > **Layer**: L3 Skill, primary planner for L4 Harness Plan Loop
29
- > **Related Skills**: [wowok-onboard](../wowok-onboard/SKILL.md) (guided execution), [wowok-scenario](../wowok-scenario/SKILL.md) (scenario templates), [wowok-tools](../wowok-tools/SKILL.md) (MCP reference), [wowok-machine](../wowok-machine/SKILL.md) (workflow design), [wowok-guard](../wowok-guard/SKILL.md) (Guard design), [wowok-safety](../wowok-safety/SKILL.md) (immutability rules), [wowok-provider](../wowok-provider/SKILL.md) (post-plan operations)
29
+ > **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)
30
+ > Industry modes, Guard design patterns, safety rules, and tool references now live in the MCP knowledge layer — query via `project_operation` (`recommend_industry` / `list_modes`) and `schema_query` (`get_guard_design_patterns` / `get_safety_rules` / `get_tool_reference`).
30
31
 
31
32
  ---
32
33
 
@@ -244,7 +244,7 @@ Order (per purchase, runtime-created)
244
244
  └── allocation → Allocation (optional, created at runtime; triggered via Progress.forward)
245
245
 
246
246
  Cross-object references:
247
- - Guard is referenced by 9 object types via diverse nested paths (see wowok-guard SKILL for full schema):
247
+ - Guard is referenced by 9 object types via diverse nested paths (full schema via MCP `schema_query` action='get_guard_design_patterns'):
248
248
  - Service.buy_guard (top-level Option<address>)
249
249
  - Machine.forward.guard (per-node dynamic table; SDK does not expose — requires query_table)
250
250
  - Allocation.allocators[].guard (array element — graph-builder edge fieldName: allocator_guard)
@@ -314,7 +314,7 @@ Required submission: Order ID (matching the Guard's b_submission identifier)
314
314
  Immutable product commitment for arbitration evidence.
315
315
 
316
316
  ```
317
- Create: wowok({ tool: "wip_file", data: { op: "generate", ... } }) → markdown_text + images → outputPath
317
+ Create: wowok({ tool: "wip_file", data: { type: "generate", ... } }) → markdown_text + images → outputPath
318
318
  Attach: wowok({ tool: "onchain_operations", data: { operation_type: "service", ... } }) → sales.sales[{
319
319
  name, price, stock, wip: "<URL>", wip_hash: "" (auto)
320
320
  }]
@@ -325,6 +325,16 @@ Attach: wowok({ tool: "onchain_operations", data: { operation_type: "service", .
325
325
  - Add: `compensation_fund_add` | Lock: `setting_lock_duration_add` (default 30 days = 2592000000ms, configurable via `setting_lock_duration_add`)
326
326
  - **Withdraw**: Pause Service → Wait lock duration → `compensation_fund_receive`
327
327
 
328
+ ### Payment Tokens & Stablecoin Bridging (Mainnet Only)
329
+
330
+ WOW is the default settlement token. For stablecoin-denominated revenue (fiat-pegged pricing, large cross-period escrow), mainnet funds move via `bridge_operation`:
331
+
332
+ - `query_supported_tokens` / `query_supported_evm_chains` — discover supported Bridge tokens (ETH/WETH/WBTC/USDC/USDT) and chains
333
+ - `cross_chain_wow_to_evm` / `cross_chain_evm_to_wow` — WOW↔EVM transfer (mainnet env required; assets route through the auto-managed activeEvmAccount)
334
+ - `query_transfer_status` / `query_transfer_list` — track transfers; `manage_evm_rpc` — handle EVM RPC rate limits (429)
335
+
336
+ > Supported token addresses per network: `wowok_buildin_info` → 'mainnet bridge tokens'. Bridge is mainnet-only — testnet has no cross-chain path.
337
+
328
338
  ---
329
339
 
330
340
  ## Project Iteration: Fork vs In-Place