@wowok/agent-mcp 3.1.0 → 3.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (337) hide show
  1. package/dist/config/runtime.js +1 -1
  2. package/dist/customer/index.d.ts +3 -9
  3. package/dist/customer/index.js +1 -1
  4. package/dist/customer/industry-risks.d.ts +3 -17
  5. package/dist/customer/industry-risks.js +1 -1
  6. package/dist/customer/types.d.ts +1 -165
  7. package/dist/customer/types.js +1 -1
  8. package/dist/customer/user-preferences.d.ts +0 -49
  9. package/dist/customer/user-preferences.js +1 -1
  10. package/dist/evaluation/arbitration-game.js +1 -1
  11. package/dist/evaluation/architecture.spec.d.ts +1 -0
  12. package/dist/evaluation/architecture.spec.js +1 -0
  13. package/dist/evaluation/builtins/graph-service.d.ts +16 -0
  14. package/dist/evaluation/builtins/graph-service.js +1 -0
  15. package/dist/evaluation/builtins/graph-service.spec.d.ts +1 -0
  16. package/dist/evaluation/builtins/graph-service.spec.js +1 -0
  17. package/dist/evaluation/builtins/index.d.ts +1 -1
  18. package/dist/evaluation/builtins/index.js +1 -1
  19. package/dist/evaluation/builtins/purity.spec.d.ts +1 -0
  20. package/dist/evaluation/builtins/purity.spec.js +1 -0
  21. package/dist/evaluation/engine.js +1 -1
  22. package/dist/evaluation/facets/catalog.d.ts +19 -0
  23. package/dist/evaluation/facets/catalog.js +1 -0
  24. package/dist/evaluation/guard-scan.d.ts +10 -0
  25. package/dist/evaluation/guard-scan.js +1 -0
  26. package/dist/evaluation/location-match.js +1 -1
  27. package/dist/evaluation/standards.d.ts +31 -0
  28. package/dist/evaluation/standards.js +1 -0
  29. package/dist/evaluation/standards.spec.d.ts +1 -0
  30. package/dist/evaluation/standards.spec.js +1 -0
  31. package/dist/evaluation/types.d.ts +9 -0
  32. package/dist/experience/realtime-feedback.js +1 -1
  33. package/dist/extensions/index.d.ts +1 -1
  34. package/dist/extensions/index.js +1 -1
  35. package/dist/extensions/industry-layers.d.ts +6 -5
  36. package/dist/extensions/industry-layers.js +1 -1
  37. package/dist/extensions/industry-pack.js +1 -1
  38. package/dist/goal/GoalClassifier.js +1 -1
  39. package/dist/graph/onchain/analyze.d.ts +16 -3
  40. package/dist/graph/onchain/analyze.js +1 -1
  41. package/dist/graph/onchain/analyze.spec.js +1 -1
  42. package/dist/graph/onchain/dataplane.d.ts +1 -1
  43. package/dist/graph/onchain/dataplane.js +1 -1
  44. package/dist/graph/onchain/edge-batch.spec.d.ts +1 -0
  45. package/dist/graph/onchain/edge-batch.spec.js +1 -0
  46. package/dist/graph/onchain/edge-schema.d.ts +11 -3
  47. package/dist/graph/onchain/edge-schema.js +1 -1
  48. package/dist/graph/onchain/entity-profile.spec.d.ts +1 -0
  49. package/dist/graph/onchain/entity-profile.spec.js +1 -0
  50. package/dist/graph/onchain/event-history.spec.d.ts +1 -0
  51. package/dist/graph/onchain/event-history.spec.js +1 -0
  52. package/dist/graph/onchain/expand.js +1 -1
  53. package/dist/graph/onchain/extract-deep.spec.d.ts +1 -0
  54. package/dist/graph/onchain/extract-deep.spec.js +1 -0
  55. package/dist/graph/onchain/extract.d.ts +11 -3
  56. package/dist/graph/onchain/extract.js +1 -1
  57. package/dist/graph/onchain/facet-projection.d.ts +99 -0
  58. package/dist/graph/onchain/facet-projection.js +1 -0
  59. package/dist/graph/onchain/facet-projection.spec.d.ts +1 -0
  60. package/dist/graph/onchain/facet-projection.spec.js +1 -0
  61. package/dist/graph/onchain/facts.d.ts +103 -0
  62. package/dist/graph/onchain/facts.js +1 -0
  63. package/dist/graph/onchain/facts.spec.d.ts +1 -0
  64. package/dist/graph/onchain/facts.spec.js +1 -0
  65. package/dist/graph/onchain/field-manifest.d.ts +29 -0
  66. package/dist/graph/onchain/field-manifest.js +1 -0
  67. package/dist/graph/onchain/field-manifest.spec.d.ts +1 -0
  68. package/dist/graph/onchain/field-manifest.spec.js +1 -0
  69. package/dist/graph/onchain/fixtures.d.ts +80 -0
  70. package/dist/graph/onchain/fixtures.js +1 -0
  71. package/dist/graph/onchain/fixtures.spec.d.ts +1 -0
  72. package/dist/graph/onchain/fixtures.spec.js +1 -0
  73. package/dist/graph/onchain/index.d.ts +8 -2
  74. package/dist/graph/onchain/index.js +1 -1
  75. package/dist/graph/onchain/interest.js +1 -1
  76. package/dist/graph/onchain/label-lint.spec.d.ts +1 -0
  77. package/dist/graph/onchain/label-lint.spec.js +1 -0
  78. package/dist/graph/onchain/names.d.ts +23 -0
  79. package/dist/graph/onchain/names.js +1 -0
  80. package/dist/graph/onchain/names.spec.d.ts +1 -0
  81. package/dist/graph/onchain/names.spec.js +1 -0
  82. package/dist/graph/onchain/onchain.spec.js +1 -1
  83. package/dist/graph/onchain/proposal-graph.d.ts +11 -0
  84. package/dist/graph/onchain/proposal-graph.js +1 -0
  85. package/dist/graph/onchain/proposal-graph.spec.d.ts +1 -0
  86. package/dist/graph/onchain/proposal-graph.spec.js +1 -0
  87. package/dist/graph/onchain/sdk-batch.d.ts +5 -1
  88. package/dist/graph/onchain/sdk-batch.js +1 -1
  89. package/dist/graph/onchain/sdk-dataplane.js +1 -1
  90. package/dist/graph/onchain/strategy.d.ts +16 -0
  91. package/dist/graph/onchain/strategy.js +1 -1
  92. package/dist/graph/onchain/strategy.spec.js +1 -1
  93. package/dist/graph/onchain/table-ledger.spec.d.ts +1 -0
  94. package/dist/graph/onchain/table-ledger.spec.js +1 -0
  95. package/dist/graph/onchain/types.d.ts +51 -11
  96. package/dist/graph/onchain/viewport.d.ts +1 -0
  97. package/dist/graph/onchain/viewport.js +1 -1
  98. package/dist/harness/index.d.ts +1 -5
  99. package/dist/harness/index.js +1 -1
  100. package/dist/harness/verify.d.ts +6 -1
  101. package/dist/harness/verify.js +1 -1
  102. package/dist/index.js +1 -1
  103. package/dist/knowledge/allocation-ledger.d.ts +2 -0
  104. package/dist/knowledge/allocation-ledger.js +1 -1
  105. package/dist/knowledge/allocation-puzzle.js +1 -1
  106. package/dist/knowledge/allocation-risk.d.ts +2 -3
  107. package/dist/knowledge/allocation-risk.js +1 -1
  108. package/dist/knowledge/arb-risk.d.ts +0 -1
  109. package/dist/knowledge/arb-risk.js +1 -1
  110. package/dist/knowledge/arbitration-risk.d.ts +0 -2
  111. package/dist/knowledge/arbitration-risk.js +1 -1
  112. package/dist/knowledge/baselines/evaluation-baselines.json +79 -0
  113. package/dist/knowledge/baselines/guard-lint-baseline.spec.d.ts +1 -0
  114. package/dist/knowledge/baselines/guard-lint-baseline.spec.js +1 -0
  115. package/dist/knowledge/baselines/risk-baselines.spec.d.ts +1 -0
  116. package/dist/knowledge/baselines/risk-baselines.spec.js +1 -0
  117. package/dist/knowledge/baselines/risk-cases.d.ts +8 -0
  118. package/dist/knowledge/baselines/risk-cases.js +1 -0
  119. package/dist/knowledge/bridge-risk.d.ts +0 -1
  120. package/dist/knowledge/bridge-risk.js +1 -1
  121. package/dist/knowledge/contact-risk.d.ts +0 -1
  122. package/dist/knowledge/contact-risk.js +1 -1
  123. package/dist/knowledge/contract-invariants.d.ts +1 -0
  124. package/dist/knowledge/contract-invariants.js +1 -1
  125. package/dist/knowledge/demand-risk.d.ts +0 -1
  126. package/dist/knowledge/demand-risk.js +1 -1
  127. package/dist/knowledge/getting-started.js +1 -1
  128. package/dist/knowledge/guard-design-patterns.js +1 -1
  129. package/dist/knowledge/guard-eval.d.ts +15 -0
  130. package/dist/knowledge/guard-eval.js +1 -0
  131. package/dist/knowledge/guard-eval.spec.d.ts +1 -0
  132. package/dist/knowledge/guard-eval.spec.js +1 -0
  133. package/dist/knowledge/guard-field-cognition.d.ts +48 -0
  134. package/dist/knowledge/guard-field-cognition.js +1 -0
  135. package/dist/knowledge/guard-lint.d.ts +1 -1
  136. package/dist/knowledge/guard-lint.js +1 -1
  137. package/dist/knowledge/guard-risk.d.ts +4 -19
  138. package/dist/knowledge/guard-risk.js +1 -1
  139. package/dist/knowledge/index.d.ts +42 -43
  140. package/dist/knowledge/index.js +1 -1
  141. package/dist/knowledge/industry-registry.js +1 -1
  142. package/dist/knowledge/industry-rule-node.d.ts +7 -0
  143. package/dist/knowledge/industry-rule-node.js +1 -0
  144. package/dist/knowledge/industry-strategy.js +1 -1
  145. package/dist/knowledge/jsonrpc-enum.js +1 -1
  146. package/dist/knowledge/machine-risk.d.ts +0 -6
  147. package/dist/knowledge/machine-risk.js +1 -1
  148. package/dist/knowledge/order-risk.d.ts +1 -9
  149. package/dist/knowledge/order-risk.js +1 -1
  150. package/dist/knowledge/payment-risk.d.ts +0 -1
  151. package/dist/knowledge/payment-risk.js +1 -1
  152. package/dist/knowledge/permission-risk.d.ts +0 -3
  153. package/dist/knowledge/permission-risk.js +1 -1
  154. package/dist/knowledge/personal-risk.d.ts +0 -1
  155. package/dist/knowledge/personal-risk.js +1 -1
  156. package/dist/knowledge/progress-risk.d.ts +0 -2
  157. package/dist/knowledge/progress-risk.js +1 -1
  158. package/dist/knowledge/proof-risk.d.ts +0 -1
  159. package/dist/knowledge/proof-risk.js +1 -1
  160. package/dist/knowledge/puzzle-projections.d.ts +11 -0
  161. package/dist/knowledge/puzzle-projections.js +1 -0
  162. package/dist/knowledge/recipient-constraint.d.ts +6 -1
  163. package/dist/knowledge/recipient-constraint.js +1 -1
  164. package/dist/knowledge/registrar-risk.d.ts +0 -1
  165. package/dist/knowledge/registrar-risk.js +1 -1
  166. package/dist/knowledge/repository-risk.d.ts +0 -1
  167. package/dist/knowledge/repository-risk.js +1 -1
  168. package/dist/knowledge/resource-risk.d.ts +0 -1
  169. package/dist/knowledge/resource-risk.js +1 -1
  170. package/dist/knowledge/reward-risk.d.ts +1 -5
  171. package/dist/knowledge/reward-risk.js +1 -1
  172. package/dist/knowledge/rule-node-analyzers.d.ts +43 -0
  173. package/dist/knowledge/rule-node-analyzers.js +1 -0
  174. package/dist/knowledge/rule-node-analyzers.spec.d.ts +1 -0
  175. package/dist/knowledge/rule-node-analyzers.spec.js +1 -0
  176. package/dist/knowledge/rule-outcome.d.ts +5 -0
  177. package/dist/knowledge/rule-outcome.js +1 -0
  178. package/dist/knowledge/safety-rules.js +1 -1
  179. package/dist/knowledge/scenario-topology.js +1 -1
  180. package/dist/knowledge/service-allocator-audit-node.d.ts +3 -0
  181. package/dist/knowledge/service-allocator-audit-node.js +1 -0
  182. package/dist/knowledge/service-risk-node.js +1 -1
  183. package/dist/knowledge/service-risk.d.ts +0 -3
  184. package/dist/knowledge/service-risk.js +1 -1
  185. package/dist/knowledge/template-registry.js +1 -1
  186. package/dist/knowledge/tools-reference.js +1 -1
  187. package/dist/knowledge/treasury-risk.d.ts +2 -3
  188. package/dist/knowledge/treasury-risk.js +1 -1
  189. package/dist/knowledge/util-risk.d.ts +0 -1
  190. package/dist/knowledge/util-risk.js +1 -1
  191. package/dist/knowledge/workflow-guidance.d.ts +2 -0
  192. package/dist/knowledge/workflow-guidance.js +1 -1
  193. package/dist/monitor/MonitorLoop.js +1 -1
  194. package/dist/persona/bridge.js +1 -1
  195. package/dist/persona/facet-profile.d.ts +33 -0
  196. package/dist/persona/facet-profile.js +1 -0
  197. package/dist/persona/model.d.ts +2 -1
  198. package/dist/persona/model.js +1 -1
  199. package/dist/persona/strategy-intent.js +1 -1
  200. package/dist/persona/topology-focus.d.ts +2 -2
  201. package/dist/persona/topology-focus.js +1 -1
  202. package/dist/persona/types.d.ts +12 -0
  203. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  204. package/dist/playbooks/service-build/facet-money.d.ts +22 -0
  205. package/dist/playbooks/service-build/facet-money.js +1 -0
  206. package/dist/playbooks/service-build/facet-money.spec.d.ts +1 -0
  207. package/dist/playbooks/service-build/facet-money.spec.js +1 -0
  208. package/dist/playbooks/service-build/intent-analyzer.js +1 -1
  209. package/dist/playbooks/service-build/machine-panorama.d.ts +3 -0
  210. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  211. package/dist/playbooks/service-build/object-panorama.d.ts +27 -27
  212. package/dist/playbooks/service-build/object-panorama.js +1 -1
  213. package/dist/playbooks/service-build/pipeline-actions.d.ts +2 -2
  214. package/dist/playbooks/service-build/pipeline-actions.js +1 -1
  215. package/dist/playbooks/service-build/risk-aggregator.d.ts +2 -1
  216. package/dist/playbooks/service-build/risk-aggregator.js +1 -1
  217. package/dist/playbooks/service-build/service-panorama.d.ts +4 -9
  218. package/dist/playbooks/service-build/service-panorama.js +1 -1
  219. package/dist/playbooks/service-build/topology-evaluation.spec.d.ts +1 -0
  220. package/dist/playbooks/service-build/topology-evaluation.spec.js +1 -0
  221. package/dist/playbooks/service-build/topology-query.d.ts +13 -2
  222. package/dist/playbooks/service-build/topology-query.js +1 -1
  223. package/dist/review/arb.d.ts +0 -2
  224. package/dist/review/arb.js +1 -1
  225. package/dist/review/order.d.ts +0 -1
  226. package/dist/review/order.js +1 -1
  227. package/dist/role/profiles.js +1 -1
  228. package/dist/rules.d.ts +1 -2
  229. package/dist/rules.js +1 -1
  230. package/dist/safety/confirm-gate.js +1 -1
  231. package/dist/safety/preview.js +1 -1
  232. package/dist/schema/call/base.d.ts +3372 -668
  233. package/dist/schema/call/base.js +1 -1
  234. package/dist/schema/call/handler.js +1 -1
  235. package/dist/schema/call/receipt.d.ts +28 -0
  236. package/dist/schema/call/receipt.js +1 -0
  237. package/dist/schema/call/semantic-customer-advice.spec.d.ts +1 -0
  238. package/dist/schema/call/semantic-customer-advice.spec.js +1 -0
  239. package/dist/schema/call/semantic.d.ts +5 -2
  240. package/dist/schema/call/semantic.js +1 -1
  241. package/dist/schema/call/treasury.js +1 -1
  242. package/dist/schema/common/index.js +1 -1
  243. package/dist/schema/evaluation/index.d.ts +289 -211
  244. package/dist/schema/evaluation/index.js +1 -1
  245. package/dist/schema/goal/index.d.ts +1 -1
  246. package/dist/schema/goal/planning.d.ts +2 -2
  247. package/dist/schema/index.d.ts +0 -1
  248. package/dist/schema/index.js +1 -1
  249. package/dist/schema/industry-pack/index.d.ts +1 -1
  250. package/dist/schema/keeper/index.d.ts +1 -1
  251. package/dist/schema/local/index.js +1 -1
  252. package/dist/schema/operations.d.ts +28 -10
  253. package/dist/schema/operations.js +1 -1
  254. package/dist/schema/persona/index.d.ts +24 -24
  255. package/dist/schema/query/bi.d.ts +629 -14
  256. package/dist/schema/query/bi.js +1 -1
  257. package/dist/schema/query/index.d.ts +9 -9
  258. package/dist/schema/query/index.js +1 -1
  259. package/dist/schema/schema-version.js +1 -1
  260. package/dist/schema/workspace/index.d.ts +2 -2
  261. package/dist/schema-query-impl/index.js +1 -1
  262. package/dist/schemas/account_operation.output.json +10 -10
  263. package/dist/schemas/account_operation.schema.json +3 -3
  264. package/dist/schemas/bridge_operation.output.json +10 -10
  265. package/dist/schemas/evaluation_operation.output.json +697 -169
  266. package/dist/schemas/evaluation_operation.schema.json +5 -434
  267. package/dist/schemas/index.json +1 -7
  268. package/dist/schemas/keeper_operation.output.json +10 -10
  269. package/dist/schemas/local_history_operation.output.json +10 -10
  270. package/dist/schemas/local_info_operation.output.json +10 -10
  271. package/dist/schemas/local_mark_operation.output.json +10 -10
  272. package/dist/schemas/messenger_operation.output.json +10 -10
  273. package/dist/schemas/monitor_events.output.json +10 -10
  274. package/dist/schemas/monitor_subscription.output.json +10 -10
  275. package/dist/schemas/onchain_events.output.json +11 -11
  276. package/dist/schemas/onchain_operations.output.json +6369 -3736
  277. package/dist/schemas/onchain_operations.schema.json +48 -48
  278. package/dist/schemas/onchain_operations_allocation.schema.json +5 -5
  279. package/dist/schemas/onchain_operations_arbitration.schema.json +3 -3
  280. package/dist/schemas/onchain_operations_contact.schema.json +2 -2
  281. package/dist/schemas/onchain_operations_demand.schema.json +2 -2
  282. package/dist/schemas/onchain_operations_machine.schema.json +2 -2
  283. package/dist/schemas/onchain_operations_order.schema.json +2 -2
  284. package/dist/schemas/onchain_operations_payment.schema.json +2 -2
  285. package/dist/schemas/onchain_operations_permission.schema.json +2 -2
  286. package/dist/schemas/onchain_operations_progress.schema.json +2 -2
  287. package/dist/schemas/onchain_operations_repository.schema.json +2 -2
  288. package/dist/schemas/onchain_operations_reward.schema.json +6 -6
  289. package/dist/schemas/onchain_operations_service.schema.json +8 -8
  290. package/dist/schemas/onchain_operations_treasury.schema.json +10 -10
  291. package/dist/schemas/onchain_table_data.output.json +78 -84
  292. package/dist/schemas/query_toolkit.output.json +1087 -254
  293. package/dist/schemas/query_toolkit.schema.json +65 -3
  294. package/dist/strategy/collectors.js +1 -1
  295. package/dist/strategy/metrics.js +1 -1
  296. package/dist/task/playbook.js +1 -1
  297. package/dist/tools/handlers/bridge.js +1 -1
  298. package/dist/tools/handlers/config.js +1 -1
  299. package/dist/tools/handlers/dispatch-expectations.d.ts +3 -0
  300. package/dist/tools/handlers/dispatch-expectations.js +1 -0
  301. package/dist/tools/handlers/evaluation.js +1 -1
  302. package/dist/tools/handlers/evaluation.spec.js +1 -1
  303. package/dist/tools/handlers/onchain.js +1 -1
  304. package/dist/tools/handlers/query.js +1 -1
  305. package/dist/tools/index.js +1 -1
  306. package/dist/tools/registry/evaluation.d.ts +2 -0
  307. package/dist/tools/registry/evaluation.js +1 -0
  308. package/dist/tools/registry/monitor.js +1 -1
  309. package/dist/tools/registry/query.js +1 -1
  310. package/dist/tools/shared.d.ts +0 -1
  311. package/dist/tools/shared.js +1 -1
  312. package/dist/tools/wrap.js +1 -1
  313. package/package.json +4 -3
  314. package/dist/customer/customer-advice.d.ts +0 -32
  315. package/dist/customer/customer-advice.js +0 -1
  316. package/dist/customer/info-puzzle.d.ts +0 -146
  317. package/dist/customer/info-puzzle.js +0 -1
  318. package/dist/customer/order-strategy.d.ts +0 -17
  319. package/dist/customer/order-strategy.js +0 -1
  320. package/dist/customer/preorder-compare.d.ts +0 -24
  321. package/dist/customer/preorder-compare.js +0 -1
  322. package/dist/customer/reminder-system.d.ts +0 -42
  323. package/dist/customer/reminder-system.js +0 -1
  324. package/dist/customer/risk-assessment.d.ts +0 -13
  325. package/dist/customer/risk-assessment.js +0 -1
  326. package/dist/evaluation/builtins/service-risk.d.ts +0 -7
  327. package/dist/evaluation/builtins/service-risk.js +0 -1
  328. package/dist/knowledge/trust-metrics.d.ts +0 -66
  329. package/dist/knowledge/trust-metrics.js +0 -1
  330. package/dist/schema/trust/index.d.ts +0 -334
  331. package/dist/schema/trust/index.js +0 -1
  332. package/dist/schemas/trust_score.output.json +0 -847
  333. package/dist/schemas/trust_score.schema.json +0 -364
  334. package/dist/tools/handlers/trust.d.ts +0 -16
  335. package/dist/tools/handlers/trust.js +0 -1
  336. package/dist/tools/registry/trust.d.ts +0 -2
  337. package/dist/tools/registry/trust.js +0 -1
@@ -1 +1 @@
1
- import{describe,it,expect}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{buildViewport,runAnalyzers,runNodeAnalyzers,adaptNodeAnalyzer,listAnalyzers,registerAnalyzer}from'./index.js';const FAMILY={'eoa.permission':'R','permission.core_binding':'R','permission.entity':'W','service.order':'R','service.machine':'F','service.buy_guard':'F','machine.permission':'F','machine.node':'W','wf.transition':'W','wf.forward_guard':'W','order.allocation':'F','demand.guard':'R','demand.presenter':'R','arbitration.voting_guard':'F','arb.arbitration_service':'F','arb.voter':'S'};class GB{['nodes']=new Map();['edges']=[];['out']=new Map();['inc']=new Map();['truncations']=[];['eoa'](a){return this['nodes']['set'](a,{'id':a,'kind':'eoa','state':'fetched','origins':[],'depth':0x0}),this;}['obj'](a,b,c,d){return this['nodes']['set'](a,{'id':a,'kind':'object','objectType':b,'state':'fetched','origins':[],'depth':0x1,'raw':{'object':a,'type':b,...d?{'type_raw':d}:{},'data':c}}),this;}['edge'](a,b,c,d,f,g=![]){const h={'id':a+'|'+b+'→'+c+(d?.['forward']?'|'+d['forward']:''),'schema':a,'family':FAMILY[a]??'F','from':b,'to':c,'retention':f??(FAMILY[a]==='R'?'bounded_exact':'complete'),'evidence':'test','observedAt':0x1,...d?{'payload':d}:{},...g?{'truncated':!![]}:{}};return this['edges']['push'](h),(this['out']['get'](b)??this['out']['set'](b,[])['get'](b))['push'](h),(this['inc']['get'](c)??this['inc']['set'](c,[])['get'](c))['push'](h),h;}['trunc'](a,b,c){return this['truncations']['push']({'nodeId':a,'schema':b,'observed':c,'limit':0x1450}),this;}['build'](a='0xseed'){return{'network':ENTRYPOINT['Mainnet'],'seed':a,'builtAt':0x1,'nodes':this['nodes'],'edges':this['edges'],'out':this['out'],'inc':this['inc'],'gaps':[],'truncations':this['truncations'],'rpcReport':{'batches':0x0,'byChannel':{'objects':0x0,'keyedFields':0x0,'tables':0x0,'events':0x0},'dedupHits':0x0},'budgetExhausted':{}};}['vp'](a='0xseed',b='neutral'){return buildViewport(this['build'](a),a,b);}}const ids=a=>a['map'](b=>b['id']);describe('analyze\x20—\x20registry',()=>{it('ships\x20the\x2019\x20rules\x20(R1-6/A1-3/O1-3/G1-3\x20+\x20anti-cheat\x20AC1-4)',()=>{expect(listAnalyzers()['sort']())['toEqual'](['R1','R2','R3','R4','R5','R6','A1','A2','A3','O1','O2','O3','G1','G2','G3','AC1','AC2','AC3','AC4']['sort']());}),it('is\x20fail-soft:\x20a\x20throwing\x20analyzer\x20never\x20aborts\x20the\x20suite',()=>{registerAnalyzer({'id':'__boom','kind':'risk','run':()=>{throw new Error('boom');}});const a=new GB()['obj']('0xs1','Service',{'bPublished':!![],'setting_lock_duration':'0'})['vp'](),b=runAnalyzers(a,{'only':['__boom','R6']});expect(ids(b))['toContain']('R6:0xs1'),expect(b['find'](c=>c['id']['startsWith']('__boom')))['toBeUndefined']();}),it('adapts\x20single-object\x20legacy\x20rules\x20through\x20the\x20NodeAnalyzer\x20bridge',()=>{const a=adaptNodeAnalyzer({'id':'legacy-lock','kind':'risk','objectType':'Service','inspect':e=>{const f=e['raw']['data']??{};return f['setting_lock_duration']==='0'?[{'titleZh':'锁','detailZh':'d','suggestionZh':'s','roles':['merchant']}]:[];}}),b=new GB()['obj']('0xs1','Service',{'bPublished':!![],'setting_lock_duration':'0'})['vp'](),c=runNodeAnalyzers(b,[a]);expect(c)['toHaveLength'](0x1),expect(c[0x0]['id'])['toBe']('legacy-lock:0xs1#0'),expect(c[0x0]['kind'])['toBe']('risk');});}),describe('analyze\x20—\x20risk\x20rules',()=>{it('R6\x20flags\x20published\x20services\x20without\x20a\x20setting\x20lock',()=>{const a=new GB()['obj']('0xs1','Service',{'bPublished':!![],'setting_lock_duration':'0'})['obj']('0xs2','Service',{'bPublished':!![],'setting_lock_duration':'2592000000'})['obj']('0xs3','Service',{'bPublished':![],'setting_lock_duration':'0'})['vp'](),b=runAnalyzers(a,{'only':['R6']});expect(ids(b))['toEqual'](['R6:0xs1']);}),it('R2\x20measures\x20the\x20compensation\x20fund\x20against\x203x\x20windowed\x20order\x20volume',()=>{const a=new GB();a['obj']('0xs1','Service',{'bPublished':!![],'compensation_fund':'100'}),a['obj']('0xo1','Order',{'amount':'100'}),a['obj']('0xo2','Order',{'amount':'100'}),a['edge']('service.order','0xs1','0xo1',undefined,'bounded_window'),a['edge']('service.order','0xs1','0xo2',undefined,'bounded_window',!![]);const b=runAnalyzers(a['vp'](),{'only':['R2']});expect(b)['toHaveLength'](0x1),expect(b[0x0]['severity'])['toBe']('high'),expect(b[0x0]['confidence'])['toBe']('windowed'),expect(b[0x0]['window']?.['limit'])['toBe'](0x1450);}),it('R1\x20flags\x20one\x20EOA\x20controlling\x20a\x20shop\x20and\x20an\x20arbitration\x20service\x20across\x20distinct\x20permissions',()=>{const a=new GB();a['eoa']('0xe1'),a['obj']('0xp1','Permission',{'owner':'0xe1'}),a['obj']('0xp2','Permission',{'owner':'0xe1'}),a['obj']('0xs1','Service',{}),a['obj']('0xa1','Arbitration',{'fee':'0'}),a['edge']('eoa.permission','0xe1','0xp1',{'roleBits':0x3}),a['edge']('eoa.permission','0xe1','0xp2',{'roleBits':0x3}),a['edge']('permission.core_binding','0xp1','0xs1'),a['edge']('permission.core_binding','0xp2','0xa1');const b=runAnalyzers(a['vp'](),{'only':['R1']});expect(b)['toHaveLength'](0x1),expect(b[0x0]['severity'])['toBe']('high');const c=new GB();c['eoa']('0xe1')['obj']('0xp1','Permission',{})['obj']('0xs1','Service',{})['obj']('0xa1','Arbitration',{'fee':'0'}),c['edge']('eoa.permission','0xe1','0xp1',{'roleBits':0x3}),c['edge']('permission.core_binding','0xp1','0xs1'),c['edge']('permission.core_binding','0xp1','0xa1'),expect(runAnalyzers(c['vp'](),{'only':['R1']}))['toHaveLength'](0x0);}),it('R3\x20flags\x20concentrated\x20control\x20of\x20core\x20objects',()=>{const a=new GB();a['eoa']('0xe1')['obj']('0xp1','Permission',{}),a['obj']('0xs1','Service',{})['obj']('0xs2','Service',{})['obj']('0xm1','Machine',{}),a['edge']('eoa.permission','0xe1','0xp1',{'roleBits':0x1});for(const c of['0xs1','0xs2','0xm1'])a['edge']('permission.core_binding','0xp1',c);const b=runAnalyzers(a['vp'](),{'only':['R3']});expect(ids(b))['toEqual'](['R3:0xe1']);}),it('R4\x20flags\x20a\x20unique\x20operator\x20with\x20no\x20backup\x20guard\x20on\x20a\x20terminal-entering\x20forward',()=>{const a=new GB();a['obj']('0xm1','Machine',{'bPublished':!![]}),a['edge']('wf.transition','0xm1::node::paid','0xm1::node::delivered',{'node':'delivered','prevNode':'paid','forward':'go','namedOperator':'alice'});const b=runAnalyzers(a['vp'](),{'only':['R4']});expect(b)['toHaveLength'](0x1);const c=new GB();c['obj']('0xm1','Machine',{'bPublished':!![]}),c['edge']('wf.transition','0xm1::node::paid','0xm1::node::delivered',{'node':'delivered','prevNode':'paid','forward':'go','namedOperator':'alice','guard':'0xg1'}),expect(runAnalyzers(c['vp'](),{'only':['R4']}))['toHaveLength'](0x0);}),it('R5\x20reports\x20window\x20truncations\x20as\x20downgraded\x20meta\x20findings',()=>{const a=new GB()['obj']('0xs1','Service',{})['trunc']('0xs1','service.order',0x1450),b=runAnalyzers(a['vp'](),{'only':['R5']});expect(b)['toHaveLength'](0x1),expect(b[0x0]['confidence'])['toBe']('windowed'),expect(b[0x0]['window'])['toEqual']({'observed':0x1450,'limit':0x1450});});}),describe('analyze\x20—\x20arbitrage\x20rules',()=>{it('A1\x20detects\x20rate-basis\x20mismatch,\x20surplus\x20duplication\x20and\x20missing\x20max',()=>{const a=new GB();a['obj']('0xal1','Allocation',{'allocators':[{'guard':'0xg1','max':null,'sharing':[{'who':'0xa','mode':0x0,'sharing':'100'}]},{'guard':'0xg2','sharing':[{'who':'0xb','mode':0x1,'sharing':'9000'}]},{'guard':'0xg3','sharing':[{'who':'0xc','mode':0x2}]},{'guard':'0xg4','sharing':[{'who':'0xd','mode':0x2}]}]});const b=runAnalyzers(a['vp'](),{'only':['A1']});expect(b)['toHaveLength'](0x1),expect(b[0x0]['detailZh'])['toContain']('9000'),expect(b[0x0]['detailZh'])['toContain']('max'),expect(b[0x0]['detailZh'])['toContain']('Surplus');}),it('A2\x20flags\x20transferable\x20fixed\x20long-window\x20discounts\x20without\x20a\x20benchmark',()=>{const a=new GB();a['obj']('0xd1','Discount',{'discount_type':0x1,'benchmark':null,'transferable':!![],'time_start':'0','time_end':String(0x1fn*0x18n*0x3cn*0x3cn*0x3e8n)});const b=runAnalyzers(a['vp'](),{'only':['A2']});expect(b)['toHaveLength'](0x1);const c=new GB();c['obj']('0xd2','Discount',{'discount_type':0x1,'benchmark':null,'transferable':![],'time_start':'0','time_end':String(0x1fn*0x18n*0x3cn*0x3cn*0x3e8n)}),expect(runAnalyzers(c['vp'](),{'only':['A2']}))['toHaveLength'](0x0);}),it('A3\x20flags\x20zero-fee/no-usage-guard\x20arbitration\x20and\x20reports\x20CoinWrapper\x20custody',()=>{const a=new GB();a['obj']('0xa1','Arbitration',{'fee':'0','usage_guard':null,'voting_guard':[]}),a['obj']('0xcw1','Payment',{},'0x2::payment::CoinWrapper<0x2::wow::WOW>');const b=runAnalyzers(a['vp'](),{'only':['A3']});expect(ids(b)['sort']())['toEqual'](['A3:0xa1','A3:coinwrapper']),expect(b['find'](c=>c['id']==='A3:coinwrapper')['detailZh'])['toContain']('0x2::wow::WOW');});}),describe('analyze\x20—\x20opportunity\x20rules',()=>{it('O1\x20surfaces\x20scarce-presenter\x20demands\x20with\x20structurally\x20matching\x20services',()=>{const a=new GB();a['obj']('0xdm1','Demand',{'guards':[{'guard':'0xg1'}]}),a['edge']('demand.guard','0xdm1','0xg1'),a['obj']('0xs1','Service',{'bPublished':!![]}),a['obj']('0xm1','Machine',{}),a['edge']('service.machine','0xs1','0xm1'),a['edge']('wf.forward_guard','0xm1::node::paid','0xg1');const b=runAnalyzers(a['vp'](),{'only':['O1']});expect(b)['toHaveLength'](0x1),expect(b[0x0]['detailZh'])['toContain']('0xs1'),a['eoa']('0u1')['eoa']('0u2'),a['edge']('demand.presenter','0xdm1','0u1',{'service':'0xs1'}),a['edge']('demand.presenter','0xdm1','0u2',{'service':'0xs1'}),expect(runAnalyzers(a['vp'](),{'only':['O1']}))['toHaveLength'](0x0);}),it('O2\x20reports\x20graph\x20supply/demand\x20density',()=>{const a=new GB();a['obj']('0xs1','Service',{'bPublished':!![],'bPaused':![]}),a['obj']('0xs2','Service',{'bPublished':![]}),a['obj']('0xd1','Demand',{});const b=runAnalyzers(a['vp'](),{'only':['O2']});expect(b)['toHaveLength'](0x1),expect(b[0x0]['detailZh'])['toContain']('Service\x202'),expect(b[0x0]['detailZh'])['toContain']('开放需求\x201');}),it('O3\x20lists\x20operator-less\x20forwards\x20as\x20workflow\x20slots',()=>{const a=new GB();a['obj']('0xm1','Machine',{}),a['edge']('wf.transition','0xm1::node::paid','0xm1::node::done',{'node':'done','prevNode':'paid','forward':'auto','namedOperator':null,'permissionIndex':null,'guard':'0xg1'});const b=runAnalyzers(a['vp'](),{'only':['O3']});expect(b)['toHaveLength'](0x1),expect(b[0x0]['detailZh'])['toContain']('paid:auto');});}),describe('analyze\x20—\x20game\x20rules',()=>{it('G1\x20reports\x20all-vote\x20vs\x20weighted\x20structures\x20plus\x20observed\x20case\x20weights',()=>{const a=new GB();a['obj']('0xa1','Arbitration',{'fee':'0','voting_guard':[]}),a['obj']('0xcase1','Arb',{'voted':[{'voter':'0u1','weight':0x1},{'voter':'0u2','weight':0x2}]}),a['edge']('arb.arbitration_service','0xcase1','0xa1');const b=runAnalyzers(a['vp'](),{'only':['G1']});expect(b)['toHaveLength'](0x1),expect(b[0x0]['detailZh'])['toContain']('全员可投'),expect(b[0x0]['detailZh'])['toContain']('w1×1'),expect(b[0x0]['detailZh'])['toContain']('w2×1');}),it('G2\x20marks\x20a\x20named-operator\x20forward\x20as\x20a\x20pool-of-one\x20hold-up\x20point',()=>{const a=new GB();a['obj']('0xm1','Machine',{}),a['edge']('wf.transition','0xm1::node::paid','0xm1::node::done',{'node':'done','prevNode':'paid','forward':'sign','namedOperator':'bob'});const b=runAnalyzers(a['vp'](),{'only':['G2']});expect(b)['toHaveLength'](0x1),expect(b[0x0]['id'])['toContain']('paid:sign');}),it('G3\x20emits\x20the\x20relief\x20parameter\x20matrix\x20for\x20every\x20arbitration\x20service',()=>{const a=new GB();a['obj']('0xa1','Arbitration',{'fee':'5','usage_guard':'0xg1','voting_guard':[{'guard':'0xg2'}]});const b=runAnalyzers(a['vp'](),{'only':['G3']});expect(b)['toHaveLength'](0x1),expect(b[0x0]['detailZh'])['toContain']('fee=5'),expect(b[0x0]['detailZh'])['toContain']('30\x20天');});}),describe('analyze\x20—\x20anti-cheat\x20rules\x20(AC1-AC4)',()=>{function a(c,d,e,f){c['eoa'](d),c['edge']('eoa.permission',d,e,{'roleBits':0x1|0x2}),c['edge']('permission.core_binding',e,f);}function b(c,d,e,f){c['obj'](e,'Order',f),c['edge']('service.order',d,e,undefined,'bounded_window'),c['edge']('order.builder',e,String(f['builder']));}it('AC1\x20flags\x20window\x20orders\x20whose\x20buyer\x20controls\x20the\x20selling\x20Service',()=>{const c=new GB();c['obj']('0xs1','Service',{'bPublished':!![],'machine':'0xm1'}),a(c,'0u1','0p1','0xs1'),b(c,'0xs1','0o1',{'builder':'0u1','service':'0xs1','amount':'100'});const d=runAnalyzers(c['vp'](),{'only':['AC1']});expect(d)['toHaveLength'](0x1),expect(d[0x0]['severity'])['toBe']('high'),expect(d[0x0]['confidence'])['toBe']('windowed'),expect(d[0x0]['id'])['toContain']('0o1');const e=new GB();e['obj']('0xs1','Service',{'bPublished':!![],'machine':'0xm1'}),a(e,'0u1','0p1','0xs1'),b(e,'0xs1','0o1',{'builder':'0u2','service':'0xs1','amount':'100'}),expect(runAnalyzers(e['vp'](),{'only':['AC1']}))['toEqual']([]);}),it('AC2\x20flags\x20reciprocal\x20buying\x20between\x20two\x20controlled\x20Services',()=>{const c=new GB();c['obj']('0xs1','Service',{'bPublished':!![],'machine':'0xm1'}),c['obj']('0xs2','Service',{'bPublished':!![],'machine':'0xm2'}),a(c,'0u1','0p1','0xs1'),a(c,'0u2','0p2','0xs2'),b(c,'0xs1','0o1',{'builder':'0u2','service':'0xs1','amount':'100'}),b(c,'0xs2','0o2',{'builder':'0u1','service':'0xs2','amount':'100'});const d=runAnalyzers(c['vp'](),{'only':['AC2']});expect(d)['toHaveLength'](0x1),expect(d[0x0]['severity'])['toBe']('medium'),expect(d[0x0]['id'])['toContain']('0o1'),expect(d[0x0]['id'])['toContain']('0o2');}),it('AC3\x20flags\x20completed\x20positive-amount\x20orders\x20without\x20Allocation,\x20but\x20not\x20zero-amount\x20orders',()=>{const c=new GB();c['obj']('0xs1','Service',{'bPublished':!![],'machine':'0xm1'}),a(c,'0u1','0p1','0xs1'),b(c,'0xs1','0opaid',{'builder':'0u9','service':'0xs1','amount':'100'}),b(c,'0xs1','0ofree',{'builder':'0u8','service':'0xs1','amount':'0'});const d=runAnalyzers(c['vp'](),{'only':['AC3']});expect(d)['toHaveLength'](0x1),expect(d[0x0]['id'])['toContain']('0opaid'),expect(d[0x0]['id'])['not']['toContain']('0ofree'),c['edge']('order.allocation','0opaid','0al1'),expect(runAnalyzers(c['vp'](),{'only':['AC3']}))['toEqual']([]);}),it('AC4\x20surfaces\x20shell-merchant\x20shapes\x20only\x20for\x20published\x20Services',()=>{const c=new GB();c['obj']('0xs1','Service',{'bPublished':!![],'arbitrations':[],'compensation_fund':'0'});const d=runAnalyzers(c['vp'](),{'only':['AC4']});expect(ids(d)['sort']())['toEqual'](['AC4:0xs1:shell_no_arbitration','AC4:0xs1:shell_no_machine']['sort']());const e=new GB();e['obj']('0xs2','Service',{'bPublished':!![],'arbitrations':[],'compensation_fund':'500'});const f=runAnalyzers(e['vp'](),{'only':['AC4']});expect(f['map'](h=>h['severity'])['sort']())['toEqual'](['high','low','medium']['sort']());const g=new GB();g['obj']('0xs3','Service',{'bPublished':![],'arbitrations':[],'compensation_fund':'500'}),expect(runAnalyzers(g['vp'](),{'only':['AC4']}))['toEqual']([]);});});
1
+ import{describe,it,expect}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{buildViewport,runAnalyzers,runNodeAnalyzers,adaptNodeAnalyzer,listAnalyzers,registerAnalyzer,findingWhere}from'./index.js';describe('findingWhere',()=>{it('renders\x20R4\x20as\x20machine\x20+\x20node\x20names\x20(no\x20::node::\x20grammar,\x20no\x20R4:\x20prefix)',()=>{expect(findingWhere({'id':'R4:myshop_machine:myshop_machine::node::Order\x20Confirmed→myshop_machine::node::Order\x20Cancel'}))['toBe']('myshop_machine:\x20Order\x20Confirmed\x20→\x20Order\x20Cancel');}),it('renders\x20R7/R2\x20as\x20object\x20kind\x20+\x20name',()=>{expect(findingWhere({'id':'R7:reward:0x1f2e'}))['toBe']('Reward\x200x1f2e'),expect(findingWhere({'id':'R7:treasury:0xabc'}))['toBe']('Treasury\x200xabc'),expect(findingWhere({'id':'R2:0x14519d'}))['toBe']('0x14519d');}),it('falls\x20back\x20to\x20the\x20finding\x20title\x20for\x20unknown\x20id\x20shapes',()=>{expect(findingWhere({'id':'R1:weird','title':'Arb\x20permission\x20shared\x20with\x20the\x20merchant'}))['toBe']('Arb\x20permission\x20shared\x20with\x20the\x20merchant');});});const FAMILY={'eoa.permission':'R','permission.core_binding':'R','permission.entity':'W','service.order':'R','service.machine':'F','service.buy_guard':'F','machine.permission':'F','machine.node':'W','wf.transition':'W','wf.forward_guard':'W','order.allocation':'F','demand.guard':'R','demand.presenter':'R','arbitration.voting_guard':'F','arb.arbitration_service':'F','arb.voter':'S'};class GB{['nodes']=new Map();['edges']=[];['out']=new Map();['inc']=new Map();['truncations']=[];['eoa'](a){return this['nodes']['set'](a,{'id':a,'kind':'eoa','state':'fetched','origins':[],'depth':0x0}),this;}['obj'](a,b,c,d){return this['nodes']['set'](a,{'id':a,'kind':'object','objectType':b,'state':'fetched','origins':[],'depth':0x1,'raw':{'object':a,'type':b,...d?{'type_raw':d}:{},'data':c}}),this;}['edge'](a,b,c,d,f,g=![]){const h={'id':a+'|'+b+'→'+c+(d?.['forward']?'|'+d['forward']:''),'schema':a,'family':FAMILY[a]??'F','from':b,'to':c,'retention':f??(FAMILY[a]==='R'?'bounded_exact':'complete'),'evidence':'test','observedAt':0x1,...d?{'payload':d}:{},...g?{'truncated':!![]}:{}};return this['edges']['push'](h),(this['out']['get'](b)??this['out']['set'](b,[])['get'](b))['push'](h),(this['inc']['get'](c)??this['inc']['set'](c,[])['get'](c))['push'](h),h;}['trunc'](a,b,c){return this['truncations']['push']({'nodeId':a,'schema':b,'observed':c,'limit':0x1450}),this;}['build'](a='0xseed'){return{'network':ENTRYPOINT['Mainnet'],'seed':a,'builtAt':0x1,'nodes':this['nodes'],'edges':this['edges'],'out':this['out'],'inc':this['inc'],'gaps':[],'truncations':this['truncations'],'rpcReport':{'batches':0x0,'byChannel':{'objects':0x0,'keyedFields':0x0,'tables':0x0,'events':0x0},'dedupHits':0x0},'budgetExhausted':{}};}['vp'](a='0xseed',b='neutral'){return buildViewport(this['build'](a),a,b);}}const ids=a=>a['map'](b=>b['id']);describe('analyze\x20—\x20registry',()=>{it('ships\x20the\x2021\x20rules\x20(R1-7/A1-3/O1-3/G1-3\x20+\x20anti-cheat\x20AC1-4\x20+\x20proposal.gap)',()=>{expect(listAnalyzers()['sort']())['toEqual'](['R1','R2','R3','R4','R5','R6','R7','A1','A2','A3','O1','O2','O3','G1','G2','G3','AC1','AC2','AC3','AC4','proposal.gap']['sort']());}),it('is\x20fail-soft:\x20a\x20throwing\x20analyzer\x20never\x20aborts\x20the\x20suite',()=>{registerAnalyzer({'id':'__boom','kind':'risk','run':()=>{throw new Error('boom');}});const a=new GB()['obj']('0xs1','Service',{'bPublished':!![],'setting_lock_duration':'0'})['vp'](),b=runAnalyzers(a,{'only':['__boom','R6']});expect(ids(b))['toContain']('R6:0xs1'),expect(b['find'](c=>c['id']['startsWith']('__boom')))['toBeUndefined']();}),it('adapts\x20single-object\x20legacy\x20rules\x20through\x20the\x20NodeAnalyzer\x20bridge',()=>{const a=adaptNodeAnalyzer({'id':'legacy-lock','kind':'risk','objectType':'Service','inspect':e=>{const f=e['raw']['data']??{};return f['setting_lock_duration']==='0'?[{'title':'Lock','detail':'d','suggestion':'s','roles':['merchant']}]:[];}}),b=new GB()['obj']('0xs1','Service',{'bPublished':!![],'setting_lock_duration':'0'})['vp'](),c=runNodeAnalyzers(b,[a]);expect(c)['toHaveLength'](0x1),expect(c[0x0]['id'])['toBe']('legacy-lock:0xs1#0'),expect(c[0x0]['kind'])['toBe']('risk');});}),describe('analyze\x20—\x20risk\x20rules',()=>{it('R6\x20flags\x20published\x20services\x20without\x20a\x20setting\x20lock',()=>{const a=new GB()['obj']('0xs1','Service',{'bPublished':!![],'setting_lock_duration':'0'})['obj']('0xs2','Service',{'bPublished':!![],'setting_lock_duration':'2592000000'})['obj']('0xs3','Service',{'bPublished':![],'setting_lock_duration':'0'})['vp'](),b=runAnalyzers(a,{'only':['R6']});expect(ids(b))['toEqual'](['R6:0xs1']);}),it('R7\x20emits\x20CRITICAL\x20for\x20object\x20users\x20when\x20a\x20Treasury\x20has\x20mounted\x20external\x20withdraw\x20Guards',()=>{const a=new GB();a['obj']('0xt1','Treasury',{'external_withdraw_guard':[{'guard':'0xg1','identifier':0x0,'store_from_id':0x0}]}),a['obj']('0xt2','Treasury',{'external_withdraw_guard':[]});const b=runAnalyzers(a['vp'](),{'only':['R7']});expect(ids(b))['toEqual'](['R7:treasury:0xt1']),expect(b[0x0]['severity'])['toBe']('critical'),expect(b[0x0]['detail'])['toContain']('code\x2010');}),it('R7\x20emits\x20CRITICAL\x20for\x20object\x20users\x20when\x20a\x20Reward\x20has\x20mounted\x20claim\x20Guards',()=>{const a=new GB();a['obj']('0xr1','Reward',{'guards':[{'guard':'0xg1'}]}),a['obj']('0xr2','Reward',{'guards':[]});const b=runAnalyzers(a['vp'](),{'only':['R7']});expect(ids(b))['toEqual'](['R7:reward:0xr1']),expect(b[0x0]['severity'])['toBe']('critical'),expect(b[0x0]['detail'])['toContain']('GuardIdentifier');}),it('R2\x20measures\x20the\x20compensation\x20fund\x20against\x203x\x20windowed\x20order\x20volume',()=>{const a=new GB();a['obj']('0xs1','Service',{'bPublished':!![],'compensation_fund':'100'}),a['obj']('0xo1','Order',{'amount':'100'}),a['obj']('0xo2','Order',{'amount':'100'}),a['edge']('service.order','0xs1','0xo1',undefined,'bounded_window'),a['edge']('service.order','0xs1','0xo2',undefined,'bounded_window',!![]);const b=runAnalyzers(a['vp'](),{'only':['R2']});expect(b)['toHaveLength'](0x1),expect(b[0x0]['severity'])['toBe']('high'),expect(b[0x0]['confidence'])['toBe']('windowed'),expect(b[0x0]['window']?.['limit'])['toBe'](0x1450);}),it('R1\x20flags\x20one\x20EOA\x20controlling\x20a\x20shop\x20and\x20an\x20arbitration\x20service\x20across\x20distinct\x20permissions',()=>{const a=new GB();a['eoa']('0xe1'),a['obj']('0xp1','Permission',{'owner':'0xe1'}),a['obj']('0xp2','Permission',{'owner':'0xe1'}),a['obj']('0xs1','Service',{}),a['obj']('0xa1','Arbitration',{'fee':'0'}),a['edge']('eoa.permission','0xe1','0xp1',{'roleBits':0x3}),a['edge']('eoa.permission','0xe1','0xp2',{'roleBits':0x3}),a['edge']('permission.core_binding','0xp1','0xs1'),a['edge']('permission.core_binding','0xp2','0xa1');const b=runAnalyzers(a['vp'](),{'only':['R1']});expect(b)['toHaveLength'](0x1),expect(b[0x0]['severity'])['toBe']('high');const c=new GB();c['eoa']('0xe1')['obj']('0xp1','Permission',{})['obj']('0xs1','Service',{})['obj']('0xa1','Arbitration',{'fee':'0'}),c['edge']('eoa.permission','0xe1','0xp1',{'roleBits':0x3}),c['edge']('permission.core_binding','0xp1','0xs1'),c['edge']('permission.core_binding','0xp1','0xa1'),expect(runAnalyzers(c['vp'](),{'only':['R1']}))['toHaveLength'](0x0);}),it('R3\x20flags\x20concentrated\x20control\x20of\x20core\x20objects',()=>{const a=new GB();a['eoa']('0xe1')['obj']('0xp1','Permission',{}),a['obj']('0xs1','Service',{})['obj']('0xs2','Service',{})['obj']('0xm1','Machine',{}),a['edge']('eoa.permission','0xe1','0xp1',{'roleBits':0x1});for(const c of['0xs1','0xs2','0xm1'])a['edge']('permission.core_binding','0xp1',c);const b=runAnalyzers(a['vp'](),{'only':['R3']});expect(ids(b))['toEqual'](['R3:0xe1']);}),it('R4\x20flags\x20a\x20unique\x20operator\x20with\x20no\x20backup\x20guard\x20on\x20a\x20terminal-entering\x20forward',()=>{const a=new GB();a['obj']('0xm1','Machine',{'bPublished':!![]}),a['edge']('wf.transition','0xm1::node::paid','0xm1::node::delivered',{'node':'delivered','prevNode':'paid','forward':'go','namedOperator':'alice'});const b=runAnalyzers(a['vp'](),{'only':['R4']});expect(b)['toHaveLength'](0x1);const c=new GB();c['obj']('0xm1','Machine',{'bPublished':!![]}),c['edge']('wf.transition','0xm1::node::paid','0xm1::node::delivered',{'node':'delivered','prevNode':'paid','forward':'go','namedOperator':'alice','guard':'0xg1'}),expect(runAnalyzers(c['vp'](),{'only':['R4']}))['toHaveLength'](0x0);}),it('R5\x20reports\x20window\x20truncations\x20as\x20downgraded\x20meta\x20findings',()=>{const a=new GB()['obj']('0xs1','Service',{})['trunc']('0xs1','service.order',0x1450),b=runAnalyzers(a['vp'](),{'only':['R5']});expect(b)['toHaveLength'](0x1),expect(b[0x0]['confidence'])['toBe']('windowed'),expect(b[0x0]['window'])['toEqual']({'observed':0x1450,'limit':0x1450});});}),describe('analyze\x20—\x20arbitrage\x20rules',()=>{it('A1\x20detects\x20rate-basis\x20mismatch,\x20surplus\x20duplication\x20and\x20missing\x20max',()=>{const a=new GB();a['obj']('0xal1','Allocation',{'allocators':[{'guard':'0xg1','max':null,'sharing':[{'who':'0xa','mode':0x0,'sharing':'100'}]},{'guard':'0xg2','sharing':[{'who':'0xb','mode':0x1,'sharing':'9000'}]},{'guard':'0xg3','sharing':[{'who':'0xc','mode':0x2}]},{'guard':'0xg4','sharing':[{'who':'0xd','mode':0x2}]}]});const b=runAnalyzers(a['vp'](),{'only':['A1']});expect(b)['toHaveLength'](0x1),expect(b[0x0]['detail'])['toContain']('9000'),expect(b[0x0]['detail'])['toContain']('max'),expect(b[0x0]['detail'])['toContain']('Surplus');}),it('A2\x20flags\x20transferable\x20fixed\x20long-window\x20discounts\x20without\x20a\x20benchmark',()=>{const a=new GB();a['obj']('0xd1','Discount',{'discount_type':0x1,'benchmark':null,'transferable':!![],'time_start':'0','time_end':String(0x1fn*0x18n*0x3cn*0x3cn*0x3e8n)});const b=runAnalyzers(a['vp'](),{'only':['A2']});expect(b)['toHaveLength'](0x1);const c=new GB();c['obj']('0xd2','Discount',{'discount_type':0x1,'benchmark':null,'transferable':![],'time_start':'0','time_end':String(0x1fn*0x18n*0x3cn*0x3cn*0x3e8n)}),expect(runAnalyzers(c['vp'](),{'only':['A2']}))['toHaveLength'](0x0);}),it('A3\x20flags\x20zero-fee/no-usage-guard\x20arbitration\x20and\x20reports\x20CoinWrapper\x20custody',()=>{const a=new GB();a['obj']('0xa1','Arbitration',{'fee':'0','usage_guard':null,'voting_guard':[]}),a['obj']('0xcw1','Payment',{},'0x2::payment::CoinWrapper<0x2::wow::WOW>');const b=runAnalyzers(a['vp'](),{'only':['A3']});expect(ids(b)['sort']())['toEqual'](['A3:0xa1','A3:coinwrapper']),expect(b['find'](c=>c['id']==='A3:coinwrapper')['detail'])['toContain']('0x2::wow::WOW');});}),describe('analyze\x20—\x20opportunity\x20rules',()=>{it('O1\x20surfaces\x20scarce-presenter\x20demands\x20with\x20structurally\x20matching\x20services',()=>{const a=new GB();a['obj']('0xdm1','Demand',{'guards':[{'guard':'0xg1'}]}),a['edge']('demand.guard','0xdm1','0xg1'),a['obj']('0xs1','Service',{'bPublished':!![]}),a['obj']('0xm1','Machine',{}),a['edge']('service.machine','0xs1','0xm1'),a['edge']('wf.forward_guard','0xm1::node::paid','0xg1');const b=runAnalyzers(a['vp'](),{'only':['O1']});expect(b)['toHaveLength'](0x1),expect(b[0x0]['detail'])['toContain']('0xs1'),a['eoa']('0u1')['eoa']('0u2'),a['edge']('demand.presenter','0xdm1','0u1',{'service':'0xs1'}),a['edge']('demand.presenter','0xdm1','0u2',{'service':'0xs1'}),expect(runAnalyzers(a['vp'](),{'only':['O1']}))['toHaveLength'](0x0);}),it('O2\x20reports\x20graph\x20supply/demand\x20density',()=>{const a=new GB();a['obj']('0xs1','Service',{'bPublished':!![],'bPaused':![]}),a['obj']('0xs2','Service',{'bPublished':![]}),a['obj']('0xd1','Demand',{});const b=runAnalyzers(a['vp'](),{'only':['O2']});expect(b)['toHaveLength'](0x1),expect(b[0x0]['detail'])['toContain']('2\x20Service(s)'),expect(b[0x0]['detail'])['toContain']('1\x20open\x20demand(s)');}),it('O3\x20lists\x20operator-less\x20forwards\x20as\x20workflow\x20slots',()=>{const a=new GB();a['obj']('0xm1','Machine',{}),a['edge']('wf.transition','0xm1::node::paid','0xm1::node::done',{'node':'done','prevNode':'paid','forward':'auto','namedOperator':null,'permissionIndex':null,'guard':'0xg1'});const b=runAnalyzers(a['vp'](),{'only':['O3']});expect(b)['toHaveLength'](0x1),expect(b[0x0]['detail'])['toContain']('paid:auto');});}),describe('analyze\x20—\x20game\x20rules',()=>{it('G1\x20reports\x20all-vote\x20vs\x20weighted\x20structures\x20plus\x20observed\x20case\x20weights',()=>{const a=new GB();a['obj']('0xa1','Arbitration',{'fee':'0','voting_guard':[]}),a['obj']('0xcase1','Arb',{'voted':[{'voter':'0u1','weight':0x1},{'voter':'0u2','weight':0x2}]}),a['edge']('arb.arbitration_service','0xcase1','0xa1');const b=runAnalyzers(a['vp'](),{'only':['G1']});expect(b)['toHaveLength'](0x1),expect(b[0x0]['detail'])['toContain']('open\x20to\x20all\x20members'),expect(b[0x0]['detail'])['toContain']('w1x1'),expect(b[0x0]['detail'])['toContain']('w2x1');}),it('G2\x20marks\x20a\x20named-operator\x20forward\x20as\x20a\x20pool-of-one\x20hold-up\x20point',()=>{const a=new GB();a['obj']('0xm1','Machine',{}),a['edge']('wf.transition','0xm1::node::paid','0xm1::node::done',{'node':'done','prevNode':'paid','forward':'sign','namedOperator':'bob'});const b=runAnalyzers(a['vp'](),{'only':['G2']});expect(b)['toHaveLength'](0x1),expect(b[0x0]['id'])['toContain']('paid:sign');}),it('G3\x20emits\x20the\x20relief\x20parameter\x20matrix\x20for\x20every\x20arbitration\x20service',()=>{const a=new GB();a['obj']('0xa1','Arbitration',{'fee':'5','usage_guard':'0xg1','voting_guard':[{'guard':'0xg2'}]});const b=runAnalyzers(a['vp'](),{'only':['G3']});expect(b)['toHaveLength'](0x1),expect(b[0x0]['detail'])['toContain']('fee=5'),expect(b[0x0]['detail'])['toContain']('30-day');});}),describe('analyze\x20—\x20anti-cheat\x20rules\x20(AC1-AC4)',()=>{function a(c,d,e,f){c['eoa'](d),c['edge']('eoa.permission',d,e,{'roleBits':0x1|0x2}),c['edge']('permission.core_binding',e,f);}function b(c,d,e,f){c['obj'](e,'Order',f),c['edge']('service.order',d,e,undefined,'bounded_window'),c['edge']('order.builder',e,String(f['builder']));}it('AC1\x20flags\x20window\x20orders\x20whose\x20buyer\x20controls\x20the\x20selling\x20Service',()=>{const c=new GB();c['obj']('0xs1','Service',{'bPublished':!![],'machine':'0xm1'}),a(c,'0u1','0p1','0xs1'),b(c,'0xs1','0o1',{'builder':'0u1','service':'0xs1','amount':'100'});const d=runAnalyzers(c['vp'](),{'only':['AC1']});expect(d)['toHaveLength'](0x1),expect(d[0x0]['severity'])['toBe']('high'),expect(d[0x0]['confidence'])['toBe']('windowed'),expect(d[0x0]['id'])['toContain']('0o1');const e=new GB();e['obj']('0xs1','Service',{'bPublished':!![],'machine':'0xm1'}),a(e,'0u1','0p1','0xs1'),b(e,'0xs1','0o1',{'builder':'0u2','service':'0xs1','amount':'100'}),expect(runAnalyzers(e['vp'](),{'only':['AC1']}))['toEqual']([]);}),it('AC2\x20flags\x20reciprocal\x20buying\x20between\x20two\x20controlled\x20Services',()=>{const c=new GB();c['obj']('0xs1','Service',{'bPublished':!![],'machine':'0xm1'}),c['obj']('0xs2','Service',{'bPublished':!![],'machine':'0xm2'}),a(c,'0u1','0p1','0xs1'),a(c,'0u2','0p2','0xs2'),b(c,'0xs1','0o1',{'builder':'0u2','service':'0xs1','amount':'100'}),b(c,'0xs2','0o2',{'builder':'0u1','service':'0xs2','amount':'100'});const d=runAnalyzers(c['vp'](),{'only':['AC2']});expect(d)['toHaveLength'](0x1),expect(d[0x0]['severity'])['toBe']('medium'),expect(d[0x0]['id'])['toContain']('0o1'),expect(d[0x0]['id'])['toContain']('0o2');}),it('AC3\x20flags\x20completed\x20positive-amount\x20orders\x20without\x20Allocation,\x20but\x20not\x20zero-amount\x20orders',()=>{const c=new GB();c['obj']('0xs1','Service',{'bPublished':!![],'machine':'0xm1'}),a(c,'0u1','0p1','0xs1'),b(c,'0xs1','0opaid',{'builder':'0u9','service':'0xs1','amount':'100'}),b(c,'0xs1','0ofree',{'builder':'0u8','service':'0xs1','amount':'0'});const d=runAnalyzers(c['vp'](),{'only':['AC3']});expect(d)['toHaveLength'](0x1),expect(d[0x0]['id'])['toContain']('0opaid'),expect(d[0x0]['id'])['not']['toContain']('0ofree'),c['edge']('order.allocation','0opaid','0al1'),expect(runAnalyzers(c['vp'](),{'only':['AC3']}))['toEqual']([]);}),it('AC4\x20surfaces\x20shell-merchant\x20shapes\x20only\x20for\x20published\x20Services',()=>{const c=new GB();c['obj']('0xs1','Service',{'bPublished':!![],'arbitrations':[],'compensation_fund':'0'});const d=runAnalyzers(c['vp'](),{'only':['AC4']});expect(ids(d)['sort']())['toEqual'](['AC4:0xs1:shell_no_arbitration','AC4:0xs1:shell_no_machine']['sort']());const e=new GB();e['obj']('0xs2','Service',{'bPublished':!![],'arbitrations':[],'compensation_fund':'500'});const f=runAnalyzers(e['vp'](),{'only':['AC4']});expect(f['map'](h=>h['severity'])['sort']())['toEqual'](['high','low','medium']['sort']());const g=new GB();g['obj']('0xs3','Service',{'bPublished':![],'arbitrations':[],'compensation_fund':'500'}),expect(runAnalyzers(g['vp'](),{'only':['AC4']}))['toEqual']([]);});});
@@ -10,7 +10,7 @@ export interface FakePlaneState {
10
10
  tables: Map<string, TableItem[]>;
11
11
  events: Map<string, {
12
12
  events: unknown[];
13
- cursor?: EventCursor | null;
13
+ fail?: boolean;
14
14
  }[]>;
15
15
  }
16
16
  export declare class FakeDataPlane implements DataPlane {
@@ -1 +1 @@
1
- export const MAX_OBJECTS_PER_QUERY=0x32;export const DEFAULT_BUDGET={'maxDepth':0x4,'maxNodes':0x1f4,'maxFanoutPerNode':0x3c,'maxRpcs':0x78,'maxEventPages':0x64,'perKindCaps':{'service.order':0xc8,'eoa.order':0x64,'target.vote':0x64,'machine.node':0x64,'permission.core_binding':0x3c,'permission.entity':0x3c,'service.arbitration':0x14,'service.reward':0x14,'service.repository':0x64,'arb.voter':0xc8,'payment.recipient':0xc8},'concurrency':0x4};export function mergeBudget(a){return{...DEFAULT_BUDGET,...a,'perKindCaps':{...DEFAULT_BUDGET['perKindCaps'],...a?.['perKindCaps']}};}export async function mapPool(a,b,c){const d=new Array(a['length']);let e=0x0;const f=Array['from']({'length':Math['max'](0x1,Math['min'](b,a['length']||0x1))},async()=>{for(;;){const g=e++;if(g>=a['length'])return;d[g]=await c(a[g],g);}});return await Promise['all'](f),d;}export function chunk50(a){const b=[];for(let c=0x0;c<a['length'];c+=MAX_OBJECTS_PER_QUERY)b['push'](a['slice'](c,c+MAX_OBJECTS_PER_QUERY));return b;}export class FakeDataPlane{['state'];['batches']={'objects':0x0,'keyedFields':0x0,'tables':0x0,'events':0x0};['dedupHits']=0x0;['seenObjects']=new Set();['seenKeyed']=new Set();constructor(a){this['state']={'objects':new Map(a?.['objects']??[]),'keyedFields':a?.['keyedFields']??new Map(),'tables':a?.['tables']??new Map(),'events':a?.['events']??new Map()};}async['getObjects'](a){const b=[...new Set(a['map'](e=>e['toLowerCase']()))],c=[],d=new Map();for(const e of b){if(this['seenObjects']['has'](e)){this['dedupHits']++;const f=lookupLower(this['state']['objects'],e);if(f)d['set'](e,f);}else this['seenObjects']['add'](e),c['push'](e);}for(const g of chunk50(c)){this['batches']['objects']++;for(const h of g){const i=lookupLower(this['state']['objects'],h);if(i)d['set'](h,i);}}return d;}async['getKeyedFields'](a,b,c){const d=this['state']['keyedFields']['get'](a)??new Map(),e=[...new Set(b['map'](g=>String(g)['toLowerCase']()))],f=new Map();for(const g of chunk50(e)){this['batches']['keyedFields']++;for(const h of g){const i=a+'|'+(c?.['keyType']??'address')+'|'+h;if(this['seenKeyed']['has'](i))this['dedupHits']++;this['seenKeyed']['add'](i);const j=lookupLower(d,h);if(j!=null)f['set'](h,typeof j==='object'&&j&&'data'in j?j:{'data':j});}}return f;}async['getTable'](a,b){this['batches']['tables']++;const c=this['state']['tables']['get'](a['toLowerCase']())??[],d=b?.['maxItems'],e=d!=null&&c['length']>d?c['slice'](0x0,d):c,f=b?.['fetchValues']===![]?e['map'](({key:g,objectId:h})=>({'key':g,'objectId':h})):e;return{'items':f,'truncated':d!=null&&c['length']>d};}async['getEvents'](a,b){this['batches']['events']++;const c=this['state']['events']['get'](a)??[],d=c[c['length']-0x1];return{'events':d?.['events']??[],'cursor':d?.['cursor']??null,'truncated':![]};}}function lookupLower(a,b){const c=a['get'](b);if(c!==undefined)return c;for(const [d,e]of a)if(d['toLowerCase']()===b)return e;return undefined;}
1
+ export const MAX_OBJECTS_PER_QUERY=0x32;export const DEFAULT_BUDGET={'maxDepth':0x4,'maxNodes':0x1f4,'maxFanoutPerNode':0x3c,'maxRpcs':0x78,'maxEventPages':0x64,'perKindCaps':{'service.order':0xc8,'eoa.order':0x64,'target.vote':0x64,'machine.node':0x64,'permission.core_binding':0x3c,'permission.entity':0x3c,'service.arbitration':0x14,'service.reward':0x14,'service.repository':0x64,'arb.voter':0xc8,'payment.recipient':0xc8,'treasury.record':0xc8,'reward.claim':0xc8,'repository.data_about':0x64,'service.order_history':0xc8,'eoa.order_history':0x64,'arb.history':0xc8},'concurrency':0x4};export function mergeBudget(a){return{...DEFAULT_BUDGET,...a,'perKindCaps':{...DEFAULT_BUDGET['perKindCaps'],...a?.['perKindCaps']}};}export async function mapPool(a,b,c){const d=new Array(a['length']);let e=0x0;const f=Array['from']({'length':Math['max'](0x1,Math['min'](b,a['length']||0x1))},async()=>{for(;;){const g=e++;if(g>=a['length'])return;d[g]=await c(a[g],g);}});return await Promise['all'](f),d;}export function chunk50(a){const b=[];for(let c=0x0;c<a['length'];c+=MAX_OBJECTS_PER_QUERY)b['push'](a['slice'](c,c+MAX_OBJECTS_PER_QUERY));return b;}export class FakeDataPlane{['state'];['batches']={'objects':0x0,'keyedFields':0x0,'tables':0x0,'events':0x0};['dedupHits']=0x0;['seenObjects']=new Set();['seenKeyed']=new Set();constructor(a){this['state']={'objects':new Map(a?.['objects']??[]),'keyedFields':a?.['keyedFields']??new Map(),'tables':a?.['tables']??new Map(),'events':a?.['events']??new Map()};}async['getObjects'](a){const b=[...new Set(a['map'](e=>e['toLowerCase']()))],c=[],d=new Map();for(const e of b){if(this['seenObjects']['has'](e)){this['dedupHits']++;const f=lookupLower(this['state']['objects'],e);if(f)d['set'](e,f);}else this['seenObjects']['add'](e),c['push'](e);}for(const g of chunk50(c)){this['batches']['objects']++;for(const h of g){const i=lookupLower(this['state']['objects'],h);if(i)d['set'](h,i);}}return d;}async['getKeyedFields'](a,b,c){const d=this['state']['keyedFields']['get'](a)??new Map(),e=[...new Set(b['map'](g=>String(g)['toLowerCase']()))],f=new Map();for(const g of chunk50(e)){this['batches']['keyedFields']++;for(const h of g){const i=a+'|'+(c?.['keyType']??'address')+'|'+h;if(this['seenKeyed']['has'](i))this['dedupHits']++;this['seenKeyed']['add'](i);const j=lookupLower(d,h);if(j!=null)f['set'](h,typeof j==='object'&&j&&'data'in j?j:{'data':j});}}return f;}async['getTable'](a,b){this['batches']['tables']++;const c=this['state']['tables']['get'](a['toLowerCase']())??[],d=b?.['maxItems'],e=d!=null&&c['length']>d?c['slice'](0x0,d):c,f=b?.['fetchValues']===![]?e['map'](({key:g,objectId:h})=>({'key':g,'objectId':h})):e;return{'items':f,'truncated':d!=null&&c['length']>d};}async['getEvents'](a,b){const c=this['state']['events']['get'](a)??[],d=j=>({'eventSeq':String(j),'txDigest':'fake'+j});let e=b?.['cursor']?Number(b['cursor']['eventSeq']):c['length']-0x1;if(!Number['isFinite'](e))e=c['length']-0x1;if(c['length']===0x0)return{'events':[],'cursor':null,'truncated':![]};if(c[e]?.['fail']){this['batches']['events']++;throw new Error('event\x20channel\x20failed:\x20'+a);}const f=b?.['maxPages']??0x1,g=[];let h=0x0;for(;e>=0x0&&h<f;e--,h++){this['batches']['events']++,g['push'](...c[e]?.['events']??[]);}const i=e>=0x0;return{'events':g,'cursor':e>=0x0?d(e):null,'truncated':i};}}function lookupLower(a,b){const c=a['get'](b);if(c!==undefined)return c;for(const [d,e]of a)if(d['toLowerCase']()===b)return e;return undefined;}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ import{describe,expect,it}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'./dataplane.js';import{expandTopology}from'./expand.js';import{extractObjectEdges,inferObjectType}from'./extract.js';import{FULL,fullServiceObjects,fullServiceState}from'./fixtures.js';import{COVERED_OBJECT_TYPES,EDGE_SCHEMA_BY_ID,outgoingSchemaIds}from'./edge-schema.js';function rawByAddress(a){const b=fullServiceObjects()['find'](c=>c['object']===a);if(!b)throw new Error('fixture\x20object\x20missing:\x20'+a);return b;}function refsOf(a,b,c){const d=extractObjectEdges(a,b)['find'](e=>e['schemaId']===c);return d?.['refs']??[];}describe('Task\x206\x20field-edge\x20batch\x20—\x20extraction\x20on\x20golden\x20fixtures\x20(TR-6.1)',()=>{it('order.required_info\x20→\x20the\x20WTS\x20proof\x20/\x20IM\x20credential',()=>{expect(refsOf('Order',rawByAddress(FULL['o1']),'order.required_info')['map'](a=>a['to']))['toEqual']([FULL['proof1']]);}),it('discount.service\x20→\x20the\x20issuing\x20shop',()=>{expect(refsOf('Discount',rawByAddress(FULL['disc']),'discount.service')['map'](a=>a['to']))['toEqual']([FULL['svc']]);}),it('progress.context_repository\x20→\x20runtime\x20evidence\x20repositories',()=>{expect(refsOf('Progress',rawByAddress(FULL['pr1']),'progress.context_repository')['map'](a=>a['to']))['toEqual']([FULL['repo']]);}),it('allocation.payment\x20→\x20payment\x20receipts',()=>{expect(refsOf('Allocation',rawByAddress(FULL['alloc']),'allocation.payment')['map'](a=>a['to']))['toEqual']([FULL['pay1'],FULL['pay2']]);}),it('allocation\x20payment_info\x20→\x20M\x20routing\x20object/guard\x20with\x20coin\x20type',()=>{const a=refsOf('Allocation',rawByAddress(FULL['alloc']),'allocation.for_object'),b=refsOf('Allocation',rawByAddress(FULL['alloc']),'allocation.for_guard');expect(a['map'](c=>c['to']))['toEqual']([FULL['o1']]),expect(a[0x0]['payload']?.['coinType'])['toContain']('USDT'),expect(b['map'](c=>c['to']))['toEqual']([FULL['gAlloc']]),expect(b[0x0]['payload']?.['coinType'])['toContain']('USDT');}),it('repository.um\x20/\x20permission.owner\x20/\x20permission.um\x20/\x20treasury.um',()=>{expect(refsOf('Repository',rawByAddress(FULL['repo']),'repository.um')['map'](a=>a['to']))['toEqual']([FULL['ctRepo']]),expect(refsOf('Permission',rawByAddress(FULL['perm']),'permission.owner')['map'](a=>a['to']))['toEqual']([FULL['merchant']]),expect(refsOf('Permission',rawByAddress(FULL['perm']),'permission.um')['map'](a=>a['to']))['toEqual']([FULL['ctShop']]),expect(refsOf('Treasury',rawByAddress(FULL['tres']),'treasury.um')['map'](a=>a['to']))['toEqual']([FULL['ctT']]);}),it('payment.signer\x20→\x20the\x20payer\x20EOA',()=>{expect(refsOf('Payment',rawByAddress(FULL['pay1']),'payment.signer')['map'](a=>a['to']))['toEqual']([FULL['buyer']]);}),it('passport.impack\x20→\x20packed\x20business\x20objects',()=>{expect(refsOf('Passport',rawByAddress(FULL['pp']),'passport.impack')['map'](a=>a['to']))['toEqual']([FULL['o1']]);}),it('passport.ticket_relies\x20→\x20sub-guards\x20nested\x20under\x20guard[].relies[]',()=>{expect(refsOf('Passport',rawByAddress(FULL['pp']),'passport.ticket_relies')['map'](a=>a['to']))['toEqual']([FULL['gSub']]);}),it('contact.im\x20→\x20member\x20EOA\x20with\x20roster\x20payload\x20(status/join_time/description)',()=>{const a=refsOf('Contact',rawByAddress(FULL['ctShop']),'contact.im');expect(a['map'](b=>b['to']))['toEqual']([FULL['member']]),expect(a[0x0]['payload'])['toMatchObject']({'imStatus':'active','joinTime':0x18bcfe56800,'imDescription':'ops\x20im'});});}),describe('Task\x206\x20field-edge\x20batch\x20—\x20empty\x20values\x20produce\x20no\x20edges\x20(TR-6.1)',()=>{it('bare\x20order\x20/\x20progress\x20have\x20no\x20required_info\x20/\x20context_repository\x20edges',()=>{expect(refsOf('Order',rawByAddress(FULL['o2']),'order.required_info'))['toEqual']([]),expect(refsOf('Progress',rawByAddress(FULL['pr2']),'progress.context_repository'))['toEqual']([]);}),it('empty\x20roster\x20/\x20ticket\x20vectors\x20produce\x20no\x20edges',()=>{const a={'object':FULL['ctMac'],'type':'Contact','data':{'permission':FULL['perm'],'ims':[]}};expect(refsOf('Contact',a,'contact.im'))['toEqual']([]);const b={'object':FULL['pp'],'type':'Passport','data':{'signer':FULL['buyer'],'guard':[{'guard':FULL['gVote'],'relies':[]}],'impack':[]}};expect(refsOf('Passport',b,'passport.ticket_relies'))['toEqual']([]),expect(refsOf('Passport',b,'passport.impack'))['toEqual']([]);}),it('allocation\x20without\x20payment_info\x20/\x20payment\x20receipts\x20has\x20neither\x20edge',()=>{const a={'object':FULL['alloc'],'type':'Allocation','data':{'allocators':{'allocators':[]}}};expect(refsOf('Allocation',a,'allocation.payment'))['toEqual']([]),expect(refsOf('Allocation',a,'allocation.for_object'))['toEqual']([]),expect(refsOf('Allocation',a,'allocation.for_guard'))['toEqual']([]);});}),describe('Task\x206\x20field-edge\x20batch\x20—\x20end-to-end\x20expansion\x20from\x20the\x20shop\x20seed',()=>{const a=['service.order','service.um','service.permission','service.repository','order.required_info','order.discount','order.allocation','order.progress','discount.service','progress.context_repository','allocation.payment','allocation.for_object','allocation.for_guard','payment.signer','payment.from_object','treasury.um','permission.owner','permission.um','repository.um','contact.im'];it('materializes\x20the\x20new\x20edges\x20through\x20the\x20whitelisted\x20chain',async()=>{const b=new FakeDataPlane(fullServiceState()),c=await expandTopology(b,{'network':ENTRYPOINT['Mainnet'],'seed':FULL['svc'],'edges':{'schemas':a},'budget':{'maxDepth':0x6}}),d=new Map();for(const f of c['edges']){const g=d['get'](f['schema'])??new Set();g['add'](f['to']),d['set'](f['schema'],g);}expect(d['get']('order.required_info'))['toEqual'](new Set([FULL['proof1']])),expect(d['get']('discount.service'))['toEqual'](new Set([FULL['svc']])),expect(d['get']('progress.context_repository'))['toEqual'](new Set([FULL['repo']])),expect(d['get']('allocation.payment'))['toEqual'](new Set([FULL['pay1'],FULL['pay2']])),expect(d['get']('allocation.for_object'))['toEqual'](new Set([FULL['o1']])),expect(d['get']('allocation.for_guard'))['toEqual'](new Set([FULL['gAlloc']])),expect(d['get']('payment.signer'))['toEqual'](new Set([FULL['buyer'],FULL['merchant']])),expect(d['get']('treasury.um'))['toEqual'](new Set([FULL['ctT']])),expect(d['get']('permission.owner'))['toEqual'](new Set([FULL['merchant']])),expect(d['get']('repository.um'))['toEqual'](new Set([FULL['ctRepo']])),expect(d['get']('contact.im'))['toEqual'](new Set([FULL['member']]));});}),describe('Task\x207\x20—\x20repaired\x20guard\x20paths\x20(TR-7.1)',()=>{it('repository.policy_guard\x20reads\x20policies[].write_guard[].guard\x20(deep)',()=>{expect(refsOf('Repository',rawByAddress(FULL['repo']),'repository.policy_guard')['map'](a=>a['to']))['toEqual']([FULL['gWrite']]);}),it('repository.quote_guard\x20reads\x20policies[].quote_guard\x20(Option<address>\x20leaf)',()=>{expect(refsOf('Repository',rawByAddress(FULL['repo']),'repository.quote_guard')['map'](a=>a['to']))['toEqual']([FULL['gQuote']]);}),it('treasury\x20deposit/withdraw\x20guards\x20extract\x20separately\x20with\x20identifier\x20slots',()=>{const a=refsOf('Treasury',rawByAddress(FULL['tres']),'treasury.deposit_guard'),b=refsOf('Treasury',rawByAddress(FULL['tres']),'treasury.withdraw_guard');expect(a['map'](c=>c['to']))['toEqual']([FULL['gDep']]),expect(a[0x0]['payload'])['toMatchObject']({'identifier':0x1,'storeFromId':null}),expect(b['map'](c=>c['to']))['toEqual']([FULL['gWd']]),expect(b[0x0]['payload'])['toMatchObject']({'identifier':0x1,'storeFromId':null});}),it('the\x20dead\x20treasury.external_guard\x20id\x20is\x20unregistered\x20and\x20has\x20no\x20outgoing\x20slot',()=>{expect(EDGE_SCHEMA_BY_ID['get']('treasury.external_guard'))['toBeUndefined'](),expect(EDGE_SCHEMA_BY_ID['get']('treasury.deposit_guard'))['toBeDefined'](),expect(EDGE_SCHEMA_BY_ID['get']('treasury.withdraw_guard'))['toBeDefined'](),expect(EDGE_SCHEMA_BY_ID['get']('repository.quote_guard'))['toBeDefined'](),expect(outgoingSchemaIds('Repository'))['toContain']('repository.policy_guard'),expect(outgoingSchemaIds('Repository'))['toContain']('repository.quote_guard'),expect(outgoingSchemaIds('Treasury'))['toContain']('treasury.deposit_guard'),expect(outgoingSchemaIds('Treasury'))['toContain']('treasury.withdraw_guard'),expect(outgoingSchemaIds('Treasury'))['not']['toContain']('treasury.external_guard');}),it('all\x20four\x20guard\x20edges\x20materialize\x20when\x20expanded\x20from\x20their\x20own\x20seeds',async()=>{const a=new FakeDataPlane(fullServiceState()),[b,c]=await Promise['all']([expandTopology(a,{'network':ENTRYPOINT['Mainnet'],'seed':FULL['repo'],'edges':{'schemas':['repository.policy_guard','repository.quote_guard']},'budget':{'maxDepth':0x2}}),expandTopology(a,{'network':ENTRYPOINT['Mainnet'],'seed':FULL['tres'],'edges':{'schemas':['treasury.deposit_guard','treasury.withdraw_guard']},'budget':{'maxDepth':0x2}})]);expect(new Set(b['edges']['map'](d=>d['schema'])))['toEqual'](new Set(['repository.policy_guard','repository.quote_guard'])),expect(b['edges']['map'](d=>d['to'])['sort']())['toEqual']([FULL['gQuote'],FULL['gWrite']]['sort']()),expect(new Set(c['edges']['map'](d=>d['schema'])))['toEqual'](new Set(['treasury.deposit_guard','treasury.withdraw_guard'])),expect(c['edges']['map'](d=>d['to'])['sort']())['toEqual']([FULL['gDep'],FULL['gWd']]['sort']());});}),describe('Task\x206\x20field-edge\x20batch\x20—\x20type\x20coverage\x20(TR-6.2)',()=>{it('COVERED_OBJECT_TYPES\x20includes\x20the\x20new\x20source/target\x20types',()=>{for(const a of['Discount','Payment','Treasury','Repository','Passport','Contact','Permission','Progress','Allocation']){expect(COVERED_OBJECT_TYPES)['toContain'](a);}}),it('inferObjectType\x20decodes\x20the\x20fixture\x20first\x20bytes\x20to\x20SDK\x20types',()=>{const a=[[FULL['disc'],'Discount'],[FULL['pay1'],'Payment'],[FULL['tres'],'Treasury'],[FULL['repo'],'Repository'],[FULL['pp'],'Passport'],[FULL['alloc'],'Allocation'],[FULL['pr1'],'Progress'],[FULL['ctShop'],'Contact'],[FULL['perm'],'Permission'],[FULL['proof1'],'Proof']];for(const [b,c]of a){expect(inferObjectType(b),b+'\x20→\x20'+c)['toBe'](c);}});});
@@ -24,13 +24,20 @@ export interface ReverseRead {
24
24
  }
25
25
  export interface TableRead {
26
26
  kind: "table";
27
- rowType: "MachineNode" | "PermissionPerm" | "DemandPresenter";
27
+ rowType: "MachineNode" | "PermissionPerm" | "DemandPresenter" | "TreasuryRecord" | "RewardClaimRecord" | "RepositoryData";
28
28
  }
29
29
  export interface DerivedRead {
30
30
  kind: "derived";
31
31
  producer: string;
32
32
  }
33
- export type EdgeRead = FieldRead | FieldsRead | StructFieldsRead | DeepRead | ReverseRead | TableRead | DerivedRead;
33
+ export interface EventRead {
34
+ kind: "event";
35
+ eventType: string;
36
+ matchField?: string;
37
+ matchSender?: boolean;
38
+ targetField: string;
39
+ }
40
+ export type EdgeRead = FieldRead | FieldsRead | StructFieldsRead | DeepRead | ReverseRead | TableRead | DerivedRead | EventRead;
34
41
  export type Cardinality = 1 | "0..1" | "N";
35
42
  export type FieldMutabilityAction = "add" | "remove" | "clear" | "set" | "update";
36
43
  export interface EdgeContractMeta {
@@ -52,7 +59,8 @@ export interface EdgeSchema {
52
59
  evidence: string;
53
60
  contract?: EdgeContractMeta;
54
61
  bridgeIds?: string[];
55
- zh: string;
62
+ maxHops?: number;
63
+ label: string;
56
64
  }
57
65
  export declare const EDGE_SCHEMAS: EdgeSchema[];
58
66
  export declare const EDGE_SCHEMA_BY_ID: Map<string, EdgeSchema>;
@@ -1 +1 @@
1
- const EOA='EOA',ANY='ANY',F_EDGES=[{'id':'service.permission','family':'F','source':'Service','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'service.move\x20L175-194','bridgeIds':['b06','b09'],'zh':'店铺挂接的权限组(裁决回避\x20E33\x20的对照边)'},{'id':'service.machine','family':'F','source':'Service','target':'Machine','cardinality':'0..1','read':{'kind':'field','path':'machine'},'retention':'complete','evidence':'service.move\x20L175-194','bridgeIds':['b04'],'contract':{'field':'machine','frozenWhen':'after\x20publish','forbiddenActions':['set','remove'],'allowedActions':[],'unfreeze':null,'moveAnchor':'service.move\x20machine_set_imp\x20/\x20machine_none_imp\x20(assert!(!bPublished))'},'zh':'店铺绑定的工作流模板'},{'id':'service.buy_guard','family':'F','source':'Service','target':'Guard','cardinality':'0..1','read':{'kind':'field','path':'buy_guard'},'retention':'complete','evidence':'service.move\x20L175-194','bridgeIds':['b01','b10'],'contract':{'field':'buy_guard','frozenWhen':null,'forbiddenActions':[],'allowedActions':['set','remove'],'unfreeze':null,'moveAnchor':'service.move\x20buy_guard_set_imp\x20/\x20buy_guard_none_imp\x20(no\x20assert!(!bPublished))'},'zh':'下单前置校验\x20Guard'},{'id':'service.arbitration','family':'F','source':'Service','target':'Arbitration','cardinality':'N','read':{'kind':'fields','path':'arbitrations'},'retention':'complete','evidence':'service.move\x20L175-194\x20(≤20)','bridgeIds':['b06'],'contract':{'field':'arbitrations','frozenWhen':'after\x20publish','forbiddenActions':['remove','clear'],'allowedActions':['add'],'unfreeze':'pause\x20+\x20setting_lock_duration\x20elapsed','moveAnchor':'service.move\x20arbitration_remove_imp\x20/\x20arbitration_clear_imp\x20(assert_not_published)'},'zh':'店铺可选仲裁服务(≤20)'},{'id':'service.reward','family':'F','source':'Service','target':'Reward','cardinality':'N','read':{'kind':'fields','path':'rewards'},'retention':'complete','evidence':'service.move\x20L175-194\x20(≤20)','bridgeIds':['b07'],'contract':{'field':'rewards','frozenWhen':'after\x20publish','forbiddenActions':['remove','clear'],'allowedActions':['add'],'unfreeze':'pause\x20+\x20setting_lock_duration\x20elapsed','moveAnchor':'service.move\x20reward_remove_imp\x20/\x20reward_clear_imp\x20(assert_not_published)'},'zh':'店铺挂接的激励池(≤20)'},{'id':'service.repository','family':'F','source':'Service','target':'Repository','cardinality':'N','read':{'kind':'fields','path':'repositories'},'retention':'complete','evidence':'service.move\x20L175-194\x20(≤100)','bridgeIds':['b02'],'contract':{'field':'repositories','frozenWhen':null,'forbiddenActions':[],'allowedActions':['add','remove','clear'],'unfreeze':null,'moveAnchor':'service.move\x20repository_remove_imp\x20/\x20repository_clear_imp\x20(no\x20assert_not_published)'},'zh':'店铺证据资料库(≤100)'},{'id':'service.um','family':'F','source':'Service','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'service.move\x20L175-194','bridgeIds':['b11'],'zh':'店铺会员关系簿'},{'id':'service.order_allocator_guard','family':'F','source':'Service','target':'Guard','cardinality':'N','read':{'kind':'deep','segments':['order_allocators','allocators'],'field':'guard'},'retention':'complete','evidence':'service.move\x20L175-194;\x20allocation.move\x20L194-200','bridgeIds':['b05'],'zh':'店铺下单分账模板的触发\x20Guard'},{'id':'order.builder','family':'F','source':'Order','target':EOA,'cardinality':0x1,'read':{'kind':'field','path':'builder'},'retention':'complete','evidence':'order.move\x20L60-75\x20(owner;\x20SDK\x20builder)','bridgeIds':['b01'],'zh':'订单买家(owner/builder)'},{'id':'order.agent','family':'F','source':'Order','target':EOA,'cardinality':'N','read':{'kind':'fields','path':'agent'},'retention':'complete','evidence':'order.move\x20L60-75,L179\x20(≤10)','zh':'买家授权的商家代理人(≤10,买家调用\x20agent_set)'},{'id':'order.service','family':'F','source':'Order','target':'Service','cardinality':0x1,'read':{'kind':'field','path':'service'},'retention':'complete','evidence':'order.move\x20L60-75','bridgeIds':['b01'],'zh':'订单购买的店铺(购买快照)'},{'id':'order.machine','family':'F','source':'Order','target':'Machine','cardinality':'0..1','read':{'kind':'field','path':'machine'},'retention':'complete','evidence':'order.move\x20L130\x20(machine⇒progress)','bridgeIds':['b01','b04'],'zh':'订单绑定的工作流(购买快照)'},{'id':'order.progress','family':'F','source':'Order','target':'Progress','cardinality':'0..1','read':{'kind':'field','path':'progress'},'retention':'complete','evidence':'order.move\x20L130','bridgeIds':['b04'],'zh':'订单履约进度'},{'id':'order.allocation','family':'F','source':'Order','target':'Allocation','cardinality':'0..1','read':{'kind':'field','path':'allocation'},'retention':'complete','evidence':'order.move\x20L130\x20(amount>0⇒allocation)','bridgeIds':['b05'],'zh':'订单分账模板'},{'id':'order.discount','family':'F','source':'Order','target':'Discount','cardinality':'0..1','read':{'kind':'field','path':'discount'},'retention':'complete','evidence':'order.move\x20L60-75','bridgeIds':['b01'],'zh':'订单使用的折扣'},{'id':'order.dispute','family':'F','source':'Order','target':'Arb','cardinality':'N','read':{'kind':'fields','path':'dispute'},'retention':'complete','evidence':'order.move\x20L60-75','bridgeIds':['b06'],'zh':'订单关联的仲裁案件'},{'id':'order.claimed_by','family':'F','source':'Order','target':EOA,'cardinality':'0..1','read':{'kind':'field','path':'claimed_by'},'retention':'complete','evidence':'order.move\x20L86-96\x20(single-use)','bridgeIds':['b06'],'zh':'赔付领取人(单次)'},{'id':'progress.machine','family':'F','source':'Progress','target':'Machine','cardinality':0x1,'read':{'kind':'field','path':'machine'},'retention':'complete','evidence':'progress.move\x20L76-86','bridgeIds':['b04'],'contract':{'field':'machine','frozenWhen':'bound\x20at\x20creation','forbiddenActions':['set','remove'],'allowedActions':[],'unfreeze':null,'moveAnchor':'progress.move\x20new_imp\x20(machine\x20bound\x20at\x20creation;\x20no\x20mutation\x20entry)'},'zh':'进度对应的工作流模板'},{'id':'progress.task','family':'F','source':'Progress','target':'Order','cardinality':'0..1','read':{'kind':'field','path':'task'},'retention':'complete','evidence':'progress.move\x20L76-86','bridgeIds':['b04'],'contract':{'field':'task','frozenWhen':'after\x20task_set','forbiddenActions':['set'],'allowedActions':[],'unfreeze':null,'moveAnchor':'progress.move\x20task_set_imp\x20(assert!\x20option::is_none\x20→\x20E_TASK_ALREADY_SET)'},'zh':'进度关联的订单'},{'id':'progress.named_operator','family':'F','source':'Progress','target':EOA,'cardinality':'N','read':{'kind':'deep','segments':['namedOperator','operators'],'field':''},'retention':'complete','evidence':'progress.move\x20L76-86\x20(≤80)','bridgeIds':['b04'],'zh':'具名操作员运行时绑定(≤80\x20地址)'},{'id':'machine.permission','family':'F','source':'Machine','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'machine.move\x20L299-308','bridgeIds':['b09'],'zh':'工作流的权限组'},{'id':'machine.consensus_repository','family':'F','source':'Machine','target':'Repository','cardinality':'N','read':{'kind':'fields','path':'consensus_repositories'},'retention':'complete','evidence':'machine.move\x20L299-308','contract':{'field':'consensus_repositories','frozenWhen':null,'forbiddenActions':[],'allowedActions':['add','remove','clear'],'unfreeze':null,'moveAnchor':'machine.move\x20consensus_repositories_remove_imp\x20(no\x20assert_not_published)'},'zh':'工作流共识资料库'},{'id':'machine.um','family':'F','source':'Machine','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'machine.move\x20L299-308','bridgeIds':['b11'],'zh':'工作流会员关系簿'},{'id':'allocation.guard','family':'F','source':'Allocation','target':'Guard','cardinality':'N','read':{'kind':'deep','segments':['allocators','allocators'],'field':'guard'},'retention':'complete','evidence':'allocation.move\x20L194-200','bridgeIds':['b05'],'contract':{'field':'allocators','frozenWhen':'after\x20create\x20(share)','forbiddenActions':['add','remove','clear','set'],'allowedActions':[],'unfreeze':null,'moveAnchor':'allocation.move\x20create\x20(bound\x20via\x20new_with_balance;\x20no\x20mutation\x20entry)'},'zh':'分账段触发\x20Guard'},{'id':'arbitration.permission','family':'F','source':'Arbitration','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'arbitration.move\x20L48-59','bridgeIds':['b06','b09'],'zh':'仲裁服务的权限组(须与店铺\x20permission\x20不同,E33)'},{'id':'arbitration.voting_guard','family':'F','source':'Arbitration','target':'Guard','cardinality':'N','read':{'kind':'structFields','path':'voting_guard','field':'guard'},'retention':'complete','evidence':'arbitration.move\x20L48-59','bridgeIds':['b06','b10'],'zh':'仲裁投票权\x20Guard(空=人人可投)'},{'id':'arbitration.usage_guard','family':'F','source':'Arbitration','target':'Guard','cardinality':'0..1','read':{'kind':'field','path':'usage_guard'},'retention':'complete','evidence':'arbitration.move\x20L48-59','bridgeIds':['b06','b10'],'zh':'仲裁服务使用门槛\x20Guard'},{'id':'arbitration.um','family':'F','source':'Arbitration','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'arbitration.move\x20L48-59','bridgeIds':['b11'],'zh':'仲裁会员关系簿'},{'id':'arb.order','family':'F','source':'Arb','target':'Order','cardinality':0x1,'read':{'kind':'field','path':'order'},'retention':'complete','evidence':'arb.move\x20L96-111','bridgeIds':['b06'],'zh':'仲裁案件对应的订单'},{'id':'arb.arbitration_service','family':'F','source':'Arb','target':'Arbitration','cardinality':'0..1','read':{'kind':'field','path':'arbitration'},'retention':'complete','evidence':'arb.move\x20L96-111','bridgeIds':['b06'],'zh':'案件适用的仲裁服务'},{'id':'arb.voter','family':'S','source':'Arb','target':EOA,'cardinality':'N','read':{'kind':'structFields','path':'voted','field':'voter'},'retention':'complete','evidence':'arb.move\x20L96-111\x20(voted≤520)','bridgeIds':['b06'],'zh':'案件实际投票人及权重(≤520)'},{'id':'demand.permission','family':'F','source':'Demand','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'demand.move\x20L68-77','bridgeIds':['b09'],'zh':'需求的权限组(需求方)'},{'id':'demand.guard','family':'F','source':'Demand','target':'Guard','cardinality':'N','read':{'kind':'structFields','path':'guards','field':'guard'},'retention':'complete','evidence':'demand.move\x20L68-77','bridgeIds':['b03','b10'],'zh':'需求接单\x20Guard(裸\x20present\x20时须为空)'},{'id':'demand.reward','family':'F','source':'Demand','target':'Reward','cardinality':'N','read':{'kind':'fields','path':'rewards'},'retention':'complete','evidence':'demand.move\x20L68-77','bridgeIds':['b07'],'zh':'需求托管激励池'},{'id':'demand.um','family':'F','source':'Demand','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'demand.move\x20L68-77','bridgeIds':['b11'],'zh':'需求会员关系簿'},{'id':'reward.permission','family':'F','source':'Reward','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'reward.move\x20L129','bridgeIds':['b09'],'zh':'激励池权限组'},{'id':'reward.guard','family':'F','source':'Reward','target':'Guard','cardinality':'N','read':{'kind':'structFields','path':'guards','field':'guard'},'retention':'complete','evidence':'reward.move\x20L129','bridgeIds':['b07'],'zh':'激励领取\x20Guard'},{'id':'reward.um','family':'F','source':'Reward','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'reward.move\x20L129','bridgeIds':['b11'],'zh':'激励池会员关系簿'},{'id':'repository.permission','family':'F','source':'Repository','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'repository.move\x20(struct)','bridgeIds':['b02','b09'],'zh':'资料库权限组'},{'id':'repository.reward','family':'F','source':'Repository','target':'Reward','cardinality':'N','read':{'kind':'fields','path':'rewards'},'retention':'complete','evidence':'repository.move\x20(struct)','bridgeIds':['b07'],'zh':'资料库挂接的激励池'},{'id':'repository.policy_guard','family':'F','source':'Repository','target':'Guard','cardinality':'N','read':{'kind':'structFields','path':'policies','field':'guard'},'retention':'complete','evidence':'repository.move\x20(read/write\x20policies)','bridgeIds':['b02','b10'],'zh':'资料库读写策略\x20Guard(值门控)'},{'id':'contact.permission','family':'F','source':'Contact','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'contact.move\x20L25-31','bridgeIds':['b09','b11'],'zh':'客服会员簿的权限组'},{'id':'permission.admin','family':'F','source':'Permission','target':EOA,'cardinality':'N','read':{'kind':'fields','path':'admin'},'retention':'complete','evidence':'permission.move\x20L34-42\x20(admin\x20vector)','bridgeIds':['b09'],'zh':'权限组管理员\x20EOA\x20列表'},{'id':'guard.relies','family':'F','source':'Guard','target':'Guard','cardinality':'N','read':{'kind':'fields','path':'relies'},'retention':'complete','evidence':'guard.move\x20L85-95\x20(≤4,\x20one\x20level)','bridgeIds':['b10'],'zh':'Guard\x20依赖的子\x20Guard(≤4,仅一层)'},{'id':'passport.signer','family':'F','source':'Passport','target':EOA,'cardinality':0x1,'read':{'kind':'field','path':'signer'},'retention':'complete','evidence':'passport.move\x20L41-49,L94-98','bridgeIds':['b12'],'zh':'通行证签署人(单笔\x20tx\x20一次性)'},{'id':'passport.guard','family':'F','source':'Passport','target':'Guard','cardinality':'N','read':{'kind':'structFields','path':'guard','field':'guard'},'retention':'complete','evidence':'passport.move\x20L41-49','bridgeIds':['b10','b12'],'zh':'通行证持有的\x20Guard\x20校验票据'},{'id':'proof.signer','family':'F','source':'Proof','target':EOA,'cardinality':0x1,'read':{'kind':'field','path':'signer'},'retention':'complete','evidence':'proof.move\x20L14-25','bridgeIds':['b12'],'zh':'WTS\x20证据签名人'},{'id':'proof.about','family':'F','source':'Proof','target':ANY,'cardinality':'0..1','read':{'kind':'field','path':'about'},'retention':'complete','evidence':'proof.move\x20L14-25','bridgeIds':['b12'],'zh':'证据关联对象'},{'id':'treasury.permission','family':'F','source':'Treasury','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'treasury.move\x20L72-83','bridgeIds':['b09'],'zh':'金库权限组'},{'id':'treasury.external_guard','family':'F','source':'Treasury','target':'Guard','cardinality':'N','read':{'kind':'fields','path':'external_guards'},'retention':'complete','evidence':'treasury.move\x20L72-83','bridgeIds':['b10'],'zh':'金库外部存取\x20Guard'}],R_EDGES=[{'id':'eoa.permission','family':'R','source':EOA,'target':'Permission','cardinality':'N','read':{'kind':'reverse','parent':'0xaad'},'retention':'membership','evidence':'entity_permission.move\x20L32\x20(bits\x201/2/4)','bridgeIds':['b09'],'zh':'账号当前参与的权限组(成员关系,移除即消失)'},{'id':'eoa.order','family':'R','source':EOA,'target':'Order','cardinality':'N','read':{'kind':'reverse','parent':'0xaa8'},'retention':'bounded_window','evidence':'entity_order.move\x20L31\x20(FIFO\x205200)','bridgeIds':['b01'],'zh':'账号作为买家/代理人参与的订单(买家视角,FIFO\x205200)'},{'id':'eoa.contact','family':'R','source':EOA,'target':'Contact','cardinality':'N','read':{'kind':'reverse','parent':'0xaa9'},'retention':'membership','evidence':'entity_contact.move\x20L24','bridgeIds':['b11'],'zh':'账号当前加入的客服会员簿'},{'id':'permission.core_binding','family':'R','source':'Permission','target':ANY,'cardinality':'N','read':{'kind':'reverse','parent':'0xaae'},'retention':'bounded_exact','evidence':'object_linker.move\x20L37,L88\x20(≤5200\x20aborts)','bridgeIds':['b09'],'zh':'权限组无损挂接的核心对象(Service/Demand/Machine/…)'},{'id':'permission.tx_binding','family':'R','source':'Permission','target':ANY,'cardinality':'N','read':{'kind':'reverse','parent':'0xaaf'},'retention':'bounded_window','evidence':'object_linker.move\x20L43\x20(FIFO\x205200\x20operational)','bridgeIds':['b09'],'zh':'权限组运行期触碰对象(FIFO\x205200\x20下界)'},{'id':'service.order','family':'R','source':'Service','target':'Order','cardinality':'N','read':{'kind':'reverse','parent':'0xaaf','filterType':'Order'},'retention':'bounded_window','evidence':'object_linker.move\x20L43,L136-140\x20(FIFO\x205200)','bridgeIds':['b01'],'zh':'店铺订单(商家视角权威路径,FIFO\x205200\x20下界;全量走事件通道)'},{'id':'target.vote','family':'S','source':ANY,'target':EOA,'cardinality':'N','read':{'kind':'reverse','parent':'0xaaa'},'retention':'bounded_window','evidence':'registrar.move\x20L154-171\x20(ring\x205200,\x20bits\x200x02/0x04/0x08)','zh':'目标地址收到的\x20like/dislike/favor\x20投票(环形\x205200)'}],TABLE_EDGES=[{'id':'permission.entity','family':'R','source':'Permission','target':ANY,'cardinality':'N','read':{'kind':'table','rowType':'PermissionPerm'},'retention':'membership','evidence':'permission.move\x20L34-42\x20(entity\x20may\x20be\x20EOA\x20or\x20Guard\x20address)','bridgeIds':['b04','b09'],'zh':'权限组实体表成员(EOA\x20或\x20Guard,携带\x20perm\x20索引位)'},{'id':'demand.presenter','family':'R','source':'Demand','target':EOA,'cardinality':'N','read':{'kind':'table','rowType':'DemandPresenter'},'retention':'membership','evidence':'demand.move\x20L68-77\x20(presenters\x20table)','bridgeIds':['b03'],'zh':'向需求提案的供应方及\x20acceptance_score'},{'id':'machine.node','family':'W','source':'Machine','target':'MachineNode','cardinality':'N','read':{'kind':'table','rowType':'MachineNode'},'retention':'complete','evidence':'machine.move\x20L299-308\x20(immutable\x20after\x20publish)','bridgeIds':['b04'],'contract':{'field':'nodes','frozenWhen':'after\x20publish','forbiddenActions':['add','remove','update'],'allowedActions':[],'unfreeze':null,'moveAnchor':'machine.move\x20node_add_imp\x20/\x20node_remove_imp\x20/\x20node_rename_imp\x20(assert_not_published)'},'zh':'工作流节点表(发布后不可变)'}],W_EDGES=[{'id':'wf.transition','family':'W','source':'MachineNode','target':'MachineNode','cardinality':'N','read':{'kind':'derived','producer':'machineRows'},'retention':'derived','evidence':'machine.move\x20L101\x20NodePair,L269','bridgeIds':['b04'],'zh':'节点对有向边(prev_node→node,携带\x20threshold)'},{'id':'wf.forward_guard','family':'W','source':'MachineNode','target':'Guard','cardinality':'N','read':{'kind':'derived','producer':'machineRows'},'retention':'derived','evidence':'machine.move\x20L63\x20Forward','bridgeIds':['b04','b05','b10','b12'],'zh':'节点前进操作的后置\x20Guard(供应链/赔付分账挂点)'}],M_EDGES=[{'id':'payment.recipient','family':'M','source':'Payment','target':EOA,'cardinality':'N','read':{'kind':'structFields','path':'record','field':'recipient'},'retention':'complete','evidence':'payment.move\x20L93-101\x20(Revenue≤200)','bridgeIds':['b05','b08'],'zh':'支付分账收款人(携带金额,逐腿)'},{'id':'payment.from_object','family':'M','source':'Payment','target':ANY,'cardinality':'0..1','read':{'kind':'field','path':'from_object'},'retention':'complete','evidence':'payment.move\x20L149-161\x20(framework-only)','bridgeIds':['b05','b08'],'zh':'资金来源池(Treasury/Allocation/Service,仅框架可设)'},{'id':'payment.for_object','family':'M','source':'Payment','target':ANY,'cardinality':'0..1','read':{'kind':'field','path':'info.for_object'},'retention':'complete','evidence':'payment.move\x20L93-101\x20(info\x20routing\x20hint)','bridgeIds':['b05','b08'],'zh':'业务路由对象(用户可设)'},{'id':'payment.for_guard','family':'M','source':'Payment','target':'Guard','cardinality':'0..1','read':{'kind':'field','path':'info.for_guard'},'retention':'complete','evidence':'payment.move\x20L93-101','bridgeIds':['b05'],'zh':'业务路由\x20Guard'}];export const EDGE_SCHEMAS=[...F_EDGES,...R_EDGES,...TABLE_EDGES,...W_EDGES,...M_EDGES];export const EDGE_SCHEMA_BY_ID=new Map(EDGE_SCHEMAS['map'](a=>[a['id'],a]));export function outgoingSchemaIds(a){return EDGE_SCHEMAS['filter'](b=>b['source']===a||b['source']===ANY)['map'](b=>b['id']);}export const COVERED_OBJECT_TYPES=[...new Set(EDGE_SCHEMAS['flatMap'](a=>[a['source'],a['target']])['filter'](a=>a!==EOA&&a!==ANY&&a!=='MachineNode'))];
1
+ import{PackageAddress,WOW_SINGLETON_IDS}from'@wowok/wowok';const EOA='EOA',ANY='ANY',F_EDGES=[{'id':'service.permission','family':'F','source':'Service','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'service.move\x20L175-194','bridgeIds':['b06','b09'],'label':'Permission\x20group\x20governing\x20who\x20may\x20operate\x20the\x20service\x20(must\x20differ\x20from\x20the\x20arbitration\x20permission,\x20E33\x20recusal\x20rule)'},{'id':'service.machine','family':'F','source':'Service','target':'Machine','cardinality':'0..1','read':{'kind':'field','path':'machine'},'retention':'complete','evidence':'service.move\x20L175-194','bridgeIds':['b04'],'contract':{'field':'machine','frozenWhen':'after\x20publish','forbiddenActions':['set','remove'],'allowedActions':[],'unfreeze':null,'moveAnchor':'service.move\x20machine_set_imp\x20/\x20machine_none_imp\x20(assert!(!bPublished))'},'label':'Workflow\x20template\x20the\x20shop\x20fulfills\x20orders\x20through\x20(chosen\x20at\x20publish,\x20permanently\x20frozen)'},{'id':'service.buy_guard','family':'F','source':'Service','target':'Guard','cardinality':'0..1','read':{'kind':'field','path':'buy_guard'},'retention':'complete','evidence':'service.move\x20L175-194','bridgeIds':['b01','b10'],'contract':{'field':'buy_guard','frozenWhen':null,'forbiddenActions':[],'allowedActions':['set','remove'],'unfreeze':null,'moveAnchor':'service.move\x20buy_guard_set_imp\x20/\x20buy_guard_none_imp\x20(no\x20assert!(!bPublished))'},'label':'Gate\x20every\x20buyer\x20must\x20pass\x20before\x20an\x20order\x20can\x20be\x20created'},{'id':'service.arbitration','family':'F','source':'Service','target':'Arbitration','cardinality':'N','read':{'kind':'fields','path':'arbitrations'},'retention':'complete','evidence':'service.move\x20L175-194\x20(≤20)','bridgeIds':['b06'],'contract':{'field':'arbitrations','frozenWhen':'after\x20publish','forbiddenActions':['remove','clear'],'allowedActions':['add'],'unfreeze':'pause\x20+\x20setting_lock_duration\x20elapsed','moveAnchor':'service.move\x20arbitration_remove_imp\x20/\x20arbitration_clear_imp\x20(assert_not_published)'},'label':'Dispute\x20venues\x20the\x20shop\x20designates\x20for\x20order\x20arbitration\x20(up\x20to\x2020;\x20removal\x20locked\x20after\x20publish)'},{'id':'service.reward','family':'F','source':'Service','target':'Reward','cardinality':'N','read':{'kind':'fields','path':'rewards'},'retention':'complete','evidence':'service.move\x20L175-194\x20(≤20)','bridgeIds':['b07'],'contract':{'field':'rewards','frozenWhen':'after\x20publish','forbiddenActions':['remove','clear'],'allowedActions':['add'],'unfreeze':'pause\x20+\x20setting_lock_duration\x20elapsed','moveAnchor':'service.move\x20reward_remove_imp\x20/\x20reward_clear_imp\x20(assert_not_published)'},'label':'Reward\x20pools\x20funding\x20the\x20shop\x27s\x20promotions\x20and\x20rebates\x20(up\x20to\x2020;\x20removal\x20locked\x20after\x20publish)'},{'id':'service.repository','family':'F','source':'Service','target':'Repository','cardinality':'N','read':{'kind':'fields','path':'repositories'},'retention':'complete','evidence':'service.move\x20L175-194\x20(≤100)','bridgeIds':['b02'],'contract':{'field':'repositories','frozenWhen':null,'forbiddenActions':[],'allowedActions':['add','remove','clear'],'unfreeze':null,'moveAnchor':'service.move\x20repository_remove_imp\x20/\x20repository_clear_imp\x20(no\x20assert_not_published)'},'label':'Evidence\x20repositories\x20the\x20shop\x20stores\x20fulfillment\x20proofs\x20in\x20(up\x20to\x20100;\x20freely\x20editable\x20after\x20publish)'},{'id':'service.um','family':'F','source':'Service','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'service.move\x20L175-194','bridgeIds':['b11'],'label':'Shop\x20membership\x20book\x20—\x20the\x20roster\x20deciding\x20who\x20counts\x20as\x20a\x20shop\x20member\x20(messaging\x20and\x20member-gate\x20flows)'},{'id':'service.order_allocator_guard','family':'F','source':'Service','target':'Guard','cardinality':'N','read':{'kind':'deep','segments':['order_allocators','allocators'],'field':'guard'},'retention':'complete','evidence':'service.move\x20L175-194;\x20allocation.move\x20L194-200','bridgeIds':['b05'],'label':'Guards\x20gating\x20how\x20incoming\x20orders\x20split\x20across\x20allocation\x20pools\x20(order-allocator\x20triggers)'},{'id':'order.builder','family':'F','source':'Order','target':EOA,'cardinality':0x1,'read':{'kind':'field','path':'builder'},'retention':'complete','evidence':'order.move\x20L60-75\x20(owner;\x20SDK\x20builder)','bridgeIds':['b01'],'label':'Buyer\x20who\x20owns\x20the\x20order\x20(payer-side\x20principal;\x20SDK\x20names\x20the\x20field\x20builder)'},{'id':'order.agent','family':'F','source':'Order','target':EOA,'cardinality':'N','read':{'kind':'fields','path':'agent'},'retention':'complete','evidence':'order.move\x20L60-75,L179\x20(≤10)','label':'Merchant\x20agents\x20authorized\x20by\x20the\x20buyer\x20(<=10,\x20buyer\x20calls\x20agent_set)'},{'id':'order.service','family':'F','source':'Order','target':'Service','cardinality':0x1,'read':{'kind':'field','path':'service'},'retention':'complete','evidence':'order.move\x20L60-75','bridgeIds':['b01'],'label':'Shop\x20fulfilling\x20this\x20order\x20(frozen\x20purchase\x20snapshot\x20of\x20what\x20was\x20bought\x20and\x20from\x20whom)'},{'id':'order.machine','family':'F','source':'Order','target':'Machine','cardinality':'0..1','read':{'kind':'field','path':'machine'},'retention':'complete','evidence':'order.move\x20L130\x20(machine⇒progress)','bridgeIds':['b01','b04'],'label':'Workflow\x20the\x20order\x20advances\x20through\x20(snapshot\x20of\x20the\x20shop\x27s\x20template\x20at\x20purchase\x20time)'},{'id':'order.progress','family':'F','source':'Order','target':'Progress','cardinality':'0..1','read':{'kind':'field','path':'progress'},'retention':'complete','evidence':'order.move\x20L130','bridgeIds':['b04'],'label':'Live\x20fulfillment\x20state\x20of\x20the\x20order\x20(which\x20workflow\x20node\x20it\x20currently\x20sits\x20at)'},{'id':'order.allocation','family':'F','source':'Order','target':'Allocation','cardinality':'0..1','read':{'kind':'field','path':'allocation'},'retention':'complete','evidence':'order.move\x20L130\x20(amount>0⇒allocation)','bridgeIds':['b05'],'label':'Allocation\x20pool\x20routing\x20this\x20order\x27s\x20payouts\x20(present\x20when\x20the\x20order\x20amount\x20>\x200)'},{'id':'order.discount','family':'F','source':'Order','target':'Discount','cardinality':'0..1','read':{'kind':'field','path':'discount'},'retention':'complete','evidence':'order.move\x20L60-75','bridgeIds':['b01'],'label':'Discount\x20the\x20shop\x20granted\x20on\x20this\x20order\x20(price\x20concession\x20of\x20record)'},{'id':'order.dispute','family':'F','source':'Order','target':'Arb','cardinality':'N','read':{'kind':'fields','path':'dispute'},'retention':'complete','evidence':'order.move\x20L60-75','bridgeIds':['b06'],'label':'Dispute\x20cases\x20raised\x20over\x20this\x20order\x20(each\x20case\x20may\x20claw\x20back\x20compensation)'},{'id':'order.claimed_by','family':'F','source':'Order','target':EOA,'cardinality':'0..1','read':{'kind':'field','path':'claimed_by'},'retention':'complete','evidence':'order.move\x20L86-96\x20(single-use)','bridgeIds':['b06'],'label':'Compensation\x20claimant\x20on\x20this\x20order\x20(single-use\x20slot;\x20marks\x20the\x20payout\x20as\x20consumed)'},{'id':'order.required_info','family':'F','source':'Order','target':ANY,'cardinality':'0..1','read':{'kind':'field','path':'required_info'},'retention':'complete','evidence':'order.move\x20L73,L77-80\x20(Option<address>:\x20IM\x20book\x20or\x20WTS\x20proof)','bridgeIds':['b11','b12'],'label':'Information\x20credential\x20the\x20shop\x20requires\x20after\x20the\x20order\x20(IM\x20book\x20or\x20WTS\x20proof)'},{'id':'discount.service','family':'F','source':'Discount','target':'Service','cardinality':0x1,'read':{'kind':'field','path':'service'},'retention':'complete','evidence':'service.move\x20L109-119\x20(service\x20L117)','bridgeIds':['b01'],'label':'Shop\x20that\x20issued\x20the\x20discount\x20(the\x20party\x20honoring\x20the\x20concession)'},{'id':'progress.machine','family':'F','source':'Progress','target':'Machine','cardinality':0x1,'read':{'kind':'field','path':'machine'},'retention':'complete','evidence':'progress.move\x20L76-86','bridgeIds':['b04'],'contract':{'field':'machine','frozenWhen':'bound\x20at\x20creation','forbiddenActions':['set','remove'],'allowedActions':[],'unfreeze':null,'moveAnchor':'progress.move\x20new_imp\x20(machine\x20bound\x20at\x20creation;\x20no\x20mutation\x20entry)'},'label':'Workflow\x20the\x20progress\x20executes\x20(fixed\x20at\x20creation;\x20determines\x20the\x20node\x20graph)'},{'id':'progress.task','family':'F','source':'Progress','target':'Order','cardinality':'0..1','read':{'kind':'field','path':'task'},'retention':'complete','evidence':'progress.move\x20L76-86','bridgeIds':['b04'],'contract':{'field':'task','frozenWhen':'after\x20task_set','forbiddenActions':['set'],'allowedActions':[],'unfreeze':null,'moveAnchor':'progress.move\x20task_set_imp\x20(assert!\x20option::is_none\x20→\x20E_TASK_ALREADY_SET)'},'label':'Order\x20this\x20progress\x20fulfills\x20(set\x20once;\x20a\x20progress\x20serves\x20at\x20most\x20one\x20order)'},{'id':'progress.named_operator','family':'F','source':'Progress','target':EOA,'cardinality':'N','read':{'kind':'deep','segments':['namedOperator','operators'],'field':''},'retention':'complete','evidence':'progress.move\x20L76-86\x20(≤80)','bridgeIds':['b04'],'label':'Named\x20operators\x20allowed\x20to\x20advance\x20this\x20progress\x20(up\x20to\x2080;\x20runtime-delegated)'},{'id':'progress.context_repository','family':'F','source':'Progress','target':'Repository','cardinality':'N','read':{'kind':'fields','path':'context_repositories'},'retention':'complete','evidence':'progress.move\x20L79,L199-208\x20(MAX_CONTEXT_REPOSITORY_COUNT)','bridgeIds':['b02','b04'],'label':'Runtime\x20evidence\x20repositories\x20consulted\x20while\x20fulfilling\x20the\x20order'},{'id':'machine.permission','family':'F','source':'Machine','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'machine.move\x20L299-308','bridgeIds':['b09'],'label':'Permission\x20group\x20deciding\x20who\x20may\x20run\x20and\x20advance\x20the\x20workflow'},{'id':'machine.consensus_repository','family':'F','source':'Machine','target':'Repository','cardinality':'N','read':{'kind':'fields','path':'consensus_repositories'},'retention':'complete','evidence':'machine.move\x20L299-308','contract':{'field':'consensus_repositories','frozenWhen':null,'forbiddenActions':[],'allowedActions':['add','remove','clear'],'unfreeze':null,'moveAnchor':'machine.move\x20consensus_repositories_remove_imp\x20(no\x20assert_not_published)'},'label':'Evidence\x20repositories\x20nodes\x20consult\x20to\x20reach\x20execution\x20consensus'},{'id':'machine.um','family':'F','source':'Machine','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'machine.move\x20L299-308','bridgeIds':['b11'],'label':'Workflow\x20membership\x20book\x20—\x20roster\x20deciding\x20who\x20participates\x20in\x20running\x20the\x20workflow'},{'id':'allocation.guard','family':'F','source':'Allocation','target':'Guard','cardinality':'N','read':{'kind':'deep','segments':['allocators','allocators'],'field':'guard'},'retention':'complete','evidence':'allocation.move\x20L194-200','bridgeIds':['b05'],'contract':{'field':'allocators','frozenWhen':'after\x20create\x20(share)','forbiddenActions':['add','remove','clear','set'],'allowedActions':[],'unfreeze':null,'moveAnchor':'allocation.move\x20create\x20(bound\x20via\x20new_with_balance;\x20no\x20mutation\x20entry)'},'label':'Guards\x20gating\x20each\x20payout\x20segment\x20of\x20the\x20pool\x20(release\x20conditions\x20per\x20allocator)'},{'id':'allocation.payment','family':'F','source':'Allocation','target':'Payment','cardinality':'N','read':{'kind':'fields','path':'payment'},'retention':'complete','evidence':'allocation.move\x20L196-202,L307-316','bridgeIds':['b05','b08'],'label':'Payment\x20receipts\x20emitted\x20by\x20this\x20allocation\x20pool'},{'id':'arbitration.permission','family':'F','source':'Arbitration','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'arbitration.move\x20L48-59','bridgeIds':['b06','b09'],'label':'Arbitration\x20service\x20permission\x20group\x20(must\x20differ\x20from\x20the\x20shop\x20permission,\x20E33)'},{'id':'arbitration.voting_guard','family':'F','source':'Arbitration','target':'Guard','cardinality':'N','read':{'kind':'structFields','path':'voting_guard','field':'guard'},'retention':'complete','evidence':'arbitration.move\x20L48-59','bridgeIds':['b06','b10'],'label':'Arbitration\x20voting\x20Guards\x20(empty\x20=\x20open\x20to\x20all\x20members)'},{'id':'arbitration.usage_guard','family':'F','source':'Arbitration','target':'Guard','cardinality':'0..1','read':{'kind':'field','path':'usage_guard'},'retention':'complete','evidence':'arbitration.move\x20L48-59','bridgeIds':['b06','b10'],'label':'Gate\x20a\x20party\x20must\x20pass\x20before\x20opening\x20a\x20case\x20at\x20this\x20arbitration\x20service'},{'id':'arbitration.um','family':'F','source':'Arbitration','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'arbitration.move\x20L48-59','bridgeIds':['b11'],'label':'Arbitration\x20membership\x20book\x20—\x20roster\x20deciding\x20who\x20may\x20vote\x20on\x20dispute\x20cases\x20(open\x20voting)'},{'id':'arb.order','family':'F','source':'Arb','target':'Order','cardinality':0x1,'read':{'kind':'field','path':'order'},'retention':'complete','evidence':'arb.move\x20L96-111','bridgeIds':['b06'],'label':'Order\x20the\x20arbitration\x20case\x20is\x20about'},{'id':'arb.arbitration_service','family':'F','source':'Arb','target':'Arbitration','cardinality':'0..1','read':{'kind':'field','path':'arbitration'},'retention':'complete','evidence':'arb.move\x20L96-111','bridgeIds':['b06'],'label':'Arbitration\x20service\x20applied\x20to\x20the\x20case'},{'id':'arb.voter','family':'S','source':'Arb','target':EOA,'cardinality':'N','read':{'kind':'structFields','path':'voted','field':'voter'},'retention':'complete','evidence':'arb.move\x20L96-111\x20(voted≤520)','bridgeIds':['b06'],'label':'Actual\x20case\x20voters\x20and\x20weights\x20(<=520)'},{'id':'demand.permission','family':'F','source':'Demand','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'demand.move\x20L68-77','bridgeIds':['b09'],'label':'Demand\x20permission\x20group\x20(the\x20demanding\x20side)'},{'id':'demand.guard','family':'F','source':'Demand','target':'Guard','cardinality':'N','read':{'kind':'structFields','path':'guards','field':'guard'},'retention':'complete','evidence':'demand.move\x20L68-77','bridgeIds':['b03','b10'],'label':'Demand\x20acceptance\x20Guards\x20(must\x20be\x20empty\x20for\x20a\x20bare\x20present)'},{'id':'demand.reward','family':'F','source':'Demand','target':'Reward','cardinality':'N','read':{'kind':'fields','path':'rewards'},'retention':'complete','evidence':'demand.move\x20L68-77','bridgeIds':['b07'],'label':'Escrowed\x20reward\x20pools\x20of\x20the\x20demand'},{'id':'demand.um','family':'F','source':'Demand','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'demand.move\x20L68-77','bridgeIds':['b11'],'label':'Demand\x20membership\x20book\x20—\x20roster\x20deciding\x20who\x20may\x20act\x20on\x20the\x20demanding\x20side'},{'id':'reward.permission','family':'F','source':'Reward','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'reward.move\x20L129','bridgeIds':['b09'],'label':'Permission\x20group\x20deciding\x20who\x20may\x20configure\x20the\x20reward\x20pool'},{'id':'reward.guard','family':'F','source':'Reward','target':'Guard','cardinality':'N','read':{'kind':'structFields','path':'guards','field':'guard'},'retention':'complete','evidence':'reward.move\x20L129','bridgeIds':['b07'],'label':'Guards\x20a\x20claimant\x20must\x20pass\x20before\x20drawing\x20from\x20the\x20pool'},{'id':'reward.um','family':'F','source':'Reward','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'reward.move\x20L129','bridgeIds':['b11'],'label':'Reward\x20membership\x20book\x20—\x20roster\x20of\x20members\x20eligible\x20under\x20member-gated\x20claim\x20rules'},{'id':'repository.permission','family':'F','source':'Repository','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'repository.move\x20(struct)','bridgeIds':['b02','b09'],'label':'Permission\x20group\x20deciding\x20who\x20may\x20manage\x20the\x20repository'},{'id':'repository.reward','family':'F','source':'Repository','target':'Reward','cardinality':'N','read':{'kind':'fields','path':'rewards'},'retention':'complete','evidence':'repository.move\x20(struct)','bridgeIds':['b07'],'label':'Reward\x20pools\x20held\x20by\x20the\x20repository'},{'id':'repository.um','family':'F','source':'Repository','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'repository.move\x20L461-468,L471-480','bridgeIds':['b11'],'label':'Repository\x20membership\x20book\x20—\x20roster\x20deciding\x20who\x20may\x20read\x20or\x20write\x20under\x20member\x20policies'},{'id':'repository.policy_guard','family':'F','source':'Repository','target':'Guard','cardinality':'N','read':{'kind':'deep','segments':['policies','write_guard'],'field':'guard'},'retention':'complete','evidence':'repository.move\x20L106-113\x20(PolicyRule.write_guard),L516-570','bridgeIds':['b02','b10'],'label':'Write-policy\x20Guards\x20gating\x20evidence\x20writes\x20under\x20each\x20repository\x20policy'},{'id':'repository.quote_guard','family':'F','source':'Repository','target':'Guard','cardinality':'N','read':{'kind':'deep','segments':['policies'],'field':'quote_guard'},'retention':'complete','evidence':'repository.move\x20L106-113\x20(PolicyRule.quote_guard),L421-428','bridgeIds':['b02','b10'],'label':'Quote/read-policy\x20Guards\x20gating\x20evidence\x20reads\x20under\x20each\x20repository\x20policy'},{'id':'contact.permission','family':'F','source':'Contact','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'contact.move\x20L25-31','bridgeIds':['b09','b11'],'label':'Permission\x20group\x20governing\x20the\x20contact\x20book'},{'id':'contact.im','family':'F','source':'Contact','target':EOA,'cardinality':'N','read':{'kind':'structFields','path':'ims','field':'at'},'retention':'membership','evidence':'contact.move\x20L15,L18-29,L85-105\x20(MAX_IM_COUNT=200)','bridgeIds':['b11'],'contract':{'field':'ims','frozenWhen':null,'forbiddenActions':[],'allowedActions':['add','remove','clear','update'],'unfreeze':null,'moveAnchor':'contact.move\x20im_add_imp\x20/\x20im_remove_imp\x20(roster\x20membership;\x20status/description\x20updatable)'},'label':'IM\x20member\x20entities\x20of\x20the\x20contact\x20book\x20(<=200;\x20membership\x20roster\x20carrying\x20status\x20and\x20join\x20time)'},{'id':'permission.admin','family':'F','source':'Permission','target':EOA,'cardinality':'N','read':{'kind':'fields','path':'admin'},'retention':'complete','evidence':'permission.move\x20L34-42\x20(admin\x20vector)','bridgeIds':['b09'],'label':'Admin\x20EOAs\x20who\x20can\x20mutate\x20the\x20permission\x20group\x27s\x20roles\x20(below\x20the\x20owner)'},{'id':'permission.owner','family':'F','source':'Permission','target':EOA,'cardinality':0x1,'read':{'kind':'field','path':'owner'},'retention':'complete','evidence':'permission.move\x20L34-42,L537-543','bridgeIds':['b09'],'contract':{'field':'owner','frozenWhen':null,'forbiddenActions':['add','remove','clear'],'allowedActions':['update'],'unfreeze':null,'moveAnchor':'permission.move\x20transfer\x20(assert_owner;\x20ownership\x20role\x20moves\x20with\x20it)'},'label':'Ultimate\x20owner\x20EOA\x20of\x20the\x20permission\x20group\x20(control-chain\x20root;\x20can\x20transfer\x20the\x20group)'},{'id':'permission.um','family':'F','source':'Permission','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'permission.move\x20L41,L562-571','bridgeIds':['b11'],'label':'Permission\x20group\x27s\x20membership\x20book\x20(who\x20receives\x20the\x20group\x27s\x20messages\x20and\x20notifications)'},{'id':'guard.relies','family':'F','source':'Guard','target':'Guard','cardinality':'N','read':{'kind':'fields','path':'relies'},'retention':'complete','evidence':'guard.move\x20L85-95\x20(≤4,\x20one\x20level)','bridgeIds':['b10'],'maxHops':0x1,'label':'Sub-Guards\x20the\x20Guard\x20relies\x20on\x20(<=4,\x20one\x20level;\x20relied\x20guards\x27\x20own\x20relies\x20are\x20not\x20consulted)'},{'id':'passport.signer','family':'F','source':'Passport','target':EOA,'cardinality':0x1,'read':{'kind':'field','path':'signer'},'retention':'complete','evidence':'passport.move\x20L41-49,L94-98','bridgeIds':['b12'],'label':'Identity\x20that\x20verified\x20this\x20passport\x20(credential\x20consumed\x20per\x20transaction)'},{'id':'passport.guard','family':'F','source':'Passport','target':'Guard','cardinality':'N','read':{'kind':'structFields','path':'guard','field':'guard'},'retention':'complete','evidence':'passport.move\x20L32-47','bridgeIds':['b10','b12'],'label':'Verification\x20tickets\x20the\x20passport\x20carries\x20(each\x20proving\x20a\x20Guard\x20passed)'},{'id':'passport.ticket_relies','family':'F','source':'Passport','target':'Guard','cardinality':'N','read':{'kind':'deep','segments':['guard','relies'],'field':'guard'},'retention':'complete','evidence':'passport.move\x20L32-38,L114-151','bridgeIds':['b10','b12'],'label':'Sub-Guards\x20a\x20verification\x20ticket\x20actually\x20evaluated\x20(ticket-level\x20dependency\x20fanout)'},{'id':'passport.impack','family':'F','source':'Passport','target':ANY,'cardinality':'N','read':{'kind':'fields','path':'impack'},'retention':'complete','evidence':'passport.move\x20L29,L46,L227-242','bridgeIds':['b12'],'label':'Business\x20objects\x20packed\x20into\x20the\x20passport\x20verification\x20context'},{'id':'proof.signer','family':'F','source':'Proof','target':EOA,'cardinality':0x1,'read':{'kind':'field','path':'signer'},'retention':'complete','evidence':'proof.move\x20L14-25','bridgeIds':['b12'],'label':'Party\x20who\x20signed\x20the\x20WTS\x20evidence\x20(accountability\x20for\x20the\x20claim)'},{'id':'proof.about','family':'F','source':'Proof','target':ANY,'cardinality':'0..1','read':{'kind':'field','path':'about'},'retention':'complete','evidence':'proof.move\x20L14-25','bridgeIds':['b12'],'label':'Object\x20the\x20evidence\x20attests\x20to\x20(the\x20subject\x20of\x20the\x20WTS\x20claim)'},{'id':'treasury.permission','family':'F','source':'Treasury','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'treasury.move\x20L73-83','bridgeIds':['b09'],'label':'Permission\x20group\x20deciding\x20who\x20may\x20move\x20treasury\x20funds'},{'id':'treasury.um','family':'F','source':'Treasury','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'treasury.move\x20L82,L86-95,L504-510','bridgeIds':['b11'],'label':'Treasury\x20membership\x20book\x20—\x20roster\x20deciding\x20who\x20may\x20operate\x20treasury\x20flows\x20under\x20member\x20roles'},{'id':'treasury.deposit_guard','family':'F','source':'Treasury','target':'Guard','cardinality':'N','read':{'kind':'structFields','path':'external_deposit_guard','field':'guard'},'retention':'complete','evidence':'treasury.move\x20L61-65,L78,L138-194','bridgeIds':['b10'],'label':'Guards\x20authorized\x20to\x20release\x20external\x20deposits\x20into\x20the\x20treasury\x20(carries\x20identifier/store_from_id\x20slots)'},{'id':'treasury.withdraw_guard','family':'F','source':'Treasury','target':'Guard','cardinality':'N','read':{'kind':'structFields','path':'external_withdraw_guard','field':'guard'},'retention':'complete','evidence':'treasury.move\x20L67-71,L79,L197-250','bridgeIds':['b10'],'label':'Guards\x20authorized\x20to\x20pay\x20external\x20withdrawals\x20out\x20of\x20the\x20treasury\x20(pays\x20the\x20tx\x20sender\x20only;\x20carries\x20identifier/store_from_id\x20slots)'},{'id':'payment.signer','family':'F','source':'Payment','target':EOA,'cardinality':0x1,'read':{'kind':'field','path':'signer'},'retention':'complete','evidence':'payment.move\x20L93-101,L111','bridgeIds':['b08'],'contract':{'field':'signer','frozenWhen':'after\x20create','forbiddenActions':['set','update','remove'],'allowedActions':[],'unfreeze':null,'moveAnchor':'payment.move\x20new\x20(signer\x20=\x20tx_context::sender\x20at\x20creation)'},'label':'EOA\x20that\x20submitted\x20the\x20payment\x20(payer\x20of\x20record)'}],R_EDGES=[{'id':'eoa.permission','family':'R','source':EOA,'target':'Permission','cardinality':'N','read':{'kind':'reverse','parent':WOW_SINGLETON_IDS['entityPermission']},'retention':'membership','evidence':'entity_permission.move\x20L32\x20(bits\x201/2/4)','bridgeIds':['b09'],'label':'Permission\x20groups\x20the\x20account\x20currently\x20belongs\x20to\x20(membership;\x20disappears\x20on\x20removal)'},{'id':'eoa.order','family':'R','source':EOA,'target':'Order','cardinality':'N','read':{'kind':'reverse','parent':WOW_SINGLETON_IDS['entityOrder']},'retention':'bounded_window','evidence':'entity_order.move\x20L31\x20(FIFO\x205200)','bridgeIds':['b01'],'label':'Orders\x20the\x20account\x20joined\x20as\x20buyer/agent\x20(buyer\x20view,\x20FIFO\x205200)'},{'id':'eoa.contact','family':'R','source':EOA,'target':'Contact','cardinality':'N','read':{'kind':'reverse','parent':WOW_SINGLETON_IDS['entityContact']},'retention':'membership','evidence':'entity_contact.move\x20L24','bridgeIds':['b11'],'label':'Contact\x20books\x20the\x20account\x20currently\x20joined'},{'id':'permission.core_binding','family':'R','source':'Permission','target':ANY,'cardinality':'N','read':{'kind':'reverse','parent':WOW_SINGLETON_IDS['objectLinkerCore']},'retention':'bounded_exact','evidence':'object_linker.move\x20L37,L88\x20(≤5200\x20aborts)','bridgeIds':['b09'],'label':'Business\x20objects\x20this\x20permission\x20group\x20governs\x20(Service/Demand/Machine/...;\x20exact\x20registry,\x20no\x20eviction)'},{'id':'permission.tx_binding','family':'R','source':'Permission','target':ANY,'cardinality':'N','read':{'kind':'reverse','parent':WOW_SINGLETON_IDS['objectLinkerTx']},'retention':'bounded_window','evidence':'object_linker.move\x20L43\x20(FIFO\x205200\x20operational)','bridgeIds':['b09'],'label':'Objects\x20this\x20permission\x20group\x20has\x20acted\x20on\x20at\x20runtime\x20(FIFO\x205200;\x20oldest\x20evicted)'},{'id':'service.order','family':'R','source':'Service','target':'Order','cardinality':'N','read':{'kind':'reverse','parent':WOW_SINGLETON_IDS['objectLinkerTx'],'filterType':'Order'},'retention':'bounded_window','evidence':'object_linker.move\x20L43,L136-140\x20(FIFO\x205200)','bridgeIds':['b01'],'label':'Orders\x20the\x20shop\x20currently\x20retains\x20in\x20its\x20window\x20(FIFO\x205200,\x20oldest\x20evicted;\x20complete\x20history\x20via\x20the\x20event\x20channel)'},{'id':'target.vote','family':'S','source':ANY,'target':EOA,'cardinality':'N','read':{'kind':'reverse','parent':WOW_SINGLETON_IDS['registrar']},'retention':'bounded_window','evidence':'registrar.move\x20L154-171\x20(ring\x205200,\x20bits\x200x02/0x04/0x08)','label':'Reputation\x20votes\x20the\x20address\x20has\x20received\x20(like/dislike/favor;\x20ring\x205200,\x20oldest\x20evicted)'},{'id':'entity.profile','family':'S','source':EOA,'target':EOA,'cardinality':'0..1','read':{'kind':'reverse','parent':WOW_SINGLETON_IDS['entity']},'retention':'membership','evidence':'registrar.move\x20L146-152,L176-179,L236-242,L503-560\x20(AddressInfo\x20current\x20row;\x20description/records\x20mutable\x20by\x20the\x20entity)','label':'Self-published\x20entity\x20profile:\x20description,\x20registration\x20time\x20and\x20typed\x20records\x20(self-edge\x20carrying\x20row\x20attributes)'},{'id':'entity.referrer','family':'S','source':EOA,'target':EOA,'cardinality':'0..1','read':{'kind':'reverse','parent':WOW_SINGLETON_IDS['entity']},'retention':'membership','evidence':'registrar.move\x20L149,L236-242\x20(AddressInfo.referrer\x20Option<address>;\x20invitation\x20chain)','label':'Account\x20that\x20referred\x20this\x20entity\x20onto\x20the\x20platform\x20(invitation\x20upline)'},{'id':'entity.resource','family':'S','source':EOA,'target':'Resource','cardinality':'0..1','read':{'kind':'reverse','parent':WOW_SINGLETON_IDS['entity']},'retention':'membership','evidence':'registrar.move\x20L150,L236-241,L265-319\x20(AddressInfo.resource\x20Option<address>;\x20transferable/destroyable)','label':'On-chain\x20Resource\x20identity\x20object\x20held\x20by\x20this\x20entity\x20(transferable,\x20may\x20be\x20destroyed)'}],TABLE_EDGES=[{'id':'permission.entity','family':'R','source':'Permission','target':ANY,'cardinality':'N','read':{'kind':'table','rowType':'PermissionPerm'},'retention':'membership','evidence':'permission.move\x20L34-42\x20(entity\x20may\x20be\x20EOA\x20or\x20Guard\x20address)','bridgeIds':['b04','b09'],'label':'Entity-table\x20members\x20of\x20the\x20permission\x20group\x20(EOA\x20or\x20Guard,\x20carrying\x20perm\x20index\x20bits)'},{'id':'demand.presenter','family':'R','source':'Demand','target':EOA,'cardinality':'N','read':{'kind':'table','rowType':'DemandPresenter'},'retention':'membership','evidence':'demand.move\x20L46-54,L74\x20(presenters\x20table)','bridgeIds':['b03'],'label':'Suppliers\x20that\x20presented\x20to\x20the\x20demand,\x20with\x20acceptance_score'},{'id':'demand.presenter_service','family':'R','source':'Demand','target':'Service','cardinality':'N','read':{'kind':'table','rowType':'DemandPresenter'},'retention':'membership','evidence':'demand.move\x20L46-54,L79-118\x20(ServiceInfo.service\x20Option)','bridgeIds':['b03'],'label':'Services\x20proposed\x20by\x20presenters\x20on\x20the\x20demand\x20(same-row\x20co-edge\x20of\x20demand.presenter;\x20absent\x20for\x20bare\x20presents)'},{'id':'machine.node','family':'W','source':'Machine','target':'MachineNode','cardinality':'N','read':{'kind':'table','rowType':'MachineNode'},'retention':'complete','evidence':'machine.move\x20L299-308\x20(immutable\x20after\x20publish)','bridgeIds':['b04'],'contract':{'field':'nodes','frozenWhen':'after\x20publish','forbiddenActions':['add','remove','update'],'allowedActions':[],'unfreeze':null,'moveAnchor':'machine.move\x20node_add_imp\x20/\x20node_remove_imp\x20/\x20node_rename_imp\x20(assert_not_published)'},'label':'The\x20workflow\x27s\x20step\x20table\x20(full\x20node\x20graph;\x20frozen\x20at\x20publish)'},{'id':'treasury.record','family':'M','source':'Treasury','target':'Payment','cardinality':'N','read':{'kind':'table','rowType':'TreasuryRecord'},'retention':'complete','evidence':'treasury.move\x20L39-46,L77\x20(history:\x20ParentTable<address,Record>,\x20key\x20=\x20Payment;\x20append-only)','bridgeIds':['b08'],'label':'Ledger\x20entries\x20tying\x20each\x20withdrawal/deposit/receive\x20Payment\x20to\x20its\x20op\x20code,\x20signer,\x20external\x20guard\x20and\x20amount'},{'id':'reward.claim','family':'M','source':'Reward','target':EOA,'cardinality':'N','read':{'kind':'table','rowType':'RewardClaimRecord'},'retention':'complete','evidence':'reward.move\x20L117-138,L180-193\x20(record:\x20ParentTable<address,RecipientRecord>;\x20key\x20=\x20claimant)','bridgeIds':['b07'],'label':'Claimants\x20against\x20the\x20reward\x20pool,\x20with\x20lifetime\x20total\x20and\x20per-guard\x20claim\x20legs'},{'id':'repository.data_about','family':'F','source':'Repository','target':ANY,'cardinality':'N','read':{'kind':'table','rowType':'RepositoryData'},'retention':'membership','evidence':'repository.move\x20L455-465,L161-173\x20(data:\x20ParentTable<DataKey{id,key},\x20vector<u8>>)','bridgeIds':['b02'],'label':'Business\x20objects\x20the\x20stored\x20evidence\x20rows\x20are\x20about\x20(DataKey.id,\x20carrying\x20the\x20row\x20key\x20name)'}],W_EDGES=[{'id':'wf.transition','family':'W','source':'MachineNode','target':'MachineNode','cardinality':'N','read':{'kind':'derived','producer':'machineRows'},'retention':'derived','evidence':'machine.move\x20L101\x20NodePair,L269','bridgeIds':['b04'],'label':'Directed\x20hand-off\x20from\x20workflow\x20step\x20to\x20step\x20(carries\x20the\x20advance\x20threshold)'},{'id':'wf.forward_guard','family':'W','source':'MachineNode','target':'Guard','cardinality':'N','read':{'kind':'derived','producer':'machineRows'},'retention':'derived','evidence':'machine.move\x20L63\x20Forward','bridgeIds':['b04','b05','b10','b12'],'label':'Guards\x20evaluated\x20after\x20a\x20step\x20advances\x20(where\x20supply-chain\x20payouts\x20and\x20downstream\x20allocations\x20trigger)'}],M_EDGES=[{'id':'payment.recipient','family':'M','source':'Payment','target':EOA,'cardinality':'N','read':{'kind':'structFields','path':'record','field':'recipient'},'retention':'complete','evidence':'payment.move\x20L93-101\x20(Revenue≤200)','bridgeIds':['b05','b08'],'label':'Payment\x20allocation\x20recipients\x20(with\x20amounts,\x20leg\x20by\x20leg)'},{'id':'payment.from_object','family':'M','source':'Payment','target':ANY,'cardinality':'0..1','read':{'kind':'field','path':'from_object'},'retention':'complete','evidence':'payment.move\x20L149-161\x20(framework-only)','bridgeIds':['b05','b08'],'label':'Funding\x20source\x20pool\x20(Treasury/Allocation/Service;\x20framework-settable\x20only)'},{'id':'payment.for_object','family':'M','source':'Payment','target':ANY,'cardinality':'0..1','read':{'kind':'field','path':'info.for_object'},'retention':'complete','evidence':'payment.move\x20L93-101\x20(info\x20routing\x20hint)','bridgeIds':['b05','b08'],'label':'Business\x20routing\x20object\x20(user-settable)'},{'id':'payment.for_guard','family':'M','source':'Payment','target':'Guard','cardinality':'0..1','read':{'kind':'field','path':'info.for_guard'},'retention':'complete','evidence':'payment.move\x20L93-101','bridgeIds':['b05'],'label':'Guard\x20the\x20payment\x20was\x20routed\x20under\x20(user-settable\x20routing\x20context)'},{'id':'allocation.for_object','family':'M','source':'Allocation','target':ANY,'cardinality':'0..1','read':{'kind':'field','path':'payment_info.for_object'},'retention':'complete','evidence':'allocation.move\x20L200;\x20payment.move\x20L66-71','bridgeIds':['b05','b08'],'label':'Business\x20object\x20the\x20pool\x27s\x20payouts\x20are\x20routed\x20for'},{'id':'allocation.for_guard','family':'M','source':'Allocation','target':'Guard','cardinality':'0..1','read':{'kind':'field','path':'payment_info.for_guard'},'retention':'complete','evidence':'allocation.move\x20L200;\x20payment.move\x20L66-71','bridgeIds':['b05','b08'],'label':'Gate\x20context\x20the\x20pool\x27s\x20payouts\x20are\x20routed\x20under'}],EVENT_EDGES=[{'id':'service.order_history','family':'E','source':'Service','target':'Order','cardinality':'N','read':{'kind':'event','eventType':PackageAddress+'::order::NewOrderEvent','matchField':'service','targetField':'object'},'retention':'event_full','evidence':'order.move\x20L51-58,L142\x20(NewOrderEvent:\x20object/service/progress/discount/allocation/amount)','label':'Every\x20order\x20ever\x20created\x20in\x20the\x20shop\x20—\x20complete\x20event\x20stream,\x20beyond\x20the\x20FIFO\x205200\x20shop-order\x20window'},{'id':'eoa.order_history','family':'E','source':EOA,'target':'Order','cardinality':'N','read':{'kind':'event','eventType':PackageAddress+'::order::NewOrderEvent','matchSender':!![],'targetField':'object'},'retention':'event_full','evidence':'order.move\x20L51-58,L142\x20+\x20indexer\x20tx\x20sender\x20(the\x20transacting\x20buyer)','label':'Orders\x20the\x20account\x20created\x20as\x20the\x20transacting\x20buyer\x20—\x20complete\x20event\x20stream,\x20beyond\x20the\x20FIFO\x205200\x20buyer\x20window'},{'id':'arb.history','family':'E','source':'Arbitration','target':'Arb','cardinality':'N','read':{'kind':'event','eventType':PackageAddress+'::arb::ArbEvent','matchField':'arbitration','targetField':'object'},'retention':'event_full','evidence':'arb.move\x20L33-43,L122,L227\x20(ArbEvent:\x20case/arbitration/order/status/indemnity)','label':'Every\x20dispute\x20case\x20the\x20arbitration\x20service\x20ever\x20handled\x20—\x20complete\x20event\x20stream;\x20latest\x20status\x20transition\x20wins\x20per\x20case'}];export const EDGE_SCHEMAS=[...F_EDGES,...R_EDGES,...TABLE_EDGES,...W_EDGES,...M_EDGES,...EVENT_EDGES];export const EDGE_SCHEMA_BY_ID=new Map(EDGE_SCHEMAS['map'](a=>[a['id'],a]));export function outgoingSchemaIds(a){return EDGE_SCHEMAS['filter'](b=>b['source']===a||b['source']===ANY)['map'](b=>b['id']);}export const COVERED_OBJECT_TYPES=[...new Set(EDGE_SCHEMAS['flatMap'](a=>[a['source'],a['target']])['filter'](a=>a!==EOA&&a!==ANY&&a!=='MachineNode'))];
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ import{describe,expect,it}from'vitest';import{EntityAddress,ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'./dataplane.js';import{expandTopology}from'./expand.js';import{extractReverseRefs}from'./extract.js';import{FULL,fullServiceState}from'./fixtures.js';import{buildViewport,edgesOut,profileOf}from'./viewport.js';const ENTITY_SCHEMAS=['entity.profile','entity.referrer','entity.resource'];function byId(a){return new Map(a['map'](b=>[b['schemaId'],b['refs']]));}async function graphFrom(a){const b=new FakeDataPlane(fullServiceState()),c=await expandTopology(b,{'network':ENTRYPOINT['Mainnet'],'seed':a,'edges':{'schemas':ENTITY_SCHEMAS}});return{'plane':b,'graph':c};}describe('Task\x209\x20entity\x20registrar\x20—\x20pure\x20extraction\x20(TR-9.1)',()=>{it('complete\x20SDK-shaped\x20AddressInfo\x20row\x20yields\x20profile\x20+\x20referrer\x20+\x20resource',()=>{const a=extractReverseRefs(EntityAddress,{'description':'Acme\x20logistics\x20co.','time':0x18bcfe57b88,'referrer':FULL['merchant'],'mark_object':FULL['resource'],'records':[{'name':'region','value_type':0x1,'value':'cn-east'}]}),b=byId(a);expect([...b['keys']()]['sort']())['toEqual'](['entity.profile','entity.referrer','entity.resource']['sort']());const c=b['get']('entity.profile')[0x0];expect(c['to'])['toBe'](''),expect(c['payload'])['toMatchObject']({'description':'Acme\x20logistics\x20co.','registeredAt':0x18bcfe57b88,'profileRecords':[{'name':'region','valueType':0x1,'value':'cn-east'}]}),expect(b['get']('entity.referrer')['map'](d=>d['to']))['toEqual']([FULL['merchant']]),expect(b['get']('entity.resource')['map'](d=>d['to']))['toEqual']([FULL['resource']]);}),it('raw\x20Move\x20shape\x20(resource\x20/\x20typed_value)\x20parses\x20identically',()=>{const a=byId(extractReverseRefs(EntityAddress,{'description':'on-chain\x20native','time':0x1,'referrer':null,'resource':FULL['resource'],'records':[{'name':'tag','typed_value':[0x1,0x2,0x3]}]}));expect(a['get']('entity.resource')[0x0]['to'])['toBe'](FULL['resource']),expect(a['has']('entity.referrer'))['toBe'](![]),expect(a['get']('entity.profile')[0x0]['payload']?.['profileRecords'])['toEqual']([{'name':'tag','value':[0x1,0x2,0x3]}]);}),it('null\x20Options\x20and\x20no\x20records\x20yield\x20only\x20the\x20profile\x20edge',()=>{const a=byId(extractReverseRefs(EntityAddress,{'description':'warehouse\x20member','time':0x18bcfe57f70,'referrer':null,'resource':null,'records':[]}));expect([...a['keys']()])['toEqual'](['entity.profile']),expect(a['get']('entity.profile')[0x0]['payload'])['toEqual']({'description':'warehouse\x20member','registeredAt':0x18bcfe57f70});}),it('empty/garbage\x20row\x20still\x20yields\x20one\x20profile\x20edge,\x20never\x20throws',()=>{const a=byId(extractReverseRefs(EntityAddress,{}));expect([...a['keys']()])['toEqual'](['entity.profile']),expect(a['get']('entity.profile')[0x0]['payload'])['toEqual']({});const b=byId(extractReverseRefs(EntityAddress,{'description':0x2a,'time':'not-a-time','referrer':'0xdead','mark_object':0x3039,'records':[{'value_type':0x1},'junk',{'name':'ok','value_type':0x0,'value':!![]}]}));expect(b['has']('entity.referrer'))['toBe'](![]),expect(b['has']('entity.resource'))['toBe'](![]),expect(b['get']('entity.profile')[0x0]['payload']?.['profileRecords'])['toEqual']([{'name':'ok','valueType':0x0,'value':!![]}]);});}),describe('Task\x209\x20entity\x20registrar\x20—\x20end-to-end\x20expansion\x20(TR-9.1)',()=>{it('all\x20three\x20co-edges\x20materialize\x20from\x20one\x20keyed\x20channel\x20read;\x20Resource\x20node\x20is\x20typed\x20and\x20fetched',async()=>{const {plane:a,graph:b}=await graphFrom(FULL['supplier']),c=f=>b['edges']['filter'](g=>g['schema']===f),d=c('entity.profile');expect(d)['toHaveLength'](0x1),expect(d[0x0]['from'])['toBe'](FULL['supplier']),expect(d[0x0]['to'])['toBe'](FULL['supplier']),expect(d[0x0]['payload'])['toMatchObject']({'description':'Acme\x20logistics\x20co.','registeredAt':0x18bcfe57b88}),expect(d[0x0]['payload']?.['profileRecords'])['toHaveLength'](0x1),expect(c('entity.referrer')['map'](f=>f['to']))['toEqual']([FULL['merchant']]),expect(c('entity.resource')['map'](f=>f['to']))['toEqual']([FULL['resource']]);const e=b['nodes']['get'](FULL['resource']['toLowerCase']());expect(e['kind'])['toBe']('object'),expect(e['objectType'])['toBe']('Resource'),expect(e['state'])['toBe']('fetched'),expect(a['batches']['keyedFields'])['toBe'](0x2),expect(b['gaps'])['toEqual']([]);}),it('row\x20with\x20null\x20Options\x20produces\x20the\x20profile\x20self-edge\x20only',async()=>{const {graph:a}=await graphFrom(FULL['member']),b=new Set(a['edges']['map'](d=>d['schema']));expect(b['has']('entity.profile'))['toBe'](!![]),expect(b['has']('entity.referrer'))['toBe'](![]),expect(b['has']('entity.resource'))['toBe'](![]);const c=a['edges']['find'](d=>d['schema']==='entity.profile');expect(c['from'])['toBe'](FULL['member']),expect(c['to'])['toBe'](FULL['member']),expect(c['payload']?.['description'])['toBe']('warehouse\x20member');}),it('absent\x20profile\x20row\x20produces\x20no\x20entity\x20edges\x20and\x20no\x20error',async()=>{const {plane:a,graph:b}=await graphFrom(FULL['buyer']);expect(b['edges']['filter'](c=>ENTITY_SCHEMAS['includes'](c['schema'])))['toEqual']([]),expect(b['gaps'])['toEqual']([]),expect(a['batches']['keyedFields'])['toBe'](0x1);});}),describe('Task\x209\x20viewport\x20—\x20personal-data\x20minimization\x20(TR-9.2)',()=>{it('neutral\x20tooling\x20sees\x20the\x20full\x20profile\x20payload',async()=>{const {graph:a}=await graphFrom(FULL['supplier']),b=buildViewport(a,FULL['supplier'],'neutral'),c=profileOf(b,FULL['supplier']);expect(c['description'])['toBe']('Acme\x20logistics\x20co.'),expect(c['profileRecords'])['toHaveLength'](0x1),expect(c['hasDescription'])['toBeUndefined']();}),it('subject\x20sees\x20its\x20own\x20full\x20profile\x20under\x20a\x20retail\x20role;\x20referrer/resource\x20stay\x20denied',async()=>{const {graph:a}=await graphFrom(FULL['supplier']),b=buildViewport(a,FULL['supplier'],'buyer');expect(profileOf(b,FULL['supplier'])?.['description'])['toBe']('Acme\x20logistics\x20co.'),expect(edgesOut(b,FULL['supplier'],'entity.referrer'))['toEqual']([]),expect(edgesOut(b,FULL['supplier'],'entity.resource'))['toEqual']([]),expect(b['visibleNodes']['has'](FULL['resource']['toLowerCase']()))['toBe'](![]);}),it('commercial\x20roles\x20see\x20third\x20parties\x20through\x20the\x20minimized\x20projection\x20only',async()=>{const {graph:a}=await graphFrom(FULL['supplier']),b=buildViewport(a,FULL['merchant'],'merchant');expect(b['visibleNodes']['has'](FULL['supplier']['toLowerCase']()))['toBe'](!![]);const c=profileOf(b,FULL['supplier']);expect(c['hasDescription'])['toBe'](!![]),expect(c['recordCount'])['toBe'](0x1),expect(c['registeredAt'])['toBe'](0x18bcfe57b88),expect(c['description'])['toBeUndefined'](),expect(c['profileRecords'])['toBeUndefined']();const d=a['edges']['find'](f=>f['schema']==='entity.profile');expect(d['payload']?.['description'])['toBe']('Acme\x20logistics\x20co.'),expect(edgesOut(b,FULL['supplier'],'entity.referrer'))['toHaveLength'](0x1),expect(edgesOut(b,FULL['supplier'],'entity.resource'))['toHaveLength'](0x1);}),it('roles\x20without\x20a\x20social\x20surface\x20see\x20no\x20entity\x20edges\x20at\x20all',async()=>{const {graph:a}=await graphFrom(FULL['supplier']),b=buildViewport(a,FULL['supplier'],'supplier');expect(profileOf(b,FULL['supplier']))['toBeUndefined'](),expect(edgesOut(b,FULL['supplier'],'entity.profile'))['toEqual']([]),expect(edgesOut(b,FULL['supplier'],'entity.referrer'))['toEqual']([]),expect(edgesOut(b,FULL['supplier'],'entity.resource'))['toEqual']([]);});});
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ import{describe,expect,it}from'vitest';import{PackageAddress,ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'./dataplane.js';import{expandTopology}from'./expand.js';import{FULL,fullServiceState,rowObject}from'./fixtures.js';import{pathConfidence}from'./analyze.js';const ORDER_EVENT=PackageAddress+'::order::NewOrderEvent',ARB_EVENT=PackageAddress+'::arb::ArbEvent',ORDER_OLD_A='0x6600000000000000000000000000000000000000000000000000000000000a01',ORDER_OLD_B='0x6600000000000000000000000000000000000000000000000000000000000a02',CASE_OLD='0x6700000000000000000000000000000000000000000000000000000000000b01';function envelope(a,b,c,d){return{'id':{'txDigest':'tx'+c,'eventSeq':String(c)},'type':a,'sender':b,'timestampMs':String(c),'parsedJson':d};}function orderCreated(a,b,c,d=FULL['svc']){return envelope(ORDER_EVENT,b,c,{'object':a,'service':d,'amount':'500000'});}function withEvents(a){const b=fullServiceState();return b['events']=new Map([[ORDER_EVENT,a]]),b['objects']['set'](ORDER_OLD_A['toLowerCase'](),rowObject('Order',{'service':FULL['svc'],'amount':'1'})['object']),b['objects']['set'](ORDER_OLD_B['toLowerCase'](),rowObject('Order',{'service':FULL['svc'],'amount':'2'})['object']),b;}describe('Task\x2010\x20E\x20family\x20—\x20order\x20history\x20streams\x20(TR-10.1)',()=>{it('service.order_history\x20pulls\x20orders\x20beyond\x20the\x20FIFO\x20window;\x20retention\x20event_full,\x20exact\x20confidence',async()=>{const a=new FakeDataPlane(withEvents([{'events':[orderCreated(ORDER_OLD_A,FULL['buyer'],0x3e8),orderCreated(ORDER_OLD_B,FULL['agent'],0x44c)]},{'events':[orderCreated(FULL['o1'],FULL['buyer'],0x7d0)]}])),b=await expandTopology(a,{'network':ENTRYPOINT['Mainnet'],'seed':FULL['svc'],'edges':{'eventEdges':['service.order_history']}}),c=b['edges']['filter'](f=>f['schema']==='service.order_history');expect(c['map'](f=>f['to'])['sort']())['toEqual']([FULL['o1'],ORDER_OLD_A,ORDER_OLD_B]['sort']()),expect(c['every'](f=>f['from']===FULL['svc']['toLowerCase']()))['toBe'](!![]),expect(c['every'](f=>f['retention']==='event_full'&&!f['truncated']))['toBe'](!![]);const d=c['find'](f=>f['to']===ORDER_OLD_A);expect(d['payload'])['toMatchObject']({'amount':'500000','service':FULL['svc']['toLowerCase'](),'time':0x3e8}),expect(b['nodes']['get'](ORDER_OLD_A['toLowerCase']())?.['state'])['toBe']('fetched'),expect(a['batches']['events'])['toBe'](0x2),expect(pathConfidence({'graph':b,'observer':FULL['svc'],'role':'neutral','visibleNodes':new Set(),'visibleEdges':[],'edgeById':new Map(),'maskedNodes':new Set()},[{'schema':'service.order_history','from':FULL['svc'],'retention':'event_full'}])['confidence'])['toBe']('exact'),expect(b['gaps'])['toEqual']([]);}),it('eoa.order_history\x20matches\x20the\x20tx\x20sender\x20(transacting\x20buyer),\x20not\x20a\x20parsed\x20field',async()=>{const a=new FakeDataPlane(withEvents([{'events':[orderCreated(ORDER_OLD_A,FULL['buyer'],0x3e8),orderCreated(ORDER_OLD_B,FULL['merchant'],0x44c)]}])),b=await expandTopology(a,{'network':ENTRYPOINT['Mainnet'],'seed':FULL['buyer'],'edges':{'eventEdges':['eoa.order_history']}}),c=b['edges']['filter'](d=>d['schema']==='eoa.order_history');expect(c['map'](d=>d['to']))['toEqual']([ORDER_OLD_A]),expect(c[0x0]['from'])['toBe'](FULL['buyer']);}),it('arb.history:\x20repeat\x20status\x20transitions\x20collapse\x20to\x20one\x20edge\x20per\x20case,\x20latest\x20wins',async()=>{const a=fullServiceState();a['events']=new Map([[ARB_EVENT,[{'events':[envelope(ARB_EVENT,FULL['merchant'],0x3e8,{'object':CASE_OLD,'arbitration':FULL['arbsvc'],'order':FULL['o2'],'status':0x1})]},{'events':[envelope(ARB_EVENT,FULL['merchant'],0x2328,{'object':CASE_OLD,'arbitration':FULL['arbsvc'],'order':FULL['o2'],'status':0x3,'indemnity_amount':'700'})]}]]]);const b=new FakeDataPlane(a),c=await expandTopology(b,{'network':ENTRYPOINT['Mainnet'],'seed':FULL['arbsvc'],'edges':{'eventEdges':['arb.history']}}),d=c['edges']['filter'](f=>f['schema']==='arb.history');expect(d)['toHaveLength'](0x1),expect(d[0x0]['to'])['toBe'](CASE_OLD),expect(d[0x0]['payload'])['toMatchObject']({'status':0x3,'indemnity_amount':'700'});});}),describe('Task\x2010\x20E\x20family\x20—\x20degradation\x20semantics\x20(TR-10.2)',()=>{it('failed\x20event\x20channel:\x20graph\x20builds,\x20gap\x20records\x20the\x20stream,\x20no\x20edges,\x20no\x20throw',async()=>{const a=fullServiceState();a['events']=new Map([[ORDER_EVENT,[{'events':[],'fail':!![]}]]]);const b=new FakeDataPlane(a),c=await expandTopology(b,{'network':ENTRYPOINT['Mainnet'],'seed':FULL['svc'],'edges':{'eventEdges':['service.order_history']}});expect(c['edges']['filter'](d=>d['schema']==='service.order_history'))['toEqual']([]),expect(c['gaps'])['toContain']('events:'+ORDER_EVENT),expect(c['edges']['some'](d=>d['schema']==='service.order'))['toBe'](!![]),expect(b['batches']['events'])['toBe'](0x1);}),it('page-budget\x20truncation:\x20edges\x20stained\x20truncated\x20+\x20event_pages\x20record\x20+\x20windowed\x20confidence',async()=>{const a=new FakeDataPlane(withEvents([{'events':[orderCreated(ORDER_OLD_A,FULL['buyer'],0x3e8)]},{'events':[orderCreated(FULL['o1'],FULL['buyer'],0x7d0)]}])),b=await expandTopology(a,{'network':ENTRYPOINT['Mainnet'],'seed':FULL['svc'],'budget':{'maxEventPages':0x1},'edges':{'eventEdges':['service.order_history']}}),c=b['edges']['filter'](f=>f['schema']==='service.order_history');expect(c['map'](f=>f['to']))['toEqual']([FULL['o1']]),expect(c['every'](f=>f['truncated']===!![]))['toBe'](!![]);const d=b['truncations']['find'](e=>e['schema']==='service.order_history');expect(d)['toMatchObject']({'nodeId':FULL['svc']['toLowerCase'](),'reason':'event_pages','limit':0x1}),expect(b['budgetExhausted']['eventPages'])['toBe'](!![]),expect(pathConfidence({'graph':b,'observer':FULL['svc'],'role':'neutral','visibleNodes':new Set(),'visibleEdges':[],'edgeById':new Map(),'maskedNodes':new Set()},[{'schema':'service.order_history','from':FULL['svc'],'retention':'event_full','truncated':!![]}])['confidence'])['toBe']('windowed');});}),describe('Task\x2010\x20E\x20family\x20—\x20opt-in\x20discipline',()=>{it('events\x20stay\x20OFF\x20by\x20default\x20even\x20when\x20stream\x20data\x20exists',async()=>{const a=new FakeDataPlane(withEvents([{'events':[orderCreated(ORDER_OLD_A,FULL['buyer'],0x3e8)]}])),b=await expandTopology(a,{'network':ENTRYPOINT['Mainnet'],'seed':FULL['svc'],'edges':{}});expect(a['batches']['events'])['toBe'](0x0),expect(b['edges']['filter'](c=>c['family']==='E'))['toEqual']([]);}),it('eventEdges\x20are\x20independent\x20of\x20the\x20schemas\x20whitelist\x20(channel\x20D,\x20like\x20channel\x20B)',async()=>{const a=new FakeDataPlane(withEvents([{'events':[orderCreated(ORDER_OLD_A,FULL['buyer'],0x3e8)]}])),b=await expandTopology(a,{'network':ENTRYPOINT['Mainnet'],'seed':FULL['svc'],'edges':{'schemas':['service.order'],'eventEdges':['service.order_history']}});expect(a['batches']['events'])['toBe'](0x1),expect(b['edges']['some'](c=>c['schema']==='service.order_history'))['toBe'](!![]);});});