@wowok/agent-mcp 2.6.9 → 2.7.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.
Files changed (139) hide show
  1. package/README.md +0 -2
  2. package/dist/customer/risk-assessment.d.ts +5 -1
  3. package/dist/customer/risk-assessment.js +4 -4
  4. package/dist/evaluation/arbitration-game.d.ts +16 -0
  5. package/dist/evaluation/arbitration-game.js +48 -0
  6. package/dist/evaluation/builtins/demand-match.d.ts +15 -0
  7. package/dist/evaluation/builtins/demand-match.js +153 -0
  8. package/dist/evaluation/builtins/index.d.ts +3 -0
  9. package/dist/evaluation/builtins/index.js +10 -0
  10. package/dist/evaluation/builtins/service-risk.d.ts +6 -0
  11. package/dist/evaluation/builtins/service-risk.js +55 -0
  12. package/dist/evaluation/capability.d.ts +50 -0
  13. package/dist/evaluation/capability.js +13 -0
  14. package/dist/evaluation/composer.d.ts +13 -0
  15. package/dist/evaluation/composer.js +40 -0
  16. package/dist/evaluation/engine.d.ts +18 -0
  17. package/dist/evaluation/engine.js +175 -0
  18. package/dist/evaluation/extract.d.ts +30 -0
  19. package/dist/evaluation/extract.js +115 -0
  20. package/dist/evaluation/gap.d.ts +2 -0
  21. package/dist/evaluation/gap.js +100 -0
  22. package/dist/evaluation/index.d.ts +11 -0
  23. package/dist/evaluation/index.js +11 -0
  24. package/dist/evaluation/node-game.d.ts +34 -0
  25. package/dist/evaluation/node-game.js +57 -0
  26. package/dist/evaluation/region.d.ts +10 -0
  27. package/dist/evaluation/region.js +36 -0
  28. package/dist/evaluation/types.d.ts +76 -0
  29. package/dist/evaluation/types.js +1 -0
  30. package/dist/evaluation/user-injection.d.ts +6 -0
  31. package/dist/evaluation/user-injection.js +27 -0
  32. package/dist/examples/education-contact-create.json +40 -0
  33. package/dist/examples/freelance-contact-create.json +40 -0
  34. package/dist/examples/insurance-machine-create.json +1 -1
  35. package/dist/examples/insurance-service-allocators.json +1 -1
  36. package/dist/examples/machine-publish.json +1 -1
  37. package/dist/examples/rental-ziroom-service-create.json +1 -1
  38. package/dist/examples/retail-adv-guard-messenger-proof-create.json +1 -1
  39. package/dist/examples/retail-myshop-service-create.json +1 -1
  40. package/dist/examples/retail-myshop-service-customer-required.json +1 -1
  41. package/dist/examples/subscription-contact-create.json +40 -0
  42. package/dist/examples/threebody-machine-create.json +1 -1
  43. package/dist/examples/travel-machine-create.json +1 -1
  44. package/dist/examples/travel-service-create.json +1 -1
  45. package/dist/harness/plan.js +42 -3
  46. package/dist/intent/enrich.d.ts +1 -0
  47. package/dist/intent/enrich.js +67 -0
  48. package/dist/intent/index.d.ts +23 -0
  49. package/dist/intent/index.js +60 -0
  50. package/dist/intent/matcher.d.ts +2 -0
  51. package/dist/intent/matcher.js +81 -0
  52. package/dist/intent/store.d.ts +19 -0
  53. package/dist/intent/store.js +55 -0
  54. package/dist/intent/types.d.ts +33 -0
  55. package/dist/intent/types.js +10 -0
  56. package/dist/knowledge/arbitration-risk.js +1 -11
  57. package/dist/knowledge/contact-templates.d.ts +27 -0
  58. package/dist/knowledge/contact-templates.js +60 -0
  59. package/dist/knowledge/examples-scanner.js +21 -3
  60. package/dist/knowledge/fund-layer.js +8 -4
  61. package/dist/knowledge/industry-generalizer.js +21 -21
  62. package/dist/knowledge/machine-risk.js +0 -1
  63. package/dist/knowledge/mcp-schema-audit.d.ts +1 -1
  64. package/dist/knowledge/mcp-schema-audit.js +8 -4
  65. package/dist/knowledge/service-risk.js +38 -2
  66. package/dist/knowledge/service-templates.js +1 -1
  67. package/dist/knowledge/service-translation.js +2 -2
  68. package/dist/knowledge/template-registry.d.ts +1 -1
  69. package/dist/knowledge/template-registry.js +13 -1
  70. package/dist/knowledge/tools-reference.js +23 -0
  71. package/dist/persona/analyzer.d.ts +16 -0
  72. package/dist/persona/analyzer.js +66 -0
  73. package/dist/persona/bridge.d.ts +5 -0
  74. package/dist/persona/bridge.js +86 -0
  75. package/dist/persona/defaults.d.ts +4 -0
  76. package/dist/persona/defaults.js +195 -0
  77. package/dist/persona/experience-bridge.d.ts +3 -0
  78. package/dist/persona/experience-bridge.js +23 -0
  79. package/dist/persona/index.d.ts +18 -0
  80. package/dist/persona/index.js +71 -0
  81. package/dist/persona/model.d.ts +7 -0
  82. package/dist/persona/model.js +111 -0
  83. package/dist/persona/store.d.ts +19 -0
  84. package/dist/persona/store.js +62 -0
  85. package/dist/persona/types.d.ts +43 -0
  86. package/dist/persona/types.js +5 -0
  87. package/dist/project/handlers.d.ts +5 -0
  88. package/dist/project/handlers.js +23 -1
  89. package/dist/project/semantic-graph.js +47 -0
  90. package/dist/rules.d.ts +2 -0
  91. package/dist/rules.js +43 -0
  92. package/dist/schema/call/semantic.js +23 -1
  93. package/dist/schema/call/service.js +7 -1
  94. package/dist/schema/evaluation/index.d.ts +4239 -0
  95. package/dist/schema/evaluation/index.js +356 -0
  96. package/dist/schema/index.d.ts +4 -0
  97. package/dist/schema/index.js +4 -0
  98. package/dist/schema/intent-radar/index.d.ts +284 -0
  99. package/dist/schema/intent-radar/index.js +89 -0
  100. package/dist/schema/messenger/index.d.ts +171 -0
  101. package/dist/schema/messenger/index.js +5 -0
  102. package/dist/schema/operations.js +1 -1
  103. package/dist/schema/persona/index.d.ts +1985 -0
  104. package/dist/schema/persona/index.js +148 -0
  105. package/dist/schema/project/index.d.ts +2 -2
  106. package/dist/schema/query/index.js +6 -0
  107. package/dist/schema/sync-layer4.d.ts +1 -1
  108. package/dist/schema/sync-layer4.js +9 -5
  109. package/dist/schema/task-status.d.ts +168 -0
  110. package/dist/schema/task-status.js +36 -0
  111. package/dist/schema/trust/index.js +1 -1
  112. package/dist/schemas/evaluation_operation.output.json +677 -0
  113. package/dist/schemas/evaluation_operation.schema.json +903 -0
  114. package/dist/schemas/index.json +25 -1
  115. package/dist/schemas/intent_radar.output.json +229 -0
  116. package/dist/schemas/intent_radar.schema.json +135 -0
  117. package/dist/schemas/messenger_operation.output.json +14 -0
  118. package/dist/schemas/messenger_operation.schema.json +18 -0
  119. package/dist/schemas/onchain_operations.schema.json +2 -2
  120. package/dist/schemas/onchain_operations_service.schema.json +2 -2
  121. package/dist/schemas/persona_operation.output.json +389 -0
  122. package/dist/schemas/persona_operation.schema.json +247 -0
  123. package/dist/schemas/query_task_status.output.json +115 -0
  124. package/dist/schemas/query_task_status.schema.json +24 -0
  125. package/dist/schemas/query_toolkit.output.json +1 -1
  126. package/dist/schemas/trust_score.schema.json +1 -1
  127. package/dist/tools/handlers/evaluation.d.ts +2 -0
  128. package/dist/tools/handlers/evaluation.js +123 -0
  129. package/dist/tools/handlers/intent-radar.d.ts +2 -0
  130. package/dist/tools/handlers/intent-radar.js +76 -0
  131. package/dist/tools/handlers/onchain.js +98 -0
  132. package/dist/tools/handlers/persona.d.ts +4 -0
  133. package/dist/tools/handlers/persona.js +89 -0
  134. package/dist/tools/handlers/task-status.d.ts +0 -168
  135. package/dist/tools/handlers/task-status.js +0 -29
  136. package/dist/tools/index.js +83 -7
  137. package/dist/tools/wip-deploy-assist.d.ts +1 -1
  138. package/dist/tools/wip-deploy-assist.js +33 -5
  139. package/package.json +2 -2
@@ -2,7 +2,7 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "title": "WoWok MCP Schema Index",
4
4
  "description": "Index of all available JSON schemas for WoWok MCP tools",
5
- "generatedAt": "2026-08-15T01:29:23.265Z",
5
+ "generatedAt": "2026-08-16T13:41:43.343Z",
6
6
  "tools": [
7
7
  {
8
8
  "name": "onchain_operations",
@@ -105,6 +105,30 @@
105
105
  "title": "Trust Score - Service Risk & Trust Assessment",
106
106
  "path": "./trust_score.schema.json",
107
107
  "outputPath": "./trust_score.output.json"
108
+ },
109
+ {
110
+ "name": "query_task_status",
111
+ "title": "Task Status - Async Operation Tracking",
112
+ "path": "./query_task_status.schema.json",
113
+ "outputPath": "./query_task_status.output.json"
114
+ },
115
+ {
116
+ "name": "evaluation_operation",
117
+ "title": "Evaluation - Pluggable Business Intelligence",
118
+ "path": "./evaluation_operation.schema.json",
119
+ "outputPath": "./evaluation_operation.output.json"
120
+ },
121
+ {
122
+ "name": "persona_operation",
123
+ "title": "Persona - User Identity Setting",
124
+ "path": "./persona_operation.schema.json",
125
+ "outputPath": "./persona_operation.output.json"
126
+ },
127
+ {
128
+ "name": "intent_radar",
129
+ "title": "Intent Radar - User Intent × Chain Event Matching",
130
+ "path": "./intent_radar.schema.json",
131
+ "outputPath": "./intent_radar.output.json"
108
132
  }
109
133
  ],
110
134
  "operations": [
@@ -0,0 +1,229 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://wowok.net/schemas/intent_radar.json",
4
+ "title": "Intent Radar - User Intent × Chain Event Matching",
5
+ "description": "Persist the user's standing business intents and match them against on-chain events/data. Actions: save (record an intent), list, remove, match (score events).",
6
+ "$ref": "#/definitions/intent_radar",
7
+ "definitions": {
8
+ "intent_radar": {
9
+ "anyOf": [
10
+ {
11
+ "type": "object",
12
+ "properties": {
13
+ "action": {
14
+ "type": "string",
15
+ "const": "save"
16
+ },
17
+ "intent": {
18
+ "type": "object",
19
+ "properties": {
20
+ "id": {
21
+ "type": "string"
22
+ },
23
+ "intent": {
24
+ "type": "string"
25
+ },
26
+ "account": {
27
+ "type": "string"
28
+ },
29
+ "role": {
30
+ "type": "string",
31
+ "enum": [
32
+ "merchant",
33
+ "user",
34
+ "arbitrator"
35
+ ]
36
+ },
37
+ "industries": {
38
+ "type": "array",
39
+ "items": {
40
+ "type": "string",
41
+ "enum": [
42
+ "freelance",
43
+ "rental",
44
+ "education",
45
+ "travel",
46
+ "subscription",
47
+ "retail",
48
+ "general",
49
+ "custom"
50
+ ]
51
+ }
52
+ },
53
+ "keywords": {
54
+ "type": "array",
55
+ "items": {
56
+ "type": "string"
57
+ }
58
+ },
59
+ "target_types": {
60
+ "type": "array",
61
+ "items": {
62
+ "type": "string",
63
+ "enum": [
64
+ "NewOrderEvent",
65
+ "ProgressEvent",
66
+ "DemandPresentEvent",
67
+ "DemandFeedbackEvent",
68
+ "NewEntityEvent",
69
+ "ArbEvent"
70
+ ]
71
+ }
72
+ },
73
+ "created_at": {
74
+ "type": "number"
75
+ },
76
+ "updated_at": {
77
+ "type": "number"
78
+ }
79
+ },
80
+ "required": [
81
+ "id",
82
+ "intent",
83
+ "industries",
84
+ "keywords",
85
+ "target_types",
86
+ "created_at",
87
+ "updated_at"
88
+ ],
89
+ "additionalProperties": false
90
+ }
91
+ },
92
+ "required": [
93
+ "action",
94
+ "intent"
95
+ ],
96
+ "additionalProperties": false
97
+ },
98
+ {
99
+ "type": "object",
100
+ "properties": {
101
+ "action": {
102
+ "type": "string",
103
+ "const": "list"
104
+ },
105
+ "intents": {
106
+ "type": "array",
107
+ "items": {
108
+ "$ref": "#/definitions/intent_radar/anyOf/0/properties/intent"
109
+ }
110
+ }
111
+ },
112
+ "required": [
113
+ "action",
114
+ "intents"
115
+ ],
116
+ "additionalProperties": false
117
+ },
118
+ {
119
+ "type": "object",
120
+ "properties": {
121
+ "action": {
122
+ "type": "string",
123
+ "const": "remove"
124
+ },
125
+ "removed": {
126
+ "type": "boolean"
127
+ }
128
+ },
129
+ "required": [
130
+ "action",
131
+ "removed"
132
+ ],
133
+ "additionalProperties": false
134
+ },
135
+ {
136
+ "type": "object",
137
+ "properties": {
138
+ "action": {
139
+ "type": "string",
140
+ "const": "match"
141
+ },
142
+ "results": {
143
+ "type": "array",
144
+ "items": {
145
+ "type": "object",
146
+ "properties": {
147
+ "intent_id": {
148
+ "type": "string"
149
+ },
150
+ "intent": {
151
+ "type": "string"
152
+ },
153
+ "hits": {
154
+ "type": "array",
155
+ "items": {
156
+ "type": "object",
157
+ "properties": {
158
+ "event_type": {
159
+ "type": "string"
160
+ },
161
+ "event_id": {
162
+ "type": "string"
163
+ },
164
+ "related_objects": {
165
+ "type": "array",
166
+ "items": {
167
+ "type": "string"
168
+ }
169
+ },
170
+ "business_meaning": {
171
+ "type": "string"
172
+ },
173
+ "score": {
174
+ "type": "number"
175
+ },
176
+ "matched_industries": {
177
+ "type": "array",
178
+ "items": {
179
+ "type": "string"
180
+ }
181
+ },
182
+ "matched_keywords": {
183
+ "type": "array",
184
+ "items": {
185
+ "type": "string"
186
+ }
187
+ },
188
+ "event": {
189
+ "type": "object",
190
+ "additionalProperties": {}
191
+ }
192
+ },
193
+ "required": [
194
+ "event_type",
195
+ "event_id",
196
+ "related_objects",
197
+ "business_meaning",
198
+ "score",
199
+ "matched_industries",
200
+ "matched_keywords",
201
+ "event"
202
+ ],
203
+ "additionalProperties": false
204
+ }
205
+ },
206
+ "scanned": {
207
+ "type": "number"
208
+ }
209
+ },
210
+ "required": [
211
+ "intent_id",
212
+ "intent",
213
+ "hits",
214
+ "scanned"
215
+ ],
216
+ "additionalProperties": false
217
+ }
218
+ }
219
+ },
220
+ "required": [
221
+ "action",
222
+ "results"
223
+ ],
224
+ "additionalProperties": false
225
+ }
226
+ ]
227
+ }
228
+ }
229
+ }
@@ -0,0 +1,135 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://wowok.net/schemas/intent_radar.json",
4
+ "title": "Intent Radar - User Intent × Chain Event Matching",
5
+ "description": "Persist the user's standing business intents and match them against on-chain events/data. Actions: save (record an intent), list, remove, match (score events).",
6
+ "$ref": "#/definitions/intent_radar",
7
+ "definitions": {
8
+ "intent_radar": {
9
+ "anyOf": [
10
+ {
11
+ "type": "object",
12
+ "properties": {
13
+ "action": {
14
+ "type": "string",
15
+ "const": "save"
16
+ },
17
+ "intent": {
18
+ "type": "string",
19
+ "description": "Free-form business intent, e.g. 'find subscription services in Shanghai'."
20
+ },
21
+ "account": {
22
+ "type": "string",
23
+ "description": "Bound account; omit for a system-level intent."
24
+ },
25
+ "role": {
26
+ "type": "string",
27
+ "enum": [
28
+ "merchant",
29
+ "user",
30
+ "arbitrator"
31
+ ]
32
+ },
33
+ "target_types": {
34
+ "type": "array",
35
+ "items": {
36
+ "type": "string",
37
+ "enum": [
38
+ "NewOrderEvent",
39
+ "ProgressEvent",
40
+ "DemandPresentEvent",
41
+ "DemandFeedbackEvent",
42
+ "NewEntityEvent",
43
+ "ArbEvent"
44
+ ]
45
+ },
46
+ "description": "Event types to watch; empty = all."
47
+ }
48
+ },
49
+ "required": [
50
+ "action",
51
+ "intent"
52
+ ],
53
+ "additionalProperties": false
54
+ },
55
+ {
56
+ "type": "object",
57
+ "properties": {
58
+ "action": {
59
+ "type": "string",
60
+ "const": "list"
61
+ },
62
+ "account": {
63
+ "type": "string",
64
+ "description": "Filter by bound account; omit for all."
65
+ }
66
+ },
67
+ "required": [
68
+ "action"
69
+ ],
70
+ "additionalProperties": false
71
+ },
72
+ {
73
+ "type": "object",
74
+ "properties": {
75
+ "action": {
76
+ "type": "string",
77
+ "const": "remove"
78
+ },
79
+ "id": {
80
+ "type": "string",
81
+ "description": "Intent id to delete."
82
+ }
83
+ },
84
+ "required": [
85
+ "action",
86
+ "id"
87
+ ],
88
+ "additionalProperties": false
89
+ },
90
+ {
91
+ "type": "object",
92
+ "properties": {
93
+ "action": {
94
+ "type": "string",
95
+ "const": "match"
96
+ },
97
+ "intent_id": {
98
+ "type": "string",
99
+ "description": "Match a single intent; omit to match all intents."
100
+ },
101
+ "account": {
102
+ "type": "string",
103
+ "description": "Filter intents by account."
104
+ },
105
+ "events": {
106
+ "type": "array",
107
+ "items": {
108
+ "type": "object",
109
+ "additionalProperties": {}
110
+ },
111
+ "description": "Events to score (from onchain_events). Omit to auto-pull recent events."
112
+ },
113
+ "network": {
114
+ "type": "string",
115
+ "enum": [
116
+ "mainnet",
117
+ "testnet"
118
+ ]
119
+ },
120
+ "limit": {
121
+ "type": "integer",
122
+ "minimum": 1,
123
+ "maximum": 100,
124
+ "description": "Max events to auto-pull when `events` is omitted."
125
+ }
126
+ },
127
+ "required": [
128
+ "action"
129
+ ],
130
+ "additionalProperties": false
131
+ }
132
+ ]
133
+ }
134
+ }
135
+ }
@@ -67,6 +67,20 @@
67
67
  "type": "string",
68
68
  "description": "Decrypted plaintext (optional)"
69
69
  },
70
+ "replyTo": {
71
+ "type": "object",
72
+ "properties": {
73
+ "messageId": {
74
+ "type": "string",
75
+ "description": "Replied-to message ID (unique within the conversation)"
76
+ }
77
+ },
78
+ "required": [
79
+ "messageId"
80
+ ],
81
+ "additionalProperties": false,
82
+ "description": "Quoted (replied-to) message reference, if this message replies to a previous one"
83
+ },
70
84
  "guardAddress": {
71
85
  "type": "string",
72
86
  "description": "Guard address"
@@ -135,6 +135,20 @@
135
135
  "mainnet"
136
136
  ],
137
137
  "description": "Target network for Guard verification (e.g., testnet, mainnet). REQUIRED when guardAddress and passportAddress are provided — Guard messages and regular messages are independent data systems on different networks"
138
+ },
139
+ "replyTo": {
140
+ "type": "object",
141
+ "properties": {
142
+ "messageId": {
143
+ "type": "string",
144
+ "description": "Replied-to message ID (unique within the conversation)"
145
+ }
146
+ },
147
+ "required": [
148
+ "messageId"
149
+ ],
150
+ "additionalProperties": false,
151
+ "description": "Quote/reply to a previous message in the SAME conversation. The messageId MUST exist in local storage for the current conversation, otherwise sending fails"
138
152
  }
139
153
  },
140
154
  "additionalProperties": false,
@@ -489,6 +503,10 @@
489
503
  "type": "string",
490
504
  "description": "Decrypted plaintext (optional)"
491
505
  },
506
+ "replyTo": {
507
+ "$ref": "#/definitions/messenger_operation/anyOf/1/properties/options/properties/replyTo",
508
+ "description": "Quoted (replied-to) message reference, if this message replies to a previous one"
509
+ },
492
510
  "guardAddress": {
493
511
  "type": "string",
494
512
  "description": "Guard address"
@@ -2074,7 +2074,7 @@
2074
2074
  },
2075
2075
  "wip": {
2076
2076
  "type": "string",
2077
- "description": "WIP file URL. EMPTY string \"\" skips verification (TESTING ONLY). Production MUST use a real HTTP URL pointing to a .wip file generated by the wip_file tool. Example: \"https://cdn.example.com/products/phone_v1.wip\""
2077
+ "description": "WIP file URL. EMPTY string \"\" skips verification (TESTING ONLY). Production MUST use a real HTTP URL pointing to a .wip file generated by the wip_file tool. ⚠️ NETWORK DEPLOYMENT REQUIRED: the URL is stored ON-CHAIN and every customer fetches it when placing an order. A local file path (C:\\..., /path/file.wip), a localhost/loopback URL or a LAN private-IP URL is unreachable by customers on other machines — it passes the merchant-side set-time verification but makes order_new abort 100% for customers. Either deploy the .wip file to a public endpoint (GitHub Pages / IPFS / your own website) and set this to the public URL, or leave it empty (\"\") to skip WIP verification (TESTING ONLY). Example: \"https://cdn.example.com/products/phone_v1.wip\""
2078
2078
  },
2079
2079
  "wip_hash": {
2080
2080
  "type": "string",
@@ -2159,7 +2159,7 @@
2159
2159
  "description": "Clear all sales products or services."
2160
2160
  }
2161
2161
  ],
2162
- "description": "Service sales products or services list."
2162
+ "description": "Service sales products or services list. ⚠️ WIP NETWORK-DEPLOYMENT RULE: a non-empty sale.wip MUST be a publicly reachable URL (GitHub Pages / IPFS / your own website). The URL is stored ON-CHAIN and every customer fetches it at order time — a local file path, localhost/loopback URL, or LAN private-IP URL is unreachable by customers on other machines and aborts order_new 100%. Local-network URLs are INTERNAL TEST USE ONLY (env.network = localnet). Leave sale.wip empty (\"\") to skip WIP verification (TESTING ONLY)."
2163
2163
  },
2164
2164
  "repositories": {
2165
2165
  "anyOf": [
@@ -311,7 +311,7 @@
311
311
  },
312
312
  "wip": {
313
313
  "type": "string",
314
- "description": "WIP file URL. EMPTY string \"\" skips verification (TESTING ONLY). Production MUST use a real HTTP URL pointing to a .wip file generated by the wip_file tool. Example: \"https://cdn.example.com/products/phone_v1.wip\""
314
+ "description": "WIP file URL. EMPTY string \"\" skips verification (TESTING ONLY). Production MUST use a real HTTP URL pointing to a .wip file generated by the wip_file tool. ⚠️ NETWORK DEPLOYMENT REQUIRED: the URL is stored ON-CHAIN and every customer fetches it when placing an order. A local file path (C:\\..., /path/file.wip), a localhost/loopback URL or a LAN private-IP URL is unreachable by customers on other machines — it passes the merchant-side set-time verification but makes order_new abort 100% for customers. Either deploy the .wip file to a public endpoint (GitHub Pages / IPFS / your own website) and set this to the public URL, or leave it empty (\"\") to skip WIP verification (TESTING ONLY). Example: \"https://cdn.example.com/products/phone_v1.wip\""
315
315
  },
316
316
  "wip_hash": {
317
317
  "type": "string",
@@ -396,7 +396,7 @@
396
396
  "description": "Clear all sales products or services."
397
397
  }
398
398
  ],
399
- "description": "Service sales products or services list."
399
+ "description": "Service sales products or services list. ⚠️ WIP NETWORK-DEPLOYMENT RULE: a non-empty sale.wip MUST be a publicly reachable URL (GitHub Pages / IPFS / your own website). The URL is stored ON-CHAIN and every customer fetches it at order time — a local file path, localhost/loopback URL, or LAN private-IP URL is unreachable by customers on other machines and aborts order_new 100%. Local-network URLs are INTERNAL TEST USE ONLY (env.network = localnet). Leave sale.wip empty (\"\") to skip WIP verification (TESTING ONLY)."
400
400
  },
401
401
  "repositories": {
402
402
  "anyOf": [