@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
@@ -97,7 +97,7 @@
97
97
  "GuardIdentifier"
98
98
  ],
99
99
  "additionalProperties": false,
100
- "description": "Guard verified recipient ID. Get recipient ID from specified data index in Guard table. The ID must be of address type."
100
+ "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)."
101
101
  },
102
102
  {
103
103
  "type": "object",
@@ -136,7 +136,7 @@
136
136
  "Signer"
137
137
  ],
138
138
  "additionalProperties": false,
139
- "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."
139
+ "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)."
140
140
  }
141
141
  ],
142
142
  "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)."
@@ -577,6 +577,7 @@
577
577
  "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."
578
578
  },
579
579
  "value_type": {
580
+ "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.",
580
581
  "anyOf": [
581
582
  {
582
583
  "type": "number",
@@ -863,11 +864,10 @@
863
864
  "const": "vecvecu8",
864
865
  "description": "vecvecu8"
865
866
  }
866
- ],
867
- "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."
867
+ ]
868
868
  },
869
869
  "value": {
870
- "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).",
870
+ "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).",
871
871
  "anyOf": [
872
872
  {
873
873
  "type": "boolean"
@@ -1026,7 +1026,7 @@
1026
1026
  "additionalProperties": false,
1027
1027
  "description": "Guard table item (QUERY/OUTPUT form — includes auto-derived object_type field)"
1028
1028
  },
1029
- "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...'}]"
1029
+ "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."
1030
1030
  }
1031
1031
  },
1032
1032
  "required": [
@@ -1036,7 +1036,7 @@
1036
1036
  "additionalProperties": false,
1037
1037
  "description": "One Guard's submission data: the Guard to verify plus the user-provided data that satisfies its requirements."
1038
1038
  },
1039
- "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:[...]}}"
1039
+ "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:[...]}}"
1040
1040
  }
1041
1041
  },
1042
1042
  "required": [
@@ -103,8 +103,8 @@
103
103
  "description": "Order ID or name."
104
104
  },
105
105
  "description": {
106
- "description": "Dispute description.",
107
- "type": "string"
106
+ "type": "string",
107
+ "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."
108
108
  },
109
109
  "proposition": {
110
110
  "type": "array",
@@ -181,6 +181,7 @@
181
181
  },
182
182
  "required": [
183
183
  "order",
184
+ "description",
184
185
  "proposition",
185
186
  "fee"
186
187
  ],
@@ -219,7 +220,7 @@
219
220
  },
220
221
  "voting_deadline": {
221
222
  "default": null,
222
- "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.",
223
+ "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.",
223
224
  "anyOf": [
224
225
  {
225
226
  "type": "integer",
@@ -255,7 +256,7 @@
255
256
  "type": "null"
256
257
  }
257
258
  ],
258
- "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."
259
+ "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."
259
260
  }
260
261
  },
261
262
  "required": [
@@ -282,7 +283,7 @@
282
283
  "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."
283
284
  },
284
285
  "voting_guard": {
285
- "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.",
286
+ "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.",
286
287
  "type": "string"
287
288
  }
288
289
  },
@@ -573,9 +574,18 @@
573
574
  ]
574
575
  },
575
576
  "owner_receive": {
576
- "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.",
577
+ "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.",
577
578
  "anyOf": [
578
579
  {
580
+ "type": "string",
581
+ "const": "recently"
582
+ },
583
+ {
584
+ "type": "string",
585
+ "pattern": "^0x[0-9a-fA-F]{8,}$"
586
+ },
587
+ {
588
+ "minItems": 1,
579
589
  "type": "array",
580
590
  "items": {
581
591
  "type": "object",
@@ -683,10 +693,6 @@
683
693
  ],
684
694
  "additionalProperties": false,
685
695
  "description": "Received record of Coin objects"
686
- },
687
- {
688
- "type": "string",
689
- "const": "recently"
690
696
  }
691
697
  ]
692
698
  },
@@ -854,6 +860,7 @@
854
860
  "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."
855
861
  },
856
862
  "value_type": {
863
+ "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.",
857
864
  "anyOf": [
858
865
  {
859
866
  "type": "number",
@@ -1140,11 +1147,10 @@
1140
1147
  "const": "vecvecu8",
1141
1148
  "description": "vecvecu8"
1142
1149
  }
1143
- ],
1144
- "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."
1150
+ ]
1145
1151
  },
1146
1152
  "value": {
1147
- "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).",
1153
+ "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).",
1148
1154
  "anyOf": [
1149
1155
  {
1150
1156
  "type": "boolean"
@@ -1303,7 +1309,7 @@
1303
1309
  "additionalProperties": false,
1304
1310
  "description": "Guard table item (QUERY/OUTPUT form — includes auto-derived object_type field)"
1305
1311
  },
1306
- "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...'}]"
1312
+ "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."
1307
1313
  }
1308
1314
  },
1309
1315
  "required": [
@@ -1313,7 +1319,7 @@
1313
1319
  "additionalProperties": false,
1314
1320
  "description": "One Guard's submission data: the Guard to verify plus the user-provided data that satisfies its requirements."
1315
1321
  },
1316
- "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:[...]}}"
1322
+ "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:[...]}}"
1317
1323
  }
1318
1324
  },
1319
1325
  "required": [
@@ -219,9 +219,18 @@
219
219
  ]
220
220
  },
221
221
  "owner_receive": {
222
- "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.",
222
+ "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.",
223
223
  "anyOf": [
224
224
  {
225
+ "type": "string",
226
+ "const": "recently"
227
+ },
228
+ {
229
+ "type": "string",
230
+ "pattern": "^0x[0-9a-fA-F]{8,}$"
231
+ },
232
+ {
233
+ "minItems": 1,
225
234
  "type": "array",
226
235
  "items": {
227
236
  "type": "object",
@@ -329,10 +338,6 @@
329
338
  ],
330
339
  "additionalProperties": false,
331
340
  "description": "Received record of Coin objects"
332
- },
333
- {
334
- "type": "string",
335
- "const": "recently"
336
341
  }
337
342
  ]
338
343
  }
@@ -488,6 +493,7 @@
488
493
  "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."
489
494
  },
490
495
  "value_type": {
496
+ "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.",
491
497
  "anyOf": [
492
498
  {
493
499
  "type": "number",
@@ -774,11 +780,10 @@
774
780
  "const": "vecvecu8",
775
781
  "description": "vecvecu8"
776
782
  }
777
- ],
778
- "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."
783
+ ]
779
784
  },
780
785
  "value": {
781
- "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).",
786
+ "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).",
782
787
  "anyOf": [
783
788
  {
784
789
  "type": "boolean"
@@ -937,7 +942,7 @@
937
942
  "additionalProperties": false,
938
943
  "description": "Guard table item (QUERY/OUTPUT form — includes auto-derived object_type field)"
939
944
  },
940
- "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...'}]"
945
+ "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."
941
946
  }
942
947
  },
943
948
  "required": [
@@ -947,7 +952,7 @@
947
952
  "additionalProperties": false,
948
953
  "description": "One Guard's submission data: the Guard to verify plus the user-provided data that satisfies its requirements."
949
954
  },
950
- "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:[...]}}"
955
+ "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:[...]}}"
951
956
  }
952
957
  },
953
958
  "required": [
@@ -357,9 +357,18 @@
357
357
  ]
358
358
  },
359
359
  "owner_receive": {
360
- "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.",
360
+ "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.",
361
361
  "anyOf": [
362
362
  {
363
+ "type": "string",
364
+ "const": "recently"
365
+ },
366
+ {
367
+ "type": "string",
368
+ "pattern": "^0x[0-9a-fA-F]{8,}$"
369
+ },
370
+ {
371
+ "minItems": 1,
363
372
  "type": "array",
364
373
  "items": {
365
374
  "type": "object",
@@ -467,10 +476,6 @@
467
476
  ],
468
477
  "additionalProperties": false,
469
478
  "description": "Received record of Coin objects"
470
- },
471
- {
472
- "type": "string",
473
- "const": "recently"
474
479
  }
475
480
  ]
476
481
  },
@@ -638,6 +643,7 @@
638
643
  "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."
639
644
  },
640
645
  "value_type": {
646
+ "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.",
641
647
  "anyOf": [
642
648
  {
643
649
  "type": "number",
@@ -924,11 +930,10 @@
924
930
  "const": "vecvecu8",
925
931
  "description": "vecvecu8"
926
932
  }
927
- ],
928
- "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."
933
+ ]
929
934
  },
930
935
  "value": {
931
- "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).",
936
+ "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).",
932
937
  "anyOf": [
933
938
  {
934
939
  "type": "boolean"
@@ -1087,7 +1092,7 @@
1087
1092
  "additionalProperties": false,
1088
1093
  "description": "Guard table item (QUERY/OUTPUT form — includes auto-derived object_type field)"
1089
1094
  },
1090
- "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...'}]"
1095
+ "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."
1091
1096
  }
1092
1097
  },
1093
1098
  "required": [
@@ -1097,7 +1102,7 @@
1097
1102
  "additionalProperties": false,
1098
1103
  "description": "One Guard's submission data: the Guard to verify plus the user-provided data that satisfies its requirements."
1099
1104
  },
1100
- "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:[...]}}"
1105
+ "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:[...]}}"
1101
1106
  }
1102
1107
  },
1103
1108
  "required": [
@@ -80,6 +80,7 @@
80
80
  "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."
81
81
  },
82
82
  "value_type": {
83
+ "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.",
83
84
  "anyOf": [
84
85
  {
85
86
  "type": "number",
@@ -366,11 +367,10 @@
366
367
  "const": "vecvecu8",
367
368
  "description": "vecvecu8"
368
369
  }
369
- ],
370
- "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."
370
+ ]
371
371
  },
372
372
  "value": {
373
- "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).",
373
+ "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).",
374
374
  "anyOf": [
375
375
  {
376
376
  "type": "boolean"
@@ -529,7 +529,7 @@
529
529
  "additionalProperties": false,
530
530
  "description": "Guard table item (QUERY/OUTPUT form — includes auto-derived object_type field)"
531
531
  },
532
- "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...'}]"
532
+ "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."
533
533
  }
534
534
  },
535
535
  "required": [
@@ -539,7 +539,7 @@
539
539
  "additionalProperties": false,
540
540
  "description": "One Guard's submission data: the Guard to verify plus the user-provided data that satisfies its requirements."
541
541
  },
542
- "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:[...]}}"
542
+ "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:[...]}}"
543
543
  }
544
544
  },
545
545
  "required": [
@@ -55,7 +55,7 @@
55
55
  ]
56
56
  },
57
57
  "about_address": {
58
- "description": "About address. Accepts null/undefined (→ Move Option::none). When provided, must be a raw 0x-prefixed address (NOT a name).",
58
+ "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).",
59
59
  "anyOf": [
60
60
  {
61
61
  "type": "string",