@wowok/agent-mcp 3.2.7 → 3.3.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.
Files changed (265) hide show
  1. package/README.md +2 -2
  2. package/dist/chain-semantics/field-capability.js +1 -1
  3. package/dist/chain-semantics/freeze-map.js +1 -1
  4. package/dist/chain-semantics/fund-flow.js +1 -1
  5. package/dist/chain-semantics/guard-verbs.js +1 -1
  6. package/dist/chain-semantics/object-graph.js +1 -1
  7. package/dist/composition/audit.js +1 -1
  8. package/dist/composition/compile.d.ts +10 -1
  9. package/dist/composition/compile.js +1 -1
  10. package/dist/composition/inflight.d.ts +10 -0
  11. package/dist/composition/inflight.js +1 -1
  12. package/dist/extensions/business-modules.d.ts +1 -1
  13. package/dist/extensions/business-modules.js +1 -1
  14. package/dist/extensions/capability-manifest.js +1 -1
  15. package/dist/extensions/industry-audit.spec.js +1 -1
  16. package/dist/extensions/industry-pack.js +1 -1
  17. package/dist/graph/onchain/edge-schema.js +1 -1
  18. package/dist/graph/onchain/facts.spec.js +1 -1
  19. package/dist/graph/onchain/field-manifest.js +1 -1
  20. package/dist/harness/index.d.ts +1 -0
  21. package/dist/harness/index.js +1 -1
  22. package/dist/harness/operation-id.d.ts +1 -0
  23. package/dist/harness/operation-id.js +1 -0
  24. package/dist/harness/recover.js +1 -1
  25. package/dist/index.js +1 -1
  26. package/dist/intent/types.d.ts +1 -1
  27. package/dist/intent/types.js +1 -1
  28. package/dist/keeper/KeeperScan.d.ts +2 -1
  29. package/dist/keeper/KeeperScan.js +1 -1
  30. package/dist/keeper/keeper.spec.js +1 -1
  31. package/dist/keeper/types.d.ts +3 -0
  32. package/dist/keeper/types.js +1 -1
  33. package/dist/knowledge/allocator-rail-verifier.d.ts +34 -0
  34. package/dist/knowledge/allocator-rail-verifier.js +1 -0
  35. package/dist/knowledge/arbitration-ledger.js +1 -1
  36. package/dist/knowledge/arbitration-templates.js +1 -1
  37. package/dist/knowledge/arbitration-venue-order.js +1 -1
  38. package/dist/knowledge/audit-rules.d.ts +19 -1
  39. package/dist/knowledge/audit-rules.js +1 -1
  40. package/dist/knowledge/baselines/rules/alloc_audit.json +1 -1
  41. package/dist/knowledge/baselines/rules/arb.json +1 -1
  42. package/dist/knowledge/baselines/rules/guard.json +106 -1
  43. package/dist/knowledge/baselines/rules/machine.json +9 -6
  44. package/dist/knowledge/baselines/rules/plan.json +40 -17
  45. package/dist/knowledge/baselines/semantic-facts.js +1 -1
  46. package/dist/knowledge/builtin-templates.d.ts +1 -1
  47. package/dist/knowledge/builtin-templates.js +1 -1
  48. package/dist/knowledge/contract-invariants.js +1 -1
  49. package/dist/knowledge/discount-threshold.d.ts +11 -0
  50. package/dist/knowledge/discount-threshold.js +1 -1
  51. package/dist/knowledge/event-semantics.js +1 -1
  52. package/dist/knowledge/fund-layer.js +1 -1
  53. package/dist/knowledge/getting-started.js +1 -1
  54. package/dist/knowledge/guard-anchor-reach.d.ts +1 -1
  55. package/dist/knowledge/guard-anchor-reach.js +1 -1
  56. package/dist/knowledge/guard-bindings.js +1 -1
  57. package/dist/knowledge/guard-design-patterns.d.ts +1 -1
  58. package/dist/knowledge/guard-design-patterns.js +1 -1
  59. package/dist/knowledge/guard-field-cognition.js +1 -1
  60. package/dist/knowledge/guard-ledger.js +1 -1
  61. package/dist/knowledge/guard-lint.js +1 -1
  62. package/dist/knowledge/guard-render.js +1 -1
  63. package/dist/knowledge/guard-risk.d.ts +1 -0
  64. package/dist/knowledge/guard-risk.js +1 -1
  65. package/dist/knowledge/guard-submission-brief.d.ts +6 -0
  66. package/dist/knowledge/guard-submission-brief.js +1 -1
  67. package/dist/knowledge/guard-templates.d.ts +2 -2
  68. package/dist/knowledge/guard-templates.js +1 -1
  69. package/dist/knowledge/index.js +1 -1
  70. package/dist/knowledge/industry-registry.js +1 -1
  71. package/dist/knowledge/industry-strategy.js +1 -1
  72. package/dist/knowledge/jsonrpc-enum.js +1 -1
  73. package/dist/knowledge/machine-ledger.js +1 -1
  74. package/dist/knowledge/machine-puzzle.d.ts +1 -1
  75. package/dist/knowledge/machine-puzzle.js +1 -1
  76. package/dist/knowledge/machine-risk.js +1 -1
  77. package/dist/knowledge/machine-templates.js +1 -1
  78. package/dist/knowledge/machine-topology.d.ts +8 -0
  79. package/dist/knowledge/machine-topology.js +1 -1
  80. package/dist/knowledge/machine-translation.js +1 -1
  81. package/dist/knowledge/order-ledger.js +1 -1
  82. package/dist/knowledge/permission-ledger.js +1 -1
  83. package/dist/knowledge/protocol-facts.d.ts +16 -0
  84. package/dist/knowledge/protocol-facts.js +1 -0
  85. package/dist/knowledge/recipient-constraint.js +1 -1
  86. package/dist/knowledge/reward-ledger.d.ts +2 -1
  87. package/dist/knowledge/reward-ledger.js +1 -1
  88. package/dist/knowledge/reward-templates.js +1 -1
  89. package/dist/knowledge/safety-rules.d.ts +0 -2
  90. package/dist/knowledge/safety-rules.js +1 -1
  91. package/dist/knowledge/scenario-modes.d.ts +7 -0
  92. package/dist/knowledge/scenario-modes.js +1 -1
  93. package/dist/knowledge/strategy-manuals.js +1 -1
  94. package/dist/knowledge/template-loader.d.ts +13 -1
  95. package/dist/knowledge/template-loader.js +1 -1
  96. package/dist/knowledge/template-registry.js +1 -1
  97. package/dist/knowledge/template-scanner.d.ts +2 -0
  98. package/dist/knowledge/template-scanner.js +1 -1
  99. package/dist/knowledge/tool-constraints.js +1 -1
  100. package/dist/knowledge/tools-reference.js +1 -1
  101. package/dist/knowledge/workflow-guidance.d.ts +7 -3
  102. package/dist/knowledge/workflow-guidance.js +1 -1
  103. package/dist/monitor/MonitorLoop.js +1 -1
  104. package/dist/monitor/normalize.d.ts +1 -1
  105. package/dist/monitor/normalize.js +1 -1
  106. package/dist/monitor/types.d.ts +1 -1
  107. package/dist/monitor/types.js +1 -1
  108. package/dist/participation/radar-core.d.ts +1 -1
  109. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  110. package/dist/playbooks/service-build/game-theory.d.ts +1 -0
  111. package/dist/playbooks/service-build/game-theory.js +1 -1
  112. package/dist/playbooks/service-build/intent-analyzer.js +1 -1
  113. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  114. package/dist/playbooks/service-build/merchant-guide.d.ts +8 -0
  115. package/dist/playbooks/service-build/merchant-guide.js +1 -1
  116. package/dist/playbooks/service-build/object-panorama.d.ts +28 -1
  117. package/dist/playbooks/service-build/object-panorama.js +1 -1
  118. package/dist/playbooks/service-build/participation-radar.d.ts +2 -0
  119. package/dist/playbooks/service-build/participation-radar.js +1 -1
  120. package/dist/playbooks/service-build/relationship-profile.js +1 -1
  121. package/dist/playbooks/service-build/reverse-mapping-nk4.spec.js +1 -1
  122. package/dist/playbooks/service-build/reverse-mapping.js +1 -1
  123. package/dist/playbooks/service-build/service-panorama.js +1 -1
  124. package/dist/playbooks/service-build/service-quote.js +1 -1
  125. package/dist/playbooks/service-build/service-quote.spec.js +1 -1
  126. package/dist/relationship/registry.js +1 -1
  127. package/dist/review/index.js +1 -1
  128. package/dist/role/profiles.js +1 -1
  129. package/dist/safety/confirm-gate.js +1 -1
  130. package/dist/safety/preview.d.ts +1 -0
  131. package/dist/safety/preview.js +1 -1
  132. package/dist/schema/benchmark-migration/index.d.ts +19 -1
  133. package/dist/schema/benchmark-migration/index.js +1 -1
  134. package/dist/schema/call/allocation.d.ts +1 -1
  135. package/dist/schema/call/arbitration.d.ts +8 -8
  136. package/dist/schema/call/arbitration.js +1 -1
  137. package/dist/schema/call/base.d.ts +52 -5
  138. package/dist/schema/call/base.js +1 -1
  139. package/dist/schema/call/bridge.d.ts +3 -0
  140. package/dist/schema/call/contact.d.ts +5 -5
  141. package/dist/schema/call/demand.d.ts +5 -5
  142. package/dist/schema/call/error-codes.d.ts +1 -1
  143. package/dist/schema/call/error-codes.js +1 -1
  144. package/dist/schema/call/guard.d.ts +3 -3
  145. package/dist/schema/call/guard.js +1 -1
  146. package/dist/schema/call/handler.js +1 -1
  147. package/dist/schema/call/machine.d.ts +13 -5
  148. package/dist/schema/call/machine.js +1 -1
  149. package/dist/schema/call/order.d.ts +5 -5
  150. package/dist/schema/call/order.js +1 -1
  151. package/dist/schema/call/permission.d.ts +5 -5
  152. package/dist/schema/call/personal.d.ts +4 -4
  153. package/dist/schema/call/progress.d.ts +5 -5
  154. package/dist/schema/call/progress.js +1 -1
  155. package/dist/schema/call/proof.js +1 -1
  156. package/dist/schema/call/receipt.d.ts +8 -0
  157. package/dist/schema/call/receipt.js +1 -1
  158. package/dist/schema/call/repository.d.ts +9 -9
  159. package/dist/schema/call/repository.js +1 -1
  160. package/dist/schema/call/reward.d.ts +25 -5
  161. package/dist/schema/call/reward.js +1 -1
  162. package/dist/schema/call/semantic.js +1 -1
  163. package/dist/schema/call/service.d.ts +10 -5
  164. package/dist/schema/call/service.js +1 -1
  165. package/dist/schema/call/treasury.d.ts +5 -5
  166. package/dist/schema/common/index.d.ts +6 -6
  167. package/dist/schema/common/index.js +1 -1
  168. package/dist/schema/goal/index.d.ts +17 -1
  169. package/dist/schema/goal/planning.d.ts +28 -2
  170. package/dist/schema/goal/planning.js +1 -1
  171. package/dist/schema/industry-pack/index.d.ts +3 -0
  172. package/dist/schema/industry-pack/index.js +1 -1
  173. package/dist/schema/intent-radar/index.d.ts +9 -0
  174. package/dist/schema/intent-radar/index.js +1 -1
  175. package/dist/schema/local/index.d.ts +31 -0
  176. package/dist/schema/local/index.js +1 -1
  177. package/dist/schema/messenger/index.js +1 -1
  178. package/dist/schema/operations.d.ts +57 -43
  179. package/dist/schema/operations.js +1 -1
  180. package/dist/schema/query/bi.d.ts +22 -6
  181. package/dist/schema/query/bi.js +1 -1
  182. package/dist/schema/query/index.d.ts +164 -102
  183. package/dist/schema/query/index.js +1 -1
  184. package/dist/schema/schema-query/index.d.ts +2 -0
  185. package/dist/schema/schema-query/index.js +1 -1
  186. package/dist/schema/schema-version.js +1 -1
  187. package/dist/schema/utils/permission-machine-check.d.ts +2 -0
  188. package/dist/schema/utils/permission-machine-check.js +1 -1
  189. package/dist/schema/workflow/index.d.ts +1 -1
  190. package/dist/schema-query-impl/index.d.ts +1 -1
  191. package/dist/schema-query-impl/index.js +1 -1
  192. package/dist/schemas/account_operation.output.json +3 -0
  193. package/dist/schemas/account_operation.schema.json +4 -4
  194. package/dist/schemas/benchmark_migration_operation.output.json +42 -0
  195. package/dist/schemas/benchmark_migration_operation.schema.json +40 -3
  196. package/dist/schemas/bridge_operation.output.json +3 -0
  197. package/dist/schemas/goal_operation.schema.json +52 -2
  198. package/dist/schemas/index.json +1 -1
  199. package/dist/schemas/industry_pack_operation.output.json +8 -0
  200. package/dist/schemas/industry_pack_operation.schema.json +9 -0
  201. package/dist/schemas/intent_radar.output.json +8 -2
  202. package/dist/schemas/intent_radar.schema.json +4 -1
  203. package/dist/schemas/local_cache_operation.output.json +3 -0
  204. package/dist/schemas/local_history_operation.output.json +3 -0
  205. package/dist/schemas/local_info_operation.output.json +3 -0
  206. package/dist/schemas/local_mark_operation.output.json +3 -0
  207. package/dist/schemas/messenger_operation.schema.json +4 -4
  208. package/dist/schemas/monitor_events.schema.json +3 -1
  209. package/dist/schemas/onchain_events.output.json +275 -11
  210. package/dist/schemas/onchain_events.schema.json +25 -1
  211. package/dist/schemas/onchain_operations.output.json +47 -5
  212. package/dist/schemas/onchain_operations.schema.json +664 -179
  213. package/dist/schemas/onchain_operations_allocation.schema.json +7 -7
  214. package/dist/schemas/onchain_operations_arbitration.schema.json +21 -15
  215. package/dist/schemas/onchain_operations_contact.schema.json +15 -10
  216. package/dist/schemas/onchain_operations_demand.schema.json +15 -10
  217. package/dist/schemas/onchain_operations_gen_passport.schema.json +5 -5
  218. package/dist/schemas/onchain_operations_gen_proof.schema.json +1 -1
  219. package/dist/schemas/onchain_operations_guard.schema.json +346 -8
  220. package/dist/schemas/onchain_operations_machine.schema.json +24 -11
  221. package/dist/schemas/onchain_operations_order.schema.json +17 -12
  222. package/dist/schemas/onchain_operations_permission.schema.json +10 -5
  223. package/dist/schemas/onchain_operations_personal.schema.json +2 -2
  224. package/dist/schemas/onchain_operations_progress.schema.json +17 -12
  225. package/dist/schemas/onchain_operations_proof.schema.json +6 -6
  226. package/dist/schemas/onchain_operations_repository.schema.json +19 -14
  227. package/dist/schemas/onchain_operations_reward.schema.json +96 -15
  228. package/dist/schemas/onchain_operations_service.schema.json +33 -21
  229. package/dist/schemas/onchain_operations_treasury.schema.json +15 -10
  230. package/dist/schemas/onchain_table_data.output.json +7 -7
  231. package/dist/schemas/query_toolkit.output.json +268 -44
  232. package/dist/schemas/query_toolkit.schema.json +1 -1
  233. package/dist/schemas/schema_query.schema.json +7 -2
  234. package/dist/schemas/workflow_operation.schema.json +5 -5
  235. package/dist/schemas/wowok_buildin_info.output.json +140 -3
  236. package/dist/schemas/wowok_buildin_info.schema.json +2 -2
  237. package/dist/tools/handlers/benchmark-migration.d.ts +66 -1
  238. package/dist/tools/handlers/benchmark-migration.js +1 -1
  239. package/dist/tools/handlers/config.js +1 -1
  240. package/dist/tools/handlers/dispatch-expectations.d.ts +0 -1
  241. package/dist/tools/handlers/dispatch-expectations.js +1 -1
  242. package/dist/tools/handlers/industry-pack.js +1 -1
  243. package/dist/tools/handlers/intent-radar.js +1 -1
  244. package/dist/tools/handlers/keeper.d.ts +1 -1
  245. package/dist/tools/handlers/local.js +1 -1
  246. package/dist/tools/handlers/onchain.d.ts +12 -0
  247. package/dist/tools/handlers/onchain.js +1 -1
  248. package/dist/tools/handlers/query.d.ts +1 -0
  249. package/dist/tools/handlers/query.js +1 -1
  250. package/dist/tools/handlers/review-chain.js +1 -1
  251. package/dist/tools/handlers/schema-query.js +1 -1
  252. package/dist/tools/handlers/workflow.js +1 -1
  253. package/dist/tools/index.js +1 -1
  254. package/dist/tools/move-fn-index.gen.js +1 -1
  255. package/dist/tools/registry/agent.js +1 -1
  256. package/dist/tools/registry/business.js +1 -1
  257. package/dist/tools/registry/files.js +1 -1
  258. package/dist/tools/registry/query.js +1 -1
  259. package/dist/tools/rules-hook.js +1 -1
  260. package/dist/tools/upgrade-check.d.ts +23 -0
  261. package/dist/tools/upgrade-check.js +1 -1
  262. package/dist/tools/wip-deploy-assist.d.ts +6 -0
  263. package/dist/tools/wip-deploy-assist.js +1 -1
  264. package/dist/tools/wrap.js +1 -1
  265. package/package.json +2 -2
@@ -230,7 +230,7 @@
230
230
  "additionalProperties": false
231
231
  },
232
232
  "order_required_info": {
233
- "description": "Contact object ID or WTS Proof object, RECORDED on the Order as evidence that the order holder delivered the private information the Service declares in customer_required (e.g. phone/email/shipping_address). RECORD-ONLY, NOT ENFORCED: nothing on-chain reads this field — the purchase entry never requires it, and an order supplying none of the declared fields is still created. FLOW: the order holder sends the information to the Service's Contact (um) via end-to-end encrypted Messenger, then passes the Contact object ID or the generated WTS Proof here. To ENFORCE delivery on-chain, mount the pattern.required_info_evidence_gate Guard on the forward that hands over goods or funds, asserting order.required_info is some (presence-only — the recorded address value is never a guard condition; accepting the delivered information is the merchant's confirming forward).",
233
+ "description": "Contact object ID or WTS Proof object, RECORDED on the Order as evidence that the order holder delivered the private information the Service declares in customer_required (e.g. phone/email/shipping_address). RECORD-ONLY, NOT ENFORCED: nothing on-chain reads this field — the purchase entry never requires it, and an order supplying none of the declared fields is still created. FLOW: the order holder sends the information to the Service's Contact (um) via end-to-end encrypted Messenger, then passes the Contact object ID or the generated WTS Proof here. To ENFORCE delivery on-chain, mount the pattern.required_info_evidence_gate Guard on the forward that hands over goods or funds, asserting order.required_info is some (presence-only — the recorded address value is never a guard condition; accepting the delivered information is the merchant's confirming forward). ATTESTATION-ONLY: the recorded value is self-attested, has no on-chain readback, and MUST NOT be used as a gate condition. PER-ORDER BINDING: when the listing genuinely promises a per-order credential, use the dedicated controlled bind operation (order_required_info_bind) with a Proof whose about is THIS order and whose creator is the order holder — the chain verifies both at write time and rejects a mismatch without writing anything. The reuse model (one Contact Proof across orders) stays the default for this plain record field; pick per listing promise, not per habit. BOUNDARY: that binding proves the credential AUTHOR only, never its content or any rating — do not mirror it onto review/reward claims; public reviews are Repository rows whose values are enforced guard-side via data-value probes, not through Proof objects.",
234
234
  "type": "string"
235
235
  },
236
236
  "transfer": {
@@ -341,7 +341,7 @@
341
341
  "type": "string"
342
342
  },
343
343
  "sales": {
344
- "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).",
344
+ "description": "Service sales products or services list. ⚠️ WIP (PRODUCT-DETAIL FILE) — HOW TO PROVIDE IT: (1) EASIEST — official free hosting: upload the detail file with the wip_file tool; the default endpoint is https://wip.store.wowok.net (free: 10 files per account, 180-day retention, 12MB per file, rate-limited; files stay until you purge them). Put the returned URL into sale.wip. (2) Your own hosting: any publicly reachable URL (GitHub Pages / IPFS / your own website) — pass customBaseUrl to wip_file when uploading to a non-default endpoint, or host the file yourself and put that URL into sale.wip. For long-lived MAINNET listings prefer your own endpoint so the detail page outlives the free retention window. ⚠️ REACHABILITY RULE: a non-empty sale.wip MUST be a publicly reachable URL. 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). ⚠️ SCORING: on mainnet, a sale item without a product-detail file is an incomplete listing — it hurts the service's market completeness score. Leave sale.wip empty (\"\") only for quick local testing.",
345
345
  "oneOf": [
346
346
  {
347
347
  "type": "object",
@@ -742,7 +742,7 @@
742
742
  ]
743
743
  },
744
744
  "rewards": {
745
- "description": "Service Reward object list. May share the Service's Permission (no conflict check — intentional: rewards are the provider's own incentive tool; only Arbitration requires a different Permission for neutrality).",
745
+ "description": "Service Reward object list. May share the Service's Permission (no conflict check — intentional: rewards are the provider's own incentive tool; only Arbitration requires a different Permission for neutrality). ⚠️ OP SEMANTICS (SDK translation, etm-mn-261013 E-06): op:'set' executes as clear + add — and reward clear is TIME-LOCKED after publish (E_LOCKED_TIME_NOT_ENOUGH = abort 24: requires pause + setting_lock_duration elapsed, default 30 days). BEFORE publish op:'set' is fine; AFTER publish attach rewards with op:'add' ONLY (add has no lock).",
746
746
  "anyOf": [
747
747
  {
748
748
  "type": "object",
@@ -812,7 +812,7 @@
812
812
  ]
813
813
  },
814
814
  "arbitrations": {
815
- "description": "Service Arbitration object list. FORMAT: same as repositories — use the `objects` field name inside the operation data. Example: {arbitrations: {op: 'set', objects: [{name: 'my_arb_1'}, {name: 'my_arb_2'}]}}. NOTE: op:'add' is disabled on this surface (its success response can arrive unparseable and reads like a failure); ALWAYS pass the FULL list with op:'set'. Each item is a NameOrAddress (object ID or local mark name). ⚠️ PERMISSION RULE (contract-enforced): every Arbitration bound here MUST use a Permission object DIFFERENT from THIS Service's permission — binding an Arbitration that shares the Service's Permission aborts with E_ARBITRATION_PERMISSION_CONFLICT (error 33). Create a dedicated Permission for each Arbitration BEFORE binding. DESIGN RATIONALE (confirmed intentional): dispute resolution requires NEUTRALITY — an Arbitration controlled by the same Permission admins as the Service it judges would be a conflict of interest. ONLY Arbitration has this check: Reward and Treasury objects MAY share the Service's Permission (they are the provider's own tools).",
815
+ "description": "Service Arbitration object list. FORMAT: same as repositories — use the `objects` field name inside the operation data. Example: {arbitrations: {op: 'add', objects: [{name: 'my_arb_1'}]}}. Each item is a NameOrAddress (object ID or local mark name). ⚠️ OP SEMANTICS (SDK translation, etm-mn-261013 E-06 + crs P3-1): op:'add' appends and is the ONLY unlocked path after publish (add has no publish assert, service.move). op:'set' executes as clear + add and REPLACES the entire allowlist (pass EVERY Arbitration that must remain bound) — clear is TIME-LOCKED after publish (E_LOCKED_TIME_NOT_ENOUGH = abort 24: requires pause + setting_lock_duration elapsed, default 30 days), so use op:'set' BEFORE publish only. (The 2026-10-08 op:'add' disable was lifted: the unparseable-success-response SDK bug it responded to is fixed — safeTextJson + big-int conversion.) ⚠️ PERMISSION RULE (contract-enforced): every Arbitration bound here MUST use a Permission object DIFFERENT from THIS Service's permission — binding an Arbitration that shares the Service's Permission aborts with E_ARBITRATION_PERMISSION_CONFLICT (error 33). Create a dedicated Permission for each Arbitration BEFORE binding. DESIGN RATIONALE (confirmed intentional): dispute resolution requires NEUTRALITY — an Arbitration controlled by the same Permission admins as the Service it judges would be a conflict of interest. ONLY Arbitration has this check: Reward and Treasury objects MAY share the Service's Permission (they are the provider's own tools).",
816
816
  "anyOf": [
817
817
  {
818
818
  "type": "object",
@@ -935,9 +935,13 @@
935
935
  ]
936
936
  },
937
937
  "time_ms_start": {
938
- "description": "Discount start time (milliseconds)",
938
+ "description": "Discount start time (milliseconds). ⚠️ A FUTURE start mints a coupon that is listed as usable but CANNOT be spent until the window opens (every spend aborts E_DISCOUNT_TIME_INVALID / buy code 35). Legitimate for scheduled campaigns — the mint carries a loud warning; do not distribute the coupon to recipients before the window opens.",
939
939
  "type": "number"
940
940
  },
941
+ "allow_zero_total": {
942
+ "description": "FREE-TIER ESCAPE HATCH (BKN-P2): a coupon that would drive the final total to 0 (MINUS value >= the cheapest SKU price, or RATES value 10000) is BLOCKED at issuance by default. Set true ONLY to declare a deliberate zero-price product: the issuance then proceeds with a disclosure that zero-total orders carry an empty escrow and NEVER trigger reward/incentive rails. Omit (default false) for normal discounts.",
943
+ "type": "boolean"
944
+ },
941
945
  "time_ms_end": {
942
946
  "type": "number",
943
947
  "description": "Discount end time (milliseconds)"
@@ -978,7 +982,7 @@
978
982
  "check_all_founded"
979
983
  ],
980
984
  "additionalProperties": false,
981
- "description": "Discount recipient"
985
+ "description": "Discount recipient. OBJECT FORM REQUIRED (T9 az3-mn-261013): a bare string is REJECTED here — pass {entities: [{name_or_address: '<account_name_or_0x_address>'}]} (example: {entities: [{name_or_address: 'buyer1'}]}). Total coupons delivered = count × number of recipients."
982
986
  },
983
987
  "transferable": {
984
988
  "type": "boolean",
@@ -1015,7 +1019,7 @@
1015
1019
  "type": "string",
1016
1020
  "description": "Account/Object name or ID. If specifying an account, use empty string '' for the default account. If it starts with '0x', it will be treated as an ID. Otherwise, it will be treated as a name (max 64 bcs characters)."
1017
1021
  },
1018
- "description": "Coupon object IDs or local names to transfer. You MUST own these Discount objects. Each coupon must have been minted with transferable:true — otherwise the chain aborts with E_DISCOUNT_NOT_TRANSFERABLE (semantic code service:10). Coupons stay single-use; the transfer does not change that. Max 1000 coupons per call (SDK limit MAX_DISCOUNT_COUNT_ONCE)."
1022
+ "description": "Coupon object IDs or local names to transfer. You MUST own these Discount objects. Each coupon must have been minted with transferable:true — otherwise the chain aborts with E_DISCOUNT_NOT_TRANSFERABLE (semantic code service:10). Coupons stay single-use; the transfer does not change that. There is NO batch entry on-chain — each coupon is delivered by its own singleton call (fanned out automatically); prefer ONE coupon per transaction for coupon migrations (SDK cap MAX_DISCOUNT_COUNT_ONCE still applies)."
1019
1023
  },
1020
1024
  "recipient": {
1021
1025
  "type": "object",
@@ -1099,7 +1103,7 @@
1099
1103
  "GuardIdentifier"
1100
1104
  ],
1101
1105
  "additionalProperties": false,
1102
- "description": "Guard verified recipient ID. Get recipient ID from specified data index in Guard table. The ID must be of address type."
1106
+ "description": "Guard verified recipient ID. Get recipient ID from specified data index in Guard table. The ID must be of address type. ALLOCATION rails only — the REWARD claim rail requires recipient == the transaction sender (abort 14), so a GuardIdentifier recipient on reward.guard_add resolves to the submitted Order and is structurally unpayable; the tool gate rejects it (crs-mn-261015 F-12)."
1103
1107
  },
1104
1108
  {
1105
1109
  "type": "object",
@@ -1138,7 +1142,7 @@
1138
1142
  "Signer"
1139
1143
  ],
1140
1144
  "additionalProperties": false,
1141
- "description": "Current transaction signer (tx_context::sender) at the time of the alloc() call. For refunds, the Order owner must call alloc_by_guard themselves to receive the funds."
1145
+ "description": "Current transaction signer (tx_context::sender) at the time of the alloc() call. For refunds, the Order owner must call alloc_by_guard themselves to receive the funds. On the REWARD claim rail this is the CANONICAL recipient (the claim entry requires recipient == the tx sender)."
1142
1146
  }
1143
1147
  ],
1144
1148
  "description": "Recipient of this allocation. Three forms — each resolves the address at a DIFFERENT time:\n• { GuardIdentifier: u8 } — DYNAMIC address resolved from Passport at alloc() time (from the passport's submission record). Use 0 for Order owner in Service-integrated mode (Customer who created the Order). The identifier must match a Guard table entry with b_submission=true. If Passport has no matching submission, contract aborts with E_VERIFY_FAILED. Use when the recipient address is not known at config time and must be supplied via Guard submission data.\n• { Entity: { name_or_address: '...' } } — FIXED address resolved via LocalMark at SDK build time (passed to contract as a literal address). Use for known recipients (e.g., 'turo_host', or a Treasury object address). Use when the recipient is a stable, known address (e.g., operator receives rent, platform fee to treasury).\n• 'Signer' — the transaction sender at the time of the alloc() call (tx_context::sender). RESOLVED AT EXECUTION TIME, not at config time. For refunds: the customer (Order owner) must call alloc_by_guard THEMSELVES so that tx_context::sender resolves to THEIR address — if the operator calls alloc_by_guard, the operator becomes the recipient (Signer = operator), NOT the customer. Use when the recipient is whoever submits the allocation transaction (e.g., customer receives refund)."
@@ -1284,7 +1288,7 @@
1284
1288
  "GuardIdentifier"
1285
1289
  ],
1286
1290
  "additionalProperties": false,
1287
- "description": "Guard verified recipient ID. Get recipient ID from specified data index in Guard table. The ID must be of address type."
1291
+ "description": "Guard verified recipient ID. Get recipient ID from specified data index in Guard table. The ID must be of address type. ALLOCATION rails only — the REWARD claim rail requires recipient == the transaction sender (abort 14), so a GuardIdentifier recipient on reward.guard_add resolves to the submitted Order and is structurally unpayable; the tool gate rejects it (crs-mn-261015 F-12)."
1288
1292
  },
1289
1293
  {
1290
1294
  "type": "object",
@@ -1323,7 +1327,7 @@
1323
1327
  "Signer"
1324
1328
  ],
1325
1329
  "additionalProperties": false,
1326
- "description": "Current transaction signer (tx_context::sender) at the time of the alloc() call. For refunds, the Order owner must call alloc_by_guard themselves to receive the funds."
1330
+ "description": "Current transaction signer (tx_context::sender) at the time of the alloc() call. For refunds, the Order owner must call alloc_by_guard themselves to receive the funds. On the REWARD claim rail this is the CANONICAL recipient (the claim entry requires recipient == the tx sender)."
1327
1331
  }
1328
1332
  ],
1329
1333
  "description": "Recipient of this allocation. Three forms — each resolves the address at a DIFFERENT time:\n• { GuardIdentifier: u8 } — DYNAMIC address resolved from Passport at alloc() time (from the passport's submission record). Use 0 for Order owner in Service-integrated mode (Customer who created the Order). The identifier must match a Guard table entry with b_submission=true. If Passport has no matching submission, contract aborts with E_VERIFY_FAILED. Use when the recipient address is not known at config time and must be supplied via Guard submission data.\n• { Entity: { name_or_address: '...' } } — FIXED address resolved via LocalMark at SDK build time (passed to contract as a literal address). Use for known recipients (e.g., 'turo_host', or a Treasury object address). Use when the recipient is a stable, known address (e.g., operator receives rent, platform fee to treasury).\n• 'Signer' — the transaction sender at the time of the alloc() call (tx_context::sender). RESOLVED AT EXECUTION TIME, not at config time. For refunds: the customer (Order owner) must call alloc_by_guard THEMSELVES so that tx_context::sender resolves to THEIR address — if the operator calls alloc_by_guard, the operator becomes the recipient (Signer = operator), NOT the customer. Use when the recipient is whoever submits the allocation transaction (e.g., customer receives refund)."
@@ -1626,9 +1630,18 @@
1626
1630
  ]
1627
1631
  },
1628
1632
  "owner_receive": {
1629
- "description": "Unwrap CoinWrapper objects and other objects received by this Service object and send them to the owner of its Permission object.\n\nACCEPTED FORMATS (F-06 unified receive operation block):\n• 'recently' (string literal) — auto-query and receive ALL recently received objects.\n Use this for the common case: \"withdraw everything the object has received.\"\n Example: receive: 'recently'\n• ReceivedNormal[] (array) — explicit list of received objects to unwrap.\n Use this when you want to receive specific objects only (not all).\n Example: receive: [{id: '0xobj1', type: '0x2::coin::Coin<0x2::wow::WOW>'}]\n• ReceivedBalance ({token_type, balance, received: [{id, balance, payment}]}) —\n receive a balance record from a specific Payment/payer.\n Use this for precise balance targeting (advanced — usually after querying\n the object's received history via query_received).\n Example: receive: {token_type: '0x2::wow::WOW', balance: 1000000, received: [{id: '0xrec1', balance: 1000000, payment: '0xpay1'}]}\nANTI-PATTERN: do NOT wrap in {result: ...} — pass the value directly.",
1633
+ "description": "Unwrap CoinWrapper objects and other objects received by this Service object and send them to the owner of its Permission object.\n\nACCEPTED FORMATS (F-06 unified receive operation block):\n• 'recently' (string literal) — auto-query and receive ALL recently received objects.\n Use this for the common case: \"withdraw everything the object has received\" — for\n order.receive this is the correct default for \"the buyer got their refund\".\n Example: receive: 'recently'\n• bare object id (string, 0x-prefixed) — one-object form, auto-expanded (F-15):\n pass the id of the single received object you want to unwrap (e.g. a CoinWrapper id).\n Example: receive: '0xabc...'\n• ReceivedNormal[] (array) — explicit list of received objects to unwrap.\n Use this when you want to receive specific objects only (not all).\n Example: receive: [{id: '0xobj1', type: '0x2::coin::Coin<0x2::wow::WOW>'}]\n• ReceivedBalance ({token_type, balance, received: [{id, balance, payment}]}) —\n receive a balance record from a specific Payment/payer.\n Use this for precise balance targeting (advanced — usually after querying\n the object's received history via query_received).\n Example: receive: {token_type: '0x2::wow::WOW', balance: 1000000, received: [{id: '0xrec1', balance: 1000000, payment: '0xpay1'}]}\nANTI-PATTERN: do NOT wrap in {result: ...} — pass the value directly.",
1630
1634
  "anyOf": [
1631
1635
  {
1636
+ "type": "string",
1637
+ "const": "recently"
1638
+ },
1639
+ {
1640
+ "type": "string",
1641
+ "pattern": "^0x[0-9a-fA-F]{8,}$"
1642
+ },
1643
+ {
1644
+ "minItems": 1,
1632
1645
  "type": "array",
1633
1646
  "items": {
1634
1647
  "type": "object",
@@ -1736,10 +1749,6 @@
1736
1749
  ],
1737
1750
  "additionalProperties": false,
1738
1751
  "description": "Received record of Coin objects"
1739
- },
1740
- {
1741
- "type": "string",
1742
- "const": "recently"
1743
1752
  }
1744
1753
  ]
1745
1754
  },
@@ -1787,6 +1796,9 @@
1787
1796
  "publish": {
1788
1797
  "description": "Whether to publish the Service. After publishing, customers can place orders. ⚠️ PRE-PUBLISH EVALUATION (mandatory, stop-node fund-exit coverage): service.allocators MUST cover EVERY stop node of the bound Machine — every node where an order can rest (terminal nodes AND waiting states: review windows, handovers, open disputes) needs BOTH a withdrawal (release) AND a refund allocation rule, and each mapping guard must be satisfiable in BOTH directions. An uncovered stop node strands escrowed funds permanently (order_allocators is L1-immutable). Review-gated release is a TIME VARIANT inside ONE exit guard ('reviewed OR unreviewed after T'), never parallel outgoing edges (race deadlock). See pattern.fund_flow_stop_node_coverage + rules R-M5-03 / R-M5-09. VERIFIED against Move source + SDK (4-level immutability matrix):\n L1 — PERMANENTLY LOCKED after publish (assert!(!bPublished), no pause+lock exception):\n • machine (workflow template)\n • order_allocators (fund distribution rules — full replacement locked; APPEND-ONLY additions remain possible via order_allocators_append, prefix/threshold frozen)\n L2 — TIME-LOCKED after publish (unpublished-state check — requires pause + setting_lock_duration elapsed):\n • arbitrations remove/clear (dispute resolution objects)\n • rewards remove/clear (reward objects)\n • compensation_fund_withdraw (withdraw ALL funds)\n RATIONALE (deliberate design, NOT a defect): these three REVOKE buyer-facing guarantees that placed orders already rely on — the lock protects buyer expectations. Daily operations (sales add/remove, price, stock, description) are NEVER gated by this lock.\n L3 — REMAIN MUTABLE after publish (no SDK check, no Move check):\n • arbitrations add, rewards add (no assert — can add after publish)\n • buy_guard, sales, discount, description, location, pause, repositories,\n • compensation_fund_add, setting_lock_duration_add, customer_required, um (Contact)\nThese 2 L1-LOCKED fields (machine/order_allocators) MUST be set BEFORE publish=true.\narbitrations/rewards can be ADDED after publish but remove/clear requires pause+lock.\n\n⚠️ COMPENSATION_FUND + ARBITRATION LINKAGE:\n At publish time, if compensation_fund > 0, Arbitration MUST be bound:\n if (balance::value(&self.compensation_fund) > 0) {\n assert!(arbitration_count > 0, E_ARBITRATION_NOT_SET_WITH_COMPENSATION_FUND);\n }\n The MCP handler enforces this as a HARD PRE-CHECK: if publish=true AND compensation_fund_add is set in the same call AND arbitrations is empty, the call is REJECTED before submission. If compensation_fund was deposited in a prior call, a SOFT WARNING is issued.\n\nSCHEMA-03 / P0-01 fix — DEPLOYMENT WORKFLOW (two-phase, avoids circular dependency):\n Phase 1 — CREATE (no publish): object={name:'my-service', type_parameter, permission} + machine + order_allocators + arbitrations.\n NOTE: buy_guard can use a LocalMark NAME (not address) to break the Guard→Service circular dependency.\n The name is resolved to an address at transaction build time.\n Phase 2 — PUBLISH: object='my-service' (string ref) + publish=true.\n All L1-LOCKED fields must be set in Phase 1; Phase 2 only flips the publish flag.\n Post-publish updates: buy_guard, sales, description, repositories (add), rewards (add), arbitrations (add), etc.",
1789
1798
  "type": "boolean"
1799
+ },
1800
+ "creation_plan": {
1801
+ "description": "WIZARD CONTRACT: the Plan JSON that merchant_guide delivered (its creation_plan / plan field), passed back VERBATIM on the Service publish call (data.publish=true). The publish gate replays the plan's freeze matrix (preflight) right before submission and REJECTS the publish when any gate fails (structural issues, critical audit findings, or a failed rule check) — this closes the preflight bypass where a plan that failed merchant_guide's audit could still be materialized manually. OMIT this field on every NON-publish call and on fully manual (non-wizard) builds — the manual path is unchanged and never gated by this field. Do NOT edit, trim, or 'improve' the plan in transit: a mutated plan is rejected (target cross-check) and the publish must be redone from merchant_guide."
1790
1802
  }
1791
1803
  },
1792
1804
  "required": [
@@ -1940,6 +1952,7 @@
1940
1952
  "description": "Whether this table item's value is submitted dynamically at Guard trigger time (alloc_by_guard call). \n\ntrue = value is submitted by the caller when triggering the Guard. Use for runtime-context-dependent values like order address, user address. The 'value' field is ignored when b_submission=true; the caller must provide it via submissions[]. \n\nfalse = value is static, set at Guard creation time. Use for values known when the Guard is created: expected node names, expected merchant address, expected service address. The 'value' field must be populated and will be stored on-chain permanently. \n\nRule of thumb: if the value is the SAME for all future Guard triggers, use false. If the value DIFFERS per trigger (e.g., which order to release funds for), use true."
1941
1953
  },
1942
1954
  "value_type": {
1955
+ "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details.",
1943
1956
  "anyOf": [
1944
1957
  {
1945
1958
  "type": "number",
@@ -2226,11 +2239,10 @@
2226
2239
  "const": "vecvecu8",
2227
2240
  "description": "vecvecu8"
2228
2241
  }
2229
- ],
2230
- "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details."
2242
+ ]
2231
2243
  },
2232
2244
  "value": {
2233
- "description": "The actual value data. Format depends on `value_type`:\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
2245
+ "description": "The actual value data. Format depends on `value_type`:\nTYPE-CLASS SPLIT (F03): scalar value_types (Bool/Address/String/U8..U256) take ONE scalar value (boolean/address string/name/string/number); Vec* value_types (VecBool/VecAddress/VecString/VecU8..VecU256) take a REAL JSON ARRAY of elements — a string (even a Python-repr-looking \"[a, b]\") fails serialization with 'value_type=10 (array) requires a array value'. The historical 'static values must be strings' rule applied to SCALARS only.\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nPROTOCOL SLOT 254 (once, b_submission Address): the submitted value MUST be the ORDER address bound to the operation (payment_info.for_object) — NEVER the Progress/Machine/Arb object the call is advancing. The chain asserts submission(254) == the order address; a Progress address fails the task binding and the forward aborts.\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
2234
2246
  "anyOf": [
2235
2247
  {
2236
2248
  "type": "boolean"
@@ -2389,7 +2401,7 @@
2389
2401
  "additionalProperties": false,
2390
2402
  "description": "Guard table item (QUERY/OUTPUT form — includes auto-derived object_type field)"
2391
2403
  },
2392
- "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}]"
2404
+ "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}] PROTOCOL SLOT 254: when the Guard table has identifier 254, submit the ORDER address bound to the operation (payment_info.for_object) — never the Progress/Machine object being advanced."
2393
2405
  }
2394
2406
  },
2395
2407
  "required": [
@@ -2399,7 +2411,7 @@
2399
2411
  "additionalProperties": false,
2400
2412
  "description": "One Guard's submission data: the Guard to verify plus the user-provided data that satisfies its requirements."
2401
2413
  },
2402
- "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
2414
+ "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. SLOT COMPLETENESS (T8 az3-mn-261013): the submission array must cover EVERY b_submission slot in the Guard's table, not just one — a Guard whose table has multiple b_submission entries (e.g. slot 0 + slot 254) aborts on-chain with 'Submission ID not found' (abort 11) when any b_submission slot has no matching entry. Check the Guard's table (each entry with b_submission needs its identifier filled) and include ALL of them. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
2403
2415
  }
2404
2416
  },
2405
2417
  "required": [
@@ -2926,6 +2938,10 @@
2926
2938
  "description": "Node pair in Machine object"
2927
2939
  },
2928
2940
  "description": "Node pair list"
2941
+ },
2942
+ "optional": {
2943
+ "description": "OPTIONAL pure-side-action leaf marker (v32): order completion NEVER routes through this node and it must never gate money (e.g. a review node the buyer may skip entirely). SESSION METADATA ONLY — the on-chain node struct carries name+pairs, so this is NOT stored on-chain. Composition audits exempt an optional leaf from the FUND-EXIT-01 terminal fund-reachability search: a review leaf with no allocator is by design, not a stranded-funds bug (upw F-06, 6939_upwork-261016).",
2944
+ "type": "boolean"
2929
2945
  }
2930
2946
  },
2931
2947
  "required": [
@@ -3113,6 +3129,10 @@
3113
3129
  "description": "Node pair in Machine object"
3114
3130
  },
3115
3131
  "description": "Node pair list"
3132
+ },
3133
+ "optional": {
3134
+ "description": "OPTIONAL pure-side-action leaf marker (v32): order completion NEVER routes through this node and it must never gate money (e.g. a review node the buyer may skip entirely). SESSION METADATA ONLY — the on-chain node struct carries name+pairs, so this is NOT stored on-chain. Composition audits exempt an optional leaf from the FUND-EXIT-01 terminal fund-reachability search: a review leaf with no allocator is by design, not a stranded-funds bug (upw F-06, 6939_upwork-261016).",
3135
+ "type": "boolean"
3116
3136
  }
3117
3137
  },
3118
3138
  "required": [
@@ -3480,7 +3500,7 @@
3480
3500
  ]
3481
3501
  },
3482
3502
  "pause": {
3483
- "description": "Whether to pause generating new Progress objects.",
3503
+ "description": "Whether to pause generating new Progress objects. Chain truth (machine.move:657, the progress-generation entry asserts !bPaused): the pause gates NEW order entry only — in-flight Progress keeps advancing and settling (yfd-ln F-13 misread this as a freeze switch; it never was one).",
3484
3504
  "type": "boolean"
3485
3505
  },
3486
3506
  "publish": {
@@ -3488,9 +3508,18 @@
3488
3508
  "type": "boolean"
3489
3509
  },
3490
3510
  "owner_receive": {
3491
- "description": "Unwrap CoinWrapper objects and other objects received by this Machine object and send them to the owner of its Permission object.\n\nACCEPTED FORMATS (F-06 unified receive operation block):\n• 'recently' (string literal) — auto-query and receive ALL recently received objects.\n Use this for the common case: \"withdraw everything the object has received.\"\n Example: receive: 'recently'\n• ReceivedNormal[] (array) — explicit list of received objects to unwrap.\n Use this when you want to receive specific objects only (not all).\n Example: receive: [{id: '0xobj1', type: '0x2::coin::Coin<0x2::wow::WOW>'}]\n• ReceivedBalance ({token_type, balance, received: [{id, balance, payment}]}) —\n receive a balance record from a specific Payment/payer.\n Use this for precise balance targeting (advanced — usually after querying\n the object's received history via query_received).\n Example: receive: {token_type: '0x2::wow::WOW', balance: 1000000, received: [{id: '0xrec1', balance: 1000000, payment: '0xpay1'}]}\nANTI-PATTERN: do NOT wrap in {result: ...} — pass the value directly.",
3511
+ "description": "Unwrap CoinWrapper objects and other objects received by this Machine object and send them to the owner of its Permission object.\n\nACCEPTED FORMATS (F-06 unified receive operation block):\n• 'recently' (string literal) — auto-query and receive ALL recently received objects.\n Use this for the common case: \"withdraw everything the object has received\" — for\n order.receive this is the correct default for \"the buyer got their refund\".\n Example: receive: 'recently'\n• bare object id (string, 0x-prefixed) — one-object form, auto-expanded (F-15):\n pass the id of the single received object you want to unwrap (e.g. a CoinWrapper id).\n Example: receive: '0xabc...'\n• ReceivedNormal[] (array) — explicit list of received objects to unwrap.\n Use this when you want to receive specific objects only (not all).\n Example: receive: [{id: '0xobj1', type: '0x2::coin::Coin<0x2::wow::WOW>'}]\n• ReceivedBalance ({token_type, balance, received: [{id, balance, payment}]}) —\n receive a balance record from a specific Payment/payer.\n Use this for precise balance targeting (advanced — usually after querying\n the object's received history via query_received).\n Example: receive: {token_type: '0x2::wow::WOW', balance: 1000000, received: [{id: '0xrec1', balance: 1000000, payment: '0xpay1'}]}\nANTI-PATTERN: do NOT wrap in {result: ...} — pass the value directly.",
3492
3512
  "anyOf": [
3493
3513
  {
3514
+ "type": "string",
3515
+ "const": "recently"
3516
+ },
3517
+ {
3518
+ "type": "string",
3519
+ "pattern": "^0x[0-9a-fA-F]{8,}$"
3520
+ },
3521
+ {
3522
+ "minItems": 1,
3494
3523
  "type": "array",
3495
3524
  "items": {
3496
3525
  "type": "object",
@@ -3598,10 +3627,6 @@
3598
3627
  ],
3599
3628
  "additionalProperties": false,
3600
3629
  "description": "Received record of Coin objects"
3601
- },
3602
- {
3603
- "type": "string",
3604
- "const": "recently"
3605
3630
  }
3606
3631
  ]
3607
3632
  },
@@ -3769,6 +3794,7 @@
3769
3794
  "description": "Whether this table item's value is submitted dynamically at Guard trigger time (alloc_by_guard call). \n\ntrue = value is submitted by the caller when triggering the Guard. Use for runtime-context-dependent values like order address, user address. The 'value' field is ignored when b_submission=true; the caller must provide it via submissions[]. \n\nfalse = value is static, set at Guard creation time. Use for values known when the Guard is created: expected node names, expected merchant address, expected service address. The 'value' field must be populated and will be stored on-chain permanently. \n\nRule of thumb: if the value is the SAME for all future Guard triggers, use false. If the value DIFFERS per trigger (e.g., which order to release funds for), use true."
3770
3795
  },
3771
3796
  "value_type": {
3797
+ "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details.",
3772
3798
  "anyOf": [
3773
3799
  {
3774
3800
  "type": "number",
@@ -4055,11 +4081,10 @@
4055
4081
  "const": "vecvecu8",
4056
4082
  "description": "vecvecu8"
4057
4083
  }
4058
- ],
4059
- "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details."
4084
+ ]
4060
4085
  },
4061
4086
  "value": {
4062
- "description": "The actual value data. Format depends on `value_type`:\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
4087
+ "description": "The actual value data. Format depends on `value_type`:\nTYPE-CLASS SPLIT (F03): scalar value_types (Bool/Address/String/U8..U256) take ONE scalar value (boolean/address string/name/string/number); Vec* value_types (VecBool/VecAddress/VecString/VecU8..VecU256) take a REAL JSON ARRAY of elements — a string (even a Python-repr-looking \"[a, b]\") fails serialization with 'value_type=10 (array) requires a array value'. The historical 'static values must be strings' rule applied to SCALARS only.\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nPROTOCOL SLOT 254 (once, b_submission Address): the submitted value MUST be the ORDER address bound to the operation (payment_info.for_object) — NEVER the Progress/Machine/Arb object the call is advancing. The chain asserts submission(254) == the order address; a Progress address fails the task binding and the forward aborts.\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
4063
4088
  "anyOf": [
4064
4089
  {
4065
4090
  "type": "boolean"
@@ -4218,7 +4243,7 @@
4218
4243
  "additionalProperties": false,
4219
4244
  "description": "Guard table item (QUERY/OUTPUT form — includes auto-derived object_type field)"
4220
4245
  },
4221
- "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}]"
4246
+ "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}] PROTOCOL SLOT 254: when the Guard table has identifier 254, submit the ORDER address bound to the operation (payment_info.for_object) — never the Progress/Machine object being advanced."
4222
4247
  }
4223
4248
  },
4224
4249
  "required": [
@@ -4228,7 +4253,7 @@
4228
4253
  "additionalProperties": false,
4229
4254
  "description": "One Guard's submission data: the Guard to verify plus the user-provided data that satisfies its requirements."
4230
4255
  },
4231
- "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
4256
+ "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. SLOT COMPLETENESS (T8 az3-mn-261013): the submission array must cover EVERY b_submission slot in the Guard's table, not just one — a Guard whose table has multiple b_submission entries (e.g. slot 0 + slot 254) aborts on-chain with 'Submission ID not found' (abort 11) when any b_submission slot has no matching entry. Check the Guard's table (each entry with b_submission needs its identifier filled) and include ALL of them. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
4232
4257
  }
4233
4258
  },
4234
4259
  "required": [
@@ -4436,7 +4461,7 @@
4436
4461
  ]
4437
4462
  },
4438
4463
  "message": {
4439
- "description": "Operation result message.",
4464
+ "description": "Message attached to the forward advance; recorded permanently in on-chain History. REVIEW-TYPE FORWARDS: de-facto REQUIRED here — the review text is this message (the reward claim guard does not read it, but a no-message Review forward has failed repeatedly on mainnet until the message was added). Always include message: '<review text>' when advancing a Review-named forward.",
4440
4465
  "type": "string"
4441
4466
  }
4442
4467
  },
@@ -4447,9 +4472,18 @@
4447
4472
  "additionalProperties": false
4448
4473
  },
4449
4474
  "owner_receive": {
4450
- "description": "Unwrap CoinWrapper objects and other objects received by this Progress object and send them to the owner of the bound Machine's Permission object.\n\nACCEPTED FORMATS (F-06 unified receive operation block):\n• 'recently' (string literal) — auto-query and receive ALL recently received objects.\n Use this for the common case: \"withdraw everything the object has received.\"\n Example: receive: 'recently'\n• ReceivedNormal[] (array) — explicit list of received objects to unwrap.\n Use this when you want to receive specific objects only (not all).\n Example: receive: [{id: '0xobj1', type: '0x2::coin::Coin<0x2::wow::WOW>'}]\n• ReceivedBalance ({token_type, balance, received: [{id, balance, payment}]}) —\n receive a balance record from a specific Payment/payer.\n Use this for precise balance targeting (advanced — usually after querying\n the object's received history via query_received).\n Example: receive: {token_type: '0x2::wow::WOW', balance: 1000000, received: [{id: '0xrec1', balance: 1000000, payment: '0xpay1'}]}\nANTI-PATTERN: do NOT wrap in {result: ...} — pass the value directly.",
4475
+ "description": "Unwrap CoinWrapper objects and other objects received by this Progress object and send them to the owner of the bound Machine's Permission object.\n\nACCEPTED FORMATS (F-06 unified receive operation block):\n• 'recently' (string literal) — auto-query and receive ALL recently received objects.\n Use this for the common case: \"withdraw everything the object has received\" — for\n order.receive this is the correct default for \"the buyer got their refund\".\n Example: receive: 'recently'\n• bare object id (string, 0x-prefixed) — one-object form, auto-expanded (F-15):\n pass the id of the single received object you want to unwrap (e.g. a CoinWrapper id).\n Example: receive: '0xabc...'\n• ReceivedNormal[] (array) — explicit list of received objects to unwrap.\n Use this when you want to receive specific objects only (not all).\n Example: receive: [{id: '0xobj1', type: '0x2::coin::Coin<0x2::wow::WOW>'}]\n• ReceivedBalance ({token_type, balance, received: [{id, balance, payment}]}) —\n receive a balance record from a specific Payment/payer.\n Use this for precise balance targeting (advanced — usually after querying\n the object's received history via query_received).\n Example: receive: {token_type: '0x2::wow::WOW', balance: 1000000, received: [{id: '0xrec1', balance: 1000000, payment: '0xpay1'}]}\nANTI-PATTERN: do NOT wrap in {result: ...} — pass the value directly.",
4451
4476
  "anyOf": [
4452
4477
  {
4478
+ "type": "string",
4479
+ "const": "recently"
4480
+ },
4481
+ {
4482
+ "type": "string",
4483
+ "pattern": "^0x[0-9a-fA-F]{8,}$"
4484
+ },
4485
+ {
4486
+ "minItems": 1,
4453
4487
  "type": "array",
4454
4488
  "items": {
4455
4489
  "type": "object",
@@ -4557,10 +4591,6 @@
4557
4591
  ],
4558
4592
  "additionalProperties": false,
4559
4593
  "description": "Received record of Coin objects"
4560
- },
4561
- {
4562
- "type": "string",
4563
- "const": "recently"
4564
4594
  }
4565
4595
  ]
4566
4596
  },
@@ -4570,7 +4600,7 @@
4570
4600
  "properties": {
4571
4601
  "repository": {
4572
4602
  "type": "string",
4573
- "description": "Repository object ID or name that stores the structured reputation record. Its matching policy key should use id_from=Signer (one record per buyer, rewrite = own-record overwrite) and accept a JSON payload {rating, tags?, orderRef?}. PREFERRED: the service's review repository EMITTED BY THE BUILD PLAN when review_mode was set (AR-1) — resolve it from the service's repositories list (service_panorama / onchain_objects, name suffix '_review') — never guess an address."
4603
+ "description": "Repository object ID or name that stores the structured reputation record. The matching policy key must accept a JSON payload {rating, tags?, orderRef?}. id_from options (C30): Signer = one record per BUYER (rewrite = own-record overwrite); None + a write_guard with id_from_submission = one record per bound OBJECT/ORDER (the row id is the raw bound Order address — the verified once-per-order review shape); Clock = append-only log. PREFERRED: the service's review repository EMITTED BY THE BUILD PLAN when review_mode was set (AR-1) — resolve it from the service's repositories list (service_panorama / onchain_objects, name suffix '_review') — never guess an address."
4574
4604
  },
4575
4605
  "key": {
4576
4606
  "description": "Data key (policy rule name) to write under. Default 'review'.",
@@ -4773,6 +4803,7 @@
4773
4803
  "description": "Whether this table item's value is submitted dynamically at Guard trigger time (alloc_by_guard call). \n\ntrue = value is submitted by the caller when triggering the Guard. Use for runtime-context-dependent values like order address, user address. The 'value' field is ignored when b_submission=true; the caller must provide it via submissions[]. \n\nfalse = value is static, set at Guard creation time. Use for values known when the Guard is created: expected node names, expected merchant address, expected service address. The 'value' field must be populated and will be stored on-chain permanently. \n\nRule of thumb: if the value is the SAME for all future Guard triggers, use false. If the value DIFFERS per trigger (e.g., which order to release funds for), use true."
4774
4804
  },
4775
4805
  "value_type": {
4806
+ "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details.",
4776
4807
  "anyOf": [
4777
4808
  {
4778
4809
  "type": "number",
@@ -5059,11 +5090,10 @@
5059
5090
  "const": "vecvecu8",
5060
5091
  "description": "vecvecu8"
5061
5092
  }
5062
- ],
5063
- "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details."
5093
+ ]
5064
5094
  },
5065
5095
  "value": {
5066
- "description": "The actual value data. Format depends on `value_type`:\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
5096
+ "description": "The actual value data. Format depends on `value_type`:\nTYPE-CLASS SPLIT (F03): scalar value_types (Bool/Address/String/U8..U256) take ONE scalar value (boolean/address string/name/string/number); Vec* value_types (VecBool/VecAddress/VecString/VecU8..VecU256) take a REAL JSON ARRAY of elements — a string (even a Python-repr-looking \"[a, b]\") fails serialization with 'value_type=10 (array) requires a array value'. The historical 'static values must be strings' rule applied to SCALARS only.\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nPROTOCOL SLOT 254 (once, b_submission Address): the submitted value MUST be the ORDER address bound to the operation (payment_info.for_object) — NEVER the Progress/Machine/Arb object the call is advancing. The chain asserts submission(254) == the order address; a Progress address fails the task binding and the forward aborts.\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
5067
5097
  "anyOf": [
5068
5098
  {
5069
5099
  "type": "boolean"
@@ -5222,7 +5252,7 @@
5222
5252
  "additionalProperties": false,
5223
5253
  "description": "Guard table item (QUERY/OUTPUT form — includes auto-derived object_type field)"
5224
5254
  },
5225
- "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}]"
5255
+ "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}] PROTOCOL SLOT 254: when the Guard table has identifier 254, submit the ORDER address bound to the operation (payment_info.for_object) — never the Progress/Machine object being advanced."
5226
5256
  }
5227
5257
  },
5228
5258
  "required": [
@@ -5232,7 +5262,7 @@
5232
5262
  "additionalProperties": false,
5233
5263
  "description": "One Guard's submission data: the Guard to verify plus the user-provided data that satisfies its requirements."
5234
5264
  },
5235
- "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
5265
+ "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. SLOT COMPLETENESS (T8 az3-mn-261013): the submission array must cover EVERY b_submission slot in the Guard's table, not just one — a Guard whose table has multiple b_submission entries (e.g. slot 0 + slot 254) aborts on-chain with 'Submission ID not found' (abort 11) when any b_submission slot has no matching entry. Check the Guard's table (each entry with b_submission needs its identifier filled) and include ALL of them. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
5236
5266
  }
5237
5267
  },
5238
5268
  "required": [
@@ -5340,7 +5370,7 @@
5340
5370
  "description": "Description string (max 4000 bcs characters)"
5341
5371
  },
5342
5372
  "policies": {
5343
- "description": "Write and read permission rules governing the data records of this Repository.",
5373
+ "description": "Write and read permission rules governing the data records of this Repository. NOTE the PLURAL field name here — the Permission object's equivalent field is singular 'policy' (set/add/remove ops); do not carry one spelling to the other.",
5344
5374
  "oneOf": [
5345
5375
  {
5346
5376
  "type": "object",
@@ -5457,6 +5487,7 @@
5457
5487
  "description": "Source of data ID when writing data. If None, user must specify the ID separately; if Clock, data ID is current timestamp; if Signer, data ID is user ID."
5458
5488
  },
5459
5489
  "value_type": {
5490
+ "description": "Type of data value when writing data. Note: 19 (Value) is an internal dynamic type for guard expressions and is NOT accepted here.",
5460
5491
  "anyOf": [
5461
5492
  {
5462
5493
  "type": "number",
@@ -5743,8 +5774,7 @@
5743
5774
  "const": "vecvecu8",
5744
5775
  "description": "vecvecu8"
5745
5776
  }
5746
- ],
5747
- "description": "Type of data value when writing data. Note: 19 (Value) is an internal dynamic type for guard expressions and is NOT accepted here."
5777
+ ]
5748
5778
  }
5749
5779
  },
5750
5780
  "required": [
@@ -6064,9 +6094,18 @@
6064
6094
  ]
6065
6095
  },
6066
6096
  "owner_receive": {
6067
- "description": "Unwrap CoinWrapper objects and other objects received by this Repository object and send them to the owner of its Permission object.\n\nACCEPTED FORMATS (F-06 unified receive operation block):\n• 'recently' (string literal) — auto-query and receive ALL recently received objects.\n Use this for the common case: \"withdraw everything the object has received.\"\n Example: receive: 'recently'\n• ReceivedNormal[] (array) — explicit list of received objects to unwrap.\n Use this when you want to receive specific objects only (not all).\n Example: receive: [{id: '0xobj1', type: '0x2::coin::Coin<0x2::wow::WOW>'}]\n• ReceivedBalance ({token_type, balance, received: [{id, balance, payment}]}) —\n receive a balance record from a specific Payment/payer.\n Use this for precise balance targeting (advanced — usually after querying\n the object's received history via query_received).\n Example: receive: {token_type: '0x2::wow::WOW', balance: 1000000, received: [{id: '0xrec1', balance: 1000000, payment: '0xpay1'}]}\nANTI-PATTERN: do NOT wrap in {result: ...} — pass the value directly.",
6097
+ "description": "Unwrap CoinWrapper objects and other objects received by this Repository object and send them to the owner of its Permission object.\n\nACCEPTED FORMATS (F-06 unified receive operation block):\n• 'recently' (string literal) — auto-query and receive ALL recently received objects.\n Use this for the common case: \"withdraw everything the object has received\" — for\n order.receive this is the correct default for \"the buyer got their refund\".\n Example: receive: 'recently'\n• bare object id (string, 0x-prefixed) — one-object form, auto-expanded (F-15):\n pass the id of the single received object you want to unwrap (e.g. a CoinWrapper id).\n Example: receive: '0xabc...'\n• ReceivedNormal[] (array) — explicit list of received objects to unwrap.\n Use this when you want to receive specific objects only (not all).\n Example: receive: [{id: '0xobj1', type: '0x2::coin::Coin<0x2::wow::WOW>'}]\n• ReceivedBalance ({token_type, balance, received: [{id, balance, payment}]}) —\n receive a balance record from a specific Payment/payer.\n Use this for precise balance targeting (advanced — usually after querying\n the object's received history via query_received).\n Example: receive: {token_type: '0x2::wow::WOW', balance: 1000000, received: [{id: '0xrec1', balance: 1000000, payment: '0xpay1'}]}\nANTI-PATTERN: do NOT wrap in {result: ...} — pass the value directly.",
6068
6098
  "anyOf": [
6069
6099
  {
6100
+ "type": "string",
6101
+ "const": "recently"
6102
+ },
6103
+ {
6104
+ "type": "string",
6105
+ "pattern": "^0x[0-9a-fA-F]{8,}$"
6106
+ },
6107
+ {
6108
+ "minItems": 1,
6070
6109
  "type": "array",
6071
6110
  "items": {
6072
6111
  "type": "object",
@@ -6174,10 +6213,6 @@
6174
6213
  ],
6175
6214
  "additionalProperties": false,
6176
6215
  "description": "Received record of Coin objects"
6177
- },
6178
- {
6179
- "type": "string",
6180
- "const": "recently"
6181
6216
  }
6182
6217
  ]
6183
6218
  },
@@ -6345,6 +6380,7 @@
6345
6380
  "description": "Whether this table item's value is submitted dynamically at Guard trigger time (alloc_by_guard call). \n\ntrue = value is submitted by the caller when triggering the Guard. Use for runtime-context-dependent values like order address, user address. The 'value' field is ignored when b_submission=true; the caller must provide it via submissions[]. \n\nfalse = value is static, set at Guard creation time. Use for values known when the Guard is created: expected node names, expected merchant address, expected service address. The 'value' field must be populated and will be stored on-chain permanently. \n\nRule of thumb: if the value is the SAME for all future Guard triggers, use false. If the value DIFFERS per trigger (e.g., which order to release funds for), use true."
6346
6381
  },
6347
6382
  "value_type": {
6383
+ "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details.",
6348
6384
  "anyOf": [
6349
6385
  {
6350
6386
  "type": "number",
@@ -6631,11 +6667,10 @@
6631
6667
  "const": "vecvecu8",
6632
6668
  "description": "vecvecu8"
6633
6669
  }
6634
- ],
6635
- "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details."
6670
+ ]
6636
6671
  },
6637
6672
  "value": {
6638
- "description": "The actual value data. Format depends on `value_type`:\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
6673
+ "description": "The actual value data. Format depends on `value_type`:\nTYPE-CLASS SPLIT (F03): scalar value_types (Bool/Address/String/U8..U256) take ONE scalar value (boolean/address string/name/string/number); Vec* value_types (VecBool/VecAddress/VecString/VecU8..VecU256) take a REAL JSON ARRAY of elements — a string (even a Python-repr-looking \"[a, b]\") fails serialization with 'value_type=10 (array) requires a array value'. The historical 'static values must be strings' rule applied to SCALARS only.\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nPROTOCOL SLOT 254 (once, b_submission Address): the submitted value MUST be the ORDER address bound to the operation (payment_info.for_object) — NEVER the Progress/Machine/Arb object the call is advancing. The chain asserts submission(254) == the order address; a Progress address fails the task binding and the forward aborts.\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
6639
6674
  "anyOf": [
6640
6675
  {
6641
6676
  "type": "boolean"
@@ -6794,7 +6829,7 @@
6794
6829
  "additionalProperties": false,
6795
6830
  "description": "Guard table item (QUERY/OUTPUT form — includes auto-derived object_type field)"
6796
6831
  },
6797
- "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}]"
6832
+ "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}] PROTOCOL SLOT 254: when the Guard table has identifier 254, submit the ORDER address bound to the operation (payment_info.for_object) — never the Progress/Machine object being advanced."
6798
6833
  }
6799
6834
  },
6800
6835
  "required": [
@@ -6804,7 +6839,7 @@
6804
6839
  "additionalProperties": false,
6805
6840
  "description": "One Guard's submission data: the Guard to verify plus the user-provided data that satisfies its requirements."
6806
6841
  },
6807
- "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
6842
+ "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. SLOT COMPLETENESS (T8 az3-mn-261013): the submission array must cover EVERY b_submission slot in the Guard's table, not just one — a Guard whose table has multiple b_submission entries (e.g. slot 0 + slot 254) aborts on-chain with 'Submission ID not found' (abort 11) when any b_submission slot has no matching entry. Check the Guard's table (each entry with b_submission needs its identifier filled) and include ALL of them. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
6808
6843
  }
6809
6844
  },
6810
6845
  "required": [
@@ -6924,8 +6959,8 @@
6924
6959
  "description": "Order ID or name."
6925
6960
  },
6926
6961
  "description": {
6927
- "description": "Dispute description.",
6928
- "type": "string"
6962
+ "type": "string",
6963
+ "description": "Dispute description. REQUIRED and NON-EMPTY on-chain (the dispute call aborts when it is empty; max 4000 bytes). State what the dispute is about — it is permanent on-chain case context."
6929
6964
  },
6930
6965
  "proposition": {
6931
6966
  "type": "array",
@@ -7002,6 +7037,7 @@
7002
7037
  },
7003
7038
  "required": [
7004
7039
  "order",
7040
+ "description",
7005
7041
  "proposition",
7006
7042
  "fee"
7007
7043
  ],
@@ -7040,7 +7076,7 @@
7040
7076
  },
7041
7077
  "voting_deadline": {
7042
7078
  "default": null,
7043
- "description": "Voting deadline as Unix timestamp in MILLISECONDS (ms). SEMANTICS OF SPECIAL VALUES: null (DEFAULT when omitted) = open-ended voting, no deadline; parties may vote at any time and the arbitrator may deliver the verdict immediately (arb.move skips the deadline assert when the Option is none) — this is the SAFE default; a future timestamp = normal bounded voting window (recommended: now + at least 86400000 ms = 24 hours); 0 = deadline already passed → voting is IMPOSSIBLE (every vote aborts E_VOTING_DEADLINE_PASSED) and only a direct verdict is possible. Only pass 0 deliberately when you truly want a no-vote verdict. COMMON MISTAKE: using seconds instead of milliseconds (multiply by 1000). Example: Date.now() + 259200000 for 3 days from now.",
7079
+ "description": "Voting deadline as Unix timestamp in MILLISECONDS (ms). SEMANTICS OF SPECIAL VALUES: null (DEFAULT when omitted) = open-ended voting, no deadline; parties may vote at any time and the arbitrator may deliver the verdict after casting at least one ballot (arb.move skips the deadline assert when the Option is none) — this is the SAFE default; a future timestamp = normal bounded voting window (recommended: now + at least 86400000 ms = 24 hours); 0 = deadline already passed → the case PERMANENTLY DEADLOCKS (kl-real-261016 F-01, chain-verified): every vote aborts E_VOTING_DEADLINE_PASSED, so no ballot can ever exist, the verdict then aborts E_NO_VOTE_CAST (a verdict requires >= 1 cast ballot), and reset aborts as well. NEVER pass 0. Direct verdict = null + cast one ballot first, then deliver the verdict. COMMON MISTAKE: using seconds instead of milliseconds (multiply by 1000). Example: Date.now() + 259200000 for 3 days from now.",
7044
7080
  "anyOf": [
7045
7081
  {
7046
7082
  "type": "integer",
@@ -7076,7 +7112,7 @@
7076
7112
  "type": "null"
7077
7113
  }
7078
7114
  ],
7079
- "description": "New voting deadline as Unix timestamp in MILLISECONDS (ms). SEMANTICS OF SPECIAL VALUES: 0 = deadline already passed → voting is IMPOSSIBLE and the arbitrator may deliver the verdict immediately; null = open-ended voting with no deadline (verdict allowed anytime); a future timestamp = normal voting window (recommended: now + at least 86400000 ms = 24 hours). COMMON MISTAKE: using seconds instead of milliseconds (multiply by 1000). Example: Date.now() + 259200000 for 3 days from now."
7115
+ "description": "New voting deadline as Unix timestamp in MILLISECONDS (ms). SEMANTICS OF SPECIAL VALUES: 0 = deadline already passed → the case PERMANENTLY DEADLOCKS (votes abort E_VOTING_DEADLINE_PASSED, no ballot can ever exist, verdict aborts E_NO_VOTE_CAST, reset aborts). NEVER pass 0; null = open-ended voting with no deadline (verdict allowed after casting at least one ballot — use this for the immediate-verdict flow: cast one ballot, then deliver); a future timestamp = normal voting window (recommended: now + at least 86400000 ms = 24 hours). COMMON MISTAKE: using seconds instead of milliseconds (multiply by 1000). Example: Date.now() + 259200000 for 3 days from now."
7080
7116
  }
7081
7117
  },
7082
7118
  "required": [
@@ -7103,7 +7139,7 @@
7103
7139
  "description": "Proposition INDICES (0-based, u8) the voter agrees with — e.g. [0] votes for the first proposition. Re-voting REPLACES the voter's previous vote (old weight removed, new applied). Out-of-range index aborts with E_PROPOSITION_NOT_FOUND."
7104
7140
  },
7105
7141
  "voting_guard": {
7106
- "description": "Voting Guard for WEIGHTED voting. DECISION RULE (contract-enforced):\n(A) Arbitration HAS a non-empty voting_guard list → plain vote is REJECTED on-chain with E_VOTING_GUARD_USED (abort 2). You MUST provide this field set to ONE guard from the Arbitration's voting_guard list, and fill its submission: when the guard's vote_weight is {GuardIdentifier: pos}, the number you submit at that table position IS the vote weight; when it is {FixedValue: v}, no submission is needed (weight is fixed). The SDK then routes the call through the Guard-weighted vote path via a Passport. Omitting this field on such an Arbitration now fails fast pre-call with the list of valid guards.\n(B) Arbitration has NO voting_guard → omit this field; the SDK uses plain vote (weight 1, permission-gated), or the passport-gated vote path when other guards require it.\nBOTH (B) paths still assert ARBITRATION_VOTE=358 on-chain (the SDK now pre-checks 358 and fails fast with 'Missing permissions 358'). An empty voting_guard means EQUAL WEIGHT (1 person 1 vote), NOT permissionless — there is no permission-free vote entry. For genuinely open voting, configure a public voting_guard (op=\"set\") and vote via path (A): the weighted passport path authorizes by the guard and does NOT require 358.\nThe Guard (when provided) MUST be in the Arbitration's voting_guard list — an unlisted guard aborts with E_VOTING_GUARD_NOT_FOUND.",
7142
+ "description": "Voting Guard for WEIGHTED voting. DECISION RULE (contract-enforced):\n(A) Arbitration HAS a non-empty voting_guard list → plain vote is REJECTED on-chain with E_VOTING_GUARD_USED (abort 2). You MUST provide this field set to ONE guard from the Arbitration's voting_guard list, and fill its submission: when the guard's vote_weight is {GuardIdentifier: pos}, the number you submit at that table position IS the vote weight; when it is {FixedValue: v}, no submission is needed (weight is fixed). The SDK then routes the call through the Guard-weighted vote path via a Passport. Omitting this field on such an Arbitration now fails fast pre-call with the list of valid guards.\n(B) Arbitration has NO voting_guard → omit this field; the SDK uses plain vote (weight 1, permission-gated), or the passport-gated vote path when other guards require it.\nBOTH (B) paths still assert ARBITRATION_VOTE=358 on-chain (the SDK now pre-checks 358 and fails fast with 'Missing permissions 358'). An empty voting_guard means EQUAL WEIGHT (1 person 1 vote), NOT permissionless — there is no permission-free vote entry. For genuinely open voting, configure a public voting_guard (op=\"set\") and vote via path (A): the weighted passport path authorizes by the guard and does NOT require 358.\nThe Guard (when provided) MUST be in the Arbitration's voting_guard list — an unlisted guard aborts with E_VOTING_GUARD_NOT_FOUND. WEIGHTED REVOTE RESIDUE (az3-mn-261013, arb.move:315-320 source comment): under weighted voting a re-vote is NOT clean — re-voting with a LARGER weight than the previous one aborts on underflow (re-vote DoS surface); re-voting with a SMALLER weight succeeds but leaves phantom votes behind. Treat the first weighted vote as final when possible.",
7107
7143
  "type": "string"
7108
7144
  }
7109
7145
  },
@@ -7394,9 +7430,18 @@
7394
7430
  ]
7395
7431
  },
7396
7432
  "owner_receive": {
7397
- "description": "Unwrap CoinWrapper objects and other objects received by this Arbitration object and send them to the owner of its Permission object.\n\nACCEPTED FORMATS (F-06 unified receive operation block):\n• 'recently' (string literal) — auto-query and receive ALL recently received objects.\n Use this for the common case: \"withdraw everything the object has received.\"\n Example: receive: 'recently'\n• ReceivedNormal[] (array) — explicit list of received objects to unwrap.\n Use this when you want to receive specific objects only (not all).\n Example: receive: [{id: '0xobj1', type: '0x2::coin::Coin<0x2::wow::WOW>'}]\n• ReceivedBalance ({token_type, balance, received: [{id, balance, payment}]}) —\n receive a balance record from a specific Payment/payer.\n Use this for precise balance targeting (advanced — usually after querying\n the object's received history via query_received).\n Example: receive: {token_type: '0x2::wow::WOW', balance: 1000000, received: [{id: '0xrec1', balance: 1000000, payment: '0xpay1'}]}\nANTI-PATTERN: do NOT wrap in {result: ...} — pass the value directly.",
7433
+ "description": "Unwrap CoinWrapper objects and other objects received by this Arbitration object and send them to the owner of its Permission object.\n\nACCEPTED FORMATS (F-06 unified receive operation block):\n• 'recently' (string literal) — auto-query and receive ALL recently received objects.\n Use this for the common case: \"withdraw everything the object has received\" — for\n order.receive this is the correct default for \"the buyer got their refund\".\n Example: receive: 'recently'\n• bare object id (string, 0x-prefixed) — one-object form, auto-expanded (F-15):\n pass the id of the single received object you want to unwrap (e.g. a CoinWrapper id).\n Example: receive: '0xabc...'\n• ReceivedNormal[] (array) — explicit list of received objects to unwrap.\n Use this when you want to receive specific objects only (not all).\n Example: receive: [{id: '0xobj1', type: '0x2::coin::Coin<0x2::wow::WOW>'}]\n• ReceivedBalance ({token_type, balance, received: [{id, balance, payment}]}) —\n receive a balance record from a specific Payment/payer.\n Use this for precise balance targeting (advanced — usually after querying\n the object's received history via query_received).\n Example: receive: {token_type: '0x2::wow::WOW', balance: 1000000, received: [{id: '0xrec1', balance: 1000000, payment: '0xpay1'}]}\nANTI-PATTERN: do NOT wrap in {result: ...} — pass the value directly.",
7398
7434
  "anyOf": [
7399
7435
  {
7436
+ "type": "string",
7437
+ "const": "recently"
7438
+ },
7439
+ {
7440
+ "type": "string",
7441
+ "pattern": "^0x[0-9a-fA-F]{8,}$"
7442
+ },
7443
+ {
7444
+ "minItems": 1,
7400
7445
  "type": "array",
7401
7446
  "items": {
7402
7447
  "type": "object",
@@ -7504,10 +7549,6 @@
7504
7549
  ],
7505
7550
  "additionalProperties": false,
7506
7551
  "description": "Received record of Coin objects"
7507
- },
7508
- {
7509
- "type": "string",
7510
- "const": "recently"
7511
7552
  }
7512
7553
  ]
7513
7554
  },
@@ -7675,6 +7716,7 @@
7675
7716
  "description": "Whether this table item's value is submitted dynamically at Guard trigger time (alloc_by_guard call). \n\ntrue = value is submitted by the caller when triggering the Guard. Use for runtime-context-dependent values like order address, user address. The 'value' field is ignored when b_submission=true; the caller must provide it via submissions[]. \n\nfalse = value is static, set at Guard creation time. Use for values known when the Guard is created: expected node names, expected merchant address, expected service address. The 'value' field must be populated and will be stored on-chain permanently. \n\nRule of thumb: if the value is the SAME for all future Guard triggers, use false. If the value DIFFERS per trigger (e.g., which order to release funds for), use true."
7676
7717
  },
7677
7718
  "value_type": {
7719
+ "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details.",
7678
7720
  "anyOf": [
7679
7721
  {
7680
7722
  "type": "number",
@@ -7961,11 +8003,10 @@
7961
8003
  "const": "vecvecu8",
7962
8004
  "description": "vecvecu8"
7963
8005
  }
7964
- ],
7965
- "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details."
8006
+ ]
7966
8007
  },
7967
8008
  "value": {
7968
- "description": "The actual value data. Format depends on `value_type`:\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
8009
+ "description": "The actual value data. Format depends on `value_type`:\nTYPE-CLASS SPLIT (F03): scalar value_types (Bool/Address/String/U8..U256) take ONE scalar value (boolean/address string/name/string/number); Vec* value_types (VecBool/VecAddress/VecString/VecU8..VecU256) take a REAL JSON ARRAY of elements — a string (even a Python-repr-looking \"[a, b]\") fails serialization with 'value_type=10 (array) requires a array value'. The historical 'static values must be strings' rule applied to SCALARS only.\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nPROTOCOL SLOT 254 (once, b_submission Address): the submitted value MUST be the ORDER address bound to the operation (payment_info.for_object) — NEVER the Progress/Machine/Arb object the call is advancing. The chain asserts submission(254) == the order address; a Progress address fails the task binding and the forward aborts.\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
7969
8010
  "anyOf": [
7970
8011
  {
7971
8012
  "type": "boolean"
@@ -8124,7 +8165,7 @@
8124
8165
  "additionalProperties": false,
8125
8166
  "description": "Guard table item (QUERY/OUTPUT form — includes auto-derived object_type field)"
8126
8167
  },
8127
- "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}]"
8168
+ "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}] PROTOCOL SLOT 254: when the Guard table has identifier 254, submit the ORDER address bound to the operation (payment_info.for_object) — never the Progress/Machine object being advanced."
8128
8169
  }
8129
8170
  },
8130
8171
  "required": [
@@ -8134,7 +8175,7 @@
8134
8175
  "additionalProperties": false,
8135
8176
  "description": "One Guard's submission data: the Guard to verify plus the user-provided data that satisfies its requirements."
8136
8177
  },
8137
- "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
8178
+ "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. SLOT COMPLETENESS (T8 az3-mn-261013): the submission array must cover EVERY b_submission slot in the Guard's table, not just one — a Guard whose table has multiple b_submission entries (e.g. slot 0 + slot 254) aborts on-chain with 'Submission ID not found' (abort 11) when any b_submission slot has no matching entry. Check the Guard's table (each entry with b_submission needs its identifier filled) and include ALL of them. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
8138
8179
  }
8139
8180
  },
8140
8181
  "required": [
@@ -8370,9 +8411,18 @@
8370
8411
  ]
8371
8412
  },
8372
8413
  "owner_receive": {
8373
- "description": "Receive objects sent to this Contact object and unwrap them to the permission owner.\n\nACCEPTED FORMATS (F-06 unified receive operation block):\n• 'recently' (string literal) — auto-query and receive ALL recently received objects.\n Use this for the common case: \"withdraw everything the object has received.\"\n Example: receive: 'recently'\n• ReceivedNormal[] (array) — explicit list of received objects to unwrap.\n Use this when you want to receive specific objects only (not all).\n Example: receive: [{id: '0xobj1', type: '0x2::coin::Coin<0x2::wow::WOW>'}]\n• ReceivedBalance ({token_type, balance, received: [{id, balance, payment}]}) —\n receive a balance record from a specific Payment/payer.\n Use this for precise balance targeting (advanced — usually after querying\n the object's received history via query_received).\n Example: receive: {token_type: '0x2::wow::WOW', balance: 1000000, received: [{id: '0xrec1', balance: 1000000, payment: '0xpay1'}]}\nANTI-PATTERN: do NOT wrap in {result: ...} — pass the value directly.",
8414
+ "description": "Receive objects sent to this Contact object and unwrap them to the permission owner.\n\nACCEPTED FORMATS (F-06 unified receive operation block):\n• 'recently' (string literal) — auto-query and receive ALL recently received objects.\n Use this for the common case: \"withdraw everything the object has received\" — for\n order.receive this is the correct default for \"the buyer got their refund\".\n Example: receive: 'recently'\n• bare object id (string, 0x-prefixed) — one-object form, auto-expanded (F-15):\n pass the id of the single received object you want to unwrap (e.g. a CoinWrapper id).\n Example: receive: '0xabc...'\n• ReceivedNormal[] (array) — explicit list of received objects to unwrap.\n Use this when you want to receive specific objects only (not all).\n Example: receive: [{id: '0xobj1', type: '0x2::coin::Coin<0x2::wow::WOW>'}]\n• ReceivedBalance ({token_type, balance, received: [{id, balance, payment}]}) —\n receive a balance record from a specific Payment/payer.\n Use this for precise balance targeting (advanced — usually after querying\n the object's received history via query_received).\n Example: receive: {token_type: '0x2::wow::WOW', balance: 1000000, received: [{id: '0xrec1', balance: 1000000, payment: '0xpay1'}]}\nANTI-PATTERN: do NOT wrap in {result: ...} — pass the value directly.",
8374
8415
  "anyOf": [
8375
8416
  {
8417
+ "type": "string",
8418
+ "const": "recently"
8419
+ },
8420
+ {
8421
+ "type": "string",
8422
+ "pattern": "^0x[0-9a-fA-F]{8,}$"
8423
+ },
8424
+ {
8425
+ "minItems": 1,
8376
8426
  "type": "array",
8377
8427
  "items": {
8378
8428
  "type": "object",
@@ -8480,10 +8530,6 @@
8480
8530
  ],
8481
8531
  "additionalProperties": false,
8482
8532
  "description": "Received record of Coin objects"
8483
- },
8484
- {
8485
- "type": "string",
8486
- "const": "recently"
8487
8533
  }
8488
8534
  ]
8489
8535
  }
@@ -8639,6 +8685,7 @@
8639
8685
  "description": "Whether this table item's value is submitted dynamically at Guard trigger time (alloc_by_guard call). \n\ntrue = value is submitted by the caller when triggering the Guard. Use for runtime-context-dependent values like order address, user address. The 'value' field is ignored when b_submission=true; the caller must provide it via submissions[]. \n\nfalse = value is static, set at Guard creation time. Use for values known when the Guard is created: expected node names, expected merchant address, expected service address. The 'value' field must be populated and will be stored on-chain permanently. \n\nRule of thumb: if the value is the SAME for all future Guard triggers, use false. If the value DIFFERS per trigger (e.g., which order to release funds for), use true."
8640
8686
  },
8641
8687
  "value_type": {
8688
+ "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details.",
8642
8689
  "anyOf": [
8643
8690
  {
8644
8691
  "type": "number",
@@ -8925,11 +8972,10 @@
8925
8972
  "const": "vecvecu8",
8926
8973
  "description": "vecvecu8"
8927
8974
  }
8928
- ],
8929
- "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details."
8975
+ ]
8930
8976
  },
8931
8977
  "value": {
8932
- "description": "The actual value data. Format depends on `value_type`:\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
8978
+ "description": "The actual value data. Format depends on `value_type`:\nTYPE-CLASS SPLIT (F03): scalar value_types (Bool/Address/String/U8..U256) take ONE scalar value (boolean/address string/name/string/number); Vec* value_types (VecBool/VecAddress/VecString/VecU8..VecU256) take a REAL JSON ARRAY of elements — a string (even a Python-repr-looking \"[a, b]\") fails serialization with 'value_type=10 (array) requires a array value'. The historical 'static values must be strings' rule applied to SCALARS only.\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nPROTOCOL SLOT 254 (once, b_submission Address): the submitted value MUST be the ORDER address bound to the operation (payment_info.for_object) — NEVER the Progress/Machine/Arb object the call is advancing. The chain asserts submission(254) == the order address; a Progress address fails the task binding and the forward aborts.\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
8933
8979
  "anyOf": [
8934
8980
  {
8935
8981
  "type": "boolean"
@@ -9088,7 +9134,7 @@
9088
9134
  "additionalProperties": false,
9089
9135
  "description": "Guard table item (QUERY/OUTPUT form — includes auto-derived object_type field)"
9090
9136
  },
9091
- "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}]"
9137
+ "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}] PROTOCOL SLOT 254: when the Guard table has identifier 254, submit the ORDER address bound to the operation (payment_info.for_object) — never the Progress/Machine object being advanced."
9092
9138
  }
9093
9139
  },
9094
9140
  "required": [
@@ -9098,7 +9144,7 @@
9098
9144
  "additionalProperties": false,
9099
9145
  "description": "One Guard's submission data: the Guard to verify plus the user-provided data that satisfies its requirements."
9100
9146
  },
9101
- "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
9147
+ "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. SLOT COMPLETENESS (T8 az3-mn-261013): the submission array must cover EVERY b_submission slot in the Guard's table, not just one — a Guard whose table has multiple b_submission entries (e.g. slot 0 + slot 254) aborts on-chain with 'Submission ID not found' (abort 11) when any b_submission slot has no matching entry. Check the Guard's table (each entry with b_submission needs its identifier filled) and include ALL of them. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
9102
9148
  }
9103
9149
  },
9104
9150
  "required": [
@@ -9863,9 +9909,18 @@
9863
9909
  ]
9864
9910
  },
9865
9911
  "owner_receive": {
9866
- "description": "Unwrap CoinWrapper objects and other objects received by this Treasury object and send them to the owner of its Permission object.\n\nACCEPTED FORMATS (F-06 unified receive operation block):\n• 'recently' (string literal) — auto-query and receive ALL recently received objects.\n Use this for the common case: \"withdraw everything the object has received.\"\n Example: receive: 'recently'\n• ReceivedNormal[] (array) — explicit list of received objects to unwrap.\n Use this when you want to receive specific objects only (not all).\n Example: receive: [{id: '0xobj1', type: '0x2::coin::Coin<0x2::wow::WOW>'}]\n• ReceivedBalance ({token_type, balance, received: [{id, balance, payment}]}) —\n receive a balance record from a specific Payment/payer.\n Use this for precise balance targeting (advanced — usually after querying\n the object's received history via query_received).\n Example: receive: {token_type: '0x2::wow::WOW', balance: 1000000, received: [{id: '0xrec1', balance: 1000000, payment: '0xpay1'}]}\nANTI-PATTERN: do NOT wrap in {result: ...} — pass the value directly.",
9912
+ "description": "Unwrap CoinWrapper objects and other objects received by this Treasury object and send them to the owner of its Permission object.\n\nACCEPTED FORMATS (F-06 unified receive operation block):\n• 'recently' (string literal) — auto-query and receive ALL recently received objects.\n Use this for the common case: \"withdraw everything the object has received\" — for\n order.receive this is the correct default for \"the buyer got their refund\".\n Example: receive: 'recently'\n• bare object id (string, 0x-prefixed) — one-object form, auto-expanded (F-15):\n pass the id of the single received object you want to unwrap (e.g. a CoinWrapper id).\n Example: receive: '0xabc...'\n• ReceivedNormal[] (array) — explicit list of received objects to unwrap.\n Use this when you want to receive specific objects only (not all).\n Example: receive: [{id: '0xobj1', type: '0x2::coin::Coin<0x2::wow::WOW>'}]\n• ReceivedBalance ({token_type, balance, received: [{id, balance, payment}]}) —\n receive a balance record from a specific Payment/payer.\n Use this for precise balance targeting (advanced — usually after querying\n the object's received history via query_received).\n Example: receive: {token_type: '0x2::wow::WOW', balance: 1000000, received: [{id: '0xrec1', balance: 1000000, payment: '0xpay1'}]}\nANTI-PATTERN: do NOT wrap in {result: ...} — pass the value directly.",
9867
9913
  "anyOf": [
9868
9914
  {
9915
+ "type": "string",
9916
+ "const": "recently"
9917
+ },
9918
+ {
9919
+ "type": "string",
9920
+ "pattern": "^0x[0-9a-fA-F]{8,}$"
9921
+ },
9922
+ {
9923
+ "minItems": 1,
9869
9924
  "type": "array",
9870
9925
  "items": {
9871
9926
  "type": "object",
@@ -9973,10 +10028,6 @@
9973
10028
  ],
9974
10029
  "additionalProperties": false,
9975
10030
  "description": "Received record of Coin objects"
9976
- },
9977
- {
9978
- "type": "string",
9979
- "const": "recently"
9980
10031
  }
9981
10032
  ]
9982
10033
  },
@@ -10144,6 +10195,7 @@
10144
10195
  "description": "Whether this table item's value is submitted dynamically at Guard trigger time (alloc_by_guard call). \n\ntrue = value is submitted by the caller when triggering the Guard. Use for runtime-context-dependent values like order address, user address. The 'value' field is ignored when b_submission=true; the caller must provide it via submissions[]. \n\nfalse = value is static, set at Guard creation time. Use for values known when the Guard is created: expected node names, expected merchant address, expected service address. The 'value' field must be populated and will be stored on-chain permanently. \n\nRule of thumb: if the value is the SAME for all future Guard triggers, use false. If the value DIFFERS per trigger (e.g., which order to release funds for), use true."
10145
10196
  },
10146
10197
  "value_type": {
10198
+ "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details.",
10147
10199
  "anyOf": [
10148
10200
  {
10149
10201
  "type": "number",
@@ -10430,11 +10482,10 @@
10430
10482
  "const": "vecvecu8",
10431
10483
  "description": "vecvecu8"
10432
10484
  }
10433
- ],
10434
- "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details."
10485
+ ]
10435
10486
  },
10436
10487
  "value": {
10437
- "description": "The actual value data. Format depends on `value_type`:\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
10488
+ "description": "The actual value data. Format depends on `value_type`:\nTYPE-CLASS SPLIT (F03): scalar value_types (Bool/Address/String/U8..U256) take ONE scalar value (boolean/address string/name/string/number); Vec* value_types (VecBool/VecAddress/VecString/VecU8..VecU256) take a REAL JSON ARRAY of elements — a string (even a Python-repr-looking \"[a, b]\") fails serialization with 'value_type=10 (array) requires a array value'. The historical 'static values must be strings' rule applied to SCALARS only.\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nPROTOCOL SLOT 254 (once, b_submission Address): the submitted value MUST be the ORDER address bound to the operation (payment_info.for_object) — NEVER the Progress/Machine/Arb object the call is advancing. The chain asserts submission(254) == the order address; a Progress address fails the task binding and the forward aborts.\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
10438
10489
  "anyOf": [
10439
10490
  {
10440
10491
  "type": "boolean"
@@ -10593,7 +10644,7 @@
10593
10644
  "additionalProperties": false,
10594
10645
  "description": "Guard table item (QUERY/OUTPUT form — includes auto-derived object_type field)"
10595
10646
  },
10596
- "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}]"
10647
+ "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}] PROTOCOL SLOT 254: when the Guard table has identifier 254, submit the ORDER address bound to the operation (payment_info.for_object) — never the Progress/Machine object being advanced."
10597
10648
  }
10598
10649
  },
10599
10650
  "required": [
@@ -10603,7 +10654,7 @@
10603
10654
  "additionalProperties": false,
10604
10655
  "description": "One Guard's submission data: the Guard to verify plus the user-provided data that satisfies its requirements."
10605
10656
  },
10606
- "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
10657
+ "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. SLOT COMPLETENESS (T8 az3-mn-261013): the submission array must cover EVERY b_submission slot in the Guard's table, not just one — a Guard whose table has multiple b_submission entries (e.g. slot 0 + slot 254) aborts on-chain with 'Submission ID not found' (abort 11) when any b_submission slot has no matching entry. Check the Guard's table (each entry with b_submission needs its identifier filled) and include ALL of them. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
10607
10658
  }
10608
10659
  },
10609
10660
  "required": [
@@ -10845,7 +10896,7 @@
10845
10896
  ]
10846
10897
  },
10847
10898
  "guard_add": {
10848
- "description": "Add Guard to Reward object.",
10899
+ "description": "Add Guard to Reward object. IDIOMS (F08 — these differ from Service allocation, follow THIS shape here): recipient is ONE OF {GuardIdentifier: <u8>} | {Entity: {name_or_address: 'mark'}} | {Signer: 'signer'} (string const INSIDE the key, NOT a bare string) — BUT on the REWARD claim rail the recipient MUST equal the transaction sender (chain assert, abort 14), so {Signer: 'signer'} is the canonical form and {Entity} also passes (SDK replaces it with the claimant's account at claim time); a {GuardIdentifier} recipient resolves to the submitted Order and is STRUCTURALLY UNPAYABLE (every claim aborts 14) — the tool gate rejects it (crs-mn-261015 F-12). amount is {type: 'Fixed', value: '0.1WOW'} — value accepts a display string with token symbol ('0.1WOW') or a smallest-unit integer ('100000000'), NOT the plain balance string used by allocation `sharing`. FULL EXAMPLE: [{guard: '0xabc...', recipient: {Signer: 'signer'}, amount: {type: 'Fixed', value: '0.1WOW'}}].",
10849
10900
  "type": "array",
10850
10901
  "items": {
10851
10902
  "type": "object",
@@ -10870,7 +10921,7 @@
10870
10921
  "GuardIdentifier"
10871
10922
  ],
10872
10923
  "additionalProperties": false,
10873
- "description": "Guard verified recipient ID. Get recipient ID from specified data index in Guard table. The ID must be of address type."
10924
+ "description": "Guard verified recipient ID. Get recipient ID from specified data index in Guard table. The ID must be of address type. ALLOCATION rails only — the REWARD claim rail requires recipient == the transaction sender (abort 14), so a GuardIdentifier recipient on reward.guard_add resolves to the submitted Order and is structurally unpayable; the tool gate rejects it (crs-mn-261015 F-12)."
10874
10925
  },
10875
10926
  {
10876
10927
  "type": "object",
@@ -10909,10 +10960,10 @@
10909
10960
  "Signer"
10910
10961
  ],
10911
10962
  "additionalProperties": false,
10912
- "description": "Current transaction signer (tx_context::sender) at the time of the alloc() call. For refunds, the Order owner must call alloc_by_guard themselves to receive the funds."
10963
+ "description": "Current transaction signer (tx_context::sender) at the time of the alloc() call. For refunds, the Order owner must call alloc_by_guard themselves to receive the funds. On the REWARD claim rail this is the CANONICAL recipient (the claim entry requires recipient == the tx sender)."
10913
10964
  }
10914
10965
  ],
10915
- "description": "Recipient ID. Three forms:\n - {GuardIdentifier: u8} — DYNAMIC address resolved from Passport at alloc() time\n - {Entity: {name_or_address: 'mark_name'}} — FIXED static address via LocalMark (recommended)\n - {Signer: 'signer'} — transaction sender at alloc() time (e.g. self-refund; customer must call alloc_by_guard themselves)"
10966
+ "description": "Recipient ID. Three forms:\n - {GuardIdentifier: u8} — DYNAMIC address resolved from Passport at alloc() time (Allocation rails only; structurally unpayable on reward.guard_add — abort 14)\n - {Entity: {name_or_address: 'mark_name'}} — FIXED static address via LocalMark (recommended)\n - {Signer: 'signer'} — transaction sender at alloc() time (e.g. self-refund; customer must call alloc_by_guard themselves; canonical on reward claim rails)"
10916
10967
  },
10917
10968
  "amount": {
10918
10969
  "oneOf": [
@@ -11012,9 +11063,18 @@
11012
11063
  ]
11013
11064
  },
11014
11065
  "owner_receive": {
11015
- "description": "Unwrap CoinWrapper objects and other objects received by this Reward object and send them to the owner of its Permission object.\n\nACCEPTED FORMATS (F-06 unified receive operation block):\n• 'recently' (string literal) — auto-query and receive ALL recently received objects.\n Use this for the common case: \"withdraw everything the object has received.\"\n Example: receive: 'recently'\n• ReceivedNormal[] (array) — explicit list of received objects to unwrap.\n Use this when you want to receive specific objects only (not all).\n Example: receive: [{id: '0xobj1', type: '0x2::coin::Coin<0x2::wow::WOW>'}]\n• ReceivedBalance ({token_type, balance, received: [{id, balance, payment}]}) —\n receive a balance record from a specific Payment/payer.\n Use this for precise balance targeting (advanced — usually after querying\n the object's received history via query_received).\n Example: receive: {token_type: '0x2::wow::WOW', balance: 1000000, received: [{id: '0xrec1', balance: 1000000, payment: '0xpay1'}]}\nANTI-PATTERN: do NOT wrap in {result: ...} — pass the value directly.",
11066
+ "description": "Unwrap CoinWrapper objects and other objects received by this Reward object and send them to the owner of its Permission object.\n\nACCEPTED FORMATS (F-06 unified receive operation block):\n• 'recently' (string literal) — auto-query and receive ALL recently received objects.\n Use this for the common case: \"withdraw everything the object has received\" — for\n order.receive this is the correct default for \"the buyer got their refund\".\n Example: receive: 'recently'\n• bare object id (string, 0x-prefixed) — one-object form, auto-expanded (F-15):\n pass the id of the single received object you want to unwrap (e.g. a CoinWrapper id).\n Example: receive: '0xabc...'\n• ReceivedNormal[] (array) — explicit list of received objects to unwrap.\n Use this when you want to receive specific objects only (not all).\n Example: receive: [{id: '0xobj1', type: '0x2::coin::Coin<0x2::wow::WOW>'}]\n• ReceivedBalance ({token_type, balance, received: [{id, balance, payment}]}) —\n receive a balance record from a specific Payment/payer.\n Use this for precise balance targeting (advanced — usually after querying\n the object's received history via query_received).\n Example: receive: {token_type: '0x2::wow::WOW', balance: 1000000, received: [{id: '0xrec1', balance: 1000000, payment: '0xpay1'}]}\nANTI-PATTERN: do NOT wrap in {result: ...} — pass the value directly.",
11016
11067
  "anyOf": [
11017
11068
  {
11069
+ "type": "string",
11070
+ "const": "recently"
11071
+ },
11072
+ {
11073
+ "type": "string",
11074
+ "pattern": "^0x[0-9a-fA-F]{8,}$"
11075
+ },
11076
+ {
11077
+ "minItems": 1,
11018
11078
  "type": "array",
11019
11079
  "items": {
11020
11080
  "type": "object",
@@ -11122,10 +11182,6 @@
11122
11182
  ],
11123
11183
  "additionalProperties": false,
11124
11184
  "description": "Received record of Coin objects"
11125
- },
11126
- {
11127
- "type": "string",
11128
- "const": "recently"
11129
11185
  }
11130
11186
  ]
11131
11187
  },
@@ -11140,13 +11196,89 @@
11140
11196
  "type": "null"
11141
11197
  }
11142
11198
  ]
11199
+ },
11200
+ "withdraw": {
11201
+ "description": "Permission-gated balance exit (the ONLY non-claim exit from the Reward balance): withdraws this amount from the Reward balance and delivers it to the transaction sender inside a Payment object (the on-chain auditable receipt, keyed by the RewardWithdrawEvent). The executing account needs the withdraw right (permission index 158) on the Reward's Permission object. Fails on-chain when the balance is insufficient or while the declared no-guard window (guard_expiration_time) is still in the future; claim replay protection is unaffected. Use it to recover mismatched or overfunded pools.",
11202
+ "type": "object",
11203
+ "properties": {
11204
+ "amount": {
11205
+ "anyOf": [
11206
+ {
11207
+ "type": "integer",
11208
+ "minimum": 0,
11209
+ "maximum": 9007199254740991
11210
+ },
11211
+ {
11212
+ "type": "string"
11213
+ }
11214
+ ],
11215
+ "description": "Amount to withdraw (SMALLEST token units, e.g. '100000000')."
11216
+ },
11217
+ "payment_info": {
11218
+ "type": "object",
11219
+ "properties": {
11220
+ "for_object": {
11221
+ "description": "Binding anchor for this distribution. On an Allocation a SET for_object is ENFORCED at alloc(): every GuardIdentifier recipient submission must equal this address or the whole tx aborts (ERECIPIENT_NOT_FOR_OBJECT, code 15) — verify the anchor matches the intended recipient flow BEFORE create; payment_info is immutable afterwards. NULL/omitted = no anchor: nothing is enforced on-chain, recipient routing is entirely the creator's design. Also recorded at creation for auditors to query the distribution's business context.",
11222
+ "anyOf": [
11223
+ {
11224
+ "type": "string"
11225
+ },
11226
+ {
11227
+ "type": "null"
11228
+ }
11229
+ ]
11230
+ },
11231
+ "for_guard": {
11232
+ "description": "Payment to satisfy verification of a Guard object",
11233
+ "anyOf": [
11234
+ {
11235
+ "type": "string"
11236
+ },
11237
+ {
11238
+ "type": "null"
11239
+ }
11240
+ ]
11241
+ },
11242
+ "remark": {
11243
+ "type": "string",
11244
+ "description": "Payment record remark"
11245
+ },
11246
+ "index": {
11247
+ "anyOf": [
11248
+ {
11249
+ "type": "number"
11250
+ },
11251
+ {
11252
+ "type": "string"
11253
+ }
11254
+ ],
11255
+ "description": "Payment record index"
11256
+ }
11257
+ },
11258
+ "required": [
11259
+ "remark",
11260
+ "index"
11261
+ ],
11262
+ "additionalProperties": false,
11263
+ "description": "Payment receipt metadata (remark/index). The withdrawn funds leave the Reward balance inside a Payment object — the on-chain auditable receipt."
11264
+ },
11265
+ "unwrap": {
11266
+ "description": "Auto-unwrap: when true, the coin is paid straight to the transaction sender in the SAME transaction (single-PTB flow). When false or omitted (default), a CoinWrapper is delivered to the sender's wallet for later unwrapping via the payment call with receive:true. Both modes keep the Payment object as the on-chain receipt.",
11267
+ "type": "boolean"
11268
+ }
11269
+ },
11270
+ "required": [
11271
+ "amount",
11272
+ "payment_info"
11273
+ ],
11274
+ "additionalProperties": false
11143
11275
  }
11144
11276
  },
11145
11277
  "required": [
11146
11278
  "object"
11147
11279
  ],
11148
11280
  "additionalProperties": false,
11149
- "description": "On-chain Reward operations. USAGE: (1) CREATE NEW: Set 'object' field with OBJECT format {name, type_parameter, permission, ...} to create a Reward. NOTE: 'name' goes INSIDE 'object', NOT at the data root level.'permission' can be a new Permission object or reference an existing one - check 'object' field description for details. (2) OPERATE EXISTING: Set 'object' field with STRING format (object ID or name). The 'object' field is CRITICAL and REQUIRED in both cases. STRING for existing, OBJECT for new creation."
11281
+ "description": "On-chain Reward operations. USAGE: (1) CREATE NEW: Set 'object' field with OBJECT format {name, type_parameter, permission, ...} to create a Reward. NOTE: 'name' goes INSIDE 'object', NOT at the data root level.'permission' can be a new Permission object or reference an existing one - check 'object' field description for details. (2) OPERATE EXISTING: Set 'object' field with STRING format (object ID or name). The 'object' field is CRITICAL and REQUIRED in both cases. STRING for existing, OBJECT for new creation. NAME RESOLUTION SCOPE (T8 az3-mn-261013): a LocalMark name resolves ONLY within the SIGNING account's own local mark store — when the Reward was named by a DIFFERENT account (e.g. the merchant's mark) and you operate it from another account, the name lookup fails with 'not found locally'; pass the on-chain 0x object ID instead (resolve it once via workspace/onchain_objects and reuse the id)."
11150
11282
  },
11151
11283
  "env": {
11152
11284
  "type": "object",
@@ -11293,6 +11425,7 @@
11293
11425
  "description": "Whether this table item's value is submitted dynamically at Guard trigger time (alloc_by_guard call). \n\ntrue = value is submitted by the caller when triggering the Guard. Use for runtime-context-dependent values like order address, user address. The 'value' field is ignored when b_submission=true; the caller must provide it via submissions[]. \n\nfalse = value is static, set at Guard creation time. Use for values known when the Guard is created: expected node names, expected merchant address, expected service address. The 'value' field must be populated and will be stored on-chain permanently. \n\nRule of thumb: if the value is the SAME for all future Guard triggers, use false. If the value DIFFERS per trigger (e.g., which order to release funds for), use true."
11294
11426
  },
11295
11427
  "value_type": {
11428
+ "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details.",
11296
11429
  "anyOf": [
11297
11430
  {
11298
11431
  "type": "number",
@@ -11579,11 +11712,10 @@
11579
11712
  "const": "vecvecu8",
11580
11713
  "description": "vecvecu8"
11581
11714
  }
11582
- ],
11583
- "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details."
11715
+ ]
11584
11716
  },
11585
11717
  "value": {
11586
- "description": "The actual value data. Format depends on `value_type`:\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
11718
+ "description": "The actual value data. Format depends on `value_type`:\nTYPE-CLASS SPLIT (F03): scalar value_types (Bool/Address/String/U8..U256) take ONE scalar value (boolean/address string/name/string/number); Vec* value_types (VecBool/VecAddress/VecString/VecU8..VecU256) take a REAL JSON ARRAY of elements — a string (even a Python-repr-looking \"[a, b]\") fails serialization with 'value_type=10 (array) requires a array value'. The historical 'static values must be strings' rule applied to SCALARS only.\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nPROTOCOL SLOT 254 (once, b_submission Address): the submitted value MUST be the ORDER address bound to the operation (payment_info.for_object) — NEVER the Progress/Machine/Arb object the call is advancing. The chain asserts submission(254) == the order address; a Progress address fails the task binding and the forward aborts.\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
11587
11719
  "anyOf": [
11588
11720
  {
11589
11721
  "type": "boolean"
@@ -11742,7 +11874,7 @@
11742
11874
  "additionalProperties": false,
11743
11875
  "description": "Guard table item (QUERY/OUTPUT form — includes auto-derived object_type field)"
11744
11876
  },
11745
- "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}]"
11877
+ "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}] PROTOCOL SLOT 254: when the Guard table has identifier 254, submit the ORDER address bound to the operation (payment_info.for_object) — never the Progress/Machine object being advanced."
11746
11878
  }
11747
11879
  },
11748
11880
  "required": [
@@ -11752,7 +11884,7 @@
11752
11884
  "additionalProperties": false,
11753
11885
  "description": "One Guard's submission data: the Guard to verify plus the user-provided data that satisfies its requirements."
11754
11886
  },
11755
- "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
11887
+ "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. SLOT COMPLETENESS (T8 az3-mn-261013): the submission array must cover EVERY b_submission slot in the Guard's table, not just one — a Guard whose table has multiple b_submission entries (e.g. slot 0 + slot 254) aborts on-chain with 'Submission ID not found' (abort 11) when any b_submission slot has no matching entry. Check the Guard's table (each entry with b_submission needs its identifier filled) and include ALL of them. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
11756
11888
  }
11757
11889
  },
11758
11890
  "required": [
@@ -11866,7 +11998,7 @@
11866
11998
  "GuardIdentifier"
11867
11999
  ],
11868
12000
  "additionalProperties": false,
11869
- "description": "Guard verified recipient ID. Get recipient ID from specified data index in Guard table. The ID must be of address type."
12001
+ "description": "Guard verified recipient ID. Get recipient ID from specified data index in Guard table. The ID must be of address type. ALLOCATION rails only — the REWARD claim rail requires recipient == the transaction sender (abort 14), so a GuardIdentifier recipient on reward.guard_add resolves to the submitted Order and is structurally unpayable; the tool gate rejects it (crs-mn-261015 F-12)."
11870
12002
  },
11871
12003
  {
11872
12004
  "type": "object",
@@ -11905,7 +12037,7 @@
11905
12037
  "Signer"
11906
12038
  ],
11907
12039
  "additionalProperties": false,
11908
- "description": "Current transaction signer (tx_context::sender) at the time of the alloc() call. For refunds, the Order owner must call alloc_by_guard themselves to receive the funds."
12040
+ "description": "Current transaction signer (tx_context::sender) at the time of the alloc() call. For refunds, the Order owner must call alloc_by_guard themselves to receive the funds. On the REWARD claim rail this is the CANONICAL recipient (the claim entry requires recipient == the tx sender)."
11909
12041
  }
11910
12042
  ],
11911
12043
  "description": "Recipient of this allocation. Three forms — each resolves the address at a DIFFERENT time:\n• { GuardIdentifier: u8 } — DYNAMIC address resolved from Passport at alloc() time (from the passport's submission record). Use 0 for Order owner in Service-integrated mode (Customer who created the Order). The identifier must match a Guard table entry with b_submission=true. If Passport has no matching submission, contract aborts with E_VERIFY_FAILED. Use when the recipient address is not known at config time and must be supplied via Guard submission data.\n• { Entity: { name_or_address: '...' } } — FIXED address resolved via LocalMark at SDK build time (passed to contract as a literal address). Use for known recipients (e.g., 'turo_host', or a Treasury object address). Use when the recipient is a stable, known address (e.g., operator receives rent, platform fee to treasury).\n• 'Signer' — the transaction sender at the time of the alloc() call (tx_context::sender). RESOLVED AT EXECUTION TIME, not at config time. For refunds: the customer (Order owner) must call alloc_by_guard THEMSELVES so that tx_context::sender resolves to THEIR address — if the operator calls alloc_by_guard, the operator becomes the recipient (Signer = operator), NOT the customer. Use when the recipient is whoever submits the allocation transaction (e.g., customer receives refund)."
@@ -12346,6 +12478,7 @@
12346
12478
  "description": "Whether this table item's value is submitted dynamically at Guard trigger time (alloc_by_guard call). \n\ntrue = value is submitted by the caller when triggering the Guard. Use for runtime-context-dependent values like order address, user address. The 'value' field is ignored when b_submission=true; the caller must provide it via submissions[]. \n\nfalse = value is static, set at Guard creation time. Use for values known when the Guard is created: expected node names, expected merchant address, expected service address. The 'value' field must be populated and will be stored on-chain permanently. \n\nRule of thumb: if the value is the SAME for all future Guard triggers, use false. If the value DIFFERS per trigger (e.g., which order to release funds for), use true."
12347
12479
  },
12348
12480
  "value_type": {
12481
+ "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details.",
12349
12482
  "anyOf": [
12350
12483
  {
12351
12484
  "type": "number",
@@ -12632,11 +12765,10 @@
12632
12765
  "const": "vecvecu8",
12633
12766
  "description": "vecvecu8"
12634
12767
  }
12635
- ],
12636
- "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details."
12768
+ ]
12637
12769
  },
12638
12770
  "value": {
12639
- "description": "The actual value data. Format depends on `value_type`:\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
12771
+ "description": "The actual value data. Format depends on `value_type`:\nTYPE-CLASS SPLIT (F03): scalar value_types (Bool/Address/String/U8..U256) take ONE scalar value (boolean/address string/name/string/number); Vec* value_types (VecBool/VecAddress/VecString/VecU8..VecU256) take a REAL JSON ARRAY of elements — a string (even a Python-repr-looking \"[a, b]\") fails serialization with 'value_type=10 (array) requires a array value'. The historical 'static values must be strings' rule applied to SCALARS only.\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nPROTOCOL SLOT 254 (once, b_submission Address): the submitted value MUST be the ORDER address bound to the operation (payment_info.for_object) — NEVER the Progress/Machine/Arb object the call is advancing. The chain asserts submission(254) == the order address; a Progress address fails the task binding and the forward aborts.\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
12640
12772
  "anyOf": [
12641
12773
  {
12642
12774
  "type": "boolean"
@@ -12795,7 +12927,7 @@
12795
12927
  "additionalProperties": false,
12796
12928
  "description": "Guard table item (QUERY/OUTPUT form — includes auto-derived object_type field)"
12797
12929
  },
12798
- "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}]"
12930
+ "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}] PROTOCOL SLOT 254: when the Guard table has identifier 254, submit the ORDER address bound to the operation (payment_info.for_object) — never the Progress/Machine object being advanced."
12799
12931
  }
12800
12932
  },
12801
12933
  "required": [
@@ -12805,7 +12937,7 @@
12805
12937
  "additionalProperties": false,
12806
12938
  "description": "One Guard's submission data: the Guard to verify plus the user-provided data that satisfies its requirements."
12807
12939
  },
12808
- "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
12940
+ "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. SLOT COMPLETENESS (T8 az3-mn-261013): the submission array must cover EVERY b_submission slot in the Guard's table, not just one — a Guard whose table has multiple b_submission entries (e.g. slot 0 + slot 254) aborts on-chain with 'Submission ID not found' (abort 11) when any b_submission slot has no matching entry. Check the Guard's table (each entry with b_submission needs its identifier filled) and include ALL of them. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
12809
12941
  }
12810
12942
  },
12811
12943
  "required": [
@@ -13483,9 +13615,18 @@
13483
13615
  "additionalProperties": false
13484
13616
  },
13485
13617
  "owner_receive": {
13486
- "description": "Unwrap CoinWrapper objects and other objects received by this Permission object and send them to the builder(owner).\n\nACCEPTED FORMATS (F-06 unified receive operation block):\n• 'recently' (string literal) — auto-query and receive ALL recently received objects.\n Use this for the common case: \"withdraw everything the object has received.\"\n Example: receive: 'recently'\n• ReceivedNormal[] (array) — explicit list of received objects to unwrap.\n Use this when you want to receive specific objects only (not all).\n Example: receive: [{id: '0xobj1', type: '0x2::coin::Coin<0x2::wow::WOW>'}]\n• ReceivedBalance ({token_type, balance, received: [{id, balance, payment}]}) —\n receive a balance record from a specific Payment/payer.\n Use this for precise balance targeting (advanced — usually after querying\n the object's received history via query_received).\n Example: receive: {token_type: '0x2::wow::WOW', balance: 1000000, received: [{id: '0xrec1', balance: 1000000, payment: '0xpay1'}]}\nANTI-PATTERN: do NOT wrap in {result: ...} — pass the value directly.",
13618
+ "description": "Unwrap CoinWrapper objects and other objects received by this Permission object and send them to the builder(owner).\n\nACCEPTED FORMATS (F-06 unified receive operation block):\n• 'recently' (string literal) — auto-query and receive ALL recently received objects.\n Use this for the common case: \"withdraw everything the object has received\" — for\n order.receive this is the correct default for \"the buyer got their refund\".\n Example: receive: 'recently'\n• bare object id (string, 0x-prefixed) — one-object form, auto-expanded (F-15):\n pass the id of the single received object you want to unwrap (e.g. a CoinWrapper id).\n Example: receive: '0xabc...'\n• ReceivedNormal[] (array) — explicit list of received objects to unwrap.\n Use this when you want to receive specific objects only (not all).\n Example: receive: [{id: '0xobj1', type: '0x2::coin::Coin<0x2::wow::WOW>'}]\n• ReceivedBalance ({token_type, balance, received: [{id, balance, payment}]}) —\n receive a balance record from a specific Payment/payer.\n Use this for precise balance targeting (advanced — usually after querying\n the object's received history via query_received).\n Example: receive: {token_type: '0x2::wow::WOW', balance: 1000000, received: [{id: '0xrec1', balance: 1000000, payment: '0xpay1'}]}\nANTI-PATTERN: do NOT wrap in {result: ...} — pass the value directly.",
13487
13619
  "anyOf": [
13488
13620
  {
13621
+ "type": "string",
13622
+ "const": "recently"
13623
+ },
13624
+ {
13625
+ "type": "string",
13626
+ "pattern": "^0x[0-9a-fA-F]{8,}$"
13627
+ },
13628
+ {
13629
+ "minItems": 1,
13489
13630
  "type": "array",
13490
13631
  "items": {
13491
13632
  "type": "object",
@@ -13593,10 +13734,6 @@
13593
13734
  ],
13594
13735
  "additionalProperties": false,
13595
13736
  "description": "Received record of Coin objects"
13596
- },
13597
- {
13598
- "type": "string",
13599
- "const": "recently"
13600
13737
  }
13601
13738
  ]
13602
13739
  },
@@ -13770,6 +13907,7 @@
13770
13907
  "description": "Whether this table item's value is submitted dynamically at Guard trigger time (alloc_by_guard call). \n\ntrue = value is submitted by the caller when triggering the Guard. Use for runtime-context-dependent values like order address, user address. The 'value' field is ignored when b_submission=true; the caller must provide it via submissions[]. \n\nfalse = value is static, set at Guard creation time. Use for values known when the Guard is created: expected node names, expected merchant address, expected service address. The 'value' field must be populated and will be stored on-chain permanently. \n\nRule of thumb: if the value is the SAME for all future Guard triggers, use false. If the value DIFFERS per trigger (e.g., which order to release funds for), use true."
13771
13908
  },
13772
13909
  "value_type": {
13910
+ "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details.",
13773
13911
  "anyOf": [
13774
13912
  {
13775
13913
  "type": "number",
@@ -14056,11 +14194,10 @@
14056
14194
  "const": "vecvecu8",
14057
14195
  "description": "vecvecu8"
14058
14196
  }
14059
- ],
14060
- "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details."
14197
+ ]
14061
14198
  },
14062
14199
  "value": {
14063
- "description": "The actual value data. Format depends on `value_type`:\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
14200
+ "description": "The actual value data. Format depends on `value_type`:\nTYPE-CLASS SPLIT (F03): scalar value_types (Bool/Address/String/U8..U256) take ONE scalar value (boolean/address string/name/string/number); Vec* value_types (VecBool/VecAddress/VecString/VecU8..VecU256) take a REAL JSON ARRAY of elements — a string (even a Python-repr-looking \"[a, b]\") fails serialization with 'value_type=10 (array) requires a array value'. The historical 'static values must be strings' rule applied to SCALARS only.\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nPROTOCOL SLOT 254 (once, b_submission Address): the submitted value MUST be the ORDER address bound to the operation (payment_info.for_object) — NEVER the Progress/Machine/Arb object the call is advancing. The chain asserts submission(254) == the order address; a Progress address fails the task binding and the forward aborts.\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
14064
14201
  "anyOf": [
14065
14202
  {
14066
14203
  "type": "boolean"
@@ -14226,7 +14363,7 @@
14226
14363
  "type": "string"
14227
14364
  }
14228
14365
  ],
14229
- "description": "ID or name of the wowok object data query instruction. Can be a numeric ID (e.g., 1001) or a name string (e.g., 'permission.description'). Name matching is case-insensitive."
14366
+ "description": "ID or name of the wowok object data query instruction. Can be a numeric ID (e.g., 1001) or a name string (e.g., 'permission.description'). Name matching is case-insensitive. STRONGLY PREFER the NAME form: a numeric ID is resolved VERBATIM at runtime, so a wrong-but-existing ID silently checks a DIFFERENT field and only fails at Guard trigger time (abort 7, no leg named) — a wrong name fails loudly at validation here instead (rndb58d8d 04-ROOTCAUSE-A A2). If you only know the field, list the catalog first via schema_query action='get_guard_queries'."
14230
14367
  },
14231
14368
  "object": {
14232
14369
  "type": "object",
@@ -15586,13 +15723,26 @@
15586
15723
  "minimum": 0,
15587
15724
  "maximum": 255,
15588
15725
  "description": "Identifier (0-255) for data lookup in Guard table. Slot consensus (enforced on-chain at guard table construction): 0-220 = user slots (free for business guards); 221-253 = PROTOCOL-RESERVED (rejected on-chain — reserved so future protocol features get fixed slots without colliding with published guards); 255 = ONCE replay-protection slot on Allocation (byte-keyed, the submitted bytes are the once-key — use for per-period keys like period-<N>); 254 = ONCE-FOR-OBJECT slot on Allocation (chain-derived key = bcs(the Allocation's payment_info.for_object); the submitted bytes are ignored and the submission only arms the slot — use for one-shot per-order rails such as full refunds)."
15726
+ },
15727
+ "convert_witness": {
15728
+ "description": "Optional witness to derive the Progress object from the submitted Order (e.g. 'OrderProgress'): the table object is the ORDER address and the chain resolves its per-order Progress — one Guard serves every order. Omit when the table object is a concrete Progress address.",
15729
+ "anyOf": [
15730
+ {
15731
+ "type": "integer",
15732
+ "minimum": -9007199254740991,
15733
+ "maximum": 9007199254740991
15734
+ },
15735
+ {
15736
+ "type": "string"
15737
+ }
15738
+ ]
15589
15739
  }
15590
15740
  },
15591
15741
  "required": [
15592
15742
  "identifier"
15593
15743
  ],
15594
15744
  "additionalProperties": false,
15595
- "description": "Reference to the Progress object in the Guard table (must be Address type)."
15745
+ "description": "Reference to the queried object in the Guard table: a Progress address, or an Order address when convert_witness is set."
15596
15746
  },
15597
15747
  "where": {
15598
15748
  "type": "object",
@@ -15648,7 +15798,7 @@
15648
15798
  "properties": {
15649
15799
  "type": {
15650
15800
  "type": "string",
15651
- "const": "query_progress_history_session_find"
15801
+ "const": "query_progress_history_time"
15652
15802
  },
15653
15803
  "object": {
15654
15804
  "type": "object",
@@ -15658,33 +15808,118 @@
15658
15808
  "minimum": 0,
15659
15809
  "maximum": 255,
15660
15810
  "description": "Identifier (0-255) for data lookup in Guard table. Slot consensus (enforced on-chain at guard table construction): 0-220 = user slots (free for business guards); 221-253 = PROTOCOL-RESERVED (rejected on-chain — reserved so future protocol features get fixed slots without colliding with published guards); 255 = ONCE replay-protection slot on Allocation (byte-keyed, the submitted bytes are the once-key — use for per-period keys like period-<N>); 254 = ONCE-FOR-OBJECT slot on Allocation (chain-derived key = bcs(the Allocation's payment_info.for_object); the submitted bytes are ignored and the submission only arms the slot — use for one-shot per-order rails such as full refunds)."
15811
+ },
15812
+ "convert_witness": {
15813
+ "description": "Optional witness to derive the Progress object from the submitted Order (e.g. 'OrderProgress'): the table object is the ORDER address and the chain resolves its per-order Progress — one Guard serves every order. Omit when the table object is a concrete Progress address.",
15814
+ "anyOf": [
15815
+ {
15816
+ "type": "integer",
15817
+ "minimum": -9007199254740991,
15818
+ "maximum": 9007199254740991
15819
+ },
15820
+ {
15821
+ "type": "string"
15822
+ }
15823
+ ]
15661
15824
  }
15662
15825
  },
15663
15826
  "required": [
15664
15827
  "identifier"
15665
15828
  ],
15666
15829
  "additionalProperties": false,
15667
- "description": "Reference to the Progress object in the Guard table (must be Address type)."
15668
- },
15669
- "historyIdx": {
15670
- "description": "GuardNode that returns the history index (U64 type) to search within. Typically an 'identifier' node referencing a U64 value from the Guard table.",
15671
- "allOf": [
15672
- {
15673
- "$ref": "#/definitions/__schema3"
15674
- }
15675
- ],
15676
- "$ref": "#/definitions/__schema2"
15830
+ "description": "Reference to the queried object in the Guard table: a Progress address, or an Order address when convert_witness is set."
15677
15831
  },
15678
15832
  "where": {
15679
15833
  "type": "object",
15680
15834
  "properties": {
15835
+ "node": {
15836
+ "description": "Optional filter: node name string to match.",
15837
+ "type": "string"
15838
+ },
15681
15839
  "nextNode": {
15682
- "description": "Optional filter: next node name string to match.",
15840
+ "description": "Optional filter: next node name string to match — the canonical time anchor is where:{nextNode:'<node>'}, find:'last', which returns the IMMUTABLE moment that node was entered (1280 history.time is written once on entry and never rewritten, unlike the 1272 current-time read which refreshes on re-entry). An empty where {} with find:'last' returns the entry time of the CURRENT node — safe for node-SET gates.",
15683
15841
  "type": "string"
15684
- }
15685
- },
15686
- "additionalProperties": false,
15687
- "description": "Filter conditions for the progress history session query."
15842
+ },
15843
+ "timeMin": {
15844
+ "description": "Optional filter: minimum timestamp (inclusive) for history entry time. Use string to represent U64 value.",
15845
+ "type": "string"
15846
+ },
15847
+ "timeMax": {
15848
+ "description": "Optional filter: maximum timestamp (inclusive) for history entry time. Use string to represent U64 value.",
15849
+ "type": "string"
15850
+ },
15851
+ "indexMin": {
15852
+ "description": "Optional filter: minimum history index (inclusive) to search within. Use string to represent U64 value.",
15853
+ "type": "string"
15854
+ },
15855
+ "indexMax": {
15856
+ "description": "Optional filter: maximum history index (inclusive) to search within. Use string to represent U64 value.",
15857
+ "type": "string"
15858
+ }
15859
+ },
15860
+ "additionalProperties": false,
15861
+ "description": "Filter conditions for the progress history time query."
15862
+ },
15863
+ "find": {
15864
+ "type": "string",
15865
+ "enum": [
15866
+ "first",
15867
+ "last"
15868
+ ],
15869
+ "description": "'first' finds the earliest matching history entry, 'last' finds the most recent matching history entry."
15870
+ }
15871
+ },
15872
+ "required": [
15873
+ "type",
15874
+ "object",
15875
+ "where",
15876
+ "find"
15877
+ ],
15878
+ "additionalProperties": false,
15879
+ "description": "Returns U64. Returns the TIMESTAMP (ms) of the first or last history entry matching the filter conditions — the immutable entry moment of a node (query 1280 progress.history.time). Preferred over query 1272 progress.current_time for time anchors: 1272 reads the node's CURRENT time and refreshes on re-entry (drift-prone), while 1280 is written once on entering next_node and never rewritten. Throws error if no matching entry is found (Guard validation fails)."
15880
+ },
15881
+ {
15882
+ "type": "object",
15883
+ "properties": {
15884
+ "type": {
15885
+ "type": "string",
15886
+ "const": "query_progress_history_session_find"
15887
+ },
15888
+ "object": {
15889
+ "type": "object",
15890
+ "properties": {
15891
+ "identifier": {
15892
+ "type": "integer",
15893
+ "minimum": 0,
15894
+ "maximum": 255,
15895
+ "description": "Identifier (0-255) for data lookup in Guard table. Slot consensus (enforced on-chain at guard table construction): 0-220 = user slots (free for business guards); 221-253 = PROTOCOL-RESERVED (rejected on-chain — reserved so future protocol features get fixed slots without colliding with published guards); 255 = ONCE replay-protection slot on Allocation (byte-keyed, the submitted bytes are the once-key — use for per-period keys like period-<N>); 254 = ONCE-FOR-OBJECT slot on Allocation (chain-derived key = bcs(the Allocation's payment_info.for_object); the submitted bytes are ignored and the submission only arms the slot — use for one-shot per-order rails such as full refunds)."
15896
+ }
15897
+ },
15898
+ "required": [
15899
+ "identifier"
15900
+ ],
15901
+ "additionalProperties": false,
15902
+ "description": "Reference to the Progress object in the Guard table (must be Address type)."
15903
+ },
15904
+ "historyIdx": {
15905
+ "description": "GuardNode that returns the history index (U64 type) to search within. Typically an 'identifier' node referencing a U64 value from the Guard table.",
15906
+ "allOf": [
15907
+ {
15908
+ "$ref": "#/definitions/__schema3"
15909
+ }
15910
+ ],
15911
+ "$ref": "#/definitions/__schema2"
15912
+ },
15913
+ "where": {
15914
+ "type": "object",
15915
+ "properties": {
15916
+ "nextNode": {
15917
+ "description": "Optional filter: next node name string to match.",
15918
+ "type": "string"
15919
+ }
15920
+ },
15921
+ "additionalProperties": false,
15922
+ "description": "Filter conditions for the progress history session query."
15688
15923
  },
15689
15924
  "find": {
15690
15925
  "type": "string",
@@ -15946,6 +16181,77 @@
15946
16181
  "additionalProperties": false,
15947
16182
  "description": "Returns U64. Counts the number of retained submissions within the specified forward operation."
15948
16183
  },
16184
+ {
16185
+ "type": "object",
16186
+ "properties": {
16187
+ "type": {
16188
+ "type": "string",
16189
+ "const": "query_progress_history_session_forward_retained_submission_value"
16190
+ },
16191
+ "object": {
16192
+ "type": "object",
16193
+ "properties": {
16194
+ "identifier": {
16195
+ "type": "integer",
16196
+ "minimum": 0,
16197
+ "maximum": 255,
16198
+ "description": "Identifier (0-255) for data lookup in Guard table. Slot consensus (enforced on-chain at guard table construction): 0-220 = user slots (free for business guards); 221-253 = PROTOCOL-RESERVED (rejected on-chain — reserved so future protocol features get fixed slots without colliding with published guards); 255 = ONCE replay-protection slot on Allocation (byte-keyed, the submitted bytes are the once-key — use for per-period keys like period-<N>); 254 = ONCE-FOR-OBJECT slot on Allocation (chain-derived key = bcs(the Allocation's payment_info.for_object); the submitted bytes are ignored and the submission only arms the slot — use for one-shot per-order rails such as full refunds)."
16199
+ }
16200
+ },
16201
+ "required": [
16202
+ "identifier"
16203
+ ],
16204
+ "additionalProperties": false,
16205
+ "description": "Reference to the Progress object in the Guard table (must be Address type)."
16206
+ },
16207
+ "historyIdx": {
16208
+ "description": "GuardNode that returns the history index (U64 type). Typically an 'identifier' node referencing a U64 value from the Guard table.",
16209
+ "allOf": [
16210
+ {
16211
+ "$ref": "#/definitions/__schema3"
16212
+ }
16213
+ ],
16214
+ "$ref": "#/definitions/__schema2"
16215
+ },
16216
+ "sessionIdx": {
16217
+ "description": "GuardNode that returns the session index (U64 type) within the history entry. Typically an 'identifier' node referencing a U64 value from the Guard table.",
16218
+ "allOf": [
16219
+ {
16220
+ "$ref": "#/definitions/__schema3"
16221
+ }
16222
+ ],
16223
+ "$ref": "#/definitions/__schema2"
16224
+ },
16225
+ "forwardIdx": {
16226
+ "description": "GuardNode that returns the forward operation index (U64 type) within the session. Typically an 'identifier' node referencing a U64 value from the Guard table.",
16227
+ "allOf": [
16228
+ {
16229
+ "$ref": "#/definitions/__schema3"
16230
+ }
16231
+ ],
16232
+ "$ref": "#/definitions/__schema2"
16233
+ },
16234
+ "identifier": {
16235
+ "description": "GuardNode that returns the submission identifier (U8 type) — which retained submission of the forward to read. Typically an 'identifier' node referencing a U8 value from the Guard table.",
16236
+ "allOf": [
16237
+ {
16238
+ "$ref": "#/definitions/__schema3"
16239
+ }
16240
+ ],
16241
+ "$ref": "#/definitions/__schema2"
16242
+ }
16243
+ },
16244
+ "required": [
16245
+ "type",
16246
+ "object",
16247
+ "historyIdx",
16248
+ "sessionIdx",
16249
+ "forwardIdx",
16250
+ "identifier"
16251
+ ],
16252
+ "additionalProperties": false,
16253
+ "description": "Returns VecU8 (the ONLY history query that does not return U64). Value of the specified retained submission of a HISTORY record (query 1281) — the history-side counterpart of the ACTIVE-SESSION-ONLY 1268 read, which goes blind once the session migrates into history. Use 1274/1275 to discover the history/session/forward indexes first. Throws error when the record carries no submission for the identifier (Guard validation fails)."
16254
+ },
15949
16255
  {
15950
16256
  "type": "object",
15951
16257
  "properties": {
@@ -17104,7 +17410,7 @@
17104
17410
  },
17105
17411
  "file_path": {
17106
17412
  "type": "string",
17107
- "description": "Path to JSON or Markdown file containing Guard definition. File can define: namedNew, description, table, root, rely."
17413
+ "description": "ABSOLUTE path to JSON or Markdown file containing Guard definition. Field name is `file_path` (NOT `file`). File can define: namedNew, description, table, root, rely."
17108
17414
  },
17109
17415
  "format": {
17110
17416
  "default": "json",
@@ -17676,7 +17982,7 @@
17676
17982
  "description": "vecvecu8"
17677
17983
  }
17678
17984
  ],
17679
- "description": "User available value type (number or string, e.g., 6 or 'U64' or 'u64')"
17985
+ "description": "User available value type (number, numeric string, or name — e.g., 6, '6', 'U64', 'u64')"
17680
17986
  },
17681
17987
  {
17682
17988
  "type": "number",
@@ -18868,9 +19174,18 @@
18868
19174
  ]
18869
19175
  },
18870
19176
  "owner_receive": {
18871
- "description": "Unwrap CoinWrapper objects and other objects received by this Demand object and send them to the owner of its Permission object.\n\nACCEPTED FORMATS (F-06 unified receive operation block):\n• 'recently' (string literal) — auto-query and receive ALL recently received objects.\n Use this for the common case: \"withdraw everything the object has received.\"\n Example: receive: 'recently'\n• ReceivedNormal[] (array) — explicit list of received objects to unwrap.\n Use this when you want to receive specific objects only (not all).\n Example: receive: [{id: '0xobj1', type: '0x2::coin::Coin<0x2::wow::WOW>'}]\n• ReceivedBalance ({token_type, balance, received: [{id, balance, payment}]}) —\n receive a balance record from a specific Payment/payer.\n Use this for precise balance targeting (advanced — usually after querying\n the object's received history via query_received).\n Example: receive: {token_type: '0x2::wow::WOW', balance: 1000000, received: [{id: '0xrec1', balance: 1000000, payment: '0xpay1'}]}\nANTI-PATTERN: do NOT wrap in {result: ...} — pass the value directly.",
19177
+ "description": "Unwrap CoinWrapper objects and other objects received by this Demand object and send them to the owner of its Permission object.\n\nACCEPTED FORMATS (F-06 unified receive operation block):\n• 'recently' (string literal) — auto-query and receive ALL recently received objects.\n Use this for the common case: \"withdraw everything the object has received\" — for\n order.receive this is the correct default for \"the buyer got their refund\".\n Example: receive: 'recently'\n• bare object id (string, 0x-prefixed) — one-object form, auto-expanded (F-15):\n pass the id of the single received object you want to unwrap (e.g. a CoinWrapper id).\n Example: receive: '0xabc...'\n• ReceivedNormal[] (array) — explicit list of received objects to unwrap.\n Use this when you want to receive specific objects only (not all).\n Example: receive: [{id: '0xobj1', type: '0x2::coin::Coin<0x2::wow::WOW>'}]\n• ReceivedBalance ({token_type, balance, received: [{id, balance, payment}]}) —\n receive a balance record from a specific Payment/payer.\n Use this for precise balance targeting (advanced — usually after querying\n the object's received history via query_received).\n Example: receive: {token_type: '0x2::wow::WOW', balance: 1000000, received: [{id: '0xrec1', balance: 1000000, payment: '0xpay1'}]}\nANTI-PATTERN: do NOT wrap in {result: ...} — pass the value directly.",
18872
19178
  "anyOf": [
18873
19179
  {
19180
+ "type": "string",
19181
+ "const": "recently"
19182
+ },
19183
+ {
19184
+ "type": "string",
19185
+ "pattern": "^0x[0-9a-fA-F]{8,}$"
19186
+ },
19187
+ {
19188
+ "minItems": 1,
18874
19189
  "type": "array",
18875
19190
  "items": {
18876
19191
  "type": "object",
@@ -18978,10 +19293,6 @@
18978
19293
  ],
18979
19294
  "additionalProperties": false,
18980
19295
  "description": "Received record of Coin objects"
18981
- },
18982
- {
18983
- "type": "string",
18984
- "const": "recently"
18985
19296
  }
18986
19297
  ]
18987
19298
  },
@@ -19149,6 +19460,7 @@
19149
19460
  "description": "Whether this table item's value is submitted dynamically at Guard trigger time (alloc_by_guard call). \n\ntrue = value is submitted by the caller when triggering the Guard. Use for runtime-context-dependent values like order address, user address. The 'value' field is ignored when b_submission=true; the caller must provide it via submissions[]. \n\nfalse = value is static, set at Guard creation time. Use for values known when the Guard is created: expected node names, expected merchant address, expected service address. The 'value' field must be populated and will be stored on-chain permanently. \n\nRule of thumb: if the value is the SAME for all future Guard triggers, use false. If the value DIFFERS per trigger (e.g., which order to release funds for), use true."
19150
19461
  },
19151
19462
  "value_type": {
19463
+ "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details.",
19152
19464
  "anyOf": [
19153
19465
  {
19154
19466
  "type": "number",
@@ -19435,11 +19747,10 @@
19435
19747
  "const": "vecvecu8",
19436
19748
  "description": "vecvecu8"
19437
19749
  }
19438
- ],
19439
- "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details."
19750
+ ]
19440
19751
  },
19441
19752
  "value": {
19442
- "description": "The actual value data. Format depends on `value_type`:\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
19753
+ "description": "The actual value data. Format depends on `value_type`:\nTYPE-CLASS SPLIT (F03): scalar value_types (Bool/Address/String/U8..U256) take ONE scalar value (boolean/address string/name/string/number); Vec* value_types (VecBool/VecAddress/VecString/VecU8..VecU256) take a REAL JSON ARRAY of elements — a string (even a Python-repr-looking \"[a, b]\") fails serialization with 'value_type=10 (array) requires a array value'. The historical 'static values must be strings' rule applied to SCALARS only.\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nPROTOCOL SLOT 254 (once, b_submission Address): the submitted value MUST be the ORDER address bound to the operation (payment_info.for_object) — NEVER the Progress/Machine/Arb object the call is advancing. The chain asserts submission(254) == the order address; a Progress address fails the task binding and the forward aborts.\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
19443
19754
  "anyOf": [
19444
19755
  {
19445
19756
  "type": "boolean"
@@ -19598,7 +19909,7 @@
19598
19909
  "additionalProperties": false,
19599
19910
  "description": "Guard table item (QUERY/OUTPUT form — includes auto-derived object_type field)"
19600
19911
  },
19601
- "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}]"
19912
+ "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}] PROTOCOL SLOT 254: when the Guard table has identifier 254, submit the ORDER address bound to the operation (payment_info.for_object) — never the Progress/Machine object being advanced."
19602
19913
  }
19603
19914
  },
19604
19915
  "required": [
@@ -19608,7 +19919,7 @@
19608
19919
  "additionalProperties": false,
19609
19920
  "description": "One Guard's submission data: the Guard to verify plus the user-provided data that satisfies its requirements."
19610
19921
  },
19611
- "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
19922
+ "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. SLOT COMPLETENESS (T8 az3-mn-261013): the submission array must cover EVERY b_submission slot in the Guard's table, not just one — a Guard whose table has multiple b_submission entries (e.g. slot 0 + slot 254) aborts on-chain with 'Submission ID not found' (abort 11) when any b_submission slot has no matching entry. Check the Guard's table (each entry with b_submission needs its identifier filled) and include ALL of them. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
19612
19923
  }
19613
19924
  },
19614
19925
  "required": [
@@ -19676,7 +19987,7 @@
19676
19987
  "additionalProperties": false
19677
19988
  },
19678
19989
  "required_info": {
19679
- "description": "Credential recorded on the order: the merchant's IM user address resolved from the Service's Contact (zero cost) or a WTS Proof object id (on-chain delivery proof embedding that IM address and timestamp; costs gas). The information itself is delivered via Wowok Messenger.",
19990
+ "description": "Credential recorded on the order: the merchant's IM user address resolved from the Service's Contact (zero cost) or a WTS Proof object id (on-chain delivery proof embedding that IM address and timestamp; costs gas). The information itself is delivered via Wowok Messenger. WRITE PERMISSION: OWNER-ONLY — only the order owner (the buyer) can set or clear this field; any other signer (including the merchant/service owner) aborts on-chain (MoveAbort 1, 'Not the owner'). The merchant's role is to READ it and to receive the info over Messenger. ATTESTATION SEMANTICS: the recorded VALUE is self-attested and has no on-chain readback — never trust the value itself as a gate condition. A PRESENCE gate IS legitimate on-chain (query order.required_info is some — see pattern.required_info_evidence_gate): it proves the buyer recorded a credential before handover, without asserting what the credential says.",
19680
19991
  "anyOf": [
19681
19992
  {
19682
19993
  "type": "string",
@@ -19722,7 +20033,7 @@
19722
20033
  ]
19723
20034
  },
19724
20035
  "message": {
19725
- "description": "Operation result message.",
20036
+ "description": "Message attached to the forward advance; recorded permanently in on-chain History. REVIEW-TYPE FORWARDS: de-facto REQUIRED here — the review text is this message (the reward claim guard does not read it, but a no-message Review forward has failed repeatedly on mainnet until the message was added). Always include message: '<review text>' when advancing a Review-named forward.",
19726
20037
  "type": "string"
19727
20038
  }
19728
20039
  },
@@ -19796,9 +20107,18 @@
19796
20107
  "additionalProperties": false
19797
20108
  },
19798
20109
  "receive": {
19799
- "description": "Unwrap CoinWrapper objects or other objects received by the order and transfer them to the order owner. Consistent with `owner_receive` on other objects (arbitration/contact/demand/machine/permission/repository/reward/service/treasury).\n\nACCEPTED FORMATS (F-06 unified receive operation block):\n• 'recently' (string literal) — auto-query and receive ALL recently received objects.\n Use this for the common case: \"withdraw everything the object has received.\"\n Example: receive: 'recently'\n• ReceivedNormal[] (array) — explicit list of received objects to unwrap.\n Use this when you want to receive specific objects only (not all).\n Example: receive: [{id: '0xobj1', type: '0x2::coin::Coin<0x2::wow::WOW>'}]\n• ReceivedBalance ({token_type, balance, received: [{id, balance, payment}]}) —\n receive a balance record from a specific Payment/payer.\n Use this for precise balance targeting (advanced — usually after querying\n the object's received history via query_received).\n Example: receive: {token_type: '0x2::wow::WOW', balance: 1000000, received: [{id: '0xrec1', balance: 1000000, payment: '0xpay1'}]}\nANTI-PATTERN: do NOT wrap in {result: ...} — pass the value directly.",
20110
+ "description": "Unwrap CoinWrapper objects or other objects received by the order and transfer them to the order owner. Consistent with `owner_receive` on other objects (arbitration/contact/demand/machine/permission/repository/reward/service/treasury).\n\nACCEPTED FORMATS (F-06 unified receive operation block):\n• 'recently' (string literal) — auto-query and receive ALL recently received objects.\n Use this for the common case: \"withdraw everything the object has received\" — for\n order.receive this is the correct default for \"the buyer got their refund\".\n Example: receive: 'recently'\n• bare object id (string, 0x-prefixed) — one-object form, auto-expanded (F-15):\n pass the id of the single received object you want to unwrap (e.g. a CoinWrapper id).\n Example: receive: '0xabc...'\n• ReceivedNormal[] (array) — explicit list of received objects to unwrap.\n Use this when you want to receive specific objects only (not all).\n Example: receive: [{id: '0xobj1', type: '0x2::coin::Coin<0x2::wow::WOW>'}]\n• ReceivedBalance ({token_type, balance, received: [{id, balance, payment}]}) —\n receive a balance record from a specific Payment/payer.\n Use this for precise balance targeting (advanced — usually after querying\n the object's received history via query_received).\n Example: receive: {token_type: '0x2::wow::WOW', balance: 1000000, received: [{id: '0xrec1', balance: 1000000, payment: '0xpay1'}]}\nANTI-PATTERN: do NOT wrap in {result: ...} — pass the value directly.",
19800
20111
  "anyOf": [
19801
20112
  {
20113
+ "type": "string",
20114
+ "const": "recently"
20115
+ },
20116
+ {
20117
+ "type": "string",
20118
+ "pattern": "^0x[0-9a-fA-F]{8,}$"
20119
+ },
20120
+ {
20121
+ "minItems": 1,
19802
20122
  "type": "array",
19803
20123
  "items": {
19804
20124
  "type": "object",
@@ -19906,10 +20226,6 @@
19906
20226
  ],
19907
20227
  "additionalProperties": false,
19908
20228
  "description": "Received record of Coin objects"
19909
- },
19910
- {
19911
- "type": "string",
19912
- "const": "recently"
19913
20229
  }
19914
20230
  ]
19915
20231
  },
@@ -20212,6 +20528,7 @@
20212
20528
  "description": "Whether this table item's value is submitted dynamically at Guard trigger time (alloc_by_guard call). \n\ntrue = value is submitted by the caller when triggering the Guard. Use for runtime-context-dependent values like order address, user address. The 'value' field is ignored when b_submission=true; the caller must provide it via submissions[]. \n\nfalse = value is static, set at Guard creation time. Use for values known when the Guard is created: expected node names, expected merchant address, expected service address. The 'value' field must be populated and will be stored on-chain permanently. \n\nRule of thumb: if the value is the SAME for all future Guard triggers, use false. If the value DIFFERS per trigger (e.g., which order to release funds for), use true."
20213
20529
  },
20214
20530
  "value_type": {
20531
+ "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details.",
20215
20532
  "anyOf": [
20216
20533
  {
20217
20534
  "type": "number",
@@ -20498,11 +20815,10 @@
20498
20815
  "const": "vecvecu8",
20499
20816
  "description": "vecvecu8"
20500
20817
  }
20501
- ],
20502
- "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details."
20818
+ ]
20503
20819
  },
20504
20820
  "value": {
20505
- "description": "The actual value data. Format depends on `value_type`:\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
20821
+ "description": "The actual value data. Format depends on `value_type`:\nTYPE-CLASS SPLIT (F03): scalar value_types (Bool/Address/String/U8..U256) take ONE scalar value (boolean/address string/name/string/number); Vec* value_types (VecBool/VecAddress/VecString/VecU8..VecU256) take a REAL JSON ARRAY of elements — a string (even a Python-repr-looking \"[a, b]\") fails serialization with 'value_type=10 (array) requires a array value'. The historical 'static values must be strings' rule applied to SCALARS only.\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nPROTOCOL SLOT 254 (once, b_submission Address): the submitted value MUST be the ORDER address bound to the operation (payment_info.for_object) — NEVER the Progress/Machine/Arb object the call is advancing. The chain asserts submission(254) == the order address; a Progress address fails the task binding and the forward aborts.\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
20506
20822
  "anyOf": [
20507
20823
  {
20508
20824
  "type": "boolean"
@@ -20661,7 +20977,7 @@
20661
20977
  "additionalProperties": false,
20662
20978
  "description": "Guard table item (QUERY/OUTPUT form — includes auto-derived object_type field)"
20663
20979
  },
20664
- "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}]"
20980
+ "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}] PROTOCOL SLOT 254: when the Guard table has identifier 254, submit the ORDER address bound to the operation (payment_info.for_object) — never the Progress/Machine object being advanced."
20665
20981
  }
20666
20982
  },
20667
20983
  "required": [
@@ -20671,7 +20987,7 @@
20671
20987
  "additionalProperties": false,
20672
20988
  "description": "One Guard's submission data: the Guard to verify plus the user-provided data that satisfies its requirements."
20673
20989
  },
20674
- "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
20990
+ "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. SLOT COMPLETENESS (T8 az3-mn-261013): the submission array must cover EVERY b_submission slot in the Guard's table, not just one — a Guard whose table has multiple b_submission entries (e.g. slot 0 + slot 254) aborts on-chain with 'Submission ID not found' (abort 11) when any b_submission slot has no matching entry. Check the Guard's table (each entry with b_submission needs its identifier filled) and include ALL of them. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
20675
20991
  }
20676
20992
  },
20677
20993
  "required": [
@@ -20768,6 +21084,7 @@
20768
21084
  "description": "Whether this table item's value is submitted dynamically at Guard trigger time (alloc_by_guard call). \n\ntrue = value is submitted by the caller when triggering the Guard. Use for runtime-context-dependent values like order address, user address. The 'value' field is ignored when b_submission=true; the caller must provide it via submissions[]. \n\nfalse = value is static, set at Guard creation time. Use for values known when the Guard is created: expected node names, expected merchant address, expected service address. The 'value' field must be populated and will be stored on-chain permanently. \n\nRule of thumb: if the value is the SAME for all future Guard triggers, use false. If the value DIFFERS per trigger (e.g., which order to release funds for), use true."
20769
21085
  },
20770
21086
  "value_type": {
21087
+ "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details.",
20771
21088
  "anyOf": [
20772
21089
  {
20773
21090
  "type": "number",
@@ -21054,11 +21371,10 @@
21054
21371
  "const": "vecvecu8",
21055
21372
  "description": "vecvecu8"
21056
21373
  }
21057
- ],
21058
- "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details."
21374
+ ]
21059
21375
  },
21060
21376
  "value": {
21061
- "description": "The actual value data. Format depends on `value_type`:\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
21377
+ "description": "The actual value data. Format depends on `value_type`:\nTYPE-CLASS SPLIT (F03): scalar value_types (Bool/Address/String/U8..U256) take ONE scalar value (boolean/address string/name/string/number); Vec* value_types (VecBool/VecAddress/VecString/VecU8..VecU256) take a REAL JSON ARRAY of elements — a string (even a Python-repr-looking \"[a, b]\") fails serialization with 'value_type=10 (array) requires a array value'. The historical 'static values must be strings' rule applied to SCALARS only.\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nPROTOCOL SLOT 254 (once, b_submission Address): the submitted value MUST be the ORDER address bound to the operation (payment_info.for_object) — NEVER the Progress/Machine/Arb object the call is advancing. The chain asserts submission(254) == the order address; a Progress address fails the task binding and the forward aborts.\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
21062
21378
  "anyOf": [
21063
21379
  {
21064
21380
  "type": "boolean"
@@ -21217,7 +21533,7 @@
21217
21533
  "additionalProperties": false,
21218
21534
  "description": "Guard table item (QUERY/OUTPUT form — includes auto-derived object_type field)"
21219
21535
  },
21220
- "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}]"
21536
+ "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}] PROTOCOL SLOT 254: when the Guard table has identifier 254, submit the ORDER address bound to the operation (payment_info.for_object) — never the Progress/Machine object being advanced."
21221
21537
  }
21222
21538
  },
21223
21539
  "required": [
@@ -21227,7 +21543,7 @@
21227
21543
  "additionalProperties": false,
21228
21544
  "description": "One Guard's submission data: the Guard to verify plus the user-provided data that satisfies its requirements."
21229
21545
  },
21230
- "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
21546
+ "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. SLOT COMPLETENESS (T8 az3-mn-261013): the submission array must cover EVERY b_submission slot in the Guard's table, not just one — a Guard whose table has multiple b_submission entries (e.g. slot 0 + slot 254) aborts on-chain with 'Submission ID not found' (abort 11) when any b_submission slot has no matching entry. Check the Guard's table (each entry with b_submission needs its identifier filled) and include ALL of them. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
21231
21547
  }
21232
21548
  },
21233
21549
  "required": [
@@ -21420,7 +21736,7 @@
21420
21736
  ]
21421
21737
  },
21422
21738
  "about_address": {
21423
- "description": "About address. Accepts null/undefined (→ Move Option::none). When provided, must be a raw 0x-prefixed address (NOT a name). e.g. address of the entity being proved.",
21739
+ "description": "About binding (K3 contract): ONLY the counterparty ACCOUNT address (address first byte = account type) or a Proof object address (first byte = Proof type) — a messenger contact record. NEVER a business object (Progress/Order/Arb) and never a guard decision condition. Accepts null/undefined (→ Move Option::none). When provided, must be a raw 0x-prefixed address (NOT a name). e.g. the peer account being proved with.",
21424
21740
  "anyOf": [
21425
21741
  {
21426
21742
  "type": "string",
@@ -21587,6 +21903,7 @@
21587
21903
  "description": "Whether this table item's value is submitted dynamically at Guard trigger time (alloc_by_guard call). \n\ntrue = value is submitted by the caller when triggering the Guard. Use for runtime-context-dependent values like order address, user address. The 'value' field is ignored when b_submission=true; the caller must provide it via submissions[]. \n\nfalse = value is static, set at Guard creation time. Use for values known when the Guard is created: expected node names, expected merchant address, expected service address. The 'value' field must be populated and will be stored on-chain permanently. \n\nRule of thumb: if the value is the SAME for all future Guard triggers, use false. If the value DIFFERS per trigger (e.g., which order to release funds for), use true."
21588
21904
  },
21589
21905
  "value_type": {
21906
+ "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details.",
21590
21907
  "anyOf": [
21591
21908
  {
21592
21909
  "type": "number",
@@ -21873,11 +22190,10 @@
21873
22190
  "const": "vecvecu8",
21874
22191
  "description": "vecvecu8"
21875
22192
  }
21876
- ],
21877
- "description": "Type of the value stored in `value`. One of: Bool(0), Address(1), String(2), U8(3), U16(4), U32(5), U64(6), U128(7), U256(8), VecBool(9), VecAddress(10), VecString(11), VecU8(12), VecU16(13), VecU32(14), VecU64(15), VecU128(16), VecU256(17), VecVecU8(18). When value_type=Address (1), the `value` field accepts a hex address string, a LocalMark name, or an AccountOrMark_Address object — see `value` field description for details."
22193
+ ]
21878
22194
  },
21879
22195
  "value": {
21880
- "description": "The actual value data. Format depends on `value_type`:\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
22196
+ "description": "The actual value data. Format depends on `value_type`:\nTYPE-CLASS SPLIT (F03): scalar value_types (Bool/Address/String/U8..U256) take ONE scalar value (boolean/address string/name/string/number); Vec* value_types (VecBool/VecAddress/VecString/VecU8..VecU256) take a REAL JSON ARRAY of elements — a string (even a Python-repr-looking \"[a, b]\") fails serialization with 'value_type=10 (array) requires a array value'. The historical 'static values must be strings' rule applied to SCALARS only.\n• Bool: true/false (boolean)\n• Address (CRITICAL — string 'Address' is NOT a placeholder): a hex address (e.g. '0x1234...'), a LocalMark name (e.g. 'my-service' — resolved to address at evaluation time), an AccountOrMark_Address object (e.g. {name_or_address:'my-service'}), or system shorthand ('0xaaa' = EntityLinker, '0xaab' = EntityRegistrar). The literal string 'Address' itself is INVALID — it would be treated as a non-existent LocalMark name and fail. Example: value='0x2::wow::WOW<address>' or value='my-permission'.\n• String: any string\n• U8/U16/U32/U64/U128/U256: number or numeric string (e.g. 42 or '42')\n• Vec* types: arrays of the corresponding element type\nPROTOCOL SLOT 254 (once, b_submission Address): the submitted value MUST be the ORDER address bound to the operation (payment_info.for_object) — NEVER the Progress/Machine/Arb object the call is advancing. The chain asserts submission(254) == the order address; a Progress address fails the task binding and the forward aborts.\nREQUIRED when b_submission=false. OPTIONAL when b_submission=true (value is supplied at evaluation time by user submission).",
21881
22197
  "anyOf": [
21882
22198
  {
21883
22199
  "type": "boolean"
@@ -22036,7 +22352,7 @@
22036
22352
  "additionalProperties": false,
22037
22353
  "description": "Guard table item (QUERY/OUTPUT form — includes auto-derived object_type field)"
22038
22354
  },
22039
- "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}]"
22355
+ "description": "User-submitted data matching the Guard's required fields. Relation: structure must match the Guard table's column definitions. Example: [{field:'delivery_proof', value:'Qm...'}] PROTOCOL SLOT 254: when the Guard table has identifier 254, submit the ORDER address bound to the operation (payment_info.for_object) — never the Progress/Machine object being advanced."
22040
22356
  }
22041
22357
  },
22042
22358
  "required": [
@@ -22046,7 +22362,7 @@
22046
22362
  "additionalProperties": false,
22047
22363
  "description": "One Guard's submission data: the Guard to verify plus the user-provided data that satisfies its requirements."
22048
22364
  },
22049
- "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
22365
+ "description": "User-submitted data for each Guard. Relation: one entry per Guard in the guard array; fill submission fields and resubmit via call_with_submission. SLOT COMPLETENESS (T8 az3-mn-261013): the submission array must cover EVERY b_submission slot in the Guard's table, not just one — a Guard whose table has multiple b_submission entries (e.g. slot 0 + slot 254) aborts on-chain with 'Submission ID not found' (abort 11) when any b_submission slot has no matching entry. Check the Guard's table (each entry with b_submission needs its identifier filled) and include ALL of them. PLACEMENT: this `submission` field is at the SAME level as `data` and `env` in the operation input — NOT inside `data.data`. Example structure: {tool:'onchain_operations', data:{operation_type:'order', data:{object:'my_order', progress:{...}}}, submission:{type:'submission', guard:[...], submission:[...]}}"
22050
22366
  }
22051
22367
  },
22052
22368
  "required": [
@@ -22118,7 +22434,7 @@
22118
22434
  ]
22119
22435
  },
22120
22436
  "about_address": {
22121
- "description": "About address. Accepts null/undefined (→ Move Option::none). When provided, must be a raw 0x-prefixed address (NOT a name).",
22437
+ "description": "About binding (K3 contract): ONLY the counterparty ACCOUNT address (address first byte = account type) or a Proof object address (first byte = Proof type) — a messenger contact record. NEVER a business object (Progress/Order/Arb) and never a guard decision condition. Accepts null/undefined (→ Move Option::none). When provided, must be a raw 0x-prefixed address (NOT a name).",
22122
22438
  "anyOf": [
22123
22439
  {
22124
22440
  "type": "string",
@@ -22646,7 +22962,7 @@
22646
22962
  "description": "vecvecu8"
22647
22963
  }
22648
22964
  ],
22649
- "description": "User available value type (number or string, e.g., 6 or 'U64' or 'u64')"
22965
+ "description": "User available value type (number, numeric string, or name — e.g., 6, '6', 'U64', 'u64')"
22650
22966
  },
22651
22967
  {
22652
22968
  "type": "number",
@@ -22728,7 +23044,7 @@
22728
23044
  "type": "string"
22729
23045
  }
22730
23046
  ],
22731
- "description": "ID or name of the wowok object data query instruction. Can be a numeric ID (e.g., 1001) or a name string (e.g., 'permission.description'). Name matching is case-insensitive."
23047
+ "description": "ID or name of the wowok object data query instruction. Can be a numeric ID (e.g., 1001) or a name string (e.g., 'permission.description'). Name matching is case-insensitive. STRONGLY PREFER the NAME form: a numeric ID is resolved VERBATIM at runtime, so a wrong-but-existing ID silently checks a DIFFERENT field and only fails at Guard trigger time (abort 7, no leg named) — a wrong name fails loudly at validation here instead (rndb58d8d 04-ROOTCAUSE-A A2). If you only know the field, list the catalog first via schema_query action='get_guard_queries'."
22732
23048
  },
22733
23049
  "object": {
22734
23050
  "type": "object",
@@ -24088,13 +24404,26 @@
24088
24404
  "minimum": 0,
24089
24405
  "maximum": 255,
24090
24406
  "description": "Identifier (0-255) for data lookup in Guard table. Slot consensus (enforced on-chain at guard table construction): 0-220 = user slots (free for business guards); 221-253 = PROTOCOL-RESERVED (rejected on-chain — reserved so future protocol features get fixed slots without colliding with published guards); 255 = ONCE replay-protection slot on Allocation (byte-keyed, the submitted bytes are the once-key — use for per-period keys like period-<N>); 254 = ONCE-FOR-OBJECT slot on Allocation (chain-derived key = bcs(the Allocation's payment_info.for_object); the submitted bytes are ignored and the submission only arms the slot — use for one-shot per-order rails such as full refunds)."
24407
+ },
24408
+ "convert_witness": {
24409
+ "description": "Optional witness to derive the Progress object from the submitted Order (e.g. 'OrderProgress'): the table object is the ORDER address and the chain resolves its per-order Progress — one Guard serves every order. Omit when the table object is a concrete Progress address.",
24410
+ "anyOf": [
24411
+ {
24412
+ "type": "integer",
24413
+ "minimum": -9007199254740991,
24414
+ "maximum": 9007199254740991
24415
+ },
24416
+ {
24417
+ "type": "string"
24418
+ }
24419
+ ]
24091
24420
  }
24092
24421
  },
24093
24422
  "required": [
24094
24423
  "identifier"
24095
24424
  ],
24096
24425
  "additionalProperties": false,
24097
- "description": "Reference to the Progress object in the Guard table (must be Address type)."
24426
+ "description": "Reference to the queried object in the Guard table: a Progress address, or an Order address when convert_witness is set."
24098
24427
  },
24099
24428
  "where": {
24100
24429
  "type": "object",
@@ -24145,6 +24474,91 @@
24145
24474
  "additionalProperties": false,
24146
24475
  "description": "Returns U64. Finds the index of the first or last history entry matching the filter conditions. Returns the history index (U64) if found. Throws error if no matching entry is found (Guard validation fails)."
24147
24476
  },
24477
+ {
24478
+ "type": "object",
24479
+ "properties": {
24480
+ "type": {
24481
+ "type": "string",
24482
+ "const": "query_progress_history_time"
24483
+ },
24484
+ "object": {
24485
+ "type": "object",
24486
+ "properties": {
24487
+ "identifier": {
24488
+ "type": "integer",
24489
+ "minimum": 0,
24490
+ "maximum": 255,
24491
+ "description": "Identifier (0-255) for data lookup in Guard table. Slot consensus (enforced on-chain at guard table construction): 0-220 = user slots (free for business guards); 221-253 = PROTOCOL-RESERVED (rejected on-chain — reserved so future protocol features get fixed slots without colliding with published guards); 255 = ONCE replay-protection slot on Allocation (byte-keyed, the submitted bytes are the once-key — use for per-period keys like period-<N>); 254 = ONCE-FOR-OBJECT slot on Allocation (chain-derived key = bcs(the Allocation's payment_info.for_object); the submitted bytes are ignored and the submission only arms the slot — use for one-shot per-order rails such as full refunds)."
24492
+ },
24493
+ "convert_witness": {
24494
+ "description": "Optional witness to derive the Progress object from the submitted Order (e.g. 'OrderProgress'): the table object is the ORDER address and the chain resolves its per-order Progress — one Guard serves every order. Omit when the table object is a concrete Progress address.",
24495
+ "anyOf": [
24496
+ {
24497
+ "type": "integer",
24498
+ "minimum": -9007199254740991,
24499
+ "maximum": 9007199254740991
24500
+ },
24501
+ {
24502
+ "type": "string"
24503
+ }
24504
+ ]
24505
+ }
24506
+ },
24507
+ "required": [
24508
+ "identifier"
24509
+ ],
24510
+ "additionalProperties": false,
24511
+ "description": "Reference to the queried object in the Guard table: a Progress address, or an Order address when convert_witness is set."
24512
+ },
24513
+ "where": {
24514
+ "type": "object",
24515
+ "properties": {
24516
+ "node": {
24517
+ "description": "Optional filter: node name string to match.",
24518
+ "type": "string"
24519
+ },
24520
+ "nextNode": {
24521
+ "description": "Optional filter: next node name string to match — the canonical time anchor is where:{nextNode:'<node>'}, find:'last', which returns the IMMUTABLE moment that node was entered (1280 history.time is written once on entry and never rewritten, unlike the 1272 current-time read which refreshes on re-entry). An empty where {} with find:'last' returns the entry time of the CURRENT node — safe for node-SET gates.",
24522
+ "type": "string"
24523
+ },
24524
+ "timeMin": {
24525
+ "description": "Optional filter: minimum timestamp (inclusive) for history entry time. Use string to represent U64 value.",
24526
+ "type": "string"
24527
+ },
24528
+ "timeMax": {
24529
+ "description": "Optional filter: maximum timestamp (inclusive) for history entry time. Use string to represent U64 value.",
24530
+ "type": "string"
24531
+ },
24532
+ "indexMin": {
24533
+ "description": "Optional filter: minimum history index (inclusive) to search within. Use string to represent U64 value.",
24534
+ "type": "string"
24535
+ },
24536
+ "indexMax": {
24537
+ "description": "Optional filter: maximum history index (inclusive) to search within. Use string to represent U64 value.",
24538
+ "type": "string"
24539
+ }
24540
+ },
24541
+ "additionalProperties": false,
24542
+ "description": "Filter conditions for the progress history time query."
24543
+ },
24544
+ "find": {
24545
+ "type": "string",
24546
+ "enum": [
24547
+ "first",
24548
+ "last"
24549
+ ],
24550
+ "description": "'first' finds the earliest matching history entry, 'last' finds the most recent matching history entry."
24551
+ }
24552
+ },
24553
+ "required": [
24554
+ "type",
24555
+ "object",
24556
+ "where",
24557
+ "find"
24558
+ ],
24559
+ "additionalProperties": false,
24560
+ "description": "Returns U64. Returns the TIMESTAMP (ms) of the first or last history entry matching the filter conditions — the immutable entry moment of a node (query 1280 progress.history.time). Preferred over query 1272 progress.current_time for time anchors: 1272 reads the node's CURRENT time and refreshes on re-entry (drift-prone), while 1280 is written once on entering next_node and never rewritten. Throws error if no matching entry is found (Guard validation fails)."
24561
+ },
24148
24562
  {
24149
24563
  "type": "object",
24150
24564
  "properties": {
@@ -24448,6 +24862,77 @@
24448
24862
  "additionalProperties": false,
24449
24863
  "description": "Returns U64. Counts the number of retained submissions within the specified forward operation."
24450
24864
  },
24865
+ {
24866
+ "type": "object",
24867
+ "properties": {
24868
+ "type": {
24869
+ "type": "string",
24870
+ "const": "query_progress_history_session_forward_retained_submission_value"
24871
+ },
24872
+ "object": {
24873
+ "type": "object",
24874
+ "properties": {
24875
+ "identifier": {
24876
+ "type": "integer",
24877
+ "minimum": 0,
24878
+ "maximum": 255,
24879
+ "description": "Identifier (0-255) for data lookup in Guard table. Slot consensus (enforced on-chain at guard table construction): 0-220 = user slots (free for business guards); 221-253 = PROTOCOL-RESERVED (rejected on-chain — reserved so future protocol features get fixed slots without colliding with published guards); 255 = ONCE replay-protection slot on Allocation (byte-keyed, the submitted bytes are the once-key — use for per-period keys like period-<N>); 254 = ONCE-FOR-OBJECT slot on Allocation (chain-derived key = bcs(the Allocation's payment_info.for_object); the submitted bytes are ignored and the submission only arms the slot — use for one-shot per-order rails such as full refunds)."
24880
+ }
24881
+ },
24882
+ "required": [
24883
+ "identifier"
24884
+ ],
24885
+ "additionalProperties": false,
24886
+ "description": "Reference to the Progress object in the Guard table (must be Address type)."
24887
+ },
24888
+ "historyIdx": {
24889
+ "description": "GuardNode that returns the history index (U64 type). Typically an 'identifier' node referencing a U64 value from the Guard table.",
24890
+ "allOf": [
24891
+ {
24892
+ "$ref": "#/definitions/__schema3"
24893
+ }
24894
+ ],
24895
+ "$ref": "#/definitions/__schema2"
24896
+ },
24897
+ "sessionIdx": {
24898
+ "description": "GuardNode that returns the session index (U64 type) within the history entry. Typically an 'identifier' node referencing a U64 value from the Guard table.",
24899
+ "allOf": [
24900
+ {
24901
+ "$ref": "#/definitions/__schema3"
24902
+ }
24903
+ ],
24904
+ "$ref": "#/definitions/__schema2"
24905
+ },
24906
+ "forwardIdx": {
24907
+ "description": "GuardNode that returns the forward operation index (U64 type) within the session. Typically an 'identifier' node referencing a U64 value from the Guard table.",
24908
+ "allOf": [
24909
+ {
24910
+ "$ref": "#/definitions/__schema3"
24911
+ }
24912
+ ],
24913
+ "$ref": "#/definitions/__schema2"
24914
+ },
24915
+ "identifier": {
24916
+ "description": "GuardNode that returns the submission identifier (U8 type) — which retained submission of the forward to read. Typically an 'identifier' node referencing a U8 value from the Guard table.",
24917
+ "allOf": [
24918
+ {
24919
+ "$ref": "#/definitions/__schema3"
24920
+ }
24921
+ ],
24922
+ "$ref": "#/definitions/__schema2"
24923
+ }
24924
+ },
24925
+ "required": [
24926
+ "type",
24927
+ "object",
24928
+ "historyIdx",
24929
+ "sessionIdx",
24930
+ "forwardIdx",
24931
+ "identifier"
24932
+ ],
24933
+ "additionalProperties": false,
24934
+ "description": "Returns VecU8 (the ONLY history query that does not return U64). Value of the specified retained submission of a HISTORY record (query 1281) — the history-side counterpart of the ACTIVE-SESSION-ONLY 1268 read, which goes blind once the session migrates into history. Use 1274/1275 to discover the history/session/forward indexes first. Throws error when the record carries no submission for the identifier (Guard validation fails)."
24935
+ },
24451
24936
  {
24452
24937
  "type": "object",
24453
24938
  "properties": {