@wowok/agent-mcp 3.2.9 → 3.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/README.md +2 -2
  2. package/dist/chain-semantics/field-capability.js +1 -1
  3. package/dist/chain-semantics/freeze-map.js +1 -1
  4. package/dist/chain-semantics/fund-flow.js +1 -1
  5. package/dist/chain-semantics/object-graph.js +1 -1
  6. package/dist/composition/audit.js +1 -1
  7. package/dist/composition/compile.d.ts +10 -1
  8. package/dist/composition/compile.js +1 -1
  9. package/dist/composition/inflight.js +1 -1
  10. package/dist/extensions/capability-manifest.js +1 -1
  11. package/dist/extensions/industry-audit.spec.js +1 -1
  12. package/dist/extensions/industry-pack.js +1 -1
  13. package/dist/graph/onchain/facts.spec.js +1 -1
  14. package/dist/graph/onchain/field-manifest.js +1 -1
  15. package/dist/harness/recover.js +1 -1
  16. package/dist/intent/types.d.ts +1 -1
  17. package/dist/intent/types.js +1 -1
  18. package/dist/keeper/KeeperScan.d.ts +2 -1
  19. package/dist/keeper/KeeperScan.js +1 -1
  20. package/dist/keeper/keeper.spec.js +1 -1
  21. package/dist/keeper/types.d.ts +3 -0
  22. package/dist/keeper/types.js +1 -1
  23. package/dist/knowledge/allocator-rail-verifier.d.ts +34 -0
  24. package/dist/knowledge/allocator-rail-verifier.js +1 -0
  25. package/dist/knowledge/arbitration-ledger.js +1 -1
  26. package/dist/knowledge/arbitration-templates.js +1 -1
  27. package/dist/knowledge/arbitration-venue-order.js +1 -1
  28. package/dist/knowledge/audit-rules.d.ts +19 -1
  29. package/dist/knowledge/audit-rules.js +1 -1
  30. package/dist/knowledge/baselines/rules/alloc_audit.json +1 -1
  31. package/dist/knowledge/baselines/rules/arb.json +1 -1
  32. package/dist/knowledge/baselines/rules/guard.json +15 -5
  33. package/dist/knowledge/baselines/rules/machine.json +9 -6
  34. package/dist/knowledge/baselines/rules/plan.json +12 -12
  35. package/dist/knowledge/baselines/semantic-facts.js +1 -1
  36. package/dist/knowledge/builtin-templates.d.ts +1 -1
  37. package/dist/knowledge/builtin-templates.js +1 -1
  38. package/dist/knowledge/contract-invariants.js +1 -1
  39. package/dist/knowledge/event-semantics.js +1 -1
  40. package/dist/knowledge/fund-layer.js +1 -1
  41. package/dist/knowledge/getting-started.js +1 -1
  42. package/dist/knowledge/guard-anchor-reach.d.ts +1 -1
  43. package/dist/knowledge/guard-anchor-reach.js +1 -1
  44. package/dist/knowledge/guard-bindings.js +1 -1
  45. package/dist/knowledge/guard-design-patterns.d.ts +1 -1
  46. package/dist/knowledge/guard-design-patterns.js +1 -1
  47. package/dist/knowledge/guard-field-cognition.js +1 -1
  48. package/dist/knowledge/guard-render.js +1 -1
  49. package/dist/knowledge/guard-risk.js +1 -1
  50. package/dist/knowledge/guard-templates.d.ts +1 -1
  51. package/dist/knowledge/guard-templates.js +1 -1
  52. package/dist/knowledge/index.js +1 -1
  53. package/dist/knowledge/industry-registry.js +1 -1
  54. package/dist/knowledge/industry-strategy.js +1 -1
  55. package/dist/knowledge/jsonrpc-enum.js +1 -1
  56. package/dist/knowledge/machine-ledger.js +1 -1
  57. package/dist/knowledge/machine-puzzle.d.ts +1 -1
  58. package/dist/knowledge/machine-puzzle.js +1 -1
  59. package/dist/knowledge/machine-risk.js +1 -1
  60. package/dist/knowledge/machine-templates.js +1 -1
  61. package/dist/knowledge/machine-topology.d.ts +8 -0
  62. package/dist/knowledge/machine-topology.js +1 -1
  63. package/dist/knowledge/machine-translation.js +1 -1
  64. package/dist/knowledge/permission-ledger.js +1 -1
  65. package/dist/knowledge/protocol-facts.d.ts +16 -0
  66. package/dist/knowledge/protocol-facts.js +1 -0
  67. package/dist/knowledge/recipient-constraint.js +1 -1
  68. package/dist/knowledge/reward-ledger.d.ts +2 -1
  69. package/dist/knowledge/reward-ledger.js +1 -1
  70. package/dist/knowledge/reward-templates.js +1 -1
  71. package/dist/knowledge/safety-rules.d.ts +0 -2
  72. package/dist/knowledge/safety-rules.js +1 -1
  73. package/dist/knowledge/scenario-modes.d.ts +7 -0
  74. package/dist/knowledge/scenario-modes.js +1 -1
  75. package/dist/knowledge/strategy-manuals.js +1 -1
  76. package/dist/knowledge/template-loader.d.ts +13 -1
  77. package/dist/knowledge/template-loader.js +1 -1
  78. package/dist/knowledge/template-registry.js +1 -1
  79. package/dist/knowledge/template-scanner.js +1 -1
  80. package/dist/knowledge/tool-constraints.js +1 -1
  81. package/dist/knowledge/tools-reference.js +1 -1
  82. package/dist/monitor/MonitorLoop.js +1 -1
  83. package/dist/monitor/normalize.d.ts +1 -1
  84. package/dist/monitor/normalize.js +1 -1
  85. package/dist/monitor/types.d.ts +1 -1
  86. package/dist/monitor/types.js +1 -1
  87. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  88. package/dist/playbooks/service-build/game-theory.d.ts +1 -0
  89. package/dist/playbooks/service-build/game-theory.js +1 -1
  90. package/dist/playbooks/service-build/intent-analyzer.js +1 -1
  91. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  92. package/dist/playbooks/service-build/merchant-guide.js +1 -1
  93. package/dist/playbooks/service-build/object-panorama.js +1 -1
  94. package/dist/playbooks/service-build/participation-radar.js +1 -1
  95. package/dist/playbooks/service-build/relationship-profile.js +1 -1
  96. package/dist/playbooks/service-build/service-panorama.js +1 -1
  97. package/dist/playbooks/service-build/service-quote.js +1 -1
  98. package/dist/playbooks/service-build/service-quote.spec.js +1 -1
  99. package/dist/relationship/registry.js +1 -1
  100. package/dist/review/index.js +1 -1
  101. package/dist/role/profiles.js +1 -1
  102. package/dist/rules.js +1 -1
  103. package/dist/safety/confirm-gate.js +1 -1
  104. package/dist/schema/benchmark-migration/index.d.ts +5 -1
  105. package/dist/schema/benchmark-migration/index.js +1 -1
  106. package/dist/schema/call/arbitration.d.ts +4 -4
  107. package/dist/schema/call/arbitration.js +1 -1
  108. package/dist/schema/call/base.d.ts +39 -0
  109. package/dist/schema/call/base.js +1 -1
  110. package/dist/schema/call/bridge.d.ts +1 -0
  111. package/dist/schema/call/contact.d.ts +4 -4
  112. package/dist/schema/call/demand.d.ts +4 -4
  113. package/dist/schema/call/error-codes.d.ts +1 -1
  114. package/dist/schema/call/error-codes.js +1 -1
  115. package/dist/schema/call/handler.js +1 -1
  116. package/dist/schema/call/machine.d.ts +12 -4
  117. package/dist/schema/call/order.d.ts +4 -4
  118. package/dist/schema/call/permission.d.ts +4 -4
  119. package/dist/schema/call/progress.d.ts +4 -4
  120. package/dist/schema/call/receipt.d.ts +8 -0
  121. package/dist/schema/call/receipt.js +1 -1
  122. package/dist/schema/call/repository.d.ts +4 -4
  123. package/dist/schema/call/reward.d.ts +24 -4
  124. package/dist/schema/call/reward.js +1 -1
  125. package/dist/schema/call/semantic.js +1 -1
  126. package/dist/schema/call/service.d.ts +6 -4
  127. package/dist/schema/call/service.js +1 -1
  128. package/dist/schema/call/treasury.d.ts +4 -4
  129. package/dist/schema/common/index.d.ts +2 -2
  130. package/dist/schema/common/index.js +1 -1
  131. package/dist/schema/goal/index.d.ts +5 -1
  132. package/dist/schema/goal/planning.d.ts +10 -2
  133. package/dist/schema/goal/planning.js +1 -1
  134. package/dist/schema/industry-pack/index.d.ts +3 -0
  135. package/dist/schema/industry-pack/index.js +1 -1
  136. package/dist/schema/intent-radar/index.d.ts +9 -0
  137. package/dist/schema/intent-radar/index.js +1 -1
  138. package/dist/schema/local/index.d.ts +10 -0
  139. package/dist/schema/local/index.js +1 -1
  140. package/dist/schema/operations.d.ts +35 -22
  141. package/dist/schema/operations.js +1 -1
  142. package/dist/schema/query/bi.d.ts +16 -0
  143. package/dist/schema/query/bi.js +1 -1
  144. package/dist/schema/query/index.d.ts +52 -48
  145. package/dist/schema/query/index.js +1 -1
  146. package/dist/schema/schema-query/index.d.ts +1 -0
  147. package/dist/schema/schema-query/index.js +1 -1
  148. package/dist/schema/schema-version.js +1 -1
  149. package/dist/schema/workspace/index.d.ts +9 -0
  150. package/dist/schema/workspace/index.js +1 -1
  151. package/dist/schema-query-impl/index.d.ts +1 -1
  152. package/dist/schema-query-impl/index.js +1 -1
  153. package/dist/schemas/account_operation.output.json +1 -0
  154. package/dist/schemas/account_operation.schema.json +1 -1
  155. package/dist/schemas/benchmark_migration_operation.schema.json +27 -3
  156. package/dist/schemas/bridge_operation.output.json +1 -0
  157. package/dist/schemas/goal_operation.schema.json +26 -2
  158. package/dist/schemas/index.json +1 -1
  159. package/dist/schemas/industry_pack_operation.output.json +8 -0
  160. package/dist/schemas/industry_pack_operation.schema.json +9 -0
  161. package/dist/schemas/intent_radar.output.json +8 -2
  162. package/dist/schemas/intent_radar.schema.json +4 -1
  163. package/dist/schemas/local_cache_operation.output.json +1 -0
  164. package/dist/schemas/local_history_operation.output.json +1 -0
  165. package/dist/schemas/local_info_operation.output.json +1 -0
  166. package/dist/schemas/local_mark_operation.output.json +1 -0
  167. package/dist/schemas/monitor_events.schema.json +3 -1
  168. package/dist/schemas/onchain_events.output.json +275 -11
  169. package/dist/schemas/onchain_events.schema.json +25 -1
  170. package/dist/schemas/onchain_operations.output.json +40 -0
  171. package/dist/schemas/onchain_operations.schema.json +573 -104
  172. package/dist/schemas/onchain_operations_allocation.schema.json +2 -2
  173. package/dist/schemas/onchain_operations_arbitration.schema.json +11 -7
  174. package/dist/schemas/onchain_operations_contact.schema.json +9 -5
  175. package/dist/schemas/onchain_operations_demand.schema.json +9 -5
  176. package/dist/schemas/onchain_operations_guard.schema.json +342 -4
  177. package/dist/schemas/onchain_operations_machine.schema.json +17 -5
  178. package/dist/schemas/onchain_operations_order.schema.json +9 -5
  179. package/dist/schemas/onchain_operations_permission.schema.json +9 -5
  180. package/dist/schemas/onchain_operations_progress.schema.json +9 -5
  181. package/dist/schemas/onchain_operations_repository.schema.json +9 -5
  182. package/dist/schemas/onchain_operations_reward.schema.json +89 -9
  183. package/dist/schemas/onchain_operations_service.schema.json +18 -11
  184. package/dist/schemas/onchain_operations_treasury.schema.json +9 -5
  185. package/dist/schemas/query_toolkit.output.json +237 -14
  186. package/dist/schemas/schema_query.schema.json +3 -2
  187. package/dist/schemas/workspace_operation.output.json +23 -3
  188. package/dist/schemas/workspace_operation.schema.json +3 -3
  189. package/dist/tools/handlers/benchmark-migration.d.ts +45 -1
  190. package/dist/tools/handlers/benchmark-migration.js +1 -1
  191. package/dist/tools/handlers/config.js +1 -1
  192. package/dist/tools/handlers/industry-pack.js +1 -1
  193. package/dist/tools/handlers/intent-radar.js +1 -1
  194. package/dist/tools/handlers/keeper.d.ts +1 -1
  195. package/dist/tools/handlers/onchain.d.ts +12 -0
  196. package/dist/tools/handlers/onchain.js +1 -1
  197. package/dist/tools/handlers/schema-query.js +1 -1
  198. package/dist/tools/handlers/workflow.js +1 -1
  199. package/dist/tools/handlers/workspace.js +1 -1
  200. package/dist/tools/index.js +1 -1
  201. package/dist/tools/registry/agent.js +1 -1
  202. package/dist/tools/registry/business.js +1 -1
  203. package/dist/tools/registry/local.js +1 -1
  204. package/dist/tools/registry/query.js +1 -1
  205. package/dist/tools/rules-hook.js +1 -1
  206. package/dist/tools/wrap.js +1 -1
  207. package/package.json +2 -2
@@ -1 +1 @@
1
- import{MAX_INDEMNITY_MULTIPLE}from'./onchain-constants.js';import{lintForwardAmbiguity,findLoopCycles}from'./machine-topology.js';import{isRenewalLoopEdge}from'../participation/radar-core.js';function numericAmount(a){if(typeof a==='number')return Number['isFinite'](a)?a:undefined;if(typeof a==='string'){const b=a['trim']();if(/^\d+$/['test'](b))return Number(b);}return undefined;}export{numericAmount};export function salesItemsOf(a){if(Array['isArray'](a?.['sales']))return a['sales'];if(Array['isArray'](a?.['sales']?.['sales']))return a['sales']['sales'];return[];}export function allocatorCountOf(a){const b=a?.['order_allocators'];if(Array['isArray'](b))return b['length'];if(Array['isArray'](b?.['allocators']))return b['allocators']['length'];return 0x0;}export function arbitrationRefsOf(b){const c=b?.['arbitrations'];if(Array['isArray'](c))return c['filter'](e=>typeof e==='string');if(Array['isArray'](c?.['objects']))return c['objects']['filter'](e=>typeof e==='string');return[];}export function compensationFundOf(a){if(a?.['compensation_fund_add']?.['balance']!=null)return a['compensation_fund_add']['balance'];if(a?.['compensation_fund']!=null)return a['compensation_fund'];return undefined;}export function serviceNameOf(a){if(typeof a?.['object']==='string')return a['object'];if(typeof a?.['object']?.['name']==='string'&&a['object']['name'])return a['object']['name'];if(typeof a?.['namedNew']?.['name']==='string'&&a['namedNew']['name'])return a['namedNew']['name'];return undefined;}export function typeParameterOf(a){if(typeof a?.['type_parameter']==='string'&&a['type_parameter'])return a['type_parameter'];if(typeof a?.['object']?.['type_parameter']==='string'&&a['object']['type_parameter'])return a['object']['type_parameter'];if(typeof a?.['namedNew']?.['type_parameter']==='string'&&a['namedNew']['type_parameter'])return a['namedNew']['type_parameter'];return undefined;}export const DISPUTE_FAMILY_NODE_REGEX=/(^|_)(disputed?|arbitration|arb)(_|$)/i;export const FUND_TERMINAL_NODE_REGEX=/^(refund|refunded|deposit_refunded|deposit_deducted|cancel|cancelled)$/i;export const ANTI_PATTERN_NODE_REGEX=new RegExp(DISPUTE_FAMILY_NODE_REGEX['source']+'|'+FUND_TERMINAL_NODE_REGEX['source'],'i');export const REMEDY_FAMILY_NODE_REGEX=/(revision|refund|cancel|return|claim)/i;export function isRemedyLoopEdge(a,b){return REMEDY_FAMILY_NODE_REGEX['test'](a)||REMEDY_FAMILY_NODE_REGEX['test'](b);}export function classifyLoopCycle(a){for(let b=0x0;b<a['length'];b++){if(isRenewalLoopEdge(a[b],a[(b+0x1)%a['length']]))return'renewal';}if(a['some'](c=>REMEDY_FAMILY_NODE_REGEX['test'](c)))return'remedy';return'charge';}export function auditMachineNodes(a){const b=[],c=[];if(!Array['isArray'](a)||a['length']===0x0)return c['push']('pre_publish:\x20machine\x20node\x20set\x20unavailable\x20—\x20topology\x20not\x20verifiable;\x20'+'verify\x20via\x20machineNode2file\x20BEFORE\x20publish\x20(immutable\x20after\x20publish,\x20IMMUT-001)'),{'critical':b,'warnings':c};const d=a;for(const q of d){const r=typeof q?.['name']==='string'?q['name']:'';if(!r)continue;if(DISPUTE_FAMILY_NODE_REGEX['test'](r))b['push']('R-M1-11:\x20machine\x20node\x20\x22'+r+'\x22\x20models\x20dispute\x20flow\x20—\x20'+'disputes\x20must\x20route\x20via\x20the\x20separate\x20Arbitration\x20object\x20(off-Machine);\x20'+'rename\x20the\x20node\x20to\x20the\x20business\x20state\x20that\x20triggers\x20it');else FUND_TERMINAL_NODE_REGEX['test'](r)&&c['push']('R-M1-11:\x20machine\x20node\x20\x22'+r+'\x22\x20uses\x20a\x20bare\x20fund-terminal\x20name\x20—\x20reaching\x20'+'it\x20moves\x20no\x20funds\x20by\x20itself.\x20This\x20is\x20legitimate\x20ONLY\x20when\x20a\x20refund\x20allocator\x20'+'rail\x27s\x20guard\x20anchors\x20to\x20this\x20node\x20(per-node\x20refund\x20tracks);\x20otherwise\x20rename\x20it\x20'+'to\x20the\x20business\x20state\x20(e.g.\x20cancel_requested\x20/\x20closed_cancel)\x20and\x20route\x20the\x20'+'refund\x20via\x20an\x20Allocator\x20triggered\x20by\x20that\x20state.\x20The\x20template\x20scanner\x20verifies\x20'+'the\x20anchoring\x20when\x20a\x20template\x20is\x20present.');}const e=new Set();for(const s of d){const t=typeof s?.['name']==='string'?s['name']:'';if(!t)continue;e['has'](t)&&b['push']('MC-C-04:\x20duplicate\x20machine\x20node\x20name\x20\x22'+t+'\x22\x20—\x20on-chain\x20will\x20reject\x20the\x20publish\x20transaction'),e['add'](t);}const g=d['some'](u=>Array['isArray'](u?.['pairs'])&&u['pairs']['some'](v=>v?.['prev_node']===''));!g&&b['push']('Machine\x20has\x20no\x20entry\x20pair\x20(prev_node=\x22\x22)\x20—\x20Progress\x20can\x20never\x20advance\x20'+'from\x20the\x20initial\x20state;\x20orders\x20are\x20permanently\x20stuck');const h=new Map();for(const u of d){const v=typeof u?.['name']==='string'?u['name']:'';if(!v)continue;if(!h['has'](v))h['set'](v,[]);for(const w of u?.['pairs']??[]){const x=w?.['prev_node'];if(typeof x==='string'&&x!==''){const y=h['get'](x);if(y)y['push'](v);else h['set'](x,[v]);}}}const i=findLoopCycles(h)['map'](z=>({'c':z,'tier':classifyLoopCycle(z['cycle'])})),j=i['filter'](z=>z['tier']==='renewal'),k=i['filter'](z=>z['tier']==='remedy'),l=i['filter'](z=>z['tier']==='charge');l['length']>0x0&&b['push']('pre_publish:\x20machine\x20contains\x20charge-bearing\x20loop\x20cycle(s)\x20'+l['map'](z=>'['+z['c']['cycle']['join']('\x20->\x20')+']')['join'](',\x20')+'\x20—\x20'+'on-chain\x20a\x20revisit\x20is\x20NOT\x20verified\x20to\x20re-fund\x20the\x20Allocation,\x20and\x20this\x20static\x20pass\x20sees\x20only\x20the\x20forward\x27s\x20guard\x20reference\x20'+'(never\x20the\x20guard\x20table),\x20so\x20a\x20per-revisit-fee\x20cycle\x20(retake\x20/\x20session-card\x20shape)\x20is\x20UNPROVABLE\x20here\x20even\x20though\x20the\x20'+'allocation.balance\x20Guard\x20query\x20(1051,\x20witness\x20OrderAllocation\x20109)\x20makes\x20the\x20fee\x20enforceable\x20at\x20the\x20guard\x20layer\x20'+'(zero-value\x20re-delivery\x20cycles,\x20test/11\x20R2-F3\x20/\x20crs\x20P2-3).\x20Remedy:\x20bind\x20the\x20fund-gate\x20Guard\x20on\x20the\x20loop\x20forward\x20'+'(constant\x20=\x20order\x20address,\x20convert_witness\x20OrderAllocation,\x20allocation.balance\x20>=\x20revisit\x20fee)\x20AND\x20publish\x20through\x20a\x20template\x20'+'carrying\x20that\x20convention,\x20or\x20replace\x20the\x20loop\x20with\x20per-period\x20NEW\x20Orders\x20(REUSE\x20pattern,\x20Machine\x20stays\x20a\x20DAG).\x20'+'A\x20funded\x20renewal\x20loop\x20(post-period\x20node\x20back\x20into\x20a\x20charging\x20node,\x20advanced\x20via\x20the\x20one-PTB\x20order_renew\x20call)\x20'+'is\x20the\x20only\x20sanctioned\x20charge-bearing\x20cycle\x20shape.');j['length']>0x0&&c['push']('pre_publish:\x20machine\x20contains\x20renewal\x20loop\x20cycle(s)\x20'+j['map'](z=>'['+z['c']['cycle']['join']('\x20->\x20')+']')['join'](',\x20')+'\x20—\x20on-chain\x20a\x20revisit\x20'+'is\x20NOT\x20verified\x20to\x20re-fund\x20the\x20Allocation.\x20Every\x20renewal/loop\x20forward\x20MUST\x20carry\x20the\x20new-period\x20'+'payment\x20into\x20the\x20order\x20escrow\x20atomically\x20(use\x20the\x20order\x20call\x27s\x20order_renew\x20field:\x20create\x20the\x20period\x20payment,\x20receive\x20it\x20into\x20the\x20'+'allocation,\x20and\x20advance\x20the\x20progress\x20—\x20all\x20in\x20one\x20transaction),\x20or\x20the\x20loop\x20allows\x20zero-value\x20'+'re-delivery\x20cycles\x20(test/11\x20R2-F3).\x20'+'Recommended:\x20bind\x20a\x20fund-gate\x20Guard\x20on\x20the\x20loop\x20forward\x20(constant\x20=\x20order\x20address,\x20convert_witness\x20OrderAllocation(109),\x20'+'allocation.balance\x20query\x201051\x20>=\x20period\x20price)\x20—\x20the\x20query\x20is\x20live\x20on-chain,\x20so\x20a\x20guarded\x20renewal\x20loop\x20is\x20now\x20the\x20'+'expressible\x20alternative\x20to\x20per-period\x20NEW\x20Orders\x20for\x20long\x20subscriptions.');k['length']>0x0&&c['push']('pre_publish:\x20machine\x20contains\x20remedy\x20loop\x20cycle(s)\x20'+k['map'](z=>'['+z['c']['cycle']['join']('\x20->\x20')+']')['join'](',\x20')+'\x20—\x20'+'a\x20same-order\x20revisit\x20(revision/refund/cancel\x20family)\x20implies\x20NO\x20new\x20charge,\x20so\x20no\x20fund\x20gate\x20is\x20needed\x20on\x20it\x20'+'(the\x20allocation.balance\x20query\x20exists\x20but\x20is\x20irrelevant\x20here).\x20Visible\x20by\x20design\x20(crs\x20P2-3):\x20if\x20the\x20business\x20EVER\x20intends\x20'+'a\x20revisit\x20to\x20cost\x20money,\x20that\x20fee\x20IS\x20enforceable\x20via\x20the\x20balance\x20query\x20(1051)\x20—\x20but\x20that\x20reshapes\x20the\x20cycle\x20into\x20the\x20'+'charge\x20tier\x20above;\x20keep\x20remedy\x20revisits\x20free\x20or\x20restructure\x20as\x20per-period\x20NEW\x20Orders.');for(const z of d){const A=typeof z?.['name']==='string'?z['name']:'?';for(const B of z?.['pairs']??[]){for(const C of B?.['forwards']??[]){const D=C?.['namedOperator']!==undefined&&C?.['namedOperator']!==null,E=C?.['permissionIndex']!==undefined&&C?.['permissionIndex']!==null,F=C?.['guard']!==undefined&&C?.['guard']!==null;!D&&!E&&!F&&c['push']('pre_publish:\x20node\x20\x22'+A+'\x22\x20forward\x20\x22'+String(C?.['name']??'?')+'\x22\x20has\x20no\x20executor\x20binding\x20(namedOperator\x20/\x20permissionIndex\x20/\x20guard)\x20—\x20no\x20one\x20can\x20advance\x20it');}}}const m=lintForwardAmbiguity(a,'pre_publish');b['push'](...m['critical']),c['push'](...m['warnings']);const o=computeTerminalReachability(a);return o['unreachable']['length']>0x0&&c['push']('pre_publish:\x20unreachable\x20machine\x20node(s)\x20'+o['unreachable']['map'](G=>'\x22'+G+'\x22')['join'](',\x20')+'\x20—\x20'+'no\x20path\x20from\x20the\x20entry\x20pair\x20reaches\x20them;\x20dead\x20topology\x20is\x20frozen\x20at\x20publish\x20(IMMUT-001).\x20'+'Wire\x20them\x20into\x20the\x20flow\x20or\x20remove\x20them\x20before\x20publish'),{'critical':b,'warnings':c};}export function computeTerminalReachability(a){const b=[],c=[];if(!Array['isArray'](a)||a['length']===0x0)return{'terminals':b,'unreachable':c};const d=a,e=new Map(),f=[],g=[];for(const j of d){const k=typeof j?.['name']==='string'?j['name']:'';if(!k)continue;f['push'](k);if(!e['has'](k))e['set'](k,[]);let l=![];for(const m of j?.['pairs']??[]){const o=m?.['prev_node'];if(o==='')l=!![];else{if(typeof o==='string'&&o!==''){const q=e['get'](o);if(q)q['push'](k);else e['set'](o,[k]);}}}if(l)g['push'](k);}if(f['length']===0x0||g['length']===0x0)return{'terminals':b,'unreachable':c};const h=new Set(),i=[...g];while(i['length']>0x0){const r=i['pop']();if(h['has'](r))continue;h['add'](r);for(const s of e['get'](r)??[])i['push'](s);}for(const t of f){if(!h['has'](t))c['push'](t);else{if((e['get'](t)??[])['length']===0x0)b['push'](t);}}return{'terminals':b,'unreachable':c};}export const AUDIT_RULES=[{'id':'audit_machine_bound','description':'Service\x20should\x20have\x20a\x20Machine\x20workflow\x20bound\x20before\x20publish','severity':'warning','fields':['machine'],'check':(a,b)=>{if(!a?.['publish'])return!![];return!!a?.['machine'];},'message':()=>'Publishing\x20a\x20service\x20without\x20a\x20Machine\x20workflow.\x20Customers\x20won\x27t\x20have\x20a\x20structured\x20order\x20process.','recommendation':'Create\x20a\x20Machine\x20(workflow\x20template)\x20and\x20bind\x20it\x20to\x20the\x20service\x20before\x20publishing.\x20The\x20machine\x20field\x20becomes\x20IMMUTABLE\x20after\x20publish.'},{'id':'audit_order_allocators','description':'Service\x20should\x20have\x20order_allocators\x20for\x20fund\x20distribution','severity':'warning','fields':['order_allocators'],'check':a=>{if(!a?.['publish'])return!![];return allocatorCountOf(a)>0x0;},'message':()=>'Publishing\x20a\x20service\x20without\x20order_allocators.\x20Order\x20funds\x20cannot\x20be\x20auto-distributed\x20to\x20suppliers.','recommendation':'Configure\x20order_allocators\x20before\x20publishing\x20—\x20this\x20field\x20becomes\x20IMMUTABLE\x20after\x20publish.'},{'id':'audit_buy_guard','description':'Service\x20should\x20have\x20a\x20buy_guard\x20for\x20customer\x20screening','severity':'info','fields':['buy_guard'],'check':a=>!!a?.['buy_guard'],'message':()=>'No\x20buy_guard\x20configured\x20—\x20anyone\x20can\x20purchase\x20this\x20service\x20without\x20verification.','recommendation':'Consider\x20adding\x20a\x20Guard\x20to\x20verify\x20customer\x20eligibility\x20(e.g.,\x20identity,\x20wallet\x20balance,\x20location).'},{'id':'audit_arb_alloc_boundary','description':'Arbitration\x20and\x20Allocator\x20coexist\x20→\x20surface\x20the\x20two-system\x20boundary\x20reminder','severity':'warning','fields':['arbitrations','compensation_fund_add','compensation_fund','order_allocators'],'check':a=>{if(!a?.['publish'])return!![];const b=arbitrationRefsOf(a)['length']>0x0||compensationFundOf(a)!==undefined;return!(b&&allocatorCountOf(a)>0x0);},'message':()=>'Arbitration\x20and\x20Allocator\x20are\x20INDEPENDENT\x20systems\x20by\x20design:\x20a\x20ruling\x20records\x20the\x20case\x20and\x20pays\x20from\x20the\x20service\x20compensation\x20fund\x20—\x20it\x20never\x20moves\x20escrow\x20and\x20never\x20advances\x20the\x20workflow.\x20With\x20both\x20configured,\x20a\x20buyer\x20can\x20receive\x20BOTH\x20the\x20arbitration\x20compensation\x20AND\x20a\x20full\x20escrow\x20refund\x20unless\x20the\x20refund/settlement\x20path\x20is\x20gated.\x20This\x20is\x20a\x20boundary\x20reminder,\x20not\x20a\x20defect\x20—\x20verify\x20the\x20coupling\x20check\x20was\x20done\x20deliberately.','recommendation':'Gate\x20the\x20refund/settlement\x20allocator\x27s\x20Guard\x20on\x20order.claimed_by\x20(read-only\x20cross-system\x20evidence\x20—\x20the\x20sanctioned\x20link),\x20or\x20hold\x20the\x20final\x20settlement\x20forward\x20until\x20the\x20case\x20closes.\x20Do\x20NOT\x20couple\x20the\x20systems\x20the\x20other\x20way\x20(no\x20dispute\x20state\x20on\x20the\x20order\x20flow,\x20no\x20workflow\x20step\x20into\x20arbitration):\x20coupling\x20opens\x20the\x20double-pay\x20path.\x20For\x20per-case\x20fund\x20actions,\x20the\x20deposit-reimbursement\x20pattern\x20(guard-design\x20patterns)\x20is\x20the\x20supported\x20route.'},{'id':'audit_compensation_fund','description':'Service\x20should\x20have\x20a\x20compensation_fund\x20for\x20trust','severity':'warning','fields':['compensation_fund_add','compensation_fund'],'check':a=>compensationFundOf(a)!==undefined,'message':()=>'No\x20compensation_fund\x20configured.\x20Customers\x20have\x20no\x20financial\x20protection\x20if\x20you\x20fail\x20to\x20deliver.','recommendation':'Deposit\x20via\x20compensation_fund_add\x20{balance}\x20to\x20enable\x20arbitration\x20payouts.\x20The\x20fund\x20deters\x20fraud\x20and\x20enables\x20arbitration\x20claims.'},{'id':'audit_arbitrations','description':'Service\x20should\x20have\x20arbitration\x20options\x20for\x20dispute\x20resolution','severity':'info','fields':['arbitrations'],'check':a=>arbitrationRefsOf(a)['length']>0x0,'message':()=>'No\x20arbitration\x20configured.\x20Disputes\x20cannot\x20be\x20resolved\x20through\x20a\x20third\x20party.','recommendation':'Add\x20at\x20least\x20one\x20Arbitration\x20object\x20via\x20arbitrations:{op:\x27add\x27,\x20objects:[...]}\x20to\x20enable\x20on-chain\x20dispute\x20resolution.'},{'id':'audit_arbitration_removal_strands_awards','description':'Removing\x20an\x20authorized\x20venue\x20can\x20strand\x20an\x20award\x20it\x20already\x20ruled\x20on','severity':'error','fields':['arbitrations'],'check':a=>{const b=a?.['arbitrations']?.['remove']??a?.['arbitrations']?.['clear'],c=Array['isArray'](b)?b['length']>0x0:a?.['arbitrations']?.['op']==='clear';if(!c)return!![];if(arbitrationRefsOf(a)['length']>0x0)return!![];return compensationFundOf(a)===undefined;},'message':a=>{const b=a?.['arbitrations']?.['clear']?'every\x20authorized\x20venue':'venue(s)\x20'+(a?.['arbitrations']?.['remove']??[])['join'](',\x20');return'Removing\x20'+b+'\x20while\x20a\x20compensation\x20fund\x20is\x20configured\x20makes\x20any\x20award\x20it\x20already\x20ruled\x20on\x20UNPAYABLE:\x20an\x20on-chain\x20payout\x20now\x20requires\x20the\x20deciding\x20venue\x20to\x20still\x20be\x20on\x20the\x20Service\x27s\x20allowlist,\x20so\x20paying\x20out\x20aborts\x20with\x20E_ARBITRATION_NOT_ALLOWED=39\x20and\x20the\x20escrowed\x20funds\x20stay\x20stranded.';},'recommendation':'Before\x20removing\x20a\x20venue,\x20confirm\x20no\x20case\x20it\x20ruled\x20on\x20is\x20still\x20awaiting\x20compensation\x20payout\x20(query\x20the\x20Arb\x20objects\x20for\x20status\x20Arbitrated,\x20not\x20Finished).\x20Add\x20the\x20replacement\x20venue\x20FIRST,\x20drain\x20the\x20old\x20venue\x27s\x20cases,\x20and\x20only\x20then\x20remove\x20it.\x20A\x20buyer\x20should\x20never\x20be\x20left\x20holding\x20an\x20uncollectable\x20award.'},{'id':'audit_price','description':'Service\x20should\x20have\x20at\x20least\x20one\x20priced\x20sale\x20item','severity':'error','fields':['sales'],'check':a=>{const b=salesItemsOf(a);if(b['length']===0x0)return!![];return b['some'](c=>c?.['price']!==undefined&&c?.['price']!==null);},'message':()=>'Sales\x20list\x20present\x20but\x20no\x20item\x20has\x20a\x20price.\x20Customers\x20cannot\x20place\x20orders\x20without\x20knowing\x20the\x20cost.','recommendation':'Set\x20price\x20on\x20each\x20sales\x20item\x20(smallest-unit\x20string\x20or\x20display\x20form\x20like\x20\x272.5WOW\x27).'},{'id':'audit_compensation_fund_covers_award_ceiling','description':'compensation_fund\x20must\x20cover\x20the\x203x\x20award\x20ceiling\x20of\x20the\x20largest\x20sale','severity':'error','fields':['compensation_fund_add','compensation_fund','sales'],'check':a=>{if(!a?.['publish'])return!![];const b=compensationFundOf(a);if(b===undefined)return!![];const c=numericAmount(b);if(c===undefined)return!![];if(c===0x0)return![];const e=salesItemsOf(a)['map'](g=>numericAmount(g?.['price']))['filter'](g=>g!==undefined&&g>0x0);if(e['length']===0x0)return!![];const f=e['reduce']((g,h)=>g+h,0x0);return c>=MAX_INDEMNITY_MULTIPLE*f;},'message':()=>'compensation_fund\x20does\x20not\x20cover\x20the\x20award\x20ceiling.\x20An\x20award\x20is\x20hard-capped\x20at\x20'+MAX_INDEMNITY_MULTIPLE+'x\x20'+'the\x20order\x20amount\x20(arb.move\x20MAX_INDEMNITY_MULTIPLE,\x20enforced\x20at\x20ruling\x20time),\x20so\x20a\x20ruling\x20at\x20the\x20ceiling\x20'+'would\x20abort\x20the\x20buyer\x27s\x20claim\x20with\x2027\x20(E_COMPENSATION_NOT_MATCH)\x20—\x20the\x20ruling\x20stands\x20but\x20is\x20unpayable\x20'+'until\x20you\x20deposit,\x20and\x20the\x20abort\x20does\x20NOT\x20consume\x20the\x20claim.','recommendation':'Top\x20up\x20to\x20at\x20least\x20'+MAX_INDEMNITY_MULTIPLE+'x\x20your\x20largest\x20single\x20order\x20via\x20compensation_fund_add.\x20Above\x20'+(MAX_INDEMNITY_MULTIPLE+'x\x20is\x20optional:\x20it\x20only\x20buys\x20tolerance\x20for\x20several\x20CONCURRENT\x20claims\x20against\x20the\x20')+'one\x20per-Service\x20pool\x20(there\x20is\x20no\x20on-chain\x20concurrency\x20limit),\x20which\x20is\x20a\x20capital-allocation\x20choice.'},{'id':'audit_description','description':'Service\x20should\x20have\x20a\x20description','severity':'warning','fields':['description'],'check':a=>typeof a?.['description']==='string'&&a['description']['length']>0x0,'message':()=>'Service\x20has\x20no\x20description.\x20Customers\x20won\x27t\x20understand\x20what\x20you\x27re\x20offering.','recommendation':'Write\x20a\x20clear\x20description\x20of\x20the\x20service,\x20including\x20deliverables,\x20timelines,\x20and\x20terms.'},{'id':'audit_named_new_name','description':'Service\x20being\x20created\x20should\x20have\x20a\x20name','severity':'warning','check':a=>serviceNameOf(a)!==undefined,'message':()=>'Creating\x20a\x20service\x20without\x20a\x20name\x20makes\x20it\x20hard\x20to\x20reference\x20and\x20organize.','recommendation':'Set\x20object:{name:\x20...}\x20(or\x20namedNew.name)\x20following\x20the\x20convention:\x20<projectPrefix>_<service>_<purpose>.'},{'id':'audit_customer_required_needs_um','description':'customer_required\x20requires\x20a\x20Contact\x20bound\x20via\x20um\x20(SDK-enforced\x20hard\x20link;\x20mirrored\x20here)','severity':'error','fields':['customer_required','um'],'check':a=>{const b=Array['isArray'](a?.['customer_required'])?a['customer_required']:[];if(b['length']===0x0)return!![];return!!a?.['um'];},'message':()=>'customer_required\x20is\x20set\x20but\x20no\x20Contact\x20is\x20bound\x20via\x20um\x20—\x20customers\x20cannot\x20deliver\x20the\x20required\x20private\x20information\x20through\x20end-to-end\x20encrypted\x20Messenger.','recommendation':'Bind\x20um:{Contact\x20name/id}\x20in\x20the\x20same\x20call\x20(SDK\x20order_new\x20will\x20fail\x20the\x20buyer\x20otherwise).'},{'id':'audit_customer_required_is_declared_not_enforced','description':'customer_required\x20has\x20no\x20on-chain\x20enforcement\x20at\x20buy\x20time\x20—\x20a\x20Guard\x20must\x20gate\x20fulfilment','severity':'warning','fields':['customer_required'],'check':a=>{const b=Array['isArray'](a?.['customer_required'])?a['customer_required']:[];return b['length']===0x0;},'message':a=>{const b=Array['isArray'](a?.['customer_required'])?a['customer_required']:[];return'customer_required\x20('+b['length']+'\x20field(s):\x20'+b['join'](',\x20')+')\x20is\x20DECLARATIVE\x20ONLY:\x20the\x20on-chain\x20purchase\x20entry\x20never\x20reads\x20this\x20list,\x20so\x20an\x20order\x20that\x20supplies\x20none\x20of\x20these\x20fields\x20is\x20still\x20created\x20and\x20progresses.\x20Nothing\x20on-chain\x20will\x20stop\x20it.';},'recommendation':'Bind\x20pattern.required_info_evidence_gate\x20(schema_query\x20action=get_guard_design_patterns)\x20on\x20the\x20first\x20forward\x20that\x20needs\x20the\x20information:\x20query\x20\x27order.required_info\x20some\x27\x20(1572)\x20over\x20the\x20Order.\x20The\x20buyer\x20records\x20the\x20credential\x20via\x20order_required_info_update:\x20EITHER\x20the\x20merchant\x27s\x20IM\x20user\x20address\x20resolved\x20from\x20the\x20Service\x27s\x20Contact\x20(zero\x20cost,\x20address\x20record\x20only)\x20OR\x20an\x20on-chain\x20WTS\x20Proof\x20object\x20address\x20(embeds\x20the\x20merchant\x20IM\x20address\x20and\x20the\x20last-message\x20timestamp;\x20costs\x20gas,\x20publicly\x20verifiable).\x20\x27order.required_info\x27\x20(1573)\x20returns\x20the\x20recorded\x20address\x20but\x20aborts\x20while\x20nothing\x20is\x20recorded\x20—\x20gate\x20on\x201572\x20first.\x20When\x20the\x20listing\x20genuinely\x20promises\x20a\x20PER-ORDER\x20credential,\x20prefer\x20the\x20controlled\x20bind\x20entry\x20(order_required_info_bind):\x20the\x20chain\x20verifies\x20the\x20Proof\x20is\x20about\x20THIS\x20order\x20and\x20owner-created\x20at\x20write\x20time\x20and\x20rejects\x20a\x20mismatch\x20—\x20no\x20guard\x20needed\x20to\x20catch\x20a\x20wrong-proof\x20record.'},{'id':'audit_dangling_deps','description':'Service\x20dependencies\x20should\x20be\x20fully\x20created','severity':'error','check':(a,b)=>{if(!a?.['publish'])return!![];if(!b?.['graph'])return!![];const c=b['graph']['findDanglingDependencies']()??[];return c['length']===0x0;},'message':()=>'Service\x20references\x20objects\x20that\x20are\x20not\x20yet\x20created.\x20Publishing\x20will\x20lock\x20these\x20references.','recommendation':'Ensure\x20all\x20referenced\x20objects\x20(machine,\x20allocators,\x20guards)\x20are\x20created\x20and\x20finalized\x20before\x20publishing.'},{'id':'audit_type_parameter','description':'Service\x20should\x20have\x20a\x20token\x20type\x20specified','severity':'info','fields':['type_parameter','namedNew'],'check':a=>typeParameterOf(a)!==undefined,'message':()=>'No\x20payment\x20token\x20type\x20specified.\x20Defaulting\x20to\x20WOW\x20(0x2::wow::WOW).','recommendation':'Explicitly\x20set\x20type_parameter\x20(inside\x20object:{...})\x20if\x20you\x20want\x20to\x20accept\x20non-WOW\x20tokens\x20(e.g.,\x20USDT,\x20ETH).'}];const RULE_INDEX=new Map(AUDIT_RULES['map'](a=>[a['id'],a]));function readSeverityOverrides(){try{const {getJudgmentDoc:a}=require('../config/judgment.js');if(typeof a!=='function')return{};const b=a()?.['rules']?.['domains'];if(!b||typeof b!=='object')return{};const c={};for(const d of Object['values'](b)){const e=d?.['severity_overrides'];if(!e||typeof e!=='object')continue;for(const [f,g]of Object['entries'](e)){if(g==='error'||g==='warning'||g==='info')c[f]=g;}}return c;}catch{return{};}}export function auditService(a,b){const c=[],d=a?.['publish']===!![]&&typeof a?.['object']==='string',e=readSeverityOverrides();for(const f of AUDIT_RULES){try{if(d&&f['fields']&&!f['fields']['some'](g=>a[g]!==undefined))continue;!f['check'](a,b)&&c['push']({'rule_id':f['id'],'severity':e[f['id']]??f['severity'],'message':f['message'](a),'recommendation':f['recommendation']});}catch{}}return c;}export function hasBlockingErrors(a){return a['some'](b=>b['severity']==='error');}export function getErrors(a){return a['filter'](b=>b['severity']==='error');}export function getWarnings(a){return a['filter'](b=>b['severity']==='warning');}export function summarizeFindings(a){if(a['length']===0x0)return'All\x20audit\x20checks\x20passed.';const b=getErrors(a),c=getWarnings(a),d=a['filter'](g=>g['severity']==='info'),e=[];if(b['length']>0x0)e['push'](b['length']+'\x20error(s)');if(c['length']>0x0)e['push'](c['length']+'\x20warning(s)');if(d['length']>0x0)e['push'](d['length']+'\x20info');return'Audit:\x20'+e['join'](',\x20')+'.\x20Review\x20before\x20publishing.';}export const AUDIT_RULES_VERSION=0x5;
1
+ import{MAX_INDEMNITY_MULTIPLE}from'./onchain-constants.js';import{lintForwardAmbiguity,findLoopCycles}from'./machine-topology.js';import{isRenewalLoopEdge}from'../participation/radar-core.js';function numericAmount(a){if(typeof a==='number')return Number['isFinite'](a)?a:undefined;if(typeof a==='string'){const b=a['trim']();if(/^\d+$/['test'](b))return Number(b);}return undefined;}export{numericAmount};export function salesItemsOf(a){if(Array['isArray'](a?.['sales']))return a['sales'];if(Array['isArray'](a?.['sales']?.['sales']))return a['sales']['sales'];return[];}export function allocatorCountOf(a){const b=a?.['order_allocators'];if(Array['isArray'](b))return b['length'];if(Array['isArray'](b?.['allocators']))return b['allocators']['length'];return 0x0;}export function arbitrationRefsOf(b){const c=b?.['arbitrations'];if(Array['isArray'](c))return c['filter'](e=>typeof e==='string');if(Array['isArray'](c?.['objects']))return c['objects']['filter'](e=>typeof e==='string');return[];}export function compensationFundOf(a){if(a?.['compensation_fund_add']?.['balance']!=null)return a['compensation_fund_add']['balance'];if(a?.['compensation_fund']!=null)return a['compensation_fund'];return undefined;}export function serviceNameOf(a){if(typeof a?.['object']==='string')return a['object'];if(typeof a?.['object']?.['name']==='string'&&a['object']['name'])return a['object']['name'];if(typeof a?.['namedNew']?.['name']==='string'&&a['namedNew']['name'])return a['namedNew']['name'];return undefined;}export function typeParameterOf(a){if(typeof a?.['type_parameter']==='string'&&a['type_parameter'])return a['type_parameter'];if(typeof a?.['object']?.['type_parameter']==='string'&&a['object']['type_parameter'])return a['object']['type_parameter'];if(typeof a?.['namedNew']?.['type_parameter']==='string'&&a['namedNew']['type_parameter'])return a['namedNew']['type_parameter'];return undefined;}export const DISPUTE_FAMILY_NODE_REGEX=/(^|_)(disputed?|arbitration|arb)(_|$)/i;export const FUND_TERMINAL_NODE_REGEX=/^(refund|refunded|deposit_refunded|deposit_deducted|cancel|cancelled)$/i;export const ANTI_PATTERN_NODE_REGEX=new RegExp(DISPUTE_FAMILY_NODE_REGEX['source']+'|'+FUND_TERMINAL_NODE_REGEX['source'],'i');export const REMEDY_FAMILY_NODE_REGEX=/(revis|review|rework|refund|cancel|return|claim)/i;export function isRemedyLoopEdge(a,b){return REMEDY_FAMILY_NODE_REGEX['test'](a)||REMEDY_FAMILY_NODE_REGEX['test'](b);}export function classifyLoopCycle(a){for(let b=0x0;b<a['length'];b++){if(isRenewalLoopEdge(a[b],a[(b+0x1)%a['length']]))return'renewal';}if(a['some'](c=>REMEDY_FAMILY_NODE_REGEX['test'](c)))return'remedy';return'charge';}export function auditMachineNodes(a){const b=[],c=[];if(!Array['isArray'](a)||a['length']===0x0)return c['push']('pre_publish:\x20machine\x20node\x20set\x20unavailable\x20—\x20topology\x20not\x20verifiable;\x20'+'verify\x20via\x20machineNode2file\x20BEFORE\x20publish\x20(immutable\x20after\x20publish,\x20IMMUT-001)'),{'critical':b,'warnings':c};const d=a;for(const q of d){const r=typeof q?.['name']==='string'?q['name']:'';if(!r)continue;if(DISPUTE_FAMILY_NODE_REGEX['test'](r))b['push']('R-M1-11:\x20machine\x20node\x20\x22'+r+'\x22\x20models\x20dispute\x20flow\x20—\x20'+'disputes\x20must\x20route\x20via\x20the\x20separate\x20Arbitration\x20object\x20(off-Machine);\x20'+'rename\x20the\x20node\x20to\x20the\x20business\x20state\x20that\x20triggers\x20it');else FUND_TERMINAL_NODE_REGEX['test'](r)&&c['push']('R-M1-11:\x20machine\x20node\x20\x22'+r+'\x22\x20uses\x20a\x20bare\x20fund-terminal\x20name\x20—\x20reaching\x20'+'it\x20moves\x20no\x20funds\x20by\x20itself.\x20This\x20is\x20legitimate\x20ONLY\x20when\x20a\x20refund\x20allocator\x20'+'rail\x27s\x20guard\x20anchors\x20to\x20this\x20node\x20(per-node\x20refund\x20tracks);\x20otherwise\x20rename\x20it\x20'+'to\x20the\x20business\x20state\x20(e.g.\x20cancel_requested\x20/\x20closed_cancel)\x20and\x20route\x20the\x20'+'refund\x20via\x20an\x20Allocator\x20triggered\x20by\x20that\x20state.\x20The\x20template\x20scanner\x20verifies\x20'+'the\x20anchoring\x20when\x20a\x20template\x20is\x20present.');}const e=new Set();for(const s of d){const t=typeof s?.['name']==='string'?s['name']:'';if(!t)continue;e['has'](t)&&b['push']('MC-C-04:\x20duplicate\x20machine\x20node\x20name\x20\x22'+t+'\x22\x20—\x20on-chain\x20will\x20reject\x20the\x20publish\x20transaction'),e['add'](t);}const g=d['some'](u=>Array['isArray'](u?.['pairs'])&&u['pairs']['some'](v=>v?.['prev_node']===''));!g&&b['push']('Machine\x20has\x20no\x20entry\x20pair\x20(prev_node=\x22\x22)\x20—\x20Progress\x20can\x20never\x20advance\x20'+'from\x20the\x20initial\x20state;\x20orders\x20are\x20permanently\x20stuck');const h=new Map();for(const u of d){const v=typeof u?.['name']==='string'?u['name']:'';if(!v)continue;if(!h['has'](v))h['set'](v,[]);for(const w of u?.['pairs']??[]){const x=w?.['prev_node'];if(typeof x==='string'&&x!==''){const y=h['get'](x);if(y)y['push'](v);else h['set'](x,[v]);}}}const i=findLoopCycles(h)['map'](z=>({'c':z,'tier':classifyLoopCycle(z['cycle'])})),j=i['filter'](z=>z['tier']==='renewal'),k=i['filter'](z=>z['tier']==='remedy'),l=i['filter'](z=>z['tier']==='charge');l['length']>0x0&&b['push']('pre_publish:\x20machine\x20contains\x20charge-bearing\x20loop\x20cycle(s)\x20'+l['map'](z=>'['+z['c']['cycle']['join']('\x20->\x20')+']')['join'](',\x20')+'\x20—\x20'+'on-chain\x20a\x20revisit\x20is\x20NOT\x20verified\x20to\x20re-fund\x20the\x20Allocation,\x20and\x20this\x20static\x20pass\x20sees\x20only\x20the\x20forward\x27s\x20guard\x20reference\x20'+'(never\x20the\x20guard\x20table),\x20so\x20a\x20per-revisit-fee\x20cycle\x20(retake\x20/\x20session-card\x20shape)\x20is\x20UNPROVABLE\x20here\x20even\x20though\x20the\x20'+'allocation.balance\x20Guard\x20query\x20(1051,\x20witness\x20OrderAllocation\x20109)\x20makes\x20the\x20fee\x20enforceable\x20at\x20the\x20guard\x20layer\x20'+'(zero-value\x20re-delivery\x20cycles,\x20test/11\x20R2-F3\x20/\x20crs\x20P2-3).\x20Remedy:\x20bind\x20the\x20fund-gate\x20Guard\x20on\x20the\x20loop\x20forward\x20'+'(constant\x20=\x20order\x20address,\x20convert_witness\x20OrderAllocation,\x20allocation.balance\x20>=\x20revisit\x20fee)\x20AND\x20publish\x20through\x20a\x20template\x20'+'carrying\x20that\x20convention,\x20or\x20replace\x20the\x20loop\x20with\x20per-period\x20NEW\x20Orders\x20(REUSE\x20pattern\x20—\x20a\x20fresh\x20order\x20per\x20period\x20instead\x20of\x20an\x20in-order\x20loop\x20that\x20replays\x20its\x20forwards\x20every\x20lap).\x20'+'A\x20funded\x20renewal\x20loop\x20(post-period\x20node\x20back\x20into\x20a\x20charging\x20node,\x20advanced\x20via\x20the\x20one-PTB\x20order_renew\x20call)\x20'+'is\x20the\x20only\x20sanctioned\x20charge-bearing\x20cycle\x20shape.');j['length']>0x0&&c['push']('pre_publish:\x20machine\x20contains\x20renewal\x20loop\x20cycle(s)\x20'+j['map'](z=>'['+z['c']['cycle']['join']('\x20->\x20')+']')['join'](',\x20')+'\x20—\x20on-chain\x20a\x20revisit\x20'+'is\x20NOT\x20verified\x20to\x20re-fund\x20the\x20Allocation.\x20Every\x20renewal/loop\x20forward\x20MUST\x20carry\x20the\x20new-period\x20'+'payment\x20into\x20the\x20order\x20escrow\x20atomically\x20(use\x20the\x20order\x20call\x27s\x20order_renew\x20field:\x20create\x20the\x20period\x20payment,\x20receive\x20it\x20into\x20the\x20'+'allocation,\x20and\x20advance\x20the\x20progress\x20—\x20all\x20in\x20one\x20transaction),\x20or\x20the\x20loop\x20allows\x20zero-value\x20'+'re-delivery\x20cycles\x20(test/11\x20R2-F3).\x20'+'Recommended:\x20bind\x20a\x20fund-gate\x20Guard\x20on\x20the\x20loop\x20forward\x20(constant\x20=\x20order\x20address,\x20convert_witness\x20OrderAllocation(109),\x20'+'allocation.balance\x20query\x201051\x20>=\x20period\x20price)\x20—\x20the\x20query\x20is\x20live\x20on-chain,\x20so\x20a\x20guarded\x20renewal\x20loop\x20is\x20now\x20the\x20'+'expressible\x20alternative\x20to\x20per-period\x20NEW\x20Orders\x20for\x20long\x20subscriptions.');k['length']>0x0&&c['push']('pre_publish:\x20machine\x20contains\x20remedy\x20loop\x20cycle(s)\x20'+k['map'](z=>'['+z['c']['cycle']['join']('\x20->\x20')+']')['join'](',\x20')+'\x20—\x20'+'a\x20same-order\x20revisit\x20(revision/review/rework/refund/cancel\x20family)\x20implies\x20NO\x20new\x20charge,\x20so\x20no\x20fund\x20gate\x20is\x20needed\x20on\x20it\x20'+'(the\x20allocation.balance\x20query\x20exists\x20but\x20is\x20irrelevant\x20here).\x20Visible\x20by\x20design\x20(crs\x20P2-3):\x20if\x20the\x20business\x20EVER\x20intends\x20'+'a\x20revisit\x20to\x20cost\x20money,\x20that\x20fee\x20IS\x20enforceable\x20via\x20the\x20balance\x20query\x20(1051)\x20—\x20but\x20that\x20reshapes\x20the\x20cycle\x20into\x20the\x20'+'charge\x20tier\x20above;\x20keep\x20remedy\x20revisits\x20free\x20or\x20restructure\x20as\x20per-period\x20NEW\x20Orders.');for(const z of d){const A=typeof z?.['name']==='string'?z['name']:'?';for(const B of z?.['pairs']??[]){for(const C of B?.['forwards']??[]){const D=C?.['namedOperator']!==undefined&&C?.['namedOperator']!==null,E=C?.['permissionIndex']!==undefined&&C?.['permissionIndex']!==null,F=C?.['guard']!==undefined&&C?.['guard']!==null;!D&&!E&&!F&&c['push']('pre_publish:\x20node\x20\x22'+A+'\x22\x20forward\x20\x22'+String(C?.['name']??'?')+'\x22\x20has\x20no\x20executor\x20binding\x20(namedOperator\x20/\x20permissionIndex\x20/\x20guard)\x20—\x20no\x20one\x20can\x20advance\x20it');}}}const m=lintForwardAmbiguity(a,'pre_publish');b['push'](...m['critical']),c['push'](...m['warnings']);const o=computeTerminalReachability(a);return o['unreachable']['length']>0x0&&c['push']('pre_publish:\x20unreachable\x20machine\x20node(s)\x20'+o['unreachable']['map'](G=>'\x22'+G+'\x22')['join'](',\x20')+'\x20—\x20'+'no\x20path\x20from\x20the\x20entry\x20pair\x20reaches\x20them;\x20dead\x20topology\x20is\x20frozen\x20at\x20publish\x20(IMMUT-001).\x20'+'Wire\x20them\x20into\x20the\x20flow\x20or\x20remove\x20them\x20before\x20publish'),{'critical':b,'warnings':c};}export function computeTerminalReachability(a){const b=[],c=[];if(!Array['isArray'](a)||a['length']===0x0)return{'terminals':b,'unreachable':c};const d=a,e=new Map(),f=[],g=[];for(const j of d){const k=typeof j?.['name']==='string'?j['name']:'';if(!k)continue;f['push'](k);if(!e['has'](k))e['set'](k,[]);let l=![];for(const m of j?.['pairs']??[]){const o=m?.['prev_node'];if(o==='')l=!![];else{if(typeof o==='string'&&o!==''){const q=e['get'](o);if(q)q['push'](k);else e['set'](o,[k]);}}}if(l)g['push'](k);}if(f['length']===0x0||g['length']===0x0)return{'terminals':b,'unreachable':c};const h=new Set(),i=[...g];while(i['length']>0x0){const r=i['pop']();if(h['has'](r))continue;h['add'](r);for(const s of e['get'](r)??[])i['push'](s);}for(const t of f){if(!h['has'](t))c['push'](t);else{if((e['get'](t)??[])['length']===0x0)b['push'](t);}}return{'terminals':b,'unreachable':c};}export const REVIEW_FAMILY_NODE_REGEX=/(^|_)(review|reviews|reviewed|reviewing|evaluated|evaluate|feedback|rating|rated)(_|$)/i;export function lintReviewLockedTerminals(a,b){const c=[],d=[];if(!Array['isArray'](a)||a['length']===0x0)return{'critical':c,'warnings':d};const e=a,h=u=>Array['isArray'](u?.['pairs'])?u['pairs']:Array['isArray'](u?.['value'])?u['value']:[],i=[],j=[],k=[];for(const u of e){const v=typeof u?.['name']==='string'?u['name']:'';if(!v)continue;j['push'](v);let w=![];for(const x of h(u)){const y=x,z=y?.['prev_node'];if(z==='')w=!![];const A=Array['isArray'](y?.['forwards'])?y['forwards']:[],B=[];for(const C of A){const D=C,E=D?.['guard'],F=typeof E==='string'&&E['trim']()!==''?E:E&&typeof E==='object'?E['guard']??E['$ref']:undefined;if(typeof F==='string'&&F['trim']()!=='')B['push'](F);}typeof z==='string'&&z!==''&&i['push']({'from':z,'to':v,'guardRefs':B});}if(w)k['push'](v);}if(j['length']===0x0||k['length']===0x0)return{'critical':c,'warnings':d};const l=computeTerminalReachability(a);if(l['terminals']['length']===0x0)return{'critical':c,'warnings':d};const m=G=>{if(G['guardRefs']['length']===0x0)return![];for(const H of G['guardRefs']){const I=b['get'](H['toLowerCase']());if(!I||I['length']===0x0)return![];const J=I['every'](K=>REVIEW_FAMILY_NODE_REGEX['test'](K));if(!J||I['includes'](G['from']))return![];}return!![];},o=G=>REVIEW_FAMILY_NODE_REGEX['test'](G),q=G=>{const H=new Map();for(const K of i){if(m(K))continue;if(G&&(o(K['from'])||o(K['to'])))continue;const L=H['get'](K['from']);if(L)L['push'](K['to']);else H['set'](K['from'],[K['to']]);}const I=new Set(),J=[...k];while(J['length']>0x0){const M=J['pop']();if(I['has'](M))continue;I['add'](M);for(const N of H['get'](M)??[])J['push'](N);}return I;},r=q(![]),s=q(!![]);for(const G of l['terminals']){if(!r['has'](G))c['push']('REVIEW-LOCK-01:\x20terminal\x20\x22'+G+'\x22\x20is\x20enterable\x20ONLY\x20through\x20forward(s)\x20whose\x20guard\x20pins\x20a\x20'+'review/feedback\x20node\x20the\x20edge\x20itself\x20does\x20not\x20depart\x20from\x20—\x20the\x20rail\x20can\x20never\x20fire\x20(the\x20guard\x20asserts\x20a\x20'+'progress\x20state\x20this\x20transition\x20cannot\x20produce),\x20so\x20a\x20buyer\x20who\x20never\x20reviews\x20strands\x20every\x20order\x27s\x20'+'escrow\x20permanently.\x20Machine\x20topology\x20is\x20immutable\x20after\x20publish\x20(IMMUT-001).\x20Fix\x20BEFORE\x20publish:\x20'+'re-pin\x20the\x20settlement\x20guard\x20to\x20the\x20node\x20the\x20forward\x20actually\x20departs\x20from,\x20and\x20add\x20a\x20time-lock\x20keeper\x20'+'auto-confirm\x20rail\x20(the\x20template\x20deliver_confirm_timeout\x20convention)\x20so\x20settlement\x20never\x20depends\x20on\x20the\x20'+'buyer\x20choosing\x20to\x20review');else!s['has'](G)&&d['push']('REVIEW-LOCK-01:\x20terminal\x20\x22'+G+'\x22\x20is\x20reachable\x20only\x20THROUGH\x20a\x20review/feedback\x20node\x20—\x20a\x20buyer\x20who\x20'+'silently\x20skips\x20reviewing\x20can\x20never\x20let\x20their\x20order\x20reach\x20it.\x20The\x20sanctioned\x20shape\x20keeps\x20the\x20review\x20'+'stop\x20OPTIONAL\x20with\x20an\x20exit\x20edge\x20back\x20to\x20the\x20settlement\x20rail,\x20and\x20a\x20keeper\x20time-lock\x20rail\x20that\x20opens\x20'+'settlement\x20independently\x20(retail\x20deliver_confirm_timeout\x20convention).\x20Verify\x20one\x20of\x20the\x20two\x20exists;\x20'+'if\x20the\x20review\x20node\x20is\x20meant\x20to\x20be\x20keeper-advanceable,\x20this\x20is\x20satisfied\x20and\x20may\x20be\x20ignored');}return{'critical':c,'warnings':d};}export function arbitrationVotingLockDetail(a){if(!Array['isArray'](a))return null;if(a['length']>0x0)return null;return'voting_guard\x20is\x20empty\x20(no\x20guard-weighted\x20voters).\x20Plain\x20votes\x20hard-require\x20the\x20vote\x20permission\x20(358)\x20on\x20the\x20'+'arbitration\x27s\x20own\x20Permission:\x20only\x20that\x20Permission\x27s\x20admin\x20(its\x20creator,\x20by\x20default)\x20and\x20explicit\x20358\x20'+'grantees\x20pass\x20the\x20assert,\x20so\x20without\x20grants\x20the\x20disputing\x20CUSTOMER\x20can\x20never\x20vote\x20and\x20the\x20arb\x20admin\x20is\x20the\x20'+'only\x20possible\x20voter\x20AND\x20the\x20judge\x20—\x20a\x20dispute\x20opened\x20against\x20this\x20service\x20dead-locks\x20when\x20that\x20admin\x20is\x20'+'unresponsive.\x20Configure\x20a\x20public\x20voting_guard\x20on\x20the\x20Arbitration\x20(voting_guard\x20op=\x27set\x27\x20with\x20guard\x20+\x20vote\x20'+'weight\x20—\x20the\x20field\x20stays\x20mutable\x20after\x20publish;\x20the\x20standard\x20shape\x20is\x20tpl_voting_guard_open_vote,\x20the\x20'+'always-true\x20guard\x20at\x20FixedValue\x20weight\x201)\x20or\x20bind\x20an\x20arbitration\x20that\x20already\x20carries\x20one,\x20BEFORE\x20'+'publishing\x20this\x20service';}const TIME_PROFILE_UNIT_MS={'ms':0x1,'msec':0x1,'msecs':0x1,'millisecond':0x1,'milliseconds':0x1,'s':0x3e8,'sec':0x3e8,'secs':0x3e8,'second':0x3e8,'seconds':0x3e8,'m':0xea60,'min':0xea60,'mins':0xea60,'minute':0xea60,'minutes':0xea60,'h':0x36ee80,'hr':0x36ee80,'hrs':0x36ee80,'hour':0x36ee80,'hours':0x36ee80,'d':0x5265c00,'day':0x5265c00,'days':0x5265c00,'w':0x240c8400,'wk':0x240c8400,'wks':0x240c8400,'week':0x240c8400,'weeks':0x240c8400},TIME_PROFILE_DURATION_REGEX=/(\d+(?:\.\d+)?)\s*(ms|milliseconds?|msecs?|minutes?|mins?|seconds?|secs?|hours?|hrs?|days?|weeks?|wks?|min|sec|hr|wk|[smhdw])\b/gi,TIME_PROFILE_ADMISSION_REGEX=/compress(?:ed|ion)|accelerat(?:ed|ion)|shorten(?:ed)?(?:\s+for)?|test\s+(?:value|window|duration|constant)|demo\s+(?:value|window|duration)|for\s+(?:fast\s+|quick\s+)?test(?:ing)?|regression\s+(?:value|window)/i;function timeProfileIsTimeQuery(a){if(typeof a==='number')return a===0x4f7||a===0x4f8||a===0x500;if(typeof a==='string')return/(^|\.)time$|current_time/i['test'](a);return![];}function timeProfileNodeChildren(a){const b=[];for(const c of['nodes','node','nodeLeft','nodeRight','parameters','historyIdx','sessionIdx','forwardIdx','where','find','recipient']){const d=a[c];if(Array['isArray'](d))b['push'](...d);else{if(d&&typeof d==='object')b['push'](d);}}return b;}export function guardTimeProfileDetail(a){const b=typeof a['description']==='string'?a['description']:'',c=TIME_PROFILE_ADMISSION_REGEX['test'](b);let d=0x0;for(const l of b['matchAll'](TIME_PROFILE_DURATION_REGEX)){const n=TIME_PROFILE_UNIT_MS[l[0x2]['toLowerCase']()];if(!n)continue;const o=Number(l[0x1])*n;if(Number['isFinite'](o)&&o>d)d=o;}if(!c&&d===0x0)return null;const e=Array['isArray'](a['table'])?a['table']:[],f=p=>{const q=e['find'](r=>Number(r?.['identifier'])===p);return numericAmount(q?.['value']);},h=p=>{if(!p||typeof p!=='object')return![];const q=p;if(q['type']==='context'&&q['context']==='Clock')return!![];if(q['type']==='query'&&timeProfileIsTimeQuery(q['query']))return!![];if(q['type']==='query_progress_history_time')return!![];return timeProfileNodeChildren(q)['some'](h);},i=[],j=(p,q)=>{if(!p||typeof p!=='object')return;const r=p,s=q||typeof r['type']==='string'&&r['type']['startsWith']('calc_');if(r['type']==='identifier'&&s){const t=f(Number(r['identifier']));if(t!==undefined&&t>0x0)i['push'](t);}for(const u of timeProfileNodeChildren(r))j(u,s);};if(a['root']&&typeof a['root']==='object'&&h(a['root']))j(a['root'],![]);const k=i['find'](p=>p<d/0x64);if(k!==undefined){const p=q=>q>=0x5265c00?q/0x5265c00+'d':q>=0x36ee80?q/0x36ee80+'h':q>=0xea60?q/0xea60+'min':q/0x3e8+'s';return{'level':'critical','detail':'time\x20constant\x20'+p(k)+'\x20is\x20>=100x\x20below\x20the\x20production\x20duration\x20the\x20description\x20itself\x20'+('declares\x20('+p(d)+')\x20—\x20a\x20compressed\x20test\x20value\x20frozen\x20into\x20a\x20production\x20guard.\x20Guards\x20')+'freeze\x20at\x20publish\x20(IMMUT-001),\x20so\x20the\x20window\x20will\x20enforce\x20the\x20compressed\x20value\x20against\x20real\x20orders\x20'+'(klook\x20mainnet\x20261014:\x20\x2724h\x20free\x20cancellation\x27\x20enforced\x20as\x202\x20minutes).\x20Rebuild\x20the\x20guard\x20with\x20the\x20'+'production\x20duration\x20from\x20the\x20template\x20fee_params\x20BEFORE\x20publishing'};}if(c)return{'level':'warning','detail':'description\x20admits\x20compressed/accelerated\x20time\x20constants,\x20but\x20NO\x20time\x20constant\x20in\x20this\x20guard\x27s\x20logic\x20'+'tree\x20is\x20>=100x\x20below\x20the\x20declared\x20production\x20duration\x20—\x20the\x20values\x20look\x20production-scaled.\x20Manual\x20'+'review\x20requested\x20(prose\x20alone\x20no\x20longer\x20blocks\x20publish,\x20BF-07):\x20confirm\x20the\x20tree\x20constants\x20match\x20the\x20'+'production\x20durations\x20in\x20the\x20template\x20fee_params\x20BEFORE\x20publishing\x20—\x20guards\x20freeze\x20at\x20publish\x20'+'(IMMUT-001),\x20so\x20a\x20mis-scaled\x20window\x20(klook\x20mainnet\x20261014:\x20\x2724h\x20free\x20cancellation\x27\x20enforced\x20as\x202\x20'+'minutes)\x20is\x20UNFIXABLE'};return null;}export function rewardRefsOf(a){const b=a?.['rewards'];if(typeof b==='string'&&b['trim']()!=='')return[b];if(Array['isArray'](b))return b['filter'](c=>typeof c==='string'&&c['trim']()!=='');if(Array['isArray'](b?.['objects']))return b['objects']['filter'](c=>typeof c==='string'&&c['trim']()!=='');return[];}export function serviceRewardsUnfundedDetail(b){if(!b||typeof b!=='object')return null;const c=b['data']??b,d=Array['isArray'](c?.['guards'])?c['guards']:[],e=numericAmount(c?.['balance']?.['value']??c?.['balance']);if(e===undefined)return null;let f=0x0;for(const h of d){const i=h?.['amount'];if(i?.['type']!==0x1)continue;const j=numericAmount(i?.['value']?.['value']??i?.['value']);if(j!==undefined&&j>f)f=j;}if(f===0x0)return null;if(e>=f)return null;return'reward\x20pool\x20balance\x20'+e+'\x20cannot\x20cover\x20its\x20largest\x20single-claim\x20promise\x20('+f+').\x20'+'The\x20on-chain\x20publish\x20entry\x20does\x20NOT\x20verify\x20reward\x20funding\x20—\x20a\x20failed\x20reward_fund\x20transfer\x20still\x20'+'publishes\x20(onlyfans\x20mainnet\x20261014\x20shipped\x20a\x20store\x20promising\x20cashback\x20with\x20an\x20empty\x20pool),\x20and\x20the\x20'+'claim\x20aborts\x20once\x20the\x20pool\x20drains.\x20Fund\x20the\x20Reward\x20(reward_fund)\x20up\x20to\x20expected_orders\x20x\x20per-claim\x20'+'amount,\x20or\x20remove\x20the\x20reward\x20binding\x20BEFORE\x20publishing\x20this\x20service';}export const AUDIT_RULES=[{'id':'audit_machine_bound','description':'Service\x20should\x20have\x20a\x20Machine\x20workflow\x20bound\x20before\x20publish','severity':'warning','fields':['machine'],'check':(a,b)=>{if(!a?.['publish'])return!![];return!!a?.['machine'];},'message':()=>'Publishing\x20a\x20service\x20without\x20a\x20Machine\x20workflow.\x20Customers\x20won\x27t\x20have\x20a\x20structured\x20order\x20process.','recommendation':'Create\x20a\x20Machine\x20(workflow\x20template)\x20and\x20bind\x20it\x20to\x20the\x20service\x20before\x20publishing.\x20The\x20machine\x20field\x20becomes\x20IMMUTABLE\x20after\x20publish.'},{'id':'audit_order_allocators','description':'Service\x20should\x20have\x20order_allocators\x20for\x20fund\x20distribution','severity':'warning','fields':['order_allocators'],'check':a=>{if(!a?.['publish'])return!![];return allocatorCountOf(a)>0x0;},'message':()=>'Publishing\x20a\x20service\x20without\x20order_allocators.\x20Order\x20funds\x20cannot\x20be\x20auto-distributed\x20to\x20suppliers.','recommendation':'Configure\x20order_allocators\x20before\x20publishing\x20—\x20this\x20field\x20becomes\x20IMMUTABLE\x20after\x20publish.'},{'id':'audit_buy_guard','description':'Service\x20should\x20have\x20a\x20buy_guard\x20for\x20customer\x20screening','severity':'info','fields':['buy_guard'],'check':a=>!!a?.['buy_guard'],'message':()=>'No\x20buy_guard\x20configured\x20—\x20anyone\x20can\x20purchase\x20this\x20service\x20without\x20verification.','recommendation':'Consider\x20adding\x20a\x20Guard\x20to\x20verify\x20customer\x20eligibility\x20(e.g.,\x20identity,\x20wallet\x20balance,\x20location).'},{'id':'audit_arb_alloc_boundary','description':'Arbitration\x20and\x20Allocator\x20coexist\x20→\x20surface\x20the\x20two-system\x20boundary\x20reminder','severity':'warning','fields':['arbitrations','compensation_fund_add','compensation_fund','order_allocators'],'check':a=>{if(!a?.['publish'])return!![];const b=arbitrationRefsOf(a)['length']>0x0||compensationFundOf(a)!==undefined;return!(b&&allocatorCountOf(a)>0x0);},'message':()=>'Arbitration\x20and\x20Allocator\x20are\x20INDEPENDENT\x20systems\x20by\x20design:\x20a\x20ruling\x20records\x20the\x20case\x20and\x20pays\x20from\x20the\x20service\x20compensation\x20fund\x20—\x20it\x20never\x20moves\x20escrow\x20and\x20never\x20advances\x20the\x20workflow.\x20With\x20both\x20configured,\x20a\x20buyer\x20can\x20receive\x20BOTH\x20the\x20arbitration\x20compensation\x20AND\x20a\x20full\x20escrow\x20refund\x20unless\x20the\x20refund/settlement\x20path\x20is\x20gated.\x20This\x20is\x20a\x20boundary\x20reminder,\x20not\x20a\x20defect\x20—\x20verify\x20the\x20coupling\x20check\x20was\x20done\x20deliberately.','recommendation':'Gate\x20the\x20refund/settlement\x20allocator\x27s\x20Guard\x20on\x20order.claimed_by\x20(read-only\x20cross-system\x20evidence\x20—\x20the\x20sanctioned\x20link),\x20or\x20hold\x20the\x20final\x20settlement\x20forward\x20until\x20the\x20case\x20closes.\x20Do\x20NOT\x20couple\x20the\x20systems\x20the\x20other\x20way\x20(no\x20dispute\x20state\x20on\x20the\x20order\x20flow,\x20no\x20workflow\x20step\x20into\x20arbitration):\x20coupling\x20opens\x20the\x20double-pay\x20path.\x20For\x20per-case\x20fund\x20actions,\x20the\x20deposit-reimbursement\x20pattern\x20(guard-design\x20patterns)\x20is\x20the\x20supported\x20route.'},{'id':'audit_compensation_fund','description':'Service\x20should\x20have\x20a\x20compensation_fund\x20for\x20trust','severity':'warning','fields':['compensation_fund_add','compensation_fund'],'check':a=>compensationFundOf(a)!==undefined,'message':()=>'No\x20compensation_fund\x20configured.\x20Customers\x20have\x20no\x20financial\x20protection\x20if\x20you\x20fail\x20to\x20deliver.','recommendation':'Deposit\x20via\x20compensation_fund_add\x20{balance}\x20to\x20enable\x20arbitration\x20payouts.\x20The\x20fund\x20deters\x20fraud\x20and\x20enables\x20arbitration\x20claims.'},{'id':'audit_arbitrations','description':'Service\x20should\x20have\x20arbitration\x20options\x20for\x20dispute\x20resolution','severity':'info','fields':['arbitrations'],'check':a=>arbitrationRefsOf(a)['length']>0x0,'message':()=>'No\x20arbitration\x20configured.\x20Disputes\x20cannot\x20be\x20resolved\x20through\x20a\x20third\x20party.','recommendation':'Add\x20at\x20least\x20one\x20Arbitration\x20object\x20via\x20arbitrations:{op:\x27add\x27,\x20objects:[...]}\x20to\x20enable\x20on-chain\x20dispute\x20resolution.'},{'id':'audit_arbitration_removal_strands_awards','description':'Removing\x20an\x20authorized\x20venue\x20can\x20strand\x20an\x20award\x20it\x20already\x20ruled\x20on','severity':'error','fields':['arbitrations'],'check':a=>{const b=a?.['arbitrations']?.['remove']??a?.['arbitrations']?.['clear'],c=Array['isArray'](b)?b['length']>0x0:a?.['arbitrations']?.['op']==='clear';if(!c)return!![];if(arbitrationRefsOf(a)['length']>0x0)return!![];return compensationFundOf(a)===undefined;},'message':a=>{const b=a?.['arbitrations']?.['clear']?'every\x20authorized\x20venue':'venue(s)\x20'+(a?.['arbitrations']?.['remove']??[])['join'](',\x20');return'Removing\x20'+b+'\x20while\x20a\x20compensation\x20fund\x20is\x20configured\x20makes\x20any\x20award\x20it\x20already\x20ruled\x20on\x20UNPAYABLE:\x20an\x20on-chain\x20payout\x20now\x20requires\x20the\x20deciding\x20venue\x20to\x20still\x20be\x20on\x20the\x20Service\x27s\x20allowlist,\x20so\x20paying\x20out\x20aborts\x20with\x20E_ARBITRATION_NOT_ALLOWED=39\x20and\x20the\x20escrowed\x20funds\x20stay\x20stranded.';},'recommendation':'Before\x20removing\x20a\x20venue,\x20confirm\x20no\x20case\x20it\x20ruled\x20on\x20is\x20still\x20awaiting\x20compensation\x20payout\x20(query\x20the\x20Arb\x20objects\x20for\x20status\x20Arbitrated,\x20not\x20Finished).\x20Add\x20the\x20replacement\x20venue\x20FIRST,\x20drain\x20the\x20old\x20venue\x27s\x20cases,\x20and\x20only\x20then\x20remove\x20it.\x20A\x20buyer\x20should\x20never\x20be\x20left\x20holding\x20an\x20uncollectable\x20award.'},{'id':'audit_price','description':'Service\x20should\x20have\x20at\x20least\x20one\x20priced\x20sale\x20item','severity':'error','fields':['sales'],'check':a=>{const b=salesItemsOf(a);if(b['length']===0x0)return!![];return b['some'](c=>c?.['price']!==undefined&&c?.['price']!==null);},'message':()=>'Sales\x20list\x20present\x20but\x20no\x20item\x20has\x20a\x20price.\x20Customers\x20cannot\x20place\x20orders\x20without\x20knowing\x20the\x20cost.','recommendation':'Set\x20price\x20on\x20each\x20sales\x20item\x20(smallest-unit\x20string\x20or\x20display\x20form\x20like\x20\x272.5WOW\x27).'},{'id':'audit_compensation_fund_covers_award_ceiling','description':'compensation_fund\x20should\x20cover\x20the\x203x\x20award\x20ceiling\x20of\x20the\x20largest\x20sale\x20(disclosure)','severity':'warning','fields':['compensation_fund_add','compensation_fund','sales'],'check':a=>{if(!a?.['publish'])return!![];const b=compensationFundOf(a);if(b===undefined)return!![];const c=numericAmount(b);if(c===undefined)return!![];if(c===0x0)return![];const e=salesItemsOf(a)['map'](g=>numericAmount(g?.['price']))['filter'](g=>g!==undefined&&g>0x0);if(e['length']===0x0)return!![];const f=e['reduce']((g,h)=>g+h,0x0);return c>=MAX_INDEMNITY_MULTIPLE*f;},'message':()=>'compensation_fund\x20does\x20not\x20cover\x20the\x20award\x20ceiling\x20of\x20the\x20largest\x20sale.\x20An\x20award\x20is\x20hard-capped\x20at\x20'+MAX_INDEMNITY_MULTIPLE+'x\x20'+'the\x20order\x20amount\x20(arb.move\x20MAX_INDEMNITY_MULTIPLE,\x20enforced\x20at\x20ruling\x20time),\x20so\x20a\x20ruling\x20at\x20the\x20ceiling\x20'+'would\x20abort\x20the\x20buyer\x27s\x20claim\x20with\x2027\x20(E_COMPENSATION_NOT_MATCH)\x20—\x20the\x20ruling\x20stands\x20but\x20is\x20unpayable\x20'+'until\x20you\x20deposit,\x20and\x20the\x20abort\x20does\x20NOT\x20consume\x20the\x20claim.\x20Disclosure\x20only:\x20this\x20no\x20longer\x20blocks\x20'+'publish\x20—\x20per-order\x20coverage\x20is\x20enforced\x20at\x20BUY\x20time\x20(the\x20buyer\x27s\x20order\x20is\x20rejected\x20while\x20the\x20fund\x20'+'cannot\x20cover\x203x\x20that\x20order),\x20so\x20under-ceiling\x20funding\x20stops\x20sales\x20instead\x20of\x20stranding\x20awards.','recommendation':'For\x20every\x20order\x20you\x20want\x20to\x20sell,\x20keep\x20the\x20fund\x20at\x20>=\x20'+MAX_INDEMNITY_MULTIPLE+'x\x20THAT\x20order\x20via\x20'+'compensation_fund_add\x20(a\x200.49\x20course\x20needs\x201.47;\x20a\x203.99\x20course\x20needs\x2011.97\x20—\x20no\x20cross-SKU\x20subsidy).\x20'+('Above\x20'+MAX_INDEMNITY_MULTIPLE+'x\x20the\x20current\x20order\x20is\x20optional:\x20it\x20only\x20buys\x20tolerance\x20for\x20several\x20')+'CONCURRENT\x20claims\x20against\x20the\x20one\x20per-Service\x20pool\x20(there\x20is\x20no\x20on-chain\x20concurrency\x20limit),\x20which\x20'+'is\x20a\x20capital-allocation\x20choice.\x20A\x20service\x20with\x20NO\x20fund\x20sells\x20freely\x20—\x20that\x20is\x20the\x20documented\x20'+'no-protection\x20posture\x20(audit_compensation_fund\x20discloses\x20it;\x20buyers\x20see\x20coverage\x20via\x20order\x20monitor).'},{'id':'audit_description','description':'Service\x20should\x20have\x20a\x20description','severity':'warning','fields':['description'],'check':a=>typeof a?.['description']==='string'&&a['description']['length']>0x0,'message':()=>'Service\x20has\x20no\x20description.\x20Customers\x20won\x27t\x20understand\x20what\x20you\x27re\x20offering.','recommendation':'Write\x20a\x20clear\x20description\x20of\x20the\x20service,\x20including\x20deliverables,\x20timelines,\x20and\x20terms.'},{'id':'audit_named_new_name','description':'Service\x20being\x20created\x20should\x20have\x20a\x20name','severity':'warning','check':a=>serviceNameOf(a)!==undefined,'message':()=>'Creating\x20a\x20service\x20without\x20a\x20name\x20makes\x20it\x20hard\x20to\x20reference\x20and\x20organize.','recommendation':'Set\x20object:{name:\x20...}\x20(or\x20namedNew.name)\x20following\x20the\x20convention:\x20<projectPrefix>_<service>_<purpose>.'},{'id':'audit_customer_required_needs_um','description':'customer_required\x20requires\x20a\x20Contact\x20bound\x20via\x20um\x20(SDK-enforced\x20hard\x20link;\x20mirrored\x20here)','severity':'error','fields':['customer_required','um'],'check':a=>{const b=Array['isArray'](a?.['customer_required'])?a['customer_required']:[];if(b['length']===0x0)return!![];return!!a?.['um'];},'message':()=>'customer_required\x20is\x20set\x20but\x20no\x20Contact\x20is\x20bound\x20via\x20um\x20—\x20customers\x20cannot\x20deliver\x20the\x20required\x20private\x20information\x20through\x20end-to-end\x20encrypted\x20Messenger.','recommendation':'Bind\x20um:{Contact\x20name/id}\x20in\x20the\x20same\x20call\x20(SDK\x20order_new\x20will\x20fail\x20the\x20buyer\x20otherwise).'},{'id':'audit_customer_required_is_declared_not_enforced','description':'customer_required\x20has\x20no\x20on-chain\x20enforcement\x20at\x20buy\x20time\x20—\x20a\x20Guard\x20must\x20gate\x20fulfilment','severity':'warning','fields':['customer_required'],'check':a=>{const b=Array['isArray'](a?.['customer_required'])?a['customer_required']:[];return b['length']===0x0;},'message':a=>{const b=Array['isArray'](a?.['customer_required'])?a['customer_required']:[];return'customer_required\x20('+b['length']+'\x20field(s):\x20'+b['join'](',\x20')+')\x20is\x20DECLARATIVE\x20ONLY:\x20the\x20on-chain\x20purchase\x20entry\x20never\x20reads\x20this\x20list,\x20so\x20an\x20order\x20that\x20supplies\x20none\x20of\x20these\x20fields\x20is\x20still\x20created\x20and\x20progresses.\x20Nothing\x20on-chain\x20will\x20stop\x20it.';},'recommendation':'Bind\x20pattern.required_info_evidence_gate\x20(schema_query\x20action=get_guard_design_patterns)\x20on\x20the\x20first\x20forward\x20that\x20needs\x20the\x20information:\x20query\x20\x27order.required_info\x20some\x27\x20(1572)\x20over\x20the\x20Order.\x20The\x20buyer\x20records\x20the\x20credential\x20via\x20order_required_info_update:\x20EITHER\x20the\x20merchant\x27s\x20IM\x20user\x20address\x20resolved\x20from\x20the\x20Service\x27s\x20Contact\x20(zero\x20cost,\x20address\x20record\x20only)\x20OR\x20an\x20on-chain\x20WTS\x20Proof\x20object\x20address\x20(embeds\x20the\x20merchant\x20IM\x20address\x20and\x20the\x20last-message\x20timestamp;\x20costs\x20gas,\x20publicly\x20verifiable).\x20\x27order.required_info\x27\x20(1573)\x20returns\x20the\x20recorded\x20address\x20but\x20aborts\x20while\x20nothing\x20is\x20recorded\x20—\x20gate\x20on\x201572\x20first.\x20When\x20the\x20listing\x20genuinely\x20promises\x20a\x20PER-ORDER\x20credential,\x20prefer\x20the\x20controlled\x20bind\x20entry\x20(order_required_info_bind):\x20the\x20chain\x20verifies\x20the\x20Proof\x20is\x20about\x20THIS\x20order\x20and\x20owner-created\x20at\x20write\x20time\x20and\x20rejects\x20a\x20mismatch\x20—\x20no\x20guard\x20needed\x20to\x20catch\x20a\x20wrong-proof\x20record.\x20BOUNDARY:\x20that\x20binding\x20proves\x20the\x20credential\x20AUTHOR\x20only,\x20never\x20its\x20content\x20or\x20any\x20rating\x20—\x20do\x20not\x20mirror\x20it\x20onto\x20review/reward\x20claims;\x20public\x20reviews\x20are\x20Repository\x20rows\x20whose\x20values\x20are\x20enforced\x20guard-side\x20via\x20data-value\x20probes,\x20not\x20through\x20Proof\x20objects.'},{'id':'audit_dangling_deps','description':'Service\x20dependencies\x20should\x20be\x20fully\x20created','severity':'error','check':(a,b)=>{if(!a?.['publish'])return!![];if(!b?.['graph'])return!![];const c=b['graph']['findDanglingDependencies']()??[];return c['length']===0x0;},'message':()=>'Service\x20references\x20objects\x20that\x20are\x20not\x20yet\x20created.\x20Publishing\x20will\x20lock\x20these\x20references.','recommendation':'Ensure\x20all\x20referenced\x20objects\x20(machine,\x20allocators,\x20guards)\x20are\x20created\x20and\x20finalized\x20before\x20publishing.'},{'id':'audit_type_parameter','description':'Service\x20should\x20have\x20a\x20token\x20type\x20specified','severity':'info','fields':['type_parameter','namedNew'],'check':a=>typeParameterOf(a)!==undefined,'message':()=>'No\x20payment\x20token\x20type\x20specified.\x20Defaulting\x20to\x20WOW\x20(0x2::wow::WOW).','recommendation':'Explicitly\x20set\x20type_parameter\x20(inside\x20object:{...})\x20if\x20you\x20want\x20to\x20accept\x20non-WOW\x20tokens\x20(e.g.,\x20USDT,\x20ETH).'},{'id':'audit_wip_unreachable_url','description':'sale.wip\x20must\x20be\x20a\x20publicly\x20reachable\x20URL\x20(no\x20localhost/LAN/file\x20paths)','severity':'error','fields':['sales'],'check':(a,b)=>{if(typeof b?.['network']==='string'&&/local/i['test'](b['network']))return!![];const c=salesItemsOf(a);if(c['length']===0x0)return!![];return c['every'](e=>{const f=e?.['wip'];if(typeof f!=='string'||f['trim']()==='')return!![];return!/^(https?:\/\/)?(localhost|127\.0\.0\.1|\[::1\]|0\.0\.0\.0)/i['test'](f)&&!/^https?:\/\/(192\.168\.|10\.|172\.(1[6-9]|2\d|3[01])\.)/i['test'](f)&&!/^file:/i['test'](f);});},'message':a=>{const b=salesItemsOf(a)['map'](c=>String(c?.['wip']??''))['filter'](c=>c!==''&&(/^(https?:\/\/)?(localhost|127\.0\.0\.1|\[::1\]|0\.0\.0\.0)/i['test'](c)||/^https?:\/\/(192\.168\.|10\.|172\.(1[6-9]|2\d|3[01])\.)/i['test'](c)||/^file:/i['test'](c)));return'sale.wip\x20is\x20NOT\x20publicly\x20reachable\x20('+b['join'](',\x20')+').\x20The\x20URL\x20is\x20stored\x20on-chain\x20and\x20every\x20'+'customer\x20fetches\x20it\x20at\x20order\x20time\x20—\x20order_new\x20aborts\x20100%\x20for\x20anyone\x20outside\x20your\x20machine.\x20'+'Host\x20the\x20file\x20publicly:\x20wip_file\x20upload\x20to\x20the\x20official\x20free\x20host\x20(wip.store.wowok.net)\x20or\x20your\x20own\x20'+'endpoint\x20(GitHub\x20Pages\x20/\x20IPFS\x20/\x20your\x20website)';},'recommendation':'Replace\x20the\x20internal\x20URL\x20with\x20a\x20public\x20one.\x20Internal\x20URLs\x20are\x20sanctioned\x20ONLY\x20on\x20env.network=localnet\x20for\x20testing.'},{'id':'audit_wip_missing_public','description':'On\x20public\x20networks\x20every\x20sale\x20item\x20should\x20carry\x20a\x20product-detail\x20(wip)\x20URL','severity':'info','fields':['sales'],'check':(a,b)=>{const c=b?.['network'];if(typeof c==='string'&&/local/i['test'](c))return!![];const e=salesItemsOf(a);if(e['length']===0x0)return!![];return e['every'](f=>typeof f?.['wip']==='string'&&f['wip']['trim']()!=='');},'message':()=>'One\x20or\x20more\x20sale\x20items\x20have\x20NO\x20product-detail\x20(wip)\x20URL.\x20The\x20listing\x20works,\x20but\x20customers\x20see\x20no\x20detail\x20'+'page\x20and\x20the\x20service\x27s\x20market\x20completeness\x20score\x20is\x20downgraded.\x20Easiest:\x20upload\x20the\x20detail\x20file\x20with\x20the\x20'+'wip_file\x20tool\x20to\x20the\x20official\x20free\x20host\x20(https://wip.store.wowok.net\x20—\x2010\x20files\x20per\x20account,\x20180-day\x20'+'retention,\x2012MB/file)\x20and\x20put\x20the\x20returned\x20URL\x20into\x20sale.wip;\x20or\x20host\x20your\x20own\x20(GitHub\x20Pages\x20/\x20IPFS\x20/\x20'+'your\x20website).\x20For\x20long-lived\x20mainnet\x20listings\x20prefer\x20your\x20own\x20endpoint\x20so\x20the\x20detail\x20outlives\x20the\x20free\x20'+'retention\x20window','recommendation':'Upload\x20a\x20WIP\x20file\x20via\x20wip_file\x20and\x20set\x20sale.wip\x20on\x20each\x20item\x20before/after\x20publish\x20(sales\x20stays\x20modifiable).'}];const RULE_INDEX=new Map(AUDIT_RULES['map'](a=>[a['id'],a]));function readSeverityOverrides(){try{const {getJudgmentDoc:a}=require('../config/judgment.js');if(typeof a!=='function')return{};const b=a()?.['rules']?.['domains'];if(!b||typeof b!=='object')return{};const c={};for(const d of Object['values'](b)){const e=d?.['severity_overrides'];if(!e||typeof e!=='object')continue;for(const [f,g]of Object['entries'](e)){if(g==='error'||g==='warning'||g==='info')c[f]=g;}}return c;}catch{return{};}}export function auditService(a,b){const c=[],d=a?.['publish']===!![]&&typeof a?.['object']==='string',e=readSeverityOverrides();for(const f of AUDIT_RULES){try{if(d&&f['fields']&&!f['fields']['some'](g=>a[g]!==undefined))continue;!f['check'](a,b)&&c['push']({'rule_id':f['id'],'severity':e[f['id']]??f['severity'],'message':f['message'](a),'recommendation':f['recommendation']});}catch{}}return c;}export function hasBlockingErrors(a){return a['some'](b=>b['severity']==='error');}export function getErrors(a){return a['filter'](b=>b['severity']==='error');}export function getWarnings(a){return a['filter'](b=>b['severity']==='warning');}export function summarizeFindings(a){if(a['length']===0x0)return'All\x20audit\x20checks\x20passed.';const b=getErrors(a),c=getWarnings(a),d=a['filter'](g=>g['severity']==='info'),e=[];if(b['length']>0x0)e['push'](b['length']+'\x20error(s)');if(c['length']>0x0)e['push'](c['length']+'\x20warning(s)');if(d['length']>0x0)e['push'](d['length']+'\x20info');return'Audit:\x20'+e['join'](',\x20')+'.\x20Review\x20before\x20publishing.';}export const AUDIT_RULES_VERSION=0xa;
@@ -118,7 +118,7 @@
118
118
  "level": "medium",
119
119
  "title": "Guard uses session-only queries — fails permanently after session migration",
120
120
  "description": "The order allocator Guard of service ${host_service} uses session queries (1270/1271) at ${evidence_paths}: after the session migrates to history the query aborts (W_FIELD_NOT_FOUND) and the Guard fails permanently — allocation can never trigger (rule ${code}).",
121
- "mitigation": "Require the merchant to switch to progress.current_time (1272) or history queries (1274-1279); session queries deadlock the allocation.",
121
+ "mitigation": "Require the merchant to switch to progress.current_time (1272) or history queries (1274-1280); session queries deadlock the allocation.",
122
122
  "exposure": {
123
123
  "loss_parties": [
124
124
  { "role": "supplier", "basis": "Expected allocator payouts never release — the pool is stranded behind a permanently failing guard." },
@@ -130,7 +130,7 @@
130
130
  "title": "Voted.weight is set by the Arbitration rule — concentrated weight risk",
131
131
  "description": "Voted.weight (u32) is assigned by the Arbitration object's voting_guard logic, not by the voter. If the Arbitration rule concentrates weight in one voter (e.g. an admin with weight 1000 vs. others with weight 1), a single voter can dictate the outcome. The Arb contract itself does not detect concentration — that is the Arbitration designer's responsibility.",
132
132
  "scenario": "Arbitration rule gives one voter weight 1000; that voter single-handedly decides the case",
133
- "mitigation": "When designing the Arbitration rule, cap individual voter weight and require a quorum. Audit the voting_guard to ensure no single voter can exceed the quorum alone.",
133
+ "mitigation": "Weight does NOT gate verdicts on-chain (any single ballot yields an executable verdict — M-F), so capping weight changes nothing. Integrity comes from ADMISSION: keep the voting_guard roster tight and grant arbitration permission 358 only to intended voters.",
134
134
  "evidence": "weight_concentrated=true (rule-level risk)",
135
135
  "stakeholders": ["voter", "arbitrator"]
136
136
  }
@@ -44,7 +44,7 @@
44
44
  "rc2_06_issue_count": "KERNEL — progress.* queries on a source without convert_witness that cannot be proven to be a Progress (no PROGRESS→ORDER reverse edge).",
45
45
  "rc2_06_has_hard_mismatch": "KERNEL — at least one such source is explicitly annotated as a non-Progress (hard violation; unannotated sources grade soft).",
46
46
  "rc2_06_evidence_lines": "KERNEL — the reverse-edge issue list rendered as ' - <detail>' lines, newline joined.",
47
- "rc2_07_keys_where_count": "KERNEL — number of 'keys where' predicate occurrences in the serialized root (native verifier abort on all networks, upw-mn-261012 F-28).",
47
+ "rc2_07_keys_where_count": "KERNEL — number of 'keys where' predicate occurrences in the serialized root (parameter-carrying forms abort natively, upw-mn-261012 F-28; the parameters-free 1177 Range-gte shape is the certified working path).",
48
48
  "has_submission": "KERNEL — the table has at least one b_submission=true entry.",
49
49
  "scene_present": "KERNEL — a binding scene was supplied.",
50
50
  "scene_id": "KERNEL — the binding scene id (e.g. service_order_allocators_guard).",
@@ -152,6 +152,16 @@
152
152
  "evidence": "write_guard scene with no context(Signer) leaf in the root",
153
153
  "stakeholders": ["customer", "provider", "arbitrator"]
154
154
  },
155
+ {
156
+ "when": { "all": [{ "field": "scene_id", "op": "eq", "value": "arbitration_voting_guard" }, { "field": "tree_folds_always_true", "op": "eq", "value": true }] },
157
+ "level": "low",
158
+ "title": "Open-vote tautology on voting_guard — the declared voter universe, not a placeholder",
159
+ "description": "On the Arbitration voting slot an always-true guard is the SANCTIONED open-voting form: every Passport holder passes and votes at the row's FixedValue weight (tpl_voting_guard_open_vote). It matches the tautology signature R-X1-17 hunts, but here the alternative is the real hazard: an EMPTY voting_guard does not mean 'everyone may vote' — plain votes hard-require the vote permission (358), admin-only by default, and a dispute dead-locks when that admin is unresponsive (R-ARB-VOTE-LOCK blocks the service publish; crs9-F-36, mainnet-verified 2026-10-15).",
160
+ "scenario": "A merchant designs a public arbitration venue and binds the always-true voting guard; the tautology check must not scare them into leaving voting_guard empty",
161
+ "mitigation": "None needed — this is the declared intent. Confirm the weight row is FixedValue (flat one-voter-one-vote) or an intentional tier, and remember every vote call must carry the voting_guard payload once the field is set (a plain vote aborts with E_VOTING_GUARD_USED, abort 2). Weighted panels should use tpl_voting_guard_numeric_weight instead.",
162
+ "evidence": "Tautology: ${tree_folds_always_true_reason} (voting_guard scene — open-vote semantics)",
163
+ "stakeholders": ["customer", "provider", "arbitrator"]
164
+ },
155
165
  {
156
166
  "when": { "all": [{ "field": "tree_folds_always_true", "op": "eq", "value": true }, { "field": "write_guard_scene", "op": "eq", "value": false }] },
157
167
  "level": "high",
@@ -397,10 +407,10 @@
397
407
  {
398
408
  "when": { "field": "rc2_07_keys_where_count", "op": "gt", "value": 0 },
399
409
  "level": "high",
400
- "title": "repository.data 'keys where' predicate aborts in the native verifier — use the write-side threshold pattern instead",
401
- "description": "The 'keys where' predicate form aborts with MovePrimitiveRuntimeError inside the native guard verifier on ALL networks (upw-mn-261012 F-28, live A/B verified: bare has() succeeds, keys-where aborts). ${rc2_07_keys_where_count} occurrence(s) found.",
402
- "scenario": "Native abort: guard creation or verification fails with MovePrimitiveRuntimeError on every network",
403
- "mitigation": "1) Move the threshold to the WRITE side: a Repository write policy enforces the value floor at write time (live-proven ptrn4 pattern — e.g. a rating >= 4 write policy aborts the non-conforming write at passport submission);\n2) The guard then reads presence only (bare 'repository.data has' or vec_contains_string on the keys vector without the where clause);\n3) See guard-design-patterns pattern.repository_data_check for the proven shape",
410
+ "title": "repository.data 'keys where' needs the parameters-free 1177 shape — parameter-carrying forms abort natively",
411
+ "description": "A parameter-carrying 'keys where' query node aborts with MovePrimitiveRuntimeError inside the native guard verifier (upw-mn-261012 F-28, live A/B verified). The CERTIFIED working shape is query 1177 (keys-where, Range-gte) with a parameters-free query node — the Range-gte predicate rides in the BCS conditions blob (batch-14 verified; this is the on-chain rating-floor path of LAYERED RATING-RANGE RULING). ${rc2_07_keys_where_count} occurrence(s) found.",
412
+ "scenario": "Native abort: guard creation or verification fails with MovePrimitiveRuntimeError when the keys-where node carries parameters",
413
+ "mitigation": "1) Use the certified 1177 shape: parameters-free query node; express the threshold (e.g. rating >= 4) as Range-gte inside the BCS conditions blob;\n2) keep candidate ids anchored to first-party objects (the order id itself — not validator-submitted id lists);\n3) See guard-design-patterns pattern.repository_data_check and LAYERED RATING-RANGE RULING in builtin-templates for the proven shape",
404
414
  "stakeholders": ["provider", "customer"]
405
415
  }
406
416
  ]
@@ -35,6 +35,8 @@
35
35
  "min_perm_index": "KERNEL CONSTANT — first user-defined permission index (USER_DEFINED_PERM_INDEX_START).",
36
36
  "mainnet_without_testnet": "Network is mainnet and the testnet test has not passed.",
37
37
  "missing_guards_display": "Referenced Guard addresses missing from the published set, ', '-joined — empty when all are published.",
38
+ "first_trap_node_name": "First-offender — name of the first entry-reachable node with no forward path to any terminal (trap analysis: cycles are allowed on-chain, the flagged failure is a loop/dead chain without a cycle-breaking exit; absent when none).",
39
+ "trap_nodes_display": "All trapped nodes (entry-reachable, no path to a terminal), ', '-joined — empty when the graph is trap-free.",
38
40
  "always_true": "Extractor sentinel — unconditionally true; marks catalog stubs (via eq false) and documentation."
39
41
  },
40
42
  "rules": [
@@ -128,14 +130,15 @@
128
130
  {
129
131
  "rule_id": "R-M1-06",
130
132
  "dimension": "structural",
131
- "trigger": "DFS cycle detection — catalog stub: the retired check was not implemented",
133
+ "trigger": "Trap analysis — an entry-reachable node with no forward path to any terminal. Cycles themselves are ALLOWED on-chain (2026-10-16 ruling: the consensus layer stays minimal and a loop only advances when someone pays for it); the flagged failure is a loop (or dead chain) the entry can enter but that offers no cycle-breaking exit.",
132
134
  "cases": [
133
135
  {
134
- "when": { "field": "always_true", "op": "eq", "value": false },
135
- "level": "critical",
136
- "title": "Cycle in DAG",
137
- "description": "Workflow has a cycle. Nodes reference each other circularly.",
138
- "mitigation": "Break the cycle by removing one Pair."
136
+ "when": { "field": "first_trap_node_name", "op": "present" },
137
+ "level": "high",
138
+ "title": "Trap: entry-reachable nodes with no exit path",
139
+ "description": "These nodes are reachable from the entry, but no sequence of forwards can ever reach a terminal node — typically a loop missing a cycle-breaking exit. Orders entering them loop forever (re-running the loop's forwards and their fund rails every lap) or strand. Advisory finding: the chain does not reject this graph; the risk is surfaced here so the merchant fixes it before buyers see it.",
140
+ "mitigation": "Add an exit Pair from inside the loop to a terminal (fulfilment / refund / cancel node), or make the loop conditional so at least one live exit exists on the path.",
141
+ "evidence": "Trapped nodes (entry-reachable, no path to a terminal): [${trap_nodes_display}]."
139
142
  }
140
143
  ]
141
144
  },
@@ -6,9 +6,9 @@
6
6
  "has_repository": "Plan creates a repository object",
7
7
  "allocator_row_count": "Total allocator rows across service create param and order_allocators configure steps",
8
8
  "refund_row_count": "Allocator rows on the refund track",
9
- "terminal_count": "Machine terminal nodes (never a non-entry prev_node)",
10
- "terminal_nodes_display": "Comma-joined terminal node names",
11
- "first_uncovered_terminal": "First terminal node no allocator guard accepts via progress.current equality (FUND-EXIT-01)",
9
+ "terminal_count": "Fund-bearing machine terminal nodes (never a non-entry prev_node); v32 optional pure-side-action leaves are exempt — order completion never routes through them and they never gate money (upw F-06, 6939_upwork-261016)",
10
+ "terminal_nodes_display": "Comma-joined fund-bearing terminal node names",
11
+ "first_uncovered_terminal": "First fund-bearing terminal node no allocator guard accepts via progress.current equality (FUND-EXIT-01; optional leaves exempt)",
12
12
  "first_refund_guard_missing_claimed_by": "First refund-track guard step id whose queries never read order.claimed_by (DUAL-RAIL-01, A-3)",
13
13
  "first_path_dependent_anchor": "First guard step id using a path-dependent time query (TIME-ANCHOR-01, E-10)",
14
14
  "path_sensitive": "The anchored node is reachable by more than one path, so the anchor can shift",
@@ -84,7 +84,7 @@
84
84
  {
85
85
  "when": { "field": "first_pending_fund_guard", "op": "present" },
86
86
  "level": "critical",
87
- "title": "${pending_fund_guard_count} unresolved guard design(s) bound to fund paths (first: '${first_pending_fund_guard}')",
87
+ "title": "${pending_fund_guard_count} unresolved guard design(s) bound to fund paths, of ${pending_guard_total} pending in total (first: '${first_pending_fund_guard}')",
88
88
  "description": "All unresolved fund-path guard keys: ${pending_fund_guard_keys_display}. Every allocator row or machine edge referencing one of these guard_keys will carry NO guard at publish: the settlement/refund/forward it was designed to gate executes unconditionally. This is a publish-freeze blocker — the freeze gate refuses to go live with fund-path guards pending.",
89
89
  "mitigation": "Resolve EACH listed guard design into a structured guard (guardResolutions with kind 'template' or 'inline'), or remove the binding. Machine-host guards must declare the order-identifier slot {identifier: 254, b_submission: true, value_type: 'Address'} in their table (TASKBIND-01).",
90
90
  "stakeholders": ["merchant", "customer"]
@@ -92,7 +92,7 @@
92
92
  {
93
93
  "when": { "field": "first_pending_buy_guard", "op": "present" },
94
94
  "level": "medium",
95
- "title": "${pending_buy_guard_count} unresolved buy-guard design(s) (first: '${first_pending_buy_guard}')",
95
+ "title": "${pending_buy_guard_count} unresolved buy-guard design(s), of ${pending_guard_total} pending in total (first: '${first_pending_buy_guard}')",
96
96
  "description": "All unresolved buy-path guard keys: ${pending_buy_guard_keys_display}. The service buy path was designed to screen purchasers, but the guard was never resolved; the service publishes without a buy_guard, so anyone can order.",
97
97
  "mitigation": "Resolve EACH listed buy-guard design into a structured guard, or accept an unscreened buy path deliberately.",
98
98
  "stakeholders": ["merchant"]
@@ -117,22 +117,22 @@
117
117
  {
118
118
  "rule_id": "PLAN-K2",
119
119
  "dimension": "fund_flow",
120
- "trigger": "Publish-front compensation-fund adequacy (KL-K2 family): an award is hard-capped at 3x the order amount at ruling time, so a fund below the ceiling turns a WON award into an unpayable one (the claim aborts and is NOT consumed). Preferred basis: 3x the highest SKU price on the plan's catalog; when no price is parseable the judgment is explicitly deferred to the publish-patch check (3x largest single order) instead of silently skipped.",
120
+ "trigger": "Compensation-fund sizing guidance (KL-K2 family, re-scoped by b6-11): an award is hard-capped at 3x the order amount at ruling time, so a fund below a planned case's ceiling turns a WON award into an unpayable one (the claim aborts and is NOT consumed). Per-order coverage is ENFORCED at buy time (each order is checked against 3x ITS OWN amount); the plan layer advises sizing on the typical single order instead of the priciest SKU — no cross-SKU subsidy.",
121
121
  "cases": [
122
122
  {
123
123
  "when": { "field": "fund_ceiling_breach", "op": "truthy" },
124
- "level": "critical",
124
+ "level": "medium",
125
125
  "title": "Compensation fund tops up below the award ceiling (${fund_ceiling_basis})",
126
- "description": "The plan tops the fund up to ${fund_topup_amount} (smallest units), but a ruling at the ceiling would abort the buyer's claim (E_COMPENSATION_NOT_MATCH) and the abort does NOT consume the claim — the buyer holds an unpayable win until a manual top-up, and the shop holds the reputational damage.",
127
- "mitigation": "Raise the compensation_fund input to at least the ceiling (${fund_ceiling_basis}). Above the ceiling is optional (tolerance for CONCURRENT claims against the one per-Service pool); below it, a valid ruling cannot pay.",
126
+ "description": "The plan tops the fund up to ${fund_topup_amount} (smallest units), but a ruling at the ceiling would abort the buyer's claim (E_COMPENSATION_NOT_MATCH) and the abort does NOT consume the claim — the buyer holds an unpayable win until a manual top-up, and the shop holds the reputational damage. Disclosure, not a blocker: under-covered ORDERS are refused at buy time (per-order gate), so no buyer enters a knowingly unprotected order.",
127
+ "mitigation": "Raise the compensation_fund input toward the ceiling (${fund_ceiling_basis}). Sizing is per-order now: 3x the typical single order keeps any single ruling payable; above that only buys tolerance for CONCURRENT claims against the one per-Service pool.",
128
128
  "stakeholders": ["merchant", "customer"]
129
129
  },
130
130
  {
131
131
  "when": { "field": "fund_ceiling_unverifiable", "op": "truthy" },
132
132
  "level": "medium",
133
133
  "title": "Compensation-fund adequacy cannot be judged from the plan",
134
- "description": "The plan carries a fund top-up, but the catalog price or the top-up amount is not machine-parseable here (display forms need token decimals the plan layer does not have), so the ceiling check is DEFERRED, not skipped: the publish patch re-runs it on the 3x largest-single-order basis and blocks publish when under.",
135
- "mitigation": "Provide numeric smallest-unit sales prices and a numeric fund amount so the plan layer can verify the ceiling before materialization; otherwise expect the publish-patch check to judge it.",
134
+ "description": "The plan carries a fund top-up, but the catalog price or the top-up amount is not machine-parseable here (display forms need token decimals the plan layer does not have), so the plan-level judgment is DEFERRED, not skipped: the publish audit re-states the coverage as a disclosure warning, and the buy-time per-order gate enforces 3x each actual order.",
135
+ "mitigation": "Provide numeric smallest-unit sales prices and a numeric fund amount so the plan layer can advise on the ceiling before materialization; the buy-time gate judges every real order regardless.",
136
136
  "stakeholders": ["merchant"]
137
137
  }
138
138
  ]
@@ -147,7 +147,7 @@
147
147
  "level": "high",
148
148
  "title": "Refund guard '${first_refund_guard_missing_claimed_by}' does not check claimed_by",
149
149
  "description": "Chain semantics keep the allocation rail and the compensation rail independent (A-3, deliberate). A refund guard that does not assert claimed_by is none allows double payment: arbitration indemnity AND escrow refund.",
150
- "mitigation": "Add a query on order.claimed_by (must be none) to the refund guard, or document an explicit double-compensation policy.",
150
+ "mitigation": "Add the order.claimed_by some == false query to the refund guard. This is a structural fund-safety invariant, not a documentation choice — a double-compensation policy note does not seal the rail and is NOT an accepted alternative. Pair the refund guard with the polarity-twin merchant-recovery allocator (guard asserts order.claimed_by some == true, pays Rate 10000 to the merchant Entity) so the escrow principal of an awarded order still exits: exactly one of the two legs can ever pass.",
151
151
  "stakeholders": ["merchant"]
152
152
  }
153
153
  ]
@@ -1 +1 @@
1
- export const SEMANTIC_FACTS=[{'fact_id':'FACT-ALLOC-01','subject':'Allocator\x20guard-matching\x20and\x20firing\x20semantics','authoritative':'A\x20distribution\x20call\x20submits\x20ONE\x20guard\x20address;\x20every\x20allocator\x20whose\x20bound\x20guard\x20equals\x20the\x20submitted\x20address\x20fires,\x20in\x20vector\x20order,\x20each\x20against\x20the\x20balance\x20left\x20by\x20the\x20previous\x20(allocation.move:366-368\x20—\x20the\x20loop\x20has\x20no\x20early\x20exit).\x20'+'ORDER\x20IS\x20PRIORITY\x20(SV-3,\x20az3-mn-261013):\x20within\x20one\x20guard,\x20multiple\x20FIX/RATE\x20entries\x20consume\x20the\x20pool\x20strictly\x20in\x20their\x20declared\x20row\x20order\x20(allocation.move:422-427)\x20—\x20a\x20row\x20that\x20under-rates\x20leaves\x20too\x20little\x20for\x20later\x20rows,\x20and\x20a\x20later\x20row\x20that\x20cannot\x20be\x20fully\x20filled\x20aborts\x20the\x20distribution\x20(EZERO,\x2014).\x20Author\x20multi-row\x20splits\x20POOL-DESCENDING\x20(largest\x20claimant\x20first)\x20and\x20verify\x20Σ(fix/rate\x20values)\x20<=\x20the\x20pool\x20the\x20guard\x20can\x20see\x20at\x20fire\x20time.\x20'+'Allocators\x20with\x20DIFFERENT\x20guards\x20are\x20alternative\x20paths\x20selected\x20by\x20the\x20caller\x27s\x20guard\x20choice,\x20not\x20by\x20list\x20position.\x20Mutual\x20exclusion\x20must\x20be\x20expressed\x20inside\x20the\x20guard\x20conditions.','falsehoods':['first-match-wins','first\x20Allocator\x20whose\x20Guard\x20returns\x20true','first\x20allocator\x20whose\x20guard\x20passes\x20wins','the\x20first\x20Allocator\x20whose\x20Guard\x20returns\x20true\x20wins','first-match\x20allocator\x20semantics','only\x20the\x20first\x20one','only\x20the\x20first\x20one\x20matches','duplicate\x20addresses\x20only\x20match\x20the\x20first','the\x20first\x20one\x20wins','the\x20first\x20allocator\x20whose\x20guard'],'harm':'Templates\x20built\x20on\x20\x27first-match\x27\x20semantics\x20silently\x20stack\x20distributions\x20or\x20leave\x20refund\x20paths\x20unreachable,\x20because\x20the\x20contract\x20fires\x20ALL\x20allocators\x20bound\x20to\x20the\x20submitted\x20guard.'},{'fact_id':'FACT-ALLOC-02','subject':'Surplus\x20semantics\x20—\x20drains\x20the\x20entire\x20remaining\x20pool','authoritative':'Surplus\x20mode\x20distributes\x20the\x20ENTIRE\x20remaining\x20balance\x20of\x20the\x20order\x27s\x20allocation\x20pool,\x20not\x20just\x20the\x20amount\x20earmarked\x20for\x20a\x20specific\x20track.\x20If\x20a\x20refund-path\x20allocator\x20uses\x20Surplus\x20while\x20the\x20settlement\x20path\x20has\x20unpaid\x20fixed-amount\x20legs,\x20the\x20Surplus\x20takes\x20everything,\x20including\x20the\x20settlement\x20money.','falsehoods':['Surplus\x20takes\x20only\x20what\x20is\x20left','Surplus\x20returns\x20the\x20remainder\x20after\x20other\x20tracks','Surplus\x20is\x20safe\x20because\x20it\x20only\x20takes\x20leftovers'],'harm':'A\x20refund/deposit\x20allocator\x20using\x20Surplus\x20will\x20over-refund\x20the\x20buyer\x20and\x20starve\x20the\x20merchant\x20when\x20the\x20settlement\x20track\x20has\x20not\x20yet\x20fired\x20(ziroom\x20T5:\x20585/525\x20WOW\x20fully\x20refunded,\x20merchant\x20received\x200).'},{'fact_id':'FACT-ALLOC-03','subject':'Allocator\x20fix\x20semantics\x20—\x20computed\x20Amount-leg\x20total,\x20PAID,\x20never\x20a\x20holdback','authoritative':'fix\x20is\x20not\x20a\x20settable\x20parameter:\x20the\x20allocator-registration\x20call\x20computes\x20it\x20internally\x20as\x20the\x20sum\x20of\x20the\x20allocator\x27s\x20Amount-mode\x20legs\x20(allocation.move:399\x20fix:\x20total_amount),\x20and\x20alloc()\x20PAYS\x20every\x20Amount\x20leg\x20(allocation.move:540\x20balance::split)\x20while\x20subtracting\x20fix\x20only\x20from\x20the\x20net-Rate\x20base\x20(allocation.move:485\x20total_rates\x20=\x20balance\x20-\x20fix).\x20A\x20pure-Rate\x20allocator\x20therefore\x20has\x20fix=0\x20and\x20drains\x20100%\x20of\x20the\x20pool;\x20adding\x20Amount\x20legs\x20raises\x20outflow,\x20it\x20never\x20withholds.\x20The\x20allocator-registration\x20call\x20surface\x20takes\x20only\x20(guard,\x20sharing,\x20max)\x20—\x20no\x20fix\x20argument\x20at\x20all\x20—\x20so\x20a\x20template-side\x20fix\x20value\x20is\x20silently\x20dropped\x20before\x20the\x20transaction\x20is\x20built.\x20The\x20chain\x20has\x20NO\x20holdback/reserve\x20primitive;\x20the\x20only\x20way\x20to\x20leave\x20funds\x20in\x20a\x20pool\x20is\x20to\x20not\x20distribute\x20them\x20(no\x20allocator\x20fires,\x20or\x20a\x20max-capped\x20Surplus\x20stops\x20at\x20the\x20cap).','falsehoods':['the\x20reserve\x20never\x20leaves','reserve\x20never\x20leaves\x20the\x20pool','the\x20reserve\x20stays\x20in\x20the\x20pool','reserve\x20physically\x20stays\x20in\x20the\x20pool','the\x20fix\x20retains\x20the\x20reserve','fix-retained\x20claim\x20reserve','leaves\x20the\x20reserve\x20in\x20the\x20pool','fix=reserve','only\x20on-chain\x20holdback'],'harm':'Templates\x20that\x20declare\x20fix=reserve\x20ship\x20a\x20payout\x20rail\x20that\x20drains\x20100%\x20of\x20the\x20escrow\x20at\x20the\x20first\x20release;\x20the\x20claim/refund\x20legs\x20behind\x20it\x20are\x20dead\x20by\x20construction\x20and\x20the\x20money\x20is\x20gone\x20(airbnb\x20mainnet\x20audit\x202026-10-07:\x20ABNB_STAY_SERVICE\x20allocators[0]\x20fix=\x220\x22,\x20full\x20drain\x20at\x20payout_24h).'},{'fact_id':'FACT-GUARD-01','subject':'GuardIdentifier\x20recipient\x20+\x20for_object\x20binding','authoritative':'ERECIPIENT_NOT_FOR_OBJECT\x20is\x20enforced\x20ONLY\x20when\x20the\x20recipient\x20kind\x20is\x20GuardIdentifier\x20AND\x20payment_info.for_object\x20is\x20Some(binding).\x20Pure\x20Entity\x20recipients\x20and\x20unbound\x20GuardIdentifier\x20legs\x20skip\x20this\x20check\x20entirely\x20—\x20the\x20tooling\x20layer\x20(scanner,\x20template\x20compiler)\x20must\x20flag\x20them\x20(allocation.move:434-443).','falsehoods':['the\x20contract\x20checks\x20all\x20recipients\x20against\x20for_object','GuardIdentifier\x20recipients\x20are\x20always\x20safe','the\x20contract\x20validates\x20every\x20recipient\x20binding'],'harm':'An\x20unbound\x20GuardIdentifier\x20or\x20pure\x20Entity\x20recipient\x20can\x20redirect\x20funds\x20to\x20the\x20deploying\x20account\x20or\x20an\x20arbitrary\x20address\x20without\x20any\x20on-chain\x20error.'},{'fact_id':'FACT-MACHINE-01','subject':'Machine\x20edge\x20\x27from\x27\x20semantics','authoritative':'A\x20machine\x20edge\x20declares\x20a\x20single\x20source\x20node\x20in\x20its\x20\x27from\x27\x20field.\x20Multiple\x20edges\x20from\x20the\x20same\x20source\x20node\x20are\x20allowed\x20and\x20represent\x20alternative\x20paths;\x20they\x20are\x20NOT\x20merged.\x20An\x20edge\x20without\x20\x27from\x27\x20is\x20invalid\x20in\x20the\x20new\x20topology\x20format\x20and\x20causes\x20compile-time\x20blockers.','falsehoods':['edges\x20without\x20from\x20are\x20auto-derived','missing\x20from\x20means\x20any\x20node','from\x20is\x20optional\x20for\x20backward\x20compatibility'],'harm':'Old\x20flat\x20machine_shape\x20without\x20from\x20fields\x20compiles\x20into\x20an\x20incomplete\x20topology,\x20leaving\x20nodes\x20unreachable\x20and\x20fund\x20paths\x20missing.'},{'fact_id':'FACT-ENTITY-01','subject':'Entity\x20recipient\x20fallback\x20to\x20deployer','authoritative':'When\x20an\x20Entity\x20recipient\x27s\x20name_or_address\x20is\x20empty,\x20omitted,\x20or\x20resolves\x20to\x20the\x20deploying\x20account,\x20the\x20share\x20is\x20paid\x20to\x20the\x20DEPLOYING\x20ACCOUNT\x20(allocation.move:434-443).\x20This\x20is\x20a\x20silent\x20fallback\x20—\x20no\x20error\x20is\x20raised.','falsehoods':['empty\x20Entity\x20names\x20are\x20rejected','the\x20contract\x20validates\x20Entity\x20recipients','an\x20unnamed\x20Entity\x20recipient\x20causes\x20an\x20abort'],'harm':'A\x20template\x20with\x20a\x20placeholder\x20Entity\x20recipient\x20silently\x20pays\x20the\x20share\x20to\x20whoever\x20deploys\x20the\x20service,\x20which\x20is\x20almost\x20never\x20the\x20intended\x20recipient.'}];export function scanContent(a,b){const c=[],d=b['toLowerCase']();for(const e of SEMANTIC_FACTS){for(const f of e['falsehoods']){const g=f['toLowerCase']();let h=0x0;while((h=d['indexOf'](g,h))!==-0x1){const i=d['slice'](Math['max'](0x0,h-0xc),h),j=/(?:^|[\s"'])not\s+$/['test'](i)||/never\s+$/['test'](i);!j&&c['push']({'fact_id':e['fact_id'],'phrasing':f}),h+=g['length'];}}}return c;}
1
+ export const SEMANTIC_FACTS=[{'fact_id':'FACT-ALLOC-01','subject':'Allocator\x20guard-matching\x20and\x20firing\x20semantics','authoritative':'A\x20distribution\x20call\x20submits\x20ONE\x20guard\x20address;\x20every\x20allocator\x20whose\x20bound\x20guard\x20equals\x20the\x20submitted\x20address\x20fires,\x20in\x20vector\x20order,\x20each\x20against\x20the\x20balance\x20left\x20by\x20the\x20previous\x20(allocation.move:366-368\x20—\x20the\x20loop\x20has\x20no\x20early\x20exit).\x20'+'ORDER\x20IS\x20PRIORITY\x20(SV-3,\x20az3-mn-261013):\x20within\x20one\x20guard,\x20multiple\x20FIX/RATE\x20entries\x20consume\x20the\x20pool\x20strictly\x20in\x20their\x20declared\x20row\x20order\x20(allocation.move:422-427)\x20—\x20a\x20row\x20that\x20under-rates\x20leaves\x20too\x20little\x20for\x20later\x20rows,\x20and\x20a\x20later\x20row\x20that\x20cannot\x20be\x20fully\x20filled\x20aborts\x20the\x20distribution\x20(EZERO,\x2014).\x20Author\x20multi-row\x20splits\x20POOL-DESCENDING\x20(largest\x20claimant\x20first)\x20and\x20verify\x20Σ(fix/rate\x20values)\x20<=\x20the\x20pool\x20the\x20guard\x20can\x20see\x20at\x20fire\x20time.\x20'+'Allocators\x20with\x20DIFFERENT\x20guards\x20are\x20alternative\x20paths\x20selected\x20by\x20the\x20caller\x27s\x20guard\x20choice,\x20not\x20by\x20list\x20position.\x20Mutual\x20exclusion\x20must\x20be\x20expressed\x20inside\x20the\x20guard\x20conditions.','falsehoods':['first-match-wins','first\x20Allocator\x20whose\x20Guard\x20returns\x20true','first\x20allocator\x20whose\x20guard\x20passes\x20wins','the\x20first\x20Allocator\x20whose\x20Guard\x20returns\x20true\x20wins','first-match\x20allocator\x20semantics','only\x20the\x20first\x20one','only\x20the\x20first\x20one\x20matches','duplicate\x20addresses\x20only\x20match\x20the\x20first','the\x20first\x20one\x20wins','the\x20first\x20allocator\x20whose\x20guard'],'harm':'Templates\x20built\x20on\x20\x27first-match\x27\x20semantics\x20silently\x20stack\x20distributions\x20or\x20leave\x20refund\x20paths\x20unreachable,\x20because\x20the\x20contract\x20fires\x20ALL\x20allocators\x20bound\x20to\x20the\x20submitted\x20guard.'},{'fact_id':'FACT-ALLOC-02','subject':'Surplus\x20semantics\x20—\x20drains\x20the\x20entire\x20remaining\x20pool','authoritative':'Surplus\x20mode\x20distributes\x20the\x20ENTIRE\x20remaining\x20balance\x20of\x20the\x20order\x27s\x20allocation\x20pool,\x20not\x20just\x20the\x20amount\x20earmarked\x20for\x20a\x20specific\x20track.\x20If\x20a\x20refund-path\x20allocator\x20uses\x20Surplus\x20while\x20the\x20settlement\x20path\x20has\x20unpaid\x20fixed-amount\x20legs,\x20the\x20Surplus\x20takes\x20everything,\x20including\x20the\x20settlement\x20money.','falsehoods':['Surplus\x20takes\x20only\x20what\x20is\x20left','Surplus\x20returns\x20the\x20remainder\x20after\x20other\x20tracks','Surplus\x20is\x20safe\x20because\x20it\x20only\x20takes\x20leftovers'],'harm':'A\x20refund/deposit\x20allocator\x20using\x20Surplus\x20will\x20over-refund\x20the\x20buyer\x20and\x20starve\x20the\x20merchant\x20when\x20the\x20settlement\x20track\x20has\x20not\x20yet\x20fired\x20(ziroom\x20T5:\x20585/525\x20WOW\x20fully\x20refunded,\x20merchant\x20received\x200).'},{'fact_id':'FACT-ALLOC-03','subject':'Allocator\x20fix\x20semantics\x20—\x20computed\x20Amount-leg\x20total,\x20PAID,\x20never\x20a\x20holdback','authoritative':'fix\x20is\x20not\x20a\x20settable\x20parameter:\x20the\x20allocator-registration\x20call\x20computes\x20it\x20internally\x20as\x20the\x20sum\x20of\x20the\x20allocator\x27s\x20Amount-mode\x20legs\x20(allocation.move:399\x20fix:\x20total_amount),\x20and\x20alloc()\x20PAYS\x20every\x20Amount\x20leg\x20(allocation.move:540\x20balance::split)\x20while\x20subtracting\x20fix\x20only\x20from\x20the\x20net-Rate\x20base\x20(allocation.move:485\x20total_rates\x20=\x20balance\x20-\x20fix).\x20A\x20pure-Rate\x20allocator\x20therefore\x20has\x20fix=0\x20and\x20drains\x20100%\x20of\x20the\x20pool;\x20adding\x20Amount\x20legs\x20raises\x20outflow,\x20it\x20never\x20withholds.\x20The\x20allocator-registration\x20call\x20surface\x20takes\x20only\x20(guard,\x20sharing,\x20max)\x20—\x20no\x20fix\x20argument\x20at\x20all\x20—\x20so\x20a\x20template-side\x20fix\x20value\x20is\x20silently\x20dropped\x20before\x20the\x20transaction\x20is\x20built.\x20The\x20chain\x20has\x20NO\x20holdback/reserve\x20primitive;\x20the\x20only\x20way\x20to\x20leave\x20funds\x20in\x20a\x20pool\x20is\x20to\x20not\x20distribute\x20them\x20(no\x20allocator\x20fires,\x20or\x20a\x20max-capped\x20Surplus\x20stops\x20at\x20the\x20cap).','falsehoods':['the\x20reserve\x20never\x20leaves','reserve\x20never\x20leaves\x20the\x20pool','the\x20reserve\x20stays\x20in\x20the\x20pool','reserve\x20physically\x20stays\x20in\x20the\x20pool','the\x20fix\x20retains\x20the\x20reserve','fix-retained\x20claim\x20reserve','leaves\x20the\x20reserve\x20in\x20the\x20pool','fix=reserve','only\x20on-chain\x20holdback'],'harm':'Templates\x20that\x20declare\x20fix=reserve\x20ship\x20a\x20payout\x20rail\x20that\x20drains\x20100%\x20of\x20the\x20escrow\x20at\x20the\x20first\x20release;\x20the\x20claim/refund\x20legs\x20behind\x20it\x20are\x20dead\x20by\x20construction\x20and\x20the\x20money\x20is\x20gone\x20(airbnb\x20mainnet\x20audit\x202026-10-07:\x20ABNB_STAY_SERVICE\x20allocators[0]\x20fix=\x220\x22,\x20full\x20drain\x20at\x20payout_24h).'},{'fact_id':'FACT-GUARD-01','subject':'GuardIdentifier\x20recipient\x20+\x20for_object\x20binding','authoritative':'ERECIPIENT_NOT_FOR_OBJECT\x20is\x20enforced\x20ONLY\x20when\x20the\x20recipient\x20kind\x20is\x20GuardIdentifier\x20AND\x20payment_info.for_object\x20is\x20Some(binding).\x20Pure\x20Entity\x20recipients\x20and\x20unbound\x20GuardIdentifier\x20legs\x20skip\x20this\x20check\x20entirely\x20—\x20the\x20tooling\x20layer\x20(scanner,\x20template\x20compiler)\x20must\x20flag\x20them\x20(allocation.move:434-443).','falsehoods':['the\x20contract\x20checks\x20all\x20recipients\x20against\x20for_object','GuardIdentifier\x20recipients\x20are\x20always\x20safe','the\x20contract\x20validates\x20every\x20recipient\x20binding'],'harm':'An\x20unbound\x20GuardIdentifier\x20or\x20pure\x20Entity\x20recipient\x20can\x20redirect\x20funds\x20to\x20the\x20deploying\x20account\x20or\x20an\x20arbitrary\x20address\x20without\x20any\x20on-chain\x20error.'},{'fact_id':'FACT-MACHINE-01','subject':'Machine\x20edge\x20\x27from\x27\x20semantics','authoritative':'A\x20machine\x20edge\x20declares\x20a\x20single\x20source\x20node\x20in\x20its\x20\x27from\x27\x20field.\x20Multiple\x20edges\x20from\x20the\x20same\x20source\x20node\x20are\x20allowed\x20and\x20represent\x20alternative\x20paths;\x20they\x20are\x20NOT\x20merged.\x20An\x20edge\x20without\x20\x27from\x27\x20is\x20invalid\x20in\x20the\x20new\x20topology\x20format\x20and\x20causes\x20compile-time\x20blockers.','falsehoods':['edges\x20without\x20from\x20are\x20auto-derived','missing\x20from\x20means\x20any\x20node','from\x20is\x20optional\x20for\x20backward\x20compatibility'],'harm':'Old\x20flat\x20machine_shape\x20without\x20from\x20fields\x20compiles\x20into\x20an\x20incomplete\x20topology,\x20leaving\x20nodes\x20unreachable\x20and\x20fund\x20paths\x20missing.'},{'fact_id':'FACT-ENTITY-01','subject':'Entity\x20recipient\x20fallback\x20to\x20deployer','authoritative':'When\x20an\x20Entity\x20recipient\x27s\x20name_or_address\x20is\x20empty,\x20omitted,\x20or\x20resolves\x20to\x20the\x20deploying\x20account,\x20the\x20share\x20is\x20paid\x20to\x20the\x20DEPLOYING\x20ACCOUNT\x20(allocation.move:434-443).\x20This\x20is\x20a\x20silent\x20fallback\x20—\x20no\x20error\x20is\x20raised.','falsehoods':['empty\x20Entity\x20names\x20are\x20rejected','the\x20contract\x20validates\x20Entity\x20recipients','an\x20unnamed\x20Entity\x20recipient\x20causes\x20an\x20abort'],'harm':'A\x20template\x20with\x20a\x20placeholder\x20Entity\x20recipient\x20silently\x20pays\x20the\x20share\x20to\x20whoever\x20deploys\x20the\x20service,\x20which\x20is\x20almost\x20never\x20the\x20intended\x20recipient.'},{'fact_id':'FACT-REWARD-01','subject':'Reward\x20replay\x20scope\x20(SV-2)\x20—\x20entry-stamped\x20+\x20order-scoped\x20where\x20is\x20the\x20primary\x20once-per-buyer-per-order\x20form','authoritative':'SV-2\x20(azx7-mn-261014\x20live\x20T8):\x20on\x20a\x20guard\x20whose\x20reward\x20claim\x20entry\x20carries\x20the\x20store_from_id\x20stamp,\x20the\x20ORDER-SCOPED\x20record\x20query\x20(where:{storeFromId:{identifier:0}})\x20is\x20live\x20—\x20once\x20per\x20buyer\x20per\x20order\x20(the\x20native\x20claim\x20key\x20is\x20recipient+guard+stamp).\x20Entry-stamped\x20+\x20empty\x20where\x20is\x20the\x20DELIBERATE\x20once-per-buyer-for-life\x20variant;\x20an\x20unstamped\x20entry\x20never\x20keys\x20its\x20claim\x20records,\x20which\x20is\x20the\x20only\x20context\x20where\x20the\x20old\x20\x27storeFromId\x20filter\x20no-ops\x27\x20verdict\x20ever\x20held.\x20knowledge/protocol-facts.ts\x20(SV2_REPLAY_GATE_CLAUSE)\x20is\x20the\x20single-source\x20teaching\x20text;\x20the\x20compile\x20REVIEW_REWARD_UNARMED\x20blocker\x20interpolates\x20its\x20prescription\x20from\x20there.','falsehoods':['the\x20EMPTY\x20where\x20is\x20MANDATORY','NEVER\x20the\x20storeFromId\x20query\x20filter','storeFromId-filtered\x20record\x20query\x20is\x20a\x20SILENT\x20NO-OP','empty-where\x20exists_where\x20gate\x20is\x20the\x20only\x20working\x20idiom','filter\x20is\x20a\x20silent\x20no-op\x20on\x20the\x20current\x20runtime','NEVER\x20bind\x20storeFromId,\x20that\x20filter\x20silently\x20evaluates'],'harm':'The\x20retracted\x20ofn-mn-261012\x20F-01\x20reading\x20(run-75747\x20F-31)\x20shipped\x20pools\x20gated\x20recipient-only-for-life\x20—\x20silently\x20killing\x20the\x20buyer\x27s\x20second\x20order\x20(upw-mn-261014\x20F-48)\x20—\x20while\x20the\x20auditor\x20that\x20should\x20have\x20caught\x20it\x20carried\x20the\x20same\x20stale\x20verdict.'}];export function scanContent(a,b){const c=[],d=b['toLowerCase']();for(const e of SEMANTIC_FACTS){for(const f of e['falsehoods']){const g=f['toLowerCase']();let h=0x0;while((h=d['indexOf'](g,h))!==-0x1){const i=d['slice'](Math['max'](0x0,h-0xc),h),j=/(?:^|[\s"'])not\s+$/['test'](i)||/never\s+$/['test'](i);!j&&c['push']({'fact_id':e['fact_id'],'phrasing':f}),h+=g['length'];}}}return c;}
@@ -38,7 +38,7 @@ export interface ArchetypeTemplate {
38
38
  };
39
39
  review_mode?: "none" | "review" | "review_reward";
40
40
  }
41
- export declare const BUILTIN_TEMPLATES_VERSION = 61;
41
+ export declare const BUILTIN_TEMPLATES_VERSION = 77;
42
42
  export declare const BUILTIN_TEMPLATES: ArchetypeTemplate[];
43
43
  export declare const TEMPLATE_KEYWORDS: Record<string, string[]>;
44
44
  export declare function getBuiltinTemplate(id: string): ArchetypeTemplate | undefined;