@wowok/agent-mcp 3.1.2 → 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 (300) 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/architecture.spec.d.ts +1 -0
  11. package/dist/evaluation/architecture.spec.js +1 -0
  12. package/dist/evaluation/builtins/graph-service.d.ts +16 -0
  13. package/dist/evaluation/builtins/graph-service.js +1 -0
  14. package/dist/evaluation/builtins/graph-service.spec.d.ts +1 -0
  15. package/dist/evaluation/builtins/graph-service.spec.js +1 -0
  16. package/dist/evaluation/builtins/index.d.ts +1 -1
  17. package/dist/evaluation/builtins/index.js +1 -1
  18. package/dist/evaluation/builtins/purity.spec.d.ts +1 -0
  19. package/dist/evaluation/builtins/purity.spec.js +1 -0
  20. package/dist/evaluation/engine.js +1 -1
  21. package/dist/evaluation/facets/catalog.d.ts +19 -0
  22. package/dist/evaluation/facets/catalog.js +1 -0
  23. package/dist/evaluation/guard-scan.d.ts +10 -0
  24. package/dist/evaluation/guard-scan.js +1 -0
  25. package/dist/evaluation/standards.d.ts +31 -0
  26. package/dist/evaluation/standards.js +1 -0
  27. package/dist/evaluation/standards.spec.d.ts +1 -0
  28. package/dist/evaluation/standards.spec.js +1 -0
  29. package/dist/evaluation/types.d.ts +9 -0
  30. package/dist/experience/realtime-feedback.js +1 -1
  31. package/dist/extensions/index.d.ts +1 -1
  32. package/dist/extensions/index.js +1 -1
  33. package/dist/extensions/industry-layers.d.ts +6 -5
  34. package/dist/extensions/industry-layers.js +1 -1
  35. package/dist/extensions/industry-pack.js +1 -1
  36. package/dist/graph/onchain/analyze.d.ts +13 -0
  37. package/dist/graph/onchain/analyze.js +1 -1
  38. package/dist/graph/onchain/analyze.spec.js +1 -1
  39. package/dist/graph/onchain/dataplane.d.ts +1 -1
  40. package/dist/graph/onchain/dataplane.js +1 -1
  41. package/dist/graph/onchain/edge-batch.spec.d.ts +1 -0
  42. package/dist/graph/onchain/edge-batch.spec.js +1 -0
  43. package/dist/graph/onchain/edge-schema.d.ts +10 -2
  44. package/dist/graph/onchain/edge-schema.js +1 -1
  45. package/dist/graph/onchain/entity-profile.spec.d.ts +1 -0
  46. package/dist/graph/onchain/entity-profile.spec.js +1 -0
  47. package/dist/graph/onchain/event-history.spec.d.ts +1 -0
  48. package/dist/graph/onchain/event-history.spec.js +1 -0
  49. package/dist/graph/onchain/expand.js +1 -1
  50. package/dist/graph/onchain/extract-deep.spec.d.ts +1 -0
  51. package/dist/graph/onchain/extract-deep.spec.js +1 -0
  52. package/dist/graph/onchain/extract.d.ts +11 -3
  53. package/dist/graph/onchain/extract.js +1 -1
  54. package/dist/graph/onchain/facet-projection.d.ts +99 -0
  55. package/dist/graph/onchain/facet-projection.js +1 -0
  56. package/dist/graph/onchain/facet-projection.spec.d.ts +1 -0
  57. package/dist/graph/onchain/facet-projection.spec.js +1 -0
  58. package/dist/graph/onchain/facts.d.ts +103 -0
  59. package/dist/graph/onchain/facts.js +1 -0
  60. package/dist/graph/onchain/facts.spec.d.ts +1 -0
  61. package/dist/graph/onchain/facts.spec.js +1 -0
  62. package/dist/graph/onchain/field-manifest.d.ts +29 -0
  63. package/dist/graph/onchain/field-manifest.js +1 -0
  64. package/dist/graph/onchain/field-manifest.spec.d.ts +1 -0
  65. package/dist/graph/onchain/field-manifest.spec.js +1 -0
  66. package/dist/graph/onchain/fixtures.d.ts +80 -0
  67. package/dist/graph/onchain/fixtures.js +1 -0
  68. package/dist/graph/onchain/fixtures.spec.d.ts +1 -0
  69. package/dist/graph/onchain/fixtures.spec.js +1 -0
  70. package/dist/graph/onchain/index.d.ts +8 -2
  71. package/dist/graph/onchain/index.js +1 -1
  72. package/dist/graph/onchain/interest.js +1 -1
  73. package/dist/graph/onchain/label-lint.spec.d.ts +1 -0
  74. package/dist/graph/onchain/label-lint.spec.js +1 -0
  75. package/dist/graph/onchain/names.d.ts +23 -0
  76. package/dist/graph/onchain/names.js +1 -0
  77. package/dist/graph/onchain/names.spec.d.ts +1 -0
  78. package/dist/graph/onchain/names.spec.js +1 -0
  79. package/dist/graph/onchain/onchain.spec.js +1 -1
  80. package/dist/graph/onchain/proposal-graph.d.ts +11 -0
  81. package/dist/graph/onchain/proposal-graph.js +1 -0
  82. package/dist/graph/onchain/proposal-graph.spec.d.ts +1 -0
  83. package/dist/graph/onchain/proposal-graph.spec.js +1 -0
  84. package/dist/graph/onchain/sdk-batch.d.ts +5 -1
  85. package/dist/graph/onchain/sdk-batch.js +1 -1
  86. package/dist/graph/onchain/strategy.d.ts +16 -0
  87. package/dist/graph/onchain/strategy.js +1 -1
  88. package/dist/graph/onchain/strategy.spec.js +1 -1
  89. package/dist/graph/onchain/table-ledger.spec.d.ts +1 -0
  90. package/dist/graph/onchain/table-ledger.spec.js +1 -0
  91. package/dist/graph/onchain/types.d.ts +46 -6
  92. package/dist/graph/onchain/viewport.d.ts +1 -0
  93. package/dist/graph/onchain/viewport.js +1 -1
  94. package/dist/harness/index.d.ts +1 -5
  95. package/dist/harness/index.js +1 -1
  96. package/dist/harness/verify.d.ts +6 -1
  97. package/dist/harness/verify.js +1 -1
  98. package/dist/index.js +1 -1
  99. package/dist/knowledge/allocation-ledger.js +1 -1
  100. package/dist/knowledge/allocation-risk.d.ts +0 -2
  101. package/dist/knowledge/allocation-risk.js +1 -1
  102. package/dist/knowledge/arb-risk.d.ts +0 -1
  103. package/dist/knowledge/arb-risk.js +1 -1
  104. package/dist/knowledge/arbitration-risk.d.ts +0 -2
  105. package/dist/knowledge/arbitration-risk.js +1 -1
  106. package/dist/knowledge/baselines/evaluation-baselines.json +79 -0
  107. package/dist/knowledge/baselines/guard-lint-baseline.spec.d.ts +1 -0
  108. package/dist/knowledge/baselines/guard-lint-baseline.spec.js +1 -0
  109. package/dist/knowledge/baselines/risk-baselines.spec.d.ts +1 -0
  110. package/dist/knowledge/baselines/risk-baselines.spec.js +1 -0
  111. package/dist/knowledge/baselines/risk-cases.d.ts +8 -0
  112. package/dist/knowledge/baselines/risk-cases.js +1 -0
  113. package/dist/knowledge/bridge-risk.d.ts +0 -1
  114. package/dist/knowledge/bridge-risk.js +1 -1
  115. package/dist/knowledge/contact-risk.d.ts +0 -1
  116. package/dist/knowledge/contact-risk.js +1 -1
  117. package/dist/knowledge/contract-invariants.d.ts +1 -0
  118. package/dist/knowledge/contract-invariants.js +1 -1
  119. package/dist/knowledge/demand-risk.d.ts +0 -1
  120. package/dist/knowledge/demand-risk.js +1 -1
  121. package/dist/knowledge/getting-started.js +1 -1
  122. package/dist/knowledge/guard-eval.d.ts +15 -0
  123. package/dist/knowledge/guard-eval.js +1 -0
  124. package/dist/knowledge/guard-eval.spec.d.ts +1 -0
  125. package/dist/knowledge/guard-eval.spec.js +1 -0
  126. package/dist/knowledge/guard-lint.d.ts +1 -1
  127. package/dist/knowledge/guard-lint.js +1 -1
  128. package/dist/knowledge/guard-risk.d.ts +4 -19
  129. package/dist/knowledge/guard-risk.js +1 -1
  130. package/dist/knowledge/index.d.ts +41 -43
  131. package/dist/knowledge/index.js +1 -1
  132. package/dist/knowledge/industry-registry.js +1 -1
  133. package/dist/knowledge/industry-rule-node.d.ts +7 -0
  134. package/dist/knowledge/industry-rule-node.js +1 -0
  135. package/dist/knowledge/jsonrpc-enum.js +1 -1
  136. package/dist/knowledge/machine-risk.d.ts +0 -6
  137. package/dist/knowledge/machine-risk.js +1 -1
  138. package/dist/knowledge/order-risk.d.ts +1 -9
  139. package/dist/knowledge/order-risk.js +1 -1
  140. package/dist/knowledge/payment-risk.d.ts +0 -1
  141. package/dist/knowledge/payment-risk.js +1 -1
  142. package/dist/knowledge/permission-risk.d.ts +0 -3
  143. package/dist/knowledge/permission-risk.js +1 -1
  144. package/dist/knowledge/personal-risk.d.ts +0 -1
  145. package/dist/knowledge/personal-risk.js +1 -1
  146. package/dist/knowledge/progress-risk.d.ts +0 -2
  147. package/dist/knowledge/progress-risk.js +1 -1
  148. package/dist/knowledge/proof-risk.d.ts +0 -1
  149. package/dist/knowledge/proof-risk.js +1 -1
  150. package/dist/knowledge/puzzle-projections.d.ts +11 -0
  151. package/dist/knowledge/puzzle-projections.js +1 -0
  152. package/dist/knowledge/registrar-risk.d.ts +0 -1
  153. package/dist/knowledge/registrar-risk.js +1 -1
  154. package/dist/knowledge/repository-risk.d.ts +0 -1
  155. package/dist/knowledge/repository-risk.js +1 -1
  156. package/dist/knowledge/resource-risk.d.ts +0 -1
  157. package/dist/knowledge/resource-risk.js +1 -1
  158. package/dist/knowledge/reward-risk.d.ts +1 -5
  159. package/dist/knowledge/reward-risk.js +1 -1
  160. package/dist/knowledge/rule-node-analyzers.d.ts +43 -0
  161. package/dist/knowledge/rule-node-analyzers.js +1 -0
  162. package/dist/knowledge/rule-node-analyzers.spec.d.ts +1 -0
  163. package/dist/knowledge/rule-node-analyzers.spec.js +1 -0
  164. package/dist/knowledge/rule-outcome.d.ts +5 -0
  165. package/dist/knowledge/rule-outcome.js +1 -0
  166. package/dist/knowledge/safety-rules.js +1 -1
  167. package/dist/knowledge/scenario-topology.js +1 -1
  168. package/dist/knowledge/service-risk-node.js +1 -1
  169. package/dist/knowledge/service-risk.d.ts +0 -3
  170. package/dist/knowledge/service-risk.js +1 -1
  171. package/dist/knowledge/template-registry.js +1 -1
  172. package/dist/knowledge/tools-reference.js +1 -1
  173. package/dist/knowledge/treasury-risk.d.ts +2 -3
  174. package/dist/knowledge/treasury-risk.js +1 -1
  175. package/dist/knowledge/util-risk.d.ts +0 -1
  176. package/dist/knowledge/util-risk.js +1 -1
  177. package/dist/monitor/MonitorLoop.js +1 -1
  178. package/dist/persona/bridge.js +1 -1
  179. package/dist/persona/facet-profile.d.ts +33 -0
  180. package/dist/persona/facet-profile.js +1 -0
  181. package/dist/persona/model.d.ts +2 -1
  182. package/dist/persona/model.js +1 -1
  183. package/dist/persona/topology-focus.d.ts +2 -2
  184. package/dist/persona/topology-focus.js +1 -1
  185. package/dist/persona/types.d.ts +12 -0
  186. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  187. package/dist/playbooks/service-build/facet-money.d.ts +22 -0
  188. package/dist/playbooks/service-build/facet-money.js +1 -0
  189. package/dist/playbooks/service-build/facet-money.spec.d.ts +1 -0
  190. package/dist/playbooks/service-build/facet-money.spec.js +1 -0
  191. package/dist/playbooks/service-build/machine-panorama.d.ts +3 -0
  192. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  193. package/dist/playbooks/service-build/object-panorama.d.ts +27 -27
  194. package/dist/playbooks/service-build/object-panorama.js +1 -1
  195. package/dist/playbooks/service-build/pipeline-actions.d.ts +2 -2
  196. package/dist/playbooks/service-build/pipeline-actions.js +1 -1
  197. package/dist/playbooks/service-build/risk-aggregator.d.ts +2 -1
  198. package/dist/playbooks/service-build/risk-aggregator.js +1 -1
  199. package/dist/playbooks/service-build/service-panorama.d.ts +4 -9
  200. package/dist/playbooks/service-build/service-panorama.js +1 -1
  201. package/dist/playbooks/service-build/topology-evaluation.spec.d.ts +1 -0
  202. package/dist/playbooks/service-build/topology-evaluation.spec.js +1 -0
  203. package/dist/playbooks/service-build/topology-query.d.ts +13 -2
  204. package/dist/playbooks/service-build/topology-query.js +1 -1
  205. package/dist/review/arb.d.ts +0 -2
  206. package/dist/review/arb.js +1 -1
  207. package/dist/review/order.d.ts +0 -1
  208. package/dist/review/order.js +1 -1
  209. package/dist/role/profiles.js +1 -1
  210. package/dist/rules.d.ts +1 -2
  211. package/dist/rules.js +1 -1
  212. package/dist/safety/confirm-gate.js +1 -1
  213. package/dist/schema/call/base.d.ts +3372 -668
  214. package/dist/schema/call/base.js +1 -1
  215. package/dist/schema/call/handler.js +1 -1
  216. package/dist/schema/call/receipt.d.ts +28 -0
  217. package/dist/schema/call/receipt.js +1 -0
  218. package/dist/schema/call/semantic-customer-advice.spec.d.ts +1 -0
  219. package/dist/schema/call/semantic-customer-advice.spec.js +1 -0
  220. package/dist/schema/call/semantic.d.ts +5 -2
  221. package/dist/schema/call/semantic.js +1 -1
  222. package/dist/schema/call/treasury.js +1 -1
  223. package/dist/schema/common/index.js +1 -1
  224. package/dist/schema/evaluation/index.d.ts +289 -211
  225. package/dist/schema/evaluation/index.js +1 -1
  226. package/dist/schema/goal/index.d.ts +1 -1
  227. package/dist/schema/goal/planning.d.ts +2 -2
  228. package/dist/schema/index.d.ts +0 -1
  229. package/dist/schema/index.js +1 -1
  230. package/dist/schema/industry-pack/index.d.ts +1 -1
  231. package/dist/schema/keeper/index.d.ts +1 -1
  232. package/dist/schema/local/index.js +1 -1
  233. package/dist/schema/operations.d.ts +26 -10
  234. package/dist/schema/operations.js +1 -1
  235. package/dist/schema/persona/index.d.ts +24 -24
  236. package/dist/schema/query/bi.d.ts +613 -0
  237. package/dist/schema/query/bi.js +1 -1
  238. package/dist/schema/query/index.d.ts +9 -9
  239. package/dist/schema/schema-version.js +1 -1
  240. package/dist/schema/workspace/index.d.ts +2 -2
  241. package/dist/schema-query-impl/index.js +1 -1
  242. package/dist/schemas/account_operation.output.json +1 -1
  243. package/dist/schemas/bridge_operation.output.json +1 -1
  244. package/dist/schemas/evaluation_operation.output.json +691 -163
  245. package/dist/schemas/evaluation_operation.schema.json +0 -429
  246. package/dist/schemas/index.json +1 -7
  247. package/dist/schemas/keeper_operation.output.json +1 -1
  248. package/dist/schemas/local_history_operation.output.json +1 -1
  249. package/dist/schemas/local_info_operation.output.json +1 -1
  250. package/dist/schemas/local_mark_operation.output.json +1 -1
  251. package/dist/schemas/messenger_operation.output.json +1 -1
  252. package/dist/schemas/monitor_events.output.json +1 -1
  253. package/dist/schemas/monitor_subscription.output.json +1 -1
  254. package/dist/schemas/onchain_events.output.json +1 -1
  255. package/dist/schemas/onchain_operations.output.json +6357 -3724
  256. package/dist/schemas/onchain_operations.schema.json +2 -2
  257. package/dist/schemas/onchain_operations_treasury.schema.json +2 -2
  258. package/dist/schemas/onchain_table_data.output.json +61 -71
  259. package/dist/schemas/query_toolkit.output.json +841 -8
  260. package/dist/schemas/query_toolkit.schema.json +59 -1
  261. package/dist/strategy/metrics.js +1 -1
  262. package/dist/tools/handlers/bridge.js +1 -1
  263. package/dist/tools/handlers/config.js +1 -1
  264. package/dist/tools/handlers/dispatch-expectations.d.ts +3 -0
  265. package/dist/tools/handlers/dispatch-expectations.js +1 -0
  266. package/dist/tools/handlers/evaluation.js +1 -1
  267. package/dist/tools/handlers/onchain.js +1 -1
  268. package/dist/tools/handlers/query.js +1 -1
  269. package/dist/tools/index.js +1 -1
  270. package/dist/tools/registry/evaluation.d.ts +2 -0
  271. package/dist/tools/registry/evaluation.js +1 -0
  272. package/dist/tools/registry/query.js +1 -1
  273. package/dist/tools/shared.d.ts +0 -1
  274. package/dist/tools/shared.js +1 -1
  275. package/dist/tools/wrap.js +1 -1
  276. package/package.json +4 -3
  277. package/dist/customer/customer-advice.d.ts +0 -32
  278. package/dist/customer/customer-advice.js +0 -1
  279. package/dist/customer/info-puzzle.d.ts +0 -146
  280. package/dist/customer/info-puzzle.js +0 -1
  281. package/dist/customer/order-strategy.d.ts +0 -17
  282. package/dist/customer/order-strategy.js +0 -1
  283. package/dist/customer/preorder-compare.d.ts +0 -24
  284. package/dist/customer/preorder-compare.js +0 -1
  285. package/dist/customer/reminder-system.d.ts +0 -42
  286. package/dist/customer/reminder-system.js +0 -1
  287. package/dist/customer/risk-assessment.d.ts +0 -13
  288. package/dist/customer/risk-assessment.js +0 -1
  289. package/dist/evaluation/builtins/service-risk.d.ts +0 -7
  290. package/dist/evaluation/builtins/service-risk.js +0 -1
  291. package/dist/knowledge/trust-metrics.d.ts +0 -66
  292. package/dist/knowledge/trust-metrics.js +0 -1
  293. package/dist/schema/trust/index.d.ts +0 -334
  294. package/dist/schema/trust/index.js +0 -1
  295. package/dist/schemas/trust_score.output.json +0 -847
  296. package/dist/schemas/trust_score.schema.json +0 -364
  297. package/dist/tools/handlers/trust.d.ts +0 -16
  298. package/dist/tools/handlers/trust.js +0 -1
  299. package/dist/tools/registry/trust.d.ts +0 -2
  300. package/dist/tools/registry/trust.js +0 -1
@@ -33,4 +33,3 @@ export declare const PERSONAL_RISK_RULES: {
33
33
  }[];
34
34
  export declare const PERSONAL_RISK_VERSION = "1.0.0";
35
35
  export declare function checkPersonalRisks(ctx: PersonalRiskCheckContext): PersonalRisk[];
36
- export declare function getPersonalRiskById(id: string): PersonalRisk | undefined;
@@ -1 +1 @@
1
- import{MAX_ADDRESS_COUNT,MAX_RECORD_COUNT_REGISTRAR,MAX_RECORD_LENGTH,MAX_TAGS_COUNT}from'@wowok/wowok';function detectSensitiveInformation(a){const b=[];for(const c of a){const d=typeof c['value']==='string'?c['value']:String(c['value']??''),f=d['toLowerCase']();if(/^\+?\d{10,15}$/['test'](d))b['push'](c['name']+'=phone-like');if(/[^\s@]+@[^\s@]+\.[^\s@]+/['test'](d))b['push'](c['name']+'=email-like');if(/^(0x)?[0-9a-fA-F]{64}$/['test'](d))b['push'](c['name']+'=private-key-like');if(/^([a-z]{3,8}\s){11,23}[a-z]{3,8}$/['test'](d['trim']()))b['push'](c['name']+'=mnemonic-like');if(/private[_-]?key|secret|mnemonic|seed/i['test'](c['name']))b['push'](c['name']+'=secret-named');void f;}return b;}const R_PE_01={'rule':{'id':'R-PERSONAL-01','level':'HIGH','category':'semantic','title':'Sensitive\x20information\x20leakage\x20—\x20on-chain\x20data\x20is\x20permanent','description':'information\x20is\x20stored\x20via\x20Entity.info_add\x20as\x20on-chain\x20Records.\x20The\x20schema\x20description\x20'+'warns\x20\x27NEVER:\x20phone,\x20address,\x20private\x20keys\x27\x20but\x20the\x20Move\x20layer\x20does\x20not\x20validate\x20'+'content.\x20Once\x20a\x20phone\x20number,\x20physical\x20address,\x20email,\x20or\x20private\x20key\x20is\x20written\x20'+'on-chain,\x20it\x20is\x20permanent\x20and\x20publicly\x20readable\x20—\x20there\x20is\x20no\x20delete\x20(info_remove\x20'+'only\x20removes\x20the\x20named\x20entry\x20from\x20the\x20user\x27s\x20record;\x20the\x20data\x20remains\x20in\x20the\x20'+'transaction\x20history).','affected_stakeholders':['user'],'scenario':'User\x20adds\x20information\x20{name:\x20\x27phone\x27,\x20value:\x20\x27+8613800000000\x27};\x20number\x20is\x20public\x20forever','mitigation':'MCP\x20schema\x20description\x20MUST\x20warn.\x20AI\x20agents\x20MUST\x20re-confirm\x20before\x20adding\x20any\x20'+'information\x20entry.\x20Business\x20layer\x20should\x20run\x20a\x20sensitive-data\x20regex\x20(phone/email/'+'private-key/mnemonic)\x20and\x20reject\x20matches.\x20Use\x20the\x20\x27local\x27\x20tool\x20for\x20private\x20data.','auto_fixable':![]},'check':a=>{if(!a['information_entries']||a['information_entries']['length']===0x0)return null;const b=detectSensitiveInformation(a['information_entries']);if(b['length']===0x0)return null;return{...R_PE_01['rule'],'evidence':'sensitive\x20patterns:\x20'+b['join'](';\x20')};}},R_PE_02={'rule':{'id':'R-PERSONAL-02','level':'MEDIUM','category':'lifecycle','title':'mark\x20destroy\x20is\x20irreversible\x20—\x20identity\x20mark\x20permanently\x20lost','description':'The\x20\x27destroy\x27\x20mark\x20op\x20permanently\x20deletes\x20the\x20Resource\x20object\x20backing\x20the\x20user\x27s\x20'+'identity\x20mark.\x20There\x20is\x20no\x20archive,\x20no\x20event,\x20and\x20no\x20rollback.\x20After\x20destroy,\x20the\x20'+'user\x20has\x20no\x20on-chain\x20identity\x20mark\x20until\x20they\x20create\x20a\x20new\x20one,\x20and\x20any\x20external\x20'+'system\x20keyed\x20on\x20the\x20old\x20Resource\x20address\x20breaks.','affected_stakeholders':['user','consumer'],'scenario':'User\x20destroys\x20their\x20mark;\x20downstream\x20services\x20keyed\x20on\x20the\x20old\x20Resource\x20address\x20fail','mitigation':'Require\x20explicit\x20confirmation\x20before\x20destroy.\x20SDK\x20should\x20refuse\x20destroy\x20if\x20any\x20'+'live\x20consumer\x20still\x20references\x20the\x20mark.\x20Provide\x20a\x20\x27replace\x27\x20alternative\x20that\x20'+'swaps\x20the\x20underlying\x20Resource\x20without\x20losing\x20continuity.','auto_fixable':![]},'check':a=>{if(!a['is_mark_destroy'])return null;return{...R_PE_02['rule'],'evidence':'is_mark_destroy=true\x20(irreversible)'};}},R_PE_03={'rule':{'id':'R-PERSONAL-03','level':'MEDIUM','category':'semantic','title':'referrer\x20chain\x20can\x20be\x20abused\x20to\x20fabricate\x20trust\x20signals','description':'When\x20registering,\x20a\x20user\x20may\x20specify\x20any\x20referrer\x20address.\x20There\x20is\x20no\x20on-chain\x20'+'verification\x20that\x20the\x20referrer\x20actually\x20invited\x20the\x20user.\x20A\x20sybil\x20attacker\x20can\x20'+'register\x20many\x20accounts\x20chained\x20to\x20a\x20reputable\x20address,\x20fabricating\x20an\x20association\x20'+'to\x20borrow\x20trust.\x20The\x20Registrar\x20records\x20referrer\x20but\x20does\x20not\x20validate\x20consent.','affected_stakeholders':['user','consumer'],'scenario':'Attacker\x20registers\x20100\x20accounts\x20all\x20citing\x20a\x20reputable\x20merchant\x20as\x20referrer','mitigation':'Business\x20layer\x20should\x20treat\x20referrer\x20as\x20a\x20self-attested\x20hint,\x20not\x20a\x20verified\x20trust\x20'+'signal.\x20Audit\x20referrer\x20chains\x20off-chain;\x20require\x20the\x20referrer\x20to\x20co-sign\x20if\x20used\x20for\x20'+'trust\x20scoring.','auto_fixable':![]},'check':a=>{if(!a['has_referrer'])return null;return{...R_PE_03['rule'],'evidence':'has_referrer=true\x20(self-attested,\x20unverified)'};}},R_PE_04={'rule':{'id':'R-PERSONAL-04','level':'LOW','category':'structural','title':'information\x20inherits\x20MAX_RECORD_COUNT_REGISTRAR='+MAX_RECORD_COUNT_REGISTRAR+'\x20—\x20permissive','description':'Personal\x20does\x20not\x20define\x20its\x20own\x20record\x20cap;\x20it\x20inherits\x20Entity\x27s\x20'+('MAX_RECORD_COUNT_REGISTRAR='+MAX_RECORD_COUNT_REGISTRAR+'\x20(registrar.move)\x20and\x20')+('MAX_RECORD_LENGTH='+MAX_RECORD_LENGTH+'\x20per\x20record.\x20'+MAX_RECORD_COUNT_REGISTRAR+'\x20records\x20')+'per\x20user\x20is\x20generous\x20and\x20can\x20bloat\x20on-chain\x20storage\x20if\x20users\x20add\x20many\x20entries.\x20'+('MAX_ADDRESS_COUNT='+MAX_ADDRESS_COUNT+'\x20and\x20MAX_TAGS_COUNT='+MAX_TAGS_COUNT+'\x20also\x20apply\x20via\x20Entity/Resource.'),'affected_stakeholders':['user','system'],'scenario':'User\x20adds\x201000\x20information\x20entries;\x20Entity\x20record\x20storage\x20is\x20heavy\x20and\x20slow\x20to\x20read','mitigation':'Business\x20layer\x20should\x20self-limit\x20information\x20count\x20(e.g.\x20≤50).\x20For\x20bulk\x20profile\x20data,\x20'+'store\x20off-chain\x20and\x20reference\x20via\x20a\x20Repository\x20or\x20Proof.','auto_fixable':![]},'check':a=>{if(a['information_count']===undefined)return null;if(a['information_count']<MAX_RECORD_COUNT_REGISTRAR)return null;return{...R_PE_04['rule'],'evidence':'information_count='+a['information_count']+',\x20limit='+MAX_RECORD_COUNT_REGISTRAR};}},R_PE_05={'rule':{'id':'R-PERSONAL-05','level':'MEDIUM','category':'lifecycle','title':'mark\x20transfer\x20loses\x20identity\x20mark\x20at\x20the\x20source\x20address','description':'The\x20\x27transfer\x27\x20mark\x20op\x20moves\x20the\x20Resource\x20backing\x20the\x20identity\x20mark\x20to\x20a\x20new\x20address.\x20'+'After\x20transfer,\x20the\x20source\x20address\x20has\x20no\x20mark\x20—\x20any\x20service\x20that\x20keyed\x20identity\x20on\x20'+'the\x20source\x20address\x20loses\x20the\x20binding.\x20There\x20is\x20no\x20automatic\x20forwarding\x20stub\x20left\x20behind.','affected_stakeholders':['user','consumer'],'scenario':'User\x20transfers\x20mark\x20to\x20a\x20new\x20wallet;\x20old-wallet-based\x20logins\x20all\x20break','mitigation':'Surface\x20a\x20\x27transfer\x20will\x20detach\x20the\x20mark\x20from\x20this\x20address\x27\x20warning.\x20Consumers\x20should\x20'+'track\x20marks\x20by\x20Resource\x20address,\x20not\x20by\x20user\x20address.\x20Provide\x20a\x20migration\x20window\x20'+'where\x20both\x20addresses\x20are\x20valid.','auto_fixable':![]},'check':a=>{if(!a['is_mark_transfer'])return null;return{...R_PE_05['rule'],'evidence':'is_mark_transfer=true\x20(source\x20loses\x20mark)'};}},R_PE_06={'rule':{'id':'R-PERSONAL-06','level':'LOW','category':'cross_object','title':'Personal\x20has\x20no\x20dedicated\x20Move\x20struct\x20—\x20depends\x20entirely\x20on\x20Entity\x20+\x20Resource','description':'Personal\x20is\x20an\x20SDK-layer\x20construct:\x20there\x20is\x20no\x20personal.move.\x20The\x20SDK\x20composes\x20'+'Entity\x20(information/description)\x20and\x20Resource\x20(mark)\x20on\x20behalf\x20of\x20the\x20user.\x20Any\x20'+'breaking\x20change\x20in\x20Entity\x20or\x20Resource\x20directly\x20affects\x20Personal.\x20The\x20MCP\x20layer\x20'+'cannot\x20fix\x20Personal\x20bugs\x20without\x20touching\x20Entity/Resource.','affected_stakeholders':['system'],'scenario':'Entity\x20schema\x20changes;\x20Personal.information\x20silently\x20breaks','mitigation':'Track\x20Entity\x20and\x20Resource\x20changelogs\x20as\x20first-order\x20dependencies\x20of\x20Personal.\x20Add\x20'+'integration\x20tests\x20that\x20exercise\x20Personal\x20flows\x20whenever\x20Entity/Resource\x20change.','auto_fixable':![]},'check':a=>{if(!a['expects_dedicated_move_struct'])return null;return{...R_PE_06['rule'],'evidence':'expects_dedicated_move_struct=true\x20(none\x20exists)'};}},R_PE_07={'rule':{'id':'R-PERSONAL-07','level':'MEDIUM','category':'lifecycle','title':'Singleton\x20assumption\x20—\x20if\x20violated,\x20multiple\x20Personal\x20instances\x20conflict','description':'Personal\x20assumes\x20each\x20account\x20has\x20exactly\x20one\x20Entity\x20record\x20(and\x20one\x20Resource\x20mark).\x20'+'The\x20Move\x20layer\x20enforces\x20this\x20via\x20entity_register\x27s\x20idempotency\x20(returns\x20the\x20existing\x20'+'Resource\x20for\x20already-registered\x20users).\x20But\x20if\x20the\x20SDK\x20ever\x20bypasses\x20entity_register\x20'+'and\x20creates\x20duplicates\x20(e.g.\x20via\x20entity_register_with_resource_forced),\x20downstream\x20'+'code\x20that\x20assumes\x20a\x20singleton\x20would\x20see\x20inconsistent\x20state.','affected_stakeholders':['user','consumer'],'scenario':'SDK\x20calls\x20entity_register_with_resource_forced;\x20user\x20now\x20has\x20two\x20Resource\x20marks','mitigation':'SDK\x20MUST\x20enforce\x20the\x20singleton\x20invariant:\x20refuse\x20to\x20call\x20entity_register_with_resource_forced\x20'+'unless\x20the\x20user\x20explicitly\x20opts\x20in.\x20Document\x20that\x20forced\x20re-registration\x20invalidates\x20'+'the\x20old\x20Resource\x20address.','auto_fixable':![]},'check':a=>{if(a['singleton_enforced'])return null;return{...R_PE_07['rule'],'evidence':'singleton_enforced=false\x20(needs\x20SDK\x20guard)'};}};export const PERSONAL_RISK_RULES=[R_PE_01,R_PE_02,R_PE_03,R_PE_04,R_PE_05,R_PE_06,R_PE_07];export const PERSONAL_RISK_VERSION='1.0.0';export function checkPersonalRisks(a){const b=[];for(const c of PERSONAL_RISK_RULES){const d=c['check'](a);if(d)b['push'](d);}return b;}export function getPersonalRiskById(a){return PERSONAL_RISK_RULES['find'](b=>b['rule']['id']===a)?.['rule'];}
1
+ import{MAX_ADDRESS_COUNT,MAX_RECORD_COUNT_REGISTRAR,MAX_RECORD_LENGTH,MAX_TAGS_COUNT}from'@wowok/wowok';function detectSensitiveInformation(a){const b=[];for(const c of a){const d=typeof c['value']==='string'?c['value']:String(c['value']??''),f=d['toLowerCase']();if(/^\+?\d{10,15}$/['test'](d))b['push'](c['name']+'=phone-like');if(/[^\s@]+@[^\s@]+\.[^\s@]+/['test'](d))b['push'](c['name']+'=email-like');if(/^(0x)?[0-9a-fA-F]{64}$/['test'](d))b['push'](c['name']+'=private-key-like');if(/^([a-z]{3,8}\s){11,23}[a-z]{3,8}$/['test'](d['trim']()))b['push'](c['name']+'=mnemonic-like');if(/private[_-]?key|secret|mnemonic|seed/i['test'](c['name']))b['push'](c['name']+'=secret-named');void f;}return b;}const R_PE_01={'rule':{'id':'R-PERSONAL-01','level':'HIGH','category':'semantic','title':'Sensitive\x20information\x20leakage\x20—\x20on-chain\x20data\x20is\x20permanent','description':'information\x20is\x20stored\x20via\x20Entity.info_add\x20as\x20on-chain\x20Records.\x20The\x20schema\x20description\x20'+'warns\x20\x27NEVER:\x20phone,\x20address,\x20private\x20keys\x27\x20but\x20the\x20Move\x20layer\x20does\x20not\x20validate\x20'+'content.\x20Once\x20a\x20phone\x20number,\x20physical\x20address,\x20email,\x20or\x20private\x20key\x20is\x20written\x20'+'on-chain,\x20it\x20is\x20permanent\x20and\x20publicly\x20readable\x20—\x20there\x20is\x20no\x20delete\x20(info_remove\x20'+'only\x20removes\x20the\x20named\x20entry\x20from\x20the\x20user\x27s\x20record;\x20the\x20data\x20remains\x20in\x20the\x20'+'transaction\x20history).','affected_stakeholders':['user'],'scenario':'User\x20adds\x20information\x20{name:\x20\x27phone\x27,\x20value:\x20\x27+8613800000000\x27};\x20number\x20is\x20public\x20forever','mitigation':'MCP\x20schema\x20description\x20MUST\x20warn.\x20AI\x20agents\x20MUST\x20re-confirm\x20before\x20adding\x20any\x20'+'information\x20entry.\x20Business\x20layer\x20should\x20run\x20a\x20sensitive-data\x20regex\x20(phone/email/'+'private-key/mnemonic)\x20and\x20reject\x20matches.\x20Use\x20the\x20\x27local\x27\x20tool\x20for\x20private\x20data.','auto_fixable':![]},'check':a=>{if(!a['information_entries']||a['information_entries']['length']===0x0)return null;const b=detectSensitiveInformation(a['information_entries']);if(b['length']===0x0)return null;return{...R_PE_01['rule'],'evidence':'sensitive\x20patterns:\x20'+b['join'](';\x20')};}},R_PE_02={'rule':{'id':'R-PERSONAL-02','level':'MEDIUM','category':'lifecycle','title':'mark\x20destroy\x20is\x20irreversible\x20—\x20identity\x20mark\x20permanently\x20lost','description':'The\x20\x27destroy\x27\x20mark\x20op\x20permanently\x20deletes\x20the\x20Resource\x20object\x20backing\x20the\x20user\x27s\x20'+'identity\x20mark.\x20There\x20is\x20no\x20archive,\x20no\x20event,\x20and\x20no\x20rollback.\x20After\x20destroy,\x20the\x20'+'user\x20has\x20no\x20on-chain\x20identity\x20mark\x20until\x20they\x20create\x20a\x20new\x20one,\x20and\x20any\x20external\x20'+'system\x20keyed\x20on\x20the\x20old\x20Resource\x20address\x20breaks.','affected_stakeholders':['user','consumer'],'scenario':'User\x20destroys\x20their\x20mark;\x20downstream\x20services\x20keyed\x20on\x20the\x20old\x20Resource\x20address\x20fail','mitigation':'Require\x20explicit\x20confirmation\x20before\x20destroy.\x20SDK\x20should\x20refuse\x20destroy\x20if\x20any\x20'+'live\x20consumer\x20still\x20references\x20the\x20mark.\x20Provide\x20a\x20\x27replace\x27\x20alternative\x20that\x20'+'swaps\x20the\x20underlying\x20Resource\x20without\x20losing\x20continuity.','auto_fixable':![]},'check':a=>{if(!a['is_mark_destroy'])return null;return{...R_PE_02['rule'],'evidence':'is_mark_destroy=true\x20(irreversible)'};}},R_PE_03={'rule':{'id':'R-PERSONAL-03','level':'MEDIUM','category':'semantic','title':'referrer\x20chain\x20can\x20be\x20abused\x20to\x20fabricate\x20trust\x20signals','description':'When\x20registering,\x20a\x20user\x20may\x20specify\x20any\x20referrer\x20address.\x20There\x20is\x20no\x20on-chain\x20'+'verification\x20that\x20the\x20referrer\x20actually\x20invited\x20the\x20user.\x20A\x20sybil\x20attacker\x20can\x20'+'register\x20many\x20accounts\x20chained\x20to\x20a\x20reputable\x20address,\x20fabricating\x20an\x20association\x20'+'to\x20borrow\x20trust.\x20The\x20Registrar\x20records\x20referrer\x20but\x20does\x20not\x20validate\x20consent.','affected_stakeholders':['user','consumer'],'scenario':'Attacker\x20registers\x20100\x20accounts\x20all\x20citing\x20a\x20reputable\x20merchant\x20as\x20referrer','mitigation':'Business\x20layer\x20should\x20treat\x20referrer\x20as\x20a\x20self-attested\x20hint,\x20not\x20a\x20verified\x20trust\x20'+'signal.\x20Audit\x20referrer\x20chains\x20off-chain;\x20require\x20the\x20referrer\x20to\x20co-sign\x20if\x20used\x20for\x20'+'trust\x20scoring.','auto_fixable':![]},'check':a=>{if(!a['has_referrer'])return null;return{...R_PE_03['rule'],'evidence':'has_referrer=true\x20(self-attested,\x20unverified)'};}},R_PE_04={'rule':{'id':'R-PERSONAL-04','level':'LOW','category':'structural','title':'information\x20inherits\x20MAX_RECORD_COUNT_REGISTRAR='+MAX_RECORD_COUNT_REGISTRAR+'\x20—\x20permissive','description':'Personal\x20does\x20not\x20define\x20its\x20own\x20record\x20cap;\x20it\x20inherits\x20Entity\x27s\x20'+('MAX_RECORD_COUNT_REGISTRAR='+MAX_RECORD_COUNT_REGISTRAR+'\x20(registrar.move)\x20and\x20')+('MAX_RECORD_LENGTH='+MAX_RECORD_LENGTH+'\x20per\x20record.\x20'+MAX_RECORD_COUNT_REGISTRAR+'\x20records\x20')+'per\x20user\x20is\x20generous\x20and\x20can\x20bloat\x20on-chain\x20storage\x20if\x20users\x20add\x20many\x20entries.\x20'+('MAX_ADDRESS_COUNT='+MAX_ADDRESS_COUNT+'\x20and\x20MAX_TAGS_COUNT='+MAX_TAGS_COUNT+'\x20also\x20apply\x20via\x20Entity/Resource.'),'affected_stakeholders':['user','system'],'scenario':'User\x20adds\x201000\x20information\x20entries;\x20Entity\x20record\x20storage\x20is\x20heavy\x20and\x20slow\x20to\x20read','mitigation':'Business\x20layer\x20should\x20self-limit\x20information\x20count\x20(e.g.\x20≤50).\x20For\x20bulk\x20profile\x20data,\x20'+'store\x20off-chain\x20and\x20reference\x20via\x20a\x20Repository\x20or\x20Proof.','auto_fixable':![]},'check':a=>{if(a['information_count']===undefined)return null;if(a['information_count']<MAX_RECORD_COUNT_REGISTRAR)return null;return{...R_PE_04['rule'],'evidence':'information_count='+a['information_count']+',\x20limit='+MAX_RECORD_COUNT_REGISTRAR};}},R_PE_05={'rule':{'id':'R-PERSONAL-05','level':'MEDIUM','category':'lifecycle','title':'mark\x20transfer\x20loses\x20identity\x20mark\x20at\x20the\x20source\x20address','description':'The\x20\x27transfer\x27\x20mark\x20op\x20moves\x20the\x20Resource\x20backing\x20the\x20identity\x20mark\x20to\x20a\x20new\x20address.\x20'+'After\x20transfer,\x20the\x20source\x20address\x20has\x20no\x20mark\x20—\x20any\x20service\x20that\x20keyed\x20identity\x20on\x20'+'the\x20source\x20address\x20loses\x20the\x20binding.\x20There\x20is\x20no\x20automatic\x20forwarding\x20stub\x20left\x20behind.','affected_stakeholders':['user','consumer'],'scenario':'User\x20transfers\x20mark\x20to\x20a\x20new\x20wallet;\x20old-wallet-based\x20logins\x20all\x20break','mitigation':'Surface\x20a\x20\x27transfer\x20will\x20detach\x20the\x20mark\x20from\x20this\x20address\x27\x20warning.\x20Consumers\x20should\x20'+'track\x20marks\x20by\x20Resource\x20address,\x20not\x20by\x20user\x20address.\x20Provide\x20a\x20migration\x20window\x20'+'where\x20both\x20addresses\x20are\x20valid.','auto_fixable':![]},'check':a=>{if(!a['is_mark_transfer'])return null;return{...R_PE_05['rule'],'evidence':'is_mark_transfer=true\x20(source\x20loses\x20mark)'};}},R_PE_06={'rule':{'id':'R-PERSONAL-06','level':'LOW','category':'cross_object','title':'Personal\x20has\x20no\x20dedicated\x20Move\x20struct\x20—\x20depends\x20entirely\x20on\x20Entity\x20+\x20Resource','description':'Personal\x20is\x20an\x20SDK-layer\x20construct:\x20there\x20is\x20no\x20personal.move.\x20The\x20SDK\x20composes\x20'+'Entity\x20(information/description)\x20and\x20Resource\x20(mark)\x20on\x20behalf\x20of\x20the\x20user.\x20Any\x20'+'breaking\x20change\x20in\x20Entity\x20or\x20Resource\x20directly\x20affects\x20Personal.\x20The\x20MCP\x20layer\x20'+'cannot\x20fix\x20Personal\x20bugs\x20without\x20touching\x20Entity/Resource.','affected_stakeholders':['system'],'scenario':'Entity\x20schema\x20changes;\x20Personal.information\x20silently\x20breaks','mitigation':'Track\x20Entity\x20and\x20Resource\x20changelogs\x20as\x20first-order\x20dependencies\x20of\x20Personal.\x20Add\x20'+'integration\x20tests\x20that\x20exercise\x20Personal\x20flows\x20whenever\x20Entity/Resource\x20change.','auto_fixable':![]},'check':a=>{if(!a['expects_dedicated_move_struct'])return null;return{...R_PE_06['rule'],'evidence':'expects_dedicated_move_struct=true\x20(none\x20exists)'};}},R_PE_07={'rule':{'id':'R-PERSONAL-07','level':'MEDIUM','category':'lifecycle','title':'Singleton\x20assumption\x20—\x20if\x20violated,\x20multiple\x20Personal\x20instances\x20conflict','description':'Personal\x20assumes\x20each\x20account\x20has\x20exactly\x20one\x20Entity\x20record\x20(and\x20one\x20Resource\x20mark).\x20'+'The\x20Move\x20layer\x20enforces\x20this\x20via\x20entity_register\x27s\x20idempotency\x20(returns\x20the\x20existing\x20'+'Resource\x20for\x20already-registered\x20users).\x20But\x20if\x20the\x20SDK\x20ever\x20bypasses\x20entity_register\x20'+'and\x20creates\x20duplicates\x20(e.g.\x20via\x20entity_register_with_resource_forced),\x20downstream\x20'+'code\x20that\x20assumes\x20a\x20singleton\x20would\x20see\x20inconsistent\x20state.','affected_stakeholders':['user','consumer'],'scenario':'SDK\x20calls\x20entity_register_with_resource_forced;\x20user\x20now\x20has\x20two\x20Resource\x20marks','mitigation':'SDK\x20MUST\x20enforce\x20the\x20singleton\x20invariant:\x20refuse\x20to\x20call\x20entity_register_with_resource_forced\x20'+'unless\x20the\x20user\x20explicitly\x20opts\x20in.\x20Document\x20that\x20forced\x20re-registration\x20invalidates\x20'+'the\x20old\x20Resource\x20address.','auto_fixable':![]},'check':a=>{if(a['singleton_enforced'])return null;return{...R_PE_07['rule'],'evidence':'singleton_enforced=false\x20(needs\x20SDK\x20guard)'};}};export const PERSONAL_RISK_RULES=[R_PE_01,R_PE_02,R_PE_03,R_PE_04,R_PE_05,R_PE_06,R_PE_07];export const PERSONAL_RISK_VERSION='1.0.0';export function checkPersonalRisks(a){const b=[];for(const c of PERSONAL_RISK_RULES){const d=c['check'](a);if(d)b['push'](d);}return b;}
@@ -60,8 +60,6 @@ export interface ProgressRiskCheckContext {
60
60
  }
61
61
  export declare const PROGRESS_RISK_VERSION = "1.0.0";
62
62
  export declare function getAllProgressRiskRules(): ProgressRiskRule[];
63
- export declare function getProgressRiskRulesCount(): number;
64
- export declare function getProgressRiskRulesByCategory(category: ProgressRiskCategory): ProgressRiskRule[];
65
63
  export interface ProgressRiskAssessment {
66
64
  summary: string;
67
65
  scene?: ProgressScene;
@@ -1 +1 @@
1
- import{MAX_NAMED_OPERATOR_COUNT,MAX_NAMED_OPERATOR_ADDRESS_COUNT,MAX_CONTEXT_REPOSITORY_COUNT}from'@wowok/wowok';const R_PR_1_01={'id':'R-PR-1-01','category':'structural','trigger':'named_operator\x20addresses\x20count\x20>\x20MAX_NAMED_OPERATOR_ADDRESS_COUNT\x20(80)','check':a=>{if(!a['progress_namedOperator'])return null;const b=a['progress_namedOperator']['operators']['length'];if(b>MAX_NAMED_OPERATOR_ADDRESS_COUNT)return{'id':'R-PR-1-01','level':'HIGH','category':'structural','title':'named_operator\x20address\x20count\x20exceeds\x20limit','description':'named_operator\x20\x22'+a['progress_namedOperator']['name']+'\x22\x20has\x20'+b+'\x20addresses,\x20'+('exceeds\x20MAX_NAMED_OPERATOR_ADDRESS_COUNT\x20'+MAX_NAMED_OPERATOR_ADDRESS_COUNT+'.\x20')+'Move\x20aborts\x20with\x20E_MAX_NAMED_OPERATOR_ADDRESS_COUNT.','affected_stakeholders':['owner','named_operator'],'scenario':'Adding\x20>\x2080\x20addresses\x20to\x20a\x20single\x20named\x20operator','mitigation':'Split\x20into\x20multiple\x20named_operator\x20names,\x20or\x20remove\x20inactive\x20addresses\x20first','evidence':'addr_count='+b};return null;}},R_PR_1_02={'id':'R-PR-1-02','category':'structural','trigger':'Adding\x20new\x20named_operator\x20would\x20exceed\x20MAX_NAMED_OPERATOR_COUNT\x20(60)','check':a=>{if(!a['progress_namedOperator']||a['progress_namedOperator']['op']!=='add')return null;const b=a['current_named_operator_count']??0x0;if(b>=MAX_NAMED_OPERATOR_COUNT)return{'id':'R-PR-1-02','level':'HIGH','category':'structural','title':'named_operator\x20namespace\x20count\x20at\x20limit','description':'Progress\x20already\x20has\x20'+b+'\x20named\x20operators,\x20'+('at\x20MAX_NAMED_OPERATOR_COUNT\x20'+MAX_NAMED_OPERATOR_COUNT+'.\x20Adding\x20a\x20new\x20name\x20will\x20abort\x20with\x20E_MAX_NAMED_OPERATOR_COUNT.'),'affected_stakeholders':['owner'],'scenario':'Adding\x20a\x2061st\x20named_operator\x20name\x20to\x20a\x20full\x20Progress','mitigation':'Use\x20\x27set\x27\x20on\x20an\x20existing\x20name\x20(replace\x20address\x20list),\x20or\x20remove\x20an\x20unused\x20name\x20first','evidence':'named_operator_count='+b};return null;}},R_PR_1_03={'id':'R-PR-1-03','category':'structural','trigger':'context_repository\x20add\x20would\x20exceed\x20MAX_CONTEXT_REPOSITORY_COUNT\x20(30)','check':a=>{if(!a['repository'])return null;if(a['repository']['op']==='clear')return null;const b=a['repository']['op']==='remove'?0x0:a['repository']['objects']['length'];if(b===0x0)return null;const c=a['current_context_repository_count']??0x0;if(c+b>MAX_CONTEXT_REPOSITORY_COUNT)return{'id':'R-PR-1-03','level':'HIGH','category':'structural','title':'context_repository\x20count\x20exceeds\x20limit','description':'Progress\x20has\x20'+c+'\x20repositories,\x20adding\x20'+b+'\x20would\x20total\x20'+(c+b)+',\x20'+('exceeds\x20MAX_CONTEXT_REPOSITORY_COUNT\x20'+MAX_CONTEXT_REPOSITORY_COUNT+'.\x20Move\x20aborts\x20with\x20E_MAX_CONTEXT_REPOSITORY_COUNT.'),'affected_stakeholders':['owner'],'scenario':'Adding\x20too\x20many\x20context\x20repositories','mitigation':'Remove\x20unused\x20repositories\x20first,\x20or\x20use\x20repository\x20\x27set\x27\x20to\x20replace\x20the\x20list','evidence':'current='+c+',\x20add='+b};return null;}},R_PR_1_04={'id':'R-PR-1-04','category':'structural','trigger':'named_operator\x20name\x20is\x20empty\x20string\x20but\x20is_order_holder_namespace=false','check':a=>{if(!a['progress_namedOperator'])return null;if(a['progress_namedOperator']['name']===''&&a['progress_namedOperator']['op']!=='remove')return{'id':'R-PR-1-04','level':'MEDIUM','category':'structural','title':'named_operator\x20name\x20is\x20empty\x20(OrderHolder\x20namespace)','description':'progress_namedOperator.name=\x22\x22\x20—\x20empty\x20string\x20maps\x20to\x20the\x20OrderHolder\x20namespace\x20'+'(machine::init_node_name()).\x20This\x20is\x20typically\x20set\x20by\x20service::buy,\x20not\x20by\x20direct\x20user\x20op.\x20'+'Manual\x20manipulation\x20may\x20overwrite\x20order-payer\x20authorization.','affected_stakeholders':['owner','named_operator'],'scenario':'User\x20manually\x20setting\x20the\x20empty-name\x20namespace','mitigation':'If\x20intentional\x20(e.g.\x20order_owner_set\x20internal\x20call),\x20confirm.\x20Otherwise\x20use\x20a\x20non-empty\x20name.','evidence':'name=\x22\x22'};return null;}},R_PR_2_01={'id':'R-PR-2-01','category':'semantic','trigger':'task_set\x20on\x20Progress\x20that\x20already\x20has\x20a\x20task\x20(E_TASK_ALREADY_SET)','check':a=>{if(!a['task'])return null;if(a['current_task']!==null&&a['current_task']!==undefined)return{'id':'R-PR-2-01','level':'HIGH','category':'semantic','title':'task_set\x20on\x20already-bound\x20Progress\x20(irreversible)','description':'Progress\x20already\x20has\x20task='+a['current_task']+'.\x20task_set\x20is\x20one-time;\x20'+'Move\x20aborts\x20with\x20E_TASK_ALREADY_SET.\x20There\x20is\x20no\x20way\x20to\x20change\x20the\x20task\x20after\x20first\x20set.','affected_stakeholders':['owner','submitter'],'scenario':'User\x20tries\x20to\x20rebind\x20Progress\x20to\x20a\x20different\x20Order','mitigation':'Create\x20a\x20new\x20Progress\x20via\x20service::buy\x20with\x20the\x20new\x20Order;\x20the\x20old\x20Progress\x20is\x20permanently\x20bound','evidence':'current_task='+a['current_task']};return null;}},R_PR_2_02={'id':'R-PR-2-02','category':'semantic','trigger':'operate.message\x20exceeds\x20MAX_LONG_NAME_LENGTH\x20(long-name\x20constraint)','check':a=>{if(!a['operate']?.['message'])return null;const b=a['operate']['message'];if(b['length']>0x400)return{'id':'R-PR-2-02','level':'MEDIUM','category':'semantic','title':'operate.message\x20exceeds\x20long-name\x20length','description':'operate.message\x20length\x20'+b['length']+'\x20exceeds\x20MAX_LONG_NAME_LENGTH\x20(1024).\x20'+'Move\x20aborts\x20in\x20common::LONG_NAME\x20check.','affected_stakeholders':['submitter'],'scenario':'Long\x20deliverable\x20message','mitigation':'Truncate\x20message\x20to\x20≤\x201024\x20chars;\x20store\x20full\x20payload\x20in\x20a\x20context\x20Repository','evidence':'msg_len='+b['length']};return null;}},R_PR_2_03={'id':'R-PR-2-03','category':'semantic','trigger':'operate.op\x20is\x20not\x20a\x20valid\x20enum\x20value\x20(schema-enforced,\x20defense-in-depth)','check':a=>{if(!a['operate'])return null;const b=['next','hold','unhold','adminUnhold'];if(a['operate']['op']&&!b['includes'](a['operate']['op']))return{'id':'R-PR-2-03','level':'HIGH','category':'semantic','title':'operate.op\x20must\x20be\x20one\x20of:\x20'+b['join'](',\x20'),'description':'op\x20enum\x20selects\x20the\x20Move\x20function:\x20next=accomplish,\x20hold=hold(bHold=true),\x20'+'unhold=hold(bHold=false),\x20adminUnhold=unhold\x20(224\x20permission).','affected_stakeholders':['submitter'],'scenario':'Schema\x20validation\x20bypassed\x20or\x20stale\x20client','mitigation':'Use\x20one\x20of:\x20'+b['join'](',\x20'),'evidence':'op='+a['operate']['op']};return null;}},R_PR_3_01={'id':'R-PR-3-01','category':'permission','trigger':'op=\x27adminUnhold\x27\x20(224\x20permission)\x20—\x20force\x20release\x20bypassing\x20holder\x20check','check':a=>{if(a['operate']?.['op']!=='adminUnhold')return null;return{'id':'R-PR-3-01','level':'HIGH','category':'permission','title':'adminUnhold\x20bypasses\x20holder\x20check\x20(broad\x20blast\x20radius)','description':'adminUnhold\x20uses\x20224\x20permission\x20to\x20release\x20a\x20held\x20forward\x20WITHOUT\x20verifying\x20sender\x20==\x20holder.\x20'+'If\x20224\x20is\x20granted\x20too\x20broadly,\x20any\x20224-holder\x20can\x20release\x20ANY\x20held\x20forward\x20in\x20this\x20Progress.','affected_stakeholders':['owner','named_operator','submitter'],'scenario':'Admin\x20force-releases\x20a\x20forward\x20that\x20the\x20original\x20holder\x20still\x20wanted\x20held','mitigation':'1)\x20Grant\x20224\x20only\x20to\x20dedicated\x20recovery\x20addresses.\x202)\x20Log\x20every\x20adminUnhold\x20for\x20audit.\x20'+'3)\x20Prefer\x20normal\x20unhold\x20(holder\x20self-release)\x20when\x20possible.','evidence':'adminUnhold=true,\x20forward='+a['operate']['operation']['forward']};}},R_PR_3_02={'id':'R-PR-3-02','category':'permission','trigger':'namedOperator\x20short-circuit\x20bypasses\x20220-225\x20permission\x20check','check':a=>{if(!a['operate'])return null;if(a['forward_named_operator']&&a['forward_named_operator']!=='')return{'id':'R-PR-3-02','level':'MEDIUM','category':'permission','title':'Forward\x20advance\x20via\x20named_operator\x20short-circuits\x20220-225\x20check','description':'Forward\x20\x22'+a['operate']['operation']['forward']+'\x22\x20uses\x20namedOperator=\x22'+a['forward_named_operator']+'\x22.\x20'+'Move\x27s\x20ASSERT_PERMISSION\x20returns\x20immediately\x20if\x20IsNamedOperator()\x20succeeds,\x20WITHOUT\x20checking\x20'+'any\x20permission\x20index.\x20Anyone\x20in\x20the\x20named_operator\x20list\x20can\x20advance\x20this\x20forward.','affected_stakeholders':['owner','named_operator'],'scenario':'Operator\x20list\x20too\x20permissive\x20(e.g.\x20includes\x20expired/compromised\x20addresses)','mitigation':'1)\x20Keep\x20named_operator\x20lists\x20minimal.\x202)\x20Use\x20namedOperator_remove\x20to\x20revoke\x20access\x20promptly.\x20'+'3)\x20For\x20sensitive\x20forwards,\x20prefer\x20Forward.permissionIndex\x20(Some)\x20for\x20dual-check.','evidence':'named_operator='+a['forward_named_operator']};return null;}},R_PR_3_03={'id':'R-PR-3-03','category':'permission','trigger':'Forward\x20has\x20guard\x20(Some)\x20—\x20Passport\x20required\x20but\x20not\x20provided','check':a=>{if(!a['operate'])return null;if(a['forward_has_guard']&&!a['forward_permission_index'])return{'id':'R-PR-3-03','level':'HIGH','category':'permission','title':'Forward\x20guard\x20requires\x20Passport','description':'Forward\x20\x22'+a['operate']['operation']['forward']+'\x22\x20has\x20a\x20guard\x20(Some).\x20'+'Move\x27s\x20next_imp\x20asserts\x20E_NEED_PASSPORT\x20for\x20guarded\x20forwards\x20when\x20called\x20without\x20passport.\x20'+'Use\x20next_with_passport\x20/\x20order_next_with_passport\x20instead.','affected_stakeholders':['submitter'],'scenario':'User\x20calls\x20next()\x20on\x20a\x20guarded\x20forward\x20without\x20passport','mitigation':'Submit\x20via\x20*_with_passport\x20variant;\x20ensure\x20submission\x20data\x20is\x20valid\x20for\x20the\x20Guard','evidence':'forward='+a['operate']['operation']['forward']+',\x20has_guard='+a['forward_has_guard']};return null;}},R_PR_4_01={'id':'R-PR-4-01','category':'lifecycle','trigger':'Machine\x20not\x20published\x20—\x20Progress\x20cannot\x20be\x20created','check':a=>{if(a['machine_published']===![])return{'id':'R-PR-4-01','level':'CRITICAL','category':'lifecycle','title':'Machine\x20not\x20published\x20—\x20Progress\x20creation\x20blocked','description':'Machine\x20'+(a['current_machine']??'(unknown)')+'\x20is\x20not\x20published.\x20'+'Progress\x20requires\x20a\x20published\x20Machine\x20(machine::on_progress_new\x20asserts\x20published\x20state).\x20'+'All\x20Progress\x20ops\x20will\x20fail\x20with\x20E_MACHINE_NOT_MATCH\x20or\x20similar.','affected_stakeholders':['owner'],'scenario':'User\x20attempts\x20to\x20create\x20Progress\x20before\x20Machine\x20publish','mitigation':'Publish\x20the\x20Machine\x20first\x20(machine::publish,\x20205\x20permission),\x20then\x20create\x20Progress','evidence':'machine='+a['current_machine']+',\x20published=false'};return null;}},R_PR_4_02={'id':'R-PR-4-02','category':'lifecycle','trigger':'operate\x20on\x20already-accomplished\x20forward\x20(E_FORWARD_ALREADY_ACCOMPLISHED)','check':a=>{if(!a['operate'])return null;if(a['forward_already_accomplished'])return{'id':'R-PR-4-02','level':'MEDIUM','category':'lifecycle','title':'Forward\x20already\x20accomplished\x20—\x20re-hold\x20blocked','description':'Forward\x20\x22'+a['operate']['operation']['forward']+'\x22\x20to\x20\x22'+a['operate']['operation']['next_node_name']+'\x22\x20'+'is\x20already\x20accomplished.\x20Move\x20aborts\x20with\x20E_FORWARD_ALREADY_ACCOMPLISHED\x20on\x20any\x20re-hold\x20attempt.','affected_stakeholders':['submitter'],'scenario':'User\x20retries\x20an\x20already-completed\x20forward\x20(race\x20condition\x20or\x20stale\x20state)','mitigation':'Query\x20Progress.current\x20—\x20if\x20already\x20past\x20target,\x20no\x20action\x20needed;\x20if\x20parallel\x20session,\x20use\x20a\x20different\x20forward','evidence':'forward='+a['operate']['operation']['forward']+',\x20accomplished=true'};return null;}},R_PR_4_03={'id':'R-PR-4-03','category':'lifecycle','trigger':'unhold\x20by\x20non-holder\x20without\x20224\x20permission\x20(E_NOT_THE_HOLDER)','check':a=>{if(!a['operate']||a['operate']['op']!=='unhold')return null;if(a['holder_address']&&a['signer']&&a['holder_address']!==a['signer'])return{'id':'R-PR-4-03','level':'HIGH','category':'lifecycle','title':'unhold\x20by\x20non-holder\x20—\x20Move\x20will\x20abort\x20E_NOT_THE_HOLDER','description':'Forward\x20is\x20held\x20by\x20'+a['holder_address']+',\x20but\x20signer\x20is\x20'+a['signer']+'.\x20'+'Move\x20aborts\x20with\x20E_NOT_THE_HOLDER\x20unless\x20signer\x20has\x20224\x20permission\x20(adminUnhold\x20path).','affected_stakeholders':['submitter'],'scenario':'User\x20other\x20than\x20holder\x20tries\x20to\x20release\x20a\x20hold','mitigation':'1)\x20Have\x20the\x20original\x20holder\x20call\x20unhold.\x202)\x20If\x20holder\x20is\x20unresponsive,\x20use\x20adminUnhold=true\x20(requires\x20224).','evidence':'holder='+a['holder_address']+',\x20signer='+a['signer']};return null;}},R_PR_5_01={'id':'R-PR-5-01','category':'cross_object','trigger':'operate.order_next\x20called\x20but\x20progress.task\x20!=\x20order\x20address\x20(E_ORDER_NOT_MATCH)','check':a=>{if(!a['operate'])return null;if(a['current_task']&&a['signer'])return null;return null;}},R_PR_5_02={'id':'R-PR-5-02','category':'cross_object','trigger':'context_repository_add\x20without\x20object-linker\x20tx\x20binding\x20check','check':a=>{if(!a['repository']||a['repository']['op']!=='add')return null;return{'id':'R-PR-5-02','level':'LOW','category':'cross_object','title':'context_repository_add\x20creates\x20object-linker\x20tx\x20binding','description':'Adding\x20'+a['repository']['objects']['length']+'\x20repository(ies)\x20creates\x20object-linker\x20tx\x20binding\x20'+'entries.\x20If\x20the\x20Repository\x20is\x20later\x20removed\x20(object_linker::disaffiliation_tx),\x20cross-object\x20queries\x20'+'that\x20depend\x20on\x20it\x20will\x20return\x20empty\x20results\x20without\x20warning.','affected_stakeholders':['owner','system'],'scenario':'Repository\x20deleted\x20while\x20Progress\x20still\x20references\x20it','mitigation':'Use\x20context_repository_remove\x20before\x20deleting\x20a\x20Repository;\x20audit\x20object-linker\x20bindings\x20periodically','evidence':'add_count='+a['repository']['objects']['length']};}},R_PR_5_03={'id':'R-PR-5-03','category':'cross_object','trigger':'Permission\x20used\x20by\x20Progress\x20is\x20shared\x20with\x20other\x20host\x20objects','check':a=>{if(!a['target_objects_types']||a['target_objects_types']['length']<0x2)return null;const b=new Set(a['target_objects_types']);if(b['size']>0x1)return{'id':'R-PR-5-03','level':'MEDIUM','category':'cross_object','title':'Permission\x20shared\x20across\x20heterogeneous\x20host\x20objects','description':'Single\x20Permission\x20applied\x20to\x20'+[...b]['join'](',\x20')+'.\x20'+'Progress\x20builtin\x20indexes\x20(220-225)\x20have\x20different\x20semantics\x20per\x20host\x20object;\x20'+'granting\x20221\x20(PROGRESS_NAMED_OPERATOR)\x20to\x20a\x20non-Progress\x20entity\x20is\x20meaningless.','affected_stakeholders':['owner'],'scenario':'One\x20Permission\x20for\x20both\x20Progress\x20and\x20Machine','mitigation':'Use\x20separate\x20Permission\x20objects\x20per\x20host\x20object\x20type','evidence':'types='+[...b]['join'](',')};return null;}},R_PR_5_04={'id':'R-PR-5-04','category':'cross_object','trigger':'Progress\x20without\x20bound\x20Order\x20(order=null)\x20—\x20order_next/order_hold\x20blocked','check':a=>{if(!a['operate'])return null;if(a['current_task']===null&&a['operate']['op']!==undefined)return{'id':'R-PR-5-04','level':'MEDIUM','category':'cross_object','title':'operate\x20without\x20bound\x20Order\x20—\x20order_next/order_hold\x20unavailable','description':'Progress\x20has\x20no\x20bound\x20task\x20(task=null).\x20order_next\x20and\x20order_hold\x20require\x20'+'progress.task\x20==\x20order\x20address\x20(E_ORDER_NOT_MATCH).\x20Use\x20plain\x20next()/hold()\x20instead.','affected_stakeholders':['submitter'],'scenario':'User\x20tries\x20order\x20variant\x20on\x20a\x20task-less\x20Progress','mitigation':'Use\x20non-order\x20next()/hold()\x20variant,\x20OR\x20call\x20task_set\x20first\x20to\x20bind\x20an\x20Order','evidence':'task=null'};return null;}},ALL_RULES=[R_PR_1_01,R_PR_1_02,R_PR_1_03,R_PR_1_04,R_PR_2_01,R_PR_2_02,R_PR_2_03,R_PR_3_01,R_PR_3_02,R_PR_3_03,R_PR_4_01,R_PR_4_02,R_PR_4_03,R_PR_5_01,R_PR_5_02,R_PR_5_03,R_PR_5_04];export const PROGRESS_RISK_VERSION='1.0.0';export function getAllProgressRiskRules(){return[...ALL_RULES];}export function getProgressRiskRulesCount(){return ALL_RULES['length'];}export function getProgressRiskRulesByCategory(a){return ALL_RULES['filter'](b=>b['category']===a);}export function assessProgressRisks(a){const b=[];for(const f of ALL_RULES){const g=f['check'](a);if(g)b['push'](g);}const c=b['length']===0x0?'LOW':b['some'](h=>h['level']==='CRITICAL')?'CRITICAL':b['some'](h=>h['level']==='HIGH')?'HIGH':b['some'](h=>h['level']==='MEDIUM')?'MEDIUM':'LOW',d={};for(const h of b){d[h['category']]=(d[h['category']]??0x0)+0x1;}const e={};for(const i of b){for(const j of i['affected_stakeholders']){if(!e[j])e[j]=[];e[j]['push'](i['id']+':\x20'+i['mitigation']);}}return{'summary':'Assessed\x20'+b['length']+'\x20risk(s)\x20across\x20'+Object['keys'](d)['length']+'\x20categories','risks':b,'overall_risk':c,'risks_by_category':d,'stakeholder_advice':e,'needs_human_review':b['some'](k=>k['level']==='CRITICAL'||k['level']==='HIGH')};}
1
+ import{MAX_NAMED_OPERATOR_COUNT,MAX_NAMED_OPERATOR_ADDRESS_COUNT,MAX_CONTEXT_REPOSITORY_COUNT}from'@wowok/wowok';const R_PR_1_01={'id':'R-PR-1-01','category':'structural','trigger':'named_operator\x20addresses\x20count\x20>\x20MAX_NAMED_OPERATOR_ADDRESS_COUNT\x20(80)','check':a=>{if(!a['progress_namedOperator'])return null;const b=a['progress_namedOperator']['operators']['length'];if(b>MAX_NAMED_OPERATOR_ADDRESS_COUNT)return{'id':'R-PR-1-01','level':'HIGH','category':'structural','title':'named_operator\x20address\x20count\x20exceeds\x20limit','description':'named_operator\x20\x22'+a['progress_namedOperator']['name']+'\x22\x20has\x20'+b+'\x20addresses,\x20'+('exceeds\x20MAX_NAMED_OPERATOR_ADDRESS_COUNT\x20'+MAX_NAMED_OPERATOR_ADDRESS_COUNT+'.\x20')+'Move\x20aborts\x20with\x20E_MAX_NAMED_OPERATOR_ADDRESS_COUNT.','affected_stakeholders':['owner','named_operator'],'scenario':'Adding\x20>\x2080\x20addresses\x20to\x20a\x20single\x20named\x20operator','mitigation':'Split\x20into\x20multiple\x20named_operator\x20names,\x20or\x20remove\x20inactive\x20addresses\x20first','evidence':'addr_count='+b};return null;}},R_PR_1_02={'id':'R-PR-1-02','category':'structural','trigger':'Adding\x20new\x20named_operator\x20would\x20exceed\x20MAX_NAMED_OPERATOR_COUNT\x20(60)','check':a=>{if(!a['progress_namedOperator']||a['progress_namedOperator']['op']!=='add')return null;const b=a['current_named_operator_count']??0x0;if(b>=MAX_NAMED_OPERATOR_COUNT)return{'id':'R-PR-1-02','level':'HIGH','category':'structural','title':'named_operator\x20namespace\x20count\x20at\x20limit','description':'Progress\x20already\x20has\x20'+b+'\x20named\x20operators,\x20'+('at\x20MAX_NAMED_OPERATOR_COUNT\x20'+MAX_NAMED_OPERATOR_COUNT+'.\x20Adding\x20a\x20new\x20name\x20will\x20abort\x20with\x20E_MAX_NAMED_OPERATOR_COUNT.'),'affected_stakeholders':['owner'],'scenario':'Adding\x20a\x2061st\x20named_operator\x20name\x20to\x20a\x20full\x20Progress','mitigation':'Use\x20\x27set\x27\x20on\x20an\x20existing\x20name\x20(replace\x20address\x20list),\x20or\x20remove\x20an\x20unused\x20name\x20first','evidence':'named_operator_count='+b};return null;}},R_PR_1_03={'id':'R-PR-1-03','category':'structural','trigger':'context_repository\x20add\x20would\x20exceed\x20MAX_CONTEXT_REPOSITORY_COUNT\x20(30)','check':a=>{if(!a['repository'])return null;if(a['repository']['op']==='clear')return null;const b=a['repository']['op']==='remove'?0x0:a['repository']['objects']['length'];if(b===0x0)return null;const c=a['current_context_repository_count']??0x0;if(c+b>MAX_CONTEXT_REPOSITORY_COUNT)return{'id':'R-PR-1-03','level':'HIGH','category':'structural','title':'context_repository\x20count\x20exceeds\x20limit','description':'Progress\x20has\x20'+c+'\x20repositories,\x20adding\x20'+b+'\x20would\x20total\x20'+(c+b)+',\x20'+('exceeds\x20MAX_CONTEXT_REPOSITORY_COUNT\x20'+MAX_CONTEXT_REPOSITORY_COUNT+'.\x20Move\x20aborts\x20with\x20E_MAX_CONTEXT_REPOSITORY_COUNT.'),'affected_stakeholders':['owner'],'scenario':'Adding\x20too\x20many\x20context\x20repositories','mitigation':'Remove\x20unused\x20repositories\x20first,\x20or\x20use\x20repository\x20\x27set\x27\x20to\x20replace\x20the\x20list','evidence':'current='+c+',\x20add='+b};return null;}},R_PR_1_04={'id':'R-PR-1-04','category':'structural','trigger':'named_operator\x20name\x20is\x20empty\x20string\x20but\x20is_order_holder_namespace=false','check':a=>{if(!a['progress_namedOperator'])return null;if(a['progress_namedOperator']['name']===''&&a['progress_namedOperator']['op']!=='remove')return{'id':'R-PR-1-04','level':'MEDIUM','category':'structural','title':'named_operator\x20name\x20is\x20empty\x20(OrderHolder\x20namespace)','description':'progress_namedOperator.name=\x22\x22\x20—\x20empty\x20string\x20maps\x20to\x20the\x20OrderHolder\x20namespace\x20'+'(machine::init_node_name()).\x20This\x20is\x20typically\x20set\x20by\x20service::buy,\x20not\x20by\x20direct\x20user\x20op.\x20'+'Manual\x20manipulation\x20may\x20overwrite\x20order-payer\x20authorization.','affected_stakeholders':['owner','named_operator'],'scenario':'User\x20manually\x20setting\x20the\x20empty-name\x20namespace','mitigation':'If\x20intentional\x20(e.g.\x20order_owner_set\x20internal\x20call),\x20confirm.\x20Otherwise\x20use\x20a\x20non-empty\x20name.','evidence':'name=\x22\x22'};return null;}},R_PR_2_01={'id':'R-PR-2-01','category':'semantic','trigger':'task_set\x20on\x20Progress\x20that\x20already\x20has\x20a\x20task\x20(E_TASK_ALREADY_SET)','check':a=>{if(!a['task'])return null;if(a['current_task']!==null&&a['current_task']!==undefined)return{'id':'R-PR-2-01','level':'HIGH','category':'semantic','title':'task_set\x20on\x20already-bound\x20Progress\x20(irreversible)','description':'Progress\x20already\x20has\x20task='+a['current_task']+'.\x20task_set\x20is\x20one-time;\x20'+'Move\x20aborts\x20with\x20E_TASK_ALREADY_SET.\x20There\x20is\x20no\x20way\x20to\x20change\x20the\x20task\x20after\x20first\x20set.','affected_stakeholders':['owner','submitter'],'scenario':'User\x20tries\x20to\x20rebind\x20Progress\x20to\x20a\x20different\x20Order','mitigation':'Create\x20a\x20new\x20Progress\x20via\x20service::buy\x20with\x20the\x20new\x20Order;\x20the\x20old\x20Progress\x20is\x20permanently\x20bound','evidence':'current_task='+a['current_task']};return null;}},R_PR_2_02={'id':'R-PR-2-02','category':'semantic','trigger':'operate.message\x20exceeds\x20MAX_LONG_NAME_LENGTH\x20(long-name\x20constraint)','check':a=>{if(!a['operate']?.['message'])return null;const b=a['operate']['message'];if(b['length']>0x400)return{'id':'R-PR-2-02','level':'MEDIUM','category':'semantic','title':'operate.message\x20exceeds\x20long-name\x20length','description':'operate.message\x20length\x20'+b['length']+'\x20exceeds\x20MAX_LONG_NAME_LENGTH\x20(1024).\x20'+'Move\x20aborts\x20in\x20common::LONG_NAME\x20check.','affected_stakeholders':['submitter'],'scenario':'Long\x20deliverable\x20message','mitigation':'Truncate\x20message\x20to\x20≤\x201024\x20chars;\x20store\x20full\x20payload\x20in\x20a\x20context\x20Repository','evidence':'msg_len='+b['length']};return null;}},R_PR_2_03={'id':'R-PR-2-03','category':'semantic','trigger':'operate.op\x20is\x20not\x20a\x20valid\x20enum\x20value\x20(schema-enforced,\x20defense-in-depth)','check':a=>{if(!a['operate'])return null;const b=['next','hold','unhold','adminUnhold'];if(a['operate']['op']&&!b['includes'](a['operate']['op']))return{'id':'R-PR-2-03','level':'HIGH','category':'semantic','title':'operate.op\x20must\x20be\x20one\x20of:\x20'+b['join'](',\x20'),'description':'op\x20enum\x20selects\x20the\x20Move\x20function:\x20next=accomplish,\x20hold=hold(bHold=true),\x20'+'unhold=hold(bHold=false),\x20adminUnhold=unhold\x20(224\x20permission).','affected_stakeholders':['submitter'],'scenario':'Schema\x20validation\x20bypassed\x20or\x20stale\x20client','mitigation':'Use\x20one\x20of:\x20'+b['join'](',\x20'),'evidence':'op='+a['operate']['op']};return null;}},R_PR_3_01={'id':'R-PR-3-01','category':'permission','trigger':'op=\x27adminUnhold\x27\x20(224\x20permission)\x20—\x20force\x20release\x20bypassing\x20holder\x20check','check':a=>{if(a['operate']?.['op']!=='adminUnhold')return null;return{'id':'R-PR-3-01','level':'HIGH','category':'permission','title':'adminUnhold\x20bypasses\x20holder\x20check\x20(broad\x20blast\x20radius)','description':'adminUnhold\x20uses\x20224\x20permission\x20to\x20release\x20a\x20held\x20forward\x20WITHOUT\x20verifying\x20sender\x20==\x20holder.\x20'+'If\x20224\x20is\x20granted\x20too\x20broadly,\x20any\x20224-holder\x20can\x20release\x20ANY\x20held\x20forward\x20in\x20this\x20Progress.','affected_stakeholders':['owner','named_operator','submitter'],'scenario':'Admin\x20force-releases\x20a\x20forward\x20that\x20the\x20original\x20holder\x20still\x20wanted\x20held','mitigation':'1)\x20Grant\x20224\x20only\x20to\x20dedicated\x20recovery\x20addresses.\x202)\x20Log\x20every\x20adminUnhold\x20for\x20audit.\x20'+'3)\x20Prefer\x20normal\x20unhold\x20(holder\x20self-release)\x20when\x20possible.','evidence':'adminUnhold=true,\x20forward='+a['operate']['operation']['forward']};}},R_PR_3_02={'id':'R-PR-3-02','category':'permission','trigger':'namedOperator\x20short-circuit\x20bypasses\x20220-225\x20permission\x20check','check':a=>{if(!a['operate'])return null;if(a['forward_named_operator']&&a['forward_named_operator']!=='')return{'id':'R-PR-3-02','level':'MEDIUM','category':'permission','title':'Forward\x20advance\x20via\x20named_operator\x20short-circuits\x20220-225\x20check','description':'Forward\x20\x22'+a['operate']['operation']['forward']+'\x22\x20uses\x20namedOperator=\x22'+a['forward_named_operator']+'\x22.\x20'+'Move\x27s\x20ASSERT_PERMISSION\x20returns\x20immediately\x20if\x20IsNamedOperator()\x20succeeds,\x20WITHOUT\x20checking\x20'+'any\x20permission\x20index.\x20Anyone\x20in\x20the\x20named_operator\x20list\x20can\x20advance\x20this\x20forward.','affected_stakeholders':['owner','named_operator'],'scenario':'Operator\x20list\x20too\x20permissive\x20(e.g.\x20includes\x20expired/compromised\x20addresses)','mitigation':'1)\x20Keep\x20named_operator\x20lists\x20minimal.\x202)\x20Use\x20namedOperator_remove\x20to\x20revoke\x20access\x20promptly.\x20'+'3)\x20For\x20sensitive\x20forwards,\x20prefer\x20Forward.permissionIndex\x20(Some)\x20for\x20dual-check.','evidence':'named_operator='+a['forward_named_operator']};return null;}},R_PR_3_03={'id':'R-PR-3-03','category':'permission','trigger':'Forward\x20has\x20guard\x20(Some)\x20—\x20Passport\x20required\x20but\x20not\x20provided','check':a=>{if(!a['operate'])return null;if(a['forward_has_guard']&&!a['forward_permission_index'])return{'id':'R-PR-3-03','level':'HIGH','category':'permission','title':'Forward\x20guard\x20requires\x20Passport','description':'Forward\x20\x22'+a['operate']['operation']['forward']+'\x22\x20has\x20a\x20guard\x20(Some).\x20'+'Move\x27s\x20next_imp\x20asserts\x20E_NEED_PASSPORT\x20for\x20guarded\x20forwards\x20when\x20called\x20without\x20passport.\x20'+'Use\x20next_with_passport\x20/\x20order_next_with_passport\x20instead.','affected_stakeholders':['submitter'],'scenario':'User\x20calls\x20next()\x20on\x20a\x20guarded\x20forward\x20without\x20passport','mitigation':'Submit\x20via\x20*_with_passport\x20variant;\x20ensure\x20submission\x20data\x20is\x20valid\x20for\x20the\x20Guard','evidence':'forward='+a['operate']['operation']['forward']+',\x20has_guard='+a['forward_has_guard']};return null;}},R_PR_4_01={'id':'R-PR-4-01','category':'lifecycle','trigger':'Machine\x20not\x20published\x20—\x20Progress\x20cannot\x20be\x20created','check':a=>{if(a['machine_published']===![])return{'id':'R-PR-4-01','level':'CRITICAL','category':'lifecycle','title':'Machine\x20not\x20published\x20—\x20Progress\x20creation\x20blocked','description':'Machine\x20'+(a['current_machine']??'(unknown)')+'\x20is\x20not\x20published.\x20'+'Progress\x20requires\x20a\x20published\x20Machine\x20(machine::on_progress_new\x20asserts\x20published\x20state).\x20'+'All\x20Progress\x20ops\x20will\x20fail\x20with\x20E_MACHINE_NOT_MATCH\x20or\x20similar.','affected_stakeholders':['owner'],'scenario':'User\x20attempts\x20to\x20create\x20Progress\x20before\x20Machine\x20publish','mitigation':'Publish\x20the\x20Machine\x20first\x20(machine::publish,\x20205\x20permission),\x20then\x20create\x20Progress','evidence':'machine='+a['current_machine']+',\x20published=false'};return null;}},R_PR_4_02={'id':'R-PR-4-02','category':'lifecycle','trigger':'operate\x20on\x20already-accomplished\x20forward\x20(E_FORWARD_ALREADY_ACCOMPLISHED)','check':a=>{if(!a['operate'])return null;if(a['forward_already_accomplished'])return{'id':'R-PR-4-02','level':'MEDIUM','category':'lifecycle','title':'Forward\x20already\x20accomplished\x20—\x20re-hold\x20blocked','description':'Forward\x20\x22'+a['operate']['operation']['forward']+'\x22\x20to\x20\x22'+a['operate']['operation']['next_node_name']+'\x22\x20'+'is\x20already\x20accomplished.\x20Move\x20aborts\x20with\x20E_FORWARD_ALREADY_ACCOMPLISHED\x20on\x20any\x20re-hold\x20attempt.','affected_stakeholders':['submitter'],'scenario':'User\x20retries\x20an\x20already-completed\x20forward\x20(race\x20condition\x20or\x20stale\x20state)','mitigation':'Query\x20Progress.current\x20—\x20if\x20already\x20past\x20target,\x20no\x20action\x20needed;\x20if\x20parallel\x20session,\x20use\x20a\x20different\x20forward','evidence':'forward='+a['operate']['operation']['forward']+',\x20accomplished=true'};return null;}},R_PR_4_03={'id':'R-PR-4-03','category':'lifecycle','trigger':'unhold\x20by\x20non-holder\x20without\x20224\x20permission\x20(E_NOT_THE_HOLDER)','check':a=>{if(!a['operate']||a['operate']['op']!=='unhold')return null;if(a['holder_address']&&a['signer']&&a['holder_address']!==a['signer'])return{'id':'R-PR-4-03','level':'HIGH','category':'lifecycle','title':'unhold\x20by\x20non-holder\x20—\x20Move\x20will\x20abort\x20E_NOT_THE_HOLDER','description':'Forward\x20is\x20held\x20by\x20'+a['holder_address']+',\x20but\x20signer\x20is\x20'+a['signer']+'.\x20'+'Move\x20aborts\x20with\x20E_NOT_THE_HOLDER\x20unless\x20signer\x20has\x20224\x20permission\x20(adminUnhold\x20path).','affected_stakeholders':['submitter'],'scenario':'User\x20other\x20than\x20holder\x20tries\x20to\x20release\x20a\x20hold','mitigation':'1)\x20Have\x20the\x20original\x20holder\x20call\x20unhold.\x202)\x20If\x20holder\x20is\x20unresponsive,\x20use\x20adminUnhold=true\x20(requires\x20224).','evidence':'holder='+a['holder_address']+',\x20signer='+a['signer']};return null;}},R_PR_5_01={'id':'R-PR-5-01','category':'cross_object','trigger':'operate.order_next\x20called\x20but\x20progress.task\x20!=\x20order\x20address\x20(E_ORDER_NOT_MATCH)','check':a=>{if(!a['operate'])return null;if(a['current_task']&&a['signer'])return null;return null;}},R_PR_5_02={'id':'R-PR-5-02','category':'cross_object','trigger':'context_repository_add\x20without\x20object-linker\x20tx\x20binding\x20check','check':a=>{if(!a['repository']||a['repository']['op']!=='add')return null;return{'id':'R-PR-5-02','level':'LOW','category':'cross_object','title':'context_repository_add\x20creates\x20object-linker\x20tx\x20binding','description':'Adding\x20'+a['repository']['objects']['length']+'\x20repository(ies)\x20creates\x20object-linker\x20tx\x20binding\x20'+'entries.\x20If\x20the\x20Repository\x20is\x20later\x20removed\x20(object_linker::disaffiliation_tx),\x20cross-object\x20queries\x20'+'that\x20depend\x20on\x20it\x20will\x20return\x20empty\x20results\x20without\x20warning.','affected_stakeholders':['owner','system'],'scenario':'Repository\x20deleted\x20while\x20Progress\x20still\x20references\x20it','mitigation':'Use\x20context_repository_remove\x20before\x20deleting\x20a\x20Repository;\x20audit\x20object-linker\x20bindings\x20periodically','evidence':'add_count='+a['repository']['objects']['length']};}},R_PR_5_03={'id':'R-PR-5-03','category':'cross_object','trigger':'Permission\x20used\x20by\x20Progress\x20is\x20shared\x20with\x20other\x20host\x20objects','check':a=>{if(!a['target_objects_types']||a['target_objects_types']['length']<0x2)return null;const b=new Set(a['target_objects_types']);if(b['size']>0x1)return{'id':'R-PR-5-03','level':'MEDIUM','category':'cross_object','title':'Permission\x20shared\x20across\x20heterogeneous\x20host\x20objects','description':'Single\x20Permission\x20applied\x20to\x20'+[...b]['join'](',\x20')+'.\x20'+'Progress\x20builtin\x20indexes\x20(220-225)\x20have\x20different\x20semantics\x20per\x20host\x20object;\x20'+'granting\x20221\x20(PROGRESS_NAMED_OPERATOR)\x20to\x20a\x20non-Progress\x20entity\x20is\x20meaningless.','affected_stakeholders':['owner'],'scenario':'One\x20Permission\x20for\x20both\x20Progress\x20and\x20Machine','mitigation':'Use\x20separate\x20Permission\x20objects\x20per\x20host\x20object\x20type','evidence':'types='+[...b]['join'](',')};return null;}},R_PR_5_04={'id':'R-PR-5-04','category':'cross_object','trigger':'Progress\x20without\x20bound\x20Order\x20(order=null)\x20—\x20order_next/order_hold\x20blocked','check':a=>{if(!a['operate'])return null;if(a['current_task']===null&&a['operate']['op']!==undefined)return{'id':'R-PR-5-04','level':'MEDIUM','category':'cross_object','title':'operate\x20without\x20bound\x20Order\x20—\x20order_next/order_hold\x20unavailable','description':'Progress\x20has\x20no\x20bound\x20task\x20(task=null).\x20order_next\x20and\x20order_hold\x20require\x20'+'progress.task\x20==\x20order\x20address\x20(E_ORDER_NOT_MATCH).\x20Use\x20plain\x20next()/hold()\x20instead.','affected_stakeholders':['submitter'],'scenario':'User\x20tries\x20order\x20variant\x20on\x20a\x20task-less\x20Progress','mitigation':'Use\x20non-order\x20next()/hold()\x20variant,\x20OR\x20call\x20task_set\x20first\x20to\x20bind\x20an\x20Order','evidence':'task=null'};return null;}},ALL_RULES=[R_PR_1_01,R_PR_1_02,R_PR_1_03,R_PR_1_04,R_PR_2_01,R_PR_2_02,R_PR_2_03,R_PR_3_01,R_PR_3_02,R_PR_3_03,R_PR_4_01,R_PR_4_02,R_PR_4_03,R_PR_5_01,R_PR_5_02,R_PR_5_03,R_PR_5_04];export const PROGRESS_RISK_VERSION='1.0.0';export function getAllProgressRiskRules(){return[...ALL_RULES];}export function assessProgressRisks(a){const b=[];for(const f of ALL_RULES){const g=f['check'](a);if(g)b['push'](g);}const c=b['length']===0x0?'LOW':b['some'](h=>h['level']==='CRITICAL')?'CRITICAL':b['some'](h=>h['level']==='HIGH')?'HIGH':b['some'](h=>h['level']==='MEDIUM')?'MEDIUM':'LOW',d={};for(const h of b){d[h['category']]=(d[h['category']]??0x0)+0x1;}const e={};for(const i of b){for(const j of i['affected_stakeholders']){if(!e[j])e[j]=[];e[j]['push'](i['id']+':\x20'+i['mitigation']);}}return{'summary':'Assessed\x20'+b['length']+'\x20risk(s)\x20across\x20'+Object['keys'](d)['length']+'\x20categories','risks':b,'overall_risk':c,'risks_by_category':d,'stakeholder_advice':e,'needs_human_review':b['some'](k=>k['level']==='CRITICAL'||k['level']==='HIGH')};}
@@ -30,4 +30,3 @@ export declare const PROOF_RISK_RULES: {
30
30
  check: (ctx: ProofRiskCheckContext) => ProofRisk | null;
31
31
  }[];
32
32
  export declare function checkProofRisks(ctx: ProofRiskCheckContext): ProofRisk[];
33
- export declare function getProofRiskById(id: string): ProofRisk | undefined;
@@ -1 +1 @@
1
- import{MAX_PROOF_SIZE,MAX_SERVER_PUBKEY_SIZE,MAX_SERVER_SIGNATURE_SIZE,WOWOK_WTS_PROOF_TYPE}from'@wowok/wowok';const R_PR_1_01={'rule':{'id':'R-PROOF-01','level':'HIGH','category':'structural','title':'proof\x20content\x20exceeds\x20MAX_PROOF_SIZE\x20('+MAX_PROOF_SIZE+'\x20bytes)','description':'The\x20\x27proof\x27\x20string\x20field\x20is\x20bounded\x20by\x20MAX_PROOF_SIZE='+MAX_PROOF_SIZE+'\x20bytes\x20(Move\x20source:\x20proof.move:27).\x20'+'Exceeding\x20this\x20limit\x20aborts\x20with\x20E_MAX_PROOF_SIZE\x20(1).\x20The\x20proof\x20content\x20typically\x20holds\x20a\x20merkle\x20tree\x20root\x20'+'or\x20similar\x20compact\x20cryptographic\x20digest\x20—\x20large\x20data\x20should\x20be\x20stored\x20in\x20a\x20Repository\x20and\x20referenced\x20by\x20address,\x20'+'not\x20inlined\x20into\x20the\x20Proof\x20object.','affected_stakeholders':['creator'],'scenario':'Caller\x20submits\x20a\x20proof\x20string\x20longer\x20than\x2010240\x20bytes','mitigation':'Keep\x20proof\x20content\x20compact\x20(merkle\x20root,\x20hash\x20digest).\x20For\x20larger\x20payloads,\x20store\x20data\x20in\x20a\x20Repository\x20'+'object\x20and\x20set\x20about_address\x20to\x20the\x20Repository\x20address,\x20or\x20use\x20item_count\x20to\x20indicate\x20the\x20off-chain\x20data\x20size.','related_move_error':'E_MAX_PROOF_SIZE\x20(1)','auto_fixable':![]},'check':a=>{if(!a['proof'])return null;if(a['proof']['length']<=MAX_PROOF_SIZE)return null;return{...R_PR_1_01['rule'],'evidence':'proof.length='+a['proof']['length']+',\x20limit='+MAX_PROOF_SIZE};}},R_PR_1_02={'rule':{'id':'R-PROOF-02','level':'MEDIUM','category':'structural','title':'server_pubkey\x20exceeds\x20MAX_SERVER_PUBKEY_SIZE\x20('+MAX_SERVER_PUBKEY_SIZE+'\x20bytes)','description':'The\x20\x27server_pubkey\x27\x20field\x20is\x20bounded\x20by\x20MAX_SERVER_PUBKEY_SIZE='+MAX_SERVER_PUBKEY_SIZE+'\x20bytes\x20(Move\x20source:\x20proof.move:28).\x20'+'Exceeding\x20this\x20limit\x20aborts\x20with\x20E_MAX_SERVER_PUBKEY_SIZE\x20(2).\x20Typical\x20public\x20keys\x20(Ed25519=32\x20bytes,\x20RSA-2048=256\x20bytes,\x20'+'BLS12-381\x20G1=48\x20bytes,\x20G2=96\x20bytes)\x20fit\x20comfortably\x20within\x20this\x20limit.','affected_stakeholders':['creator'],'scenario':'Caller\x20submits\x20an\x20oversized\x20server\x20public\x20key\x20(e.g.\x20certificate\x20chain\x20instead\x20of\x20raw\x20key)','mitigation':'Submit\x20only\x20the\x20raw\x20public\x20key\x20bytes\x20(hex-encoded),\x20not\x20a\x20full\x20certificate\x20or\x20JWK\x20structure.','related_move_error':'E_MAX_SERVER_PUBKEY_SIZE\x20(2)','auto_fixable':![]},'check':a=>{if(!a['server_pubkey'])return null;if(a['server_pubkey']['length']<=MAX_SERVER_PUBKEY_SIZE)return null;return{...R_PR_1_02['rule'],'evidence':'server_pubkey.length='+a['server_pubkey']['length']+',\x20limit='+MAX_SERVER_PUBKEY_SIZE};}},R_PR_1_03={'rule':{'id':'R-PROOF-03','level':'MEDIUM','category':'structural','title':'server_signature\x20exceeds\x20MAX_SERVER_SIGNATURE_SIZE\x20('+MAX_SERVER_SIGNATURE_SIZE+'\x20bytes)','description':'The\x20\x27server_signature\x27\x20field\x20is\x20bounded\x20by\x20MAX_SERVER_SIGNATURE_SIZE='+MAX_SERVER_SIGNATURE_SIZE+'\x20bytes\x20'+'(Move\x20source:\x20proof.move:29).\x20Exceeding\x20this\x20limit\x20aborts\x20with\x20E_MAX_SERVER_SIGNATURE_SIZE\x20(3).\x20'+'Most\x20signature\x20schemes\x20produce\x20signatures\x20well\x20under\x20this\x20limit\x20(Ed25519=64\x20bytes,\x20ECDSA=64-72\x20bytes,\x20'+'BLS12-381=96\x20bytes,\x20RSA-2048=256\x20bytes).','affected_stakeholders':['creator'],'scenario':'Caller\x20submits\x20an\x20oversized\x20signature\x20(e.g.\x20bundled\x20with\x20metadata)','mitigation':'Submit\x20only\x20the\x20raw\x20signature\x20bytes\x20(hex-encoded),\x20not\x20bundled\x20metadata\x20or\x20certificate\x20chains.','related_move_error':'E_MAX_SERVER_SIGNATURE_SIZE\x20(3)','auto_fixable':![]},'check':a=>{if(!a['server_signature'])return null;if(a['server_signature']['length']<=MAX_SERVER_SIGNATURE_SIZE)return null;return{...R_PR_1_03['rule'],'evidence':'server_signature.length='+a['server_signature']['length']+',\x20limit='+MAX_SERVER_SIGNATURE_SIZE};}},R_PR_2_01={'rule':{'id':'R-PROOF-04','level':'MEDIUM','category':'semantic','title':'proof_type\x20in\x20reserved\x20range\x20without\x20authority\x20(1-100\x20reserved\x20for\x20Wowok)','description':'proof_type='+WOWOK_WTS_PROOF_TYPE+'\x20is\x20WOWOK_WTS_PROOF_TYPE\x20(Will-To-Sign).\x20Values\x202-100\x20are\x20reserved\x20for\x20'+'future\x20Wowok-defined\x20proof\x20types.\x20User-defined\x20proof\x20types\x20must\x20use\x20values\x20>\x20100.\x20While\x20the\x20Move\x20contract\x20'+'does\x20not\x20currently\x20enforce\x20this\x20range\x20at\x20the\x20type\x20level\x20(it\x20accepts\x20any\x20u64),\x20using\x20a\x20reserved\x20value\x20without\x20'+'authority\x20creates\x20semantic\x20confusion:\x20consumers\x20may\x20misinterpret\x20the\x20proof\x27s\x20verification\x20rules.','affected_stakeholders':['creator','consumer','verifier'],'scenario':'User\x20creates\x20a\x20custom\x20proof\x20with\x20proof_type=5\x20(a\x20reserved\x20value)','mitigation':'Use\x20proof_type\x20>\x20100\x20for\x20user-defined\x20proof\x20types.\x20Use\x20proof_type=1\x20only\x20for\x20WTS\x20proofs\x20signed\x20by\x20an\x20'+'off-chain\x20server\x20(with\x20server_pubkey\x20+\x20server_signature).\x20Document\x20the\x20verification\x20rule\x20for\x20custom\x20types.','auto_fixable':![]},'check':a=>{if(a['proof_type']===undefined||a['proof_type']===null)return null;const b=typeof a['proof_type']==='string'?BigInt(a['proof_type']):BigInt(a['proof_type']);if(b===BigInt(WOWOK_WTS_PROOF_TYPE)||b>0x64n)return null;return{...R_PR_2_01['rule'],'evidence':'proof_type='+a['proof_type']+'\x20(reserved\x20range\x202-100)'};}},R_PR_2_02={'rule':{'id':'R-PROOF-05','level':'LOW','category':'semantic','title':'about_address\x20not\x20provided\x20—\x20consumers\x20cannot\x20locate\x20the\x20referenced\x20entity','description':'about_address\x20is\x20the\x20on-chain\x20address\x20of\x20the\x20entity\x20being\x20proved\x20(e.g.\x20a\x20user,\x20an\x20order,\x20a\x20Repository).\x20'+'When\x20null/undefined,\x20the\x20Proof\x20has\x20no\x20on-chain\x20binding\x20—\x20it\x20is\x20a\x20free-standing\x20cryptographic\x20statement.\x20'+'Consumers\x20(Repository,\x20Service,\x20etc.)\x20that\x20reference\x20this\x20Proof\x20cannot\x20automatically\x20resolve\x20which\x20entity\x20'+'it\x20applies\x20to.\x20This\x20is\x20acceptable\x20for\x20generic\x20proofs\x20but\x20problematic\x20for\x20entity-bound\x20attestations.','affected_stakeholders':['creator','consumer'],'scenario':'Caller\x20creates\x20a\x20Proof\x20without\x20about_address,\x20then\x20a\x20Repository\x20tries\x20to\x20bind\x20it\x20to\x20a\x20data\x20entry','mitigation':'Set\x20about_address\x20when\x20the\x20Proof\x20attests\x20to\x20a\x20specific\x20on-chain\x20entity.\x20Leave\x20it\x20null\x20only\x20for\x20'+'free-standing\x20cryptographic\x20statements\x20(e.g.\x20a\x20server\x27s\x20timestamp\x20attestation).','auto_fixable':!![]},'check':a=>{if(a['about_address'])return null;return{...R_PR_2_02['rule'],'evidence':'about_address=null/undefined'};}},R_PR_3_01={'rule':{'id':'R-PROOF-06','level':'LOW','category':'lifecycle','title':'description\x20missing\x20—\x20Proof\x20hard\x20to\x20identify\x20in\x20queries\x20and\x20audit\x20logs','description':'description\x20is\x20a\x20REQUIRED\x20field\x20(PF-D-2=A).\x20The\x20Move\x20contract\x20stores\x20it\x20as\x20a\x20String\x20field\x20and\x20SDK\x20'+'passes\x20it\x20to\x20create_wowok_proof_v2.\x20An\x20empty\x20description\x20(\x22\x22)\x20is\x20technically\x20valid\x20but\x20makes\x20the\x20Proof\x20'+'hard\x20to\x20identify\x20in\x20query\x20results\x20and\x20audit\x20logs.\x20Non-empty\x20descriptions\x20are\x20strongly\x20recommended.','affected_stakeholders':['creator','verifier'],'scenario':'Caller\x20passes\x20description=\x22\x22\x20to\x20save\x20typing','mitigation':'Provide\x20a\x20one-line\x20description\x20like\x20\x22KYC\x20attestation\x20for\x20user\x200xabc\x22\x20or\x20\x22merkle\x20root\x20for\x20batch\x20#42\x22.','auto_fixable':![]},'check':a=>{if(a['description']===undefined)return null;if(a['description']['length']>0x0)return null;return{...R_PR_3_01['rule'],'evidence':'description=\x22\x22\x20(empty)'};}},R_PR_3_02={'rule':{'id':'R-PROOF-07','level':'HIGH','category':'lifecycle','title':'Proof\x20is\x20immutable\x20—\x20cannot\x20modify\x20after\x20creation\x20(freeze_object)','description':'Proof\x20is\x20created\x20via\x20transfer::freeze_object(obj)\x20in\x20Move\x20(proof.move:65).\x20Once\x20frozen,\x20the\x20object\x20'+'cannot\x20be\x20modified,\x20transferred,\x20or\x20deleted.\x20All\x20fields\x20(proof,\x20server_pubkey,\x20server_signature,\x20'+'about,\x20proof_type,\x20signer,\x20time,\x20description,\x20item_count)\x20are\x20permanently\x20fixed\x20at\x20the\x20value\x20set\x20'+'during\x20create_wowok_proof_v2().\x20To\x20\x27update\x27\x20a\x20Proof,\x20create\x20a\x20new\x20one\x20and\x20update\x20references.','affected_stakeholders':['creator','consumer'],'scenario':'Caller\x20wants\x20to\x20update\x20server_signature\x20after\x20key\x20rotation\x20—\x20cannot,\x20must\x20create\x20new\x20Proof','mitigation':'Verify\x20all\x20fields\x20before\x20calling\x20create_wowok_proof_v2.\x20For\x20scenarios\x20requiring\x20key\x20rotation,\x20'+'create\x20a\x20new\x20Proof\x20and\x20update\x20the\x20referencing\x20object\x20(Repository\x20data,\x20Service\x20config,\x20etc.)\x20to\x20'+'point\x20to\x20the\x20new\x20Proof\x20address.','auto_fixable':![]},'check':a=>null},R_PR_4_01={'rule':{'id':'R-PROOF-08','level':'INFO','category':'knowledge','title':'Knowledge\x20layer\x20&\x20constant\x20sync\x20—\x20RESOLVED','description':'All\x204\x20Proof\x20constants\x20(WOWOK_WTS_PROOF_TYPE,\x20MAX_PROOF_SIZE,\x20MAX_SERVER_PUBKEY_SIZE,\x20'+'MAX_SERVER_SIGNATURE_SIZE)\x20are\x20now\x20synced\x20to\x20onchain-constants.ts\x20(P-PROOF-P2-5).\x20The\x20MCP\x20Knowledge\x20'+'layer\x20now\x20includes\x20proof-risk.ts,\x20proof-confirm.ts,\x20proof-translation.ts\x20(P-PROOF-P2-6).\x20'+'This\x20risk\x20rule\x20is\x20retained\x20for\x20historical\x20audit\x20and\x20to\x20detect\x20future\x20regressions.','affected_stakeholders':['system'],'scenario':'Future\x20regression:\x20someone\x20removes\x20a\x20Proof\x20constant\x20from\x20onchain-constants.ts','mitigation':'Run\x20the\x20onchain-constants\x20sync\x20test\x20to\x20detect\x20drift.','auto_fixable':![]},'check':a=>{if(a['constants_synced'])return null;return{...R_PR_4_01['rule'],'evidence':'constants_synced=false'};}};export const PROOF_RISK_RULES=[R_PR_1_01,R_PR_1_02,R_PR_1_03,R_PR_2_01,R_PR_2_02,R_PR_3_01,R_PR_3_02,R_PR_4_01];export function checkProofRisks(a){const b=[];for(const c of PROOF_RISK_RULES){const d=c['check'](a);if(d)b['push'](d);}return!b['find'](e=>e['id']==='R-PROOF-07')&&b['push'](R_PR_3_02['rule']),b;}export function getProofRiskById(a){return PROOF_RISK_RULES['find'](b=>b['rule']['id']===a)?.['rule'];}
1
+ import{MAX_PROOF_SIZE,MAX_SERVER_PUBKEY_SIZE,MAX_SERVER_SIGNATURE_SIZE,WOWOK_WTS_PROOF_TYPE}from'@wowok/wowok';const R_PR_1_01={'rule':{'id':'R-PROOF-01','level':'HIGH','category':'structural','title':'proof\x20content\x20exceeds\x20MAX_PROOF_SIZE\x20('+MAX_PROOF_SIZE+'\x20bytes)','description':'The\x20\x27proof\x27\x20string\x20field\x20is\x20bounded\x20by\x20MAX_PROOF_SIZE='+MAX_PROOF_SIZE+'\x20bytes\x20(Move\x20source:\x20proof.move:27).\x20'+'Exceeding\x20this\x20limit\x20aborts\x20with\x20E_MAX_PROOF_SIZE\x20(1).\x20The\x20proof\x20content\x20typically\x20holds\x20a\x20merkle\x20tree\x20root\x20'+'or\x20similar\x20compact\x20cryptographic\x20digest\x20—\x20large\x20data\x20should\x20be\x20stored\x20in\x20a\x20Repository\x20and\x20referenced\x20by\x20address,\x20'+'not\x20inlined\x20into\x20the\x20Proof\x20object.','affected_stakeholders':['creator'],'scenario':'Caller\x20submits\x20a\x20proof\x20string\x20longer\x20than\x2010240\x20bytes','mitigation':'Keep\x20proof\x20content\x20compact\x20(merkle\x20root,\x20hash\x20digest).\x20For\x20larger\x20payloads,\x20store\x20data\x20in\x20a\x20Repository\x20'+'object\x20and\x20set\x20about_address\x20to\x20the\x20Repository\x20address,\x20or\x20use\x20item_count\x20to\x20indicate\x20the\x20off-chain\x20data\x20size.','related_move_error':'E_MAX_PROOF_SIZE\x20(1)','auto_fixable':![]},'check':a=>{if(!a['proof'])return null;if(a['proof']['length']<=MAX_PROOF_SIZE)return null;return{...R_PR_1_01['rule'],'evidence':'proof.length='+a['proof']['length']+',\x20limit='+MAX_PROOF_SIZE};}},R_PR_1_02={'rule':{'id':'R-PROOF-02','level':'MEDIUM','category':'structural','title':'server_pubkey\x20exceeds\x20MAX_SERVER_PUBKEY_SIZE\x20('+MAX_SERVER_PUBKEY_SIZE+'\x20bytes)','description':'The\x20\x27server_pubkey\x27\x20field\x20is\x20bounded\x20by\x20MAX_SERVER_PUBKEY_SIZE='+MAX_SERVER_PUBKEY_SIZE+'\x20bytes\x20(Move\x20source:\x20proof.move:28).\x20'+'Exceeding\x20this\x20limit\x20aborts\x20with\x20E_MAX_SERVER_PUBKEY_SIZE\x20(2).\x20Typical\x20public\x20keys\x20(Ed25519=32\x20bytes,\x20RSA-2048=256\x20bytes,\x20'+'BLS12-381\x20G1=48\x20bytes,\x20G2=96\x20bytes)\x20fit\x20comfortably\x20within\x20this\x20limit.','affected_stakeholders':['creator'],'scenario':'Caller\x20submits\x20an\x20oversized\x20server\x20public\x20key\x20(e.g.\x20certificate\x20chain\x20instead\x20of\x20raw\x20key)','mitigation':'Submit\x20only\x20the\x20raw\x20public\x20key\x20bytes\x20(hex-encoded),\x20not\x20a\x20full\x20certificate\x20or\x20JWK\x20structure.','related_move_error':'E_MAX_SERVER_PUBKEY_SIZE\x20(2)','auto_fixable':![]},'check':a=>{if(!a['server_pubkey'])return null;if(a['server_pubkey']['length']<=MAX_SERVER_PUBKEY_SIZE)return null;return{...R_PR_1_02['rule'],'evidence':'server_pubkey.length='+a['server_pubkey']['length']+',\x20limit='+MAX_SERVER_PUBKEY_SIZE};}},R_PR_1_03={'rule':{'id':'R-PROOF-03','level':'MEDIUM','category':'structural','title':'server_signature\x20exceeds\x20MAX_SERVER_SIGNATURE_SIZE\x20('+MAX_SERVER_SIGNATURE_SIZE+'\x20bytes)','description':'The\x20\x27server_signature\x27\x20field\x20is\x20bounded\x20by\x20MAX_SERVER_SIGNATURE_SIZE='+MAX_SERVER_SIGNATURE_SIZE+'\x20bytes\x20'+'(Move\x20source:\x20proof.move:29).\x20Exceeding\x20this\x20limit\x20aborts\x20with\x20E_MAX_SERVER_SIGNATURE_SIZE\x20(3).\x20'+'Most\x20signature\x20schemes\x20produce\x20signatures\x20well\x20under\x20this\x20limit\x20(Ed25519=64\x20bytes,\x20ECDSA=64-72\x20bytes,\x20'+'BLS12-381=96\x20bytes,\x20RSA-2048=256\x20bytes).','affected_stakeholders':['creator'],'scenario':'Caller\x20submits\x20an\x20oversized\x20signature\x20(e.g.\x20bundled\x20with\x20metadata)','mitigation':'Submit\x20only\x20the\x20raw\x20signature\x20bytes\x20(hex-encoded),\x20not\x20bundled\x20metadata\x20or\x20certificate\x20chains.','related_move_error':'E_MAX_SERVER_SIGNATURE_SIZE\x20(3)','auto_fixable':![]},'check':a=>{if(!a['server_signature'])return null;if(a['server_signature']['length']<=MAX_SERVER_SIGNATURE_SIZE)return null;return{...R_PR_1_03['rule'],'evidence':'server_signature.length='+a['server_signature']['length']+',\x20limit='+MAX_SERVER_SIGNATURE_SIZE};}},R_PR_2_01={'rule':{'id':'R-PROOF-04','level':'MEDIUM','category':'semantic','title':'proof_type\x20in\x20reserved\x20range\x20without\x20authority\x20(1-100\x20reserved\x20for\x20Wowok)','description':'proof_type='+WOWOK_WTS_PROOF_TYPE+'\x20is\x20WOWOK_WTS_PROOF_TYPE\x20(Will-To-Sign).\x20Values\x202-100\x20are\x20reserved\x20for\x20'+'future\x20Wowok-defined\x20proof\x20types.\x20User-defined\x20proof\x20types\x20must\x20use\x20values\x20>\x20100.\x20While\x20the\x20Move\x20contract\x20'+'does\x20not\x20currently\x20enforce\x20this\x20range\x20at\x20the\x20type\x20level\x20(it\x20accepts\x20any\x20u64),\x20using\x20a\x20reserved\x20value\x20without\x20'+'authority\x20creates\x20semantic\x20confusion:\x20consumers\x20may\x20misinterpret\x20the\x20proof\x27s\x20verification\x20rules.','affected_stakeholders':['creator','consumer','verifier'],'scenario':'User\x20creates\x20a\x20custom\x20proof\x20with\x20proof_type=5\x20(a\x20reserved\x20value)','mitigation':'Use\x20proof_type\x20>\x20100\x20for\x20user-defined\x20proof\x20types.\x20Use\x20proof_type=1\x20only\x20for\x20WTS\x20proofs\x20signed\x20by\x20an\x20'+'off-chain\x20server\x20(with\x20server_pubkey\x20+\x20server_signature).\x20Document\x20the\x20verification\x20rule\x20for\x20custom\x20types.','auto_fixable':![]},'check':a=>{if(a['proof_type']===undefined||a['proof_type']===null)return null;const b=typeof a['proof_type']==='string'?BigInt(a['proof_type']):BigInt(a['proof_type']);if(b===BigInt(WOWOK_WTS_PROOF_TYPE)||b>0x64n)return null;return{...R_PR_2_01['rule'],'evidence':'proof_type='+a['proof_type']+'\x20(reserved\x20range\x202-100)'};}},R_PR_2_02={'rule':{'id':'R-PROOF-05','level':'LOW','category':'semantic','title':'about_address\x20not\x20provided\x20—\x20consumers\x20cannot\x20locate\x20the\x20referenced\x20entity','description':'about_address\x20is\x20the\x20on-chain\x20address\x20of\x20the\x20entity\x20being\x20proved\x20(e.g.\x20a\x20user,\x20an\x20order,\x20a\x20Repository).\x20'+'When\x20null/undefined,\x20the\x20Proof\x20has\x20no\x20on-chain\x20binding\x20—\x20it\x20is\x20a\x20free-standing\x20cryptographic\x20statement.\x20'+'Consumers\x20(Repository,\x20Service,\x20etc.)\x20that\x20reference\x20this\x20Proof\x20cannot\x20automatically\x20resolve\x20which\x20entity\x20'+'it\x20applies\x20to.\x20This\x20is\x20acceptable\x20for\x20generic\x20proofs\x20but\x20problematic\x20for\x20entity-bound\x20attestations.','affected_stakeholders':['creator','consumer'],'scenario':'Caller\x20creates\x20a\x20Proof\x20without\x20about_address,\x20then\x20a\x20Repository\x20tries\x20to\x20bind\x20it\x20to\x20a\x20data\x20entry','mitigation':'Set\x20about_address\x20when\x20the\x20Proof\x20attests\x20to\x20a\x20specific\x20on-chain\x20entity.\x20Leave\x20it\x20null\x20only\x20for\x20'+'free-standing\x20cryptographic\x20statements\x20(e.g.\x20a\x20server\x27s\x20timestamp\x20attestation).','auto_fixable':!![]},'check':a=>{if(a['about_address'])return null;return{...R_PR_2_02['rule'],'evidence':'about_address=null/undefined'};}},R_PR_3_01={'rule':{'id':'R-PROOF-06','level':'LOW','category':'lifecycle','title':'description\x20missing\x20—\x20Proof\x20hard\x20to\x20identify\x20in\x20queries\x20and\x20audit\x20logs','description':'description\x20is\x20a\x20REQUIRED\x20field\x20(PF-D-2=A).\x20The\x20Move\x20contract\x20stores\x20it\x20as\x20a\x20String\x20field\x20and\x20SDK\x20'+'passes\x20it\x20to\x20create_wowok_proof_v2.\x20An\x20empty\x20description\x20(\x22\x22)\x20is\x20technically\x20valid\x20but\x20makes\x20the\x20Proof\x20'+'hard\x20to\x20identify\x20in\x20query\x20results\x20and\x20audit\x20logs.\x20Non-empty\x20descriptions\x20are\x20strongly\x20recommended.','affected_stakeholders':['creator','verifier'],'scenario':'Caller\x20passes\x20description=\x22\x22\x20to\x20save\x20typing','mitigation':'Provide\x20a\x20one-line\x20description\x20like\x20\x22KYC\x20attestation\x20for\x20user\x200xabc\x22\x20or\x20\x22merkle\x20root\x20for\x20batch\x20#42\x22.','auto_fixable':![]},'check':a=>{if(a['description']===undefined)return null;if(a['description']['length']>0x0)return null;return{...R_PR_3_01['rule'],'evidence':'description=\x22\x22\x20(empty)'};}},R_PR_3_02={'rule':{'id':'R-PROOF-07','level':'HIGH','category':'lifecycle','title':'Proof\x20is\x20immutable\x20—\x20cannot\x20modify\x20after\x20creation\x20(freeze_object)','description':'Proof\x20is\x20created\x20via\x20transfer::freeze_object(obj)\x20in\x20Move\x20(proof.move:65).\x20Once\x20frozen,\x20the\x20object\x20'+'cannot\x20be\x20modified,\x20transferred,\x20or\x20deleted.\x20All\x20fields\x20(proof,\x20server_pubkey,\x20server_signature,\x20'+'about,\x20proof_type,\x20signer,\x20time,\x20description,\x20item_count)\x20are\x20permanently\x20fixed\x20at\x20the\x20value\x20set\x20'+'during\x20create_wowok_proof_v2().\x20To\x20\x27update\x27\x20a\x20Proof,\x20create\x20a\x20new\x20one\x20and\x20update\x20references.','affected_stakeholders':['creator','consumer'],'scenario':'Caller\x20wants\x20to\x20update\x20server_signature\x20after\x20key\x20rotation\x20—\x20cannot,\x20must\x20create\x20new\x20Proof','mitigation':'Verify\x20all\x20fields\x20before\x20calling\x20create_wowok_proof_v2.\x20For\x20scenarios\x20requiring\x20key\x20rotation,\x20'+'create\x20a\x20new\x20Proof\x20and\x20update\x20the\x20referencing\x20object\x20(Repository\x20data,\x20Service\x20config,\x20etc.)\x20to\x20'+'point\x20to\x20the\x20new\x20Proof\x20address.','auto_fixable':![]},'check':a=>null},R_PR_4_01={'rule':{'id':'R-PROOF-08','level':'INFO','category':'knowledge','title':'Knowledge\x20layer\x20&\x20constant\x20sync\x20—\x20RESOLVED','description':'All\x204\x20Proof\x20constants\x20(WOWOK_WTS_PROOF_TYPE,\x20MAX_PROOF_SIZE,\x20MAX_SERVER_PUBKEY_SIZE,\x20'+'MAX_SERVER_SIGNATURE_SIZE)\x20are\x20now\x20synced\x20to\x20onchain-constants.ts\x20(P-PROOF-P2-5).\x20The\x20MCP\x20Knowledge\x20'+'layer\x20now\x20includes\x20proof-risk.ts,\x20proof-confirm.ts,\x20proof-translation.ts\x20(P-PROOF-P2-6).\x20'+'This\x20risk\x20rule\x20is\x20retained\x20for\x20historical\x20audit\x20and\x20to\x20detect\x20future\x20regressions.','affected_stakeholders':['system'],'scenario':'Future\x20regression:\x20someone\x20removes\x20a\x20Proof\x20constant\x20from\x20onchain-constants.ts','mitigation':'Run\x20the\x20onchain-constants\x20sync\x20test\x20to\x20detect\x20drift.','auto_fixable':![]},'check':a=>{if(a['constants_synced'])return null;return{...R_PR_4_01['rule'],'evidence':'constants_synced=false'};}};export const PROOF_RISK_RULES=[R_PR_1_01,R_PR_1_02,R_PR_1_03,R_PR_2_01,R_PR_2_02,R_PR_3_01,R_PR_3_02,R_PR_4_01];export function checkProofRisks(a){const b=[];for(const c of PROOF_RISK_RULES){const d=c['check'](a);if(d)b['push'](d);}return!b['find'](e=>e['id']==='R-PROOF-07')&&b['push'](R_PR_3_02['rule']),b;}
@@ -0,0 +1,11 @@
1
+ export declare function projectGuardPuzzle(puzzle: unknown): unknown;
2
+ export declare function projectMachinePuzzle(puzzle: unknown): unknown;
3
+ export declare function projectAllocationPuzzle(puzzle: unknown): unknown;
4
+ export declare function projectTreasuryPuzzle(puzzle: unknown): unknown;
5
+ export declare function projectServicePuzzle(puzzle: unknown): unknown;
6
+ export declare function projectPermissionPuzzle(puzzle: unknown): unknown;
7
+ export declare function projectRewardPuzzle(puzzle: unknown): unknown;
8
+ export declare function projectOrderPuzzle(puzzle: unknown): unknown;
9
+ export declare function projectProgressPuzzle(puzzle: unknown): unknown;
10
+ export declare function projectArbitrationPuzzle(puzzle: unknown): unknown;
11
+ export declare const PUZZLE_PROJECTIONS: Record<string, (puzzle: unknown) => unknown>;
@@ -0,0 +1 @@
1
+ import{findScene}from'./guard-ledger.js';function rec(a){return a!=null&&typeof a==='object'&&!Array['isArray'](a)?a:undefined;}function arr(a){return Array['isArray'](a)?a:undefined;}function str(a){return typeof a==='string'&&a['length']>0x0?a:undefined;}function num(a){return typeof a==='number'&&Number['isFinite'](a)?a:undefined;}function pairKey(a){const b=rec(a),c=rec(b?.['pair_id'])??b;return(str(c?.['prev_node'])??'')+'|'+(str(c?.['next_node'])??'');}const DIMENSION_KEYS=['intent','binding','data_source','data_sources','operations','logic','constraints','queries','current_round','node_design','business_flow','guard_acceptance','threshold_weight','branch_topology','permission_model','overall_objective','risk_assessment','config','funds','guard','workflow','named_operator','arbitration_config','arbiter_config','permission_allocator','guard_protection','dispute_handling'];function isDimensionPuzzle(a){return DIMENSION_KEYS['some'](b=>b in a);}function logicToSnapshot(a){const b=rec(a);if(!b)return undefined;const c={'type':b['node_type']};if(typeof b['references_identifier']==='number')c['identifier']=b['references_identifier'];const d=rec(b['query']);if(d){c['query']=d['query_id']??d['query_name']??'';const f=rec(d['witness']);if(f)c['convert_witness']=f['witness_type'];}if(b['context'])c['context']=b['context'];const e=arr(b['children']);return e&&e['length']>0x0&&(c['nodes']=e['map'](logicToSnapshot)),c;}export function projectGuardPuzzle(a){const b=rec(a)??{};if(!isDimensionPuzzle(b))return b;const d=rec(b['data_sources']),f=rec(b['logic']),g=rec(b['binding']);if(!d&&!f&&!g)return{};const h=[];for(const m of arr(d?.['on_chain_constants'])??[]){const n=rec(m);if(!n)continue;h['push']({'identifier':n['identifier'],'b_submission':![],'value_type':'Address','value':n['object_address'],'name':n['name'],'object_type':n['object_type']});}for(const o of arr(d?.['witness_derived'])??[]){const q=rec(o);if(!q)continue;h['push']({'identifier':q['identifier'],'b_submission':q['source_b_submission']===!![],'value_type':'Address','name':q['name']});}for(const r of arr(d?.['submitted_objects'])??[]){const t=rec(r);if(!t)continue;h['push']({'identifier':t['identifier'],'b_submission':!![],'value_type':t['value_type']??'Address','name':t['name'],'object_type':t['expected_object_type']});}for(const u of arr(d?.['submitted_values'])??[]){const v=rec(u);if(!v)continue;h['push']({'identifier':v['identifier'],'b_submission':!![],'value_type':v['value_type'],'name':v['name']});}const i={};if(h['length']>0x0)i['table']=h;const j=logicToSnapshot(f?.['root']);if(j){const x=(arr(d?.['system_contexts'])??[])['map'](y=>rec(y)?.['context_type'])['filter'](y=>typeof y==='string')['map'](y=>({'type':'context','context':y}));if(x['length']>0x0){if(Array['isArray'](j['nodes']))j['nodes']=[...j['nodes'],...x];else i['root']={'type':'logic_and','nodes':[j,...x]};}if(!i['root'])i['root']=j;}const k=rec(f?.['rely']);k&&Array['isArray'](k['guards'])&&(i['rely']={'guards':k['guards'],'logic_or':k['logic_or']===!![]});g&&str(g['host_object'])&&str(g['binding_field'])&&(i['scene']=findScene(String(g['host_object']),String(g['binding_field'])));const l=rec(b['intent']);if(l&&str(l['action']))i['operation_type']=l['action'];return i;}export function projectMachinePuzzle(a){const b=rec(a)??{};if(!isDimensionPuzzle(b))return b;const c=rec(b['node_design']),d=rec(b['threshold_weight']),e=rec(b['guard_acceptance']),f=rec(b['permission_model']),g=arr(c?.['nodes'])??[],h=arr(d?.['pair_thresholds'])??[];if(g['length']===0x0&&h['length']===0x0)return{};const i=g['map'](q=>{const r=rec(q)??{};return{'name':r['name'],'description':r['description']};}),j=arr(d?.['forward_weights'])??[],k=arr(e?.['guard_bindings'])??[],l=arr(f?.['forward_permissions'])??[],m=q=>j['map'](r=>rec(r))['filter'](r=>!!r&&pairKey(r['forward_id'])===q)['map'](r=>{const s=rec(r['forward_id']),u=pairKey(s),v=k['map'](A=>rec(A))['find'](A=>!!A&&pairKey(A['forward_id'])===u),w=l['map'](A=>rec(A))['find'](A=>!!A&&pairKey(A['forward'])===u),x=rec(w?.['namedOperator']),y={'name':rec(s)?.['forward_name'],'weight':r['weight']};if(x){if(x['type']==='role'&&str(x['role']))y['named_operator']=x['role'];else{if(x['type']==='order_holder')y['named_operator']='order_holder';}}const z=rec(w?.['permissionIndex']);if(z&&z['type']!=='none'&&num(z['index'])!==undefined)y['permission_index']=z['index'];if(v)y['guard']=v['guard_address']??v['guard_template_id'];return y;}),o=[];for(const q of g){const r=rec(q);r?.['is_entry']===!![]&&str(r['name'])&&o['push']({'prev_node':'','next_node':r['name'],'threshold':0x0,'forwards':[]});}for(const s of h){const u=rec(s);if(!u)continue;const v=pairKey(u['pair_id']),w=rec(u['pair_id'])??{};o['push']({'prev_node':w['prev_node'],'next_node':w['next_node'],'threshold':u['threshold'],'forwards':m(v)});}return{'nodes':i,'pairs':o};}export function projectAllocationPuzzle(a){const b=rec(a)??{};if(!isDimensionPuzzle(b))return b;const c=rec(b['data_source']),d=rec(b['intent']),e=rec(b['binding']);if(!c&&!d&&!e)return{};const f={};if(c?.['allocators_config']!=null)f['allocators_config']=c['allocators_config'];if(d&&str(d['host_context']))f['trigger_source']=d['host_context'];if(d&&str(d['action']))f['operation_type']=d['action'];if(e&&str(e['coin_type']))f['coin_type']=e['coin_type'];e&&str(e['host_service'])&&(f['host_service']=e['host_service'],f['host_service_published']=!![]);const g=rec(c?.['payment_info']);if(g){f['has_payment_info']=!![];if('for_object'in g)f['payment_info_for_object']=g['for_object']??null;}return f;}export function projectTreasuryPuzzle(a){const b=rec(a)??{};if(!isDimensionPuzzle(b))return b;const c=rec(b['data_source']),d=rec(b['binding']),e=arr(rec(b['operations'])?.['operations'])??[];if(!c&&!d&&e['length']===0x0)return{};const f={},g=str(d?.['associated_permission'])??str(c?.['permission_object']);if(g)f['permission_address']=g;if(d&&str(d['type_parameter']))f['type_parameter']=d['type_parameter'];if(d&&'associated_um'in d)f['um']=d['associated_um']??null;const h=arr(c?.['external_deposit_guards'])??[];if(h['length']>0x0)f['external_deposit_guard']={'op':'add','guards':h};const i=arr(c?.['external_withdraw_guards'])??[];if(i['length']>0x0)f['external_withdraw_guard']={'op':'add','guards':i};for(const j of e){const k=rec(j);if(!k)continue;switch(k['type']){case'deposit':{const l=rec(k['coin'])??{};f['deposit']={...l['balance']!=null?{'coin_balance':String(l['balance'])}:{},...l['coin_object']!=null?{'coin_object':l['coin_object']}:{},...k['via']==='external_guard'&&str(k['guard'])?{'by_external_deposit_guard':k['guard']}:{}};break;}case'withdraw':{const m=rec(k['amount'])??{};f['withdraw']={...m['fixed']!=null?{'amount_fixed':String(m['fixed'])}:{},...m['by_external_withdraw_guard']!=null?{'amount_by_external_withdraw_guard':String(m['by_external_withdraw_guard'])}:{},'recipient':k['recipient']};break;}case'receive':case'owner_receive':f['owner_receive']=k['received'];break;case'external_deposit_guard_op':f['external_deposit_guard']=guardOpCtx(k);break;case'external_withdraw_guard_op':f['external_withdraw_guard']=guardOpCtx(k);break;case'description_set':f['description']=k['description'];break;case'um_set':f['um']=k['um']??null;break;default:break;}}return f;}function guardOpCtx(a){if(a['op']==='clear')return{'op':'clear'};if(a['op']==='remove')return{'op':'remove','guards':(arr(a['guards'])??[])['map'](String)};return{'op':a['op']==='set'?'set':'add','guards':arr(a['guards'])??[]};}export function projectServicePuzzle(a){const b=rec(a)??{};if(!isDimensionPuzzle(b))return b;const c=rec(b['binding']),e=rec(b['intent']);if(!c&&!e)return{};const f={};if(c&&'machine'in c)f['machine']=c['machine']??null;if(c&&'buy_guard'in c)f['buy_guard']=c['buy_guard']??null;if(c&&'order_allocators'in c)f['order_allocators']=c['order_allocators']??null;if(c&&'um'in c)f['um']=c['um']??null;Array['isArray'](c?.['arbitrations'])&&c['arbitrations']['length']>0x0&&(f['arbitrations']={'op':'set','objects':c['arbitrations']});Array['isArray'](c?.['rewards'])&&c['rewards']['length']>0x0&&(f['rewards']={'op':'set','objects':c['rewards']});Array['isArray'](c?.['repositories'])&&c['repositories']['length']>0x0&&(f['repositories']={'op':'set','objects':c['repositories']});c?.['compensation_fund_balance']!=null&&(f['compensation_fund_add']={'balance':String(c['compensation_fund_balance'])});if(c?.['setting_lock_duration']!=null){const g=Number(c['setting_lock_duration']);if(Number['isFinite'](g))f['setting_lock_duration_add']=g;}if(e?.['action']==='publish')f['publish']=!![];if(e?.['action']==='pause')f['pause']=!![];return f;}export function projectPermissionPuzzle(a){const b=rec(a)??{};if(!isDimensionPuzzle(b))return b;const c=rec(b['binding']),d=rec(b['data_source']),e=arr(rec(b['operations'])?.['operations'])??[];if(!c&&!d&&e['length']===0x0)return{};const f={};Array['isArray'](c?.['admins'])&&c['admins']['length']>0x0&&(f['admin']={'op':'set','addresses':c['admins']});if(c&&'um'in c)f['um']=c['um']??null;for(const g of e){const h=rec(g);if(!h)continue;switch(h['type']){case'perm_add':case'perm_set':case'perm_remove':f['table']={'op':String(h['type'])['slice'](0x5)+'\x20perm\x20by\x20index','index':h['index'],'entity':arr(h['entities'])??[]};break;case'entity_add':case'entity_set':case'entity_remove':f['table']={'op':String(h['type'])['slice'](0x7)+'\x20perm\x20by\x20entity','entity':h['entity'],'index':arr(h['indexes'])??[]};break;case'entity_swap':case'entity_replace':case'entity_copy':f['entity']={'op':String(h['type'])['slice'](0x7),'entity1':h['entity1'],'entity2':h['entity2']};break;case'entity_del':f['entity']={'op':'del','entity':h['entity']};break;case'admin_add':case'admin_set':case'admin_remove':f['admin']={'op':String(h['type'])['slice'](0x6),'addresses':arr(h['addresses'])??[]};break;case'remark_set':f['remark']={'op':'set','index':h['index'],'remark':h['remark']};break;case'remark_remove':f['remark']={'op':'remove','index':h['index']};break;case'remark_clear':f['remark']={'op':'clear'};break;case'description_set':f['description']=h['description'];break;case'transfer':f['builder']=h['new_owner'];break;case'um_set':f['um']=h['um']??null;break;case'apply':f['apply']=arr(h['objects'])??[];break;default:break;}}return f;}export function projectRewardPuzzle(a){const b=rec(a)??{};if(!isDimensionPuzzle(b))return b;const c=rec(b['intent']),d=rec(b['config']),e=rec(b['guard']),f=rec(b['funds']);if(!c&&!d&&!e&&!f)return{};const g={};if(c?.['action']==='claim'&&str(c['target_reward']))g['claim']=c['target_reward'];if(e&&str(e['guard'])){const i=e['recipient_param'],j=e['recipient_type']==='GuardIdentifier'?{'GuardIdentifier':Number(i??0x0)}:e['recipient_type']==='Entity'?{'Entity':String(i??'')}:{'Signer':'signer'},k={'type':e['amount_type'],'value':e['amount_param']};g['guard_add']=[{'guard':e['guard'],'recipient':j,'amount':k,...e['expiration_time']!=null?{'expiration_time':e['expiration_time']}:{},...e['store_from_id']!=null?{'store_from_id':e['store_from_id']}:{}}];}f?.['coin_add_amount']!=null&&(g['coin_add']={'amount':String(f['coin_add_amount']),'coin_type':str(d?.['coin_type'])??''});const h=rec(f?.['receive_payment']);if(h&&str(h['token_type']))g['receive']={'token_type':h['token_type']};if(f?.['current_balance']!=null)g['current_balance']=String(f['current_balance']);if(d&&str(d['permission']))g['permission_address']=d['permission'];return(str(f?.['signer'])??str(rec(b['permission'])?.['signer']))&&(g['signer']=f?.['signer']??rec(b['permission'])?.['signer']),g;}export function projectOrderPuzzle(a){const b=rec(a)??{};if(!isDimensionPuzzle(b))return b;const c=rec(b['intent']),d=rec(b['binding']);if(!c&&!d)return{};const e={};if(c?.['action']==='buy')e['is_buy_operation']=!![];if(c?.['action']==='advance')e['operation']='progress_advance';if(Array['isArray'](d?.['items'])&&d['items']['length']>0x0)e['items']=d['items'];if(d&&str(d['machine_snapshot']))e['order_machine_snapshot']=d['machine_snapshot'];return Array['isArray'](d?.['agents'])&&d['agents']['length']>0x0&&(e['agent_set']={'agents':d['agents']}),e;}export function projectProgressPuzzle(a){const b=rec(a)??{};if(!isDimensionPuzzle(b))return b;const c=rec(b['intent']),d=rec(b['workflow']),e=rec(b['named_operator']),f=rec(b['task']);if(!c&&!d&&!e&&!f)return{};const g={};if(c&&str(c['target_progress']))g['object']=c['target_progress'];if(d&&str(d['machine']))g['current_machine']=d['machine'];d&&typeof d['machine_published']==='boolean'&&(g['machine_published']=d['machine_published']);if(d&&str(d['current_node']))g['current_node']=d['current_node'];e&&str(e['name'])&&(g['progress_namedOperator']={'op':e['op']??'add','name':e['name'],'operators':arr(e['addresses'])??[]});if(f&&str(f['task_address']))g['task']=f['task_address'];return g;}export function projectArbitrationPuzzle(a){const b=rec(a)??{};if(!isDimensionPuzzle(b))return b;const c=rec(b['arbitration_config']),d=rec(b['voting_guard']),e=rec(b['usage_guard']);if(!c&&!d&&!e)return{};const f={};if(c?.['description']!=null)f['description']=c['description'];if(c?.['location']!=null)f['location']=c['location'];if(c?.['fee']!=null)f['fee']=c['fee'];if(e&&'guard'in e)f['usage_guard']=e['guard']??null;const g=arr(d?.['guards'])??[];if(g['length']>0x0)f['voting_guard']={'op':'set','guards':g};return f;}export const PUZZLE_PROJECTIONS={'guard':projectGuardPuzzle,'machine':projectMachinePuzzle,'allocation':projectAllocationPuzzle,'treasury':projectTreasuryPuzzle,'service':projectServicePuzzle,'permission':projectPermissionPuzzle,'reward':projectRewardPuzzle,'order':projectOrderPuzzle,'progress':projectProgressPuzzle,'arbitration':projectArbitrationPuzzle};
@@ -31,4 +31,3 @@ export declare const REGISTRAR_RISK_RULES: {
31
31
  }[];
32
32
  export declare const REGISTRAR_RISK_VERSION = "1.0.0";
33
33
  export declare function checkRegistrarRisks(ctx: RegistrarRiskCheckContext): RegistrarRisk[];
34
- export declare function getRegistrarRiskById(id: string): RegistrarRisk | undefined;
@@ -1 +1 @@
1
- import{MAX_ADDRESS_COUNT,MAX_RECORD_COUNT_REGISTRAR,MAX_RECORD_LENGTH}from'@wowok/wowok';const BIT_NO_INFO=0x0,BIT_LIKE=0x2,BIT_DISLIKE=0x4,BIT_AFFILIATION=0x8,R_REG_01={'rule':{'id':'R-REG-01','level':'HIGH','category':'lifecycle','title':'Entity\x20and\x20Registrar\x20are\x20system\x20singletons\x20—\x20cannot\x20be\x20migrated\x20post-deploy','description':'Entity\x20and\x20Registrar\x20are\x20created\x20once\x20at\x20package\x20init\x20by\x20@0x0\x20(registrar.move:152-166)\x20'+'and\x20are\x20globally\x20unique.\x20They\x20cannot\x20be\x20re-created,\x20migrated,\x20or\x20re-initialized.\x20If\x20'+'the\x20singleton\x27s\x20storage\x20layout\x20needs\x20to\x20change\x20(e.g.\x20ParentTable\x20schema),\x20the\x20only\x20'+'option\x20is\x20a\x20new\x20package\x20version\x20with\x20a\x20migration\x20path.\x20There\x20is\x20no\x20in-place\x20migration\x20'+'API.\x20All\x2022\x20objects\x20depend\x20on\x20these\x20singletons\x20via\x20object-linker\x20bindings,\x20so\x20a\x20migration\x20would\x20'+'cascade\x20to\x20every\x20object.','affected_stakeholders':['system','user'],'scenario':'Operator\x20wants\x20to\x20migrate\x20Entity\x20to\x20a\x20new\x20schema;\x20no\x20migration\x20API\x20exists','mitigation':'Confirm\x20the\x20schema\x20before\x20deployment.\x20For\x20schema\x20evolution,\x20plan\x20a\x20new\x20package\x20'+'version\x20with\x20an\x20explicit\x20migration\x20script.\x20Never\x20assume\x20the\x20singleton\x20can\x20be\x20\x27reset\x27.','auto_fixable':![]},'check':a=>{if(!a['expects_singleton_migration'])return null;return{...R_REG_01['rule'],'evidence':'expects_singleton_migration=true\x20(no\x20migration\x20API)'};}},R_REG_02={'rule':{'id':'R-REG-02','level':'MEDIUM','category':'structural','title':'MAX_ADDRESS_COUNT='+MAX_ADDRESS_COUNT+'\x20may\x20be\x20insufficient\x20for\x20large\x20deployments','description':'The\x20Entity\x20and\x20Registrar\x20ParentTables\x20are\x20bounded\x20by\x20MAX_ADDRESS_COUNT='+MAX_ADDRESS_COUNT+'\x20'+'(registrar.move).\x20Exceeding\x20the\x20cap\x20aborts\x20address\x20registration.\x20For\x20mass-market\x20'+('applications,\x20'+MAX_ADDRESS_COUNT+'\x20entries\x20may\x20be\x20too\x20few;\x20the\x20limit\x20is\x20a\x20single\x20')+'Move\x20constant\x20that\x20requires\x20a\x20package\x20upgrade\x20to\x20change.','affected_stakeholders':['system','user'],'scenario':'Popular\x20service\x20reaches\x205200\x20registered\x20users;\x20new\x20registrations\x20abort','mitigation':'Monitor\x20address_count.\x20Plan\x20a\x20package\x20upgrade\x20that\x20raises\x20MAX_ADDRESS_COUNT\x20before\x20'+'hitting\x20the\x20cap.\x20For\x20shardable\x20workloads,\x20consider\x20multiple\x20Entity\x20tables\x20in\x20a\x20future\x20'+'package\x20version.','auto_fixable':![]},'check':a=>{if(a['address_count']===undefined)return null;if(a['address_count']<MAX_ADDRESS_COUNT)return null;return{...R_REG_02['rule'],'evidence':'address_count='+a['address_count']+',\x20limit='+MAX_ADDRESS_COUNT};}},R_REG_03={'rule':{'id':'R-REG-03','level':'MEDIUM','category':'semantic','title':'Vote.info\x20uses\x20u8\x20bitmask\x20—\x20bits\x204-7\x20reserved,\x20future\x20expansion\x20must\x20stay\x20compatible','description':'Vote.info\x20is\x20a\x20u8\x20bitmask:\x20BIT_NO_INFO='+BIT_NO_INFO+',\x20BIT_LIKE='+BIT_LIKE+',\x20'+('BIT_DISLIKE='+BIT_DISLIKE+',\x20BIT_AFFILIATION='+BIT_AFFILIATION+'.\x20Bits\x204-7\x20are\x20reserved.\x20')+'A\x20future\x20version\x20that\x20repurposes\x20bits\x204-7\x20would\x20conflict\x20with\x20any\x20off-chain\x20code\x20that\x20'+'reads\x20the\x20raw\x20byte.\x20The\x20reserved\x20bits\x20MUST\x20be\x20treated\x20as\x20zero\x20today;\x20non-zero\x20values\x20'+'in\x20bits\x204-7\x20indicate\x20a\x20forward-incompatible\x20voter.','affected_stakeholders':['voter','system'],'scenario':'Future\x20version\x20assigns\x20bit\x204\x20to\x20a\x20new\x20flag;\x20old\x20indexers\x20misread\x20the\x20byte','mitigation':'Off-chain\x20code\x20must\x20mask\x20to\x20bits\x200-3\x20today\x20and\x20ignore\x20bits\x204-7.\x20When\x20a\x20new\x20flag\x20is\x20'+'assigned,\x20ship\x20a\x20coordinated\x20Move\x20+\x20SDK\x20+\x20indexer\x20update.','auto_fixable':![]},'check':a=>{if(!a['uses_reserved_vote_bits'])return null;return{...R_REG_03['rule'],'evidence':'uses_reserved_vote_bits=true\x20(bits\x204-7\x20are\x20reserved)'};}},R_REG_05={'rule':{'id':'R-REG-05','level':'MEDIUM','category':'cross_object','title':'object-linker\x20affiliation\x20/\x20disaffiliation\x20emit\x20no\x20events\x20—\x20indexers\x20must\x20poll\x20object_linker\x20tables','description':'object_linker::affiliation_core/tx,\x20disaffiliation,\x20and\x20affiliation_change\x20(object_linker.move)\x20mutate\x20the\x20'+'binding\x20graph\x20but\x20emit\x20no\x20events.\x20External\x20indexers\x20that\x20track\x20the\x20'+'object-dependency\x20graph\x20cannot\x20rely\x20on\x20an\x20event\x20stream;\x20they\x20must\x20poll\x20the\x20'+'ParentTable,\x20which\x20is\x20expensive\x20as\x20the\x20graph\x20grows.','affected_stakeholders':['system'],'scenario':'Indexer\x20expects\x20an\x20AffiliationEvent;\x20none\x20is\x20emitted,\x20dependency\x20graph\x20is\x20stale','mitigation':'Indexers\x20should\x20poll\x20object_linker\x20tables\x20on\x20a\x20cadence\x20and\x20diff.\x20Future\x20versions\x20may\x20add\x20'+'AffiliationEvent;\x20until\x20then,\x20do\x20not\x20build\x20critical\x20UX\x20on\x20affiliation\x20event\x20streams.','auto_fixable':![]},'check':a=>{if(!a['expects_affiliation_event'])return null;return{...R_REG_05['rule'],'evidence':'expects_affiliation_event=true\x20(no\x20events)'};}},R_REG_04={'rule':{'id':'R-REG-04','level':'LOW','category':'lifecycle','title':'entity_register\x20is\x20idempotent\x20—\x20returns\x20existing\x20Resource,\x20not\x20a\x20fresh\x20one','description':'entity_register\x20(registrar.move:177-187)\x20checks\x20whether\x20the\x20sender\x20already\x20has\x20an\x20'+'Entity\x20record.\x20If\x20so,\x20it\x20returns\x20the\x20existing\x20Resource\x20address\x20without\x20creating\x20a\x20new\x20'+'one.\x20Callers\x20who\x20expect\x20a\x20fresh\x20Resource\x20on\x20each\x20call\x20(e.g.\x20after\x20a\x20forced\x20destroy)\x20'+'will\x20silently\x20receive\x20the\x20old\x20one.\x20Use\x20entity_register_with_resource_forced\x20to\x20'+'force-reallocate,\x20and\x20only\x20when\x20the\x20old\x20Resource\x20is\x20truly\x20gone.','affected_stakeholders':['user'],'scenario':'User\x20destroys\x20their\x20Resource\x20then\x20calls\x20entity_register;\x20gets\x20the\x20old\x20(now-invalid)\x20address','mitigation':'Document\x20the\x20idempotent\x20behavior.\x20After\x20a\x20forced\x20destroy,\x20callers\x20MUST\x20use\x20'+'entity_register_with_resource_forced.\x20SDK\x20should\x20detect\x20destroyed\x20Resource\x20and\x20route\x20'+'accordingly.','auto_fixable':![]},'check':a=>{if(!a['expects_fresh_resource_on_register'])return null;return{...R_REG_04['rule'],'evidence':'expects_fresh_resource_on_register=true\x20(idempotent)'};}},R_REG_06={'rule':{'id':'R-REG-06','level':'LOW','category':'semantic','title':'Record.typed_value\x20first\x20byte\x20is\x20a\x20ValueType\x20—\x20convention\x20enforced\x20only\x20by\x20docs','description':'Record.typed_value\x20is\x20a\x20vector<u8>\x20whose\x20first\x20byte\x20encodes\x20the\x20ValueType\x20(registrar.move:111).\x20'+'The\x20Move\x20layer\x20validates\x20that\x20the\x20vector\x20is\x20non-empty\x20and\x20within\x20MAX_RECORD_LENGTH='+(MAX_RECORD_LENGTH+',\x20but\x20it\x20does\x20not\x20validate\x20that\x20the\x20first\x20byte\x20is\x20a\x20known\x20ValueType.\x20')+'Off-chain\x20consumers\x20must\x20agree\x20on\x20the\x20ValueType\x20byte\x20layout;\x20a\x20misencoded\x20record\x20will\x20'+'deserialize\x20to\x20garbage\x20without\x20an\x20on-chain\x20abort.\x20Record\x20count\x20is\x20bounded\x20by\x20'+('MAX_RECORD_COUNT_REGISTRAR='+MAX_RECORD_COUNT_REGISTRAR+'.'),'affected_stakeholders':['user','system'],'scenario':'Caller\x20writes\x20a\x20record\x20with\x20first\x20byte\x200xFF;\x20no\x20on-chain\x20error,\x20but\x20consumers\x20cannot\x20decode','mitigation':'SDK\x20must\x20validate\x20the\x20first\x20byte\x20against\x20the\x20ValueType\x20enum\x20before\x20submitting.\x20'+'Document\x20the\x20ValueType\x20byte\x20layout\x20in\x20both\x20Move\x20and\x20SDK.\x20Add\x20a\x20sync\x20test\x20that\x20'+'asserts\x20the\x20ValueType\x20enum\x20matches\x20across\x20layers.','related_move_error':'ERecordTypeEmpty\x20(3)\x20—\x20only\x20catches\x20empty\x20typed_value','auto_fixable':![]},'check':a=>{if(!a['relies_on_typed_value_convention'])return null;return{...R_REG_06['rule'],'evidence':'relies_on_typed_value_convention=true\x20(docs-only\x20enforcement)'};}},R_REG_07={'rule':{'id':'R-REG-07','level':'MEDIUM','category':'cross_object','title':'entity_resource_transfer\x20detaches\x20Resource\x20from\x20the\x20source\x20address','description':'entity_resource_transfer(resource,\x20new_address,\x20ctx)\x20moves\x20the\x20Resource\x20backing\x20a\x20'+'user\x27s\x20identity\x20mark\x20to\x20a\x20new\x20address.\x20After\x20transfer,\x20the\x20source\x20address\x20has\x20no\x20'+'Resource\x20—\x20any\x20downstream\x20service\x20that\x20keyed\x20identity\x20on\x20the\x20source\x20address\x20loses\x20'+'the\x20binding.\x20There\x20is\x20no\x20automatic\x20forwarding\x20stub\x20left\x20behind.','affected_stakeholders':['user','system'],'scenario':'User\x20transfers\x20Resource\x20to\x20a\x20new\x20wallet;\x20old-wallet-based\x20services\x20break','mitigation':'Surface\x20a\x20\x27transfer\x20will\x20detach\x20the\x20Resource\x20from\x20this\x20address\x27\x20warning.\x20Consumers\x20'+'should\x20track\x20users\x20by\x20Resource\x20address,\x20not\x20by\x20user\x20address.\x20Provide\x20a\x20migration\x20'+'window\x20where\x20both\x20addresses\x20are\x20valid.','auto_fixable':![]},'check':a=>{if(!a['is_resource_transfer'])return null;return{...R_REG_07['rule'],'evidence':'is_resource_transfer=true\x20(source\x20loses\x20Resource)'};}},R_REG_08={'rule':{'id':'R-REG-08','level':'LOW','category':'semantic','title':'Vote.time\x20updates\x20on\x20every\x20toggle\x20—\x20including\x20like→no-like','description':'Vote.time\x20(registrar.move)\x20is\x20set\x20to\x20clock.timestamp_ms()\x20on\x20every\x20like/dislike\x20'+'operation,\x20including\x20toggles\x20that\x20remove\x20a\x20like\x20(like→no-like).\x20Consumers\x20who\x20'+'interpret\x20Vote.time\x20as\x20\x27last\x20liked\x20at\x27\x20will\x20be\x20confused\x20when\x20it\x20advances\x20on\x20an\x20'+'un-like.\x20The\x20field\x20semantically\x20means\x20\x27last\x20vote\x20op\x20time\x27,\x20not\x20\x27last\x20positive\x20vote\x27.','affected_stakeholders':['voter','system'],'scenario':'User\x20un-likes;\x20Vote.time\x20advances;\x20indexer\x20reads\x20it\x20as\x20\x27recently\x20liked\x27','mitigation':'Document\x20Vote.time\x20as\x20\x27last\x20vote\x20operation\x20time\x27.\x20For\x20\x27last\x20liked\x20at\x27\x20semantics,\x20'+'track\x20the\x20previous\x20Vote.info\x20state\x20and\x20only\x20record\x20time\x20when\x20BIT_LIKE\x20transitions\x20to\x20set.','auto_fixable':![]},'check':a=>{if(!a['expects_vote_time_only_on_like'])return null;return{...R_REG_08['rule'],'evidence':'expects_vote_time_only_on_like=true\x20(updates\x20on\x20toggle)'};}};export const REGISTRAR_RISK_RULES=[R_REG_01,R_REG_02,R_REG_03,R_REG_04,R_REG_05,R_REG_06,R_REG_07,R_REG_08];export const REGISTRAR_RISK_VERSION='1.0.0';export function checkRegistrarRisks(a){const b=[];for(const c of REGISTRAR_RISK_RULES){const d=c['check'](a);if(d)b['push'](d);}return b;}export function getRegistrarRiskById(a){return REGISTRAR_RISK_RULES['find'](b=>b['rule']['id']===a)?.['rule'];}
1
+ import{MAX_ADDRESS_COUNT,MAX_RECORD_COUNT_REGISTRAR,MAX_RECORD_LENGTH}from'@wowok/wowok';const BIT_NO_INFO=0x0,BIT_LIKE=0x2,BIT_DISLIKE=0x4,BIT_AFFILIATION=0x8,R_REG_01={'rule':{'id':'R-REG-01','level':'HIGH','category':'lifecycle','title':'Entity\x20and\x20Registrar\x20are\x20system\x20singletons\x20—\x20cannot\x20be\x20migrated\x20post-deploy','description':'Entity\x20and\x20Registrar\x20are\x20created\x20once\x20at\x20package\x20init\x20by\x20@0x0\x20(registrar.move:152-166)\x20'+'and\x20are\x20globally\x20unique.\x20They\x20cannot\x20be\x20re-created,\x20migrated,\x20or\x20re-initialized.\x20If\x20'+'the\x20singleton\x27s\x20storage\x20layout\x20needs\x20to\x20change\x20(e.g.\x20ParentTable\x20schema),\x20the\x20only\x20'+'option\x20is\x20a\x20new\x20package\x20version\x20with\x20a\x20migration\x20path.\x20There\x20is\x20no\x20in-place\x20migration\x20'+'API.\x20All\x2022\x20objects\x20depend\x20on\x20these\x20singletons\x20via\x20object-linker\x20bindings,\x20so\x20a\x20migration\x20would\x20'+'cascade\x20to\x20every\x20object.','affected_stakeholders':['system','user'],'scenario':'Operator\x20wants\x20to\x20migrate\x20Entity\x20to\x20a\x20new\x20schema;\x20no\x20migration\x20API\x20exists','mitigation':'Confirm\x20the\x20schema\x20before\x20deployment.\x20For\x20schema\x20evolution,\x20plan\x20a\x20new\x20package\x20'+'version\x20with\x20an\x20explicit\x20migration\x20script.\x20Never\x20assume\x20the\x20singleton\x20can\x20be\x20\x27reset\x27.','auto_fixable':![]},'check':a=>{if(!a['expects_singleton_migration'])return null;return{...R_REG_01['rule'],'evidence':'expects_singleton_migration=true\x20(no\x20migration\x20API)'};}},R_REG_02={'rule':{'id':'R-REG-02','level':'MEDIUM','category':'structural','title':'MAX_ADDRESS_COUNT='+MAX_ADDRESS_COUNT+'\x20may\x20be\x20insufficient\x20for\x20large\x20deployments','description':'The\x20Entity\x20and\x20Registrar\x20ParentTables\x20are\x20bounded\x20by\x20MAX_ADDRESS_COUNT='+MAX_ADDRESS_COUNT+'\x20'+'(registrar.move).\x20Exceeding\x20the\x20cap\x20aborts\x20address\x20registration.\x20For\x20mass-market\x20'+('applications,\x20'+MAX_ADDRESS_COUNT+'\x20entries\x20may\x20be\x20too\x20few;\x20the\x20limit\x20is\x20a\x20single\x20')+'Move\x20constant\x20that\x20requires\x20a\x20package\x20upgrade\x20to\x20change.','affected_stakeholders':['system','user'],'scenario':'Popular\x20service\x20reaches\x205200\x20registered\x20users;\x20new\x20registrations\x20abort','mitigation':'Monitor\x20address_count.\x20Plan\x20a\x20package\x20upgrade\x20that\x20raises\x20MAX_ADDRESS_COUNT\x20before\x20'+'hitting\x20the\x20cap.\x20For\x20shardable\x20workloads,\x20consider\x20multiple\x20Entity\x20tables\x20in\x20a\x20future\x20'+'package\x20version.','auto_fixable':![]},'check':a=>{if(a['address_count']===undefined)return null;if(a['address_count']<MAX_ADDRESS_COUNT)return null;return{...R_REG_02['rule'],'evidence':'address_count='+a['address_count']+',\x20limit='+MAX_ADDRESS_COUNT};}},R_REG_03={'rule':{'id':'R-REG-03','level':'MEDIUM','category':'semantic','title':'Vote.info\x20uses\x20u8\x20bitmask\x20—\x20bits\x204-7\x20reserved,\x20future\x20expansion\x20must\x20stay\x20compatible','description':'Vote.info\x20is\x20a\x20u8\x20bitmask:\x20BIT_NO_INFO='+BIT_NO_INFO+',\x20BIT_LIKE='+BIT_LIKE+',\x20'+('BIT_DISLIKE='+BIT_DISLIKE+',\x20BIT_AFFILIATION='+BIT_AFFILIATION+'.\x20Bits\x204-7\x20are\x20reserved.\x20')+'A\x20future\x20version\x20that\x20repurposes\x20bits\x204-7\x20would\x20conflict\x20with\x20any\x20off-chain\x20code\x20that\x20'+'reads\x20the\x20raw\x20byte.\x20The\x20reserved\x20bits\x20MUST\x20be\x20treated\x20as\x20zero\x20today;\x20non-zero\x20values\x20'+'in\x20bits\x204-7\x20indicate\x20a\x20forward-incompatible\x20voter.','affected_stakeholders':['voter','system'],'scenario':'Future\x20version\x20assigns\x20bit\x204\x20to\x20a\x20new\x20flag;\x20old\x20indexers\x20misread\x20the\x20byte','mitigation':'Off-chain\x20code\x20must\x20mask\x20to\x20bits\x200-3\x20today\x20and\x20ignore\x20bits\x204-7.\x20When\x20a\x20new\x20flag\x20is\x20'+'assigned,\x20ship\x20a\x20coordinated\x20Move\x20+\x20SDK\x20+\x20indexer\x20update.','auto_fixable':![]},'check':a=>{if(!a['uses_reserved_vote_bits'])return null;return{...R_REG_03['rule'],'evidence':'uses_reserved_vote_bits=true\x20(bits\x204-7\x20are\x20reserved)'};}},R_REG_05={'rule':{'id':'R-REG-05','level':'MEDIUM','category':'cross_object','title':'object-linker\x20affiliation\x20/\x20disaffiliation\x20emit\x20no\x20events\x20—\x20indexers\x20must\x20poll\x20object_linker\x20tables','description':'object_linker::affiliation_core/tx,\x20disaffiliation,\x20and\x20affiliation_change\x20(object_linker.move)\x20mutate\x20the\x20'+'binding\x20graph\x20but\x20emit\x20no\x20events.\x20External\x20indexers\x20that\x20track\x20the\x20'+'object-dependency\x20graph\x20cannot\x20rely\x20on\x20an\x20event\x20stream;\x20they\x20must\x20poll\x20the\x20'+'ParentTable,\x20which\x20is\x20expensive\x20as\x20the\x20graph\x20grows.','affected_stakeholders':['system'],'scenario':'Indexer\x20expects\x20an\x20AffiliationEvent;\x20none\x20is\x20emitted,\x20dependency\x20graph\x20is\x20stale','mitigation':'Indexers\x20should\x20poll\x20object_linker\x20tables\x20on\x20a\x20cadence\x20and\x20diff.\x20Future\x20versions\x20may\x20add\x20'+'AffiliationEvent;\x20until\x20then,\x20do\x20not\x20build\x20critical\x20UX\x20on\x20affiliation\x20event\x20streams.','auto_fixable':![]},'check':a=>{if(!a['expects_affiliation_event'])return null;return{...R_REG_05['rule'],'evidence':'expects_affiliation_event=true\x20(no\x20events)'};}},R_REG_04={'rule':{'id':'R-REG-04','level':'LOW','category':'lifecycle','title':'entity_register\x20is\x20idempotent\x20—\x20returns\x20existing\x20Resource,\x20not\x20a\x20fresh\x20one','description':'entity_register\x20(registrar.move:177-187)\x20checks\x20whether\x20the\x20sender\x20already\x20has\x20an\x20'+'Entity\x20record.\x20If\x20so,\x20it\x20returns\x20the\x20existing\x20Resource\x20address\x20without\x20creating\x20a\x20new\x20'+'one.\x20Callers\x20who\x20expect\x20a\x20fresh\x20Resource\x20on\x20each\x20call\x20(e.g.\x20after\x20a\x20forced\x20destroy)\x20'+'will\x20silently\x20receive\x20the\x20old\x20one.\x20Use\x20entity_register_with_resource_forced\x20to\x20'+'force-reallocate,\x20and\x20only\x20when\x20the\x20old\x20Resource\x20is\x20truly\x20gone.','affected_stakeholders':['user'],'scenario':'User\x20destroys\x20their\x20Resource\x20then\x20calls\x20entity_register;\x20gets\x20the\x20old\x20(now-invalid)\x20address','mitigation':'Document\x20the\x20idempotent\x20behavior.\x20After\x20a\x20forced\x20destroy,\x20callers\x20MUST\x20use\x20'+'entity_register_with_resource_forced.\x20SDK\x20should\x20detect\x20destroyed\x20Resource\x20and\x20route\x20'+'accordingly.','auto_fixable':![]},'check':a=>{if(!a['expects_fresh_resource_on_register'])return null;return{...R_REG_04['rule'],'evidence':'expects_fresh_resource_on_register=true\x20(idempotent)'};}},R_REG_06={'rule':{'id':'R-REG-06','level':'LOW','category':'semantic','title':'Record.typed_value\x20first\x20byte\x20is\x20a\x20ValueType\x20—\x20convention\x20enforced\x20only\x20by\x20docs','description':'Record.typed_value\x20is\x20a\x20vector<u8>\x20whose\x20first\x20byte\x20encodes\x20the\x20ValueType\x20(registrar.move:111).\x20'+'The\x20Move\x20layer\x20validates\x20that\x20the\x20vector\x20is\x20non-empty\x20and\x20within\x20MAX_RECORD_LENGTH='+(MAX_RECORD_LENGTH+',\x20but\x20it\x20does\x20not\x20validate\x20that\x20the\x20first\x20byte\x20is\x20a\x20known\x20ValueType.\x20')+'Off-chain\x20consumers\x20must\x20agree\x20on\x20the\x20ValueType\x20byte\x20layout;\x20a\x20misencoded\x20record\x20will\x20'+'deserialize\x20to\x20garbage\x20without\x20an\x20on-chain\x20abort.\x20Record\x20count\x20is\x20bounded\x20by\x20'+('MAX_RECORD_COUNT_REGISTRAR='+MAX_RECORD_COUNT_REGISTRAR+'.'),'affected_stakeholders':['user','system'],'scenario':'Caller\x20writes\x20a\x20record\x20with\x20first\x20byte\x200xFF;\x20no\x20on-chain\x20error,\x20but\x20consumers\x20cannot\x20decode','mitigation':'SDK\x20must\x20validate\x20the\x20first\x20byte\x20against\x20the\x20ValueType\x20enum\x20before\x20submitting.\x20'+'Document\x20the\x20ValueType\x20byte\x20layout\x20in\x20both\x20Move\x20and\x20SDK.\x20Add\x20a\x20sync\x20test\x20that\x20'+'asserts\x20the\x20ValueType\x20enum\x20matches\x20across\x20layers.','related_move_error':'ERecordTypeEmpty\x20(3)\x20—\x20only\x20catches\x20empty\x20typed_value','auto_fixable':![]},'check':a=>{if(!a['relies_on_typed_value_convention'])return null;return{...R_REG_06['rule'],'evidence':'relies_on_typed_value_convention=true\x20(docs-only\x20enforcement)'};}},R_REG_07={'rule':{'id':'R-REG-07','level':'MEDIUM','category':'cross_object','title':'entity_resource_transfer\x20detaches\x20Resource\x20from\x20the\x20source\x20address','description':'entity_resource_transfer(resource,\x20new_address,\x20ctx)\x20moves\x20the\x20Resource\x20backing\x20a\x20'+'user\x27s\x20identity\x20mark\x20to\x20a\x20new\x20address.\x20After\x20transfer,\x20the\x20source\x20address\x20has\x20no\x20'+'Resource\x20—\x20any\x20downstream\x20service\x20that\x20keyed\x20identity\x20on\x20the\x20source\x20address\x20loses\x20'+'the\x20binding.\x20There\x20is\x20no\x20automatic\x20forwarding\x20stub\x20left\x20behind.','affected_stakeholders':['user','system'],'scenario':'User\x20transfers\x20Resource\x20to\x20a\x20new\x20wallet;\x20old-wallet-based\x20services\x20break','mitigation':'Surface\x20a\x20\x27transfer\x20will\x20detach\x20the\x20Resource\x20from\x20this\x20address\x27\x20warning.\x20Consumers\x20'+'should\x20track\x20users\x20by\x20Resource\x20address,\x20not\x20by\x20user\x20address.\x20Provide\x20a\x20migration\x20'+'window\x20where\x20both\x20addresses\x20are\x20valid.','auto_fixable':![]},'check':a=>{if(!a['is_resource_transfer'])return null;return{...R_REG_07['rule'],'evidence':'is_resource_transfer=true\x20(source\x20loses\x20Resource)'};}},R_REG_08={'rule':{'id':'R-REG-08','level':'LOW','category':'semantic','title':'Vote.time\x20updates\x20on\x20every\x20toggle\x20—\x20including\x20like→no-like','description':'Vote.time\x20(registrar.move)\x20is\x20set\x20to\x20clock.timestamp_ms()\x20on\x20every\x20like/dislike\x20'+'operation,\x20including\x20toggles\x20that\x20remove\x20a\x20like\x20(like→no-like).\x20Consumers\x20who\x20'+'interpret\x20Vote.time\x20as\x20\x27last\x20liked\x20at\x27\x20will\x20be\x20confused\x20when\x20it\x20advances\x20on\x20an\x20'+'un-like.\x20The\x20field\x20semantically\x20means\x20\x27last\x20vote\x20op\x20time\x27,\x20not\x20\x27last\x20positive\x20vote\x27.','affected_stakeholders':['voter','system'],'scenario':'User\x20un-likes;\x20Vote.time\x20advances;\x20indexer\x20reads\x20it\x20as\x20\x27recently\x20liked\x27','mitigation':'Document\x20Vote.time\x20as\x20\x27last\x20vote\x20operation\x20time\x27.\x20For\x20\x27last\x20liked\x20at\x27\x20semantics,\x20'+'track\x20the\x20previous\x20Vote.info\x20state\x20and\x20only\x20record\x20time\x20when\x20BIT_LIKE\x20transitions\x20to\x20set.','auto_fixable':![]},'check':a=>{if(!a['expects_vote_time_only_on_like'])return null;return{...R_REG_08['rule'],'evidence':'expects_vote_time_only_on_like=true\x20(updates\x20on\x20toggle)'};}};export const REGISTRAR_RISK_RULES=[R_REG_01,R_REG_02,R_REG_03,R_REG_04,R_REG_05,R_REG_06,R_REG_07,R_REG_08];export const REGISTRAR_RISK_VERSION='1.0.0';export function checkRegistrarRisks(a){const b=[];for(const c of REGISTRAR_RISK_RULES){const d=c['check'](a);if(d)b['push'](d);}return b;}
@@ -42,5 +42,4 @@ export declare const REPOSITORY_RISK_RULES: {
42
42
  check: (ctx: RepositoryRiskCheckContext & RepositoryQuoteGuardContext) => RepositoryRisk | null;
43
43
  }[];
44
44
  export declare function checkRepositoryRisks(ctx: RepositoryRiskCheckContext & RepositoryQuoteGuardContext): RepositoryRisk[];
45
- export declare function getRepositoryRiskById(id: string): RepositoryRisk | undefined;
46
45
  export { normalizeIdFrom as parseIdFromForRiskCheck };
@@ -1 +1 @@
1
- import{MAX_POLICY_COUNT,MAX_POLICY_GUARD_COUNT,MAX_DATA_SIZE,MAX_ID_COUNT_ONCE,MAX_REWARD_COUNT}from'@wowok/wowok';function normalizeIdFrom(a){if(typeof a==='number')return a;const b=String(a)['toLowerCase']();if(b==='none')return 0x0;if(b==='clock')return 0x1;if(b==='signer')return 0x2;const c=Number(a);return Number['isNaN'](c)?-0x1:c;}const R_REP_1_01={'rule':{'id':'R-REP-01','level':'MEDIUM','category':'structural','title':'Policy\x20count\x20exceeds\x20MAX_POLICY_COUNT\x20('+MAX_POLICY_COUNT+')','description':'A\x20single\x20Repository\x20may\x20hold\x20up\x20to\x20MAX_POLICY_COUNT='+MAX_POLICY_COUNT+'\x20policies\x20(Move\x20source:\x20repository.move:22).\x20'+'Exceeding\x20this\x20limit\x20aborts\x20with\x20E_POLICY_COUNT_EXCEEDED\x20(3)\x20in\x20policy_add_imp().\x20Each\x20policy\x20defines\x20a\x20named\x20'+'data\x20slot\x20with\x20its\x20own\x20write_guard\x20list\x20and\x20id_from\x20routing\x20—\x20having\x20too\x20many\x20policies\x20makes\x20the\x20Repository\x20'+'hard\x20to\x20audit\x20and\x20increases\x20gas\x20cost\x20for\x20policy\x20lookups\x20(O(n)\x20scan\x20in\x20policy_by_name).','affected_stakeholders':['creator'],'scenario':'Caller\x20adds\x2051\x20policies\x20to\x20a\x20single\x20Repository','mitigation':'Consolidate\x20related\x20data\x20under\x20fewer\x20policies.\x20If\x20truly\x20needed,\x20split\x20data\x20across\x20multiple\x20Repository\x20'+'objects\x20and\x20reference\x20them\x20via\x20Service.repository\x20or\x20Progress.context_repositories.','related_move_error':'E_POLICY_COUNT_EXCEEDED\x20(3)','auto_fixable':![]},'check':a=>{if(!a['policies']||a['existing_policy_count']===undefined)return null;const b=a['existing_policy_count']+a['policies']['length'];if(b<=MAX_POLICY_COUNT)return null;return{...R_REP_1_01['rule'],'evidence':'existing='+a['existing_policy_count']+',\x20adding='+a['policies']['length']+',\x20total='+b+',\x20limit='+MAX_POLICY_COUNT};}},R_REP_2_01={'rule':{'id':'R-REP-02','level':'HIGH','category':'policy','title':'write_guard\x20empty\x20when\x20id_from=None\x20—\x20unauthorized\x20writes\x20(R-D-1\x20Move\x20assert)','description':'When\x20id_from\x20is\x20None,\x20the\x20data\x20ID\x20must\x20be\x20provided\x20by\x20the\x20caller\x20(via\x20id_data_with_passport\x20or\x20'+'id_data_mixed_with_passport).\x20Without\x20a\x20write_guard,\x20ANY\x20address\x20can\x20write\x20data\x20with\x20any\x20ID\x20—\x20this\x20'+'is\x20almost\x20certainly\x20a\x20misconfiguration.\x20The\x20Move\x20contract\x20now\x20enforces\x20this\x20via\x20'+'E_POLICY_WRITE_GUARD_REQUIRED\x20(22)\x20in\x20policy_add_imp()\x20[R-D-1=A].','affected_stakeholders':['creator','writer'],'scenario':'Caller\x20creates\x20a\x20policy\x20with\x20id_from=None\x20and\x20empty\x20write_guard\x20list','mitigation':'When\x20id_from=None,\x20provide\x20at\x20least\x20one\x20PolicyGuard\x20entry\x20in\x20write_guard.\x20If\x20you\x20want\x20unrestricted\x20'+'writes,\x20use\x20id_from=Clock\x20or\x20id_from=Signer\x20instead\x20(which\x20auto-generates\x20the\x20ID\x20and\x20requires\x20empty\x20write_guard).','related_move_error':'E_POLICY_WRITE_GUARD_REQUIRED\x20(22)','auto_fixable':![]},'check':a=>{if(!a['policies'])return null;const b=a['policies']['filter'](c=>normalizeIdFrom(c['id_from'])===0x0&&c['write_guard_count']===0x0);if(b['length']===0x0)return null;return{...R_REP_2_01['rule'],'evidence':'policies\x20with\x20id_from=None\x20+\x20empty\x20write_guard:\x20'+b['map'](c=>c['name'])['join'](',\x20')};}},R_REP_2_02={'rule':{'id':'R-REP-03','level':'HIGH','category':'policy','title':'id_from_submission\x20set\x20when\x20id_from=Clock/Signer\x20—\x20id\x20routing\x20conflict\x20(R-D-1\x20Move\x20assert)','description':'When\x20id_from\x20is\x20Clock\x20or\x20Signer,\x20the\x20data\x20ID\x20is\x20auto-generated\x20(timestamp\x20or\x20signer\x20address).\x20'+'A\x20PolicyGuard\x20with\x20id_from_submission\x20set\x20would\x20try\x20to\x20route\x20the\x20id\x20from\x20a\x20Passport\x20submission,\x20'+'conflicting\x20with\x20the\x20auto-generated\x20id_from\x20path.\x20The\x20Move\x20contract\x20enforces\x20that\x20id_from_submission\x20'+'MUST\x20be\x20None\x20for\x20every\x20PolicyGuard\x20when\x20id_from\x20is\x20Clock/Signer\x20(data_from_submission\x20is\x20still\x20'+'allowed\x20—\x20it\x20is\x20used\x20by\x20data_when_id_from_set_with_passport\x20to\x20extract\x20data\x20from\x20the\x20submission).\x20'+'Violations\x20abort\x20with\x20E_POLICY_ID_FROM_SUBMISSION_FORBIDDEN\x20(23)\x20in\x20policy_add_imp()\x20[R-D-1=A,\x20refined].','affected_stakeholders':['creator','writer'],'scenario':'Caller\x20creates\x20a\x20policy\x20with\x20id_from=Clock\x20and\x20a\x20write_guard\x20entry\x20whose\x20id_from_submission\x20is\x20set','mitigation':'When\x20id_from=Clock\x20or\x20Signer,\x20ensure\x20every\x20PolicyGuard\x20has\x20id_from_submission=null.\x20'+'data_from_submission\x20may\x20still\x20be\x20set\x20if\x20you\x20want\x20the\x20guard\x20to\x20supply\x20the\x20data\x20payload\x20'+'(routed\x20via\x20data_when_id_from_set_with_passport).\x20If\x20you\x20need\x20submission-derived\x20ids,\x20'+'switch\x20to\x20id_from=None\x20and\x20set\x20id_from_submission\x20on\x20the\x20guard.','related_move_error':'E_POLICY_ID_FROM_SUBMISSION_FORBIDDEN\x20(23)','auto_fixable':![]},'check':a=>{if(!a['policies'])return null;const b=a['policies']['filter'](c=>{const d=normalizeIdFrom(c['id_from']);return(d===0x1||d===0x2)&&c['has_id_from_submission'];});if(b['length']===0x0)return null;return{...R_REP_2_02['rule'],'evidence':'policies\x20with\x20id_from=Clock/Signer\x20+\x20id_from_submission\x20set:\x20'+b['map'](c=>c['name']+'(id_from='+c['id_from']+')')['join'](',\x20')};}},R_REP_1_02={'rule':{'id':'R-REP-04','level':'MEDIUM','category':'structural','title':'Policy\x20write_guard\x20count\x20exceeds\x20MAX_POLICY_GUARD_COUNT\x20('+MAX_POLICY_GUARD_COUNT+')','description':'Each\x20policy\x20may\x20define\x20up\x20to\x20MAX_POLICY_GUARD_COUNT='+MAX_POLICY_GUARD_COUNT+'\x20guard\x20entries\x20in\x20its\x20write_guard\x20list\x20'+'(Move\x20source:\x20repository.move:23).\x20Exceeding\x20this\x20limit\x20aborts\x20with\x20E_POLICY_GUARD_COUNT_EXCEEDED\x20(2).\x20'+'Each\x20entry\x20maps\x20to\x20a\x20Guard\x20object\x20that\x20must\x20be\x20verified\x20via\x20Passport\x20submission,\x20so\x20more\x20guards\x20=\x20'+'more\x20complex\x20write\x20authorization\x20semantics.','affected_stakeholders':['creator'],'scenario':'Caller\x20creates\x20a\x20policy\x20with\x2011\x20guard\x20entries\x20in\x20write_guard','mitigation':'Consolidate\x20guard\x20logic.\x20If\x20multiple\x20guards\x20must\x20verify\x20the\x20same\x20data,\x20consider\x20composing\x20them\x20into\x20a\x20'+'single\x20Guard\x20with\x20relies/rep\x20fields,\x20or\x20split\x20the\x20data\x20across\x20multiple\x20policies\x20with\x20fewer\x20guards\x20each.','related_move_error':'E_POLICY_GUARD_COUNT_EXCEEDED\x20(2)','auto_fixable':![]},'check':a=>{if(!a['policies'])return null;const b=a['policies']['filter'](c=>c['write_guard_count']>MAX_POLICY_GUARD_COUNT);if(b['length']===0x0)return null;return{...R_REP_1_02['rule'],'evidence':'policies\x20exceeding\x20guard\x20count:\x20'+b['map'](c=>c['name']+'('+c['write_guard_count']+')')['join'](',\x20')};}},R_REP_1_03={'rule':{'id':'R-REP-05','level':'MEDIUM','category':'structural','title':'Data\x20value\x20exceeds\x20MAX_DATA_SIZE\x20('+MAX_DATA_SIZE+'\x20bytes)','description':'A\x20single\x20Repository\x20data\x20value\x20must\x20be\x20≤\x20MAX_DATA_SIZE='+MAX_DATA_SIZE+'\x20bytes\x20(Move\x20source:\x20repository.move:24).\x20'+'Exceeding\x20this\x20limit\x20aborts\x20with\x20E_DATA_EXCEEDED\x20(4).\x20The\x20value\x20is\x20stored\x20as\x20a\x20BCS-serialized\x20vector<u8>\x20'+'with\x20a\x20type-tag\x20prefix\x20byte.\x20Large\x20data\x20should\x20be\x20stored\x20off-chain\x20(e.g.\x20IPFS,\x20Walrus)\x20and\x20referenced\x20'+'by\x20hash/address,\x20NOT\x20inlined\x20into\x20the\x20Repository\x20data\x20value.','affected_stakeholders':['writer'],'scenario':'Caller\x20writes\x20a\x2050KB\x20JSON\x20blob\x20as\x20a\x20Repository\x20data\x20value','mitigation':'Store\x20large\x20payloads\x20off-chain\x20and\x20write\x20only\x20the\x20content\x20hash\x20(32-64\x20bytes)\x20to\x20the\x20Repository.\x20'+'Use\x20about_address\x20on\x20a\x20Proof\x20object\x20to\x20bind\x20the\x20off-chain\x20data\x20to\x20an\x20on-chain\x20attestation.','related_move_error':'E_DATA_EXCEEDED\x20(4)','auto_fixable':![]},'check':a=>{if(a['data_size']===undefined)return null;if(a['data_size']<=MAX_DATA_SIZE)return null;return{...R_REP_1_03['rule'],'evidence':'data_size='+a['data_size']+',\x20limit='+MAX_DATA_SIZE};}},R_REP_3_01={'rule':{'id':'R-REP-06','level':'LOW','category':'routing','title':'Policy\x20has\x20data_from_submission\x20but\x20no\x20id_from_submission\x20—\x20verify\x20Mode\x205\x20routing\x20intent','description':'When\x20a\x20PolicyGuard\x20has\x20data_from_submission\x20set\x20(data\x20comes\x20from\x20Passport\x20submission)\x20but\x20no\x20'+'id_from_submission\x20(id\x20comes\x20from\x20caller),\x20the\x20SDK\x20routes\x20to\x20id_data_mixed_with_passport\x20(Mode\x205).\x20'+'This\x20is\x20a\x20valid\x20but\x20advanced\x20pattern\x20—\x20ensure\x20the\x20caller\x20provides\x20matching\x20id\x20vectors.\x20The\x20SDK\x20'+'hasSubmissionSettings\x20helper\x20now\x20correctly\x20detects\x20this\x20case\x20[P1-1\x20fix,\x20R-D-3=A].','affected_stakeholders':['creator','writer'],'scenario':'Policy\x20has\x20a\x20guard\x20with\x20data_from_submission=2,\x20id_from_submission=undefined','mitigation':'Document\x20the\x20expected\x20caller\x20input\x20shape.\x20Ensure\x20the\x20caller\x20provides\x20both\x20the\x20id\x20vector\x20(positional)\x20'+'and\x20the\x20Passport\x20submission\x20(for\x20data).\x20Verify\x20routing\x20via\x20the\x20SDK\x20hasSubmissionSettings\x20helper.','auto_fixable':![]},'check':a=>{if(!a['policies'])return null;const b=a['policies']['filter'](c=>c['has_data_from_submission']&&!c['has_id_from_submission']);if(b['length']===0x0)return null;return{...R_REP_3_01['rule'],'evidence':'policies\x20with\x20data_from_submission\x20but\x20no\x20id_from_submission:\x20'+b['map'](c=>c['name'])['join'](',\x20')};}},R_REP_4_01={'rule':{'id':'R-REP-07','level':'HIGH','category':'submission','title':'data_from_submission\x20set\x20on\x20a\x20policy\x20used\x20in\x20id_data_remove_with_passport\x20—\x20Move\x20will\x20abort\x20(R-D-2)','description':'id_data_remove_with_passport\x20only\x20removes\x20data\x20identified\x20by\x20the\x20caller-provided\x20id\x20vector;\x20it\x20'+'cannot\x20consume\x20Passport\x20submissions\x20for\x20either\x20id\x20or\x20data.\x20The\x20Move\x20contract\x20now\x20enforces\x20that\x20BOTH\x20'+'id_from_submission\x20AND\x20data_from_submission\x20MUST\x20be\x20None\x20for\x20this\x20entry\x20point\x20[R-D-2=A],\x20aborting\x20'+'with\x20E_GUARD_SPECIFIED_ID_FROM_SUBMISSION\x20(11).\x20Previously,\x20only\x20id_from_submission\x20was\x20checked,\x20'+'allowing\x20data_from_submission\x20to\x20be\x20silently\x20ignored\x20—\x20masking\x20a\x20routing\x20bug.','affected_stakeholders':['writer','verifier'],'scenario':'Caller\x20uses\x20id_data_remove_with_passport\x20on\x20a\x20policy\x20whose\x20guard\x20has\x20data_from_submission=2','mitigation':'For\x20data\x20removal\x20via\x20Passport,\x20use\x20id_data_mixed_remove_with_passport\x20instead\x20(which\x20requires\x20'+'id_from_submission\x20and\x20derives\x20the\x20id\x20from\x20the\x20submission).\x20Do\x20not\x20set\x20data_from_submission\x20on\x20'+'policies\x20intended\x20for\x20id_data_remove_with_passport.','related_move_error':'E_GUARD_SPECIFIED_ID_FROM_SUBMISSION\x20(11)','auto_fixable':![]},'check':a=>{if(!a['is_data_remove_with_passport']||!a['policies'])return null;const b=a['policies']['filter'](c=>c['has_data_from_submission']);if(b['length']===0x0)return null;return{...R_REP_4_01['rule'],'evidence':'policies\x20with\x20data_from_submission\x20used\x20in\x20id_data_remove_with_passport:\x20'+b['map'](c=>c['name'])['join'](',\x20')};}},R_REP_1_04={'rule':{'id':'R-REP-08','level':'LOW','category':'structural','title':'ID\x20count\x20per\x20single\x20op\x20exceeds\x20MAX_ID_COUNT_ONCE\x20('+MAX_ID_COUNT_ONCE+')','description':'A\x20single\x20Repository\x20call\x20(data_add,\x20data_remove,\x20id_data_*)\x20may\x20operate\x20on\x20at\x20most\x20'+('MAX_ID_COUNT_ONCE='+MAX_ID_COUNT_ONCE+'\x20IDs\x20(Move\x20source:\x20repository.move:25).\x20Exceeding\x20this\x20limit\x20')+'aborts\x20with\x20E_ID_COUNT_EXCEEDED\x20(5).\x20Batch\x20large\x20operations\x20across\x20multiple\x20transactions.','affected_stakeholders':['writer'],'scenario':'Caller\x20passes\x20150\x20IDs\x20in\x20a\x20single\x20data_remove\x20call','mitigation':'Split\x20into\x20batches\x20of\x20≤\x20'+MAX_ID_COUNT_ONCE+'\x20IDs\x20per\x20transaction.','related_move_error':'E_ID_COUNT_EXCEEDED\x20(5)','auto_fixable':![]},'check':a=>{if(a['id_count_once']===undefined)return null;if(a['id_count_once']<=MAX_ID_COUNT_ONCE)return null;return{...R_REP_1_04['rule'],'evidence':'id_count='+a['id_count_once']+',\x20limit='+MAX_ID_COUNT_ONCE};}},R_REP_1_05={'rule':{'id':'R-REP-09','level':'INFO','category':'structural','title':'Reward\x20count\x20approaches\x20MAX_REWARD_COUNT\x20('+MAX_REWARD_COUNT+')','description':'A\x20Repository\x20may\x20reference\x20up\x20to\x20MAX_REWARD_COUNT='+MAX_REWARD_COUNT+'\x20Reward\x20objects\x20(Move\x20source:\x20repository.move:26).\x20'+'Exceeding\x20this\x20limit\x20aborts\x20with\x20E_MAX_REWARD_COUNT_EXCEEDED\x20(19).\x20Rewards\x20incentivize\x20data\x20contribution;\x20'+'having\x20many\x20rewards\x20is\x20fine\x20but\x20increases\x20accounting\x20complexity.','affected_stakeholders':['creator'],'scenario':'Caller\x20adds\x2020\x20rewards\x20to\x20a\x20Repository\x20(at\x20the\x20limit)','mitigation':'Monitor\x20reward\x20count.\x20If\x20more\x20incentives\x20are\x20needed,\x20consolidate\x20rewards\x20or\x20use\x20a\x20separate\x20Repository.','related_move_error':'E_MAX_REWARD_COUNT_EXCEEDED\x20(19)','auto_fixable':![]},'check':a=>{if(a['reward_count']===undefined)return null;if(a['reward_count']<MAX_REWARD_COUNT)return null;return{...R_REP_1_05['rule'],'evidence':'reward_count='+a['reward_count']+',\x20limit='+MAX_REWARD_COUNT};}},R_REP_5_01={'rule':{'id':'R-REP-10','level':'INFO','category':'knowledge','title':'Knowledge\x20layer\x20&\x20constant\x20sync\x20—\x20RESOLVED','description':'All\x206\x20Repository\x20constants\x20(MAX_POLICY_COUNT,\x20MAX_POLICY_DESCRIPTION_LEN,\x20MAX_POLICY_GUARD_COUNT,\x20'+'MAX_DATA_SIZE,\x20MAX_ID_COUNT_ONCE,\x20MAX_REWARD_COUNT)\x20are\x20now\x20synced\x20to\x20onchain-constants.ts.\x20'+'The\x20MCP\x20Knowledge\x20layer\x20now\x20includes\x20repository-risk.ts,\x20repository-confirm.ts,\x20'+'repository-translation.ts\x20(R-D-4=A).\x20The\x20SDK\x20hasSubmissionSettings\x20helper\x20now\x20correctly\x20checks\x20both\x20'+'id_from_submission\x20AND\x20data_from_submission\x20(P1-1).\x20parseIdFrom\x20is\x20used\x20in\x20data/data_remove\x20(P1-2).\x20'+'This\x20risk\x20rule\x20is\x20retained\x20for\x20historical\x20audit\x20and\x20to\x20detect\x20future\x20regressions.','affected_stakeholders':['system'],'scenario':'Future\x20regression:\x20someone\x20removes\x20a\x20Repository\x20constant\x20from\x20onchain-constants.ts','mitigation':'Run\x20the\x20onchain-constants\x20sync\x20test\x20to\x20detect\x20drift.','auto_fixable':![]},'check':a=>{if(a['constants_synced'])return null;return{...R_REP_5_01['rule'],'evidence':'constants_synced=false'};}},R_REP_6_01={'rule':{'id':'R-REP-11','level':'HIGH','category':'policy','title':'quote_guard\x20must\x20be\x20is_depended\x20(immutable\x20+\x20rep=true\x20+\x20no\x20relies)\x20—\x20Move\x20assert','description':'Repository\x20policy\x27s\x20quote_guard\x20must\x20satisfy\x20guard::is_depended\x20(guard.move#L133-135):\x20'+'immutable=true,\x20relies\x20empty,\x20rep=true.\x20This\x20ensures\x20the\x20quote_guard\x20is\x20a\x20stable,\x20'+'repository-querying\x20guard\x20that\x20can\x20be\x20depended\x20upon.\x20Move\x20aborts\x20with\x20'+'E_NEED_DEPENDENT_GUARD\x20(repository.move#L422)\x20if\x20the\x20guard\x20is\x20not\x20is_depended.\x20'+'VERIFIED:\x20passport.rs#L545-612\x20(check_repository_quote_guard\x20enforces\x20this\x20at\x20query\x20time).','affected_stakeholders':['creator','reader'],'scenario':'Creator\x20sets\x20quote_guard\x20to\x20a\x20Guard\x20that\x20is\x20not\x20is_depended\x20(e.g.,\x20has\x20relies\x20or\x20is\x20mutable)','mitigation':'Ensure\x20the\x20quote_guard\x20Guard\x20object\x20has:\x20immutable=true,\x20relies=empty,\x20rep=true.\x20'+'Use\x20pattern.repository_quote_guard_subscription\x20as\x20the\x20design\x20template.','related_move_error':'E_NEED_DEPENDENT_GUARD','auto_fixable':![]},'check':a=>{if(!a['has_quote_guard'])return null;if(a['quote_guard_is_depended'])return null;return{...R_REP_6_01['rule'],'evidence':'quote_guard\x20set\x20but\x20not\x20is_depended\x20(immutable\x20+\x20rep=true\x20+\x20no\x20relies)'};}},R_REP_6_02={'rule':{'id':'R-REP-12','level':'MEDIUM','category':'knowledge','title':'quote_guard\x20data\x20subscription\x20design\x20—\x20verify\x20Payment\x20verification\x20+\x20owner_receive\x20revenue','description':'When\x20using\x20quote_guard\x20for\x20data\x20subscription\x20(Repository+quote_guard+Payment\x20pattern),\x20'+'ensure:\x20(1)\x20quote_guard\x20verifies\x20Payment\x20fields\x20(for_object\x20matches\x20Repository,\x20amount\x20meets\x20price),\x20'+'(2)\x20Repository\x20has\x20owner_receive<T>\x20configured\x20to\x20accept\x20Payment\x20as\x20subscription\x20revenue\x20'+'(repository.move#L714-717).\x20VERIFIED:\x20passport.rs#L545-612,\x20repository.move#L714-717.\x20'+'DESIGN:\x20quote_guard\x20is\x20a\x20RIGID\x20verification\x20requirement\x20—\x20any\x20guard\x20querying\x20this\x20Repository\x27s\x20'+'data\x20MUST\x20satisfy\x20the\x20quote_guard\x20(see\x20R-X1-10\x20in\x20guard-risk.ts).','affected_stakeholders':['creator','reader','verifier'],'scenario':'Creator\x20sets\x20quote_guard\x20but\x20does\x20not\x20configure\x20Payment\x20verification\x20or\x20owner_receive','mitigation':'1)\x20Ensure\x20quote_guard\x20verifies\x20Payment\x20(for_object,\x20amount);\x20'+'2)\x20Configure\x20Repository\x20owner_receive<T>\x20to\x20accept\x20subscription\x20Payment\x20revenue;\x20'+'3)\x20Use\x20pattern.repository_quote_guard_subscription\x20(guard-design-patterns.ts)\x20and\x20'+'tpl_repository_quote_guard_subscription\x20(guard-templates.ts)\x20as\x20design\x20templates.','auto_fixable':![]},'check':a=>{if(!a['has_quote_guard'])return null;if(a['quote_guard_verifies_payment']&&a['has_owner_receive'])return null;const b=[];if(!a['quote_guard_verifies_payment'])b['push']('quote_guard\x20does\x20not\x20verify\x20Payment');if(!a['has_owner_receive'])b['push']('Repository\x20missing\x20owner_receive\x20for\x20revenue');return{...R_REP_6_02['rule'],'evidence':b['join'](';\x20')};}};export const REPOSITORY_RISK_RULES=[R_REP_1_01,R_REP_2_01,R_REP_2_02,R_REP_1_02,R_REP_1_03,R_REP_3_01,R_REP_4_01,R_REP_1_04,R_REP_1_05,R_REP_5_01,R_REP_6_01,R_REP_6_02];export function checkRepositoryRisks(a){const b=[];for(const c of REPOSITORY_RISK_RULES){const d=c['check'](a);if(d)b['push'](d);}return b;}export function getRepositoryRiskById(a){return REPOSITORY_RISK_RULES['find'](b=>b['rule']['id']===a)?.['rule'];}export{normalizeIdFrom as parseIdFromForRiskCheck};
1
+ import{MAX_POLICY_COUNT,MAX_POLICY_GUARD_COUNT,MAX_DATA_SIZE,MAX_ID_COUNT_ONCE,MAX_REWARD_COUNT}from'@wowok/wowok';function normalizeIdFrom(a){if(typeof a==='number')return a;const b=String(a)['toLowerCase']();if(b==='none')return 0x0;if(b==='clock')return 0x1;if(b==='signer')return 0x2;const c=Number(a);return Number['isNaN'](c)?-0x1:c;}const R_REP_1_01={'rule':{'id':'R-REP-01','level':'MEDIUM','category':'structural','title':'Policy\x20count\x20exceeds\x20MAX_POLICY_COUNT\x20('+MAX_POLICY_COUNT+')','description':'A\x20single\x20Repository\x20may\x20hold\x20up\x20to\x20MAX_POLICY_COUNT='+MAX_POLICY_COUNT+'\x20policies\x20(Move\x20source:\x20repository.move:22).\x20'+'Exceeding\x20this\x20limit\x20aborts\x20with\x20E_POLICY_COUNT_EXCEEDED\x20(3)\x20in\x20policy_add_imp().\x20Each\x20policy\x20defines\x20a\x20named\x20'+'data\x20slot\x20with\x20its\x20own\x20write_guard\x20list\x20and\x20id_from\x20routing\x20—\x20having\x20too\x20many\x20policies\x20makes\x20the\x20Repository\x20'+'hard\x20to\x20audit\x20and\x20increases\x20gas\x20cost\x20for\x20policy\x20lookups\x20(O(n)\x20scan\x20in\x20policy_by_name).','affected_stakeholders':['creator'],'scenario':'Caller\x20adds\x2051\x20policies\x20to\x20a\x20single\x20Repository','mitigation':'Consolidate\x20related\x20data\x20under\x20fewer\x20policies.\x20If\x20truly\x20needed,\x20split\x20data\x20across\x20multiple\x20Repository\x20'+'objects\x20and\x20reference\x20them\x20via\x20Service.repository\x20or\x20Progress.context_repositories.','related_move_error':'E_POLICY_COUNT_EXCEEDED\x20(3)','auto_fixable':![]},'check':a=>{if(!a['policies']||a['existing_policy_count']===undefined)return null;const b=a['existing_policy_count']+a['policies']['length'];if(b<=MAX_POLICY_COUNT)return null;return{...R_REP_1_01['rule'],'evidence':'existing='+a['existing_policy_count']+',\x20adding='+a['policies']['length']+',\x20total='+b+',\x20limit='+MAX_POLICY_COUNT};}},R_REP_2_01={'rule':{'id':'R-REP-02','level':'HIGH','category':'policy','title':'write_guard\x20empty\x20when\x20id_from=None\x20—\x20unauthorized\x20writes\x20(R-D-1\x20Move\x20assert)','description':'When\x20id_from\x20is\x20None,\x20the\x20data\x20ID\x20must\x20be\x20provided\x20by\x20the\x20caller\x20(via\x20id_data_with_passport\x20or\x20'+'id_data_mixed_with_passport).\x20Without\x20a\x20write_guard,\x20ANY\x20address\x20can\x20write\x20data\x20with\x20any\x20ID\x20—\x20this\x20'+'is\x20almost\x20certainly\x20a\x20misconfiguration.\x20The\x20Move\x20contract\x20now\x20enforces\x20this\x20via\x20'+'E_POLICY_WRITE_GUARD_REQUIRED\x20(22)\x20in\x20policy_add_imp()\x20[R-D-1=A].','affected_stakeholders':['creator','writer'],'scenario':'Caller\x20creates\x20a\x20policy\x20with\x20id_from=None\x20and\x20empty\x20write_guard\x20list','mitigation':'When\x20id_from=None,\x20provide\x20at\x20least\x20one\x20PolicyGuard\x20entry\x20in\x20write_guard.\x20If\x20you\x20want\x20unrestricted\x20'+'writes,\x20use\x20id_from=Clock\x20or\x20id_from=Signer\x20instead\x20(which\x20auto-generates\x20the\x20ID\x20and\x20requires\x20empty\x20write_guard).','related_move_error':'E_POLICY_WRITE_GUARD_REQUIRED\x20(22)','auto_fixable':![]},'check':a=>{if(!a['policies'])return null;const b=a['policies']['filter'](c=>normalizeIdFrom(c['id_from'])===0x0&&c['write_guard_count']===0x0);if(b['length']===0x0)return null;return{...R_REP_2_01['rule'],'evidence':'policies\x20with\x20id_from=None\x20+\x20empty\x20write_guard:\x20'+b['map'](c=>c['name'])['join'](',\x20')};}},R_REP_2_02={'rule':{'id':'R-REP-03','level':'HIGH','category':'policy','title':'id_from_submission\x20set\x20when\x20id_from=Clock/Signer\x20—\x20id\x20routing\x20conflict\x20(R-D-1\x20Move\x20assert)','description':'When\x20id_from\x20is\x20Clock\x20or\x20Signer,\x20the\x20data\x20ID\x20is\x20auto-generated\x20(timestamp\x20or\x20signer\x20address).\x20'+'A\x20PolicyGuard\x20with\x20id_from_submission\x20set\x20would\x20try\x20to\x20route\x20the\x20id\x20from\x20a\x20Passport\x20submission,\x20'+'conflicting\x20with\x20the\x20auto-generated\x20id_from\x20path.\x20The\x20Move\x20contract\x20enforces\x20that\x20id_from_submission\x20'+'MUST\x20be\x20None\x20for\x20every\x20PolicyGuard\x20when\x20id_from\x20is\x20Clock/Signer\x20(data_from_submission\x20is\x20still\x20'+'allowed\x20—\x20it\x20is\x20used\x20by\x20data_when_id_from_set_with_passport\x20to\x20extract\x20data\x20from\x20the\x20submission).\x20'+'Violations\x20abort\x20with\x20E_POLICY_ID_FROM_SUBMISSION_FORBIDDEN\x20(23)\x20in\x20policy_add_imp()\x20[R-D-1=A,\x20refined].','affected_stakeholders':['creator','writer'],'scenario':'Caller\x20creates\x20a\x20policy\x20with\x20id_from=Clock\x20and\x20a\x20write_guard\x20entry\x20whose\x20id_from_submission\x20is\x20set','mitigation':'When\x20id_from=Clock\x20or\x20Signer,\x20ensure\x20every\x20PolicyGuard\x20has\x20id_from_submission=null.\x20'+'data_from_submission\x20may\x20still\x20be\x20set\x20if\x20you\x20want\x20the\x20guard\x20to\x20supply\x20the\x20data\x20payload\x20'+'(routed\x20via\x20data_when_id_from_set_with_passport).\x20If\x20you\x20need\x20submission-derived\x20ids,\x20'+'switch\x20to\x20id_from=None\x20and\x20set\x20id_from_submission\x20on\x20the\x20guard.','related_move_error':'E_POLICY_ID_FROM_SUBMISSION_FORBIDDEN\x20(23)','auto_fixable':![]},'check':a=>{if(!a['policies'])return null;const b=a['policies']['filter'](c=>{const d=normalizeIdFrom(c['id_from']);return(d===0x1||d===0x2)&&c['has_id_from_submission'];});if(b['length']===0x0)return null;return{...R_REP_2_02['rule'],'evidence':'policies\x20with\x20id_from=Clock/Signer\x20+\x20id_from_submission\x20set:\x20'+b['map'](c=>c['name']+'(id_from='+c['id_from']+')')['join'](',\x20')};}},R_REP_1_02={'rule':{'id':'R-REP-04','level':'MEDIUM','category':'structural','title':'Policy\x20write_guard\x20count\x20exceeds\x20MAX_POLICY_GUARD_COUNT\x20('+MAX_POLICY_GUARD_COUNT+')','description':'Each\x20policy\x20may\x20define\x20up\x20to\x20MAX_POLICY_GUARD_COUNT='+MAX_POLICY_GUARD_COUNT+'\x20guard\x20entries\x20in\x20its\x20write_guard\x20list\x20'+'(Move\x20source:\x20repository.move:23).\x20Exceeding\x20this\x20limit\x20aborts\x20with\x20E_POLICY_GUARD_COUNT_EXCEEDED\x20(2).\x20'+'Each\x20entry\x20maps\x20to\x20a\x20Guard\x20object\x20that\x20must\x20be\x20verified\x20via\x20Passport\x20submission,\x20so\x20more\x20guards\x20=\x20'+'more\x20complex\x20write\x20authorization\x20semantics.','affected_stakeholders':['creator'],'scenario':'Caller\x20creates\x20a\x20policy\x20with\x2011\x20guard\x20entries\x20in\x20write_guard','mitigation':'Consolidate\x20guard\x20logic.\x20If\x20multiple\x20guards\x20must\x20verify\x20the\x20same\x20data,\x20consider\x20composing\x20them\x20into\x20a\x20'+'single\x20Guard\x20with\x20relies/rep\x20fields,\x20or\x20split\x20the\x20data\x20across\x20multiple\x20policies\x20with\x20fewer\x20guards\x20each.','related_move_error':'E_POLICY_GUARD_COUNT_EXCEEDED\x20(2)','auto_fixable':![]},'check':a=>{if(!a['policies'])return null;const b=a['policies']['filter'](c=>c['write_guard_count']>MAX_POLICY_GUARD_COUNT);if(b['length']===0x0)return null;return{...R_REP_1_02['rule'],'evidence':'policies\x20exceeding\x20guard\x20count:\x20'+b['map'](c=>c['name']+'('+c['write_guard_count']+')')['join'](',\x20')};}},R_REP_1_03={'rule':{'id':'R-REP-05','level':'MEDIUM','category':'structural','title':'Data\x20value\x20exceeds\x20MAX_DATA_SIZE\x20('+MAX_DATA_SIZE+'\x20bytes)','description':'A\x20single\x20Repository\x20data\x20value\x20must\x20be\x20≤\x20MAX_DATA_SIZE='+MAX_DATA_SIZE+'\x20bytes\x20(Move\x20source:\x20repository.move:24).\x20'+'Exceeding\x20this\x20limit\x20aborts\x20with\x20E_DATA_EXCEEDED\x20(4).\x20The\x20value\x20is\x20stored\x20as\x20a\x20BCS-serialized\x20vector<u8>\x20'+'with\x20a\x20type-tag\x20prefix\x20byte.\x20Large\x20data\x20should\x20be\x20stored\x20off-chain\x20(e.g.\x20IPFS,\x20Walrus)\x20and\x20referenced\x20'+'by\x20hash/address,\x20NOT\x20inlined\x20into\x20the\x20Repository\x20data\x20value.','affected_stakeholders':['writer'],'scenario':'Caller\x20writes\x20a\x2050KB\x20JSON\x20blob\x20as\x20a\x20Repository\x20data\x20value','mitigation':'Store\x20large\x20payloads\x20off-chain\x20and\x20write\x20only\x20the\x20content\x20hash\x20(32-64\x20bytes)\x20to\x20the\x20Repository.\x20'+'Use\x20about_address\x20on\x20a\x20Proof\x20object\x20to\x20bind\x20the\x20off-chain\x20data\x20to\x20an\x20on-chain\x20attestation.','related_move_error':'E_DATA_EXCEEDED\x20(4)','auto_fixable':![]},'check':a=>{if(a['data_size']===undefined)return null;if(a['data_size']<=MAX_DATA_SIZE)return null;return{...R_REP_1_03['rule'],'evidence':'data_size='+a['data_size']+',\x20limit='+MAX_DATA_SIZE};}},R_REP_3_01={'rule':{'id':'R-REP-06','level':'LOW','category':'routing','title':'Policy\x20has\x20data_from_submission\x20but\x20no\x20id_from_submission\x20—\x20verify\x20Mode\x205\x20routing\x20intent','description':'When\x20a\x20PolicyGuard\x20has\x20data_from_submission\x20set\x20(data\x20comes\x20from\x20Passport\x20submission)\x20but\x20no\x20'+'id_from_submission\x20(id\x20comes\x20from\x20caller),\x20the\x20SDK\x20routes\x20to\x20id_data_mixed_with_passport\x20(Mode\x205).\x20'+'This\x20is\x20a\x20valid\x20but\x20advanced\x20pattern\x20—\x20ensure\x20the\x20caller\x20provides\x20matching\x20id\x20vectors.\x20The\x20SDK\x20'+'hasSubmissionSettings\x20helper\x20now\x20correctly\x20detects\x20this\x20case\x20[P1-1\x20fix,\x20R-D-3=A].','affected_stakeholders':['creator','writer'],'scenario':'Policy\x20has\x20a\x20guard\x20with\x20data_from_submission=2,\x20id_from_submission=undefined','mitigation':'Document\x20the\x20expected\x20caller\x20input\x20shape.\x20Ensure\x20the\x20caller\x20provides\x20both\x20the\x20id\x20vector\x20(positional)\x20'+'and\x20the\x20Passport\x20submission\x20(for\x20data).\x20Verify\x20routing\x20via\x20the\x20SDK\x20hasSubmissionSettings\x20helper.','auto_fixable':![]},'check':a=>{if(!a['policies'])return null;const b=a['policies']['filter'](c=>c['has_data_from_submission']&&!c['has_id_from_submission']);if(b['length']===0x0)return null;return{...R_REP_3_01['rule'],'evidence':'policies\x20with\x20data_from_submission\x20but\x20no\x20id_from_submission:\x20'+b['map'](c=>c['name'])['join'](',\x20')};}},R_REP_4_01={'rule':{'id':'R-REP-07','level':'HIGH','category':'submission','title':'data_from_submission\x20set\x20on\x20a\x20policy\x20used\x20in\x20id_data_remove_with_passport\x20—\x20Move\x20will\x20abort\x20(R-D-2)','description':'id_data_remove_with_passport\x20only\x20removes\x20data\x20identified\x20by\x20the\x20caller-provided\x20id\x20vector;\x20it\x20'+'cannot\x20consume\x20Passport\x20submissions\x20for\x20either\x20id\x20or\x20data.\x20The\x20Move\x20contract\x20now\x20enforces\x20that\x20BOTH\x20'+'id_from_submission\x20AND\x20data_from_submission\x20MUST\x20be\x20None\x20for\x20this\x20entry\x20point\x20[R-D-2=A],\x20aborting\x20'+'with\x20E_GUARD_SPECIFIED_ID_FROM_SUBMISSION\x20(11).\x20Previously,\x20only\x20id_from_submission\x20was\x20checked,\x20'+'allowing\x20data_from_submission\x20to\x20be\x20silently\x20ignored\x20—\x20masking\x20a\x20routing\x20bug.','affected_stakeholders':['writer','verifier'],'scenario':'Caller\x20uses\x20id_data_remove_with_passport\x20on\x20a\x20policy\x20whose\x20guard\x20has\x20data_from_submission=2','mitigation':'For\x20data\x20removal\x20via\x20Passport,\x20use\x20id_data_mixed_remove_with_passport\x20instead\x20(which\x20requires\x20'+'id_from_submission\x20and\x20derives\x20the\x20id\x20from\x20the\x20submission).\x20Do\x20not\x20set\x20data_from_submission\x20on\x20'+'policies\x20intended\x20for\x20id_data_remove_with_passport.','related_move_error':'E_GUARD_SPECIFIED_ID_FROM_SUBMISSION\x20(11)','auto_fixable':![]},'check':a=>{if(!a['is_data_remove_with_passport']||!a['policies'])return null;const b=a['policies']['filter'](c=>c['has_data_from_submission']);if(b['length']===0x0)return null;return{...R_REP_4_01['rule'],'evidence':'policies\x20with\x20data_from_submission\x20used\x20in\x20id_data_remove_with_passport:\x20'+b['map'](c=>c['name'])['join'](',\x20')};}},R_REP_1_04={'rule':{'id':'R-REP-08','level':'LOW','category':'structural','title':'ID\x20count\x20per\x20single\x20op\x20exceeds\x20MAX_ID_COUNT_ONCE\x20('+MAX_ID_COUNT_ONCE+')','description':'A\x20single\x20Repository\x20call\x20(data_add,\x20data_remove,\x20id_data_*)\x20may\x20operate\x20on\x20at\x20most\x20'+('MAX_ID_COUNT_ONCE='+MAX_ID_COUNT_ONCE+'\x20IDs\x20(Move\x20source:\x20repository.move:25).\x20Exceeding\x20this\x20limit\x20')+'aborts\x20with\x20E_ID_COUNT_EXCEEDED\x20(5).\x20Batch\x20large\x20operations\x20across\x20multiple\x20transactions.','affected_stakeholders':['writer'],'scenario':'Caller\x20passes\x20150\x20IDs\x20in\x20a\x20single\x20data_remove\x20call','mitigation':'Split\x20into\x20batches\x20of\x20≤\x20'+MAX_ID_COUNT_ONCE+'\x20IDs\x20per\x20transaction.','related_move_error':'E_ID_COUNT_EXCEEDED\x20(5)','auto_fixable':![]},'check':a=>{if(a['id_count_once']===undefined)return null;if(a['id_count_once']<=MAX_ID_COUNT_ONCE)return null;return{...R_REP_1_04['rule'],'evidence':'id_count='+a['id_count_once']+',\x20limit='+MAX_ID_COUNT_ONCE};}},R_REP_1_05={'rule':{'id':'R-REP-09','level':'INFO','category':'structural','title':'Reward\x20count\x20approaches\x20MAX_REWARD_COUNT\x20('+MAX_REWARD_COUNT+')','description':'A\x20Repository\x20may\x20reference\x20up\x20to\x20MAX_REWARD_COUNT='+MAX_REWARD_COUNT+'\x20Reward\x20objects\x20(Move\x20source:\x20repository.move:26).\x20'+'Exceeding\x20this\x20limit\x20aborts\x20with\x20E_MAX_REWARD_COUNT_EXCEEDED\x20(19).\x20Rewards\x20incentivize\x20data\x20contribution;\x20'+'having\x20many\x20rewards\x20is\x20fine\x20but\x20increases\x20accounting\x20complexity.','affected_stakeholders':['creator'],'scenario':'Caller\x20adds\x2020\x20rewards\x20to\x20a\x20Repository\x20(at\x20the\x20limit)','mitigation':'Monitor\x20reward\x20count.\x20If\x20more\x20incentives\x20are\x20needed,\x20consolidate\x20rewards\x20or\x20use\x20a\x20separate\x20Repository.','related_move_error':'E_MAX_REWARD_COUNT_EXCEEDED\x20(19)','auto_fixable':![]},'check':a=>{if(a['reward_count']===undefined)return null;if(a['reward_count']<MAX_REWARD_COUNT)return null;return{...R_REP_1_05['rule'],'evidence':'reward_count='+a['reward_count']+',\x20limit='+MAX_REWARD_COUNT};}},R_REP_5_01={'rule':{'id':'R-REP-10','level':'INFO','category':'knowledge','title':'Knowledge\x20layer\x20&\x20constant\x20sync\x20—\x20RESOLVED','description':'All\x206\x20Repository\x20constants\x20(MAX_POLICY_COUNT,\x20MAX_POLICY_DESCRIPTION_LEN,\x20MAX_POLICY_GUARD_COUNT,\x20'+'MAX_DATA_SIZE,\x20MAX_ID_COUNT_ONCE,\x20MAX_REWARD_COUNT)\x20are\x20now\x20synced\x20to\x20onchain-constants.ts.\x20'+'The\x20MCP\x20Knowledge\x20layer\x20now\x20includes\x20repository-risk.ts,\x20repository-confirm.ts,\x20'+'repository-translation.ts\x20(R-D-4=A).\x20The\x20SDK\x20hasSubmissionSettings\x20helper\x20now\x20correctly\x20checks\x20both\x20'+'id_from_submission\x20AND\x20data_from_submission\x20(P1-1).\x20parseIdFrom\x20is\x20used\x20in\x20data/data_remove\x20(P1-2).\x20'+'This\x20risk\x20rule\x20is\x20retained\x20for\x20historical\x20audit\x20and\x20to\x20detect\x20future\x20regressions.','affected_stakeholders':['system'],'scenario':'Future\x20regression:\x20someone\x20removes\x20a\x20Repository\x20constant\x20from\x20onchain-constants.ts','mitigation':'Run\x20the\x20onchain-constants\x20sync\x20test\x20to\x20detect\x20drift.','auto_fixable':![]},'check':a=>{if(a['constants_synced'])return null;return{...R_REP_5_01['rule'],'evidence':'constants_synced=false'};}},R_REP_6_01={'rule':{'id':'R-REP-11','level':'HIGH','category':'policy','title':'quote_guard\x20must\x20be\x20is_depended\x20(immutable\x20+\x20rep=true\x20+\x20no\x20relies)\x20—\x20Move\x20assert','description':'Repository\x20policy\x27s\x20quote_guard\x20must\x20satisfy\x20guard::is_depended\x20(guard.move#L133-135):\x20'+'immutable=true,\x20relies\x20empty,\x20rep=true.\x20This\x20ensures\x20the\x20quote_guard\x20is\x20a\x20stable,\x20'+'repository-querying\x20guard\x20that\x20can\x20be\x20depended\x20upon.\x20Move\x20aborts\x20with\x20'+'E_NEED_DEPENDENT_GUARD\x20(repository.move#L422)\x20if\x20the\x20guard\x20is\x20not\x20is_depended.\x20'+'VERIFIED:\x20passport.rs#L545-612\x20(check_repository_quote_guard\x20enforces\x20this\x20at\x20query\x20time).','affected_stakeholders':['creator','reader'],'scenario':'Creator\x20sets\x20quote_guard\x20to\x20a\x20Guard\x20that\x20is\x20not\x20is_depended\x20(e.g.,\x20has\x20relies\x20or\x20is\x20mutable)','mitigation':'Ensure\x20the\x20quote_guard\x20Guard\x20object\x20has:\x20immutable=true,\x20relies=empty,\x20rep=true.\x20'+'Use\x20pattern.repository_quote_guard_subscription\x20as\x20the\x20design\x20template.','related_move_error':'E_NEED_DEPENDENT_GUARD','auto_fixable':![]},'check':a=>{if(!a['has_quote_guard'])return null;if(a['quote_guard_is_depended'])return null;return{...R_REP_6_01['rule'],'evidence':'quote_guard\x20set\x20but\x20not\x20is_depended\x20(immutable\x20+\x20rep=true\x20+\x20no\x20relies)'};}},R_REP_6_02={'rule':{'id':'R-REP-12','level':'MEDIUM','category':'knowledge','title':'quote_guard\x20data\x20subscription\x20design\x20—\x20verify\x20Payment\x20verification\x20+\x20owner_receive\x20revenue','description':'When\x20using\x20quote_guard\x20for\x20data\x20subscription\x20(Repository+quote_guard+Payment\x20pattern),\x20'+'ensure:\x20(1)\x20quote_guard\x20verifies\x20Payment\x20fields\x20(for_object\x20matches\x20Repository,\x20amount\x20meets\x20price),\x20'+'(2)\x20Repository\x20has\x20owner_receive<T>\x20configured\x20to\x20accept\x20Payment\x20as\x20subscription\x20revenue\x20'+'(repository.move#L714-717).\x20VERIFIED:\x20passport.rs#L545-612,\x20repository.move#L714-717.\x20'+'DESIGN:\x20quote_guard\x20is\x20a\x20RIGID\x20verification\x20requirement\x20—\x20any\x20guard\x20querying\x20this\x20Repository\x27s\x20'+'data\x20MUST\x20satisfy\x20the\x20quote_guard\x20(see\x20R-X1-10\x20in\x20guard-risk.ts).','affected_stakeholders':['creator','reader','verifier'],'scenario':'Creator\x20sets\x20quote_guard\x20but\x20does\x20not\x20configure\x20Payment\x20verification\x20or\x20owner_receive','mitigation':'1)\x20Ensure\x20quote_guard\x20verifies\x20Payment\x20(for_object,\x20amount);\x20'+'2)\x20Configure\x20Repository\x20owner_receive<T>\x20to\x20accept\x20subscription\x20Payment\x20revenue;\x20'+'3)\x20Use\x20pattern.repository_quote_guard_subscription\x20(guard-design-patterns.ts)\x20and\x20'+'tpl_repository_quote_guard_subscription\x20(guard-templates.ts)\x20as\x20design\x20templates.','auto_fixable':![]},'check':a=>{if(!a['has_quote_guard'])return null;if(a['quote_guard_verifies_payment']&&a['has_owner_receive'])return null;const b=[];if(!a['quote_guard_verifies_payment'])b['push']('quote_guard\x20does\x20not\x20verify\x20Payment');if(!a['has_owner_receive'])b['push']('Repository\x20missing\x20owner_receive\x20for\x20revenue');return{...R_REP_6_02['rule'],'evidence':b['join'](';\x20')};}};export const REPOSITORY_RISK_RULES=[R_REP_1_01,R_REP_2_01,R_REP_2_02,R_REP_1_02,R_REP_1_03,R_REP_3_01,R_REP_4_01,R_REP_1_04,R_REP_1_05,R_REP_5_01,R_REP_6_01,R_REP_6_02];export function checkRepositoryRisks(a){const b=[];for(const c of REPOSITORY_RISK_RULES){const d=c['check'](a);if(d)b['push'](d);}return b;}export{normalizeIdFrom as parseIdFromForRiskCheck};
@@ -29,4 +29,3 @@ export declare const RESOURCE_RISK_RULES: {
29
29
  }[];
30
30
  export declare const RESOURCE_RISK_VERSION = "1.0.0";
31
31
  export declare function checkResourceRisks(ctx: ResourceRiskCheckContext): ResourceRisk[];
32
- export declare function getResourceRiskById(id: string): ResourceRisk | undefined;
@@ -1 +1 @@
1
- import{MAX_TAGS_COUNT}from'@wowok/wowok';const R_R_01={'rule':{'id':'R-RESOURCE-01','level':'LOW','category':'permission','title':'Resource\x20has\x20no\x20Permission\x20—\x20relies\x20entirely\x20on\x20caller-side\x20gating','description':'Resource\x20does\x20not\x20associate\x20with\x20a\x20Permission\x20object.\x20All\x20functions\x20are\x20'+'public(package)\x20(new/destroy/transfer/tag_set/tag_unset)\x20or\x20public\x20'+'(add_object_tags/remove_object_tags/remove_object)\x20—\x20there\x20is\x20no\x20on-chain\x20permission\x20'+'check.\x20Access\x20control\x20is\x20delegated\x20to\x20the\x20calling\x20module\x20(Personal,\x20Entity).\x20A\x20'+'caller\x20that\x20forgets\x20to\x20enforce\x20its\x20own\x20permission\x20check\x20would\x20let\x20any\x20address\x20mutate\x20'+'tags.','affected_stakeholders':['owner','caller'],'scenario':'Personal/Entity\x20forgets\x20to\x20gate\x20add_object_tags\x20behind\x20its\x20own\x20permission\x20check','mitigation':'Callers\x20(Personal,\x20Entity)\x20MUST\x20enforce\x20their\x20own\x20permission\x20checks\x20before\x20invoking\x20'+'Resource\x20functions.\x20Audit\x20the\x20call\x20sites\x20in\x20Personal/Entity\x20to\x20confirm\x20gating.','auto_fixable':![]},'check':a=>{if(!a['expects_resource_permission'])return null;return{...R_R_01['rule'],'evidence':'expects_resource_permission=true\x20(Resource\x20has\x20none)'};}},R_R_02={'rule':{'id':'R-RESOURCE-02','level':'MEDIUM','category':'semantic','title':'Tag\x20mutations\x20emit\x20no\x20events\x20—\x20external\x20indexers\x20must\x20poll','description':'add_object_tags\x20/\x20remove_object_tags\x20/\x20remove_object\x20do\x20not\x20emit\x20events\x20'+'(resource.move:89-145).\x20External\x20indexers\x20cannot\x20rely\x20on\x20an\x20event\x20stream\x20to\x20track\x20'+'tag\x20changes;\x20they\x20must\x20poll\x20the\x20ParentTable\x20field.\x20This\x20complicates\x20real-time\x20'+'notification\x20and\x20consistency.','affected_stakeholders':['owner','caller'],'scenario':'Indexer\x20expects\x20a\x20TagAddedEvent\x20but\x20none\x20is\x20emitted;\x20UI\x20fails\x20to\x20refresh','mitigation':'External\x20indexers\x20should\x20poll\x20Resource.table\x20on\x20a\x20cadence.\x20Do\x20not\x20build\x20critical\x20UX\x20'+'on\x20tag\x20event\x20streams\x20until\x20events\x20are\x20added\x20in\x20a\x20future\x20version.','auto_fixable':![]},'check':a=>{if(!a['expects_tag_events'])return null;return{...R_R_02['rule'],'evidence':'expects_tag_events=true\x20(no\x20events\x20emitted)'};}},R_R_03={'rule':{'id':'R-RESOURCE-03','level':'LOW','category':'structural','title':'MAX_TAGS_COUNT='+MAX_TAGS_COUNT+'\x20permissive\x20—\x20storage\x20cost','description':'A\x20single\x20object\x27s\x20AddressTag.tags\x20vector\x20may\x20hold\x20up\x20to\x20MAX_TAGS_COUNT='+MAX_TAGS_COUNT+'\x20'+'entries\x20(resource.move:9).\x20The\x20limit\x20aborts\x20with\x20E_TAGS_COUNT_EXCEEDED\x20(1)\x20only\x20at\x20the\x20'+'boundary.\x20100\x20tags\x20per\x20object\x20is\x20generous;\x20loading\x20all\x20tags\x20on\x20every\x20read\x20increases\x20'+'gas\x20and\x20storage\x20cost.','affected_stakeholders':['owner'],'scenario':'Caller\x20adds\x20100\x20tags\x20to\x20a\x20single\x20object','mitigation':'Business\x20layer\x20should\x20self-limit\x20tag\x20count\x20well\x20below\x20100.\x20For\x20heavy\x20tagging,\x20'+'shard\x20across\x20multiple\x20Resource\x20objects\x20or\x20store\x20bulk\x20tags\x20off-chain.','related_move_error':'E_TAGS_COUNT_EXCEEDED\x20(1)','auto_fixable':![]},'check':a=>{if(a['tags_count']===undefined)return null;if(a['tags_count']<MAX_TAGS_COUNT)return null;return{...R_R_03['rule'],'evidence':'tags_count='+a['tags_count']+',\x20limit='+MAX_TAGS_COUNT};}},R_R_04={'rule':{'id':'R-RESOURCE-04','level':'LOW','category':'lifecycle','title':'destroy\x20is\x20irreversible\x20—\x20no\x20recovery\x20mechanism','description':'Resource.destroy(resource)\x20(resource.move:38)\x20deletes\x20the\x20object\x20and\x20its\x20ParentTable\x20'+'in\x20place.\x20There\x20is\x20no\x20archive,\x20no\x20event,\x20and\x20no\x20rollback.\x20Once\x20destroyed,\x20the\x20object\x20'+'ID\x20is\x20permanently\x20invalid\x20and\x20all\x20tags\x20are\x20lost.','affected_stakeholders':['owner'],'scenario':'Caller\x20destroys\x20a\x20Resource\x20that\x20is\x20still\x20referenced\x20by\x20Personal/Entity','mitigation':'Confirm\x20no\x20live\x20references\x20exist\x20before\x20calling\x20destroy.\x20SDK\x20should\x20refuse\x20to\x20destroy\x20'+'a\x20Resource\x20whose\x20owner\x20address\x20is\x20still\x20referenced\x20by\x20Personal.mark\x20or\x20Entity.resource.','auto_fixable':![]},'check':a=>{if(!a['is_destroy'])return null;return{...R_R_04['rule'],'evidence':'is_destroy=true\x20(irreversible)'};}},R_R_05={'rule':{'id':'R-RESOURCE-05','level':'MEDIUM','category':'semantic','title':'tag_set\x20returns\x20bool\x20—\x20SDK\x20may\x20ignore\x20the\x20\x27already\x20exists\x27\x20signal','description':'tag_set(resource,\x20object,\x20name)\x20returns\x20bool:\x20true\x20if\x20a\x20new\x20tag\x20was\x20added,\x20false\x20if\x20'+'the\x20tag\x20already\x20existed\x20(resource.move:47-58).\x20If\x20the\x20SDK\x20ignores\x20the\x20return\x20value,\x20'+'callers\x20cannot\x20distinguish\x20\x27newly\x20added\x27\x20from\x20\x27duplicate\x20silently\x20skipped\x27.\x20This\x20'+'masks\x20intent\x20and\x20complicates\x20idempotency\x20reasoning.','affected_stakeholders':['caller'],'scenario':'SDK\x20treats\x20tag_set\x20as\x20void;\x20caller\x20assumes\x20tag\x20was\x20added\x20when\x20it\x20was\x20a\x20duplicate','mitigation':'SDK\x20should\x20expose\x20tag_set\x27s\x20bool\x20return\x20value\x20to\x20the\x20caller.\x20UI\x20should\x20show\x20\x27tag\x20'+'already\x20existed\x27\x20when\x20false\x20is\x20returned.','auto_fixable':!![]},'check':a=>{if(!a['tag_set_return_ignored'])return null;return{...R_R_05['rule'],'evidence':'tag_set_return_ignored=true\x20(duplicate\x20not\x20surfaced)'};}},R_R_06={'rule':{'id':'R-RESOURCE-06','level':'LOW','category':'semantic','title':'Commented-out\x20switch\x20function\x20(resource.move:71-86)\x20—\x20feature\x20may\x20be\x20intended','description':'resource.move:71-86\x20contains\x20a\x20switch\x20function\x20that\x20is\x20fully\x20commented\x20out.\x20The\x20'+'intended\x20behavior\x20is\x20unclear\x20—\x20it\x20may\x20be\x20a\x20planned\x20feature\x20(e.g.\x20bulk\x20tag\x20operations)\x20'+'that\x20was\x20disabled.\x20Referencing\x20it\x20as\x20if\x20it\x20were\x20live\x20would\x20silently\x20fail.','affected_stakeholders':['system'],'scenario':'Developer\x20reads\x20the\x20commented\x20switch\x20and\x20assumes\x20it\x20is\x20callable','mitigation':'Confirm\x20with\x20the\x20package\x20maintainers\x20whether\x20the\x20switch\x20should\x20be\x20enabled\x20or\x20removed.\x20'+'Do\x20not\x20reference\x20it\x20in\x20SDK\x20or\x20MCP\x20code.','auto_fixable':![]},'check':a=>{if(!a['references_dead_switch'])return null;return{...R_R_06['rule'],'evidence':'references_dead_switch=true\x20(commented\x20out\x20in\x20Move)'};}};export const RESOURCE_RISK_RULES=[R_R_01,R_R_02,R_R_03,R_R_04,R_R_05,R_R_06];export const RESOURCE_RISK_VERSION='1.0.0';export function checkResourceRisks(a){const b=[];for(const c of RESOURCE_RISK_RULES){const d=c['check'](a);if(d)b['push'](d);}return b;}export function getResourceRiskById(a){return RESOURCE_RISK_RULES['find'](b=>b['rule']['id']===a)?.['rule'];}
1
+ import{MAX_TAGS_COUNT}from'@wowok/wowok';const R_R_01={'rule':{'id':'R-RESOURCE-01','level':'LOW','category':'permission','title':'Resource\x20has\x20no\x20Permission\x20—\x20relies\x20entirely\x20on\x20caller-side\x20gating','description':'Resource\x20does\x20not\x20associate\x20with\x20a\x20Permission\x20object.\x20All\x20functions\x20are\x20'+'public(package)\x20(new/destroy/transfer/tag_set/tag_unset)\x20or\x20public\x20'+'(add_object_tags/remove_object_tags/remove_object)\x20—\x20there\x20is\x20no\x20on-chain\x20permission\x20'+'check.\x20Access\x20control\x20is\x20delegated\x20to\x20the\x20calling\x20module\x20(Personal,\x20Entity).\x20A\x20'+'caller\x20that\x20forgets\x20to\x20enforce\x20its\x20own\x20permission\x20check\x20would\x20let\x20any\x20address\x20mutate\x20'+'tags.','affected_stakeholders':['owner','caller'],'scenario':'Personal/Entity\x20forgets\x20to\x20gate\x20add_object_tags\x20behind\x20its\x20own\x20permission\x20check','mitigation':'Callers\x20(Personal,\x20Entity)\x20MUST\x20enforce\x20their\x20own\x20permission\x20checks\x20before\x20invoking\x20'+'Resource\x20functions.\x20Audit\x20the\x20call\x20sites\x20in\x20Personal/Entity\x20to\x20confirm\x20gating.','auto_fixable':![]},'check':a=>{if(!a['expects_resource_permission'])return null;return{...R_R_01['rule'],'evidence':'expects_resource_permission=true\x20(Resource\x20has\x20none)'};}},R_R_02={'rule':{'id':'R-RESOURCE-02','level':'MEDIUM','category':'semantic','title':'Tag\x20mutations\x20emit\x20no\x20events\x20—\x20external\x20indexers\x20must\x20poll','description':'add_object_tags\x20/\x20remove_object_tags\x20/\x20remove_object\x20do\x20not\x20emit\x20events\x20'+'(resource.move:89-145).\x20External\x20indexers\x20cannot\x20rely\x20on\x20an\x20event\x20stream\x20to\x20track\x20'+'tag\x20changes;\x20they\x20must\x20poll\x20the\x20ParentTable\x20field.\x20This\x20complicates\x20real-time\x20'+'notification\x20and\x20consistency.','affected_stakeholders':['owner','caller'],'scenario':'Indexer\x20expects\x20a\x20TagAddedEvent\x20but\x20none\x20is\x20emitted;\x20UI\x20fails\x20to\x20refresh','mitigation':'External\x20indexers\x20should\x20poll\x20Resource.table\x20on\x20a\x20cadence.\x20Do\x20not\x20build\x20critical\x20UX\x20'+'on\x20tag\x20event\x20streams\x20until\x20events\x20are\x20added\x20in\x20a\x20future\x20version.','auto_fixable':![]},'check':a=>{if(!a['expects_tag_events'])return null;return{...R_R_02['rule'],'evidence':'expects_tag_events=true\x20(no\x20events\x20emitted)'};}},R_R_03={'rule':{'id':'R-RESOURCE-03','level':'LOW','category':'structural','title':'MAX_TAGS_COUNT='+MAX_TAGS_COUNT+'\x20permissive\x20—\x20storage\x20cost','description':'A\x20single\x20object\x27s\x20AddressTag.tags\x20vector\x20may\x20hold\x20up\x20to\x20MAX_TAGS_COUNT='+MAX_TAGS_COUNT+'\x20'+'entries\x20(resource.move:9).\x20The\x20limit\x20aborts\x20with\x20E_TAGS_COUNT_EXCEEDED\x20(1)\x20only\x20at\x20the\x20'+'boundary.\x20100\x20tags\x20per\x20object\x20is\x20generous;\x20loading\x20all\x20tags\x20on\x20every\x20read\x20increases\x20'+'gas\x20and\x20storage\x20cost.','affected_stakeholders':['owner'],'scenario':'Caller\x20adds\x20100\x20tags\x20to\x20a\x20single\x20object','mitigation':'Business\x20layer\x20should\x20self-limit\x20tag\x20count\x20well\x20below\x20100.\x20For\x20heavy\x20tagging,\x20'+'shard\x20across\x20multiple\x20Resource\x20objects\x20or\x20store\x20bulk\x20tags\x20off-chain.','related_move_error':'E_TAGS_COUNT_EXCEEDED\x20(1)','auto_fixable':![]},'check':a=>{if(a['tags_count']===undefined)return null;if(a['tags_count']<MAX_TAGS_COUNT)return null;return{...R_R_03['rule'],'evidence':'tags_count='+a['tags_count']+',\x20limit='+MAX_TAGS_COUNT};}},R_R_04={'rule':{'id':'R-RESOURCE-04','level':'LOW','category':'lifecycle','title':'destroy\x20is\x20irreversible\x20—\x20no\x20recovery\x20mechanism','description':'Resource.destroy(resource)\x20(resource.move:38)\x20deletes\x20the\x20object\x20and\x20its\x20ParentTable\x20'+'in\x20place.\x20There\x20is\x20no\x20archive,\x20no\x20event,\x20and\x20no\x20rollback.\x20Once\x20destroyed,\x20the\x20object\x20'+'ID\x20is\x20permanently\x20invalid\x20and\x20all\x20tags\x20are\x20lost.','affected_stakeholders':['owner'],'scenario':'Caller\x20destroys\x20a\x20Resource\x20that\x20is\x20still\x20referenced\x20by\x20Personal/Entity','mitigation':'Confirm\x20no\x20live\x20references\x20exist\x20before\x20calling\x20destroy.\x20SDK\x20should\x20refuse\x20to\x20destroy\x20'+'a\x20Resource\x20whose\x20owner\x20address\x20is\x20still\x20referenced\x20by\x20Personal.mark\x20or\x20Entity.resource.','auto_fixable':![]},'check':a=>{if(!a['is_destroy'])return null;return{...R_R_04['rule'],'evidence':'is_destroy=true\x20(irreversible)'};}},R_R_05={'rule':{'id':'R-RESOURCE-05','level':'MEDIUM','category':'semantic','title':'tag_set\x20returns\x20bool\x20—\x20SDK\x20may\x20ignore\x20the\x20\x27already\x20exists\x27\x20signal','description':'tag_set(resource,\x20object,\x20name)\x20returns\x20bool:\x20true\x20if\x20a\x20new\x20tag\x20was\x20added,\x20false\x20if\x20'+'the\x20tag\x20already\x20existed\x20(resource.move:47-58).\x20If\x20the\x20SDK\x20ignores\x20the\x20return\x20value,\x20'+'callers\x20cannot\x20distinguish\x20\x27newly\x20added\x27\x20from\x20\x27duplicate\x20silently\x20skipped\x27.\x20This\x20'+'masks\x20intent\x20and\x20complicates\x20idempotency\x20reasoning.','affected_stakeholders':['caller'],'scenario':'SDK\x20treats\x20tag_set\x20as\x20void;\x20caller\x20assumes\x20tag\x20was\x20added\x20when\x20it\x20was\x20a\x20duplicate','mitigation':'SDK\x20should\x20expose\x20tag_set\x27s\x20bool\x20return\x20value\x20to\x20the\x20caller.\x20UI\x20should\x20show\x20\x27tag\x20'+'already\x20existed\x27\x20when\x20false\x20is\x20returned.','auto_fixable':!![]},'check':a=>{if(!a['tag_set_return_ignored'])return null;return{...R_R_05['rule'],'evidence':'tag_set_return_ignored=true\x20(duplicate\x20not\x20surfaced)'};}},R_R_06={'rule':{'id':'R-RESOURCE-06','level':'LOW','category':'semantic','title':'Commented-out\x20switch\x20function\x20(resource.move:71-86)\x20—\x20feature\x20may\x20be\x20intended','description':'resource.move:71-86\x20contains\x20a\x20switch\x20function\x20that\x20is\x20fully\x20commented\x20out.\x20The\x20'+'intended\x20behavior\x20is\x20unclear\x20—\x20it\x20may\x20be\x20a\x20planned\x20feature\x20(e.g.\x20bulk\x20tag\x20operations)\x20'+'that\x20was\x20disabled.\x20Referencing\x20it\x20as\x20if\x20it\x20were\x20live\x20would\x20silently\x20fail.','affected_stakeholders':['system'],'scenario':'Developer\x20reads\x20the\x20commented\x20switch\x20and\x20assumes\x20it\x20is\x20callable','mitigation':'Confirm\x20with\x20the\x20package\x20maintainers\x20whether\x20the\x20switch\x20should\x20be\x20enabled\x20or\x20removed.\x20'+'Do\x20not\x20reference\x20it\x20in\x20SDK\x20or\x20MCP\x20code.','auto_fixable':![]},'check':a=>{if(!a['references_dead_switch'])return null;return{...R_R_06['rule'],'evidence':'references_dead_switch=true\x20(commented\x20out\x20in\x20Move)'};}};export const RESOURCE_RISK_RULES=[R_R_01,R_R_02,R_R_03,R_R_04,R_R_05,R_R_06];export const RESOURCE_RISK_VERSION='1.0.0';export function checkResourceRisks(a){const b=[];for(const c of RESOURCE_RISK_RULES){const d=c['check'](a);if(d)b['push'](d);}return b;}