@wowok/agent-mcp 3.2.2 → 3.2.3

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 (134) hide show
  1. package/dist/chain-semantics/field-capability.d.ts +11 -0
  2. package/dist/chain-semantics/field-capability.js +1 -0
  3. package/dist/chain-semantics/freeze-map.d.ts +11 -0
  4. package/dist/chain-semantics/freeze-map.js +1 -0
  5. package/dist/chain-semantics/fund-flow.d.ts +10 -0
  6. package/dist/chain-semantics/fund-flow.js +1 -0
  7. package/dist/chain-semantics/guard-verbs.d.ts +22 -0
  8. package/dist/chain-semantics/guard-verbs.js +1 -0
  9. package/dist/chain-semantics/index.d.ts +10 -0
  10. package/dist/chain-semantics/index.js +1 -0
  11. package/dist/chain-semantics/object-graph.d.ts +18 -0
  12. package/dist/chain-semantics/object-graph.js +1 -0
  13. package/dist/composition/audit.d.ts +10 -0
  14. package/dist/composition/audit.js +1 -0
  15. package/dist/composition/compile.d.ts +38 -0
  16. package/dist/composition/compile.js +1 -0
  17. package/dist/composition/materialize.d.ts +64 -0
  18. package/dist/composition/materialize.js +1 -0
  19. package/dist/composition/plan.d.ts +92 -0
  20. package/dist/composition/plan.js +1 -0
  21. package/dist/composition/reflux.d.ts +28 -0
  22. package/dist/composition/reflux.js +1 -0
  23. package/dist/evaluation/builtins/graph-service.spec.js +1 -1
  24. package/dist/evaluation/engine.js +1 -1
  25. package/dist/experience/realtime-feedback.js +1 -1
  26. package/dist/extensions/business-modules.js +1 -1
  27. package/dist/extensions/industry-pack.js +1 -1
  28. package/dist/extensions/modes.js +1 -1
  29. package/dist/graph/onchain/expand.js +1 -1
  30. package/dist/graph/onchain/exposure.js +1 -1
  31. package/dist/graph/onchain/facts.js +1 -1
  32. package/dist/keeper/detectors.d.ts +7 -0
  33. package/dist/keeper/detectors.js +1 -1
  34. package/dist/keeper/types.d.ts +1 -1
  35. package/dist/keeper/types.js +1 -1
  36. package/dist/knowledge/allocation-ledger.js +1 -1
  37. package/dist/knowledge/allocation-puzzle.js +1 -1
  38. package/dist/knowledge/allocation-risk.js +1 -1
  39. package/dist/knowledge/allocation-templates.js +1 -1
  40. package/dist/knowledge/arb-fund-facts.d.ts +31 -0
  41. package/dist/knowledge/arb-fund-facts.js +1 -0
  42. package/dist/knowledge/baselines/rules/allocation.json +44 -15
  43. package/dist/knowledge/baselines/rules/guard.json +27 -8
  44. package/dist/knowledge/baselines/rules/plan.json +161 -0
  45. package/dist/knowledge/baselines/semantic-facts.d.ts +12 -0
  46. package/dist/knowledge/baselines/semantic-facts.js +1 -0
  47. package/dist/knowledge/builtin-templates.d.ts +1 -1
  48. package/dist/knowledge/builtin-templates.js +1 -1
  49. package/dist/knowledge/getting-started.js +1 -1
  50. package/dist/knowledge/guard-design-patterns.js +1 -1
  51. package/dist/knowledge/guard-ledger.js +1 -1
  52. package/dist/knowledge/guard-risk.js +1 -1
  53. package/dist/knowledge/guard-templates.js +1 -1
  54. package/dist/knowledge/index.js +1 -1
  55. package/dist/knowledge/industry-registry.js +1 -1
  56. package/dist/knowledge/jsonrpc-enum.js +1 -1
  57. package/dist/knowledge/onchain-constants.d.ts +2 -2
  58. package/dist/knowledge/onchain-constants.js +1 -1
  59. package/dist/knowledge/scenario-modes.d.ts +12 -0
  60. package/dist/knowledge/service-allocation-semantics.js +1 -1
  61. package/dist/knowledge/service-ledger.js +1 -1
  62. package/dist/knowledge/service-templates.js +1 -1
  63. package/dist/knowledge/strategy-manuals.js +1 -1
  64. package/dist/knowledge/template-loader.d.ts +16 -1
  65. package/dist/knowledge/template-loader.js +1 -1
  66. package/dist/knowledge/template-registry.js +1 -1
  67. package/dist/knowledge/template-scanner.js +1 -1
  68. package/dist/knowledge/tools-reference.js +1 -1
  69. package/dist/knowledge/workflow-guidance.js +1 -1
  70. package/dist/monitor/MonitorLoop.js +1 -1
  71. package/dist/participation/radar-core.d.ts +6 -0
  72. package/dist/participation/radar-core.js +1 -1
  73. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  74. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  75. package/dist/playbooks/service-build/merchant-guide.js +1 -1
  76. package/dist/playbooks/service-build/migration-planner.js +1 -1
  77. package/dist/playbooks/service-build/object-panorama.js +1 -1
  78. package/dist/playbooks/service-build/participation-radar.js +1 -1
  79. package/dist/playbooks/service-build/relationship-profile.js +1 -1
  80. package/dist/playbooks/service-build/service-panorama.js +1 -1
  81. package/dist/playbooks/service-build/service-quote.js +1 -1
  82. package/dist/review/index.js +1 -1
  83. package/dist/safety/confirm-gate.js +1 -1
  84. package/dist/schema/call/order.d.ts +60 -0
  85. package/dist/schema/call/order.js +1 -1
  86. package/dist/schema/call/semantic.js +1 -1
  87. package/dist/schema/call/service.d.ts +56 -0
  88. package/dist/schema/call/service.js +1 -1
  89. package/dist/schema/common/index.js +1 -1
  90. package/dist/schema/index.d.ts +1 -0
  91. package/dist/schema/index.js +1 -1
  92. package/dist/schema/industry-pack/index.d.ts +2 -0
  93. package/dist/schema/industry-pack/index.js +1 -1
  94. package/dist/schema/local/index.js +1 -1
  95. package/dist/schema/operations.d.ts +48 -0
  96. package/dist/schema/query/index.js +1 -1
  97. package/dist/schema/schema-version.js +1 -1
  98. package/dist/schema/service-clone/index.d.ts +46 -0
  99. package/dist/schema/service-clone/index.js +1 -0
  100. package/dist/schema-query-impl/index.js +1 -1
  101. package/dist/schemas/index.json +7 -1
  102. package/dist/schemas/industry_pack_operation.output.json +4 -0
  103. package/dist/schemas/industry_pack_operation.schema.json +4 -0
  104. package/dist/schemas/onchain_operations.output.json +1 -1
  105. package/dist/schemas/onchain_operations.schema.json +405 -94
  106. package/dist/schemas/onchain_operations_allocation.schema.json +5 -5
  107. package/dist/schemas/onchain_operations_arbitration.schema.json +2 -2
  108. package/dist/schemas/onchain_operations_contact.schema.json +1 -1
  109. package/dist/schemas/onchain_operations_demand.schema.json +3 -3
  110. package/dist/schemas/onchain_operations_gen_passport.schema.json +1 -1
  111. package/dist/schemas/onchain_operations_guard.schema.json +59 -59
  112. package/dist/schemas/onchain_operations_machine.schema.json +1 -1
  113. package/dist/schemas/onchain_operations_order.schema.json +133 -1
  114. package/dist/schemas/onchain_operations_progress.schema.json +1 -1
  115. package/dist/schemas/onchain_operations_proof.schema.json +1 -1
  116. package/dist/schemas/onchain_operations_repository.schema.json +1 -1
  117. package/dist/schemas/onchain_operations_reward.schema.json +4 -4
  118. package/dist/schemas/onchain_operations_service.schema.json +186 -7
  119. package/dist/schemas/onchain_operations_treasury.schema.json +7 -7
  120. package/dist/schemas/query_toolkit.output.json +45 -45
  121. package/dist/schemas/service_clone_operation.output.json +168 -0
  122. package/dist/schemas/service_clone_operation.schema.json +49 -0
  123. package/dist/schemas/workflow_operation.schema.json +1 -1
  124. package/dist/tools/handlers/config.js +1 -1
  125. package/dist/tools/handlers/industry-pack.js +1 -1
  126. package/dist/tools/handlers/onchain.js +1 -1
  127. package/dist/tools/handlers/query.js +1 -1
  128. package/dist/tools/handlers/service-clone.d.ts +2 -0
  129. package/dist/tools/handlers/service-clone.js +1 -0
  130. package/dist/tools/index.js +1 -1
  131. package/dist/tools/registry/business.js +1 -1
  132. package/dist/tools/wrap.d.ts +6 -1
  133. package/dist/tools/wrap.js +1 -1
  134. package/package.json +2 -2
@@ -1014,7 +1014,7 @@
1014
1014
  }
1015
1015
  },
1016
1016
  "order_allocators": {
1017
- "description": "Order fund allocator. Max 100 allocators (MAX_ALLOCATOR_COUNT). ✅ EACH allocator has a guard, and EVERY allocator whose guard address matches the supplied guard RUNS — they are NOT mutually exclusive and NOT first-match-wins. One guard may legitimately authorize several distribution rules (different fix / rate / cap); each contributes its own Payment and consumes its own once-slot (keyed by the allocator index). Allocators are evaluated in vector order against the SHRINKING pool, so a later allocator only sees the balance left by the earlier ones — which is exactly how a waterfall (e.g. Amount fee + net Rate split) is built. On-chain truth: wow::allocation (allocation.move:366-368, `while` loop over all allocators, `if (guard address == alloc.guard)`). ⚠️ If you WANT mutual exclusion you must express it inside the Guard itself (make the conditions logically exclusive). Set to null to clear. ⚠️ PERMANENTLY IMMUTABLE after publish: order_allocators can ONLY be set BEFORE publish=true (on-chain check rejects after publish — E_ALREADY_PUBLISHED). After publish, the ONLY way to change allocation rules is to create a NEW Service object. There is NO pause+lock exception for order_allocators (unlike arbitrations/rewards which have time-lock removal). PRE-PUBLISH CHECKLIST: verify all guard names resolve, all sharing amounts are correct, threshold is set, and recipient types (Entity/Signer/GuardIdentifier) are intended before calling publish=true. GuardIdentifier sharing mode: {who: {GuardIdentifier: <u8>}, sharing: <rate>, mode: 'Rate'} — resolves recipient from the Guard table submission at allocation time. BINDING SEMANTICS (contract-enforced, abort code 15): in a Service-created Allocation EVERY GuardIdentifier submission must equal the PAYING order — it is always 'the order', never a third party whose address is supplied at trigger time; use {who:{Entity:...}} for named parties. Canonical order pattern: the recipient slot is the single submitted Order (constrained by the Guard — service binding, qualifying node, signer==order.owner); funds land at that order object and are receivable only by its owner (object receipt = owner receipt). Safety is determined by constraint sufficiency — run the recipient constraint audit before publish. Fixed recipients should use {who:{Entity:...}}; unbound Signer recipients are a CRITICAL theft risk. MULTI-CALL ALLOCATION: an allocation can be executed MULTIPLE times (no consumed flag in contract). Use Amount mode (not Surplus) for recurring allocations — Surplus calls balance::withdraw_all which drains the balance. For monthly payment scenarios, create multiple Allocators with time-based Guards + Amount mode sharing items.",
1017
+ "description": "Order fund allocator. Max 100 allocators (MAX_ALLOCATOR_COUNT). ✅ EACH allocator has a guard, and EVERY allocator whose guard address matches the supplied guard RUNS — they are NOT mutually exclusive and NOT first-match-wins. One guard may legitimately authorize several distribution rules (different fix / rate / cap); each contributes its own Payment and consumes its own once-slot (keyed by the allocator index). Allocators are evaluated in vector order against the SHRINKING pool, so a later allocator only sees the balance left by the earlier ones — which is exactly how a waterfall (e.g. Amount fee + net Rate split) is built. On-chain truth: wow::allocation (allocation.move:429-431, `while` loop over all allocators, `if (guard address == alloc.guard)`). ⚠️ If you WANT mutual exclusion you must express it inside the Guard itself (make the conditions logically exclusive). Set to null to clear. ⚠️ IMMUTABLE after publish except APPEND: order_allocators full replacement can ONLY be done BEFORE publish=true (on-chain check rejects after publish — E_ALREADY_PUBLISHED). After publish, the ONLY mutation is order_allocators_append (prefix-frozen extension — see that field). There is NO pause+lock exception for order_allocators (unlike arbitrations/rewards which have time-lock removal). PRE-PUBLISH CHECKLIST: verify all guard names resolve, all sharing amounts are correct, threshold is set, and recipient types (Entity/Signer/GuardIdentifier) are intended before calling publish=true. GuardIdentifier sharing mode: {who: {GuardIdentifier: <u8>}, sharing: <rate>, mode: 'Rate'} — resolves recipient from the Guard table submission at allocation time. BINDING SEMANTICS (contract-enforced, abort code 15): in a Service-created Allocation EVERY GuardIdentifier submission must equal the PAYING order — it is always 'the order', never a third party whose address is supplied at trigger time; use {who:{Entity:...}} for named parties. Canonical order pattern: the recipient slot is the single submitted Order (constrained by the Guard — service binding, qualifying node, signer==order.owner); funds land at that order object and are receivable only by its owner (object receipt = owner receipt). Safety is determined by constraint sufficiency — run the recipient constraint audit before publish. Fixed recipients should use {who:{Entity:...}}; unbound Signer recipients are a CRITICAL theft risk. MULTI-CALL ALLOCATION: an allocation can be executed MULTIPLE times (no consumed flag in contract). Use Amount mode (not Surplus) for recurring allocations — an uncapped Surplus sweeps the entire remaining balance on first run. For monthly payment scenarios, create multiple Allocators with time-based Guards + Amount mode sharing items.",
1018
1018
  "anyOf": [
1019
1019
  {
1020
1020
  "type": "object",
@@ -1042,7 +1042,7 @@
1042
1042
  "properties": {
1043
1043
  "guard": {
1044
1044
  "type": "string",
1045
- "description": "Guard object ID or name. If Guard verification passes (via Passport), fund allocation for THIS Allocator fires. Each Allocator in an Allocators list can have a different Guard — the first Allocator whose Guard returns true wins. This enables mutually exclusive allocation paths (e.g., refund Guard on 'return_approved' node vs damage Guard on 'damage_confirmed' node)."
1045
+ "description": "Guard object ID or name. A distribution call submits ONE guard; EVERY Allocator bound to that guard fires — in vector order, each against the balance left by the previous (allocation.move:366-368: the loop matches the submitted guard address, it does NOT evaluate guards competitively). NOT first-match-wins: Allocators with different guards are alternative distribution paths selected by the caller's choice of guard (e.g., a refund guard vs a damage guard), and mutual exclusion must be expressed inside the Guard conditions themselves, never assumed from ordering."
1046
1046
  },
1047
1047
  "sharing": {
1048
1048
  "type": "array",
@@ -1058,7 +1058,7 @@
1058
1058
  "type": "integer",
1059
1059
  "minimum": 0,
1060
1060
  "maximum": 255,
1061
- "description": "Identifier (0-255) for data lookup in Guard table."
1061
+ "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)."
1062
1062
  }
1063
1063
  },
1064
1064
  "required": [
@@ -1184,7 +1184,7 @@
1184
1184
  "additionalProperties": false,
1185
1185
  "description": "Fund allocator — a complete allocation strategy triggered by a Guard. Contains a sharing[] array where items can mix Amount/Rate/RateGross/Surplus modes. When the Guard passes, the contract allocates funds in strict order: Amount → Rate/RateGross → Surplus."
1186
1186
  },
1187
- "description": "Fund allocator list. Each allocator is evaluated in order; the FIRST allocator whose Guard passes wins. This enables mutually exclusive allocation paths (e.g., 3 allocators for 3 forward paths: refund / damage-deduct / arbitrate)."
1187
+ "description": "Fund allocator list. NOT first-match-wins: a distribution call submits ONE guard and EVERY allocator bound to that guard fires, in vector order, each against the shrinking pool left by the previous (this is how a waterfall like Amount fee + net Rate split is built). Alternative paths (e.g., refund / damage-deduct / arbitrate) are expressed as allocators bound to DIFFERENT guards; the caller's submitted guard selects the path."
1188
1188
  }
1189
1189
  },
1190
1190
  "required": [
@@ -1193,13 +1193,192 @@
1193
1193
  "allocators"
1194
1194
  ],
1195
1195
  "additionalProperties": false,
1196
- "description": "Fund allocator list — the top-level allocation configuration attached to an Order. Contains a threshold and a list of Allocators. When funds arrive at the Order, the first Allocator whose Guard passes executes its sharing[] in strict order: Amount → Rate/RateGross → Surplus. MULTI-TIER ALLOCATION (DOC-04): Each Order binds ONE Allocators template (set on Service.order_allocators before publish). For multi-tier distribution (e.g., customer→agency→suppliers), use a two-phase approach: (1) Tier-1 Allocators on the customer's Order (allocates to agency + refund fund); (2) Tier-2 Allocators on a NEW Order created by the agency (allocates agency's received funds to suppliers). Each tier's NET Rate-mode sharing[] must independently sum to 10000 (or <= 10000 with Surplus); RateGross-mode sharing[] must sum to <= 10000."
1196
+ "description": "Fund allocator list — the top-level allocation configuration attached to an Order. Contains a threshold and a list of Allocators. A distribution call submits ONE guard; every Allocator bound to that guard executes its sharing[] in strict order (Amount → Rate/RateGross → Surplus) against the shrinking pool. MULTI-TIER ALLOCATION (DOC-04): Each Order binds ONE Allocators template (set on Service.order_allocators before publish). For multi-tier distribution (e.g., customer→agency→suppliers), use a two-phase approach: (1) Tier-1 Allocators on the customer's Order (allocates to agency + refund fund); (2) Tier-2 Allocators on a NEW Order created by the agency (allocates agency's received funds to suppliers). Each tier's NET Rate-mode sharing[] must independently sum to 10000 (or <= 10000 with Surplus); RateGross-mode sharing[] must sum to <= 10000."
1197
1197
  },
1198
1198
  {
1199
1199
  "type": "null"
1200
1200
  }
1201
1201
  ]
1202
1202
  },
1203
+ "order_allocators_append": {
1204
+ "description": "Append-only correction window for order_allocators — the ONLY allocator mutation allowed AFTER publish (J1). REQUIREMENTS (chain-enforced, allocation abort code 20 EALLOCATORS_NOT_EXTENSION): the supplied Allocators must be a pure EXTENSION of the current on-chain plan — every existing allocator appears VERBATIM as a prefix (same guard, same sharing, same fix/max), threshold must be UNCHANGED; only description may change freely. New allocators are appended after the prefix. WHY: rewriting an existing allocator or changing the threshold would retroactively alter payout rules for orders already escrowed against the old plan. Clearing the plan (null) is NOT possible here — that would strand in-flight orders. Permission: same index 313 as order_allocators. USE CASE: you forgot one allocator guard (e.g. the refund exit for a review node) and the Service is already published — instead of abandoning the Service, append the missing allocator. ⚠️ Appended allocators are evaluated AFTER the existing ones against the shrinking pool (vector order), so they see the balance left by earlier allocators — design appended waterfall tails accordingly. ⚠️ Once appended, an allocator can NEVER be edited or removed — same permanence as the original plan.",
1205
+ "type": "object",
1206
+ "properties": {
1207
+ "description": {
1208
+ "type": "string",
1209
+ "description": "Description of fund allocator list"
1210
+ },
1211
+ "threshold": {
1212
+ "default": 0,
1213
+ "description": "Minimum balance required for allocation to fire. When the Allocation object's balance < threshold, allocation aborts with EINSUFFICIENT_BALANCE=7. Also: when an Allocator has only Amount items (no Rate, no Surplus), the sum of Amount items must be >= threshold (EAMOUNT_BELOW_THRESHOLD=12). Set to 0 (default) to allow any balance.",
1214
+ "anyOf": [
1215
+ {
1216
+ "type": "number"
1217
+ },
1218
+ {
1219
+ "type": "string"
1220
+ }
1221
+ ]
1222
+ },
1223
+ "allocators": {
1224
+ "type": "array",
1225
+ "items": {
1226
+ "type": "object",
1227
+ "properties": {
1228
+ "guard": {
1229
+ "type": "string",
1230
+ "description": "Guard object ID or name. A distribution call submits ONE guard; EVERY Allocator bound to that guard fires — in vector order, each against the balance left by the previous (allocation.move:366-368: the loop matches the submitted guard address, it does NOT evaluate guards competitively). NOT first-match-wins: Allocators with different guards are alternative distribution paths selected by the caller's choice of guard (e.g., a refund guard vs a damage guard), and mutual exclusion must be expressed inside the Guard conditions themselves, never assumed from ordering."
1231
+ },
1232
+ "sharing": {
1233
+ "type": "array",
1234
+ "items": {
1235
+ "type": "object",
1236
+ "properties": {
1237
+ "who": {
1238
+ "anyOf": [
1239
+ {
1240
+ "type": "object",
1241
+ "properties": {
1242
+ "GuardIdentifier": {
1243
+ "type": "integer",
1244
+ "minimum": 0,
1245
+ "maximum": 255,
1246
+ "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)."
1247
+ }
1248
+ },
1249
+ "required": [
1250
+ "GuardIdentifier"
1251
+ ],
1252
+ "additionalProperties": false,
1253
+ "description": "Guard verified recipient ID. Get recipient ID from specified data index in Guard table. The ID must be of address type."
1254
+ },
1255
+ {
1256
+ "type": "object",
1257
+ "properties": {
1258
+ "Entity": {
1259
+ "type": "object",
1260
+ "properties": {
1261
+ "name_or_address": {
1262
+ "type": "string",
1263
+ "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)."
1264
+ },
1265
+ "local_mark_first": {
1266
+ "description": "Whether to prioritize local marks, if true, prioritize local marks, otherwise prioritize global marks",
1267
+ "type": "boolean"
1268
+ }
1269
+ },
1270
+ "additionalProperties": false,
1271
+ "description": "Account or address lookup object. Use this to specify which account to use for an operation. EXAMPLE: { name_or_address: 'testor2' } - looks up account by name; EXAMPLE: { name_or_address: '0x1234...' } - uses address directly; If name_or_address is empty string '', uses the default local account."
1272
+ }
1273
+ },
1274
+ "required": [
1275
+ "Entity"
1276
+ ],
1277
+ "additionalProperties": false,
1278
+ "description": "Static address resolved via LocalMark. Format: {Entity: {name_or_address: 'mark_name'}} — NOTE: Entity is an OBJECT with name_or_address field, NOT a bare string."
1279
+ },
1280
+ {
1281
+ "type": "object",
1282
+ "properties": {
1283
+ "Signer": {
1284
+ "type": "string",
1285
+ "const": "signer"
1286
+ }
1287
+ },
1288
+ "required": [
1289
+ "Signer"
1290
+ ],
1291
+ "additionalProperties": false,
1292
+ "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."
1293
+ }
1294
+ ],
1295
+ "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)."
1296
+ },
1297
+ "sharing": {
1298
+ "anyOf": [
1299
+ {
1300
+ "type": "number"
1301
+ },
1302
+ {
1303
+ "type": "string"
1304
+ }
1305
+ ],
1306
+ "description": "Allocation value. SEMANTICS DEPEND ON `mode`:\n• mode='Amount': absolute amount in smallest unit (e.g., '750000000' for 0.75 WOW, '250000000' for 0.25 WOW). Allocated first; sum of Amount items cached as `fix`.\n• mode='Rate' (NET): basis-points rate off the post-fix base (balance - fix, or max - fix), 10000 = 100% (e.g., '7500' for 75%, '2500' for 25%). When no Surplus in same Allocator, sum MUST == 10000; when Surplus present, sum MUST <= 10000.\n• mode='RateGross': basis-points rate off the FULL pool (balance) or the `max` cap — the fixed Amount total is NOT subtracted, 10000 = 100%. sum MUST <= 10000 (and, with `max` set, fix×10000 + sum×max <= max×10000). Cannot be mixed with mode='Rate' in the same Allocator while a fixed Amount total is present.\n• mode='Surplus': IGNORED (contract forces to 0). Set to '0' for clarity. Receives remaining balance after Amount + Rate/RateGross allocations.\n⚠️ T1 LOSSY POINT (B-2): the value is PRE-CONFIGURED and STATIC. A continuous/conditional amount (e.g. 'pay exactly the assessed loss amount') CANNOT be expressed — there is no runtime formula field. Model variable payouts as (a) a fixed-tier Allocator list guarded by distinct Guards, or (b) an Amount with a `max` cap — both are finite configurations, not free-form formulas."
1307
+ },
1308
+ "mode": {
1309
+ "anyOf": [
1310
+ {
1311
+ "type": "string",
1312
+ "enum": [
1313
+ "Amount",
1314
+ "Rate",
1315
+ "Surplus",
1316
+ "RateGross"
1317
+ ]
1318
+ },
1319
+ {}
1320
+ ],
1321
+ "description": "Allocation mode — determines how the `sharing` field is interpreted. Four modes can be used individually OR combined within a single Allocator; when combined, allocation order is strictly: Amount first, then Rate/RateGross, then Surplus. Understanding these modes allows modeling almost any fund distribution pattern.\n• Amount (0): `sharing` is a FIXED amount in smallest unit (e.g., '750000000' = 0.75 WOW). Allocated FIRST; sum of all Amount items is cached as `fix` by the contract. Validation: when no Rate and no Surplus items exist, sum of Amount items must be >= allocators.threshold (EAMOUNT_BELOW_THRESHOLD=12); when `max` is set, sum of Amount items must be <= max (EAMOUNT_EXCEEDS_MAX=13).\n• Rate (1): `sharing` is a NET basis-points rate (10000 = 100%). Allocated AFTER Amount; formula: allocated = (sharing × total_rates) / 10000, where total_rates = balance - fix (or max - fix if `max` is set) — the cached fixed Amount total IS subtracted. Validation: when no Surplus items exist, sum of all Rate items must be EXACTLY 10000 (ERATE_NOT_10000=4); when Surplus items exist, sum of all Rate items must be <= 10000 (ERATE_EXCEEDS_10000=6).\n• RateGross (3): `sharing` is a GROSS basis-points rate (10000 = 100%). Allocated AFTER Amount; formula: allocated = (sharing × total_rates) / 10000, where total_rates = balance (the full pool) or the `max` cap when set — the fixed Amount total is NOT subtracted, so fixed Amount entries and percentage-of-total rates coexist exactly. Validation: sum of all RateGross items must be <= 10000 (ERATE_EXCEEDS_10000=6); when `max` is set, fix×10000 + sum(rate)×max <= max×10000 must hold (6); with no `max` and a fixed total > 0, sum of RateGross items must be < 10000 (6). RateGross cannot be mixed with NET Rate entries in the same Allocator while a fixed Amount total is present (EMIXED_RATE_BASES=17).\n• Surplus (2): `sharing` is IGNORED (contract forces it to 0). Allocated LAST; receives the remaining balance after Amount + Rate allocations. Validation: MAX ONE Surplus item per Allocator (EMULTIPLE_SURPLUS=5). When Surplus exists, Rate sum constraint relaxes from == 10000 to <= 10000.\nALLOCATION ORDER (strict): Amount items (fixed, cached as fix) → Rate/RateGross items → Surplus item (remaining).\nRECOMMENDATION: Use Amount mode for known fixed amounts (clearer, no sum constraint). Use Rate mode for proportional splits off the post-fix remainder (requires sum == 10000 unless Surplus present). Use RateGross mode for a percentage of the FULL pool/`max` that must coexist with fixed Amount entries. Use Surplus to capture remainder (e.g., platform fee + host gets rest). Accepts string ('Amount'/'Rate'/'Surplus'/'RateGross', recommended) or number (0/1/2/3)."
1322
+ }
1323
+ },
1324
+ "required": [
1325
+ "who",
1326
+ "sharing",
1327
+ "mode"
1328
+ ],
1329
+ "additionalProperties": false,
1330
+ "description": "Fund allocation item — one recipient's share of the Allocation balance. The `sharing` value's meaning depends on `mode` (see AllocationModeSchema). Multiple items in the same Allocator are evaluated together: Amount items first, Rate/RateGross items second, Surplus last."
1331
+ },
1332
+ "description": "Fund allocation item list. Each item specifies a recipient (who), a value (sharing), and a mode. Items can mix modes (Amount + Rate/RateGross + Surplus) within the same Allocator. RECIPIENT SEMANTICS: the Guard constrains what each submission slot may be; a recipient's safety follows from the sufficiency of those constraints (run the recipient constraint audit). Canonical order pattern: recipient = the single submitted Order — funds land at that object and are receivable only by its owner. ALLOCATION ORDER: Amount items first (cached as fix) → Rate items (proportional to balance - fix; RateGross proportional to the full pool) → Surplus item (remaining). CONSTRAINTS: max ONE Surplus item per Allocator; NET Rate sum must == 10000 (no Surplus) or <= 10000 (with Surplus); RateGross sum must <= 10000 (never mixed with NET Rate while a fixed total is present); Amount sum must >= threshold (no Rate and no Surplus) and <= max (if max set)."
1333
+ },
1334
+ "fix": {
1335
+ "description": "OUTPUT-ONLY (query result). Cached sum of all Amount-mode `sharing` values in this Allocator. Computed by the contract when the allocator is added — DO NOT set this field at creation. Used internally to compute `total_rates = balance - fix` for NET Rate allocation (RateGross ignores fix and uses the full pool/`max`).",
1336
+ "anyOf": [
1337
+ {
1338
+ "type": "number"
1339
+ },
1340
+ {
1341
+ "type": "string"
1342
+ }
1343
+ ]
1344
+ },
1345
+ "max": {
1346
+ "description": "Maximum allocation cap (OPTIONAL — omit the field or set to null to disable the cap; do NOT set to 0 as that means a cap of zero). Passed through to the contract as Option<u64> when the allocator is added: when null/omitted the contract treats it as `none` (no cap); when set, the contract enforces it. Has THREE effects when set:\n1. Construction: sum of Amount items must be <= max (EAMOUNT_EXCEEDS_MAX=13)\n2. Rate execution: NET Rate total_rates = max - fix; RateGross total_rates = max (fix NOT subtracted)\n3. Surplus execution: surplus_amount = max - alloced_amount (instead of balance - alloced_amount)\nUse when you want to cap total allocation regardless of Order balance (e.g., cap payout to declared amount). SDK pre-validates Amount sum <= max at build time to give actionable error messages before on-chain abort.",
1347
+ "anyOf": [
1348
+ {
1349
+ "anyOf": [
1350
+ {
1351
+ "type": "number"
1352
+ },
1353
+ {
1354
+ "type": "string"
1355
+ }
1356
+ ],
1357
+ "description": "A coin/balance amount. Accepts three formats: (1) DISPLAY FORMAT with token symbol: \"2.5WOW\", \"10USDC\", \"0.05WOW\" — auto-converted to smallest units via the Fund Processing Layer (token precision resolved from official registry → cache → on-chain). The symbol MUST match the token's type_parameter. (2) SMALLEST UNIT (numeric string): \"10000000000\" — used as-is, no conversion. (3) SMALLEST UNIT (number): 10000000000 — used as-is only within the safe integer range (±2^53); numbers outside it are REJECTED, use a numeric string instead. PRECISION RULE: for values exceeding 2^53 (9007199254740991), ALWAYS use format (1) or (2) — JS numbers lose integer precision silently and such inputs are blocked. Raw amounts must be plain non-negative integers; a decimal value without a token symbol (e.g. \"2.5\") is rejected — append the symbol (\"2.5WOW\") so the Fund Processing Layer converts it. WARNING — BARE INTEGER MEANS SMALLEST UNIT, NOT TOKENS: formats (2)/(3) are NEVER interpreted as display tokens. For example amount=\"5\" or 5 means 5 raw units = 0.000000005 WOW (9 decimals) — NOT 5 WOW. When the user asks for a token amount, you MUST use display format (\"5WOW\", \"2USDC\"); a bare integer is only correct for unitless counts (e.g. stock quantity) or when you computed exact raw units yourself. Default token: WOW (9 decimals, 1 WOW = 10^9 MIST). For custom tokens: use display format with the token's symbol, or pass smallest units directly. MONEY CONFIRMATION: all monetary fields trigger user confirmation via the Fund Processing Layer, where the token's FULL type, decimals and raw amount are always visible. MULTIPLE ISSUERS: several on-chain tokens may legally share the same symbol (e.g. multiple \"USDT\" coins). When a bare symbol matches more than one token, the operation is BLOCKED and every candidate is listed with full details (type, name, decimals, verified tag) — present the list to the USER and let them choose (they may answer by number), then re-issue with the chosen token's FULL type string in type_parameter; never guess an issuer from the bare symbol. MISSING TOKEN INFO: when a token's precision cannot be resolved, the operation is REFUSED (raw u64 included — amount magnitude could not be verified). Recovery: provide the token's FULL type in package::module::Name form in type_parameter (a bare symbol like \"USDT\" cannot be resolved), and verify the WOW network is correct. Examples: \"2.5WOW\" (display → 2500000000), 10000000000 (number, smallest unit), \"50000000000\" (string, smallest unit). Used for: service sale prices, compensation fund balances, Treasury deposits, arbitration fees, reward amounts, stock quantities."
1358
+ },
1359
+ {
1360
+ "type": "null"
1361
+ }
1362
+ ]
1363
+ }
1364
+ },
1365
+ "required": [
1366
+ "guard",
1367
+ "sharing"
1368
+ ],
1369
+ "additionalProperties": false,
1370
+ "description": "Fund allocator — a complete allocation strategy triggered by a Guard. Contains a sharing[] array where items can mix Amount/Rate/RateGross/Surplus modes. When the Guard passes, the contract allocates funds in strict order: Amount → Rate/RateGross → Surplus."
1371
+ },
1372
+ "description": "Fund allocator list. NOT first-match-wins: a distribution call submits ONE guard and EVERY allocator bound to that guard fires, in vector order, each against the shrinking pool left by the previous (this is how a waterfall like Amount fee + net Rate split is built). Alternative paths (e.g., refund / damage-deduct / arbitrate) are expressed as allocators bound to DIFFERENT guards; the caller's submitted guard selects the path."
1373
+ }
1374
+ },
1375
+ "required": [
1376
+ "description",
1377
+ "threshold",
1378
+ "allocators"
1379
+ ],
1380
+ "additionalProperties": false
1381
+ },
1203
1382
  "buy_guard": {
1204
1383
  "description": "Buy guard object ID or name.",
1205
1384
  "anyOf": [
@@ -1572,7 +1751,7 @@
1572
1751
  "type": "boolean"
1573
1752
  },
1574
1753
  "publish": {
1575
- "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)\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 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.",
1754
+ "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 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.",
1576
1755
  "type": "boolean"
1577
1756
  }
1578
1757
  },
@@ -1720,7 +1899,7 @@
1720
1899
  "type": "integer",
1721
1900
  "minimum": 0,
1722
1901
  "maximum": 255,
1723
- "description": "Identifier (0-255) for data lookup in Guard table."
1902
+ "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)."
1724
1903
  },
1725
1904
  "b_submission": {
1726
1905
  "type": "boolean",
@@ -3549,7 +3728,7 @@
3549
3728
  "type": "integer",
3550
3729
  "minimum": 0,
3551
3730
  "maximum": 255,
3552
- "description": "Identifier (0-255) for data lookup in Guard table."
3731
+ "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)."
3553
3732
  },
3554
3733
  "b_submission": {
3555
3734
  "type": "boolean",
@@ -4496,7 +4675,7 @@
4496
4675
  "type": "integer",
4497
4676
  "minimum": 0,
4498
4677
  "maximum": 255,
4499
- "description": "Identifier (0-255) for data lookup in Guard table."
4678
+ "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)."
4500
4679
  },
4501
4680
  "b_submission": {
4502
4681
  "type": "boolean",
@@ -6068,7 +6247,7 @@
6068
6247
  "type": "integer",
6069
6248
  "minimum": 0,
6070
6249
  "maximum": 255,
6071
- "description": "Identifier (0-255) for data lookup in Guard table."
6250
+ "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)."
6072
6251
  },
6073
6252
  "b_submission": {
6074
6253
  "type": "boolean",
@@ -7042,7 +7221,7 @@
7042
7221
  "type": "integer",
7043
7222
  "minimum": 0,
7044
7223
  "maximum": 255,
7045
- "description": "Identifier (0-255) for data lookup in Guard table."
7224
+ "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)."
7046
7225
  }
7047
7226
  },
7048
7227
  "required": [
@@ -7397,7 +7576,7 @@
7397
7576
  "type": "integer",
7398
7577
  "minimum": 0,
7399
7578
  "maximum": 255,
7400
- "description": "Identifier (0-255) for data lookup in Guard table."
7579
+ "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)."
7401
7580
  },
7402
7581
  "b_submission": {
7403
7582
  "type": "boolean",
@@ -8361,7 +8540,7 @@
8361
8540
  "type": "integer",
8362
8541
  "minimum": 0,
8363
8542
  "maximum": 255,
8364
- "description": "Identifier (0-255) for data lookup in Guard table."
8543
+ "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)."
8365
8544
  },
8366
8545
  "b_submission": {
8367
8546
  "type": "boolean",
@@ -9319,7 +9498,7 @@
9319
9498
  "type": "integer",
9320
9499
  "minimum": 0,
9321
9500
  "maximum": 255,
9322
- "description": "Identifier (0-255) for data lookup in Guard table."
9501
+ "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)."
9323
9502
  },
9324
9503
  {
9325
9504
  "type": "null"
@@ -9333,7 +9512,7 @@
9333
9512
  "type": "integer",
9334
9513
  "minimum": 0,
9335
9514
  "maximum": 255,
9336
- "description": "Identifier (0-255) for data lookup in Guard table."
9515
+ "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)."
9337
9516
  },
9338
9517
  {
9339
9518
  "type": "null"
@@ -9378,7 +9557,7 @@
9378
9557
  "type": "integer",
9379
9558
  "minimum": 0,
9380
9559
  "maximum": 255,
9381
- "description": "Identifier (0-255) for data lookup in Guard table."
9560
+ "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)."
9382
9561
  },
9383
9562
  {
9384
9563
  "type": "null"
@@ -9392,7 +9571,7 @@
9392
9571
  "type": "integer",
9393
9572
  "minimum": 0,
9394
9573
  "maximum": 255,
9395
- "description": "Identifier (0-255) for data lookup in Guard table."
9574
+ "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)."
9396
9575
  },
9397
9576
  {
9398
9577
  "type": "null"
@@ -9481,7 +9660,7 @@
9481
9660
  "type": "integer",
9482
9661
  "minimum": 0,
9483
9662
  "maximum": 255,
9484
- "description": "Identifier (0-255) for data lookup in Guard table."
9663
+ "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)."
9485
9664
  },
9486
9665
  {
9487
9666
  "type": "null"
@@ -9531,7 +9710,7 @@
9531
9710
  "type": "integer",
9532
9711
  "minimum": 0,
9533
9712
  "maximum": 255,
9534
- "description": "Identifier (0-255) for data lookup in Guard table."
9713
+ "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)."
9535
9714
  },
9536
9715
  {
9537
9716
  "type": "null"
@@ -9866,7 +10045,7 @@
9866
10045
  "type": "integer",
9867
10046
  "minimum": 0,
9868
10047
  "maximum": 255,
9869
- "description": "Identifier (0-255) for data lookup in Guard table."
10048
+ "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)."
9870
10049
  },
9871
10050
  "b_submission": {
9872
10051
  "type": "boolean",
@@ -10592,7 +10771,7 @@
10592
10771
  "type": "integer",
10593
10772
  "minimum": 0,
10594
10773
  "maximum": 255,
10595
- "description": "Identifier (0-255) for data lookup in Guard table."
10774
+ "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)."
10596
10775
  }
10597
10776
  },
10598
10777
  "required": [
@@ -10656,7 +10835,7 @@
10656
10835
  "type": "integer",
10657
10836
  "minimum": 0,
10658
10837
  "maximum": 255,
10659
- "description": "Identifier (0-255) for data lookup in Guard table."
10838
+ "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)."
10660
10839
  }
10661
10840
  },
10662
10841
  "required": [
@@ -10706,7 +10885,7 @@
10706
10885
  "type": "integer",
10707
10886
  "minimum": 0,
10708
10887
  "maximum": 255,
10709
- "description": "Identifier (0-255) for data lookup in Guard table."
10888
+ "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)."
10710
10889
  },
10711
10890
  {
10712
10891
  "type": "null"
@@ -11015,7 +11194,7 @@
11015
11194
  "type": "integer",
11016
11195
  "minimum": 0,
11017
11196
  "maximum": 255,
11018
- "description": "Identifier (0-255) for data lookup in Guard table."
11197
+ "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)."
11019
11198
  },
11020
11199
  "b_submission": {
11021
11200
  "type": "boolean",
@@ -11572,7 +11751,7 @@
11572
11751
  "properties": {
11573
11752
  "guard": {
11574
11753
  "type": "string",
11575
- "description": "Guard object ID or name. If Guard verification passes (via Passport), fund allocation for THIS Allocator fires. Each Allocator in an Allocators list can have a different Guard — the first Allocator whose Guard returns true wins. This enables mutually exclusive allocation paths (e.g., refund Guard on 'return_approved' node vs damage Guard on 'damage_confirmed' node)."
11754
+ "description": "Guard object ID or name. A distribution call submits ONE guard; EVERY Allocator bound to that guard fires — in vector order, each against the balance left by the previous (allocation.move:366-368: the loop matches the submitted guard address, it does NOT evaluate guards competitively). NOT first-match-wins: Allocators with different guards are alternative distribution paths selected by the caller's choice of guard (e.g., a refund guard vs a damage guard), and mutual exclusion must be expressed inside the Guard conditions themselves, never assumed from ordering."
11576
11755
  },
11577
11756
  "sharing": {
11578
11757
  "type": "array",
@@ -11588,7 +11767,7 @@
11588
11767
  "type": "integer",
11589
11768
  "minimum": 0,
11590
11769
  "maximum": 255,
11591
- "description": "Identifier (0-255) for data lookup in Guard table."
11770
+ "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)."
11592
11771
  }
11593
11772
  },
11594
11773
  "required": [
@@ -11714,7 +11893,7 @@
11714
11893
  "additionalProperties": false,
11715
11894
  "description": "Fund allocator — a complete allocation strategy triggered by a Guard. Contains a sharing[] array where items can mix Amount/Rate/RateGross/Surplus modes. When the Guard passes, the contract allocates funds in strict order: Amount → Rate/RateGross → Surplus."
11716
11895
  },
11717
- "description": "Fund allocator list. Each allocator is evaluated in order; the FIRST allocator whose Guard passes wins. This enables mutually exclusive allocation paths (e.g., 3 allocators for 3 forward paths: refund / damage-deduct / arbitrate)."
11896
+ "description": "Fund allocator list. NOT first-match-wins: a distribution call submits ONE guard and EVERY allocator bound to that guard fires, in vector order, each against the shrinking pool left by the previous (this is how a waterfall like Amount fee + net Rate split is built). Alternative paths (e.g., refund / damage-deduct / arbitrate) are expressed as allocators bound to DIFFERENT guards; the caller's submitted guard selects the path."
11718
11897
  }
11719
11898
  },
11720
11899
  "required": [
@@ -11723,7 +11902,7 @@
11723
11902
  "allocators"
11724
11903
  ],
11725
11904
  "additionalProperties": false,
11726
- "description": "Fund allocator list — the top-level allocation configuration attached to an Order. Contains a threshold and a list of Allocators. When funds arrive at the Order, the first Allocator whose Guard passes executes its sharing[] in strict order: Amount → Rate/RateGross → Surplus. MULTI-TIER ALLOCATION (DOC-04): Each Order binds ONE Allocators template (set on Service.order_allocators before publish). For multi-tier distribution (e.g., customer→agency→suppliers), use a two-phase approach: (1) Tier-1 Allocators on the customer's Order (allocates to agency + refund fund); (2) Tier-2 Allocators on a NEW Order created by the agency (allocates agency's received funds to suppliers). Each tier's NET Rate-mode sharing[] must independently sum to 10000 (or <= 10000 with Surplus); RateGross-mode sharing[] must sum to <= 10000."
11905
+ "description": "Fund allocator list — the top-level allocation configuration attached to an Order. Contains a threshold and a list of Allocators. A distribution call submits ONE guard; every Allocator bound to that guard executes its sharing[] in strict order (Amount → Rate/RateGross → Surplus) against the shrinking pool. MULTI-TIER ALLOCATION (DOC-04): Each Order binds ONE Allocators template (set on Service.order_allocators before publish). For multi-tier distribution (e.g., customer→agency→suppliers), use a two-phase approach: (1) Tier-1 Allocators on the customer's Order (allocates to agency + refund fund); (2) Tier-2 Allocators on a NEW Order created by the agency (allocates agency's received funds to suppliers). Each tier's NET Rate-mode sharing[] must independently sum to 10000 (or <= 10000 with Surplus); RateGross-mode sharing[] must sum to <= 10000."
11727
11906
  },
11728
11907
  "coin": {
11729
11908
  "anyOf": [
@@ -12068,7 +12247,7 @@
12068
12247
  "type": "integer",
12069
12248
  "minimum": 0,
12070
12249
  "maximum": 255,
12071
- "description": "Identifier (0-255) for data lookup in Guard table."
12250
+ "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)."
12072
12251
  },
12073
12252
  "b_submission": {
12074
12253
  "type": "boolean",
@@ -13492,7 +13671,7 @@
13492
13671
  "type": "integer",
13493
13672
  "minimum": 0,
13494
13673
  "maximum": 255,
13495
- "description": "Identifier (0-255) for data lookup in Guard table."
13674
+ "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)."
13496
13675
  },
13497
13676
  "b_submission": {
13498
13677
  "type": "boolean",
@@ -13927,7 +14106,7 @@
13927
14106
  "type": "integer",
13928
14107
  "minimum": 0,
13929
14108
  "maximum": 255,
13930
- "description": "Identifier (0-255) for data lookup in Guard table."
14109
+ "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)."
13931
14110
  }
13932
14111
  },
13933
14112
  "required": [
@@ -13964,7 +14143,7 @@
13964
14143
  "type": "integer",
13965
14144
  "minimum": 0,
13966
14145
  "maximum": 255,
13967
- "description": "Identifier (0-255) for data lookup in Guard table."
14146
+ "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)."
13968
14147
  },
13969
14148
  "convert_witness": {
13970
14149
  "anyOf": [
@@ -15032,7 +15211,7 @@
15032
15211
  "type": "integer",
15033
15212
  "minimum": 0,
15034
15213
  "maximum": 255,
15035
- "description": "Identifier (0-255) for data lookup in Guard table."
15214
+ "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)."
15036
15215
  }
15037
15216
  },
15038
15217
  "required": [
@@ -15057,7 +15236,7 @@
15057
15236
  "type": "integer",
15058
15237
  "minimum": 0,
15059
15238
  "maximum": 255,
15060
- "description": "Identifier (0-255) for data lookup in Guard table."
15239
+ "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)."
15061
15240
  }
15062
15241
  },
15063
15242
  "required": [
@@ -15096,7 +15275,7 @@
15096
15275
  "type": "integer",
15097
15276
  "minimum": 0,
15098
15277
  "maximum": 255,
15099
- "description": "Identifier (0-255) for data lookup in Guard table."
15278
+ "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)."
15100
15279
  }
15101
15280
  },
15102
15281
  "required": [
@@ -15132,7 +15311,7 @@
15132
15311
  "type": "integer",
15133
15312
  "minimum": 0,
15134
15313
  "maximum": 255,
15135
- "description": "Identifier (0-255) for data lookup in Guard table."
15314
+ "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)."
15136
15315
  }
15137
15316
  },
15138
15317
  "required": [
@@ -15149,7 +15328,7 @@
15149
15328
  "type": "integer",
15150
15329
  "minimum": 0,
15151
15330
  "maximum": 255,
15152
- "description": "Identifier (0-255) for data lookup in Guard table."
15331
+ "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)."
15153
15332
  }
15154
15333
  },
15155
15334
  "required": [
@@ -15188,7 +15367,7 @@
15188
15367
  "type": "integer",
15189
15368
  "minimum": 0,
15190
15369
  "maximum": 255,
15191
- "description": "Identifier (0-255) for data lookup in Guard table."
15370
+ "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)."
15192
15371
  }
15193
15372
  },
15194
15373
  "required": [
@@ -15223,7 +15402,7 @@
15223
15402
  "type": "integer",
15224
15403
  "minimum": 0,
15225
15404
  "maximum": 255,
15226
- "description": "Identifier (0-255) for data lookup in Guard table."
15405
+ "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)."
15227
15406
  }
15228
15407
  },
15229
15408
  "required": [
@@ -15240,7 +15419,7 @@
15240
15419
  "type": "integer",
15241
15420
  "minimum": 0,
15242
15421
  "maximum": 255,
15243
- "description": "Identifier (0-255) for data lookup in Guard table."
15422
+ "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)."
15244
15423
  }
15245
15424
  },
15246
15425
  "required": [
@@ -15279,7 +15458,7 @@
15279
15458
  "type": "integer",
15280
15459
  "minimum": 0,
15281
15460
  "maximum": 255,
15282
- "description": "Identifier (0-255) for data lookup in Guard table."
15461
+ "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)."
15283
15462
  }
15284
15463
  },
15285
15464
  "required": [
@@ -15314,7 +15493,7 @@
15314
15493
  "type": "integer",
15315
15494
  "minimum": 0,
15316
15495
  "maximum": 255,
15317
- "description": "Identifier (0-255) for data lookup in Guard table."
15496
+ "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)."
15318
15497
  }
15319
15498
  },
15320
15499
  "required": [
@@ -15386,7 +15565,7 @@
15386
15565
  "type": "integer",
15387
15566
  "minimum": 0,
15388
15567
  "maximum": 255,
15389
- "description": "Identifier (0-255) for data lookup in Guard table."
15568
+ "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)."
15390
15569
  }
15391
15570
  },
15392
15571
  "required": [
@@ -15448,7 +15627,7 @@
15448
15627
  "type": "integer",
15449
15628
  "minimum": 0,
15450
15629
  "maximum": 255,
15451
- "description": "Identifier (0-255) for data lookup in Guard table."
15630
+ "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)."
15452
15631
  }
15453
15632
  },
15454
15633
  "required": [
@@ -15536,7 +15715,7 @@
15536
15715
  "type": "integer",
15537
15716
  "minimum": 0,
15538
15717
  "maximum": 255,
15539
- "description": "Identifier (0-255) for data lookup in Guard table."
15718
+ "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)."
15540
15719
  }
15541
15720
  },
15542
15721
  "required": [
@@ -15577,7 +15756,7 @@
15577
15756
  "type": "integer",
15578
15757
  "minimum": 0,
15579
15758
  "maximum": 255,
15580
- "description": "Identifier (0-255) for data lookup in Guard table."
15759
+ "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)."
15581
15760
  }
15582
15761
  },
15583
15762
  "required": [
@@ -15628,7 +15807,7 @@
15628
15807
  "type": "integer",
15629
15808
  "minimum": 0,
15630
15809
  "maximum": 255,
15631
- "description": "Identifier (0-255) for data lookup in Guard table."
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)."
15632
15811
  }
15633
15812
  },
15634
15813
  "required": [
@@ -15689,7 +15868,7 @@
15689
15868
  "type": "integer",
15690
15869
  "minimum": 0,
15691
15870
  "maximum": 255,
15692
- "description": "Identifier (0-255) for data lookup in Guard table."
15871
+ "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)."
15693
15872
  }
15694
15873
  },
15695
15874
  "required": [
@@ -15705,7 +15884,7 @@
15705
15884
  "type": "integer",
15706
15885
  "minimum": 0,
15707
15886
  "maximum": 255,
15708
- "description": "Identifier (0-255) for data lookup in Guard table."
15887
+ "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)."
15709
15888
  }
15710
15889
  },
15711
15890
  "required": [
@@ -15721,7 +15900,7 @@
15721
15900
  "type": "integer",
15722
15901
  "minimum": 0,
15723
15902
  "maximum": 255,
15724
- "description": "Identifier (0-255) for data lookup in Guard table."
15903
+ "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)."
15725
15904
  }
15726
15905
  },
15727
15906
  "required": [
@@ -15972,7 +16151,7 @@
15972
16151
  "type": "integer",
15973
16152
  "minimum": 0,
15974
16153
  "maximum": 255,
15975
- "description": "Identifier (0-255) for data lookup in Guard table."
16154
+ "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)."
15976
16155
  }
15977
16156
  },
15978
16157
  "required": [
@@ -15988,7 +16167,7 @@
15988
16167
  "type": "integer",
15989
16168
  "minimum": 0,
15990
16169
  "maximum": 255,
15991
- "description": "Identifier (0-255) for data lookup in Guard table."
16170
+ "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)."
15992
16171
  }
15993
16172
  },
15994
16173
  "required": [
@@ -16004,7 +16183,7 @@
16004
16183
  "type": "integer",
16005
16184
  "minimum": 0,
16006
16185
  "maximum": 255,
16007
- "description": "Identifier (0-255) for data lookup in Guard table."
16186
+ "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)."
16008
16187
  }
16009
16188
  },
16010
16189
  "required": [
@@ -16255,7 +16434,7 @@
16255
16434
  "type": "integer",
16256
16435
  "minimum": 0,
16257
16436
  "maximum": 255,
16258
- "description": "Identifier (0-255) for data lookup in Guard table."
16437
+ "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)."
16259
16438
  }
16260
16439
  },
16261
16440
  "required": [
@@ -16271,7 +16450,7 @@
16271
16450
  "type": "integer",
16272
16451
  "minimum": 0,
16273
16452
  "maximum": 255,
16274
- "description": "Identifier (0-255) for data lookup in Guard table."
16453
+ "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)."
16275
16454
  }
16276
16455
  },
16277
16456
  "required": [
@@ -16287,7 +16466,7 @@
16287
16466
  "type": "integer",
16288
16467
  "minimum": 0,
16289
16468
  "maximum": 255,
16290
- "description": "Identifier (0-255) for data lookup in Guard table."
16469
+ "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)."
16291
16470
  }
16292
16471
  },
16293
16472
  "required": [
@@ -16538,7 +16717,7 @@
16538
16717
  "type": "integer",
16539
16718
  "minimum": 0,
16540
16719
  "maximum": 255,
16541
- "description": "Identifier (0-255) for data lookup in Guard table."
16720
+ "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)."
16542
16721
  }
16543
16722
  },
16544
16723
  "required": [
@@ -16554,7 +16733,7 @@
16554
16733
  "type": "integer",
16555
16734
  "minimum": 0,
16556
16735
  "maximum": 255,
16557
- "description": "Identifier (0-255) for data lookup in Guard table."
16736
+ "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)."
16558
16737
  }
16559
16738
  },
16560
16739
  "required": [
@@ -16804,7 +16983,7 @@
16804
16983
  "type": "integer",
16805
16984
  "minimum": 0,
16806
16985
  "maximum": 255,
16807
- "description": "Identifier (0-255) for data lookup in Guard table."
16986
+ "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)."
16808
16987
  }
16809
16988
  },
16810
16989
  "required": [
@@ -18490,7 +18669,7 @@
18490
18669
  "type": "integer",
18491
18670
  "minimum": 0,
18492
18671
  "maximum": 255,
18493
- "description": "Identifier (0-255) for data lookup in Guard table."
18672
+ "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)."
18494
18673
  },
18495
18674
  {
18496
18675
  "type": "null"
@@ -18536,7 +18715,7 @@
18536
18715
  "type": "integer",
18537
18716
  "minimum": 0,
18538
18717
  "maximum": 255,
18539
- "description": "Identifier (0-255) for data lookup in Guard table."
18718
+ "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)."
18540
18719
  },
18541
18720
  {
18542
18721
  "type": "null"
@@ -18871,7 +19050,7 @@
18871
19050
  "type": "integer",
18872
19051
  "minimum": 0,
18873
19052
  "maximum": 255,
18874
- "description": "Identifier (0-255) for data lookup in Guard table."
19053
+ "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)."
18875
19054
  },
18876
19055
  "b_submission": {
18877
19056
  "type": "boolean",
@@ -19656,6 +19835,138 @@
19656
19835
  }
19657
19836
  },
19658
19837
  "additionalProperties": false
19838
+ },
19839
+ "order_renew": {
19840
+ "description": "Renewal in ONE transaction: pays into the order's allocation and advances the renew forward atomically (fund + record + advance in a single step). Replaces the legacy 3-transaction renewal split. The new Payment's sole recipient is the allocation object itself (enforced on-chain).",
19841
+ "type": "object",
19842
+ "properties": {
19843
+ "allocation": {
19844
+ "type": "string",
19845
+ "description": "Allocation object ID or name receiving the renewal funds."
19846
+ },
19847
+ "type_parameter": {
19848
+ "type": "string",
19849
+ "description": "Coin type, e.g. \"0x2::wow::WOW\"."
19850
+ },
19851
+ "amount": {
19852
+ "anyOf": [
19853
+ {
19854
+ "type": "object",
19855
+ "properties": {
19856
+ "balance": {
19857
+ "anyOf": [
19858
+ {
19859
+ "type": "number"
19860
+ },
19861
+ {
19862
+ "type": "string"
19863
+ }
19864
+ ],
19865
+ "description": "A coin/balance amount. Accepts three formats: (1) DISPLAY FORMAT with token symbol: \"2.5WOW\", \"10USDC\", \"0.05WOW\" — auto-converted to smallest units via the Fund Processing Layer (token precision resolved from official registry → cache → on-chain). The symbol MUST match the token's type_parameter. (2) SMALLEST UNIT (numeric string): \"10000000000\" — used as-is, no conversion. (3) SMALLEST UNIT (number): 10000000000 — used as-is only within the safe integer range (±2^53); numbers outside it are REJECTED, use a numeric string instead. PRECISION RULE: for values exceeding 2^53 (9007199254740991), ALWAYS use format (1) or (2) — JS numbers lose integer precision silently and such inputs are blocked. Raw amounts must be plain non-negative integers; a decimal value without a token symbol (e.g. \"2.5\") is rejected — append the symbol (\"2.5WOW\") so the Fund Processing Layer converts it. WARNING — BARE INTEGER MEANS SMALLEST UNIT, NOT TOKENS: formats (2)/(3) are NEVER interpreted as display tokens. For example amount=\"5\" or 5 means 5 raw units = 0.000000005 WOW (9 decimals) — NOT 5 WOW. When the user asks for a token amount, you MUST use display format (\"5WOW\", \"2USDC\"); a bare integer is only correct for unitless counts (e.g. stock quantity) or when you computed exact raw units yourself. Default token: WOW (9 decimals, 1 WOW = 10^9 MIST). For custom tokens: use display format with the token's symbol, or pass smallest units directly. MONEY CONFIRMATION: all monetary fields trigger user confirmation via the Fund Processing Layer, where the token's FULL type, decimals and raw amount are always visible. MULTIPLE ISSUERS: several on-chain tokens may legally share the same symbol (e.g. multiple \"USDT\" coins). When a bare symbol matches more than one token, the operation is BLOCKED and every candidate is listed with full details (type, name, decimals, verified tag) — present the list to the USER and let them choose (they may answer by number), then re-issue with the chosen token's FULL type string in type_parameter; never guess an issuer from the bare symbol. MISSING TOKEN INFO: when a token's precision cannot be resolved, the operation is REFUSED (raw u64 included — amount magnitude could not be verified). Recovery: provide the token's FULL type in package::module::Name form in type_parameter (a bare symbol like \"USDT\" cannot be resolved), and verify the WOW network is correct. Examples: \"2.5WOW\" (display → 2500000000), 10000000000 (number, smallest unit), \"50000000000\" (string, smallest unit). Used for: service sale prices, compensation fund balances, Treasury deposits, arbitration fees, reward amounts, stock quantities."
19866
+ }
19867
+ },
19868
+ "required": [
19869
+ "balance"
19870
+ ],
19871
+ "additionalProperties": false,
19872
+ "description": "Specify an amount value."
19873
+ },
19874
+ {
19875
+ "type": "object",
19876
+ "properties": {
19877
+ "coin": {
19878
+ "type": "string",
19879
+ "description": "Coin object ID or name(local mark). WHOLE-COIN TRANSFER: the ENTIRE Coin object is moved to the recipient — the 'amount' is NOT taken from it (testnet lesson: passing your main gas coin transfers its full balance, leaving you unable to pay for anything). Use only for coins whose whole balance is exactly what you intend to send; prefer {balance: <smallest-unit number>} for partial amounts."
19880
+ }
19881
+ },
19882
+ "required": [
19883
+ "coin"
19884
+ ],
19885
+ "additionalProperties": false
19886
+ }
19887
+ ],
19888
+ "description": "Renewal payment."
19889
+ },
19890
+ "info": {
19891
+ "type": "object",
19892
+ "properties": {
19893
+ "for_object": {
19894
+ "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.",
19895
+ "anyOf": [
19896
+ {
19897
+ "type": "string"
19898
+ },
19899
+ {
19900
+ "type": "null"
19901
+ }
19902
+ ]
19903
+ },
19904
+ "for_guard": {
19905
+ "description": "Payment to satisfy verification of a Guard object",
19906
+ "anyOf": [
19907
+ {
19908
+ "type": "string"
19909
+ },
19910
+ {
19911
+ "type": "null"
19912
+ }
19913
+ ]
19914
+ },
19915
+ "remark": {
19916
+ "type": "string",
19917
+ "description": "Payment record remark"
19918
+ },
19919
+ "index": {
19920
+ "anyOf": [
19921
+ {
19922
+ "type": "number"
19923
+ },
19924
+ {
19925
+ "type": "string"
19926
+ }
19927
+ ],
19928
+ "description": "Payment record index"
19929
+ }
19930
+ },
19931
+ "required": [
19932
+ "remark",
19933
+ "index"
19934
+ ],
19935
+ "additionalProperties": false,
19936
+ "description": "PaymentInfo for the new Payment object (remark/index, optional for_object/for_guard)."
19937
+ },
19938
+ "operation": {
19939
+ "type": "object",
19940
+ "properties": {
19941
+ "next_node_name": {
19942
+ "type": "string",
19943
+ "description": "Next node name."
19944
+ },
19945
+ "forward": {
19946
+ "type": "string",
19947
+ "description": "Next forward name."
19948
+ }
19949
+ },
19950
+ "required": [
19951
+ "next_node_name",
19952
+ "forward"
19953
+ ],
19954
+ "additionalProperties": false,
19955
+ "description": "Renew forward to advance after the funding lands."
19956
+ },
19957
+ "message": {
19958
+ "description": "Message attached to the forward advance.",
19959
+ "type": "string"
19960
+ }
19961
+ },
19962
+ "required": [
19963
+ "allocation",
19964
+ "type_parameter",
19965
+ "amount",
19966
+ "info",
19967
+ "operation"
19968
+ ],
19969
+ "additionalProperties": false
19659
19970
  }
19660
19971
  },
19661
19972
  "required": [
@@ -19802,7 +20113,7 @@
19802
20113
  "type": "integer",
19803
20114
  "minimum": 0,
19804
20115
  "maximum": 255,
19805
- "description": "Identifier (0-255) for data lookup in Guard table."
20116
+ "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)."
19806
20117
  },
19807
20118
  "b_submission": {
19808
20119
  "type": "boolean",
@@ -20358,7 +20669,7 @@
20358
20669
  "type": "integer",
20359
20670
  "minimum": 0,
20360
20671
  "maximum": 255,
20361
- "description": "Identifier (0-255) for data lookup in Guard table."
20672
+ "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)."
20362
20673
  },
20363
20674
  "b_submission": {
20364
20675
  "type": "boolean",
@@ -21177,7 +21488,7 @@
21177
21488
  "type": "integer",
21178
21489
  "minimum": 0,
21179
21490
  "maximum": 255,
21180
- "description": "Identifier (0-255) for data lookup in Guard table."
21491
+ "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)."
21181
21492
  },
21182
21493
  "b_submission": {
21183
21494
  "type": "boolean",
@@ -22297,7 +22608,7 @@
22297
22608
  "type": "integer",
22298
22609
  "minimum": 0,
22299
22610
  "maximum": 255,
22300
- "description": "Identifier (0-255) for data lookup in Guard table."
22611
+ "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)."
22301
22612
  }
22302
22613
  },
22303
22614
  "required": [
@@ -22334,7 +22645,7 @@
22334
22645
  "type": "integer",
22335
22646
  "minimum": 0,
22336
22647
  "maximum": 255,
22337
- "description": "Identifier (0-255) for data lookup in Guard table."
22648
+ "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)."
22338
22649
  },
22339
22650
  "convert_witness": {
22340
22651
  "anyOf": [
@@ -23402,7 +23713,7 @@
23402
23713
  "type": "integer",
23403
23714
  "minimum": 0,
23404
23715
  "maximum": 255,
23405
- "description": "Identifier (0-255) for data lookup in Guard table."
23716
+ "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)."
23406
23717
  }
23407
23718
  },
23408
23719
  "required": [
@@ -23427,7 +23738,7 @@
23427
23738
  "type": "integer",
23428
23739
  "minimum": 0,
23429
23740
  "maximum": 255,
23430
- "description": "Identifier (0-255) for data lookup in Guard table."
23741
+ "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)."
23431
23742
  }
23432
23743
  },
23433
23744
  "required": [
@@ -23466,7 +23777,7 @@
23466
23777
  "type": "integer",
23467
23778
  "minimum": 0,
23468
23779
  "maximum": 255,
23469
- "description": "Identifier (0-255) for data lookup in Guard table."
23780
+ "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)."
23470
23781
  }
23471
23782
  },
23472
23783
  "required": [
@@ -23502,7 +23813,7 @@
23502
23813
  "type": "integer",
23503
23814
  "minimum": 0,
23504
23815
  "maximum": 255,
23505
- "description": "Identifier (0-255) for data lookup in Guard table."
23816
+ "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)."
23506
23817
  }
23507
23818
  },
23508
23819
  "required": [
@@ -23519,7 +23830,7 @@
23519
23830
  "type": "integer",
23520
23831
  "minimum": 0,
23521
23832
  "maximum": 255,
23522
- "description": "Identifier (0-255) for data lookup in Guard table."
23833
+ "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)."
23523
23834
  }
23524
23835
  },
23525
23836
  "required": [
@@ -23558,7 +23869,7 @@
23558
23869
  "type": "integer",
23559
23870
  "minimum": 0,
23560
23871
  "maximum": 255,
23561
- "description": "Identifier (0-255) for data lookup in Guard table."
23872
+ "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)."
23562
23873
  }
23563
23874
  },
23564
23875
  "required": [
@@ -23593,7 +23904,7 @@
23593
23904
  "type": "integer",
23594
23905
  "minimum": 0,
23595
23906
  "maximum": 255,
23596
- "description": "Identifier (0-255) for data lookup in Guard table."
23907
+ "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)."
23597
23908
  }
23598
23909
  },
23599
23910
  "required": [
@@ -23610,7 +23921,7 @@
23610
23921
  "type": "integer",
23611
23922
  "minimum": 0,
23612
23923
  "maximum": 255,
23613
- "description": "Identifier (0-255) for data lookup in Guard table."
23924
+ "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)."
23614
23925
  }
23615
23926
  },
23616
23927
  "required": [
@@ -23649,7 +23960,7 @@
23649
23960
  "type": "integer",
23650
23961
  "minimum": 0,
23651
23962
  "maximum": 255,
23652
- "description": "Identifier (0-255) for data lookup in Guard table."
23963
+ "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)."
23653
23964
  }
23654
23965
  },
23655
23966
  "required": [
@@ -23684,7 +23995,7 @@
23684
23995
  "type": "integer",
23685
23996
  "minimum": 0,
23686
23997
  "maximum": 255,
23687
- "description": "Identifier (0-255) for data lookup in Guard table."
23998
+ "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)."
23688
23999
  }
23689
24000
  },
23690
24001
  "required": [
@@ -23756,7 +24067,7 @@
23756
24067
  "type": "integer",
23757
24068
  "minimum": 0,
23758
24069
  "maximum": 255,
23759
- "description": "Identifier (0-255) for data lookup in Guard table."
24070
+ "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)."
23760
24071
  }
23761
24072
  },
23762
24073
  "required": [
@@ -23818,7 +24129,7 @@
23818
24129
  "type": "integer",
23819
24130
  "minimum": 0,
23820
24131
  "maximum": 255,
23821
- "description": "Identifier (0-255) for data lookup in Guard table."
24132
+ "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)."
23822
24133
  }
23823
24134
  },
23824
24135
  "required": [
@@ -23906,7 +24217,7 @@
23906
24217
  "type": "integer",
23907
24218
  "minimum": 0,
23908
24219
  "maximum": 255,
23909
- "description": "Identifier (0-255) for data lookup in Guard table."
24220
+ "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)."
23910
24221
  }
23911
24222
  },
23912
24223
  "required": [
@@ -23947,7 +24258,7 @@
23947
24258
  "type": "integer",
23948
24259
  "minimum": 0,
23949
24260
  "maximum": 255,
23950
- "description": "Identifier (0-255) for data lookup in Guard table."
24261
+ "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)."
23951
24262
  }
23952
24263
  },
23953
24264
  "required": [
@@ -23998,7 +24309,7 @@
23998
24309
  "type": "integer",
23999
24310
  "minimum": 0,
24000
24311
  "maximum": 255,
24001
- "description": "Identifier (0-255) for data lookup in Guard table."
24312
+ "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)."
24002
24313
  }
24003
24314
  },
24004
24315
  "required": [
@@ -24059,7 +24370,7 @@
24059
24370
  "type": "integer",
24060
24371
  "minimum": 0,
24061
24372
  "maximum": 255,
24062
- "description": "Identifier (0-255) for data lookup in Guard table."
24373
+ "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)."
24063
24374
  }
24064
24375
  },
24065
24376
  "required": [
@@ -24075,7 +24386,7 @@
24075
24386
  "type": "integer",
24076
24387
  "minimum": 0,
24077
24388
  "maximum": 255,
24078
- "description": "Identifier (0-255) for data lookup in Guard table."
24389
+ "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)."
24079
24390
  }
24080
24391
  },
24081
24392
  "required": [
@@ -24091,7 +24402,7 @@
24091
24402
  "type": "integer",
24092
24403
  "minimum": 0,
24093
24404
  "maximum": 255,
24094
- "description": "Identifier (0-255) for data lookup in Guard table."
24405
+ "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)."
24095
24406
  }
24096
24407
  },
24097
24408
  "required": [
@@ -24342,7 +24653,7 @@
24342
24653
  "type": "integer",
24343
24654
  "minimum": 0,
24344
24655
  "maximum": 255,
24345
- "description": "Identifier (0-255) for data lookup in Guard table."
24656
+ "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)."
24346
24657
  }
24347
24658
  },
24348
24659
  "required": [
@@ -24358,7 +24669,7 @@
24358
24669
  "type": "integer",
24359
24670
  "minimum": 0,
24360
24671
  "maximum": 255,
24361
- "description": "Identifier (0-255) for data lookup in Guard table."
24672
+ "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)."
24362
24673
  }
24363
24674
  },
24364
24675
  "required": [
@@ -24374,7 +24685,7 @@
24374
24685
  "type": "integer",
24375
24686
  "minimum": 0,
24376
24687
  "maximum": 255,
24377
- "description": "Identifier (0-255) for data lookup in Guard table."
24688
+ "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)."
24378
24689
  }
24379
24690
  },
24380
24691
  "required": [
@@ -24625,7 +24936,7 @@
24625
24936
  "type": "integer",
24626
24937
  "minimum": 0,
24627
24938
  "maximum": 255,
24628
- "description": "Identifier (0-255) for data lookup in Guard table."
24939
+ "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)."
24629
24940
  }
24630
24941
  },
24631
24942
  "required": [
@@ -24641,7 +24952,7 @@
24641
24952
  "type": "integer",
24642
24953
  "minimum": 0,
24643
24954
  "maximum": 255,
24644
- "description": "Identifier (0-255) for data lookup in Guard table."
24955
+ "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)."
24645
24956
  }
24646
24957
  },
24647
24958
  "required": [
@@ -24657,7 +24968,7 @@
24657
24968
  "type": "integer",
24658
24969
  "minimum": 0,
24659
24970
  "maximum": 255,
24660
- "description": "Identifier (0-255) for data lookup in Guard table."
24971
+ "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)."
24661
24972
  }
24662
24973
  },
24663
24974
  "required": [
@@ -24908,7 +25219,7 @@
24908
25219
  "type": "integer",
24909
25220
  "minimum": 0,
24910
25221
  "maximum": 255,
24911
- "description": "Identifier (0-255) for data lookup in Guard table."
25222
+ "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)."
24912
25223
  }
24913
25224
  },
24914
25225
  "required": [
@@ -24924,7 +25235,7 @@
24924
25235
  "type": "integer",
24925
25236
  "minimum": 0,
24926
25237
  "maximum": 255,
24927
- "description": "Identifier (0-255) for data lookup in Guard table."
25238
+ "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)."
24928
25239
  }
24929
25240
  },
24930
25241
  "required": [
@@ -25174,7 +25485,7 @@
25174
25485
  "type": "integer",
25175
25486
  "minimum": 0,
25176
25487
  "maximum": 255,
25177
- "description": "Identifier (0-255) for data lookup in Guard table."
25488
+ "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)."
25178
25489
  }
25179
25490
  },
25180
25491
  "required": [