@wowok/agent-mcp 3.4.3 → 3.4.4

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 (853) hide show
  1. package/dist/.build-stamp.json +3 -3
  2. package/dist/build-stamp.js +1 -0
  3. package/dist/chain-semantics/composition-truth.js +1 -1
  4. package/dist/chain-semantics/eval-order.js +1 -1
  5. package/dist/chain-semantics/freeze-map.js +1 -1
  6. package/dist/chain-semantics/fund-flow.js +1 -1
  7. package/dist/chain-semantics/object-graph.js +1 -1
  8. package/dist/composition/audit.js +1 -1
  9. package/dist/composition/compile.js +1 -1
  10. package/dist/composition/emit-phases.js +1 -1
  11. package/dist/composition/generate.js +1 -1
  12. package/dist/composition/guard-fill.js +1 -1
  13. package/dist/composition/input-normalize.js +1 -1
  14. package/dist/composition/materialize.js +1 -1
  15. package/dist/composition/mode-gates.js +1 -1
  16. package/dist/composition/plan.js +1 -1
  17. package/dist/composition/product-card.js +1 -1
  18. package/dist/composition/shape-expand.js +1 -0
  19. package/dist/config/judgment.js +1 -1
  20. package/dist/config/template-params.js +1 -1
  21. package/dist/data/sync/cdc.js +1 -1
  22. package/dist/data/sync/graphql-source.js +1 -1
  23. package/dist/evaluation/engine.js +1 -1
  24. package/dist/experience/realtime-feedback.js +1 -1
  25. package/dist/graph/onchain/expand.js +1 -1
  26. package/dist/graph/onchain/exposure.js +1 -1
  27. package/dist/graph/onchain/sdk-batch.js +1 -1
  28. package/dist/harness/entry-ignite-selfheal.js +1 -0
  29. package/dist/harness/forward-leg-preflight.js +1 -0
  30. package/dist/harness/recover.js +1 -1
  31. package/dist/keeper/detectors.js +1 -1
  32. package/dist/knowledge/allocator-rail-verifier.js +1 -1
  33. package/dist/knowledge/arb-operation-face.js +1 -0
  34. package/dist/knowledge/arbitration-rail-verifier.js +1 -1
  35. package/dist/knowledge/arbitration-templates.js +1 -1
  36. package/dist/knowledge/audit-rules.d.ts +15 -0
  37. package/dist/knowledge/audit-rules.js +1 -1
  38. package/dist/knowledge/baselines/rules/alloc_audit.json.good +310 -0
  39. package/dist/knowledge/baselines/rules/allocation.json.good +568 -0
  40. package/dist/knowledge/baselines/rules/arb.json.good +174 -0
  41. package/dist/knowledge/baselines/rules/arbitration.json.good +393 -0
  42. package/dist/knowledge/baselines/rules/bridge.json.good +197 -0
  43. package/dist/knowledge/baselines/rules/contact.json.good +152 -0
  44. package/dist/knowledge/baselines/rules/demand.json.good +158 -0
  45. package/dist/knowledge/baselines/rules/graph.json.good +534 -0
  46. package/dist/knowledge/baselines/rules/guard.json +18 -5
  47. package/dist/knowledge/baselines/rules/guard.json.good +1192 -0
  48. package/dist/knowledge/baselines/rules/machine.json.good +734 -0
  49. package/dist/knowledge/baselines/rules/oracle.json +1 -1
  50. package/dist/knowledge/baselines/rules/oracle.json.good +120 -0
  51. package/dist/knowledge/baselines/rules/order.json.good +549 -0
  52. package/dist/knowledge/baselines/rules/payment.json.good +205 -0
  53. package/dist/knowledge/baselines/rules/permission.json.good +330 -0
  54. package/dist/knowledge/baselines/rules/personal.json.good +139 -0
  55. package/dist/knowledge/baselines/rules/plan.json +343 -1
  56. package/dist/knowledge/baselines/rules/plan.json.good +1187 -0
  57. package/dist/knowledge/baselines/rules/progress.json.good +364 -0
  58. package/dist/knowledge/baselines/rules/proof.json.good +158 -0
  59. package/dist/knowledge/baselines/rules/registrar.json.good +159 -0
  60. package/dist/knowledge/baselines/rules/repository.json.good +244 -0
  61. package/dist/knowledge/baselines/rules/resource.json.good +117 -0
  62. package/dist/knowledge/baselines/rules/reward.json +10 -10
  63. package/dist/knowledge/baselines/rules/reward.json.good +586 -0
  64. package/dist/knowledge/baselines/rules/service.json.good +595 -0
  65. package/dist/knowledge/baselines/rules/treasury.json.good +440 -0
  66. package/dist/knowledge/baselines/rules/util.json.good +101 -0
  67. package/dist/knowledge/builtin-templates.d.ts +13 -1
  68. package/dist/knowledge/builtin-templates.js +1 -1
  69. package/dist/knowledge/chain-query-registry.js +1 -1
  70. package/dist/knowledge/discount-threshold.js +1 -1
  71. package/dist/knowledge/fee-param-bindings.js +1 -1
  72. package/dist/knowledge/fund-layer.d.ts +2 -0
  73. package/dist/knowledge/fund-layer.js +1 -1
  74. package/dist/knowledge/getting-started.js +1 -1
  75. package/dist/knowledge/guard-binding-table.js +1 -1
  76. package/dist/knowledge/guard-binding-verifier.js +1 -1
  77. package/dist/knowledge/guard-create-preflight.js +1 -0
  78. package/dist/knowledge/guard-field-cognition.js +1 -1
  79. package/dist/knowledge/guard-host-context.js +1 -1
  80. package/dist/knowledge/guard-leg-eval.js +1 -0
  81. package/dist/knowledge/guard-node-gates.js +1 -1
  82. package/dist/knowledge/guard-puzzle.js +1 -1
  83. package/dist/knowledge/guard-quality.js +1 -0
  84. package/dist/knowledge/guard-render.js +1 -1
  85. package/dist/knowledge/guard-risk.js +1 -1
  86. package/dist/knowledge/guard-semantic-walk.js +1 -0
  87. package/dist/knowledge/guard-templates.d.ts +1 -0
  88. package/dist/knowledge/guard-templates.js +1 -1
  89. package/dist/knowledge/guard-translation.js +1 -1
  90. package/dist/knowledge/index.js +1 -1
  91. package/dist/knowledge/industry-registry.js +1 -1
  92. package/dist/knowledge/jsonrpc-enum.js +1 -1
  93. package/dist/knowledge/param-schema.js +1 -1
  94. package/dist/knowledge/param-tiers.js +1 -1
  95. package/dist/knowledge/path-oracle/coverage.js +1 -1
  96. package/dist/knowledge/path-oracle/index.js +1 -1
  97. package/dist/knowledge/path-oracle/products/airbnb.js +1 -0
  98. package/dist/knowledge/path-oracle/products/algora.js +1 -0
  99. package/dist/knowledge/path-oracle/products/alibaba-1688.js +1 -0
  100. package/dist/knowledge/path-oracle/products/amazon.js +1 -0
  101. package/dist/knowledge/path-oracle/products/beatstars.js +1 -0
  102. package/dist/knowledge/path-oracle/products/booking-com.js +1 -0
  103. package/dist/knowledge/path-oracle/products/contra.js +1 -0
  104. package/dist/knowledge/path-oracle/products/costco.js +1 -0
  105. package/dist/knowledge/path-oracle/products/coursera.js +1 -0
  106. package/dist/knowledge/path-oracle/products/duoduo-maicai.js +1 -0
  107. package/dist/knowledge/path-oracle/products/etsy.js +1 -0
  108. package/dist/knowledge/path-oracle/products/food-delivery.js +1 -1
  109. package/dist/knowledge/path-oracle/products/gamefound.js +1 -0
  110. package/dist/knowledge/path-oracle/products/gofundme.js +1 -0
  111. package/dist/knowledge/path-oracle/products/hackerone.js +1 -0
  112. package/dist/knowledge/path-oracle/products/kickstarter.js +1 -0
  113. package/dist/knowledge/path-oracle/products/klook.js +1 -0
  114. package/dist/knowledge/path-oracle/products/ninety-nine-designs.js +1 -0
  115. package/dist/knowledge/path-oracle/products/onlyfans.js +1 -0
  116. package/dist/knowledge/path-oracle/products/patreon.js +1 -0
  117. package/dist/knowledge/path-oracle/products/pinduoduo-kuaituantuan.js +1 -0
  118. package/dist/knowledge/path-oracle/products/royalty-exchange.js +1 -0
  119. package/dist/knowledge/path-oracle/products/shansong.js +1 -0
  120. package/dist/knowledge/path-oracle/products/taobao-presale.js +1 -0
  121. package/dist/knowledge/path-oracle/products/upwork-catalog.js +1 -0
  122. package/dist/knowledge/path-oracle/products/upwork.js +1 -0
  123. package/dist/knowledge/path-oracle/products/yuanfudao.js +1 -0
  124. package/dist/knowledge/path-oracle/products/ziroom.js +1 -0
  125. package/dist/knowledge/pattern-resolutions.js +1 -1
  126. package/dist/knowledge/product-detail-source.js +1 -1
  127. package/dist/knowledge/product-doc-b5.js +1 -1
  128. package/dist/knowledge/product-doc-facets.js +1 -0
  129. package/dist/knowledge/projection.js +1 -1
  130. package/dist/knowledge/publish-gate.js +1 -1
  131. package/dist/knowledge/publish-surface-contract.js +1 -1
  132. package/dist/knowledge/recipient-constraint.d.ts +20 -0
  133. package/dist/knowledge/recipient-constraint.js +1 -1
  134. package/dist/knowledge/rule-declaration-types.d.ts +13 -0
  135. package/dist/knowledge/rule-declaration-types.js +1 -0
  136. package/dist/knowledge/rule-declarations.js +1 -0
  137. package/dist/knowledge/scenario-modes.d.ts +6 -0
  138. package/dist/knowledge/scenario-topology.js +1 -1
  139. package/dist/knowledge/template-loader.js +1 -1
  140. package/dist/knowledge/template-prose.js +1 -1
  141. package/dist/knowledge/template-registry.js +1 -1
  142. package/dist/knowledge/template-scanner.js +1 -1
  143. package/dist/knowledge/tools-reference.js +1 -1
  144. package/dist/monitor/MonitorLoop.js +1 -1
  145. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  146. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  147. package/dist/playbooks/service-build/merchant-guide.js +1 -1
  148. package/dist/playbooks/service-build/object-panorama.js +1 -1
  149. package/dist/playbooks/service-build/participation-radar.js +1 -1
  150. package/dist/playbooks/service-build/relationship-profile.js +1 -1
  151. package/dist/playbooks/service-build/service-panorama.js +1 -1
  152. package/dist/playbooks/service-build/service-quote.js +1 -1
  153. package/dist/review/index.js +1 -1
  154. package/dist/review/service.js +1 -1
  155. package/dist/safety/confirm-gate.js +1 -1
  156. package/dist/schema/benchmark-migration/index.d.ts +9 -0
  157. package/dist/schema/benchmark-migration/index.js +1 -1
  158. package/dist/schema/call/arbitration.d.ts +8 -0
  159. package/dist/schema/call/arbitration.js +1 -1
  160. package/dist/schema/call/base.d.ts +8 -0
  161. package/dist/schema/call/base.js +1 -1
  162. package/dist/schema/call/bridge.d.ts +2 -0
  163. package/dist/schema/call/error-codes.d.ts +1 -1
  164. package/dist/schema/call/error-codes.js +1 -1
  165. package/dist/schema/call/handler.d.ts +2 -1
  166. package/dist/schema/call/handler.js +1 -1
  167. package/dist/schema/call/order.d.ts +10 -0
  168. package/dist/schema/call/permission-handler.js +1 -1
  169. package/dist/schema/call/permission.js +1 -1
  170. package/dist/schema/call/progress.d.ts +15 -0
  171. package/dist/schema/call/progress.js +1 -1
  172. package/dist/schema/call/receipt.d.ts +1 -0
  173. package/dist/schema/call/receipt.js +1 -1
  174. package/dist/schema/call/repository.d.ts +12 -0
  175. package/dist/schema/call/repository.js +1 -1
  176. package/dist/schema/call/reward.js +1 -1
  177. package/dist/schema/call/semantic.d.ts +1 -0
  178. package/dist/schema/call/semantic.js +1 -1
  179. package/dist/schema/call/service.d.ts +5 -3
  180. package/dist/schema/call/service.js +1 -1
  181. package/dist/schema/common/index.js +1 -1
  182. package/dist/schema/envelope-unify.js +1 -1
  183. package/dist/schema/goal/index.d.ts +23 -0
  184. package/dist/schema/goal/planning.js +1 -1
  185. package/dist/schema/industry-pack/index.d.ts +2 -2
  186. package/dist/schema/local/index.d.ts +20 -0
  187. package/dist/schema/local/index.js +1 -1
  188. package/dist/schema/local/wip.d.ts +4 -0
  189. package/dist/schema/local/wip.js +1 -1
  190. package/dist/schema/messenger/index.d.ts +5 -0
  191. package/dist/schema/messenger/index.js +1 -1
  192. package/dist/schema/operations.d.ts +944 -1
  193. package/dist/schema/operations.js +1 -1
  194. package/dist/schema/query/bi.js +1 -1
  195. package/dist/schema/query/index.d.ts +5 -5
  196. package/dist/schema/query/index.js +1 -1
  197. package/dist/schema/schema-version.js +1 -1
  198. package/dist/schema/workspace/index.d.ts +2 -2
  199. package/dist/schema-query-impl/index.js +1 -1
  200. package/dist/schemas/account_operation.schema.json +1 -257
  201. package/dist/schemas/ask_user.schema.json +1 -78
  202. package/dist/schemas/benchmark_migration_operation.schema.json +1 -626
  203. package/dist/schemas/bridge_operation.schema.json +1 -1069
  204. package/dist/schemas/config_operation.schema.json +1 -82
  205. package/dist/schemas/employee_operation.schema.json +1 -319
  206. package/dist/schemas/evaluation_operation.schema.json +1 -3932
  207. package/dist/schemas/goal_operation.schema.json +1 -1650
  208. package/dist/schemas/guard2file.schema.json +1 -137
  209. package/dist/schemas/index.json +1 -285
  210. package/dist/schemas/industry_pack_operation.schema.json +1 -582
  211. package/dist/schemas/intent_radar.schema.json +1 -155
  212. package/dist/schemas/keeper_operation.schema.json +1 -364
  213. package/dist/schemas/local_cache_operation.schema.json +1 -116
  214. package/dist/schemas/local_history_operation.schema.json +1 -105
  215. package/dist/schemas/local_info_operation.schema.json +1 -140
  216. package/dist/schemas/local_mark_operation.schema.json +1 -124
  217. package/dist/schemas/machineNode2file.schema.json +1 -137
  218. package/dist/schemas/messenger_operation.schema.json +1 -2068
  219. package/dist/schemas/monitor_events.schema.json +1 -87
  220. package/dist/schemas/monitor_subscription.schema.json +1 -327
  221. package/dist/schemas/onchain_events.schema.json +1 -207
  222. package/dist/schemas/onchain_operations.schema.json +1 -28699
  223. package/dist/schemas/onchain_operations_allocation.schema.json +1 -1376
  224. package/dist/schemas/onchain_operations_arbitration.schema.json +1 -1355
  225. package/dist/schemas/onchain_operations_contact.schema.json +1 -988
  226. package/dist/schemas/onchain_operations_demand.schema.json +1 -1146
  227. package/dist/schemas/onchain_operations_gen_passport.schema.json +1 -663
  228. package/dist/schemas/onchain_operations_gen_proof.schema.json +1 -180
  229. package/dist/schemas/onchain_operations_guard.schema.json +1 -8518
  230. package/dist/schemas/onchain_operations_machine.schema.json +1 -1879
  231. package/dist/schemas/onchain_operations_order.schema.json +1 -1121
  232. package/dist/schemas/onchain_operations_payment.schema.json +1 -316
  233. package/dist/schemas/onchain_operations_permission.schema.json +1 -1036
  234. package/dist/schemas/onchain_operations_personal.schema.json +1 -1463
  235. package/dist/schemas/onchain_operations_progress.schema.json +1 -1041
  236. package/dist/schemas/onchain_operations_proof.schema.json +1 -750
  237. package/dist/schemas/onchain_operations_repository.schema.json +1 -2046
  238. package/dist/schemas/onchain_operations_reward.schema.json +1 -1286
  239. package/dist/schemas/onchain_operations_service.schema.json +1 -2602
  240. package/dist/schemas/onchain_operations_treasury.schema.json +1 -1527
  241. package/dist/schemas/onchain_table_data.schema.json +1 -1146
  242. package/dist/schemas/permission_operation.schema.json +1 -43
  243. package/dist/schemas/persona_operation.schema.json +1 -10424
  244. package/dist/schemas/query_toolkit.schema.json +1 -1867
  245. package/dist/schemas/schema_query.schema.json +1 -116
  246. package/dist/schemas/service_clone_operation.schema.json +1 -49
  247. package/dist/schemas/settle_sweep.schema.json +1 -0
  248. package/dist/schemas/strategy_review_operation.schema.json +1 -66
  249. package/dist/schemas/verify_guard_dry_run.schema.json +1 -0
  250. package/dist/schemas/watch_operation.schema.json +1 -145
  251. package/dist/schemas/wip_file.schema.json +1 -299
  252. package/dist/schemas/workflow_operation.schema.json +1 -722
  253. package/dist/schemas/workspace_operation.schema.json +1 -104
  254. package/dist/schemas/wowok_buildin_info.schema.json +1 -758
  255. package/dist/tools/handlers/benchmark-migration.js +1 -1
  256. package/dist/tools/handlers/config.js +1 -1
  257. package/dist/tools/handlers/entry-edge-recipe.js +1 -1
  258. package/dist/tools/handlers/file-export.js +1 -1
  259. package/dist/tools/handlers/local.js +1 -1
  260. package/dist/tools/handlers/messenger.js +1 -1
  261. package/dist/tools/handlers/onchain.js +1 -1
  262. package/dist/tools/handlers/pending-settlement-recipe.js +1 -0
  263. package/dist/tools/handlers/plan-recovery.js +1 -0
  264. package/dist/tools/handlers/query.js +1 -1
  265. package/dist/tools/handlers/repository-row-id.js +1 -0
  266. package/dist/tools/handlers/review-chain.js +1 -1
  267. package/dist/tools/handlers/settle-sweep.js +1 -0
  268. package/dist/tools/handlers/stale-build-check.js +1 -1
  269. package/dist/tools/handlers/submission-assembly.js +1 -1
  270. package/dist/tools/handlers/verify-guard-dry-run.js +1 -0
  271. package/dist/tools/handlers/wip-upload.js +1 -1
  272. package/dist/tools/index.d.ts +3 -1
  273. package/dist/tools/index.js +1 -1
  274. package/dist/tools/move-fn-index.gen.js +1 -1
  275. package/dist/tools/publish-gate-state.js +1 -1
  276. package/dist/tools/registry/business.js +1 -1
  277. package/dist/tools/registry/onchain.js +1 -1
  278. package/dist/tools/shared.js +1 -1
  279. package/dist/tools/types.d.ts +1 -1
  280. package/dist/tools/wrap.js +1 -1
  281. package/package.json +11 -4
  282. package/dist/chain-semantics/composition-truth.d.ts +0 -102
  283. package/dist/chain-semantics/eval-order.d.ts +0 -17
  284. package/dist/chain-semantics/field-capability.d.ts +0 -11
  285. package/dist/chain-semantics/freeze-map.d.ts +0 -11
  286. package/dist/chain-semantics/fund-flow.d.ts +0 -10
  287. package/dist/chain-semantics/guard-verbs.d.ts +0 -22
  288. package/dist/chain-semantics/index.d.ts +0 -12
  289. package/dist/chain-semantics/object-graph.d.ts +0 -18
  290. package/dist/communication/evidence.d.ts +0 -6
  291. package/dist/communication/message-cursors.d.ts +0 -35
  292. package/dist/communication/proof-reuse.d.ts +0 -9
  293. package/dist/communication/wts-attestation.d.ts +0 -39
  294. package/dist/composition/audit.d.ts +0 -15
  295. package/dist/composition/blueprint-view.d.ts +0 -63
  296. package/dist/composition/compile.d.ts +0 -83
  297. package/dist/composition/emit-phases.d.ts +0 -234
  298. package/dist/composition/generate.d.ts +0 -40
  299. package/dist/composition/guard-fill.d.ts +0 -52
  300. package/dist/composition/inflight.d.ts +0 -86
  301. package/dist/composition/input-normalize.d.ts +0 -15
  302. package/dist/composition/materialize.d.ts +0 -78
  303. package/dist/composition/mode-gates.d.ts +0 -35
  304. package/dist/composition/param-disclosure.d.ts +0 -61
  305. package/dist/composition/plan-retry-ledger.d.ts +0 -37
  306. package/dist/composition/plan.d.ts +0 -121
  307. package/dist/composition/product-card.d.ts +0 -94
  308. package/dist/composition/reflux.d.ts +0 -28
  309. package/dist/composition/supply-chain-emit.d.ts +0 -46
  310. package/dist/config/config-audit.spec.d.ts +0 -1
  311. package/dist/config/config-audit.spec.js +0 -1
  312. package/dist/config/config-warnings.d.ts +0 -2
  313. package/dist/config/index.d.ts +0 -4
  314. package/dist/config/judgment.spec.d.ts +0 -1
  315. package/dist/config/judgment.spec.js +0 -1
  316. package/dist/config/match-policy-file.d.ts +0 -34
  317. package/dist/config/match-policy-file.spec.d.ts +0 -1
  318. package/dist/config/match-policy-file.spec.js +0 -1
  319. package/dist/config/rule-engine.spec.d.ts +0 -1
  320. package/dist/config/rule-engine.spec.js +0 -1
  321. package/dist/config/runtime.d.ts +0 -29
  322. package/dist/config/store-policy.d.ts +0 -14
  323. package/dist/config/store-policy.spec.d.ts +0 -1
  324. package/dist/config/store-policy.spec.js +0 -1
  325. package/dist/config/template-params.d.ts +0 -42
  326. package/dist/config/template-params.spec.d.ts +0 -1
  327. package/dist/config/template-params.spec.js +0 -1
  328. package/dist/customer/account-events.d.ts +0 -32
  329. package/dist/data/api/api.spec.d.ts +0 -1
  330. package/dist/data/api/api.spec.js +0 -1
  331. package/dist/data/api/cli.d.ts +0 -1
  332. package/dist/data/api/head.d.ts +0 -16
  333. package/dist/data/api/head.spec.d.ts +0 -1
  334. package/dist/data/api/head.spec.js +0 -1
  335. package/dist/data/api/index.d.ts +0 -2
  336. package/dist/data/api/match.d.ts +0 -69
  337. package/dist/data/api/match.spec.d.ts +0 -1
  338. package/dist/data/api/match.spec.js +0 -1
  339. package/dist/data/api/server.d.ts +0 -13
  340. package/dist/data/projection/cli.d.ts +0 -1
  341. package/dist/data/projection/edges.d.ts +0 -8
  342. package/dist/data/projection/edges.spec.d.ts +0 -1
  343. package/dist/data/projection/edges.spec.js +0 -1
  344. package/dist/data/projection/facets.d.ts +0 -18
  345. package/dist/data/projection/facets.spec.d.ts +0 -1
  346. package/dist/data/projection/facets.spec.js +0 -1
  347. package/dist/data/projection/facts.d.ts +0 -40
  348. package/dist/data/projection/index.d.ts +0 -6
  349. package/dist/data/projection/project.d.ts +0 -10
  350. package/dist/data/projection/projection.spec.d.ts +0 -1
  351. package/dist/data/projection/projection.spec.js +0 -1
  352. package/dist/data/projection/schema.d.ts +0 -1
  353. package/dist/data/projection/store.d.ts +0 -51
  354. package/dist/data/projection/types.d.ts +0 -169
  355. package/dist/data/sync/cdc.d.ts +0 -33
  356. package/dist/data/sync/cdc.spec.d.ts +0 -1
  357. package/dist/data/sync/cdc.spec.js +0 -1
  358. package/dist/data/sync/graphql-source.d.ts +0 -16
  359. package/dist/data/sync/index.d.ts +0 -5
  360. package/dist/data/sync/reconciler.d.ts +0 -14
  361. package/dist/data/sync/reconciler.spec.d.ts +0 -1
  362. package/dist/data/sync/reconciler.spec.js +0 -1
  363. package/dist/data/sync/schema.d.ts +0 -1
  364. package/dist/data/sync/store.d.ts +0 -24
  365. package/dist/data/sync/sync.spec.d.ts +0 -1
  366. package/dist/data/sync/sync.spec.js +0 -1
  367. package/dist/data/sync/synchronizer.d.ts +0 -10
  368. package/dist/data/sync/types.d.ts +0 -164
  369. package/dist/evaluation/acceptance.d.ts +0 -33
  370. package/dist/evaluation/architecture.spec.d.ts +0 -1
  371. package/dist/evaluation/architecture.spec.js +0 -1
  372. package/dist/evaluation/builtins/arbitration-score.d.ts +0 -42
  373. package/dist/evaluation/builtins/demand-match.d.ts +0 -16
  374. package/dist/evaluation/builtins/graph-service.spec.d.ts +0 -1
  375. package/dist/evaluation/builtins/graph-service.spec.js +0 -1
  376. package/dist/evaluation/builtins/index.d.ts +0 -4
  377. package/dist/evaluation/builtins/purity.spec.d.ts +0 -1
  378. package/dist/evaluation/builtins/purity.spec.js +0 -1
  379. package/dist/evaluation/composer.d.ts +0 -38
  380. package/dist/evaluation/facets/catalog.d.ts +0 -19
  381. package/dist/evaluation/gap.d.ts +0 -2
  382. package/dist/evaluation/guard-scan.d.ts +0 -10
  383. package/dist/evaluation/index.d.ts +0 -14
  384. package/dist/evaluation/injection.d.ts +0 -6
  385. package/dist/evaluation/location-match.d.ts +0 -42
  386. package/dist/evaluation/match-operation.d.ts +0 -23
  387. package/dist/evaluation/match-policy-resolver.d.ts +0 -9
  388. package/dist/evaluation/match-policy.spec.d.ts +0 -1
  389. package/dist/evaluation/match-policy.spec.js +0 -1
  390. package/dist/evaluation/path-reasoning.d.ts +0 -37
  391. package/dist/evaluation/standards.d.ts +0 -11
  392. package/dist/evaluation/standards.spec.d.ts +0 -1
  393. package/dist/evaluation/standards.spec.js +0 -1
  394. package/dist/evaluation/structured-lines.d.ts +0 -8
  395. package/dist/evaluation/user-injection.d.ts +0 -6
  396. package/dist/experience/experience-reuse.d.ts +0 -10
  397. package/dist/experience/index.d.ts +0 -7
  398. package/dist/experience/persistence-config.d.ts +0 -6
  399. package/dist/experience/persistence.d.ts +0 -21
  400. package/dist/experience/realtime-feedback.d.ts +0 -5
  401. package/dist/experience/user-profile.d.ts +0 -25
  402. package/dist/extensions/capability.d.ts +0 -91
  403. package/dist/extensions/industry-audit.spec.d.ts +0 -1
  404. package/dist/extensions/industry-audit.spec.js +0 -1
  405. package/dist/goal/GoalClassifier.d.ts +0 -17
  406. package/dist/goal/GoalEngine.d.ts +0 -175
  407. package/dist/goal/GoalStore.d.ts +0 -27
  408. package/dist/goal/next-steps.d.ts +0 -12
  409. package/dist/goal/plan-approval.d.ts +0 -5
  410. package/dist/goal/pursue.d.ts +0 -18
  411. package/dist/graph/base.d.ts +0 -8
  412. package/dist/graph/onchain/analyze.d.ts +0 -59
  413. package/dist/graph/onchain/analyze.spec.d.ts +0 -1
  414. package/dist/graph/onchain/analyze.spec.js +0 -1
  415. package/dist/graph/onchain/anti-cheat.d.ts +0 -69
  416. package/dist/graph/onchain/anti-cheat.spec.d.ts +0 -1
  417. package/dist/graph/onchain/anti-cheat.spec.js +0 -1
  418. package/dist/graph/onchain/dataplane.d.ts +0 -44
  419. package/dist/graph/onchain/edge-batch.spec.d.ts +0 -1
  420. package/dist/graph/onchain/edge-batch.spec.js +0 -1
  421. package/dist/graph/onchain/edge-schema.d.ts +0 -69
  422. package/dist/graph/onchain/entity-profile.spec.d.ts +0 -1
  423. package/dist/graph/onchain/entity-profile.spec.js +0 -1
  424. package/dist/graph/onchain/event-history.spec.d.ts +0 -1
  425. package/dist/graph/onchain/event-history.spec.js +0 -1
  426. package/dist/graph/onchain/expand.d.ts +0 -4
  427. package/dist/graph/onchain/exploration.d.ts +0 -28
  428. package/dist/graph/onchain/exploration.spec.d.ts +0 -1
  429. package/dist/graph/onchain/exploration.spec.js +0 -1
  430. package/dist/graph/onchain/exposure.d.ts +0 -18
  431. package/dist/graph/onchain/exposure.spec.d.ts +0 -1
  432. package/dist/graph/onchain/exposure.spec.js +0 -1
  433. package/dist/graph/onchain/extract-deep.spec.d.ts +0 -1
  434. package/dist/graph/onchain/extract-deep.spec.js +0 -1
  435. package/dist/graph/onchain/extract.d.ts +0 -29
  436. package/dist/graph/onchain/facet-projection.d.ts +0 -99
  437. package/dist/graph/onchain/facet-projection.spec.d.ts +0 -1
  438. package/dist/graph/onchain/facet-projection.spec.js +0 -1
  439. package/dist/graph/onchain/facts.spec.d.ts +0 -1
  440. package/dist/graph/onchain/facts.spec.js +0 -1
  441. package/dist/graph/onchain/field-manifest.d.ts +0 -29
  442. package/dist/graph/onchain/field-manifest.spec.d.ts +0 -1
  443. package/dist/graph/onchain/field-manifest.spec.js +0 -1
  444. package/dist/graph/onchain/fixtures.d.ts +0 -80
  445. package/dist/graph/onchain/fixtures.spec.d.ts +0 -1
  446. package/dist/graph/onchain/fixtures.spec.js +0 -1
  447. package/dist/graph/onchain/graph-policy.spec.d.ts +0 -1
  448. package/dist/graph/onchain/graph-policy.spec.js +0 -1
  449. package/dist/graph/onchain/index.d.ts +0 -29
  450. package/dist/graph/onchain/interest.d.ts +0 -10
  451. package/dist/graph/onchain/interest.spec.d.ts +0 -1
  452. package/dist/graph/onchain/interest.spec.js +0 -1
  453. package/dist/graph/onchain/label-lint.spec.d.ts +0 -1
  454. package/dist/graph/onchain/label-lint.spec.js +0 -1
  455. package/dist/graph/onchain/names.d.ts +0 -23
  456. package/dist/graph/onchain/names.spec.d.ts +0 -1
  457. package/dist/graph/onchain/names.spec.js +0 -1
  458. package/dist/graph/onchain/object-held-receipts.d.ts +0 -20
  459. package/dist/graph/onchain/object-held-receipts.spec.d.ts +0 -1
  460. package/dist/graph/onchain/object-held-receipts.spec.js +0 -1
  461. package/dist/graph/onchain/onchain.spec.d.ts +0 -1
  462. package/dist/graph/onchain/onchain.spec.js +0 -1
  463. package/dist/graph/onchain/policy.d.ts +0 -8
  464. package/dist/graph/onchain/project-relationship.d.ts +0 -3
  465. package/dist/graph/onchain/proposal-graph.d.ts +0 -11
  466. package/dist/graph/onchain/proposal-graph.spec.d.ts +0 -1
  467. package/dist/graph/onchain/proposal-graph.spec.js +0 -1
  468. package/dist/graph/onchain/sdk-batch.d.ts +0 -129
  469. package/dist/graph/onchain/sdk-dataplane.d.ts +0 -44
  470. package/dist/graph/onchain/strategy.spec.d.ts +0 -1
  471. package/dist/graph/onchain/strategy.spec.js +0 -1
  472. package/dist/graph/onchain/synthesis.d.ts +0 -20
  473. package/dist/graph/onchain/synthesis.spec.d.ts +0 -1
  474. package/dist/graph/onchain/synthesis.spec.js +0 -1
  475. package/dist/graph/onchain/table-ledger.spec.d.ts +0 -1
  476. package/dist/graph/onchain/table-ledger.spec.js +0 -1
  477. package/dist/graph/onchain/viewport.d.ts +0 -6
  478. package/dist/harness/auto-escalation.d.ts +0 -15
  479. package/dist/intent/enrich.d.ts +0 -1
  480. package/dist/intent/index.d.ts +0 -23
  481. package/dist/intent/matcher.d.ts +0 -2
  482. package/dist/intent/store.d.ts +0 -19
  483. package/dist/intent/types.d.ts +0 -32
  484. package/dist/keeper/KeeperScan.d.ts +0 -41
  485. package/dist/keeper/KeeperStore.d.ts +0 -43
  486. package/dist/keeper/detectors.d.ts +0 -42
  487. package/dist/keeper/keeper.spec.d.ts +0 -1
  488. package/dist/keeper/keeper.spec.js +0 -1
  489. package/dist/keeper/types.d.ts +0 -67
  490. package/dist/knowledge/account-marks.d.ts +0 -36
  491. package/dist/knowledge/allocation-ledger.d.ts +0 -75
  492. package/dist/knowledge/allocation-puzzle.d.ts +0 -138
  493. package/dist/knowledge/allocation-risk.d.ts +0 -82
  494. package/dist/knowledge/allocation-templates.d.ts +0 -38
  495. package/dist/knowledge/allocator-rail-verifier.d.ts +0 -59
  496. package/dist/knowledge/anti-cheat.d.ts +0 -2
  497. package/dist/knowledge/arb-fund-facts.d.ts +0 -51
  498. package/dist/knowledge/arb-risk.d.ts +0 -39
  499. package/dist/knowledge/arbitration-puzzle.d.ts +0 -84
  500. package/dist/knowledge/arbitration-rail-verifier.d.ts +0 -35
  501. package/dist/knowledge/arbitration-risk.d.ts +0 -114
  502. package/dist/knowledge/arbitration-templates.d.ts +0 -39
  503. package/dist/knowledge/arbitration-venue-order.d.ts +0 -25
  504. package/dist/knowledge/baselines/guard-lint-baseline.spec.d.ts +0 -1
  505. package/dist/knowledge/baselines/guard-lint-baseline.spec.js +0 -1
  506. package/dist/knowledge/baselines/risk-baselines.spec.d.ts +0 -1
  507. package/dist/knowledge/baselines/risk-baselines.spec.js +0 -1
  508. package/dist/knowledge/baselines/risk-cases.d.ts +0 -8
  509. package/dist/knowledge/baselines/semantic-facts.d.ts +0 -12
  510. package/dist/knowledge/bridge-risk.d.ts +0 -36
  511. package/dist/knowledge/catalog-facts.d.ts +0 -4
  512. package/dist/knowledge/chain-query-registry.d.ts +0 -14
  513. package/dist/knowledge/commission-landing.d.ts +0 -26
  514. package/dist/knowledge/component-schema.d.ts +0 -64
  515. package/dist/knowledge/contact-risk.d.ts +0 -32
  516. package/dist/knowledge/contact-templates.d.ts +0 -26
  517. package/dist/knowledge/contract-invariants.d.ts +0 -54
  518. package/dist/knowledge/demand-risk.d.ts +0 -30
  519. package/dist/knowledge/discount-threshold.d.ts +0 -26
  520. package/dist/knowledge/dynamic-pricing.d.ts +0 -29
  521. package/dist/knowledge/entity-recipient-guard.d.ts +0 -21
  522. package/dist/knowledge/event-semantics.d.ts +0 -23
  523. package/dist/knowledge/evidence-review.d.ts +0 -35
  524. package/dist/knowledge/fee-param-bindings.d.ts +0 -28
  525. package/dist/knowledge/flywheel-loop.d.ts +0 -41
  526. package/dist/knowledge/game-scenarios.d.ts +0 -21
  527. package/dist/knowledge/getting-started.d.ts +0 -37
  528. package/dist/knowledge/goal-completion.d.ts +0 -31
  529. package/dist/knowledge/guard-anchor-reach.d.ts +0 -19
  530. package/dist/knowledge/guard-binding-table.d.ts +0 -52
  531. package/dist/knowledge/guard-binding-verifier.d.ts +0 -37
  532. package/dist/knowledge/guard-bindings.d.ts +0 -21
  533. package/dist/knowledge/guard-blueprint.d.ts +0 -68
  534. package/dist/knowledge/guard-design-patterns.d.ts +0 -38
  535. package/dist/knowledge/guard-eval.d.ts +0 -15
  536. package/dist/knowledge/guard-field-cognition.d.ts +0 -48
  537. package/dist/knowledge/guard-host-context.d.ts +0 -24
  538. package/dist/knowledge/guard-ledger.d.ts +0 -19
  539. package/dist/knowledge/guard-leg-map.d.ts +0 -5
  540. package/dist/knowledge/guard-lint.d.ts +0 -79
  541. package/dist/knowledge/guard-node-gates.d.ts +0 -9
  542. package/dist/knowledge/guard-puzzle.d.ts +0 -188
  543. package/dist/knowledge/guard-render.d.ts +0 -71
  544. package/dist/knowledge/guard-risk.d.ts +0 -71
  545. package/dist/knowledge/guard-submission-brief.d.ts +0 -94
  546. package/dist/knowledge/guard-submission-prompt.d.ts +0 -63
  547. package/dist/knowledge/guard-translation.d.ts +0 -58
  548. package/dist/knowledge/index.d.ts +0 -299
  549. package/dist/knowledge/industry-evolution.d.ts +0 -82
  550. package/dist/knowledge/industry-generalizer.d.ts +0 -63
  551. package/dist/knowledge/industry-rule-node.d.ts +0 -7
  552. package/dist/knowledge/industry-strategy.d.ts +0 -91
  553. package/dist/knowledge/intent-metrics.d.ts +0 -43
  554. package/dist/knowledge/jsonrpc-enum.d.ts +0 -102
  555. package/dist/knowledge/knob-docs.d.ts +0 -5
  556. package/dist/knowledge/machine-fork-watch.d.ts +0 -9
  557. package/dist/knowledge/machine-ledger.d.ts +0 -42
  558. package/dist/knowledge/machine-puzzle.d.ts +0 -206
  559. package/dist/knowledge/machine-risk.d.ts +0 -72
  560. package/dist/knowledge/machine-templates.d.ts +0 -92
  561. package/dist/knowledge/machine-topology.d.ts +0 -116
  562. package/dist/knowledge/machine-translation.d.ts +0 -96
  563. package/dist/knowledge/market-metrics.d.ts +0 -34
  564. package/dist/knowledge/market-operations.d.ts +0 -46
  565. package/dist/knowledge/migration-preflight.d.ts +0 -27
  566. package/dist/knowledge/object-dependency.d.ts +0 -31
  567. package/dist/knowledge/operation-dictionary.d.ts +0 -18
  568. package/dist/knowledge/order-ledger.d.ts +0 -69
  569. package/dist/knowledge/order-puzzle.d.ts +0 -162
  570. package/dist/knowledge/order-risk.d.ts +0 -62
  571. package/dist/knowledge/order-templates.d.ts +0 -50
  572. package/dist/knowledge/param-schema.d.ts +0 -93
  573. package/dist/knowledge/param-tiers.d.ts +0 -27
  574. package/dist/knowledge/passport-ledger.d.ts +0 -60
  575. package/dist/knowledge/passport-templates.d.ts +0 -40
  576. package/dist/knowledge/path-oracle/coverage.d.ts +0 -16
  577. package/dist/knowledge/path-oracle/index.d.ts +0 -5
  578. package/dist/knowledge/path-oracle/products/food-delivery.d.ts +0 -2
  579. package/dist/knowledge/path-oracle/schema.d.ts +0 -188
  580. package/dist/knowledge/pattern-resolutions.d.ts +0 -110
  581. package/dist/knowledge/payment-risk.d.ts +0 -38
  582. package/dist/knowledge/payment-tracker.d.ts +0 -63
  583. package/dist/knowledge/permission-ledger.d.ts +0 -49
  584. package/dist/knowledge/permission-puzzle.d.ts +0 -122
  585. package/dist/knowledge/permission-risk.d.ts +0 -70
  586. package/dist/knowledge/permission-templates.d.ts +0 -38
  587. package/dist/knowledge/personal-risk.d.ts +0 -36
  588. package/dist/knowledge/product-detail-source.d.ts +0 -37
  589. package/dist/knowledge/product-doc-b5.d.ts +0 -16
  590. package/dist/knowledge/progress-ledger.d.ts +0 -63
  591. package/dist/knowledge/progress-puzzle.d.ts +0 -82
  592. package/dist/knowledge/progress-risk.d.ts +0 -75
  593. package/dist/knowledge/progress-templates.d.ts +0 -38
  594. package/dist/knowledge/projection.d.ts +0 -54
  595. package/dist/knowledge/projection.spec.d.ts +0 -1
  596. package/dist/knowledge/projection.spec.js +0 -1
  597. package/dist/knowledge/proof-risk.d.ts +0 -33
  598. package/dist/knowledge/protocol-facts.d.ts +0 -17
  599. package/dist/knowledge/publish-gate.d.ts +0 -20
  600. package/dist/knowledge/publish-readiness.d.ts +0 -25
  601. package/dist/knowledge/publish-surface-contract.d.ts +0 -16
  602. package/dist/knowledge/puzzle-projections.d.ts +0 -11
  603. package/dist/knowledge/rail-exit-satisfiability.d.ts +0 -25
  604. package/dist/knowledge/registrar-risk.d.ts +0 -34
  605. package/dist/knowledge/release-sentinel.d.ts +0 -12
  606. package/dist/knowledge/repository-risk.d.ts +0 -46
  607. package/dist/knowledge/repository-write-semantics.d.ts +0 -27
  608. package/dist/knowledge/reputation-rules.d.ts +0 -36
  609. package/dist/knowledge/requirement-families.d.ts +0 -13
  610. package/dist/knowledge/resource-risk.d.ts +0 -32
  611. package/dist/knowledge/reward-ledger.d.ts +0 -97
  612. package/dist/knowledge/reward-puzzle.d.ts +0 -98
  613. package/dist/knowledge/reward-risk.d.ts +0 -86
  614. package/dist/knowledge/reward-templates.d.ts +0 -25
  615. package/dist/knowledge/rule-node-analyzers.d.ts +0 -49
  616. package/dist/knowledge/rule-outcome.d.ts +0 -5
  617. package/dist/knowledge/scenario-topology.d.ts +0 -48
  618. package/dist/knowledge/semantic-ir.d.ts +0 -136
  619. package/dist/knowledge/service-allocation-semantics.d.ts +0 -36
  620. package/dist/knowledge/service-allocator-audit-node.d.ts +0 -3
  621. package/dist/knowledge/service-ledger.d.ts +0 -87
  622. package/dist/knowledge/service-puzzle.d.ts +0 -158
  623. package/dist/knowledge/service-risk-node.d.ts +0 -3
  624. package/dist/knowledge/service-risk.d.ts +0 -110
  625. package/dist/knowledge/service-templates.d.ts +0 -41
  626. package/dist/knowledge/settlement-semantics.d.ts +0 -1
  627. package/dist/knowledge/strategy-manuals.d.ts +0 -15
  628. package/dist/knowledge/supply-chain.d.ts +0 -35
  629. package/dist/knowledge/template-index.d.ts +0 -19
  630. package/dist/knowledge/template-loader.d.ts +0 -425
  631. package/dist/knowledge/template-nav.d.ts +0 -9
  632. package/dist/knowledge/template-prose.d.ts +0 -50
  633. package/dist/knowledge/template-registry.d.ts +0 -48
  634. package/dist/knowledge/template-scanner.d.ts +0 -158
  635. package/dist/knowledge/template-test-profiles.d.ts +0 -17
  636. package/dist/knowledge/template-validation.d.ts +0 -3
  637. package/dist/knowledge/tools-reference.d.ts +0 -17
  638. package/dist/knowledge/treasury-ledger.d.ts +0 -42
  639. package/dist/knowledge/treasury-puzzle.d.ts +0 -163
  640. package/dist/knowledge/treasury-risk.d.ts +0 -88
  641. package/dist/knowledge/treasury-templates.d.ts +0 -38
  642. package/dist/knowledge/universal-template.d.ts +0 -22
  643. package/dist/knowledge/util-risk.d.ts +0 -30
  644. package/dist/knowledge/workflow-guidance.d.ts +0 -194
  645. package/dist/knowledge/workspace-lists.d.ts +0 -61
  646. package/dist/monitor/SuggestionBridge.spec.d.ts +0 -1
  647. package/dist/monitor/SuggestionBridge.spec.js +0 -1
  648. package/dist/participation/arbitrator-interest.d.ts +0 -22
  649. package/dist/participation/demander-interest.d.ts +0 -23
  650. package/dist/participation/employee-kpi.d.ts +0 -37
  651. package/dist/participation/employee-kpi.spec.d.ts +0 -1
  652. package/dist/participation/employee-kpi.spec.js +0 -1
  653. package/dist/participation/employee-store.d.ts +0 -16
  654. package/dist/participation/game-context.d.ts +0 -25
  655. package/dist/participation/index.d.ts +0 -2
  656. package/dist/participation/node-action-advisor.d.ts +0 -68
  657. package/dist/participation/time-window.d.ts +0 -48
  658. package/dist/persona/facet-profile.d.ts +0 -33
  659. package/dist/persona/persona-audit.spec.d.ts +0 -1
  660. package/dist/persona/persona-audit.spec.js +0 -1
  661. package/dist/playbooks/service-build/business-puzzle.d.ts +0 -48
  662. package/dist/playbooks/service-build/context-assembly.d.ts +0 -32
  663. package/dist/playbooks/service-build/facet-money.d.ts +0 -33
  664. package/dist/playbooks/service-build/facet-money.spec.d.ts +0 -1
  665. package/dist/playbooks/service-build/facet-money.spec.js +0 -1
  666. package/dist/playbooks/service-build/game-theory.d.ts +0 -47
  667. package/dist/playbooks/service-build/index.d.ts +0 -15
  668. package/dist/playbooks/service-build/intent-analyzer.d.ts +0 -72
  669. package/dist/playbooks/service-build/machine-nodes.d.ts +0 -27
  670. package/dist/playbooks/service-build/machine-panorama.d.ts +0 -71
  671. package/dist/playbooks/service-build/merchant-guide.d.ts +0 -382
  672. package/dist/playbooks/service-build/migration-planner.d.ts +0 -61
  673. package/dist/playbooks/service-build/mode-actions.d.ts +0 -260
  674. package/dist/playbooks/service-build/object-panorama.d.ts +0 -317
  675. package/dist/playbooks/service-build/object-type.d.ts +0 -1
  676. package/dist/playbooks/service-build/participation-radar.d.ts +0 -20
  677. package/dist/playbooks/service-build/pipeline-actions.d.ts +0 -108
  678. package/dist/playbooks/service-build/process.d.ts +0 -6
  679. package/dist/playbooks/service-build/relationship-profile.d.ts +0 -3
  680. package/dist/playbooks/service-build/reverse-mapping-nk4.spec.d.ts +0 -1
  681. package/dist/playbooks/service-build/reverse-mapping-nk4.spec.js +0 -1
  682. package/dist/playbooks/service-build/reverse-mapping-refund-p0-5.spec.d.ts +0 -1
  683. package/dist/playbooks/service-build/reverse-mapping-refund-p0-5.spec.js +0 -1
  684. package/dist/playbooks/service-build/reverse-mapping.d.ts +0 -66
  685. package/dist/playbooks/service-build/risk-aggregator.d.ts +0 -59
  686. package/dist/playbooks/service-build/service-panorama.d.ts +0 -229
  687. package/dist/playbooks/service-build/service-quote.d.ts +0 -2
  688. package/dist/playbooks/service-build/service-quote.spec.d.ts +0 -1
  689. package/dist/playbooks/service-build/service-quote.spec.js +0 -1
  690. package/dist/playbooks/service-build/topology-evaluation.spec.d.ts +0 -1
  691. package/dist/playbooks/service-build/topology-evaluation.spec.js +0 -1
  692. package/dist/playbooks/service-build/topology-query.d.ts +0 -25
  693. package/dist/playbooks/service-build/workflow-design-assessment.d.ts +0 -33
  694. package/dist/relationship/derivation.d.ts +0 -95
  695. package/dist/relationship/derivation.spec.d.ts +0 -1
  696. package/dist/relationship/derivation.spec.js +0 -1
  697. package/dist/relationship/incentive.d.ts +0 -38
  698. package/dist/relationship/index.d.ts +0 -4
  699. package/dist/relationship/registry.d.ts +0 -13
  700. package/dist/relationship/types.d.ts +0 -45
  701. package/dist/review/arb.d.ts +0 -4
  702. package/dist/review/demand.d.ts +0 -3
  703. package/dist/review/index.d.ts +0 -3
  704. package/dist/review/machine.d.ts +0 -3
  705. package/dist/review/order.d.ts +0 -8
  706. package/dist/review/progress.d.ts +0 -3
  707. package/dist/review/repository.d.ts +0 -3
  708. package/dist/review/service.d.ts +0 -5
  709. package/dist/review/types.d.ts +0 -163
  710. package/dist/role/derivation.d.ts +0 -35
  711. package/dist/role/index.d.ts +0 -6
  712. package/dist/role/intent.d.ts +0 -23
  713. package/dist/role/model.d.ts +0 -9
  714. package/dist/role/profiles.d.ts +0 -26
  715. package/dist/role/resolution.d.ts +0 -27
  716. package/dist/runtime/instance-registry.d.ts +0 -14
  717. package/dist/safety/index.d.ts +0 -3
  718. package/dist/schema/call/permission-handler.d.ts +0 -5
  719. package/dist/schema/call/semantic-customer-advice.spec.d.ts +0 -1
  720. package/dist/schema/call/semantic-customer-advice.spec.js +0 -1
  721. package/dist/schema/common/tokentype-short-probe.spec.d.ts +0 -1
  722. package/dist/schema/common/tokentype-short-probe.spec.js +0 -1
  723. package/dist/schema/envelope-unify.d.ts +0 -5
  724. package/dist/schema/goal/planning.d.ts +0 -742
  725. package/dist/schema/industry-pack/modes.d.ts +0 -447
  726. package/dist/schema/query/bi.d.ts +0 -3369
  727. package/dist/schema/utils/guard-query-utils.d.ts +0 -18
  728. package/dist/schema/utils/permission-index-utils.d.ts +0 -2
  729. package/dist/schema/utils/skills-recommendation.d.ts +0 -2
  730. package/dist/schema-query-impl/index.d.ts +0 -83
  731. package/dist/schemas/account_operation.output.json +0 -3869
  732. package/dist/schemas/ask_user.output.json +0 -54
  733. package/dist/schemas/benchmark_migration_operation.output.json +0 -1669
  734. package/dist/schemas/bridge_operation.output.json +0 -1548
  735. package/dist/schemas/config_operation.output.json +0 -896
  736. package/dist/schemas/employee_operation.output.json +0 -307
  737. package/dist/schemas/evaluation_operation.output.json +0 -4716
  738. package/dist/schemas/guard2file.output.json +0 -83
  739. package/dist/schemas/industry_pack_operation.output.json +0 -2985
  740. package/dist/schemas/intent_radar.output.json +0 -326
  741. package/dist/schemas/keeper_operation.output.json +0 -1441
  742. package/dist/schemas/local_cache_operation.output.json +0 -1718
  743. package/dist/schemas/local_history_operation.output.json +0 -1644
  744. package/dist/schemas/local_info_operation.output.json +0 -1530
  745. package/dist/schemas/local_mark_operation.output.json +0 -1622
  746. package/dist/schemas/machineNode2file.output.json +0 -88
  747. package/dist/schemas/messenger_operation.output.json +0 -4692
  748. package/dist/schemas/monitor_events.output.json +0 -1602
  749. package/dist/schemas/monitor_subscription.output.json +0 -1629
  750. package/dist/schemas/onchain_events.output.json +0 -4053
  751. package/dist/schemas/onchain_operations.output.json +0 -7788
  752. package/dist/schemas/onchain_table_data.output.json +0 -11868
  753. package/dist/schemas/permission_operation.output.json +0 -205
  754. package/dist/schemas/persona_operation.output.json +0 -64612
  755. package/dist/schemas/query_toolkit.output.json +0 -28302
  756. package/dist/schemas/schema_query.output.json +0 -81
  757. package/dist/schemas/service_clone_operation.output.json +0 -247
  758. package/dist/schemas/strategy_review_operation.output.json +0 -532
  759. package/dist/schemas/watch_operation.output.json +0 -930
  760. package/dist/schemas/wip_file.output.json +0 -360
  761. package/dist/schemas/workflow_operation.output.json +0 -422
  762. package/dist/schemas/workspace_operation.output.json +0 -477
  763. package/dist/schemas/wowok_buildin_info.output.json +0 -2477
  764. package/dist/strategy/collectors.d.ts +0 -66
  765. package/dist/strategy/collectors.spec.d.ts +0 -1
  766. package/dist/strategy/collectors.spec.js +0 -1
  767. package/dist/strategy/index.d.ts +0 -5
  768. package/dist/strategy/metrics.d.ts +0 -20
  769. package/dist/strategy/review.d.ts +0 -48
  770. package/dist/strategy/scorecard.d.ts +0 -32
  771. package/dist/strategy/store.d.ts +0 -26
  772. package/dist/task/ProcessStore.d.ts +0 -98
  773. package/dist/task/playbook.d.ts +0 -11
  774. package/dist/task/substep-trace.d.ts +0 -91
  775. package/dist/tools/build-fingerprint.d.ts +0 -28
  776. package/dist/tools/error-catalog.d.ts +0 -17
  777. package/dist/tools/handlers/ask-user.d.ts +0 -3
  778. package/dist/tools/handlers/benchmark-migration.d.ts +0 -121
  779. package/dist/tools/handlers/bridge.d.ts +0 -8
  780. package/dist/tools/handlers/config.d.ts +0 -2
  781. package/dist/tools/handlers/dispatch-expectations.d.ts +0 -2
  782. package/dist/tools/handlers/dispatch-expectations.spec.d.ts +0 -1
  783. package/dist/tools/handlers/dispatch-expectations.spec.js +0 -1
  784. package/dist/tools/handlers/employee.d.ts +0 -8
  785. package/dist/tools/handlers/employee.spec.d.ts +0 -1
  786. package/dist/tools/handlers/employee.spec.js +0 -1
  787. package/dist/tools/handlers/entry-edge-recipe.d.ts +0 -101
  788. package/dist/tools/handlers/escrow-deficit.d.ts +0 -10
  789. package/dist/tools/handlers/evaluation.d.ts +0 -2
  790. package/dist/tools/handlers/evaluation.spec.d.ts +0 -1
  791. package/dist/tools/handlers/evaluation.spec.js +0 -1
  792. package/dist/tools/handlers/file-export.d.ts +0 -3
  793. package/dist/tools/handlers/fund-rail-recipe.d.ts +0 -10
  794. package/dist/tools/handlers/goal.d.ts +0 -4
  795. package/dist/tools/handlers/industry-pack.d.ts +0 -3
  796. package/dist/tools/handlers/intent-radar.d.ts +0 -2
  797. package/dist/tools/handlers/keeper.d.ts +0 -12
  798. package/dist/tools/handlers/local.d.ts +0 -6
  799. package/dist/tools/handlers/mark-namespace.d.ts +0 -30
  800. package/dist/tools/handlers/messenger.d.ts +0 -24
  801. package/dist/tools/handlers/monitor.d.ts +0 -26
  802. package/dist/tools/handlers/name-resolution.d.ts +0 -4
  803. package/dist/tools/handlers/name-resolution.spec.d.ts +0 -1
  804. package/dist/tools/handlers/name-resolution.spec.js +0 -1
  805. package/dist/tools/handlers/network.d.ts +0 -1
  806. package/dist/tools/handlers/onchain-name-registration.d.ts +0 -49
  807. package/dist/tools/handlers/onchain-name-registration.spec.d.ts +0 -1
  808. package/dist/tools/handlers/onchain-name-registration.spec.js +0 -1
  809. package/dist/tools/handlers/onchain.d.ts +0 -132
  810. package/dist/tools/handlers/permission.d.ts +0 -2
  811. package/dist/tools/handlers/persona.d.ts +0 -4
  812. package/dist/tools/handlers/publish-binding-echo.d.ts +0 -22
  813. package/dist/tools/handlers/review-chain.d.ts +0 -19
  814. package/dist/tools/handlers/schema-query.d.ts +0 -2
  815. package/dist/tools/handlers/service-clone.d.ts +0 -20
  816. package/dist/tools/handlers/stale-build-check.d.ts +0 -9
  817. package/dist/tools/handlers/strategy-review.d.ts +0 -2
  818. package/dist/tools/handlers/submission-assembly.d.ts +0 -55
  819. package/dist/tools/handlers/watch.d.ts +0 -2
  820. package/dist/tools/handlers/winner-derivation.d.ts +0 -20
  821. package/dist/tools/handlers/wip-upload.d.ts +0 -22
  822. package/dist/tools/handlers/wip.d.ts +0 -2
  823. package/dist/tools/handlers/workflow.d.ts +0 -2
  824. package/dist/tools/handlers/workspace.d.ts +0 -4
  825. package/dist/tools/move-fn-index.gen.d.ts +0 -3
  826. package/dist/tools/publish-gate-state.d.ts +0 -5
  827. package/dist/tools/registry/agent.d.ts +0 -2
  828. package/dist/tools/registry/bridge.d.ts +0 -2
  829. package/dist/tools/registry/business.d.ts +0 -2
  830. package/dist/tools/registry/config.d.ts +0 -2
  831. package/dist/tools/registry/evaluation.d.ts +0 -2
  832. package/dist/tools/registry/files.d.ts +0 -2
  833. package/dist/tools/registry/identity.d.ts +0 -2
  834. package/dist/tools/registry/interaction.d.ts +0 -2
  835. package/dist/tools/registry/local.d.ts +0 -2
  836. package/dist/tools/registry/messenger.d.ts +0 -2
  837. package/dist/tools/registry/monitor.d.ts +0 -2
  838. package/dist/tools/registry/onchain.d.ts +0 -2
  839. package/dist/tools/registry/query.d.ts +0 -2
  840. package/dist/tools/retry.d.ts +0 -8
  841. package/dist/tools/rules-hook.d.ts +0 -5
  842. package/dist/tools/runtime-health.d.ts +0 -10
  843. package/dist/tools/sanitize-description-roundtrip.spec.d.ts +0 -1
  844. package/dist/tools/sanitize-description-roundtrip.spec.js +0 -1
  845. package/dist/tools/sanitize-output.d.ts +0 -4
  846. package/dist/tools/sanitize-output.spec.d.ts +0 -1
  847. package/dist/tools/sanitize-output.spec.js +0 -1
  848. package/dist/tools/shared.d.ts +0 -20
  849. package/dist/tools/transport-integrity.d.ts +0 -7
  850. package/dist/tools/upgrade-check.d.ts +0 -75
  851. package/dist/tools/wip-deploy-assist.d.ts +0 -34
  852. package/dist/tools/wip-verify-ledger.d.ts +0 -16
  853. package/dist/tools/wrap.d.ts +0 -45
@@ -0,0 +1,1187 @@
1
+ {
2
+ "comment": "Plan-domain rules (L1 composition kernel). Facts are produced by composition/audit.ts planFacts() from a Plan AST. Each rule names a verified failure class (TRAILHAVEN wiki/test/10, booking-85981 + amz-7f3a2c91 audits, upwc-cat-261017 CAT-A1): zero allocator rows passing silently, an unsellable sales-less catalog, prose guard logic, dual-rail double-pay, path-dependent settlement windows, write-only enforcement, dropped guard/repository hosts, missing task-binding slot declarations and GuardIdentifier slot mismatches that strand escrow permanently.",
3
+ "facts": {
4
+ "composition_primitives_emitted": "Sorted comma-joined list of the composition primitives the plan actually emits (P1 repository rendezvous / P2 foreign-order slot / P3 sub-Service commitment or retained_submission / P4 more than one allocator row / P5 Formula sharing / P6 Reward pool) - chain-semantics/composition-truth.ts",
5
+ "composition_cross_order_guard_count": "Guard steps that read order.* on a slot other than host slot 0 (the P2 cross-order shape)",
6
+ "first_cross_order_guard": "First guard step id reading a foreign order slot",
7
+ "cross_order_slots_display": "Foreign order slot identifiers read by that guard",
8
+ "first_cross_order_guard_unpaired": "First cross-order guard with NO pairing key: neither a repository.data rendezvous leg nor a declared {identifier: 255, b_submission: true} once row (COMPOSE-PAIR-01)",
9
+ "cross_order_unpaired_count": "How many cross-order guards lack a pairing key",
10
+ "first_cross_order_guard_unpinned": "First cross-order guard that does not read order.service on the foreign slot against a constant Address row (COMPOSE-PROVIDER-PIN-01)",
11
+ "first_cross_order_guard_no_owner_cross": "First cross-order guard that does not read order.owner on BOTH the host slot and the foreign slot (COMPOSE-OWNER-CROSS-01). Not emitted on the merchant_procured axis, where the buyer never owns the sub order, so the equality cannot hold",
12
+ "cross_order_owner_tie_not_expressible": "A cross-order guard exists on the merchant_procured axis, where order.owner cannot tie the two orders (the merchant owns the sub order, the buyer owns the host order) - the expressible ties are the provider pin and a byte-keyed pairing slot",
13
+ "third_party_fulfilment_present": "The plan gates on a foreign order or declares a procuring fulfillment_axis, so a third party performs part of the service",
14
+ "third_party_payout_leg_present": "At least one payout path reachable by a third party exists: an Entity/Signer sharing leg or a Reward pool",
15
+ "third_party_leg_count": "Sharing legs whose recipient is Entity or Signer (the only legs not bound by payment_info.for_object)",
16
+ "reward_pool_present": "The plan creates a Reward object (P6, the only permissionless third-party payout channel)",
17
+ "third_party_fulfilment_without_payout": "A third party fulfils but no payout path was pre-set before publish (COMPOSE-LIABILITY-01, S4, RD-C4)",
18
+ "fulfillment_axis": "Fulfillment axis: self | internal_staff | merchant_procured | user_procured (replaces the conflated logistics_mode). Taken from the declared axis, else derived from the declared composition variant, which fixes its axis 1:1.",
19
+ "composition_variant": "Declared commercial variant V1 | V2 | V3 | V4",
20
+ "composition_variant_known": "The declared variant is one of V1-V4",
21
+ "composition_variant_missing_primitives": "Primitives the declared variant requires but the plan does not emit (COMPOSE-VARIANT-01)",
22
+ "composition_variant_missing_count": "How many required primitives are missing",
23
+ "composition_dual_refund_unblockable": "V3 declared: two escrow pools answer to the SAME buyer and the chain cannot block the second refund (COMPOSE-DUALREFUND-01, S2/S3, RD-C3)",
24
+ "composition_disclosure_count": "Number of disclosures the declared variant owes the buyer before purchase",
25
+ "first_pii_public_face": "First build-time public face (service/contact/proof/repository/demand description or location, sales copy, repository data constant) whose text matches a language-neutral PII shape (PRIV-PUBLICFACE-01, S5)",
26
+ "first_pii_public_face_step": "Step id writing that face",
27
+ "first_pii_kind": "PII shape matched: email | street_number | phone | national_id",
28
+ "first_raw_tracking_value_step": "Configure step writing a RAW carrier tracking number as a repository data value (PRIV-TRACKING-RAW-01)",
29
+ "first_raw_tracking_value": "The raw tracking value found",
30
+ "per_order_proof_binding_step": "Proof bound to the ORDER (or a required_info bind referencing a proof), which publicly associates the order with the contact record (PRIV-PROOF-PERORDER-01)",
31
+ "has_service": "Plan creates a service object",
32
+ "has_machine": "Plan creates a machine object",
33
+ "has_repository": "Plan creates a repository object",
34
+ "allocator_row_count": "Total allocator rows across service create param and order_allocators configure steps",
35
+ "refund_row_count": "Allocator rows on the refund track",
36
+ "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)",
37
+ "terminal_nodes_display": "Comma-joined fund-bearing terminal node names",
38
+ "first_uncovered_terminal": "First fund-bearing terminal node no allocator guard accepts — either by pinning the terminal directly (alloc runs as a standalone call on the resting order) or via a node-free allocator guard riding the entry forward (a dual-host settlement key: its edge leg evaluates BEFORE the node move, so a progress.current pin on it would be a NODE-MATCH-01 deadlock and only the node-free shape fires on both hosts) (FUND-EXIT-01; optional leaves exempt)",
39
+ "first_uncovered_final_node": "First final/cancelled semantic-role node no allocator guard accepts — a money sink by business meaning even when graph topology gives it an outgoing edge (W5-12, ks7 F-02/A-02: return_rejected exited topologically but stranded the escrow) (FUND-EXIT-02)",
40
+ "first_cancelled_review_bridge": "First review/reward-class advance (forward or target node name matches review|reward) mounted ON a cancelled-role terminal — the refund-then-claim arbitrage bridge: the order took the full refund AND can still reach the bounty (W5-03, pdd F-03 / ddmc4 B-26 D8: withdraw + full refund + 5★ bounty in one session) (STATE-REFUNDED-REWARD-01)",
41
+ "first_roster_null_perm_edge": "First money-edge forward declaring a NON-EMPTY namedOperator roster with NO permissionIndex — permissionNeeded reads false, the Permission assert is skipped entirely and the roster stays pure decoration (it authorizes members, never denies non-members), so ANYONE can push the fund/terminal forward (W5-14, ddmc4 B-24 verified progress.move:266-310: an outsider fired ReturnReceived/CompensateBadItem) (EDGE-ROSTER-NULL-PERM-01)",
42
+ "coarse_perm_bucket_index": "First permission index shared by >= 2 money edges of DIFFERENT rail classes (settle / recover|award / refund|return / arb) — one bucket grants one entity every heterogeneous fund action at once (W5-14, ddmc4 B-25: 9 heterogeneous fund edges on bucket 1002 let the arbiter execute the merchant's rails) (PERM-COARSE-BUCKET-01)",
43
+ "coarse_perm_bucket_classes": "Comma-joined rail classes sharing that bucket",
44
+ "first_pinned_away_exit_node": "First non-terminal machine node whose EVERY outgoing edge is guard-pinned to OTHER nodes — exhaust every exit guard and no edge can fire while the order rests here, so a never-ruling arb case strands the escrow at a mid-flow node (W5-02, ddmc4 B-29: dismissed fails closed on a None indemnity and withdraw/reset leave both ruling roots silent; NODE-MATCH-01 reports each dead edge, this is the node-level rollup; a node with NO edge at all is a terminal — its coverage stays FUND-EXIT-01/02, entry stranding stays ENTRY-ABANDON-01) (FUND-EXIT-COMPLETENESS-01)",
45
+ "direction_blind_pay_edge_count": "Fund-track pay rows (refund / settle / recover) whose guard carries NO beneficiary-anchoring leg: no progress node pin, no machine-edge binding, no dispute freeze leg (query 1576), and no order identity leg (order.owner / order.agent has / order.service)",
46
+ "first_direction_blind_pay_edge": "First such direction-blind pay row — the payee is fixed by the row shape alone, indifferent to order state and identity, so the residual principal sweeps merchant-ward even when the buyer WON the award (ktt4 RT-01) and an outsider can drive the rail (W5-01 b: h1w9 F-01/F-04/F-09, ddmc4 B-26/B-27, pdd F-01/F-05, tbpr7 F-V3-01/16, ks7 F-21) (FUND-DIRECTION-BLIND-01)",
47
+ "first_refund_guard_missing_claimed_by": "First refund-track guard step id whose queries never read order.claimed_by (DUAL-RAIL-01, A-3)",
48
+ "first_path_dependent_anchor": "First guard step id using a path-dependent time query (TIME-ANCHOR-01, E-10)",
49
+ "path_sensitive": "The anchored node is reachable by more than one path, so the anchor can shift",
50
+ "first_write_only_unenforced_field": "First write-only param set with no guard query covering it (WRITE-ONLY-01, A-1/A-10)",
51
+ "write_once_removable_count": "Configure steps that dissolve a write_once policy attestation — policies op:'set' dropping it, op:'remove'/'clear' touching it, or a same-name op:'add' without write_once (WRITE-ONCE-REMOVABLE, W8-5 / N-10)",
52
+ "first_write_once_removable": "First write_once-dissolving configure step, rendered as: step 'id': <violation>: policy names",
53
+ "write_once_removable_display": "Semicolon-joined list of ALL write_once-dissolving configure steps",
54
+ "first_orphan_guard": "First guard step id never referenced by any host binding (HOST-GRAPH-01, B-2)",
55
+ "first_repo_query_without_repository": "First guard step id querying repository.* while the plan creates no repository (HOST-GRAPH-01, B-2)",
56
+ "first_edge_guard_missing_254": "First guard step id bound on a machine forward whose table declares no {identifier: 254, b_submission: true} row (TASKBIND-01, N-K20: progress::assert_task_binding aborts code 11)",
57
+ "first_alloc_slot_missing": "First allocator {GuardIdentifier:N} leg whose bound guard table lacks slot N as a declared Address submission row (TASKBIND-02, N-K21: alloc abort with funds stranded)",
58
+ "pending_allocator_guard_count": "Unresolved guard designs bound to allocator rows (compile-time judgment surface; >0 downgrades FUND-EXIT-01 from critical to medium)",
59
+ "first_pending_fund_guard": "First unresolved guard design bound to an allocator row or machine edge (UNRESOLVED-GUARD-01) — publishing now ships that path UNGUARDED",
60
+ "pending_fund_guard_count": "Total unresolved guard designs bound to fund paths (allocator rows or machine edges)",
61
+ "pending_fund_guard_keys_display": "Comma-joined keys of ALL unresolved fund-path guard designs",
62
+ "first_pending_buy_guard": "First unresolved guard design bound to the service buy path (UNRESOLVED-GUARD-01 warning tier)",
63
+ "pending_buy_guard_count": "Total unresolved guard designs bound to the service buy path",
64
+ "pending_buy_guard_keys_display": "Comma-joined keys of ALL unresolved buy-path guard designs",
65
+ "has_return_rail": "The machine declares a return rail node (name matches /return/i) — the structural refund promise (PROMISE-ARB, L-01')",
66
+ "return_rail_node": "First return-rail node name",
67
+ "has_arbitration_binding": "The plan wires an arbitration venue into the Service (configure method 'arbitrations' with a non-empty object list, or the service create carries non-empty arbitrations)",
68
+ "prose_window_promise_count": "Window-context duration declarations found in the service/sales prose (PROMISE-TIME judgment gate — absent when the prose carries none)",
69
+ "first_prose_time_mismatch": "First prose window promise that no guard duration constant in the plan backs (PROMISE-TIME critical, upwk-mn-261017 F-55)",
70
+ "prose_time_mismatch_count": "Total prose window promises with no matching enforced guard duration",
71
+ "prose_time_mismatch_display": "Semicolon-joined list of ALL mismatched prose window promises",
72
+ "enforced_window_ms_display": "Comma-joined enforced window durations parsed from the plan's guard tables (plausible ms U64 constants)",
73
+ "first_unanchored_window_promise": "First restart/renew-style window promise, which needs an entry-anchored (1280 next_node) window guard to be true (PROMISE-TIME medium tier, F-55)",
74
+ "unanchored_window_promise_count": "Total restart/renew-style window promises in the prose",
75
+ "fund_topup_present": "The plan carries a compensation_fund_add step",
76
+ "fund_topup_amount": "Sum of parseable (integer smallest-unit) top-up balances; absent when unparseable",
77
+ "fund_ceiling_breach": "The top-up is below the award ceiling (MAX_INDEMNITY_MULTIPLE x highest SKU price) — judged ONLY when both sides parse (PLAN-K2)",
78
+ "fund_concurrent_orders_coverable": "How many simultaneous ceiling-sized claims the fund can pay: floor(fund / (3x highest SKU)). The buy gate only covers 3x ONE order — concurrent claims beyond this count abort (E_COMPENSATION_NOT_MATCH) until a manual top-up (PLAN-K2, b6-11)",
79
+ "fund_ceiling_basis": "Human-readable basis used for the ceiling judgment",
80
+ "fund_ceiling_unverifiable": "A fund top-up exists but the ceiling could not be judged here (price or amount unparseable) — the publish-patch KL-K2 rule re-checks at the 3x largest-order basis (PLAN-K2 fallback, stated explicitly)",
81
+ "reward_bounty_amount": "Largest per-claim bounty across the plan's reward guard_add mounts (Fixed amounts, smallest units) — absent when the plan mounts no bounty (T-02, bsn7-tn-261026)",
82
+ "reward_funding_amount": "Sum of parseable reward-pool funding (coin_add steps on reward targets, smallest units)",
83
+ "reward_max_claims": "How many full-bounty claims the current funding can pay: floor(funding / bounty)",
84
+ "lowest_sku_price": "Cheapest POSITIVE SKU price on the plan's sales catalog (same two legal sites the PLAN-K2 ceiling parser reads; a 0-price SKU is dead stock, F-BS-76)",
85
+ "reward_scale_breach": "The bounty exceeds half the cheapest SKU price — every claimed order pays out more than the sale earns, a bounty-farm target (T-02; judged ONLY when both sides parse)",
86
+ "reward_scale_ratio_display": "Human-readable bounty-to-cheapest-SKU ratio",
87
+ "reward_scale_unverifiable": "A bounty mount exists but the catalog has no parseable price — the scale judgment is deferred, stated explicitly (T-02 fallback, never silence)",
88
+ "first_arb_exit_node": "First settled/refund-class node with an outgoing edge whose guard queries the arbitration promise family (arb.indemnity / arb.order / arb.status / order.dispute) — a post-settlement arbitration re-route (FUND-ZERO-01 judgment gate)",
89
+ "fund_arb_route_unfunded": "A post-settlement arbitration re-route exists AND the compensation pool is absent or deposits 0 — the ruling payout aborts 27 (E_COMPENSATION_NOT_MATCH), so the promised exit is dead by construction (FUND-ZERO-01)",
90
+ "entry_no_open_exit": "The order-landing node (entry-edge target) exits only through CLOSING time windows (Clock <= anchor legs, no opening leg, no unguarded alternative) — once a window closes nothing can advance the order and the entry escrow is locked (ENTRY-ABANDON-01, gf26 GF2-30)",
91
+ "entry_strand_node": "First stranded entry node name (ENTRY-ABANDON-01 judgment gate)",
92
+ "window_strand_nodes": "Comma-joined NON-ENTRY rest nodes whose EVERY exit is gated by a CLOSING time window (Clock <= anchor, no opening leg, no unguarded alternative) — once the window elapses the order cannot advance and the escrow held at that rest state has no firing rail (ENTRY-ABANDON-01 case ②, ctrx-mn-261108 O14/O15/O19: 1.10 WOW stranded after a claim_window's only exits closed)",
93
+ "window_strand_count": "How many non-entry rest nodes are window-stranded (ENTRY-ABANDON-01 case ② judgment gate)",
94
+ "arb_promise_without_settle_rail": "A machine guard reads the arbitration ruling family while NO $ref-visible allocator row releases money on the ruling (none reads the family, none rides the ruling edge node-free, and the ruling edge's destination has no FUND-EXIT-01-style allocator coverage); guard_key-declared rails are plan-opaque and left to the freeze gate — the verdict moves state, never money (POST-ARB-SETTLE-01, gf26 GF2-31)",
95
+ "arb_promise_node": "First node whose exit edge carries the arbitration-promise guard (POST-ARB-SETTLE-01 judgment gate)",
96
+ "arb_key_plane_opaque": "The machine carries arbitration-promise guards while the allocator rail plane carries guard_key declarations — rails the $ref plane cannot verify, so the POST-ARB-SETTLE-01 verdict rule stays silent there by ruling; this shape is the freeze gate's red line: ARB-KEY-PLANE-01 fires high and preflightPlan refuses the publish until the keys resolve into structured guard steps (user ruling 2026-10-26)",
97
+ "arb_key_plane_node": "First node whose exit edge carries the arbitration-promise guard (ARB-KEY-PLANE-01 judgment gate)",
98
+ "repo_policy_keys_display": "Comma-joined policy names declared by the plan's repository create steps (present only when at least one policy exists — the REPO-GATE-KEY-01 judgment gate)",
99
+ "repo_gate_key_unbacked_count": "Composite where-query scans over a plan-local repository whose static key no declared policy uses (REPO-GATE-KEY-01, ZR-32)",
100
+ "first_repo_gate_key_unbacked": "First unbacked gate key, rendered as 'key' in guard 'step-id'",
101
+ "repo_gate_key_unbacked_display": "Comma-joined list of ALL unbacked gate keys",
102
+ "wip_query_totality_count": "Guard order.item.wip_hash comparisons whose static String operand is NOT a case-exact sale name in the plan's sales catalog — find_sale_item misses at delivery, the native Err wedges the order with a primitive error inside verify_guard (R-QUERY-TOTALITY, kl F-ORDER-02); service.sale.wip_hash is out of scope (WIP-listing namespace); present only when a sales catalog exists AND at least one unprovable comparison burns",
103
+ "first_wip_query_totality": "First unprovable comparison, rendered as guard 'step-id': <query> vs '<constant>'",
104
+ "wip_query_totality_display": "Semicolon-joined list of ALL unprovable wip-hash comparisons",
105
+ "wip_query_totality_sku_display": "Comma-joined case-exact sale names the plan's catalog declares — the only shippable comparison constants",
106
+ "late_remedy_edge_count": "Machine edges whose forward name ends with `_late` — the K3 D3 after-hours twins a plan ships (late_remedy_mode = 'keeper_reopen' mounts one per closing-window edge, or the plan declares twins by hand). Present whenever a late rail exists: shipping one is itself a disclosure (an intent to operate outside the declared window)",
107
+ "late_remedy_gate_missing": "TRUE when any `{forward}_late` edge is bound to guards NONE of which carry the 1008 keeper membership leg (permission.entity.perm) — an ANONYMOUS after-hours rail: no keeper identity behind the reopen key (R-LATE-REMEDY, K3 D3)",
108
+ "first_late_remedy_gate_missing": "First anonymous late edge, rendered as 'prev -> next (forward)'",
109
+ "late_remedy_gate_missing_display": "Semicolon-joined list of ALL anonymous late edges",
110
+ "repo_agg_submitted_count": "Guard sum-where aggregates whose repository operand resolves to a SUBMITTED table cell — the advancing caller fills the ledger identity at forward time and can point the aggregate anywhere (REPO-AGG-SUBMITTED-01, W6-03 / upynjab P0-1)",
111
+ "first_repo_agg_submitted": "First submitted aggregate slot, rendered as 'slot N of guard 'step-id''",
112
+ "repo_agg_submitted_display": "Comma-joined list of ALL submitted aggregate slots",
113
+ "alloc_overlap_payee_count": "Allocator row pairs whose accepted-node sets INTERSECT but which pay DIFFERENT recipient sets — a double-pay race on the shared order state (INV-ALLOC-OVERLAP-PAYEE, W6-06; node overlap itself is the sanctioned C-F01/decision-11 shape)",
114
+ "first_alloc_overlap_payee": "First conflicting pair, rendered as row#i(track,guard,pays …) vs row#j(…) share node(s) [x,y] with different payees",
115
+ "alloc_overlap_payee_display": "Semicolon-joined list of ALL conflicting pairs",
116
+ "sales_step_present": "The plan materializes at least one sellable SKU (a service create with a non-empty sales list, or a configure step with method 'sales') — the order entry's existence predicate (PLAN-SALES-01)",
117
+ "dead_sku_count": "Sales whose name exceeds the on-chain 64-byte BUY limit (the listing path accepts up to 256 bytes but the buy path caps buyer-sent item names at 64 and matches EXACTLY — a 65..256-byte name is publishable yet every order_new aborts E_NAME_LENGTH_EXCEEDED) — present only when at least one dead SKU is listed (SKU-NAME-64 advisory, F-RQ-01 / rqd3-tn-261030)",
118
+ "first_dead_sku_name": "First over-limit sale name",
119
+ "first_dead_sku_bytes": "That name's UTF-8 byte length",
120
+ "guard_reach_contradiction_count": "Root-AND-chain legs carrying proof-level structural unreachability (ordering interval crossing; == to two different numeric constants or to opposite Bools; == X conjoined with a strict ordering past X; same-binding self-comparison with a strict direction) — the guard predicate is unsatisfiable by construction (GUARD-REACH-01, S3 plane)",
121
+ "first_guard_reach_contradiction": "First contradiction, rendered as: guard 'step-id' (channel): OP X contradicts OP X — unsatisfiable",
122
+ "guard_reach_contradiction_display": "Semicolon-joined list of ALL proof-level unreachability contradictions in the plan's guard roots",
123
+ "fractional_day_knob_count": "Fractional `*_days` knobs riding the PRESENTED plan's step params or resolved inputs — the publish-face semantic twin of the build face's PLAN-P0-18 blocker (TWIN-WINDOW-ZERO); absent when none",
124
+ "first_fractional_day_knob": "First fractional day knob, rendered as: step 'step-id': param.path = value — the U64 day slot truncates to N at BCS encode",
125
+ "fractional_day_knob_display": "Semicolon-joined list of ALL fractional day knobs on the presented plan",
126
+ "fractional_hour_knob_count": "Fractional `*_hours`/`*_minutes` leaves riding the PRESENTED plan's step params — the publish-face semantic twin of the build face's pdd F-09 hours blocker (TWIN-WINDOW-ZERO-HOURS); absent when none",
127
+ "first_fractional_hour_knob": "First fractional hours leaf, rendered as: step 'step-id': param.path = value — the U64 hour/minute slot truncates to N at BCS encode",
128
+ "fractional_hour_knob_display": "Semicolon-joined list of ALL fractional hours/minutes leaves on the presented plan's step params",
129
+ "guard_equality_drift_count": "Guards whose description promises hash/wip equality while the root carries NO logic_equal leg — existence-only enforcement, a forged hash clears it (GUARD-EQUALITY-DRIFT, ofnz8 F-49; shared predicate knowledge/guard-quality.ts, same function the template scanner runs)",
130
+ "first_guard_equality_drift": "First equality-drift guard, rendered as: guard 'step-id': description promises hash/wip equality but the root carries no logic_equal leg",
131
+ "guard_equality_drift_display": "Semicolon-joined list of ALL equality-drift guards",
132
+ "guard_threshold_literal_count": "Guards carrying a threshold-named U64 row whose value is the literal 1 — a 1-raw-unit floor is no floor (GUARD-THRESHOLD-LITERAL, ofnz8 F-70)",
133
+ "first_guard_threshold_literal": "First threshold-literal guard, rendered as: guard 'step-id': row 'name' = literal 1 (U64 threshold floor)",
134
+ "guard_threshold_literal_display": "Semicolon-joined list of ALL threshold-literal guards",
135
+ "guard_set_collapse_count": "Guards whose table repeats one String literal across >= 2 non-submission rows — the declared set collapsed to one member (GUARD-SET-COLLAPSE, ofnz8 F-51/F-52)",
136
+ "first_guard_set_collapse": "First set-collapse guard, rendered as: guard 'step-id': literal 'v' repeated across N rows (a, b)",
137
+ "guard_set_collapse_display": "Semicolon-joined list of ALL set-collapse guards",
138
+ "guard_input_trust_count": "Guards whose repository find/keys_where ids operand resolves to a caller-SUBMITTED (b_submission:true) table row — the candidate row set is self-attested (GUARD-INPUT-TRUST, ofnz8 P0-4(b))",
139
+ "first_guard_input_trust": "First input-trust guard, rendered as: guard 'step-id': find/keys ids operand resolves to caller-submitted row 'name' (identifier N)",
140
+ "guard_input_trust_display": "Semicolon-joined list of ALL input-trust guards",
141
+ "guard_abort_unsafe_count": "Guards referencing a verb whose native handler aborts (W_FIELD_NOT_FOUND) when the addressed record is absent — the guard engine evaluates every leaf before the boolean merge, so no structure shields the abort (GUARD-ABORT-SAFE-01, B-30)",
142
+ "first_guard_abort_unsafe": "First abort-unsafe guard, rendered as: guard 'step-id': query 'verb' aborts when the target record is absent",
143
+ "guard_abort_unsafe_display": "Semicolon-joined list of ALL abort-unsafe guards",
144
+ "first_guard_find_polarity": "First guard anchoring a history clock at find:\"first\" on a renewal/charge loop node — period 2+ reads the FIRST visit's timestamp (GUARD-FIND-POLARITY, ofnz8 F-61). Per-guard attribution (ofn-mn-261108 F-02): names the per-period CLAIMING guard when one exists, else the first bare anchor",
145
+ "guard_find_polarity_count": "Total find:\"first\" periodic-node anchors across the plan's guards",
146
+ "guard_find_polarity_per_period": "At least one such anchor's description claims PER-PERIOD semantics the find:\"first\" polarity cannot deliver — the critical face of the family",
147
+ "guard_find_polarity_display": "Semicolon-joined list of ALL periodic-anchor guards, each rendered with its own guard id, target node, and per-period verdict",
148
+ "refund_convergence_missing": "The plan ships a refund-track allocator row but NO machine edge into closed_refunded is gated by order.principal_refunded (chain-query 1579, the RefundStamp latch) — the refund loop has no provable close (R-REFUND-CONVERGENCE, K3 C3). CHAIN-TRUTH CORRECTION (upw-b7k2 R3, 2026-11-09): the O-F22 zombie-order shield (progress.move:600) aborts EVERY order-scoped advance/hold AFTER the principal is fully refunded, and the abort fires BEFORE guard evaluation (progress.move:634/672) — so this convergence edge can NEVER fire: full refund latches the guard's own precondition but the advance aborts first; partial refund leaves the latch false. The latch QUERY itself (1579) is the refund loop's real close proof; the edge is bookkeeping-dead pending the kernel whitelist proposal (see PG-ZOMBIE-01). Do not treat reaching closed_refunded as a live path",
149
+ "withdraw_no_case_bind_count": "WithdrawClaim machine edges whose bound guards read NO order.dispute.open leg (chain-query 1576) — a withdrawal with no case binding: replay farming (file->withdraw cycles need no new on-file dispute) and phantom/foreign cases satisfy nothing but also block nothing (R-WITHDRAW-NO-CASE-BIND, PT-26/ssng6)",
150
+ "first_withdraw_no_case_bind": "First such unbound withdraw edge, rendered as prev->next",
151
+ "withdraw_no_case_bind_display": "Semicolon-joined list of ALL unbound withdraw edges",
152
+ "settlement_triggers_display": "Semicolon-joined per-settlement-rail caller-identity faces: each rail's bound guard identity legs (order.owner==signer / order.agent has signer / order.service binding / permission role), or the kernel edge-rail default when the guard carries no caller face — the 'who can trigger settlement' disclosure (K3 C4)",
153
+ "settlement_buyer_only_count": "Settlement rails whose ONLY caller face is the order-holder leg (order.owner/order.agent) with no service-binding or permission-role face — the buyer triggers the merchant's settlement (role-reversal advisory, SETTLEMENT-TRIGGER-SCOPE)",
154
+ "dispute_freeze_rail_count": "Machine edges OTHER than withdraw edges whose bound guards read order.dispute.open (chain-query 1576) — dispute-freeze money rails gated on the open-dispute state (R-DISPUTE-EXIT-REACHABILITY, ss10 F-SS10-01)",
155
+ "dispute_freeze_rail_display": "Semicolon-joined list of ALL dispute-freeze rail edges, rendered as prev->next",
156
+ "dispute_exit_live_withdraw_count": "Withdraw-class edges whose guards read order.dispute.open (case-bound) but carry NO order.claimed_by disposition precondition — taking the edge leaves the case live forever (dispute vector is push-only, claimed_by has no clearer), freezing every dispute-freeze rail (ss10 F-SS10-01)",
157
+ "dispute_exit_live_withdraw_display": "Semicolon-joined list of ALL live-withdraw edges, rendered as prev->next",
158
+ "dispute_exit_dead_topology": "Flag: freeze rails + live withdraw edges coexist AND the machine exposes NO conclude/compensate-class forward — NOTHING can stamp claimed_by, the frozen rails are unreachable, escrow locks with no recovery path (high)",
159
+ "dispute_exit_indirect_stamp": "Flag: freeze rails + live withdraw edges coexist AND a conclude/compensate-class forward exists — recovery only via a FULL fresh arbitration cycle filed after the withdraw (medium disclosure)"
160
+ },
161
+ "rules": [
162
+ {
163
+ "rule_id": "PLAN-SALES-01",
164
+ "dimension": "composition",
165
+ "trigger": "A service plan materializes zero sellable SKUs. The compile kernel emits the service_sales configure step ONLY when inputs.sales is non-empty, so a plan that reaches publish without one ships a Service frozen with sales: [] and EVERY order_new aborts on the empty catalog (upwc-cat-261017 CAT-A1: the published shop was unsellable until SKUs were hand-added, and hand-added steps bypass the plan audit entirely).",
166
+ "cases": [
167
+ {
168
+ "when": { "all": [ { "field": "has_service", "op": "truthy" }, { "field": "sales_step_present", "op": "falsy" } ] },
169
+ "level": "high",
170
+ "title": "Service plan carries no sellable SKU (sales stays empty)",
171
+ "description": "The plan creates a Service but no step adds a sales entry, so the published object freezes with sales: []. Every order_new aborts on the empty catalog — the shop cannot take a single order, and patching the catalog by hand after publish bypasses this audit (the hand-built replica class that silently drops steps).",
172
+ "mitigation": "Pass a non-empty inputs.sales catalog so the compile kernel emits the service_sales configure step, keeping the catalog inside the audited plan before publish.",
173
+ "stakeholders": ["merchant", "customer"]
174
+ }
175
+ ]
176
+ },
177
+ {
178
+ "rule_id": "SKU-NAME-64",
179
+ "dimension": "composition",
180
+ "trigger": "A plan lists a sale whose name exceeds the on-chain 64-byte BUY limit. Listing accepts up to 256 bytes (common::LONG_NAME, service.move:158) but the buy path caps buyer-sent item names at 64 (common::NAME_ALLOW_EMPTY, service.move:311) and resolves items by EXACT name (service.move:520-563) — a 65..256-byte name is publishable yet EVERY order_new aborts E_NAME_LENGTH_EXCEEDED before anything runs. Advisory only (protocol-train ruling: the 256-byte listing stays legal; renaming is impossible — a new name is a NEW SKU), so this fires info and never blocks publish (F-RQ-01, rqd3-tn-261030: 3 of 4 merchants published shops whose SKUs could never be bought).",
181
+ "cases": [
182
+ {
183
+ "when": { "all": [ { "field": "dead_sku_count", "op": "gt", "value": 0 } ] },
184
+ "level": "info",
185
+ "title": "SKU '${first_dead_sku_name}' (${first_dead_sku_bytes} bytes) can be listed but never bought",
186
+ "description": "${dead_sku_count} sale name(s) exceed the 64-byte buy limit while the listing path accepted them (first: '${first_dead_sku_name}' at ${first_dead_sku_bytes} bytes). The buy path re-quotes every basket line's name and aborts E_NAME_LENGTH_EXCEEDED, so this SKU is PERMANENTLY unbuyable — buyers see a catalog they can never order from.",
187
+ "mitigation": "Add a purchasable twin SKU whose name is within 64 bytes (UTF-8) BEFORE publish; renaming the dead SKU is not possible after listing (exact-name matching makes a new name a new SKU). Non-blocking advisory: the listing itself is protocol-legal.",
188
+ "stakeholders": ["merchant", "customer"]
189
+ }
190
+ ]
191
+ },
192
+ {
193
+ "rule_id": "PLAN-ALLOC-01",
194
+ "dimension": "fund_flow",
195
+ "trigger": "Service plan materializes zero allocator rows — the TRAILHAVEN failure: migration_apply emitted plan_allocation: [] with no critical, and the shop could neither settle nor refund.",
196
+ "cases": [
197
+ {
198
+ "when": { "all": [ { "field": "has_service", "op": "truthy" }, { "field": "allocator_row_count", "op": "eq", "value": 0 } ] },
199
+ "level": "critical",
200
+ "title": "Service plan has no allocator rows",
201
+ "description": "The plan creates a service but materializes zero allocator rows. On chain, publish aborts with E_NO_ALLOCATOR; worse, a plan that reaches materialization without rows means the shop cannot settle or refund anything.",
202
+ "mitigation": "Add at least one settlement-track allocator row (guard + recipient + mode). If the business has a refund path, add a refund-track row too.",
203
+ "stakeholders": ["merchant", "customer"]
204
+ }
205
+ ]
206
+ },
207
+ {
208
+ "rule_id": "FUND-EXIT-01",
209
+ "dimension": "fund_flow",
210
+ "trigger": "A business-terminal machine node is accepted by no allocator guard — funds that reach it are stranded forever (Machine/Service freeze at publish, A-2). Two tiers: with zero pending guard designs the money has NO declared exit (critical); with pending designs the exit is DECLARED but unverifiable until the judgment layer resolves them (medium).",
211
+ "cases": [
212
+ {
213
+ "when": { "all": [ { "field": "terminal_count", "op": "gt", "value": 0 }, { "field": "first_uncovered_terminal", "op": "present" }, { "field": "pending_allocator_guard_count", "op": "eq", "value": 0 } ] },
214
+ "level": "critical",
215
+ "title": "Terminal node '${first_uncovered_terminal}' has no fund exit",
216
+ "description": "Terminal nodes (${terminal_nodes_display}) are where orders rest forever. '${first_uncovered_terminal}' is accepted by no allocator guard and no pending guard design exists that could cover it, so escrowed funds reaching it can never leave. This must be proven impossible BEFORE publish — the graph and allocators freeze permanently.",
217
+ "mitigation": "Add an allocator whose guard accepts the terminal node (progress.current == '${first_uncovered_terminal}'), or add an outgoing edge so the node is no longer terminal.",
218
+ "stakeholders": ["merchant", "customer"]
219
+ },
220
+ {
221
+ "when": { "all": [ { "field": "terminal_count", "op": "gt", "value": 0 }, { "field": "first_uncovered_terminal", "op": "present" }, { "field": "pending_allocator_guard_count", "op": "gt", "value": 0 } ] },
222
+ "level": "medium",
223
+ "title": "Terminal node '${first_uncovered_terminal}' fund exit is declared but unverified",
224
+ "description": "Terminal nodes (${terminal_nodes_display}) are where orders rest forever. '${first_uncovered_terminal}' is accepted by no RESOLVED allocator guard; pending guard designs exist that may cover it, but until they are resolved into structured guards the coverage cannot be verified.",
225
+ "mitigation": "Resolve the pending guard designs (judgment layer / guardResolutions) so the allocator guard verifiably accepts '${first_uncovered_terminal}' before publish.",
226
+ "stakeholders": ["merchant", "customer"]
227
+ }
228
+ ]
229
+ },
230
+ {
231
+ "rule_id": "FUND-EXIT-02",
232
+ "dimension": "fund_flow",
233
+ "cases": [
234
+ {
235
+ "when": { "all": [ { "field": "first_uncovered_final_node", "op": "present" } ] },
236
+ "level": "critical",
237
+ "title": "Final/cancelled node '${first_uncovered_final_node}' has no allocator fund exit",
238
+ "description": "'${first_uncovered_final_node}' carries a final/cancelled semantic role — by business meaning the order's money journey STOPS here, even if a graph edge leaves the node. No allocator guard accepts it, so escrow reaching this state strands permanently (W5-12, ks7 F-02: return_rejected had a topological exit yet neither settle nor recover could move the funds). Graph-sink checks miss this shape; the semantic role does not.",
239
+ "mitigation": "Add an allocator row whose guard accepts '${first_uncovered_final_node}' (progress.current pin or node-free entry-forward shape), or give the node a genuine settlement/refund exit. For rejected terminals, keep a dispute or settle_after_grace rail.",
240
+ "stakeholders": ["merchant", "customer"]
241
+ }
242
+ ]
243
+ },
244
+ {
245
+ "rule_id": "STATE-REFUNDED-REWARD-01",
246
+ "dimension": "fund_flow",
247
+ "cases": [
248
+ {
249
+ "when": { "all": [ { "field": "first_cancelled_review_bridge", "op": "present" } ] },
250
+ "level": "critical",
251
+ "title": "Review/reward advance mounted on cancelled terminal '${first_cancelled_review_bridge}' — refund-then-claim arbitrage",
252
+ "description": "A review/reward-class advance departs a cancelled-role terminal (${first_cancelled_review_bridge}): the order can take the FULL refund and still walk to the bounty — 'refund + 5★ claim' double collection (W5-03, pdd F-03 T3/T7: full refund then review bounty; ddmc4 B-26 D8: withdraw + full refund + top-rating bounty in one session; tbpr7 F-V3-03: rebate window inside the return window). The claim guard's node set carries no cancelled node, so this bridge is the ONLY route a refunded order has back to the reward — and the machine shell happily mounts it because nothing forbade it until now.",
253
+ "mitigation": "Remove the review/reward-class edge from the cancelled terminal. Mutual exclusion is structural: the bounty's claim set carries final-role nodes ONLY and the claim window opens after the after-sales window closes (tbs7 F-04) — a cancelled order must stay outside that set. (A chain-level 'was ever refunded' boolean does not exist — protocol train.)",
254
+ "stakeholders": ["merchant", "customer"]
255
+ }
256
+ ]
257
+ },
258
+ {
259
+ "rule_id": "FUND-EXIT-COMPLETENESS-01",
260
+ "dimension": "fund_flow",
261
+ "cases": [
262
+ {
263
+ "when": { "all": [ { "field": "first_pinned_away_exit_node", "op": "present" } ] },
264
+ "level": "critical",
265
+ "title": "Every exit of '${first_pinned_away_exit_node}' is guard-pinned to other nodes — the order strands here",
266
+ "description": "While the order rests at '${first_pinned_away_exit_node}', none of its outgoing edges can fire: every edge guard pins progress.current to a DIFFERENT node (NODE-MATCH-01 already reports each such edge; this is the node-level rollup — exhaust every exit guard, find no live exit). The order and its escrow are unreachable-by-construction from here on (W5-02, ddmc4 B-29 D6: the never-ruling arb case — tpl_forward_arb_ruling_won needs a positive award and dismissed fails closed on a None indemnity, so withdraw/reset leave BOTH ruling roots silent and an arb waypoint gated only by rulings is this same deadlock expressed through guard pins; ETSY-T1 catalog deadEndLock is the catalog-level twin). Exit coverage is evaluated ONLY on fund-exit grounds (R2-01 lesson): node-level rollup, no whole-graph topology walk. A node with NO outgoing edge at all is a terminal — its coverage is FUND-EXIT-01/02's face, not this gate.",
267
+ "mitigation": "Re-pin the guards so at least one edge accepts the node the order actually rests on, or add an unpinned escape edge. For an arb waypoint the canonical shape is the buyer's void escape: { prev: <waypoint>, forward: 'WithdrawClaim', operator: 'order_payer', guard_key: 'withdraw_claim_<leg>' } with a pattern.identity_check_order_holder guard — no ruling means arb.claimed_by is none, the order stays put, and the FULL escrow returns through the untouched node-gated refund track (decision 11 two-rail independence). A ForceSettleExpired clock edge (buyer-directed) is the acceptable fallback; never gate the only live exit on a ruling that can fail closed. A live exit means: an edge whose guards are empty, or whose guard's acceptedNodes includes this node.",
268
+ "stakeholders": ["merchant", "customer"]
269
+ }
270
+ ]
271
+ },
272
+ {
273
+ "rule_id": "FUND-DIRECTION-BLIND-01",
274
+ "dimension": "fund_flow",
275
+ "cases": [
276
+ {
277
+ "when": { "all": [ { "field": "first_direction_blind_pay_edge", "op": "present" } ] },
278
+ "level": "critical",
279
+ "title": "Pay row '${first_direction_blind_pay_edge}' — the beneficiary is a constant, not a state function",
280
+ "description": "A fund-track pay row is bound to a guard that anchors NOTHING: no progress node pin, no machine-edge binding, no dispute freeze leg (query 1576 order.dispute.open), and no order identity leg (order.owner / order.agent has / order.service). The payee is fixed by the row shape alone, so the pay direction is blind to who won and where the order rests — the claimed_by direction-blind family (W5-01, five of five reports): the residual principal sweeps merchant-ward even when the buyer WON the award (ktt4 RT-01: 300M award from the compensation pool, then the 600M escrow principal swept to the merchant), and an outsider can drive the rail (h1w9: an unrelated address fired the merchant's recover three times and closed the case; ddmc4 D10: the buyer executed the merchant's sweep). Machine/Service/Allocation freeze at publish — a wrong pay direction is unfixable after publish.",
281
+ "mitigation": "Anchor the rail's guard to a beneficiary-tying leg: the terminal-node gate (progress.current in the rail's node set — decision 11 node-gated, NEVER order.claimed_by) plus the order.service binding (1563 == this service) and, on the identity face, order.owner (1562) / order.agent has (1567). The canonical recover rail is guard-catalog tpl_allocator_node_gate_recover: terminal-node-gated + order.service + dispute freeze (logic_not[1576]). If merchant-exit is the intended disposition, state it (the canonical 'merchant-side sweep' row note) so the scan records the conscious choice; a buyer-win principal return needs a separate buyer-ward row (recipient slot 0 — the Order address; owner.receive credits the buyer).",
282
+ "stakeholders": ["merchant", "customer"]
283
+ }
284
+ ]
285
+ },
286
+ {
287
+ "rule_id": "FUND-ZERO-01",
288
+ "dimension": "fund_flow",
289
+ "trigger": "The machine routes a post-settlement arbitration re-route (an arbitration-promise guard — arb.indemnity / arb.order / arb.status / order.dispute — on an edge leaving a settled/refund-class node) while the compensation pool is never funded. service::compensation_claim pays the ruling from the service compensation fund and an underfunded pool aborts the payout with code 27 (E_COMPENSATION_NOT_MATCH, claim left unconsumed); the escrow behind a settled/refunded node is structurally drained, so with a zero or absent fund the promised exit is dead by construction (gf26-tn-261026 GF2-02: a 0-fund shop published and the buyer's only remedy had no money behind it).",
290
+ "cases": [
291
+ {
292
+ "when": { "all": [ { "field": "fund_arb_route_unfunded", "op": "truthy" }, { "field": "fund_topup_present", "op": "falsy" } ] },
293
+ "level": "critical",
294
+ "title": "Post-settlement arbitration re-route from '${first_arb_exit_node}' with NO compensation fund",
295
+ "description": "The plan gates an exit edge leaving '${first_arb_exit_node}' on an arbitration ruling. That ruling pays through service::compensation_claim, which draws ONLY from service.compensation_fund — this plan never creates one (no compensation_fund_add step). The escrow is already drained at that node, so the buyer's remedy has zero money behind it: the payout aborts with code 27 even when the ruling is valid.",
296
+ "mitigation": "Add a configure step with method 'compensation_fund_add' and a balance >= the largest single-order exposure (the award ceiling is 3x the order amount, arb.move MAX_INDEMNITY_MULTIPLE), or rebuild without the post-settlement arbitration edge so the remedy does not depend on the fund.",
297
+ "stakeholders": ["merchant", "customer"]
298
+ },
299
+ {
300
+ "when": { "all": [ { "field": "fund_arb_route_unfunded", "op": "truthy" }, { "field": "fund_topup_present", "op": "truthy" }, { "field": "fund_topup_amount", "op": "eq", "value": 0 } ] },
301
+ "level": "critical",
302
+ "title": "Post-settlement arbitration re-route from '${first_arb_exit_node}' with a ZERO compensation fund",
303
+ "description": "The plan gates an exit edge leaving '${first_arb_exit_node}' on an arbitration ruling, and its compensation_fund_add step deposits 0 — the fund exists but pays nothing. compensation_claim aborts with code 27 (E_COMPENSATION_NOT_MATCH) on any payout attempt, so the promised exit is still dead by construction.",
304
+ "mitigation": "Raise the compensation_fund_add balance to a real amount (>= the largest single-order exposure; the chain award ceiling is 3x the order amount), or remove the arbitration-gated exit edge.",
305
+ "stakeholders": ["merchant", "customer"]
306
+ }
307
+ ]
308
+ },
309
+ {
310
+ "rule_id": "ENTRY-ABANDON-01",
311
+ "dimension": "fund_flow",
312
+ "trigger": "The order-landing node — the target of the machine entry edge (prev_node \"\") — exits only through CLOSING time-window guards (logic_as_u256_lesser_or_equal[Clock, anchor], no opening leg, no unguarded alternative): once a window closes every forward aborts, nothing can advance the order, and the escrow taken at entry is locked by construction (gf26-tn-261026 GF2-30: a 7.65 WOW pledge entered by a second transaction with no abandon-refund edge; machines and guard tables freeze at publish, so the missing recovery edge cannot be added later). Dead-end entries (zero exits) belong to the dead-end scanner, not this rule.",
313
+ "cases": [
314
+ {
315
+ "when": { "field": "entry_no_open_exit", "op": "truthy" },
316
+ "level": "high",
317
+ "title": "Entry node '${entry_strand_node}' has no exit that opens after its window",
318
+ "description": "Every forward leaving '${entry_strand_node}' — the node orders land on at entry — is gated by a closing time window (Clock <= anchor) with no opening leg and no unguarded alternative. Once the window passes the guard aborts forever: the order can never advance, and the escrow collected at entry is locked with no abandon/refund path. This is the GF2-30 live loss shape (7.65 WOW); shipping it bakes the lockup in permanently.",
319
+ "mitigation": "Add a self-healing exit from '${entry_strand_node}' gated on an OPENING window (logic_as_u256_greater_or_equal[Clock, anchor] — the abandon/refund edge that fires when the claim window elapses) targeting a fund-bearing node, so the escrow always keeps an after-window path; or leave one exit unguarded / gated on an any-time condition.",
320
+ "stakeholders": ["merchant", "customer"]
321
+ },
322
+ {
323
+ "when": { "field": "window_strand_nodes", "op": "truthy" },
324
+ "level": "high",
325
+ "title": "Rest state(s) '${window_strand_nodes}' exit only through closing windows — the escrow strands once they elapse",
326
+ "description": "Every forward leaving '${window_strand_nodes}' is gated by a closing time window (Clock <= anchor) with no opening leg and no unguarded alternative. Those nodes are not entry nodes, but the escrow is still HELD while the order rests there — and a machine has no rail that can fire at an arbitrary node: once the last window closes nothing advances the order and no allocator row covers that state, so the money sits until the protocol changes. This is the live ctrx-mn-261108 C shape (O14/O15/O19, 1.10 WOW): a claim_window whose FileDispute/WithdrawClaim exits both aborted after the window, while the fund rails only covered completed / closed_cancel / return_closed / claim_withdrawn. Filing is deliberately unrestricted in time (arbitration.move order-anchored filing-window gate removed 2026-11-08), so a late filing can pin an otherwise settleable order — the fix must exist in the MACHINE, not in a filing clock.",
327
+ "mitigation": "Give every such rest state at least one exit that stays walkable after its windows close — an OPENING-window fallback (Clock >= anchor), an unguarded advance, or a node-free/any-time guard — and route it to a node covered by a fund rail (or make the cover rail accept this node explicitly). A state where money rests with no after-window exit is a publish-time defect, not an operator duty.",
328
+ "stakeholders": ["merchant", "customer"]
329
+ }
330
+ ]
331
+ },
332
+ {
333
+ "rule_id": "POST-ARB-SETTLE-01",
334
+ "dimension": "fund_flow",
335
+ "trigger": "A machine guard reads the arbitration ruling family (arb.indemnity / arb.order / arb.status / order.dispute) while no allocator row releases money on that ruling — none reads the family, none rides the ruling edge node-free, and the ruling edge's destination node is covered by no allocator in the FUND-EXIT-01 dual-shape semantics (pinned by an allocator guard, or node-free-covered by an unconstrained allocator guard mounted on one of its inbound edges — the canonical shape where the ruling re-routes the order into a node the plain refund allocator drains). Judged only on the $ref plane: plans whose allocator rows declare guards by key (guard_key — the template/migration emission) carry a rail plane invisible here and are left to the materialization freeze gate. arb.move rulings only write case state; the payout must exist as a plan rail, so with none the verdict changes state and the escrow never moves (gf26-tn-261026 GF2-31: a ruling that writes status but never releases the money).",
336
+ "cases": [
337
+ {
338
+ "when": { "field": "arb_promise_without_settle_rail", "op": "truthy" },
339
+ "level": "critical",
340
+ "title": "Arbitration promise at '${arb_promise_node}' with no ruling-gated settlement leg",
341
+ "description": "A guard on the forward out of '${arb_promise_node}' reads the arbitration ruling family, promising a ruling-driven outcome — but no allocator row releases money on that ruling: none reads the family, none rides the ruling edge, and the ruling edge's destination node has no allocator coverage (no pin, no node-free refund mount). When the verdict lands the machine changes state and the escrow stays put; the ruling moves nothing. Allocators freeze at publish, so the missing settlement leg cannot be added afterwards.",
342
+ "mitigation": "Add an allocator row that releases money on the ruling: either a guard reading the arbitration family (arb.order == the order, arb.indemnity some == true) with a payout sharing leg, or route the ruling edge into a node already drained by the refund/settlement rail (an allocator guard pins it, or a node-free allocator guard rides one of its inbound edges). Do not keep a state-only promise.",
343
+ "stakeholders": ["merchant", "customer"]
344
+ }
345
+ ]
346
+ },
347
+ {
348
+ "rule_id": "ARB-KEY-PLANE-01",
349
+ "dimension": "fund_flow",
350
+ "trigger": "The machine carries arbitration-promise guards (arb.indemnity / arb.order / arb.status / order.dispute) while the allocator rail plane carries guard_key declarations (the template/migration emission shape) — rails the $ref plane cannot verify, so a settle leg hiding in a keyed row is invisible here. The POST-ARB-SETTLE-01 verdict stays silent on this shape by ruling (2026-10-26); this rule is the publish-door red line instead: the materialization freeze gate refuses the publish until the keys resolve into structured guard steps whose settle-rail coverage is plan-verifiable.",
351
+ "cases": [
352
+ {
353
+ "when": { "field": "arb_key_plane_opaque", "op": "truthy" },
354
+ "level": "high",
355
+ "title": "Arbitration promise at '${arb_key_plane_node}' rides an opaque guard_key rail plane",
356
+ "description": "A guard on the forward out of '${arb_key_plane_node}' reads the arbitration ruling family, promising a ruling-driven outcome — but this plan's allocator rails are (at least partly) declared by key (guard_key), so the $ref plane cannot verify that any rail releases money on the ruling: a settle leg hiding in a keyed row is invisible to the audit. The state-only verdict risk of POST-ARB-SETTLE-01 cannot be ruled out here, and a failed settle rail would strand the escrow with the verdict unable to move money — with no way to add the settlement leg after publish. This is a publish-door red line — the freeze gate refuses this shape.",
357
+ "mitigation": "Resolve each guard_key rail into structured guard steps (guardResolutions with kind 'template' or 'inline') before publish, so the settle-rail coverage becomes plan-visible and POST-ARB-SETTLE-01 can judge it; or re-route the ruling edge into a node drained by a $ref-visible allocator row.",
358
+ "stakeholders": ["merchant", "customer"]
359
+ }
360
+ ]
361
+ },
362
+ {
363
+ "rule_id": "UNRESOLVED-GUARD-01",
364
+ "dimension": "composition",
365
+ "trigger": "A guard design requirement (pattern.* spec) is bound to a fund path or buy path but was never resolved into a structured guard — publishing now ships that path UNGUARDED.",
366
+ "cases": [
367
+ {
368
+ "when": { "field": "first_pending_fund_guard", "op": "present" },
369
+ "level": "critical",
370
+ "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}')",
371
+ "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.",
372
+ "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).",
373
+ "stakeholders": ["merchant", "customer"]
374
+ },
375
+ {
376
+ "when": { "field": "first_pending_buy_guard", "op": "present" },
377
+ "level": "medium",
378
+ "title": "${pending_buy_guard_count} unresolved buy-guard design(s), of ${pending_guard_total} pending in total (first: '${first_pending_buy_guard}')",
379
+ "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.",
380
+ "mitigation": "Resolve EACH listed buy-guard design into a structured guard, or accept an unscreened buy path deliberately.",
381
+ "stakeholders": ["merchant"]
382
+ }
383
+ ]
384
+ },
385
+ {
386
+ "rule_id": "PROMISE-ARB",
387
+ "dimension": "fund_flow",
388
+ "trigger": "The machine declares a return rail — that IS the refund promise — but the plan binds no Arbitration into the Service. After settlement the in-escrow refund track is dead topology, so the only on-chain remedy for a post-settlement return is an independent Arbitration ruling paid from the compensation fund (etsy-ln L-01: a live shop promised returns with no venue bound).",
389
+ "cases": [
390
+ {
391
+ "when": { "all": [ { "field": "has_return_rail", "op": "truthy" }, { "field": "has_arbitration_binding", "op": "falsy" } ] },
392
+ "level": "critical",
393
+ "title": "Return-promising shop wires no Arbitration venue",
394
+ "description": "The machine's return rail ('${return_rail_node}') is a promise the chain cannot keep alone: once the settlement allocator drains the escrow, a post-settlement return can only be paid by an independent Arbitration ruling against the compensation fund. This plan binds no venue, so the promise is DECLARED but UNENFORCEABLE — the declared-but-not-enforced class. Blocking: the machine and guard freeze at publish; do not hand-build the wiring outside the plan (hand-built replicas silently drop the arbitration/fund steps).",
395
+ "mitigation": "Keep the arbitration create + service arbitration-binding steps in the plan (standard emission for arbitration_mode third_party). A shop that deliberately settles every dispute off-chain must remove the return rail instead of the venue — an unbacked promise is the one configuration the protocol cannot repair post-publish.",
396
+ "stakeholders": ["merchant", "customer"]
397
+ }
398
+ ]
399
+ },
400
+ {
401
+ "rule_id": "PROMISE-TIME",
402
+ "dimension": "time_anchor",
403
+ "trigger": "The listing prose (service description / sales item text) promises a review/acceptance/cancel/refund/return/claim WINDOW that no guard-table duration in the plan enforces (upwk-mn-261017 F-55: the WIP listing promised window durations no guard carried). Both sides freeze at publish — guards are immutable and the prose ships as-is — so a mismatched promise is the declared-but-not-enforced class and is unrepairable post-publish. Shipping/delivery SLAs are deliberately OUT of scope: they are off-chain fulfillment promises no time guard is expected to enforce.",
404
+ "cases": [
405
+ {
406
+ "when": { "field": "first_prose_time_mismatch", "op": "present" },
407
+ "level": "critical",
408
+ "title": "Listing promises '${first_prose_time_mismatch}' but no guard enforces it",
409
+ "description": "Window promises found in the listing prose: ${prose_window_promise_count}; mismatched: ${prose_time_mismatch_display}. Windows the plan's guards actually enforce: ${enforced_window_ms_display}. The unenforced promise is a buyer-side remedy that dies on contact with the chain: the buyer relies on it, no guard carries it, and both the guard tables and the machine freeze at publish. Blocking.",
410
+ "mitigation": "Align the two sides BEFORE publish: reword the listing to match an enforced window, or add/retime a window guard (pattern.deadline_window for act-until windows, pattern.time_lock_progress for act-after windows) so a guard constant carries exactly the promised duration (fee-param-derived, e.g. review_window_days / escrow_release_days).",
411
+ "stakeholders": ["merchant", "customer"]
412
+ },
413
+ {
414
+ "when": { "field": "first_unanchored_window_promise", "op": "present" },
415
+ "level": "medium",
416
+ "title": "Window-restart promise ('${first_unanchored_window_promise}') needs an entry-anchored guard",
417
+ "description": "${unanchored_window_promise_count} restart/renew-style window promise(s) in the prose. A window can only restart when its guard anchors on the progress.history.time (id 1280) ENTRY timestamp of the re-open event (next_node form) — a fresh entry appends and the window re-measures. A one-shot anchor (order.time, or the current_time that is rewritten at every migration) never restarts, so the promise would be false the first time the triggering event repeats. Disclosure: confirm the anchor form before publish.",
418
+ "mitigation": "Anchor the window guard on progress.history.time (id 1280, next_node='<the restarting event>', find=last) so each re-entry resets the window, or reword the prose. See the time_anchors table of the archetype in use for the canonical anchor wording.",
419
+ "stakeholders": ["merchant", "customer"]
420
+ }
421
+ ]
422
+ },
423
+ {
424
+ "rule_id": "PLAN-K2",
425
+ "dimension": "fund_flow",
426
+ "trigger": "Compensation-fund sizing guidance (KL-K2 family, re-scoped by b6-11, demoted to warning by sign-off 5 — dm-mtw-261027): 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 WARNED at buy time (each order is checked against 3x ITS OWN amount; the order still proceeds); the plan layer advises sizing on the typical single order instead of the priciest SKU — no cross-SKU subsidy.",
427
+ "cases": [
428
+ {
429
+ "when": { "field": "fund_ceiling_breach", "op": "truthy" },
430
+ "level": "medium",
431
+ "title": "Compensation fund tops up below the award ceiling (${fund_ceiling_basis})",
432
+ "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 proceed with a buy-time warning (the per-order gate was demoted to a warning by sign-off 5 — dm-mtw-261027), so a buyer CAN enter a knowingly under-covered order — quote-time disclosure (max_coverable_order) is the buyer's protection. Concurrency headroom: this pool can pay ${fund_concurrent_orders_coverable} simultaneous ceiling-sized claim(s) — concurrent claims beyond that abort until a manual top-up.",
433
+ "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.",
434
+ "stakeholders": ["merchant", "customer"]
435
+ },
436
+ {
437
+ "when": { "field": "fund_ceiling_unverifiable", "op": "truthy" },
438
+ "level": "medium",
439
+ "title": "Compensation-fund adequacy cannot be judged from the plan",
440
+ "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.",
441
+ "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.",
442
+ "stakeholders": ["merchant"]
443
+ }
444
+ ]
445
+ },
446
+ {
447
+ "rule_id": "PLAN-REWARD-SCALE-01",
448
+ "dimension": "economics",
449
+ "trigger": "Review-bounty scale (T-02, bsn7-tn-261026): a per-claim bounty larger than the margin of the order that earns it makes the reputation rail a bounty-farm target — buyers (or sybil accounts) manufacture cheap orders, claim the bounty, and drain the pool; the shop pays out more per claim than the sale earns. The former template default (1000000000) was 50x a 0.02-WOW SKU and passed every audit silently. Compile now DERIVES the bounty (2% of the cheapest positive SKU, floored at 1 smallest unit); this rule judges explicit overrides and custom plans. Disclosure, not a blocker: a deliberate loss-leader bounty is a legal promotion.",
450
+ "cases": [
451
+ {
452
+ "when": { "field": "reward_scale_breach", "op": "truthy" },
453
+ "level": "medium",
454
+ "title": "Review bounty is ${reward_scale_ratio_display} — each claimed order pays out more than the sale earns",
455
+ "description": "The plan mounts a per-claim bounty of ${reward_bounty_amount} (smallest units) against a cheapest SKU of ${lowest_sku_price}: every claim consumes more pool than the order brought in, and the funded pool pays ~${reward_max_claims} such claim(s) before running dry. That is the exact bounty-farm shape (T-02): cheap orders in, bounty out, pool drained.",
456
+ "mitigation": "Lower the reward_claim_amount input, or raise the cheapest SKU price — the compile default (2% of the cheapest positive SKU) is the sanctioned starting point; keep explicit overrides under half the cheapest SKU price unless the over-size is a deliberate, disclosed promotion.",
457
+ "stakeholders": ["merchant"]
458
+ },
459
+ {
460
+ "when": { "field": "reward_scale_unverifiable", "op": "truthy" },
461
+ "level": "medium",
462
+ "title": "Review-bounty scale cannot be judged from the plan",
463
+ "description": "The plan mounts a per-claim bounty of ${reward_bounty_amount}, but the sales catalog carries no parseable price here (display forms need token decimals the plan layer does not have), so the bounty-to-price ratio is DEFERRED, not skipped — stated explicitly rather than passed silently (the audit-silent gap T-02 closes).",
464
+ "mitigation": "Provide numeric smallest-unit sales prices so the plan layer can judge the ratio; the quote face discloses the live bounty-to-cheapest-SKU ratio at basket time regardless.",
465
+ "stakeholders": ["merchant"]
466
+ }
467
+ ]
468
+ },
469
+ {
470
+ "rule_id": "TIME-ANCHOR-01",
471
+ "dimension": "time_anchor",
472
+ "trigger": "A window guard anchors on a path-dependent time query (progress.current_time refreshes on every node entry) while the gated node is reachable by more than one path — detour nodes shift the settlement base (E-10: a buyer leaving a review postponed merchant settlement by the review window).",
473
+ "cases": [
474
+ {
475
+ "when": { "all": [ { "field": "first_path_dependent_anchor", "op": "present" }, { "field": "path_sensitive", "op": "truthy" } ] },
476
+ "level": "high",
477
+ "title": "Window guard '${first_path_dependent_anchor}' anchors on a path-dependent time",
478
+ "description": "progress.current_time is the time of ENTERING the current node, not of any business event. The gated node has multiple inbound paths, so an optional detour (e.g. a review node) silently extends the window. This is an exploitable merchant-side funds-lockup.",
479
+ "mitigation": "Anchor the window on order.time (path-independent), or restructure the machine so the anchored node has exactly one inbound path.",
480
+ "stakeholders": ["merchant", "customer"]
481
+ },
482
+ {
483
+ "when": { "field": "first_path_dependent_anchor", "op": "present" },
484
+ "level": "medium",
485
+ "title": "Window guard '${first_path_dependent_anchor}' uses a path-dependent time anchor",
486
+ "description": "The anchor is currently unambiguous (single-path), but any later template edit adding a bypass node silently shifts the window base.",
487
+ "mitigation": "Prefer order.time for settlement/refund windows.",
488
+ "stakeholders": ["merchant"]
489
+ }
490
+ ]
491
+ },
492
+ {
493
+ "rule_id": "WRITE-ONLY-01",
494
+ "dimension": "field_capability",
495
+ "trigger": "Plan sets a write-only field (only the native Guard engine ever reads it) with no guard query covering it — the enforcement the merchant believes in does not exist (A-1: customer_required was collected but never enforced on the buy path).",
496
+ "cases": [
497
+ {
498
+ "when": { "field": "first_write_only_unenforced_field", "op": "present" },
499
+ "level": "critical",
500
+ "title": "Field '${first_write_only_unenforced_field}' is set but never enforced",
501
+ "description": "Write-only fields are read ONLY by guard queries. Setting '${first_write_only_unenforced_field}' without a covering guard query creates the illusion of enforcement: the buy path will not check it.",
502
+ "mitigation": "Add a guard whose table queries the field (see chain-semantics WRITE_ONLY_QUERY_PREFIXES), bound to the enforcing forward or buy path — or remove the field.",
503
+ "stakeholders": ["merchant", "customer"]
504
+ }
505
+ ]
506
+ },
507
+ {
508
+ "rule_id": "WRITE-ONCE-REMOVABLE",
509
+ "dimension": "field_capability",
510
+ "trigger": "A plan declares a write_once policy (a non-repudiable on-chain attestation) and a later configure step dissolves it: policies op:'set' that omits the policy, op:'remove'/'clear' that touches it, or a same-name op:'add' without write_once:true (W8-5, N-10).",
511
+ "cases": [
512
+ {
513
+ "when": { "field": "first_write_once_removable", "op": "present" },
514
+ "level": "high",
515
+ "title": "Write-once attestation dissolved: ${first_write_once_removable}",
516
+ "description": "Row-level deletion under a write_once policy is chain-refused since P155-14③ (repository data_remove aborts E_POLICY_WRITE_ONCE_CONFLICT under enable_repo_write_once_remove_guard, the v140 rider flag) — but the write_once BIT lives in a mutable PolicyRule. ${first_write_once_removable} replaces, removes, or downgrades the POLICY itself, so whoever holds the policy-management permission (index 102) can rewrite the attestation and, via re-add, delete the very rows it promised to keep. op:'set' REPLACES THE WHOLE policy list, and once the Permission is locked a dropped policy cannot be restored.",
517
+ "mitigation": "Maintain repository policies with op:'add' appends only; never ship a configure step whose op:'set'/'remove'/'clear' — or a same-name op:'add' lacking write_once:true — touches a write_once policy declared earlier in the plan.",
518
+ "stakeholders": ["merchant", "customer"]
519
+ }
520
+ ]
521
+ },
522
+ {
523
+ "rule_id": "TASKBIND-01",
524
+ "dimension": "fund_flow",
525
+ "trigger": "A guard bound on a machine forward declares no {identifier: 254, b_submission: true} row — progress::assert_task_binding aborts code 11 on every guarded forward of an order-driven Progress, and Guard tables are frozen at creation (N-K20, booking-85981 + amz-7f3a2c91).",
526
+ "cases": [
527
+ {
528
+ "when": { "field": "first_edge_guard_missing_254", "op": "present" },
529
+ "level": "critical",
530
+ "title": "Forward guard '${first_edge_guard_missing_254}' lacks the protocol task-binding slot (254)",
531
+ "description": "Every guarded forward of a machine running on an order Progress requires the passport to carry a slot-254 (task binding) submission; the guard table declares none, so the forward aborts with code 11 on first traversal. Guard tables and machines freeze at publish — shipping now strands the path permanently, and no builder can patch the table afterwards.",
532
+ "mitigation": "Declare {identifier: 254, b_submission: true, value_type: 'Address'} in guard '${first_edge_guard_missing_254}' (protocol slot 254; the order address is written by order creation). The compile kernel auto-injects this row when the guard is edge-bound — a finding here means the guard is bound in a way the kernel could not see.",
533
+ "stakeholders": ["merchant", "customer"]
534
+ }
535
+ ]
536
+ },
537
+ {
538
+ "rule_id": "TASKBIND-02",
539
+ "dimension": "fund_flow",
540
+ "trigger": "An allocator {GuardIdentifier:N} leg names a slot the guard table never declares as a b_submission Address — allocation aborts before paying (N-K21, amz-7f3a2c91). A properly DECLARED slot is fine: on an order-anchored allocation the submission equals payment_info.for_object (the paying Order), which is the deliberate two-step refund shape (the CoinWrapper lands on the Order and order::owner_receive extracts it to order.owner).",
541
+ "cases": [
542
+ {
543
+ "when": { "field": "first_alloc_slot_missing", "op": "present" },
544
+ "level": "critical",
545
+ "title": "Allocator leg ${first_alloc_slot_missing} is undeclared",
546
+ "description": "The allocator row pays a recipient keyed by this guard slot, but the guard table has no b_submission Address declaration for it. At allocation time the passport lacks the slot, the assert fails, and the distribution aborts — escrowed funds stay stranded because the guard froze at publish and cannot gain the declaration later. A static Address slot in the same position passes the declaration window but fails the same assertion (N-11). The fix is to declare the slot, not to abandon the leg: a declared slot on an order-anchored allocation is payable and is how order refunds work.",
547
+ "mitigation": "Declare {identifier: N, b_submission: true, value_type: 'Address'} in the bound guard's table so the passport can carry the submitted address. For an order refund leg, identifier 0 carries the paying Order address; the guard should pin that submission to the context (order.owner or an agent may trigger) and the payout is extracted by order::owner_receive.",
548
+ "stakeholders": ["merchant", "customer"]
549
+ }
550
+ ]
551
+ },
552
+ {
553
+ "rule_id": "EDGE-ROSTER-NULL-PERM-01",
554
+ "dimension": "fund_flow",
555
+ "trigger": "A forward on a MONEY machine edge (destination is a final/cancelled-role node or an allocator-covered one) declares a NON-EMPTY namedOperator roster with NO permissionIndex. Verified kernel truth (ddmc4 B-24, progress.move:266-310): the permission pre-check computes permissionNeeded=false for that shape and skips the Permission assert entirely — the roster is pure decoration (the namedOperator rail only AUTHORIZES roster members and never DENIES non-members), so ANYONE with a valid order passport can push the fund/terminal forward. ddmc4 live: an outside account triggered ReturnReceived and CompensateBadItem through exactly this shape.",
556
+ "cases": [
557
+ {
558
+ "when": { "field": "first_roster_null_perm_edge", "op": "present" },
559
+ "level": "critical",
560
+ "title": "Money edge '${first_roster_null_perm_edge}' rides a decoration-only roster rail — anyone can push the fund forward",
561
+ "description": "The forward on ${first_roster_null_perm_edge} names a roster but binds no permission index. On chain the permission pre-check needs a permissionIndex to DENY: with none bound, permissionNeeded reads false, the assert is skipped, and the named-operator roster never excludes anyone (it only authorizes members — verified progress.move:266-310, ddmc4 B-24: an outsider executed ReturnReceived/CompensateBadItem). A roster rail alone on a fund/terminal edge is a world-executable payout.",
562
+ "mitigation": "Bind ONE denying rail on this forward: a permission_index (>= 1000; the namedOperator rail is checked first, so pick ONE rail per forward — compile rejects both), or keep the roster rail and mount the kernel roster predicate query(1575 order.named_operator member) on the edge's guard so membership actually EXCLUDES non-members (1575 is gated by the v138 flag enable_order_named_operator_member — check upgrade_check (DEPLOY-K1); on old binaries it reads false, so also tighten the rail).",
563
+ "stakeholders": ["merchant", "customer"]
564
+ }
565
+ ]
566
+ },
567
+ {
568
+ "rule_id": "PERM-COARSE-BUCKET-01",
569
+ "dimension": "fund_flow",
570
+ "trigger": "One permission index is bound on >= 2 money edges (final/cancelled or allocator-covered destinations) whose rail classes DIFFER — settle vs recover|award vs refund|return vs arb, classified by destination node name, forward names, and the edge guards' queries (ddmc4 B-25: 9 heterogeneous fund edges shared bucket 1002, so the arbiter entity could execute the merchant's settle AND refund rails — the coarse bucket turns one compromised permission entity into every fund action at once). A shared bucket inside ONE class is a capacity choice, not a widening.",
571
+ "cases": [
572
+ {
573
+ "when": { "field": "coarse_perm_bucket_index", "op": "present" },
574
+ "level": "medium",
575
+ "title": "Permission index ${coarse_perm_bucket_index} spans rail classes [${coarse_perm_bucket_classes}] — one coarse bucket plays every fund rail",
576
+ "description": "Money edges of DIFFERENT rail classes (${coarse_perm_bucket_classes}) all bind permission index ${coarse_perm_bucket_index}, so the entity holding that one slot can execute every heterogeneous fund action (ddmc4 B-25: the arbiter bucket rode the merchant's settle and refund edges alike). Compromise or misuse of that single permission entity is no longer contained to one rail class.",
577
+ "mitigation": "Split the bucket per rail class: give settle, recover/award, refund/return and arbitration-facing edges DISTINCT permission indexes held by disjoint entities (least privilege — the arbiter should hold only the arb-class slot). If one entity legitimately must span classes, document the shared custody in the build notes so the scan disclosure is a conscious choice.",
578
+ "stakeholders": ["merchant", "customer"]
579
+ }
580
+ ]
581
+ },
582
+ {
583
+ "rule_id": "WRITE-GUARD-TAUTOLOGY-01",
584
+ "dimension": "field_capability",
585
+ "trigger": "A repository policy's write_guard whose only Signer legs are TAUTOLOGIES — Signer == a self-reported (b_submission) address the caller fills with their own, or Signer != the Entity system object 0xaab that no human wallet equals — while the policy routes rows caller-keyed (id_from none/unset, the row key also caller-supplied). Identity chosen at WRITE time is not identity: anyone may write a row under ANY order key, and before write_once anyone may OVERWRITE anyone's (pdd F-18 live: arbitrary order evidence rewritten by an outsider; h1w9 F-03 live: an outsider pre-wrote the report row and front-ran the real hunter's bounty). Guards freeze at publish (IMMUT-001).",
586
+ "cases": [
587
+ {
588
+ "when": { "field": "first_tautology_write_guard", "op": "present" },
589
+ "level": "critical",
590
+ "title": "Write guard ${first_tautology_write_guard} admits EVERYONE — the policy is world-writable",
591
+ "description": "${first_tautology_write_guard} compiles legs that prove nothing: a caller always 'equals' the writer address they themselves submitted, and no wallet equals the 0xaab system object. Combined with caller-keyed rows (id_from none), any address can author — and, absent write_once, rewrite — rows under any key, so evidence, reports and receipts carry zero attribution weight (pdd F-18: an outsider overwrote a live order's evidence). A defence that authorizes everyone is worse than none: downstream readers treat the row as verified.",
592
+ "mitigation": "Bind the writer set to values FIXED before publish: swap the guard to tpl_repository_write_allowlist (Signer ∈ a VecAddress allowlist frozen at publish) or tpl_repository_write_order_holder (order-keyed rows: Signer must hold the row's own Order), and arm policy write_once on final evidence so even an allowlisted writer cannot rewrite history (one evidence KIND per policy — pdd F-04: two kinds on one order-keyed policy share the row id and overwrite each other). Chain residual registered for protocol review: writer ∈ permission-entity membership as a native write-guard primitive (staff rotation today needs a guard rebuild).",
593
+ "stakeholders": ["merchant", "customer"]
594
+ }
595
+ ]
596
+ },
597
+ {
598
+ "rule_id": "WRITE-GUARD-TAUTOLOGY-KEYED-01",
599
+ "dimension": "field_capability",
600
+ "trigger": "Same tautology shape (only self-reported / system-constant Signer legs) on a WALLET-keyed policy (id_from signer/clock): each wallet can write only its own row, so the blast radius is smaller than the caller-keyed critical, but the written CONTENT is still unverified self-assertion — the guard validates nothing beyond 'the writer is who their wallet says' (no institutional sign-off, no order binding).",
601
+ "cases": [
602
+ {
603
+ "when": { "field": "first_keyed_tautology_write_guard", "op": "present" },
604
+ "level": "medium",
605
+ "title": "Write guard ${first_keyed_tautology_write_guard} verifies only the wallet, never the claim",
606
+ "description": "${first_keyed_tautology_write_guard} constrains WHERE a row lands (the writer's own wallet key) but not WHO may assert it or WHAT it may say: any wallet authors self-serving rows about itself under a guard that reads as a credential check. Consumers of the row get no verification signal — the policy name suggests an institutional gate the legs never encode.",
607
+ "mitigation": "If the rows represent an institution's attestation, pin the INSTITUTION's signer: tpl_repository_write_allowlist with the institution addresses (or the pinned single-signer twin tpl_identity_check_single) so only the attesting writer can author rows under this policy. If self-asserted rows are the intent, say so in the policy description — never borrow credential vocabulary for an unverified rail.",
608
+ "stakeholders": ["merchant", "customer"]
609
+ }
610
+ ]
611
+ },
612
+ {
613
+ "rule_id": "WRITE-GUARD-PROMISE-GAP-01",
614
+ "dimension": "privacy",
615
+ "trigger": "A TAUTOLOGY write guard whose policy description PROMISES an authorization bound the compiled legs never encode — authorization vocabulary ('only ... signed', 'must bind the writer', 'allowlist', 'restricted to ...') over a guard whose Signer legs admit everyone. The description-vs-legs divergence is the trust failure itself (h1w9 F-03: the catalog prose said hunter-bound while the root verified nothing, so an outsider's pre-written report row outranked the real hunter's). Judged ONLY on tautology guards — a guard with one binding leg is never flagged, so pinned rails get zero false positives. A description that DISCLOSES its own tautology shape ('these legs are a TAUTOLOGY', 'the self-report shape') is exempt: prose stating the ACTUAL guarantee does not diverge from the legs — only divergence is the failure.",
616
+ "cases": [
617
+ {
618
+ "when": { "field": "first_promise_gap_write_guard", "op": "present" },
619
+ "level": "critical",
620
+ "title": "Policy description promises a bound writer, the guard encodes none: ${first_promise_gap_write_guard}",
621
+ "description": "${first_promise_gap_write_guard}: the policy text promises authorization vocabulary while the compiled guard legs admit every caller — the documented trust model and the enforced one diverge. Anything built on the prose (buyer due diligence, dispute framing, downstream automation) inherits a guarantee the chain does not deliver. Fix the LEGS or fix the PROSE — shipping both as-is is the exact failure h1w9 F-03 recorded.",
622
+ "mitigation": "Encode the promised bound for real: swap to tpl_repository_write_allowlist (Signer ∈ a publish-time allowlist vector) or tpl_repository_write_order_holder (order-keyed rows) and pair with policy write_once on final evidence. If the bound is genuinely not expressible today, rewrite the description to state the ACTUAL guarantee (who writes, what stays unverified) — never keep authorization vocabulary over an open guard. Three residual asks are registered for protocol review: writer ∈ permission-entity membership as a native write-guard primitive, composite row keys (order + kind), and data_remove refusing write_once rows with an event (repository.move:178-183 checks neither today).",
623
+ "stakeholders": ["merchant", "customer"]
624
+ }
625
+ ]
626
+ },
627
+ {
628
+ "rule_id": "NODE-MATCH-01",
629
+ "dimension": "fund_flow",
630
+ "trigger": "A guard bound on a machine forward also asserts progress.current == L where L is not that edge's prev node — the machine pins current == prev on every traversal, so the literal is unsatisfiable and the edge (with any money rail behind it) is permanently unreachable after publish (machines and guard tables freeze; ksc-tn-261024 F-02 live: a receiver-return edge pinned to 'return_requested' instead of 'return_shipped' stranded 0.45 WOW). Multi-node OR sets pass as long as prev is a member; entry edges and guards without a progress.current literal are exempt.",
631
+ "cases": [
632
+ {
633
+ "when": { "field": "first_node_mismatched_guard", "op": "present" },
634
+ "level": "critical",
635
+ "title": "Guard ${first_node_mismatched_guard} can never pass",
636
+ "description": "The guard re-checks progress.current against a node the machine has already ruled out on this edge. On chain the guard predicate is permanently false, so the forward aborts guard_rejected forever and any allocator/exit rail keyed to the destination node strands its escrow. Guards and machines freeze at publish — shipping now bakes the deadlock in.",
637
+ "mitigation": "Remove the progress.current literal from the guard (the machine's prev_node already enforces the source node — double-pinning only creates this class of deadlock), or correct the literal to the edge's actual prev node. One guard instance per edge; never reuse a guard across edges with different source nodes.",
638
+ "stakeholders": ["merchant", "customer"]
639
+ }
640
+ ]
641
+ },
642
+ {
643
+ "rule_id": "HOST-GRAPH-01",
644
+ "dimension": "composition",
645
+ "trigger": "A guard exists but is bound to no host, or a guard queries repository data while the plan has no repository — the TRAILHAVEN B-2 failure: the Repository object and the third guard were silently dropped, leaving the shipping-evidence gate with nothing to check.",
646
+ "cases": [
647
+ {
648
+ "when": { "field": "first_repo_query_without_repository", "op": "present" },
649
+ "level": "critical",
650
+ "title": "Guard '${first_repo_query_without_repository}' queries a repository the plan never creates",
651
+ "description": "The guard reads repository.* data, but no repository step exists in the plan. On chain the query aborts on missing data — the forward it gates can never pass.",
652
+ "mitigation": "Add the repository create step and bind the guard to it, or remove the repository queries.",
653
+ "stakeholders": ["merchant"]
654
+ },
655
+ {
656
+ "when": { "field": "first_orphan_guard", "op": "present" },
657
+ "level": "high",
658
+ "title": "Guard '${first_orphan_guard}' is bound to no host",
659
+ "description": "The guard is created but never referenced by any machine forward, service buy_guard, allocator row, repository policy, arbitration, or reward. It is dead weight — usually a sign that a host binding was silently dropped during composition.",
660
+ "mitigation": "Wire the guard into its intended host binding, or delete the step.",
661
+ "stakeholders": ["merchant"]
662
+ }
663
+ ]
664
+ },
665
+ {
666
+ "rule_id": "REPO-GATE-KEY-01",
667
+ "dimension": "composition",
668
+ "trigger": "A guard's composite where-query scans a PLAN-LOCAL repository under a static policy key that no repository policy declares (ZR-32, ziroom-mn-261013: the review gate queried a key the write side never wrote — the count stayed 0 forever and the benefit was unreachable; note policies are NOT chain-frozen: permission 102 (policy_add/policy_set) can add or replace them in place post-publish, so the divergence is repairable by adding the missing policy — but the plan must not ship it). Runtime key rows and external repository addresses are unknowable at plan time and are judged by the chain-side round-trip (analyze_guard_semantics compare_with) instead.",
669
+ "cases": [
670
+ {
671
+ "when": { "field": "repo_gate_key_unbacked_count", "op": "gt", "value": 0 },
672
+ "level": "high",
673
+ "title": "Repository gate key ${first_repo_gate_key_unbacked} is written by no policy",
674
+ "description": "Unbacked scans: ${repo_gate_key_unbacked_display}. The plan declares these repository policies: ${repo_policy_keys_display}. A where-scan over an undeclared key reads an empty table as built — count/sum stay 0 and find/keys return empty — so the gated path can never pass. Repository policies are NOT chain-frozen (permission 102 can add/replace them in place post-publish; already-written rows stay bound by write_once/write_guard), so the divergence is repaired by ADDING the missing policy via permission 102 or by aligning names before publish — not by rebuilding the repository. Guards DO freeze at creation: a guard-side key literal cannot self-heal.",
675
+ "mitigation": "Reconcile the two sides before publish: change the guard's static key row to a declared policy name (${repo_policy_keys_display}), or rename the repository policy to the queried key. After fixing, re-verify the resolved guard with analyze_guard_semantics compare_with after creation.",
676
+ "stakeholders": ["merchant", "customer"]
677
+ }
678
+ ]
679
+ },
680
+ {
681
+ "rule_id": "R-QUERY-TOTALITY",
682
+ "dimension": "composition",
683
+ "trigger": "A guard compares the per-item listing query (order.item.wip_hash) against a STATIC String constant that is NOT a case-exact sale name in the plan's sales catalog (kl F-ORDER-02: the delivery guard burned 'Adult Ticket' while the order bought '2-Day Ticket'). At delivery the native resolves the constant with find_sale_item; a miss returns None -> Err, the error bubbles through passport::verify_guard as a MovePrimitiveRuntimeError, and the order WEDGES on its current node — no completion, no refund, no structured abort code. Guards freeze at creation, so this is the last point the mismatch can be caught; repository-key totality is REPO-GATE-KEY-01's face, this rule owns the query-arg totality face. service.sale.wip_hash resolves against the WIP LISTING namespace (not the sales catalog) and stays out of scope.",
684
+ "cases": [
685
+ {
686
+ "when": { "field": "wip_query_totality_count", "op": "gt", "value": 0 },
687
+ "level": "critical",
688
+ "title": "wip-hash comparison constant '${first_wip_query_totality}' is not a sale name — the order will wedge at delivery",
689
+ "description": "Unprovable comparisons: ${wip_query_totality_display}. The plan's sales catalog: ${wip_query_totality_sku_display}. A wip-hash guard comparison burns its String operand at guard creation; find_sale_item over a non-SKU name returns None and the native's Err surfaces as a primitive error inside verify_guard — the delivery forward cannot advance and the order cannot refund (kl F-ORDER-02, wedged until a kernel upgrade). Only constants that ARE sale names are provably total.",
690
+ "mitigation": "Fix the burned constant to a case-exact sale name from the catalog (${wip_query_totality_sku_display}) BEFORE the guard is created — or re-point the comparison leg at a dynamic operand (the submitted SKU name / the order's own field) if the gate must accept any bought SKU. Guards are immutable once created: never publish first and patch later.",
691
+ "stakeholders": ["merchant", "customer"]
692
+ }
693
+ ]
694
+ },
695
+ {
696
+ "rule_id": "REPO-AGG-SUBMITTED-01",
697
+ "dimension": "composition",
698
+ "trigger": "A guard's sum-where aggregate (query_repository_data_sum_where*) reads its ledger through a SUBMITTED table cell (b_submission:true). The cell is filled by whoever ADVANCES the guarded forward — so the ledger IDENTITY is a per-forward caller choice. An honest keeper submitting the wrong repository (e.g. the review ledger instead of the campaign ledger) reads sum=0 and permanently flips the decision — the release polarity aborts code 7 while the refund polarity passes on the same state; a hostile submission aims the gate at a forged ledger. Guards are IMMUTABLE once created, so nothing can repair a mis-pointed aggregate after publish (W6-03, upynjab P0-1). The catalog's threshold twins are pinned since the W6-03 fix (b_submission:false + a resolved value); this rule closes the same class for INLINE and hand-built guards at the machine-publish face.",
699
+ "cases": [
700
+ {
701
+ "when": { "field": "repo_agg_submitted_count", "op": "gt", "value": 0 },
702
+ "level": "high",
703
+ "title": "Aggregate gate '${first_repo_agg_submitted}' lets the advancing caller swap the ledger",
704
+ "description": "Submitted aggregate slots: ${repo_agg_submitted_display}. A sum-where aggregate is a CAMPAIGN-WIDE CONSTANT decision basis — the ledger it sums must never be chosen per-forward. With a submitted cell, the same on-chain state can read as goal-met (release) or goal-missed (refund) depending on which repository the caller submits — a decision flip that is UNREPAIRABLE after the guard is created (guards freeze at creation; the escrow only settles one way).",
705
+ "mitigation": "Pin the aggregate's object cell at guard creation: b_submission:false with a resolved value — the plan's own ledger ({$ref}/{$late} object, or a '$'-seeded name like ${repository_name}) or an explicit external address if the ledger is genuinely foreign. After fixing, re-verify with analyze_guard_semantics compare_with after creation.",
706
+ "stakeholders": ["merchant", "customer"]
707
+ }
708
+ ]
709
+ },
710
+ {
711
+ "rule_id": "INV-ALLOC-OVERLAP-PAYEE",
712
+ "dimension": "composition",
713
+ "trigger": "Two allocator rows whose accepted-node sets INTERSECT pay DIFFERENT recipient sets. Scope discipline: node-set overlap across rails is itself the SANCTIONED shape (C-F01 ruling 2026-11-04 rejected the node-disjoint proposal; recover∈settle terminal sharing is the decision-11 doctrine — recover is an order-terminal liquidation). The money hazard is narrower: when the SAME order state can drive two rails with different payees, whichever forward advances first chooses where the escrow goes, and the losing rail still holds a live claim — a race that materializes only at runtime, i.e. AFTER the guards are immutable (W6-06, §0.26 user ruling ③). ADVISORY, not a blocker, by the catalog-clean rule (K3 discipline 8): the supply-chain composition family EMITS exactly this shape by design (a second settlement rail beside the shop's own; the emission note documents the firing-order discipline — advance the composition gate only after the fulfilment fact is true), so blocking it would refuse a supported feature; the audit DISCLOSES the race and the discipline instead. Rows with an unresolved guard design or an unresolvable payee vector are out of scope here (pending_allocator_guard_count and the S4 third-party-leg rule own those faces).",
714
+ "cases": [
715
+ {
716
+ "when": { "field": "alloc_overlap_payee_count", "op": "gt", "value": 0 },
717
+ "level": "medium",
718
+ "title": "Intersecting allocator rails '${first_alloc_overlap_payee}' — firing order decides the payee",
719
+ "description": "Conflicting pairs: ${alloc_overlap_payee_display}. Two rails fire on the same order state but pay different recipients — settlement order becomes a race: the first advancing forward drains the escrow to ITS payee while the other rail's claim stays live. Unrepairable after publish (guards and allocator configuration are immutable). NOTE: if one rail is a supply-chain composition rail, this is the documented shape — the discipline is FIRING ORDER (advance the fulfilment gate before the shop's own settlement; the emission notes carry it), and this advisory is your pre-publish reminder that the discipline is now load-bearing.",
720
+ "mitigation": "Either converge the payees (identical GuardIdentifier slots — payment_info binds slot N to one address, so slot equality is address equality — or the same Entity addresses), narrow one rail's accepted-node set so the shared state drives exactly one rail, partition the rails by rate (each row declares its share instead of competing for the whole), or — for the sanctioned supply-chain shape — adopt and document the firing-order discipline operationally. After fixing, re-verify with analyze_guard_semantics compare_with after creation.",
721
+ "stakeholders": ["merchant", "customer"]
722
+ }
723
+ ]
724
+ },
725
+ {
726
+ "rule_id": "REPO-WRITE-ONCE-01",
727
+ "dimension": "composition",
728
+ "trigger": "A repository WRITE guard (bound via a repository policy write_guard ref) negates a 'repository.data has' probe in its root — the RETRACTED write-once idiom (bk15 K3b; ofn-mn-261012 F-02, mainnet A/B verified). The write guard is verified inside the same PTB as the write, BEFORE the row exists, so the negated probe evaluates against the pre-write state and always fails the write. The chain now has a native per-policy write-once (PolicyRule write_once, K3(a)): the WRITE PATH itself rejects overwriting an existing record — but it is declared on the policy, never expressible as a guard leg.",
729
+ "cases": [
730
+ {
731
+ "when": { "field": "first_repo_write_once_guard", "op": "present" },
732
+ "level": "high",
733
+ "title": "Repository write guard '${first_repo_write_once_guard}' carries an INEFFECTIVE write-once leg",
734
+ "description": "${repo_write_once_guard_count} write-bound guard(s) negate a 'repository.data has' probe. The leg can never do what it claims: at verification time the row does not exist yet (same-PTB pre-write evaluation), so the negation always aborts the write with E_VERIFY_FAILED — the evidence row it gates can never be written. Mainnet A/B: the identical guard minus the leg succeeded, and the author then overwrote their own review. A defence that cannot be enforced is worse than none.",
735
+ "mitigation": "Remove the negated has-leg from the write guard and declare write-once on the policy instead (policy write_once: true — the write path rejects overwriting an existing record with E_POLICY_WRITE_ONCE_CONFLICT). For order-bound rails use the task-binding slot (254) plus the order anchor instead; for one-write-per-guard-pool semantics use the ONCE slot (255, b_submission=true) — per guard-pool, not per order. Do NOT re-teach the negated probe: it is a guaranteed runtime abort on the write path.",
736
+ "stakeholders": ["merchant", "customer"]
737
+ }
738
+ ]
739
+ },
740
+ {
741
+ "rule_id": "BUY-INFO-UNENFORCED-01",
742
+ "dimension": "composition",
743
+ "trigger": "A service declares customer_required but mounts no buy_guard (bk15 K11). The buy family on-chain never reads customer_required — the field alone enforces nothing at buy time. The chain has a buy-time enforcement primitive: buy_guard is evaluated inside the passport buy path, and non-passport buys reject outright when one is mounted.",
744
+ "cases": [
745
+ {
746
+ "when": { "field": "first_customer_required_unbacked", "op": "present" },
747
+ "level": "medium",
748
+ "title": "Service '${first_customer_required_unbacked}' declares customer_required with no buy_guard mounted",
749
+ "description": "${customer_required_unbacked_count} service(s) declare required customer information that nothing enforces at buy time: the on-chain buy entry points never read customer_required. Buyers who skip the info still complete the purchase, and fulfillment stalls later (post-buy collection, manual follow-up, or dispute).",
750
+ "mitigation": "Pick one deliberately: (a) mount a buy-spec guard (host service, key buy) whose submission legs carry the declared info, so the passport buy path enforces collection and non-passport buys reject; or (b) keep post-buy collection and disclose it honestly in the service description. Do not leave the declaration silently unenforced.",
751
+ "stakeholders": ["merchant", "customer"]
752
+ }
753
+ ]
754
+ },
755
+ {
756
+ "rule_id": "GUARD-REACH-01",
757
+ "dimension": "composition",
758
+ "trigger": "A guard's root AND chain carries a proof-level structural contradiction: an ordering interval crossing (>= 10 conjoined with <= 5, or equal bounds with a strict side like >= X with < X), an equality family contradiction (one channel asserted == to two different numeric constants or to opposite Bool constants, or == X conjoined with > X / < X), or a same-binding self-comparison with a strict direction (X > X / X < X). The predicate is unsatisfiable by construction: the guard can never pass, and every path it gates is permanently unreachable after publish (guards freeze at creation; S3 plane static reachability). Deliberately conservative — only proof-level classes are reported: query-vs-query legs across DIFFERENT bindings (e.g. allocation.balance >= order.amount) and runtime submission values are decided at runtime and are never reported here; OR branches and negation scopes are not conjunctive and are not descended.",
759
+ "cases": [
760
+ {
761
+ "when": { "field": "guard_reach_contradiction_count", "op": "gt", "value": 0 },
762
+ "level": "critical",
763
+ "title": "Guard predicate is self-contradictory: ${first_guard_reach_contradiction}",
764
+ "description": "All contradictions: ${guard_reach_contradiction_display}. Each is a proof, not a heuristic: two legs on the same channel demand impossible bounds at the same constant, so the guard evaluates false on every submission. Any forward, allocator row or claim rail gated by it is dead on arrival — and any escrow that can only leave through that path is stranded. Guards freeze at creation, so nothing can repair the predicate after publish.",
765
+ "mitigation": "Repair the predicate before creation: drop the redundant leg (keep the one that states the business intent — e.g. the window lower bound OR the upper bound, never a crossing pair), or correct the constant so the legs can both hold. If one leg was meant for a DIFFERENT state, split the guard per state instead of conjoining them.",
766
+ "stakeholders": ["merchant", "customer"]
767
+ }
768
+ ]
769
+ },
770
+ {
771
+ "rule_id": "COMPOSE-PAIR-01",
772
+ "dimension": "composition",
773
+ "trigger": "A guard reads order.* on a slot other than the host slot 0 (the P2 cross-order shape from chain-semantics/composition-truth.ts) but carries NO pairing key. Owner equality plus a provider pin proves only that this buyer has another order at that provider - it does NOT prove that order served THIS order, so one delivery order can unlock settlement on every order the same buyer ever placed. Allocation is append-only after publish and the Guard freezes at creation, so the missing key can never be added later.",
774
+ "cases": [
775
+ {
776
+ "when": {
777
+ "all": [
778
+ {
779
+ "field": "first_cross_order_guard_unpaired",
780
+ "op": "present"
781
+ }
782
+ ]
783
+ },
784
+ "level": "critical",
785
+ "title": "Cross-order gate has no pairing key (one fulfilment order can unlock many host orders)",
786
+ "description": "Guard '${first_cross_order_guard_unpaired}' reads a foreign order slot (${cross_order_slots_display}) with neither a repository.data rendezvous leg nor a declared 255 ONCE row. ${cross_order_unpaired_count} cross-order guard(s) are unpaired. A buyer who orders food twice and delivery once can present the same delivery order twice; the chain accepts it both times because nothing binds the fulfilment order to one host order.",
787
+ "mitigation": "Emit a pairing key. Preferred: a shared Repository row keyed by the HOST order address (P1) read via `repository.data has`, with write_once set on that policy rule so the fulfilment fact cannot be rewritten after settlement. Cheapest: declare {identifier: 255, b_submission: true} on the guard so the once-key includes the submitted bytes and the same foreign order address can only be consumed once.",
788
+ "stakeholders": ["merchant", "customer"]
789
+ }
790
+ ]
791
+ },
792
+ {
793
+ "rule_id": "COMPOSE-PROVIDER-PIN-01",
794
+ "dimension": "composition",
795
+ "trigger": "A cross-order gate does not pin the foreign order's Service to a constant address. Without the pin any order the caller happens to own - at any merchant, for any amount, in any state - satisfies the gate.",
796
+ "cases": [
797
+ {
798
+ "when": {
799
+ "all": [
800
+ {
801
+ "field": "first_cross_order_guard_unpinned",
802
+ "op": "present"
803
+ }
804
+ ]
805
+ },
806
+ "level": "high",
807
+ "title": "Cross-order gate does not pin the fulfilment provider",
808
+ "description": "Guard '${first_cross_order_guard_unpinned}' reads a foreign order slot but never compares order.service on that slot against a constant Address row. The native evaluator enforces the submitted object's TYPE (a Progress or Service submitted as an Order aborts) but it cannot know WHICH service was intended, so the caller supplies that fact and the gate believes it.",
809
+ "mitigation": "Add a non-submission Address table row holding the sub-Service address as a constant, plus a leg comparing order.service(foreignSlot) to it. That constant is the merchant's own commitment (P3) and is what makes the cross-order read meaningful.",
810
+ "stakeholders": ["merchant", "customer"]
811
+ }
812
+ ]
813
+ },
814
+ {
815
+ "rule_id": "COMPOSE-OWNER-CROSS-01",
816
+ "dimension": "composition",
817
+ "trigger": "A cross-order gate does not cross-check order.owner between the host slot and the foreign slot, so a stranger's order can satisfy it.",
818
+ "cases": [
819
+ {
820
+ "when": {
821
+ "all": [
822
+ {
823
+ "field": "first_cross_order_guard_no_owner_cross",
824
+ "op": "present"
825
+ }
826
+ ]
827
+ },
828
+ "level": "high",
829
+ "title": "Cross-order gate does not tie the two orders to one buyer",
830
+ "description": "Guard '${first_cross_order_guard_no_owner_cross}' reads a foreign order slot without reading order.owner on BOTH slots. Any sufficiently-shaped order from any buyer then passes, which turns a per-buyer fulfilment condition into a global one.",
831
+ "mitigation": "Add the leg order.owner(hostSlot) == order.owner(foreignSlot). Note this alone is still not a pairing key - see COMPOSE-PAIR-01.",
832
+ "stakeholders": ["merchant", "customer"]
833
+ }
834
+ ]
835
+ },
836
+ {
837
+ "rule_id": "COMPOSE-LIABILITY-01",
838
+ "dimension": "composition",
839
+ "trigger": "A third party fulfils part of the service but no payout path for that party was pre-set before publish. arbitration compensation_claim transfers to order::owner(order) - the recipient is hard-bound - and indemnity is capped at MAX_INDEMNITY_MULTIPLE (3) times the order amount, so a ruling in the fulfilment party's favour has NO on-chain execution path. Allocation rows are append-only after publish, so this cannot be repaired later (chain-semantics/composition-truth.ts S4; RD-C4 ruled 2026-10-29: block, do not warn).",
840
+ "cases": [
841
+ {
842
+ "when": {
843
+ "all": [
844
+ {
845
+ "field": "third_party_fulfilment_without_payout",
846
+ "op": "truthy"
847
+ }
848
+ ]
849
+ },
850
+ "level": "critical",
851
+ "title": "Third-party fulfilment with no pre-set payout path (a ruling for the rider is unexecutable)",
852
+ "description": "This plan procures fulfilment from a third party (a cross-order gate is present; declared axis '${fulfillment_axis}') but declares no Entity/Signer sharing leg and creates no Reward pool. If an arbitration finds the fulfilment party was wronged - or the merchant wants to pay a rider directly - no leg can carry the money, and the only remaining channel is an off-chain transfer with no on-chain evidence.",
853
+ "mitigation": "Pre-set one of two paths before publish. (a) An arbitration-triggered sharing leg with Recipient::Entity or Recipient::Signer: those legs are NOT constrained by payment_info.for_object, so they can pay a party who is not the order owner; gate it with the same identity pattern the refund rails already use. (b) A Reward pool (P6) the fulfilment party claims itself - claim asserts recipient == tx sender, the only permissionless channel that reaches a third party - with store_from pinned so one fulfilment pays once.",
854
+ "stakeholders": ["supplier", "merchant", "customer"]
855
+ }
856
+ ]
857
+ },
858
+ {
859
+ "rule_id": "COMPOSE-DUALREFUND-01",
860
+ "dimension": "composition",
861
+ "trigger": "V3 (the buyer procures fulfilment as a separate order) puts two escrow pools behind the SAME buyer address with different counterparties. Neither Service can read the other's claimed_by, so the chain cannot block a refund on both - a reachable 200% window. This is an inherent property to disclose, not a defect to fix (chain-semantics/composition-truth.ts S2/S3; RD-C3 ruled 2026-10-29: offer V3 as a first-class variant with mandatory disclosure).",
862
+ "cases": [
863
+ {
864
+ "when": {
865
+ "all": [
866
+ {
867
+ "field": "composition_dual_refund_unblockable",
868
+ "op": "truthy"
869
+ }
870
+ ]
871
+ },
872
+ "level": "medium",
873
+ "title": "V3 double refund cannot be blocked on chain - disclosure required",
874
+ "description": "The plan declares V3. The buyer owns both orders, the two pools have different counterparties, and each refund rail can only read its own order's claimed_by. Refunding on both orders is technically reachable, and the buyer's disputes must be filed twice with two fees and two panels that may rule contradictorily. ${composition_disclosure_count} disclosures are owed before purchase.",
875
+ "mitigation": "Surface all three V3 disclosures at build time and at the purchase gate, and require the buyer to confirm each one: (1) double refund is not blockable and is the buyer's own liability; (2) disputes cannot be merged - two filings, two fees, possibly contradictory rulings; (3) the merchant has no recourse against and no visibility into the buyer's fulfilment order. Never describe the two orders as linked on chain.",
876
+ "stakeholders": ["customer", "merchant"]
877
+ }
878
+ ]
879
+ },
880
+ {
881
+ "rule_id": "COMPOSE-VARIANT-01",
882
+ "dimension": "composition",
883
+ "trigger": "A commercial variant is declared but the plan does not emit the primitives that variant requires, so the declared business model and the materialized chain objects disagree.",
884
+ "cases": [
885
+ {
886
+ "when": {
887
+ "all": [
888
+ {
889
+ "field": "composition_variant_missing_primitives",
890
+ "op": "present"
891
+ }
892
+ ]
893
+ },
894
+ "level": "medium",
895
+ "title": "Declared variant is not backed by the primitives it needs",
896
+ "description": "Variant ${composition_variant} requires primitives this plan does not emit: ${composition_variant_missing_primitives}. The listing will promise a composition the published objects cannot gate - for example a merchant-procured delivery with no cross-order gate means the main order settles whether or not the sub-order was ever fulfilled.",
897
+ "mitigation": "Either emit the missing primitives (chain-semantics/composition-truth.ts gives the shape of each) or declare the variant the emitted topology actually supports. Emitted primitives for this plan: ${composition_primitives_emitted}.",
898
+ "stakeholders": ["merchant", "customer"]
899
+ }
900
+ ]
901
+ },
902
+ {
903
+ "rule_id": "PRIV-PUBLICFACE-01",
904
+ "dimension": "privacy",
905
+ "trigger": "A build-time public face carries text matching a language-neutral PII shape. The chain has no confidentiality primitive at all: Contact, Proof, Repository data, Entity records and listing copy are public and permanent, and the Messenger type is commented out of the registrar. The write is therefore the ONLY defence (chain-semantics/composition-truth.ts S5; RD-C5 ruled: hard gate at build time and on runtime submission).",
906
+ "cases": [
907
+ {
908
+ "when": {
909
+ "all": [
910
+ {
911
+ "field": "first_pii_public_face",
912
+ "op": "present"
913
+ }
914
+ ]
915
+ },
916
+ "level": "critical",
917
+ "title": "PII on a permanent public face (cannot be retracted after creation)",
918
+ "description": "Step '${first_pii_public_face_step}' writes ${first_pii_public_face} and the text matches the '${first_pii_kind}' shape. Once created, this value is publicly readable forever - there is no delete, no redaction and no read-permission primitive. A delivery address, phone number or identity number published here is published to every indexer and every competitor.",
919
+ "mitigation": "Move the value off chain: PII travels only through Messenger (E2EE), and the chain carries a presence gate instead - `order.required_info some` proves the buyer supplied it without publishing it. If a proof of the value is genuinely needed on chain, store a hash. Contact.location should stay city-level.",
920
+ "stakeholders": ["customer", "merchant"]
921
+ }
922
+ ]
923
+ },
924
+ {
925
+ "rule_id": "PRIV-TRACKING-RAW-01",
926
+ "dimension": "privacy",
927
+ "trigger": "A repository data value is a RAW carrier tracking number rather than a hash. Repository data is publicly readable with no author field, and a tracking number is a quasi-identifier: the carrier's own public lookup resolves it to a recipient name and address, so the raw number republishes the delivery address by reference.",
928
+ "cases": [
929
+ {
930
+ "when": {
931
+ "all": [
932
+ {
933
+ "field": "first_raw_tracking_value",
934
+ "op": "present"
935
+ }
936
+ ]
937
+ },
938
+ "level": "high",
939
+ "title": "Raw tracking number stored in a public repository row",
940
+ "description": "Step '${first_raw_tracking_value_step}' writes '${first_raw_tracking_value}' as a repository data value. Anyone reading the row can resolve it at the carrier to a recipient and an address, and the row can be correlated with the order it was written for.",
941
+ "mitigation": "Store a salted hash of the tracking number and hand the raw value to the buyer and the carrier over Messenger. If the row must stay human-readable for support, store the last four characters only.",
942
+ "stakeholders": ["customer", "supplier"]
943
+ }
944
+ ]
945
+ },
946
+ {
947
+ "rule_id": "PRIV-PROOF-PERORDER-01",
948
+ "dimension": "privacy",
949
+ "trigger": "required_info is attested through a Proof bound to the ORDER, which publicly associates that order with the contact record. The reusable shape (about = the contact) carries the same attestation without the per-order link.",
950
+ "cases": [
951
+ {
952
+ "when": {
953
+ "all": [
954
+ {
955
+ "field": "per_order_proof_binding_step",
956
+ "op": "present"
957
+ }
958
+ ]
959
+ },
960
+ "level": "low",
961
+ "title": "Per-order Proof binding publicly links the order to a contact record",
962
+ "description": "Step '${per_order_proof_binding_step}' binds a Proof to the order (or binds required_info through a proof). The binding is verifiable by anyone and permanently ties that order address to that contact record, widening what an observer can correlate.",
963
+ "mitigation": "Prefer the reusable Proof shape whose `about` is the contact rather than the order, unless per-order binding is a deliberate requirement of the flow.",
964
+ "stakeholders": ["customer", "merchant"]
965
+ }
966
+ ]
967
+ },
968
+ {
969
+ "rule_id": "TWIN-WINDOW-ZERO",
970
+ "dimension": "composition",
971
+ "trigger": "A FRACTIONAL `*_days` knob rides the PRESENTED plan (step params or resolved inputs). This is the publish-face semantic twin of the build face's PLAN-P0-18 blocker: the day knob lands in a guard-table U64 slot as a DAY COUNT, which BCS truncates (0.002 → 0), and a `<=` closing window fed by that slot computes anchor + 0 and welds shut the instant its anchor entry lands — Guards are immutable, so the rail is closed forever (the tbp taobao-presale mainnet run compiled a 0.002-day test window into exactly this shape). The compiler refuses the fractional input at generation; this twin re-fires the same predicate on the plan AS PRESENTED at the publish gate, so a hand-edited or drifted plan cannot carry the hazard past preflightPlan. campaign_duration_days is exempt — the compile converts it to an ABSOLUTE epoch-ms deadline in TS, so a fraction IS representable there (no U64 day slot involved).",
972
+ "cases": [
973
+ {
974
+ "when": { "field": "first_fractional_day_knob", "op": "present" },
975
+ "level": "critical",
976
+ "title": "Fractional day count on the presented plan — the window welds shut on-chain",
977
+ "description": "${first_fractional_day_knob}. The leg multiplies the slot by the 86400000 ms_per_day row ON-CHAIN, so the fraction the knob declares is unrepresentable: the closing window reads anchor + 0 and never reopens. ${fractional_day_knob_display}.",
978
+ "mitigation": "Answer whole days, or the PARALLEL `*_ms` knob (e.g. review_window_ms: 600000 = a 10-minute window) — the compiler then emits the ms-denominated slot pair (duration_ms beside a day-factor of 1). Rebuild the plan from the template instead of hand-editing: a hand-patched fractional day bypassed the generation-time input gate, and this publish-face twin is the gate that caught it.",
979
+ "stakeholders": ["merchant", "customer"]
980
+ }
981
+ ]
982
+ },
983
+ {
984
+ "rule_id": "TWIN-WINDOW-ZERO-HOURS",
985
+ "dimension": "composition",
986
+ "trigger": "A FRACTIONAL `*_hours`/`*_minutes` leaf rides the PRESENTED plan's step params. This is the publish-face semantic twin of the build face's pdd F-09 hours blocker (mtw-mainnet 2026-11-04): an hours knob whose binding rows carry NO scale lands RAW in a U64 slot that speaks the param's own unit (lower_hours / upper_hours / free_cancel_hours — the travel fee ladder's cancellation-tier seams), and BCS truncates the fraction to 0, so the band collapses to `tier + 0` and two cancellation tiers melt into one — Guards are immutable, so the ladder is wrong forever. The compiler refuses the fractional answer at generation unless EVERY binding row for that param carries a scale (a duration_ms TS-side conversion, where a fraction IS representable); this twin re-fires the predicate on the plan's step params AS PRESENTED at the publish gate. plan.inputs is not an hours verdict site: a scaled fractional answer legally rides it.",
987
+ "cases": [
988
+ {
989
+ "when": { "field": "first_fractional_hour_knob", "op": "present" },
990
+ "level": "critical",
991
+ "title": "Fractional hours count on the presented plan — the band truncates to zero on-chain",
992
+ "description": "${first_fractional_hour_knob}. A fractional hour/minute is unrepresentable in a U64 unit slot: the band or window the slot bounds collapses to 0 at BCS encode (the mtw-mainnet run fed 0.5 hours to the travel fee ladder and the tier seam compiled to tier + 0). ${fractional_hour_knob_display}.",
993
+ "mitigation": "Answer a whole number, or resolve the guard via guard_resolutions with an inline ms-denominated table (duration_ms) where the fraction is representable. Rebuild the plan from the template instead of hand-editing: this publish-face twin exists to catch plans that bypassed the generation-time input gate.",
994
+ "stakeholders": ["merchant", "customer"]
995
+ }
996
+ ]
997
+ },
998
+ {
999
+ "rule_id": "GUARD-EQUALITY-DRIFT",
1000
+ "dimension": "composition",
1001
+ "trigger": "A guard's description promises the delivered content MATCHES the committed hash/wip while its root carries NO logic_equal leg (ofnz8-mn-261105 F-49: the compiled guard enforced EXISTENCE of a hash-shaped row only, and content_hash=\"fake-hash-does-not-match-committed-wip\" cleared it on 4/4 orders — escrow released). Judged by the SAME shared predicate the template scanner runs (knowledge/guard-quality.ts equalityFaceCheck) over every guard create step — inline guard_resolutions included, since compile materializes them into create steps BEFORE this audit runs. The ≤16-char proximity window and the \"same writer\" phrase strip keep naming contracts and writer-authorization prose from false-firing.",
1002
+ "cases": [
1003
+ {
1004
+ "when": { "field": "first_guard_equality_drift", "op": "present" },
1005
+ "level": "critical",
1006
+ "title": "Guard description promises hash/wip equality with no equality leg: ${first_guard_equality_drift}",
1007
+ "description": "${guard_equality_drift_count} guard(s) claim content-matching while the root enforces existence only. Guards freeze at creation, so the drift is unrepairable after publish: any forged hash-shaped row passes, which is exactly the mainnet failure this rule encodes.",
1008
+ "mitigation": "Mount the equality leg before publish: resolve the guard (guard_resolutions) to tpl_repository_row_equals_order_field (default source order.item.wip_hash) or add an inline logic_equal over the row's hash vs the order's committed wip — or rewrite the description to state the weaker existence check the tree actually enforces. Never keep a matching promise over an existence-only guard.",
1009
+ "stakeholders": ["merchant", "customer"]
1010
+ }
1011
+ ]
1012
+ },
1013
+ {
1014
+ "rule_id": "GUARD-THRESHOLD-LITERAL",
1015
+ "dimension": "fund_flow",
1016
+ "trigger": "A guard table row whose name is a bare threshold identifier (min_/minimum_/threshold_/floor_/at_least_ prefix, no whitespace) carries value_type U64 with the literal value 1 (ofnz8 F-70: 1 MIST qualified for the rebate — any 1-unit order satisfies the \"threshold\", so the payout rate over qualifying volume is unbounded). Prose-annotated rows (query-range documentation) and submission rows are exempt — same predicate as the template scanner (knowledge/guard-quality.ts thresholdLiteralCheck).",
1017
+ "cases": [
1018
+ {
1019
+ "when": { "field": "first_guard_threshold_literal", "op": "present" },
1020
+ "level": "high",
1021
+ "title": "Threshold row ships as the literal 1 raw unit: ${first_guard_threshold_literal}",
1022
+ "description": "${guard_threshold_literal_count} threshold row(s) are bare 1-raw-unit literals. The floor filters nothing (1 smallest unit qualifies), the fixed reward over 1-unit orders makes the payout rate unbounded, and a bare literal is invisible to the operator's config plane — no knob exists to tune it.",
1023
+ "mitigation": "Derive the threshold from a declared fee param (value_from / FEE_PARAM_BINDINGS row) with a sane default, or state the intended floor in raw units as a named param the merchant can tune. Resolve via guard_resolutions with an inline table before publish — guards freeze at creation.",
1024
+ "stakeholders": ["merchant", "customer"]
1025
+ }
1026
+ ]
1027
+ },
1028
+ {
1029
+ "rule_id": "GUARD-SET-COLLAPSE",
1030
+ "dimension": "composition",
1031
+ "trigger": "A guard table repeats ONE String literal across >= 2 distinct non-submission row names (ofnz8 F-51/F-52: the terminal \"set\" was \"expired\" four times and \"reviewed\" twice) — either dead OR legs or placeholder rows that mislead every later editor into assuming a diversity that does not exist on chain. Non-`${…}` non-numeric strings only; same predicate as the template scanner (knowledge/guard-quality.ts setCollapseCheck).",
1032
+ "cases": [
1033
+ {
1034
+ "when": { "field": "first_guard_set_collapse", "op": "present" },
1035
+ "level": "medium",
1036
+ "title": "Declared set collapsed to one literal: ${first_guard_set_collapse}",
1037
+ "description": "${guard_set_collapse_count} guard(s) carry a repeated literal across distinct row names. If the design intended a SET of qualifying values, the extra members are dead OR legs; if it intended one value, the duplicated rows are placeholders — either way the table lies to the next editor, and guards freeze at publish.",
1038
+ "mitigation": "Collapse to the single row that carries the real value, or differentiate the members — each row should either earn its name with a distinct literal or be deleted. Fix via guard_resolutions (inline table) before publish.",
1039
+ "stakeholders": ["merchant", "customer"]
1040
+ }
1041
+ ]
1042
+ },
1043
+ {
1044
+ "rule_id": "GUARD-INPUT-TRUST",
1045
+ "dimension": "fund_flow",
1046
+ "trigger": "A guard's repository find_where/keys_where ids operand resolves to a caller-SUBMITTED table row ({identifier:N, b_submission:true}) — the candidate row set the query judges is self-attested (ofnz8 P0-4(b)): an attacker submits only their own row, the scan returns exactly that row, and every membership/equality leg built on it passes. Identifier resolution follows the kernel convention (composition/audit.ts acceptedProgressNodes). Same predicate as the template face (knowledge/guard-quality.ts submissionRowIdTrustCheck).",
1047
+ "cases": [
1048
+ {
1049
+ "when": { "field": "first_guard_input_trust", "op": "present" },
1050
+ "level": "high",
1051
+ "title": "Candidate row set is caller-submitted: ${first_guard_input_trust}",
1052
+ "description": "${guard_input_trust_count} guard(s) read their candidate rows from a submission row. Whoever executes the guard chooses what the scan sees, so the gate's authority collapses to self-attestation — the caller-reported candidate set is the very thing the guard was supposed to verify.",
1053
+ "mitigation": "Anchor the candidate set at a FIXED point: an Order-anchored non-submission row (identifier 0 / id_from the host order) or context(Signer), so the caller cannot choose what the scan sees. If the ids list must be dynamic, pin it with a vec_contains_address order-pin (ddmc2 F-10) so padding the list satisfies nothing.",
1054
+ "stakeholders": ["merchant", "customer"]
1055
+ }
1056
+ ]
1057
+ },
1058
+ {
1059
+ "rule_id": "GUARD-ABORT-SAFE-01",
1060
+ "dimension": "fund_flow",
1061
+ "trigger": "A guard queries a verb whose native handler ABORTS (W_FIELD_NOT_FOUND) when the addressed record does not exist, and the guard engine does not short-circuit — all leaves evaluate before the boolean merge (passport.rs TYPE_LOGIC_AND/OR), so no logic_and(presence leg, aborting verb) shape protects the guard. Verified 13 verbs against the native handlers: entityLinker votes 1802-1808, resource name/tags 1852-1855, entity_order role/time 2252/2255 (B-30, UNEXPRESSIBLE §6.3; N-11). Same predicate as the template face (knowledge/guard-quality.ts abortSafeVerbCheck).",
1062
+ "cases": [
1063
+ {
1064
+ "when": { "field": "first_guard_abort_unsafe", "op": "present" },
1065
+ "level": "critical",
1066
+ "title": "Guard queries an abort-on-absent verb: ${first_guard_abort_unsafe}",
1067
+ "description": "${guard_abort_unsafe_count} guard leg(s) read verbs that return W_FIELD_NOT_FOUND instead of a zero/false value when the target record is missing (reputation votes, resource name/tags, entity-order role/time). The engine evaluates every leaf before merging, so the first absent target aborts the entire guard evaluation and every order path the guard gates fails at runtime. Guards freeze at creation — the defect is unrepairable after publish.",
1068
+ "mitigation": "Read the safe sibling verb instead: entityLinker.entity has (1801), resource.object has (1851), entity_order.entity has (2250) / count (2251) / is_owner (2253) / is_agent (2254) all return false/0 on absence. PT-12 (protocol train) will widen the aborting natives to typed zero values — until it lands on-chain, these verbs are unusable inside guards.",
1069
+ "stakeholders": ["merchant", "customer"]
1070
+ }
1071
+ ]
1072
+ },
1073
+ {
1074
+ "rule_id": "GUARD-FIND-POLARITY",
1075
+ "dimension": "fund_flow",
1076
+ "trigger": "A guard anchors a history clock at find:\"first\" on a node lying on a renewal/charge loop of the plan's machine graph — the node re-enters per billed period, so period 2+ reads the FIRST visit's timestamp and the measured window is already closed (or already open) at birth (ofnz8 F-61). Loop tiers rebuilt with the shared findLoopCycles + classifyLoopCycle over the machine edges; remedy-loop nodes are exempt (one-shot acceptance deadlines). Severity follows the contract the description states: a per-period claim over the stale anchor is critical; a bare anchor is a low disclosure (most likely the intended once-per-life gate).",
1077
+ "cases": [
1078
+ {
1079
+ "when": { "field": "guard_find_polarity_per_period", "op": "truthy" },
1080
+ "level": "critical",
1081
+ "title": "find:\"first\" anchor on a periodic node while the description claims per-period semantics: ${first_guard_find_polarity}",
1082
+ "description": "${guard_find_polarity_count} periodic anchor(s) in the plan; this one promises per-period behavior the find:\"first\" polarity cannot deliver — from period 2 the window reads the FIRST visit's clock, so every later period's window is already expired (or already open) at birth. Guards freeze at publish; the polarity cannot be repaired on a live shop.",
1083
+ "mitigation": "Anchor the leg with find:\"last\" (the schema's stated polarity for re-entrant anchors), or re-point the where at a node each period enters exactly once — or rewrite the description to state the once-per-life semantics the anchor actually enforces.",
1084
+ "stakeholders": ["merchant", "customer"]
1085
+ },
1086
+ {
1087
+ "when": { "field": "first_guard_find_polarity", "op": "present" },
1088
+ "level": "low",
1089
+ "title": "find:\"first\" anchors a periodic node — confirm the once-per-life intent: ${first_guard_find_polarity}",
1090
+ "description": "The description does NOT claim per-period semantics, so this is most likely the intended once-per-life polarity (e.g. a one-time bounty claimable N days after the FIRST review). Disclosed, not blocked — confirm the intent before publish, because the anchor freezes with the guard.",
1091
+ "mitigation": "No action needed if the once-per-life reading is intended; otherwise anchor with find:\"last\" before publish.",
1092
+ "stakeholders": ["merchant", "customer"]
1093
+ }
1094
+ ]
1095
+ },
1096
+ {
1097
+ "rule_id": "R-REFUND-CONVERGENCE",
1098
+ "dimension": "fund_flow",
1099
+ "trigger": "A plan ships a refund-track allocator row (refund_row_count > 0) but the machine projection carries NO convergence close: no edge INTO a `closed_refunded` node whose bound guard queries order.principal_refunded (chain-query 1579 — the RefundStamp latch, order.move:395-430, set once by the chain when the refund principal is paid back in FULL and never forgeable). The compile kernel injects the terminal + shared `refund_latch_convergence` guard (emitRefundConvergence, K3 C3); hand-built plans must declare the equivalent shape (K3 C3, 2026-11-08).",
1100
+ "cases": [
1101
+ {
1102
+ "when": { "all": [ { "field": "refund_row_count", "op": "gt", "value": 0 }, { "field": "refund_convergence_missing", "op": "truthy" } ] },
1103
+ "level": "critical",
1104
+ "title": "Refund track has no latch-gated close: no closed_refunded convergence edge",
1105
+ "description": "The plan moves money on the refund track (${refund_row_count} refund row(s)) but the machine graph has no edge into closed_refunded gated by order.principal_refunded (1579). Without the latch-gated close, nothing in the topology PROVES the refund loop ended — a partial-refund or disputed order reads structurally identical to a closed one on every downstream face (buyer diligence, market scan, dispute evidence), and the refund state stays a private convention of this one template.",
1106
+ "mitigation": "Compile through the kernel (emitRefundConvergence injects the terminal + the shared refund_latch_convergence guard: order.principal_refunded == true on the 254 task-binding slot, edges riding the merchant permission rail), or declare the equivalent node + 1579-gated edges by hand BEFORE publish — allocator rows and forwards freeze permanently at publish (IMMUT-002).",
1107
+ "stakeholders": ["merchant", "customer"]
1108
+ }
1109
+ ]
1110
+ },
1111
+ {
1112
+ "rule_id": "R-LATE-REMEDY",
1113
+ "dimension": "fund_flow",
1114
+ "trigger": "A plan ships a `{forward}_late` machine edge (late_remedy_edge_count > 0 — the K3 D3 after-hours twin of a closing-window edge, mounted by the kernel when fee_params.late_remedy_mode = 'keeper_reopen' or declared by hand) but NO guard bound to the edge carries the 1008 keeper membership leg (permission.entity.perm has, index-bound). The late rail is then ANONYMOUS: whoever can submit a permission can operate outside the declared window with no keeper attribution (K3 D3, 2026-11-08).",
1115
+ "cases": [
1116
+ {
1117
+ "when": { "all": [ { "field": "late_remedy_edge_count", "op": "gt", "value": 0 }, { "field": "late_remedy_gate_missing", "op": "truthy" } ] },
1118
+ "level": "critical",
1119
+ "title": "Late-remedy edge has no keeper leg: anonymous after-hours rail (${first_late_remedy_gate_missing})",
1120
+ "description": "The machine ships `{forward}_late` edge(s) (${late_remedy_gate_missing_display}) whose guards carry no 1008 keeper membership leg. The strict window edge keeps its weld, but its late twin is then driveable by ANY permission submitter, not just the keeper role — an undeclared after-hours bypass of a frozen business deadline. The kernel mounts the twin with tpl_late_remedy_keeper_forward (node pin + dynamic permission + 1008 keeper slot, edge permission_index 1002) and discloses it on the machine step's notes.",
1121
+ "mitigation": "Compile through the kernel (late_remedy_mode = 'keeper_reopen' mounts attributed twins), or rebind the late edge to a guard carrying the 1008 keeper leg (tpl_late_remedy_keeper_forward shape) BEFORE publish — machine topology freezes permanently at publish (IMMUT-002). If no after-hours rail is intended, drop the _late edge entirely and let the strict window stay absolute.",
1122
+ "stakeholders": ["merchant", "customer"]
1123
+ }
1124
+ ]
1125
+ },
1126
+ {
1127
+ "rule_id": "SETTLEMENT-TRIGGER-SCOPE",
1128
+ "dimension": "fund_flow",
1129
+ "trigger": "Disclosure face (K3 C4, 2026-11-08): the plan ships settlement-track allocator rows and the settlement_triggers_display fact names who can fire each rail. The buyer-only shape (the ONLY caller face is order.owner/order.agent — the buyer triggers the merchant's settlement) keeps the legacy role-reversal WARN as an advisory; service-binding and permission-role faces are legal and never warned.",
1130
+ "cases": [
1131
+ {
1132
+ "when": { "field": "settlement_buyer_only_count", "op": "gt", "value": 0 },
1133
+ "level": "medium",
1134
+ "title": "Buyer-triggered settlement (role-reversal disclosure): ${settlement_buyer_only_count} rail(s) fire only on the buyer's identity",
1135
+ "description": "${settlement_triggers_display}. Every settlement rail above carries ONLY the order-holder caller face (order.owner/order.agent == signer) — the BUYER's signature is what releases the merchant's money. This is the disclosed role reversal: legal by design (e.g. buyer-claimed completion), but the buyer can time or withhold the merchant's payout and the merchant cannot settle unilaterally. Rails whose face is a service binding or a permission role are NOT listed here — those are merchant-side by construction.",
1136
+ "mitigation": "If unilateral merchant settlement is intended, widen the rail's caller face: a permission-index role leg (permission.owner/admin == signer, riding the merchant rail 1000/1001) or an order.service binding leg — the C4-legal identity set. Keep the buyer-only face only where buyer-controlled release is the contract.",
1137
+ "stakeholders": ["merchant", "customer"]
1138
+ }
1139
+ ]
1140
+ },
1141
+ {
1142
+ "rule_id": "R-WITHDRAW-NO-CASE-BIND",
1143
+ "dimension": "fund_flow",
1144
+ "trigger": "A plan ships a machine edge with the WithdrawClaim forward whose bound guards read NO order.dispute.open leg (chain-query 1576, order.dispute.open — mirrors order::has_open_dispute). The compile kernel mounts the bind leg on every catalog withdraw edge (guard-fill andDisputeBindLeg, PT-26 2026-11-08); this twin judges hand-built plans and inline guard_resolutions overrides, which own their root outright.",
1145
+ "cases": [
1146
+ {
1147
+ "when": { "field": "withdraw_no_case_bind_count", "op": "gt", "value": 0 },
1148
+ "level": "medium",
1149
+ "title": "WithdrawClaim edge with no case binding: ${withdraw_no_case_bind_count} withdraw edge(s) read no open-dispute leg",
1150
+ "description": "${withdraw_no_case_bind_display}. A withdrawal whose guard carries only the identity leg (order-holder set, no dispute-state read) admits with NO case on file: the same buyer can farm file->withdraw cycles for free (each cycle re-anchors keeper clocks and perturbs the public state face), and a case on a DIFFERENT order neither helps nor blocks — the withdraw reads no arbitration object at all. The kernel mounts the case-binding leg (query 1576 must read TRUE on THIS order) automatically on catalog templates; a hand-built plan shipping without it keeps the ssng6 residuals live.",
1151
+ "mitigation": "AND a tpl_order_has_open_dispute leg onto the withdraw edge's guard (the kernel does this for every catalog WithdrawClaim edge; the hand-built equivalent is the bare positive query order.dispute.open on the order's submission slot). Protocol gate (v139): 1576 is flag-gated (enable_order_dispute_state) — on an older binary the leg reads false and the withdraw edge goes dark (degrade polarity is INVERTED vs the settlement freeze leg, which degrades open); check upgrade_check (DEPLOY-K1).",
1152
+ "stakeholders": ["merchant", "customer"]
1153
+ }
1154
+ ]
1155
+ },
1156
+ {
1157
+ "rule_id": "R-DISPUTE-EXIT-REACHABILITY",
1158
+ "dimension": "fund_flow",
1159
+ "trigger": "Cross-EDGE state reachability (ss10 F-SS10-01, 2026-11-09): the plan ships BOTH a dispute-freeze money rail (a guard reading order.dispute.open on a NON-withdraw edge) AND a withdraw edge whose guards read order.dispute.open (case-bound) but carry NO order.claimed_by disposition precondition. Each shape is correct alone; the composition locks escrow: order::dispute() is push-only and claimed_by has no clearer, so a file->withdraw cycle leaves has_open_dispute TRUE forever and every freeze rail is unreachable from the withdrawn state.",
1160
+ "cases": [
1161
+ {
1162
+ "when": { "field": "dispute_exit_dead_topology", "op": "gte", "value": 1 },
1163
+ "level": "high",
1164
+ "title": "Dispute-exit dead topology: ${dispute_exit_live_withdraw_count} withdraw edge(s) strand ${dispute_freeze_rail_count} dispute-frozen rail(s) with NO recovery path",
1165
+ "description": "Freeze rail(s): ${dispute_freeze_rail_display}. Live withdraw edge(s): ${dispute_exit_live_withdraw_display}. Chain truth (order.move): dispute() only pushes (no removal verb), claimed_by is stamped ONLY by compensate()/conclude(), and has_open_dispute() = dispute non-empty && claimed_by none. A buyer who files a dispute and takes the withdraw edge leaves the case live forever; this machine exposes NO conclude/compensate forward, so NOTHING can ever turn has_open_dispute false — the frozen rails (refunds gated on NOT dispute.open) are unreachable and the escrow locks (ss10 mainnet: 0.20 WOW permanently locked exactly here).",
1166
+ "mitigation": "Wire a disposition path: a conclude/compensate-class forward reachable from the withdrawn node (the arb case_conclude rail stamps claimed_by), or add a claimed_by disposition precondition leg to the withdraw edge so withdrawal is only possible AFTER the case was stamped. Root cure is protocol-train PT-26 Plan C (order::withdraw_dispute clearing verb) — register, do not hand-patch.",
1167
+ "stakeholders": ["merchant", "customer"]
1168
+ }
1169
+ ]
1170
+ },
1171
+ {
1172
+ "rule_id": "R-DISPUTE-EXIT-INDIRECT-STAMP",
1173
+ "dimension": "fund_flow",
1174
+ "trigger": "Same coexistence as R-DISPUTE-EXIT-REACHABILITY, but the machine DOES expose a conclude/compensate-class forward — recovery exists only through a FULL re-arbitration cycle filed AFTER the withdraw (no dispute removal verb means the withdrawn case keeps has_open_dispute TRUE until some case stamps claimed_by).",
1175
+ "cases": [
1176
+ {
1177
+ "when": { "field": "dispute_exit_indirect_stamp", "op": "gte", "value": 1 },
1178
+ "level": "medium",
1179
+ "title": "Dispute exit is indirect: ${dispute_exit_live_withdraw_count} withdraw edge(s) leave the case live; recovery only via a fresh arbitration cycle",
1180
+ "description": "Freeze rail(s): ${dispute_freeze_rail_display}. Live withdraw edge(s): ${dispute_exit_live_withdraw_display}. After a file->withdraw cycle the withdrawn case stays open forever (push-only dispute vector, no clearing verb); the conclude/compensate forward on this machine can stamp claimed_by only when a NEW dispute is filed and driven to a stamped ruling. Disclose in the service terms: a withdrawn dispute freezes every dispute-gated refund until a fresh case reaches compensate/conclude — buyers perceive 'I withdrew, why is my refund blocked'. Root cure stays protocol-train PT-26 Plan C (order::withdraw_dispute).",
1181
+ "mitigation": "Disclose the two-step recovery in build_note/quote terms, or add the claimed_by disposition precondition leg to the withdraw edge so withdrawal requires a stamped (resolved) case up front.",
1182
+ "stakeholders": ["merchant", "customer"]
1183
+ }
1184
+ ]
1185
+ }
1186
+ ]
1187
+ }