@wowok/agent-mcp 2.7.3 → 2.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/evaluation/builtins/arbitration-score.d.ts +1 -1
  2. package/dist/evaluation/builtins/arbitration-score.js +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/knowledge/arbitration-ledger.js +1 -1
  5. package/dist/knowledge/demand-confirm.js +1 -1
  6. package/dist/knowledge/demand-risk.js +1 -1
  7. package/dist/knowledge/demand-translation.js +1 -1
  8. package/dist/knowledge/guard-design-patterns.js +1 -1
  9. package/dist/knowledge/index.d.ts +2 -2
  10. package/dist/knowledge/index.js +1 -1
  11. package/dist/knowledge/onchain-constants.d.ts +2 -2
  12. package/dist/knowledge/onchain-constants.js +1 -1
  13. package/dist/knowledge/payment-risk.js +1 -1
  14. package/dist/knowledge/permission-context.d.ts +11 -0
  15. package/dist/knowledge/permission-context.js +1 -1
  16. package/dist/knowledge/personal-risk.js +1 -1
  17. package/dist/knowledge/progress-ledger.js +1 -1
  18. package/dist/knowledge/progress-risk.js +1 -1
  19. package/dist/knowledge/progress-templates.js +1 -1
  20. package/dist/knowledge/progress-translation.js +1 -1
  21. package/dist/knowledge/registrar-risk.js +1 -1
  22. package/dist/knowledge/registrar-translation.js +1 -1
  23. package/dist/knowledge/reward-ledger.js +1 -1
  24. package/dist/knowledge/reward-translation.js +1 -1
  25. package/dist/knowledge/tools-reference.js +1 -1
  26. package/dist/knowledge/treasury-context.d.ts +1 -1
  27. package/dist/knowledge/treasury-context.js +1 -1
  28. package/dist/knowledge/treasury-ledger.js +1 -1
  29. package/dist/knowledge/treasury-risk.js +1 -1
  30. package/dist/knowledge/util-confirm.js +1 -1
  31. package/dist/knowledge/util-risk.js +1 -1
  32. package/dist/knowledge/util-translation.d.ts +3 -2
  33. package/dist/knowledge/util-translation.js +1 -1
  34. package/dist/knowledge/workflow-guidance.d.ts +64 -0
  35. package/dist/knowledge/workflow-guidance.js +1 -1
  36. package/dist/project/evaluation.js +1 -1
  37. package/dist/project/graph-builder.d.ts +2 -2
  38. package/dist/project/graph-builder.js +1 -1
  39. package/dist/project/semantic-assembler.d.ts +2 -2
  40. package/dist/project/semantic-assembler.js +1 -1
  41. package/dist/schema/evaluation/index.d.ts +1 -1
  42. package/dist/schema/evaluation/index.js +1 -1
  43. package/dist/schema/index.d.ts +2 -0
  44. package/dist/schema/index.js +1 -1
  45. package/dist/schema/operations.d.ts +251 -2
  46. package/dist/schema/operations.js +1 -1
  47. package/dist/schema/permission/index.d.ts +121 -0
  48. package/dist/schema/permission/index.js +1 -0
  49. package/dist/schema/query/index.d.ts +223 -22
  50. package/dist/schema/query/index.js +1 -1
  51. package/dist/schema/schema-version.js +1 -1
  52. package/dist/schema/workflow/index.d.ts +161 -0
  53. package/dist/schema/workflow/index.js +1 -0
  54. package/dist/schema-query-impl/index.js +1 -1
  55. package/dist/schemas/evaluation_operation.schema.json +2 -2
  56. package/dist/schemas/index.json +13 -1
  57. package/dist/schemas/onchain_table_data.output.json +821 -5
  58. package/dist/schemas/onchain_table_data.schema.json +154 -1
  59. package/dist/schemas/permission_operation.output.json +173 -0
  60. package/dist/schemas/permission_operation.schema.json +39 -0
  61. package/dist/schemas/query_toolkit.output.json +15 -15
  62. package/dist/schemas/workflow_operation.output.json +164 -0
  63. package/dist/schemas/workflow_operation.schema.json +116 -0
  64. package/dist/tools/handlers/config.js +1 -1
  65. package/dist/tools/handlers/evaluation.js +1 -1
  66. package/dist/tools/handlers/onchain.js +1 -1
  67. package/dist/tools/handlers/permission.d.ts +2 -0
  68. package/dist/tools/handlers/permission.js +1 -0
  69. package/dist/tools/handlers/query.js +1 -1
  70. package/dist/tools/handlers/workflow.d.ts +2 -0
  71. package/dist/tools/handlers/workflow.js +1 -0
  72. package/dist/tools/handlers/workspace.d.ts +2 -0
  73. package/dist/tools/handlers/workspace.js +1 -1
  74. package/dist/tools/index.js +1 -1
  75. package/dist/tools/shared.js +1 -1
  76. package/package.json +2 -2
@@ -1 +1 @@
1
- import{MAX_RECIPIENT_COUNT}from'@wowok/wowok';const R_P_01={'rule':{'id':'R-PAYMENT-01','level':'HIGH','category':'permission','title':'unwrap()\x20performs\x20no\x20Payment\x20match\x20check\x20—\x20may\x20unwrap\x20wrong\x20CoinWrapper','description':'unwrap(wrapper,\x20ctx)\x20(payment.move:50)\x20returns\x20(Coin,\x20payment_address)\x20without\x20'+'verifying\x20that\x20wrapper.payment\x20matches\x20any\x20expected\x20Payment.\x20Callers\x20who\x20use\x20unwrap\x20'+'instead\x20of\x20unwrap_with_check\x20can\x20unwrap\x20a\x20CoinWrapper\x20that\x20was\x20minted\x20for\x20a\x20different\x20'+'Payment,\x20leading\x20to\x20fund\x20loss\x20or\x20accounting\x20corruption.\x20unwrap_with_check(payment_check)\x20'+'exists\x20specifically\x20to\x20enforce\x20the\x20match\x20(payment.move:54).','affected_stakeholders':['signer','recipient'],'scenario':'Caller\x20uses\x20unwrap\x20on\x20a\x20wrapper\x20from\x20a\x20different\x20Payment;\x20funds\x20are\x20released\x20anyway','mitigation':'SDK\x20should\x20force\x20callers\x20to\x20use\x20unwrap_with_check\x20and\x20deprecate\x20direct\x20unwrap\x20calls.\x20'+'The\x20only\x20safe\x20use\x20of\x20unwrap\x20is\x20when\x20the\x20caller\x20has\x20already\x20verified\x20the\x20match\x20off-chain.','related_move_error':'EPAYMENT_NOT_MATCH\x20(3)\x20—\x20only\x20raised\x20by\x20unwrap_with_check','auto_fixable':![]},'check':a=>{if(!a['uses_unsafe_unwrap'])return null;return{...R_P_01['rule'],'evidence':'uses_unsafe_unwrap=true\x20(no\x20Payment\x20match\x20check)'};}},R_P_02={'rule':{'id':'R-PAYMENT-02','level':'MEDIUM','category':'structural','title':'MAX_RECIPIENT_COUNT='+MAX_RECIPIENT_COUNT+'\x20permissive\x20—\x20gas\x20and\x20confirmation\x20cost','description':'A\x20single\x20Payment\x20may\x20carry\x20up\x20to\x20MAX_RECIPIENT_COUNT='+MAX_RECIPIENT_COUNT+'\x20recipients\x20'+'(payment.move:14).\x20The\x20limit\x20aborts\x20with\x20ERECIPIENT_COUNT_EXCEEDED\x20(1)\x20only\x20at\x20the\x20boundary.\x20'+'200\x20recipients\x20in\x20one\x20transaction\x20inflates\x20gas,\x20slows\x20finalization,\x20and\x20complicates\x20'+'retry\x20on\x20partial\x20failure.','affected_stakeholders':['signer','recipient'],'scenario':'Caller\x20submits\x20a\x20Payment\x20with\x20200\x20recipients;\x20transaction\x20is\x20heavy\x20and\x20slow','mitigation':'Business\x20layer\x20should\x20self-limit\x20recipient\x20count\x20(e.g.\x20≤50).\x20For\x20mass\x20payouts,\x20split\x20'+'across\x20multiple\x20Payment\x20objects\x20in\x20separate\x20transactions.','related_move_error':'ERECIPIENT_COUNT_EXCEEDED\x20(1)','auto_fixable':![]},'check':a=>{if(a['recipient_count']===undefined)return null;if(a['recipient_count']<MAX_RECIPIENT_COUNT)return null;return{...R_P_02['rule'],'evidence':'recipient_count='+a['recipient_count']+',\x20limit='+MAX_RECIPIENT_COUNT};}},R_P_03={'rule':{'id':'R-PAYMENT-03','level':'LOW','category':'lifecycle','title':'Payment\x20is\x20immutable\x20after\x20create\x20—\x20errors\x20cannot\x20be\x20corrected','description':'create()\x20calls\x20transfer::freeze_object(payment)\x20(payment.move:160).\x20All\x20fields\x20'+'(amount,\x20time,\x20info,\x20from_object,\x20signer,\x20record)\x20are\x20permanently\x20fixed.\x20There\x20is\x20no\x20'+'update,\x20refund,\x20or\x20void\x20API\x20on\x20the\x20Payment\x20object\x20itself\x20—\x20correction\x20requires\x20a\x20new\x20'+'Payment\x20(and\x20off-chain\x20reconciliation).','affected_stakeholders':['signer','consumer'],'scenario':'Signer\x20mistypes\x20a\x20recipient\x20address;\x20the\x20Payment\x20cannot\x20be\x20edited\x20post-create','mitigation':'Verify\x20all\x20fields\x20before\x20calling\x20create.\x20For\x20refunds,\x20create\x20a\x20new\x20Payment\x20in\x20the\x20'+'opposite\x20direction.\x20Off-chain\x20systems\x20should\x20treat\x20Payment\x20as\x20an\x20immutable\x20receipt.','auto_fixable':![]},'check':a=>{if(!a['expects_mutation'])return null;return{...R_P_03['rule'],'evidence':'expects_mutation=true\x20(Payment\x20is\x20frozen\x20at\x20create)'};}},R_P_04={'rule':{'id':'R-PAYMENT-04','level':'MEDIUM','category':'structural','title':'CoinWrapper\x20suppresses\x20coin_field\x20lint\x20—\x20Balance<T>\x20stored\x20in\x20a\x20struct\x20field','description':'CoinWrapper<phantom\x20T>\x20stores\x20Balance<T>\x20directly\x20in\x20a\x20struct\x20field\x20and\x20uses\x20'+'#[allow(lint(coin_field))]\x20to\x20suppress\x20the\x20Wow\x20lint\x20(payment.move:43-48).\x20The\x20lint\x20'+'normally\x20warns\x20against\x20storing\x20Balance\x20in\x20arbitrary\x20structs\x20because\x20of\x20object\x20'+'lifecycle\x20concerns.\x20The\x20suppression\x20is\x20intentional\x20but\x20should\x20be\x20reviewed\x20whenever\x20'+'the\x20Wow\x20framework\x20updates\x20its\x20coin_field\x20rules.','affected_stakeholders':['system'],'scenario':'Wow\x20framework\x20tightens\x20coin_field\x20lint\x20semantics;\x20CoinWrapper\x20becomes\x20non-compliant','mitigation':'Review\x20the\x20coin_field\x20suppression\x20on\x20each\x20Wow\x20upgrade.\x20Confirm\x20that\x20Balance<T>\x20'+'ownership\x20transfer\x20in\x20unwrap/unwrap_with_check\x20is\x20correct.','auto_fixable':![]},'check':a=>{if(a['coin_field_lint_reviewed'])return null;return{...R_P_04['rule'],'evidence':'coin_field_lint_reviewed=false\x20(needs\x20review)'};}},R_P_05={'rule':{'id':'R-PAYMENT-05','level':'LOW','category':'semantic','title':'PaymentInfo\x20has\x204\x20constructor\x20variants\x20—\x20caller\x20may\x20pick\x20the\x20wrong\x20one','description':'PaymentInfo\x20can\x20be\x20built\x20via\x20payment_info\x20(for_object+remark+index),\x20payment_info2\x20'+'(remark+index,\x20no\x20for_object),\x20payment_info_with_guard\x20(for_object+for_guard+remark+index),\x20'+'or\x20payment_info2_with_guard\x20(for_guard+remark+index,\x20no\x20for_object).\x20Selecting\x20the\x20'+'wrong\x20variant\x20leaves\x20for_object/for_guard\x20as\x20None,\x20breaking\x20downstream\x20lookups.','affected_stakeholders':['signer','consumer'],'scenario':'Caller\x20uses\x20payment_info2\x20when\x20they\x20meant\x20payment_info_with_guard;\x20for_object\x20is\x20lost','mitigation':'Document\x20each\x20variant\x27s\x20use\x20case\x20clearly.\x20SDK\x20should\x20pick\x20the\x20variant\x20automatically\x20'+'based\x20on\x20which\x20optional\x20fields\x20the\x20caller\x20provides.','auto_fixable':!![]},'check':a=>null},R_P_06={'rule':{'id':'R-PAYMENT-06','level':'MEDIUM','category':'cross_object','title':'Registrar\x20registration\x20filters\x20recipients\x20by\x20is_object_address\x20—\x20user\x20addresses\x20skipped','description':'create()\x20iterates\x20recipients\x20and\x20only\x20calls\x20registrar.affiliation\x20for\x20addresses\x20that\x20'+'pass\x20util::is_object_address\x20(payment.move:147-161).\x20User\x20addresses\x20(EOAs)\x20are\x20not\x20'+'registered\x20in\x20the\x20Registrar\x20dependency\x20graph.\x20Callers\x20who\x20expect\x20every\x20recipient\x20to\x20'+'appear\x20in\x20affiliation\x20queries\x20will\x20miss\x20EOA\x20recipients.','affected_stakeholders':['signer','consumer'],'scenario':'Caller\x20queries\x20Registrar\x20for\x20all\x20Payment\x20recipients;\x20EOA\x20recipients\x20are\x20missing','mitigation':'Document\x20that\x20affiliation\x20is\x20registered\x20only\x20for\x20object-address\x20recipients.\x20Off-chain\x20'+'systems\x20should\x20track\x20EOA\x20recipients\x20via\x20the\x20NewPaymentEvent\x20record,\x20not\x20via\x20Registrar.','auto_fixable':![]},'check':a=>{if(!a['expects_user_recipient_registered'])return null;return{...R_P_06['rule'],'evidence':'expects_user_recipient_registered=true\x20(EOAs\x20are\x20skipped)'};}},R_P_07={'rule':{'id':'R-PAYMENT-07','level':'LOW','category':'semantic','title':'Payment.signer\x20records\x20payer\x20—\x20useful\x20for\x20provenance\x20but\x20not\x20authorization','description':'Payment.signer\x20is\x20set\x20to\x20ctx.sender()\x20at\x20creation\x20(payment.move).\x20It\x20can\x20be\x20read\x20via\x20'+'payment_signer<T>(payment)\x20for\x20provenance\x20(e.g.\x20\x27who\x20paid\x20for\x20this\x20order\x27).\x20It\x20is\x20'+'purely\x20informational\x20—\x20it\x20does\x20NOT\x20authorize\x20any\x20later\x20operation.\x20Consumers\x20must\x20not\x20'+'treat\x20signer\x20as\x20a\x20permission\x20grant.','affected_stakeholders':['consumer'],'scenario':'Consumer\x20treats\x20Payment.signer\x20as\x20authorizing\x20a\x20refund;\x20signer\x20is\x20just\x20provenance','mitigation':'Use\x20Payment.signer\x20only\x20for\x20audit/provenance.\x20Authorization\x20must\x20come\x20from\x20the\x20'+'referencing\x20object\x27s\x20own\x20Permission,\x20not\x20from\x20Payment.signer.','auto_fixable':![]},'check':a=>{if(!a['uses_signer_for_provenance'])return null;return{...R_P_07['rule'],'evidence':'uses_signer_for_provenance=true\x20(informational\x20only)'};}},R_P_08={'rule':{'id':'R-PAYMENT-08','level':'MEDIUM','category':'semantic','title':'Payment\x20scene\x20binding\x20(for_object\x20+\x20for_guard\x20+\x20index)\x20—\x20anti-reuse\x20for\x20exception\x20branches','description':'PaymentInfo\x20supports\x20for_object\x20(binds\x20to\x20specific\x20Order),\x20for_guard\x20(binds\x20to\x20specific\x20Guard),\x20'+'and\x20index\x20(binds\x20to\x20specific\x20Progress\x20step)\x20—\x20payment.move#L66-71.\x20When\x20all\x20three\x20are\x20set\x20via\x20'+'payment_info_with_guard\x20(payment.move#L82-86),\x20the\x20Payment\x20is\x20scene-bound:\x20it\x20can\x20ONLY\x20be\x20used\x20'+'in\x20the\x20specific\x20order\x20+\x20guard\x20+\x20progress\x20context.\x20This\x20is\x20the\x20anti-reuse\x20design\x20for\x20exception\x20'+'branch\x20compensation\x20(e.g.,\x20delivery\x20delay\x20>30min\x20triggers\x20auto-compensation).\x20'+'Payment\x20is\x20immutable\x20(freeze_object,\x20payment.move#L160)\x20—\x20binding\x20cannot\x20be\x20altered.\x20'+'VERIFIER-EVIDENCE\x20DESIGN:\x20customer\x20submits\x20Payment,\x20Guard\x20verifies\x20binding\x20fields\x20match\x20current\x20context.','affected_stakeholders':['signer','recipient','consumer'],'scenario':'Treasury\x20creates\x20compensation\x20Payment\x20with\x20PaymentInfo(for_object=order,\x20for_guard=exception_guard,\x20index=current_progress)\x20for\x20delivery\x20delay','mitigation':'Use\x20payment_info_with_guard\x20for\x20all\x20exception\x20branch\x20Payments.\x20Ensure\x20for_object,\x20for_guard,\x20and\x20index\x20'+'all\x20match\x20the\x20intended\x20context.\x20Use\x20tpl_payment_exception_compensation\x20(guard-templates.ts)\x20as\x20design\x20template.','auto_fixable':![]},'check':a=>{if(!a['uses_scene_binding'])return null;const b=[];if(!a['has_for_object'])b['push']('for_object\x20not\x20set\x20(Order\x20binding\x20missing)');if(!a['has_for_guard'])b['push']('for_guard\x20not\x20set\x20(Guard\x20binding\x20missing)');if(!a['has_index'])b['push']('index\x20not\x20set\x20(Progress\x20step\x20binding\x20missing)');if(b['length']===0x0)return null;return{...R_P_08['rule'],'evidence':'incomplete\x20scene\x20binding:\x20'+b['join'](',\x20')};}},R_P_09={'rule':{'id':'R-PAYMENT-09','level':'LOW','category':'semantic','title':'PaymentInfo\x20variant\x20selection\x20—\x20use\x20payment_info_with_guard\x20for\x20exception\x20branches','description':'PaymentInfo\x20has\x204\x20constructor\x20variants\x20(payment.move#L66-86):\x20'+'payment_info\x20(for_object+remark+index,\x20no\x20for_guard),\x20'+'payment_info2\x20(remark+index,\x20no\x20for_object/for_guard),\x20'+'payment_info_with_guard\x20(for_object+for_guard+remark+index\x20—\x20FULL\x20binding),\x20'+'payment_info2_with_guard\x20(for_guard+remark+index,\x20no\x20for_object).\x20'+'For\x20exception\x20branch\x20compensation,\x20ALWAYS\x20use\x20payment_info_with_guard\x20to\x20get\x20full\x20scene\x20binding.\x20'+'Using\x20payment_info\x20(without\x20for_guard)\x20or\x20payment_info2\x20(without\x20for_object)\x20weakens\x20anti-reuse\x20protection.','affected_stakeholders':['signer','consumer'],'scenario':'Caller\x20uses\x20payment_info\x20instead\x20of\x20payment_info_with_guard\x20for\x20exception\x20compensation;\x20for_guard\x20is\x20lost','mitigation':'For\x20exception\x20branch\x20Payments:\x20always\x20use\x20payment_info_with_guard(for_object,\x20for_guard,\x20remark,\x20index).\x20'+'For\x20simple\x20Payments\x20without\x20scene\x20binding:\x20payment_info\x20or\x20payment_info2\x20is\x20fine.\x20'+'SDK\x20should\x20auto-select\x20the\x20variant\x20based\x20on\x20which\x20fields\x20are\x20provided.','auto_fixable':!![]},'check':a=>{if(!a['uses_scene_binding'])return null;if(a['payment_info_variant']==='payment_info_with_guard')return null;return{...R_P_09['rule'],'evidence':'uses_scene_binding=true\x20but\x20variant='+(a['payment_info_variant']??'unknown')+'\x20(should\x20be\x20payment_info_with_guard)'};}};export const PAYMENT_RISK_RULES=[R_P_01,R_P_02,R_P_03,R_P_04,R_P_05,R_P_06,R_P_07,R_P_08,R_P_09];export const PAYMENT_RISK_VERSION='1.0.0';export function checkPaymentRisks(a){const b=[];for(const c of PAYMENT_RISK_RULES){const d=c['check'](a);if(d)b['push'](d);}return!b['find'](e=>e['id']==='R-PAYMENT-05')&&b['push'](R_P_05['rule']),b;}export function getPaymentRiskById(a){return PAYMENT_RISK_RULES['find'](b=>b['rule']['id']===a)?.['rule'];}
1
+ import{MAX_RECIPIENT_COUNT}from'@wowok/wowok';const R_P_01={'rule':{'id':'R-PAYMENT-01','level':'HIGH','category':'permission','title':'unwrap()\x20performs\x20no\x20Payment\x20match\x20check\x20—\x20may\x20unwrap\x20wrong\x20CoinWrapper','description':'unwrap(wrapper,\x20ctx)\x20(payment.move:50)\x20returns\x20(Coin,\x20payment_address)\x20without\x20'+'verifying\x20that\x20wrapper.payment\x20matches\x20any\x20expected\x20Payment.\x20Callers\x20who\x20use\x20unwrap\x20'+'instead\x20of\x20unwrap_with_check\x20can\x20unwrap\x20a\x20CoinWrapper\x20that\x20was\x20minted\x20for\x20a\x20different\x20'+'Payment,\x20leading\x20to\x20fund\x20loss\x20or\x20accounting\x20corruption.\x20unwrap_with_check(payment_check)\x20'+'exists\x20specifically\x20to\x20enforce\x20the\x20match\x20(payment.move:54).','affected_stakeholders':['signer','recipient'],'scenario':'Caller\x20uses\x20unwrap\x20on\x20a\x20wrapper\x20from\x20a\x20different\x20Payment;\x20funds\x20are\x20released\x20anyway','mitigation':'SDK\x20should\x20force\x20callers\x20to\x20use\x20unwrap_with_check\x20and\x20deprecate\x20direct\x20unwrap\x20calls.\x20'+'The\x20only\x20safe\x20use\x20of\x20unwrap\x20is\x20when\x20the\x20caller\x20has\x20already\x20verified\x20the\x20match\x20off-chain.','related_move_error':'EPAYMENT_NOT_MATCH\x20(3)\x20—\x20only\x20raised\x20by\x20unwrap_with_check','auto_fixable':![]},'check':a=>{if(!a['uses_unsafe_unwrap'])return null;return{...R_P_01['rule'],'evidence':'uses_unsafe_unwrap=true\x20(no\x20Payment\x20match\x20check)'};}},R_P_02={'rule':{'id':'R-PAYMENT-02','level':'MEDIUM','category':'structural','title':'MAX_RECIPIENT_COUNT='+MAX_RECIPIENT_COUNT+'\x20permissive\x20—\x20gas\x20and\x20confirmation\x20cost','description':'A\x20single\x20Payment\x20may\x20carry\x20up\x20to\x20MAX_RECIPIENT_COUNT='+MAX_RECIPIENT_COUNT+'\x20recipients\x20'+'(payment.move:14).\x20The\x20limit\x20aborts\x20with\x20ERECIPIENT_COUNT_EXCEEDED\x20(1)\x20only\x20at\x20the\x20boundary.\x20'+'200\x20recipients\x20in\x20one\x20transaction\x20inflates\x20gas,\x20slows\x20finalization,\x20and\x20complicates\x20'+'retry\x20on\x20partial\x20failure.','affected_stakeholders':['signer','recipient'],'scenario':'Caller\x20submits\x20a\x20Payment\x20with\x20200\x20recipients;\x20transaction\x20is\x20heavy\x20and\x20slow','mitigation':'Business\x20layer\x20should\x20self-limit\x20recipient\x20count\x20(e.g.\x20≤50).\x20For\x20mass\x20payouts,\x20split\x20'+'across\x20multiple\x20Payment\x20objects\x20in\x20separate\x20transactions.','related_move_error':'ERECIPIENT_COUNT_EXCEEDED\x20(1)','auto_fixable':![]},'check':a=>{if(a['recipient_count']===undefined)return null;if(a['recipient_count']<MAX_RECIPIENT_COUNT)return null;return{...R_P_02['rule'],'evidence':'recipient_count='+a['recipient_count']+',\x20limit='+MAX_RECIPIENT_COUNT};}},R_P_03={'rule':{'id':'R-PAYMENT-03','level':'LOW','category':'lifecycle','title':'Payment\x20is\x20immutable\x20after\x20create\x20—\x20errors\x20cannot\x20be\x20corrected','description':'create()\x20calls\x20transfer::freeze_object(payment)\x20(payment.move:160).\x20All\x20fields\x20'+'(amount,\x20time,\x20info,\x20from_object,\x20signer,\x20record)\x20are\x20permanently\x20fixed.\x20There\x20is\x20no\x20'+'update,\x20refund,\x20or\x20void\x20API\x20on\x20the\x20Payment\x20object\x20itself\x20—\x20correction\x20requires\x20a\x20new\x20'+'Payment\x20(and\x20off-chain\x20reconciliation).','affected_stakeholders':['signer','consumer'],'scenario':'Signer\x20mistypes\x20a\x20recipient\x20address;\x20the\x20Payment\x20cannot\x20be\x20edited\x20post-create','mitigation':'Verify\x20all\x20fields\x20before\x20calling\x20create.\x20For\x20refunds,\x20create\x20a\x20new\x20Payment\x20in\x20the\x20'+'opposite\x20direction.\x20Off-chain\x20systems\x20should\x20treat\x20Payment\x20as\x20an\x20immutable\x20receipt.','auto_fixable':![]},'check':a=>{if(!a['expects_mutation'])return null;return{...R_P_03['rule'],'evidence':'expects_mutation=true\x20(Payment\x20is\x20frozen\x20at\x20create)'};}},R_P_04={'rule':{'id':'R-PAYMENT-04','level':'MEDIUM','category':'structural','title':'CoinWrapper\x20suppresses\x20coin_field\x20lint\x20—\x20Balance<T>\x20stored\x20in\x20a\x20struct\x20field','description':'CoinWrapper<phantom\x20T>\x20stores\x20Balance<T>\x20directly\x20in\x20a\x20struct\x20field\x20and\x20uses\x20'+'#[allow(lint(coin_field))]\x20to\x20suppress\x20the\x20Wow\x20lint\x20(payment.move:43-48).\x20The\x20lint\x20'+'normally\x20warns\x20against\x20storing\x20Balance\x20in\x20arbitrary\x20structs\x20because\x20of\x20object\x20'+'lifecycle\x20concerns.\x20The\x20suppression\x20is\x20intentional\x20but\x20should\x20be\x20reviewed\x20whenever\x20'+'the\x20Wow\x20framework\x20updates\x20its\x20coin_field\x20rules.','affected_stakeholders':['system'],'scenario':'Wow\x20framework\x20tightens\x20coin_field\x20lint\x20semantics;\x20CoinWrapper\x20becomes\x20non-compliant','mitigation':'Review\x20the\x20coin_field\x20suppression\x20on\x20each\x20Wow\x20upgrade.\x20Confirm\x20that\x20Balance<T>\x20'+'ownership\x20transfer\x20in\x20unwrap/unwrap_with_check\x20is\x20correct.','auto_fixable':![]},'check':a=>{if(a['coin_field_lint_reviewed'])return null;return{...R_P_04['rule'],'evidence':'coin_field_lint_reviewed=false\x20(needs\x20review)'};}},R_P_05={'rule':{'id':'R-PAYMENT-05','level':'LOW','category':'semantic','title':'PaymentInfo\x20has\x204\x20constructor\x20variants\x20—\x20caller\x20may\x20pick\x20the\x20wrong\x20one','description':'PaymentInfo\x20can\x20be\x20built\x20via\x20payment_info\x20(for_object+remark+index),\x20payment_info2\x20'+'(remark+index,\x20no\x20for_object),\x20payment_info_with_guard\x20(for_object+for_guard+remark+index),\x20'+'or\x20payment_info2_with_guard\x20(for_guard+remark+index,\x20no\x20for_object).\x20Selecting\x20the\x20'+'wrong\x20variant\x20leaves\x20for_object/for_guard\x20as\x20None,\x20breaking\x20downstream\x20lookups.','affected_stakeholders':['signer','consumer'],'scenario':'Caller\x20uses\x20payment_info2\x20when\x20they\x20meant\x20payment_info_with_guard;\x20for_object\x20is\x20lost','mitigation':'Document\x20each\x20variant\x27s\x20use\x20case\x20clearly.\x20SDK\x20should\x20pick\x20the\x20variant\x20automatically\x20'+'based\x20on\x20which\x20optional\x20fields\x20the\x20caller\x20provides.','auto_fixable':!![]},'check':a=>null},R_P_06={'rule':{'id':'R-PAYMENT-06','level':'MEDIUM','category':'cross_object','title':'object-linker\x20tx\x20registration\x20filters\x20recipients\x20by\x20is_object_address\x20—\x20user\x20addresses\x20skipped','description':'create()\x20iterates\x20recipients\x20and\x20only\x20calls\x20object_linker::affiliation_tx\x20for\x20addresses\x20that\x20'+'pass\x20util::is_object_address\x20(payment.move:147-161).\x20User\x20addresses\x20(EOAs)\x20are\x20not\x20'+'registered\x20in\x20the\x20object-linker\x20tx\x20index.\x20Callers\x20who\x20expect\x20every\x20recipient\x20to\x20'+'appear\x20in\x20object-linker\x20tx\x20queries\x20will\x20miss\x20EOA\x20recipients.','affected_stakeholders':['signer','consumer'],'scenario':'Caller\x20queries\x20object-linker\x20tx\x20for\x20all\x20Payment\x20recipients;\x20EOA\x20recipients\x20are\x20missing','mitigation':'Document\x20that\x20affiliation_tx\x20is\x20registered\x20only\x20for\x20object-address\x20recipients.\x20Off-chain\x20'+'systems\x20should\x20track\x20EOA\x20recipients\x20via\x20the\x20NewPaymentEvent\x20record,\x20not\x20via\x20object-linker\x20tx.','auto_fixable':![]},'check':a=>{if(!a['expects_user_recipient_registered'])return null;return{...R_P_06['rule'],'evidence':'expects_user_recipient_registered=true\x20(EOAs\x20are\x20skipped)'};}},R_P_07={'rule':{'id':'R-PAYMENT-07','level':'LOW','category':'semantic','title':'Payment.signer\x20records\x20payer\x20—\x20useful\x20for\x20provenance\x20but\x20not\x20authorization','description':'Payment.signer\x20is\x20set\x20to\x20ctx.sender()\x20at\x20creation\x20(payment.move).\x20It\x20can\x20be\x20read\x20via\x20'+'payment_signer<T>(payment)\x20for\x20provenance\x20(e.g.\x20\x27who\x20paid\x20for\x20this\x20order\x27).\x20It\x20is\x20'+'purely\x20informational\x20—\x20it\x20does\x20NOT\x20authorize\x20any\x20later\x20operation.\x20Consumers\x20must\x20not\x20'+'treat\x20signer\x20as\x20a\x20permission\x20grant.','affected_stakeholders':['consumer'],'scenario':'Consumer\x20treats\x20Payment.signer\x20as\x20authorizing\x20a\x20refund;\x20signer\x20is\x20just\x20provenance','mitigation':'Use\x20Payment.signer\x20only\x20for\x20audit/provenance.\x20Authorization\x20must\x20come\x20from\x20the\x20'+'referencing\x20object\x27s\x20own\x20Permission,\x20not\x20from\x20Payment.signer.','auto_fixable':![]},'check':a=>{if(!a['uses_signer_for_provenance'])return null;return{...R_P_07['rule'],'evidence':'uses_signer_for_provenance=true\x20(informational\x20only)'};}},R_P_08={'rule':{'id':'R-PAYMENT-08','level':'MEDIUM','category':'semantic','title':'Payment\x20scene\x20binding\x20(for_object\x20+\x20for_guard\x20+\x20index)\x20—\x20anti-reuse\x20for\x20exception\x20branches','description':'PaymentInfo\x20supports\x20for_object\x20(binds\x20to\x20specific\x20Order),\x20for_guard\x20(binds\x20to\x20specific\x20Guard),\x20'+'and\x20index\x20(binds\x20to\x20specific\x20Progress\x20step)\x20—\x20payment.move#L66-71.\x20When\x20all\x20three\x20are\x20set\x20via\x20'+'payment_info_with_guard\x20(payment.move#L82-86),\x20the\x20Payment\x20is\x20scene-bound:\x20it\x20can\x20ONLY\x20be\x20used\x20'+'in\x20the\x20specific\x20order\x20+\x20guard\x20+\x20progress\x20context.\x20This\x20is\x20the\x20anti-reuse\x20design\x20for\x20exception\x20'+'branch\x20compensation\x20(e.g.,\x20delivery\x20delay\x20>30min\x20triggers\x20auto-compensation).\x20'+'Payment\x20is\x20immutable\x20(freeze_object,\x20payment.move#L160)\x20—\x20binding\x20cannot\x20be\x20altered.\x20'+'VERIFIER-EVIDENCE\x20DESIGN:\x20customer\x20submits\x20Payment,\x20Guard\x20verifies\x20binding\x20fields\x20match\x20current\x20context.','affected_stakeholders':['signer','recipient','consumer'],'scenario':'Treasury\x20creates\x20compensation\x20Payment\x20with\x20PaymentInfo(for_object=order,\x20for_guard=exception_guard,\x20index=current_progress)\x20for\x20delivery\x20delay','mitigation':'Use\x20payment_info_with_guard\x20for\x20all\x20exception\x20branch\x20Payments.\x20Ensure\x20for_object,\x20for_guard,\x20and\x20index\x20'+'all\x20match\x20the\x20intended\x20context.\x20Use\x20tpl_payment_exception_compensation\x20(guard-templates.ts)\x20as\x20design\x20template.','auto_fixable':![]},'check':a=>{if(!a['uses_scene_binding'])return null;const b=[];if(!a['has_for_object'])b['push']('for_object\x20not\x20set\x20(Order\x20binding\x20missing)');if(!a['has_for_guard'])b['push']('for_guard\x20not\x20set\x20(Guard\x20binding\x20missing)');if(!a['has_index'])b['push']('index\x20not\x20set\x20(Progress\x20step\x20binding\x20missing)');if(b['length']===0x0)return null;return{...R_P_08['rule'],'evidence':'incomplete\x20scene\x20binding:\x20'+b['join'](',\x20')};}},R_P_09={'rule':{'id':'R-PAYMENT-09','level':'LOW','category':'semantic','title':'PaymentInfo\x20variant\x20selection\x20—\x20use\x20payment_info_with_guard\x20for\x20exception\x20branches','description':'PaymentInfo\x20has\x204\x20constructor\x20variants\x20(payment.move#L66-86):\x20'+'payment_info\x20(for_object+remark+index,\x20no\x20for_guard),\x20'+'payment_info2\x20(remark+index,\x20no\x20for_object/for_guard),\x20'+'payment_info_with_guard\x20(for_object+for_guard+remark+index\x20—\x20FULL\x20binding),\x20'+'payment_info2_with_guard\x20(for_guard+remark+index,\x20no\x20for_object).\x20'+'For\x20exception\x20branch\x20compensation,\x20ALWAYS\x20use\x20payment_info_with_guard\x20to\x20get\x20full\x20scene\x20binding.\x20'+'Using\x20payment_info\x20(without\x20for_guard)\x20or\x20payment_info2\x20(without\x20for_object)\x20weakens\x20anti-reuse\x20protection.','affected_stakeholders':['signer','consumer'],'scenario':'Caller\x20uses\x20payment_info\x20instead\x20of\x20payment_info_with_guard\x20for\x20exception\x20compensation;\x20for_guard\x20is\x20lost','mitigation':'For\x20exception\x20branch\x20Payments:\x20always\x20use\x20payment_info_with_guard(for_object,\x20for_guard,\x20remark,\x20index).\x20'+'For\x20simple\x20Payments\x20without\x20scene\x20binding:\x20payment_info\x20or\x20payment_info2\x20is\x20fine.\x20'+'SDK\x20should\x20auto-select\x20the\x20variant\x20based\x20on\x20which\x20fields\x20are\x20provided.','auto_fixable':!![]},'check':a=>{if(!a['uses_scene_binding'])return null;if(a['payment_info_variant']==='payment_info_with_guard')return null;return{...R_P_09['rule'],'evidence':'uses_scene_binding=true\x20but\x20variant='+(a['payment_info_variant']??'unknown')+'\x20(should\x20be\x20payment_info_with_guard)'};}};export const PAYMENT_RISK_RULES=[R_P_01,R_P_02,R_P_03,R_P_04,R_P_05,R_P_06,R_P_07,R_P_08,R_P_09];export const PAYMENT_RISK_VERSION='1.0.0';export function checkPaymentRisks(a){const b=[];for(const c of PAYMENT_RISK_RULES){const d=c['check'](a);if(d)b['push'](d);}return!b['find'](e=>e['id']==='R-PAYMENT-05')&&b['push'](R_P_05['rule']),b;}export function getPaymentRiskById(a){return PAYMENT_RISK_RULES['find'](b=>b['rule']['id']===a)?.['rule'];}
@@ -54,5 +54,16 @@ export interface BuildPermissionContextInput {
54
54
  max_length?: number;
55
55
  }
56
56
  export declare function buildPermissionContext(input: BuildPermissionContextInput): PermissionContextBundle;
57
+ export declare const ENTITY_PERMISSION_ERROR_CODES: {
58
+ readonly E_ITEM_COUNT_EXCEEDED: 1;
59
+ readonly E_NOT_SYSTEM_ADDRESS: 2;
60
+ };
61
+ export declare const ENTITY_PERMISSION_OBJECT_ID = "0xaad";
62
+ export declare const ENTITY_CONTACT_OBJECT_ID = "0xaa9";
63
+ export declare const OBJECT_LINKER_CORE_OBJECT_ID = "0xaae";
64
+ export declare const OBJECT_LINKER_TX_OBJECT_ID = "0xaaf";
65
+ export declare const VOTE_BIT_LIKE = 2;
66
+ export declare const VOTE_BIT_DISLIKE = 4;
67
+ export declare const VOTE_BIT_FAVOR = 8;
57
68
  export declare function buildPromptFromPermissionContext(bundle: PermissionContextBundle): string;
58
69
  export declare function getPermissionContextSummary(bundle: PermissionContextBundle): string;
@@ -1 +1 @@
1
- import{USER_DEFINED_PERM_INDEX_START,MAX_ENTITY_COUNT,MAX_PERM_FOR_ENTITY,MAX_ADMIN_COUNT}from'@wowok/wowok';import{PERMISSION_SCENES,findSceneByPermissionIndex,inferSceneFromIntent,getScenesByHostObject,getAllBuiltinPermissions}from'./permission-ledger.js';import{getTemplatesByScene}from'./permission-templates.js';import{matchSemanticPattern}from'./permission-translation.js';import{getAllRiskRules,assessPermissionRisks}from'./permission-risk.js';import{initPuzzleFromIntent,checkPuzzleCompleteness}from'./permission-puzzle.js';import{PERMISSION_PUBLISH_CHECKLIST,PERMISSION_CONFIRMATION_QUESTIONS}from'./permission-confirm.js';export const PERMISSION_CONTEXT_VERSION='1.0.0';export function buildPermissionContext(a){const b=a['max_length']??0xfa0;let c;if(a['intent'])c=inferSceneFromIntent(a['intent']);else{if(a['target_permission_index']!==undefined)c=findSceneByPermissionIndex(a['target_permission_index']);else{if(a['target_host_object']){const p=getScenesByHostObject(a['target_host_object']);if(p['length']>0x0)c=p[0x0];}}}let d;if(c){const q=getTemplatesByScene(c['id']);if(q['length']>0x0)d=q[0x0];}let e;if(a['intent']){const r=matchSemanticPattern(a['intent']);if(r['length']>0x0)e=r[0x0];}let f,g;a['mode']==='initial_design'&&a['intent']&&(f=initPuzzleFromIntent({'rule_sentence':a['intent']}),g=checkPuzzleCompleteness(f));const h=filterRiskRules(a['mode'],a['stakeholder'],c);let i;if(a['mode']==='pre_publish'&&a['permission_json']){const s={'object':a['permission_json']['object'],'admin':a['permission_json']['admin'],'table':a['permission_json']['table'],'entity':a['permission_json']['entity'],'remark':a['permission_json']['remark'],'apply':a['permission_json']['apply'],'builder':a['permission_json']['builder'],'um':a['permission_json']['um']};i=assessPermissionRisks(s);}const j=filterChecklist(a['mode']),k=filterQuestions(a['mode']),l=c?c['builtin_indexes']:getAllBuiltinPermissions(),m=buildCrossObjectRefs(c),n=buildOnchainConstraints(),o=buildRenderingHints(a['mode'],b,!!a['permission_json']?.['builder']);return{'version':PERMISSION_CONTEXT_VERSION,'mode':a['mode'],'stakeholder_perspective':a['stakeholder'],'matched_scene':c,'matched_template':d,'matched_pattern':e,'puzzle_state':f,'puzzle_completeness':g,'relevant_risks':h,'risk_assessment':i,'relevant_checklist':j,'relevant_questions':k,'relevant_builtin_permissions':l,'cross_object_refs':m,'onchain_constraints':n,'rendering_hints':o};}function filterRiskRules(a,b,c){let d=getAllRiskRules();if(a==='initial_design')return d['filter'](e=>e['category']==='structural'||e['category']==='authority');if(a==='pre_publish')return d;if(a==='stakeholder_review'&&b){if(b==='owner')return d['filter'](e=>e['category']==='authority'||e['category']==='lifecycle');if(b==='admin')return d['filter'](e=>e['category']==='structural'||e['category']==='semantic');}return d;}function filterChecklist(a){if(a==='initial_design')return PERMISSION_PUBLISH_CHECKLIST['filter'](b=>['C-P-01','C-P-02','C-P-03','C-P-04']['includes'](b['id']));return PERMISSION_PUBLISH_CHECKLIST;}function filterQuestions(a){if(a==='pre_publish')return PERMISSION_CONFIRMATION_QUESTIONS;if(a==='post_publish_modify')return PERMISSION_CONFIRMATION_QUESTIONS['filter'](b=>b['id']!=='QP5');return[];}function buildCrossObjectRefs(a){if(!a)return[];const b=[];for(const c of PERMISSION_SCENES){if(c['host_object']===a['host_object']||c['id']===a['id'])continue;b['push']({'object':c['host_object'],'field':'permission','scene_id':c['id'],'description':c['host_object']+'\x20uses\x20permission\x20indexes\x20'+c['permission_index_range']});}return b;}function buildOnchainConstraints(){return[{'name':'USER_DEFINED_PERM_INDEX_START','value':USER_DEFINED_PERM_INDEX_START,'description':'Custom\x20permission\x20indexes\x20must\x20be\x20>=\x20this\x20value'},{'name':'MAX_ENTITY_COUNT','value':MAX_ENTITY_COUNT,'description':'Maximum\x20entities\x20per\x20Permission'},{'name':'MAX_PERM_FOR_ENTITY','value':MAX_PERM_FOR_ENTITY,'description':'Maximum\x20permission\x20indexes\x20per\x20entity'},{'name':'MAX_ADMIN_COUNT','value':MAX_ADMIN_COUNT,'description':'Maximum\x20admins\x20per\x20Permission'}];}function buildRenderingHints(a,b,c){return{'include_puzzle_template':a==='initial_design','include_risk_details':a==='pre_publish'||a==='stakeholder_review','include_questions':a==='pre_publish','include_immutability_warning':a==='post_publish_modify','include_transfer_warning':c,'max_length':b};}export function buildPromptFromPermissionContext(a){const b=[],d=a['rendering_hints'];b['push']('═══\x20Permission\x20Context\x20(mode:\x20'+a['mode']+')\x20═══'),b['push']('');a['matched_scene']&&(b['push']('Scene:\x20'+a['matched_scene']['name']),b['push']('Host\x20object:\x20'+a['matched_scene']['host_object']),b['push']('Permission\x20range:\x20'+a['matched_scene']['permission_index_range']),b['push'](''));a['matched_template']&&(b['push']('Suggested\x20template:\x20'+a['matched_template']['id']+'\x20—\x20'+a['matched_template']['name']),b['push'](''));if(d['include_puzzle_template']&&a['puzzle_completeness']){const e=a['puzzle_completeness'];b['push']('─\x20Puzzle\x20Completeness\x20──────────────'),b['push']('Complete:\x20'+(e['complete']?'YES':'NO')),e['missing']['length']>0x0&&b['push']('Missing:\x20'+e['missing']['join'](',\x20')),b['push']('Next:\x20'+e['next_step']),b['push']('');}if(d['include_risk_details']&&a['relevant_risks']['length']>0x0){b['push']('─\x20Relevant\x20Risk\x20Rules\x20('+a['relevant_risks']['length']+')\x20──────────────');for(const f of a['relevant_risks']['slice'](0x0,0x5)){b['push']('\x20\x20'+f['id']+'\x20—\x20'+f['trigger']);}a['relevant_risks']['length']>0x5&&b['push']('\x20\x20...\x20and\x20'+(a['relevant_risks']['length']-0x5)+'\x20more'),b['push']('');}a['risk_assessment']&&(b['push']('─\x20Risk\x20Assessment\x20──────────────'),b['push']('Overall:\x20'+a['risk_assessment']['overall_risk']),b['push']('Detected:\x20'+a['risk_assessment']['risks']['length']+'\x20risk(s)'),b['push'](''));if(a['relevant_builtin_permissions']['length']>0x0){b['push']('─\x20Builtin\x20Permissions\x20('+a['relevant_builtin_permissions']['length']+')\x20──────────────');for(const g of a['relevant_builtin_permissions']['slice'](0x0,0x8)){b['push']('\x20\x20['+g['index']+']\x20'+g['name']+':\x20'+g['description']);}a['relevant_builtin_permissions']['length']>0x8&&b['push']('\x20\x20...\x20and\x20'+(a['relevant_builtin_permissions']['length']-0x8)+'\x20more'),b['push']('');}d['include_transfer_warning']&&(b['push']('⚠️\x20TRANSFER\x20OPERATION\x20DETECTED\x20—\x20This\x20is\x20IRREVERSIBLE'),b['push'](''));if(a['onchain_constraints']['length']>0x0){b['push']('─\x20On-chain\x20Constraints\x20──────────────');for(const i of a['onchain_constraints']){b['push']('\x20\x20'+i['name']+'\x20=\x20'+i['value']+'\x20—\x20'+i['description']);}b['push']('');}return b['join']('\x0a');}export function getPermissionContextSummary(a){const b=['mode='+a['mode'],'scene='+(a['matched_scene']?.['id']??'none'),'risks='+a['relevant_risks']['length'],'permissions='+a['relevant_builtin_permissions']['length']];if(a['risk_assessment'])b['push']('overall_risk='+a['risk_assessment']['overall_risk']);return b['join'](',\x20');}
1
+ import{USER_DEFINED_PERM_INDEX_START,MAX_ENTITY_COUNT,MAX_PERM_FOR_ENTITY,MAX_ADMIN_COUNT,MAX_ITEM_COUNT,ROLE_OWNER,ROLE_ADMIN,ROLE_ENTITY}from'@wowok/wowok';import{PERMISSION_SCENES,findSceneByPermissionIndex,inferSceneFromIntent,getScenesByHostObject,getAllBuiltinPermissions}from'./permission-ledger.js';import{getTemplatesByScene}from'./permission-templates.js';import{matchSemanticPattern}from'./permission-translation.js';import{getAllRiskRules,assessPermissionRisks}from'./permission-risk.js';import{initPuzzleFromIntent,checkPuzzleCompleteness}from'./permission-puzzle.js';import{PERMISSION_PUBLISH_CHECKLIST,PERMISSION_CONFIRMATION_QUESTIONS}from'./permission-confirm.js';export const PERMISSION_CONTEXT_VERSION='1.0.0';export function buildPermissionContext(a){const b=a['max_length']??0xfa0;let c;if(a['intent'])c=inferSceneFromIntent(a['intent']);else{if(a['target_permission_index']!==undefined)c=findSceneByPermissionIndex(a['target_permission_index']);else{if(a['target_host_object']){const p=getScenesByHostObject(a['target_host_object']);if(p['length']>0x0)c=p[0x0];}}}let d;if(c){const q=getTemplatesByScene(c['id']);if(q['length']>0x0)d=q[0x0];}let e;if(a['intent']){const r=matchSemanticPattern(a['intent']);if(r['length']>0x0)e=r[0x0];}let f,g;a['mode']==='initial_design'&&a['intent']&&(f=initPuzzleFromIntent({'rule_sentence':a['intent']}),g=checkPuzzleCompleteness(f));const h=filterRiskRules(a['mode'],a['stakeholder'],c);let i;if(a['mode']==='pre_publish'&&a['permission_json']){const s={'object':a['permission_json']['object'],'admin':a['permission_json']['admin'],'table':a['permission_json']['table'],'entity':a['permission_json']['entity'],'remark':a['permission_json']['remark'],'apply':a['permission_json']['apply'],'builder':a['permission_json']['builder'],'um':a['permission_json']['um']};i=assessPermissionRisks(s);}const j=filterChecklist(a['mode']),k=filterQuestions(a['mode']),l=c?c['builtin_indexes']:getAllBuiltinPermissions(),m=buildCrossObjectRefs(c),n=buildOnchainConstraints(),o=buildRenderingHints(a['mode'],b,!!a['permission_json']?.['builder']);return{'version':PERMISSION_CONTEXT_VERSION,'mode':a['mode'],'stakeholder_perspective':a['stakeholder'],'matched_scene':c,'matched_template':d,'matched_pattern':e,'puzzle_state':f,'puzzle_completeness':g,'relevant_risks':h,'risk_assessment':i,'relevant_checklist':j,'relevant_questions':k,'relevant_builtin_permissions':l,'cross_object_refs':m,'onchain_constraints':n,'rendering_hints':o};}function filterRiskRules(a,b,c){let d=getAllRiskRules();if(a==='initial_design')return d['filter'](e=>e['category']==='structural'||e['category']==='authority');if(a==='pre_publish')return d;if(a==='stakeholder_review'&&b){if(b==='owner')return d['filter'](e=>e['category']==='authority'||e['category']==='lifecycle');if(b==='admin')return d['filter'](e=>e['category']==='structural'||e['category']==='semantic');}return d;}function filterChecklist(a){if(a==='initial_design')return PERMISSION_PUBLISH_CHECKLIST['filter'](b=>['C-P-01','C-P-02','C-P-03','C-P-04']['includes'](b['id']));return PERMISSION_PUBLISH_CHECKLIST;}function filterQuestions(a){if(a==='pre_publish')return PERMISSION_CONFIRMATION_QUESTIONS;if(a==='post_publish_modify')return PERMISSION_CONFIRMATION_QUESTIONS['filter'](b=>b['id']!=='QP5');return[];}function buildCrossObjectRefs(a){if(!a)return[];const b=[];for(const c of PERMISSION_SCENES){if(c['host_object']===a['host_object']||c['id']===a['id'])continue;b['push']({'object':c['host_object'],'field':'permission','scene_id':c['id'],'description':c['host_object']+'\x20uses\x20permission\x20indexes\x20'+c['permission_index_range']});}return b;}function buildOnchainConstraints(){return[{'name':'USER_DEFINED_PERM_INDEX_START','value':USER_DEFINED_PERM_INDEX_START,'description':'Custom\x20permission\x20indexes\x20must\x20be\x20>=\x20this\x20value'},{'name':'MAX_ENTITY_COUNT','value':MAX_ENTITY_COUNT,'description':'Maximum\x20entities\x20per\x20Permission'},{'name':'MAX_PERM_FOR_ENTITY','value':MAX_PERM_FOR_ENTITY,'description':'Maximum\x20permission\x20indexes\x20per\x20entity'},{'name':'MAX_ADMIN_COUNT','value':MAX_ADMIN_COUNT,'description':'Maximum\x20admins\x20per\x20Permission'},{'name':'MAX_ITEM_COUNT','value':MAX_ITEM_COUNT,'description':'Maximum\x20permissions\x20per\x20entity\x20in\x20the\x20global\x20reverse\x20index'},{'name':'ROLE_OWNER','value':ROLE_OWNER,'description':'Entity\x20permission\x20role\x20flag:\x20owner'},{'name':'ROLE_ADMIN','value':ROLE_ADMIN,'description':'Entity\x20permission\x20role\x20flag:\x20admin'},{'name':'ROLE_ENTITY','value':ROLE_ENTITY,'description':'Entity\x20permission\x20role\x20flag:\x20entity'}];}export const ENTITY_PERMISSION_ERROR_CODES={'E_ITEM_COUNT_EXCEEDED':0x1,'E_NOT_SYSTEM_ADDRESS':0x2};export const ENTITY_PERMISSION_OBJECT_ID='0xaad';export const ENTITY_CONTACT_OBJECT_ID='0xaa9';export const OBJECT_LINKER_CORE_OBJECT_ID='0xaae';export const OBJECT_LINKER_TX_OBJECT_ID='0xaaf';export const VOTE_BIT_LIKE=0x2;export const VOTE_BIT_DISLIKE=0x4;export const VOTE_BIT_FAVOR=0x8;function buildRenderingHints(a,b,c){return{'include_puzzle_template':a==='initial_design','include_risk_details':a==='pre_publish'||a==='stakeholder_review','include_questions':a==='pre_publish','include_immutability_warning':a==='post_publish_modify','include_transfer_warning':c,'max_length':b};}export function buildPromptFromPermissionContext(a){const b=[],d=a['rendering_hints'];b['push']('═══\x20Permission\x20Context\x20(mode:\x20'+a['mode']+')\x20═══'),b['push']('');a['matched_scene']&&(b['push']('Scene:\x20'+a['matched_scene']['name']),b['push']('Host\x20object:\x20'+a['matched_scene']['host_object']),b['push']('Permission\x20range:\x20'+a['matched_scene']['permission_index_range']),b['push'](''));a['matched_template']&&(b['push']('Suggested\x20template:\x20'+a['matched_template']['id']+'\x20—\x20'+a['matched_template']['name']),b['push'](''));if(d['include_puzzle_template']&&a['puzzle_completeness']){const e=a['puzzle_completeness'];b['push']('─\x20Puzzle\x20Completeness\x20──────────────'),b['push']('Complete:\x20'+(e['complete']?'YES':'NO')),e['missing']['length']>0x0&&b['push']('Missing:\x20'+e['missing']['join'](',\x20')),b['push']('Next:\x20'+e['next_step']),b['push']('');}if(d['include_risk_details']&&a['relevant_risks']['length']>0x0){b['push']('─\x20Relevant\x20Risk\x20Rules\x20('+a['relevant_risks']['length']+')\x20──────────────');for(const f of a['relevant_risks']['slice'](0x0,0x5)){b['push']('\x20\x20'+f['id']+'\x20—\x20'+f['trigger']);}a['relevant_risks']['length']>0x5&&b['push']('\x20\x20...\x20and\x20'+(a['relevant_risks']['length']-0x5)+'\x20more'),b['push']('');}a['risk_assessment']&&(b['push']('─\x20Risk\x20Assessment\x20──────────────'),b['push']('Overall:\x20'+a['risk_assessment']['overall_risk']),b['push']('Detected:\x20'+a['risk_assessment']['risks']['length']+'\x20risk(s)'),b['push'](''));if(a['relevant_builtin_permissions']['length']>0x0){b['push']('─\x20Builtin\x20Permissions\x20('+a['relevant_builtin_permissions']['length']+')\x20──────────────');for(const g of a['relevant_builtin_permissions']['slice'](0x0,0x8)){b['push']('\x20\x20['+g['index']+']\x20'+g['name']+':\x20'+g['description']);}a['relevant_builtin_permissions']['length']>0x8&&b['push']('\x20\x20...\x20and\x20'+(a['relevant_builtin_permissions']['length']-0x8)+'\x20more'),b['push']('');}d['include_transfer_warning']&&(b['push']('⚠️\x20TRANSFER\x20OPERATION\x20DETECTED\x20—\x20This\x20is\x20IRREVERSIBLE'),b['push'](''));if(a['onchain_constraints']['length']>0x0){b['push']('─\x20On-chain\x20Constraints\x20──────────────');for(const i of a['onchain_constraints']){b['push']('\x20\x20'+i['name']+'\x20=\x20'+i['value']+'\x20—\x20'+i['description']);}b['push']('');}return b['join']('\x0a');}export function getPermissionContextSummary(a){const b=['mode='+a['mode'],'scene='+(a['matched_scene']?.['id']??'none'),'risks='+a['relevant_risks']['length'],'permissions='+a['relevant_builtin_permissions']['length']];if(a['risk_assessment'])b['push']('overall_risk='+a['risk_assessment']['overall_risk']);return b['join'](',\x20');}
@@ -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\x20affiliation\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;}export function getPersonalRiskById(a){return PERSONAL_RISK_RULES['find'](b=>b['rule']['id']===a)?.['rule'];}
@@ -1 +1 @@
1
- import{MAX_NAMED_OPERATOR_COUNT,MAX_NAMED_OPERATOR_ADDRESS_COUNT,MAX_CONTEXT_REPOSITORY_COUNT}from'@wowok/wowok';export{MAX_NAMED_OPERATOR_COUNT,MAX_NAMED_OPERATOR_ADDRESS_COUNT,MAX_CONTEXT_REPOSITORY_COUNT};export const PROGRESS_NEW={'index':0xdc,'name':'PROGRESS_NEW','description':'Create\x20new\x20Progress\x20(asserted\x20by\x20progress::new\x20/\x20new_with_passport)','governed_operations':['progress::new','progress::new_with_passport'],'sdk_exposed':![]};export const PROGRESS_NAMED_OPERATOR={'index':0xdd,'name':'PROGRESS_NAMED_OPERATOR','description':'Manage\x20named\x20operators\x20(add/set/remove)\x20for\x20the\x20namedOperator\x20namespace','governed_operations':['progress::namedOperator_add','progress::namedOperator_set','progress::namedOperator_remove','progress::namedOperator_add_with_passport','progress::namedOperator_set_with_passport','progress::namedOperator_remove_with_passport'],'sdk_exposed':!![]};export const PROGRESS_TASK={'index':0xde,'name':'PROGRESS_TASK','description':'Submit\x20task\x20(one-time,\x20immutable\x20once\x20set\x20—\x20E_TASK_ALREADY_SET)','governed_operations':['progress::task_set','progress::task_set_with_passport'],'sdk_exposed':!![]};export const PROGRESS_CONTEXT_REPOSITORY={'index':0xdf,'name':'PROGRESS_CONTEXT_REPOSITORY','description':'Bind/unbind\x20context\x20Repository\x20(≤\x20MAX_CONTEXT_REPOSITORY_COUNT=30)','governed_operations':['progress::context_repository_add','progress::context_repository_remove','progress::context_repository_clear','progress::context_repository_add_with_passport','progress::context_repository_remove_with_passport','progress::context_repository_clear_with_passport'],'sdk_exposed':!![]};export const PROGRESS_UNHOLD={'index':0xe0,'name':'PROGRESS_UNHOLD','description':'Force\x20unhold\x20(adminUnhold)\x20—\x20bypasses\x20holder\x20check,\x20releases\x20blocked\x20forward','governed_operations':['progress::unhold','progress::unhold_with_passport'],'sdk_exposed':!![]};export const PROGRESS_OWNER_RECEIVE={'index':0xe1,'name':'PROGRESS_OWNER_RECEIVE','description':'Owner\x20receives\x20objects/coins\x20(unwrap\x20Receiving<K>\x20→\x20owner)','governed_operations':['progress::owner_receive','progress::owner_receive_object','progress::owner_receive_with_passport','progress::owner_receive_object_with_passport'],'sdk_exposed':![]};export const PROGRESS_PERMISSIONS=[PROGRESS_NEW,PROGRESS_NAMED_OPERATOR,PROGRESS_TASK,PROGRESS_CONTEXT_REPOSITORY,PROGRESS_UNHOLD,PROGRESS_OWNER_RECEIVE];export const PROGRESS_SCENES=[{'id':'progress_task_submit','name':'Task\x20submission\x20&\x20binding\x20workflow','industry':['universal','ecommerce','logistics','education'],'scenario':'Submit\x20a\x20task\x20(Order/Reward/etc.)\x20to\x20Progress\x20via\x20task_set.\x20'+'Task\x20is\x20one-time,\x20immutable\x20—\x20once\x20set,\x20E_TASK_ALREADY_SET\x20blocks\x20any\x20re-assignment.\x20'+'Binds\x20Progress\x201:1\x20to\x20the\x20task\x20object\x20for\x20the\x20rest\x20of\x20its\x20lifecycle.','phases':['task_binding','forward_advance'],'requires_published_machine':!![],'requires_order_bound':!![],'named_operator_roles':[],'builtin_indexes_consumed':[PROGRESS_TASK],'typical_context_repository_count':0x0,'uses_hold_mechanism':![],'uses_admin_unhold':![],'common_patterns':['task_set\x20is\x20one-time:\x20verify\x20task\x20address\x20before\x20submission\x20(E_TASK_ALREADY_SET\x20blocks\x20reset)','task\x20is\x20usually\x20an\x20Order\x20created\x20by\x20service::buy\x20→\x20Progress.task\x20=\x20Order\x20address','Without\x20task,\x20Forward\x20advancement\x20falls\x20back\x20to\x20non-order\x20next()/hold()\x20paths'],'recommended_templates':['T-PR-01']},{'id':'progress_named_operator','name':'Named\x20operator\x20namespace\x20management','industry':['universal','logistics','arbitration','freelance'],'scenario':'Manage\x20named_operator\x20namespace\x20for\x20a\x20Progress.\x20Each\x20named\x20operator\x20is\x20a\x20(name\x20→\x20address\x20list)\x20'+'binding\x20used\x20by\x20Machine.forward.namedOperator\x20to\x20gate\x20next()/hold()\x20advancement.\x20'+'Up\x20to\x2060\x20named\x20operators\x20per\x20Progress,\x20up\x20to\x2080\x20addresses\x20per\x20operator.','phases':['named_operator_mgmt'],'requires_published_machine':!![],'requires_order_bound':![],'named_operator_roles':[{'role':'seller','typical_count':0x1},{'role':'logistics','typical_count':0x1},{'role':'reviewer','typical_count':0x3},{'role':'arbitrator','typical_count':0x5}],'builtin_indexes_consumed':[PROGRESS_NAMED_OPERATOR],'typical_context_repository_count':0x0,'uses_hold_mechanism':![],'uses_admin_unhold':![],'common_patterns':['namedOperator\x20name=\x27\x27:\x20special\x20case\x20—\x20means\x20OrderHolder\x20(order.owner/agent),\x20NOT\x20a\x20real\x20named\x20operator','add/set/remove\x20are\x20idempotent\x20on\x20duplicate\x20addresses\x20(vector::contains\x20check\x20before\x20push)','Use\x20\x27set\x27\x20to\x20REPLACE\x20an\x20operator\x27s\x20address\x20list;\x20use\x20\x27add\x27\x20to\x20extend;\x20\x27remove\x27\x20to\x20subtract','Names\x20must\x20satisfy\x20common::NAME\x20(isValidName)\x20—\x20non-empty,\x20length-bounded'],'recommended_templates':['T-PR-01','T-PR-02']},{'id':'progress_unhold','name':'Hold\x20release\x20(unhold\x20/\x20adminUnhold)\x20workflow','industry':['content','rental','arbitration','subscription'],'scenario':'Release\x20a\x20forward\x20that\x20was\x20previously\x20held.\x20Two\x20paths:\x20'+'(a)\x20unhold\x20by\x20original\x20holder\x20(named_operator\x20match);\x20'+'(b)\x20adminUnhold\x20(224)\x20by\x20permission-table\x20holder\x20—\x20bypasses\x20holder\x20check.\x20'+'adminUnhold\x20is\x20the\x20deadlock-resolution\x20escape\x20hatch\x20when\x20a\x20holder\x20is\x20unresponsive.','phases':['hold_state','unhold_state'],'requires_published_machine':!![],'requires_order_bound':!![],'named_operator_roles':[{'role':'holder','typical_count':0x1},{'role':'admin','typical_count':0x1}],'builtin_indexes_consumed':[PROGRESS_UNHOLD],'typical_context_repository_count':0x0,'uses_hold_mechanism':!![],'uses_admin_unhold':!![],'common_patterns':['unhold\x20checks\x20sender_has_permission_idcheck(224):\x20if\x20yes,\x20force\x20release;\x20if\x20no,\x20require\x20holder\x20match','adminUnhold\x20has\x20wider\x20blast\x20radius\x20—\x20only\x20grant\x20224\x20to\x20trusted\x20recovery\x20operators','If\x20forward\x20already\x20accomplished,\x20E_FORWARD_ALREADY_ACCOMPLISHED\x20blocks\x20re-hold','Repeated\x20hold/unhold\x20cycles\x20indicate\x20a\x20stuck\x20workflow\x20—\x20surface\x20to\x20order-monitor'],'recommended_templates':['T-PR-05']},{'id':'progress_context_repository','name':'Context\x20Repository\x20binding\x20workflow','industry':['education','content','rental','cross_chain'],'scenario':'Bind/unbind\x20Repository\x20objects\x20as\x20Progress\x20context_repositories.\x20'+'Used\x20to\x20provide\x20query-time\x20context\x20(learning\x20progress,\x20inspection\x20records,\x20bridge\x20state).\x20'+'Up\x20to\x20MAX_CONTEXT_REPOSITORY_COUNT=30\x20repositories\x20per\x20Progress.','phases':['context_binding'],'requires_published_machine':!![],'requires_order_bound':![],'named_operator_roles':[],'builtin_indexes_consumed':[PROGRESS_CONTEXT_REPOSITORY],'typical_context_repository_count':0x3,'uses_hold_mechanism':![],'uses_admin_unhold':![],'common_patterns':['context_repository_add\x20registers\x20affiliation\x20via\x20Registrar\x20(enables\x20cross-object\x20queries)','context_repository_remove\x20disaffiliates\x20—\x20Repository\x20may\x20be\x20garbage-collected\x20if\x20no\x20other\x20refs','context_repository_clear\x20empties\x20the\x20entire\x20list\x20in\x20one\x20transaction','add\x20is\x20idempotent:\x20if\x20Repository\x20already\x20in\x20list,\x20no-op\x20(vector::contains\x20check)','Bind\x20before\x20forward\x20advance\x20so\x20on-chain\x20guards\x20can\x20read\x20context\x20data'],'recommended_templates':['T-PR-03']},{'id':'progress_owner_receive','name':'Owner\x20receive\x20(unwrap)\x20workflow','industry':['finance','treasury','rental','freelance'],'scenario':'Owner\x20receives\x20Receiving<K>\x20objects\x20or\x20CoinWrapper<T>\x20coins\x20sent\x20to\x20the\x20Progress\x20object.\x20'+'unwrap\x20→\x20permission::owner_receive_inner\x20forwards\x20to\x20Permission\x20owner.\x20'+'Used\x20at\x20terminal\x20nodes\x20(return_approved,\x20completed,\x20enforced)\x20to\x20disburse\x20funds.','phases':['owner_receive'],'requires_published_machine':!![],'requires_order_bound':!![],'named_operator_roles':[],'builtin_indexes_consumed':[PROGRESS_OWNER_RECEIVE],'typical_context_repository_count':0x0,'uses_hold_mechanism':![],'uses_admin_unhold':![],'common_patterns':['owner_receive\x20unwraps\x20CoinWrapper<T>\x20via\x20Payment.unwrap_with_check\x20(amount\x20validation)','owner_receive_object\x20receives\x20a\x20generic\x20K:key+store\x20object\x20and\x20forwards\x20to\x20Permission\x20owner','Triggered\x20at\x20terminal\x20nodes\x20(e.g.\x20\x27return_approved\x27\x20in\x20rental,\x20\x27enforced\x27\x20in\x20arbitration)','Permission\x20owner\x20≠\x20Progress\x20creator:\x20receives\x20flow\x20to\x20whoever\x20owns\x20the\x20bound\x20Machine\x27s\x20Permission'],'recommended_templates':['T-PR-06']},{'id':'progress_completed','name':'Forward\x20advancement\x20&\x20session\x20completion','industry':['universal'],'scenario':'Advance\x20Progress\x20via\x20next()/order_next()\x20—\x20accumulates\x20weights\x20in\x20session.forwards,\x20'+'and\x20when\x20weights\x20≥\x20threshold,\x20moves\x20session\x20into\x20history\x20and\x20updates\x20Progress.current.\x20'+'This\x20is\x20the\x20canonical\x20Forward\x20advancement\x20path\x20for\x20ALL\x20non-hold\x20operations.','phases':['forward_advance','completed'],'requires_published_machine':!![],'requires_order_bound':!![],'named_operator_roles':[{'role':'OrderHolder','typical_count':0x1},{'role':'next_node_operator','typical_count':0x1}],'builtin_indexes_consumed':[],'typical_context_repository_count':0x0,'uses_hold_mechanism':![],'uses_admin_unhold':![],'common_patterns':['Forward\x20guard\x20(Some):\x20requires\x20Passport;\x20uses\x20passport::result_for_guard\x20for\x20verification','Forward\x20guard\x20(None):\x20requires\x20permissionIndex\x20(Some)\x20or\x20namedOperator\x20match\x20(ASSERT_PERMISSION)','session.weights\x20+=\x20forward.weight;\x20when\x20≥\x20threshold,\x20push\x20session\x20into\x20ParentTableVec<History>','Progress.current\x20=\x20next_node\x20only\x20after\x20session\x20completes\x20(atomic\x20update)','E_NOT_THE_HOLDER:\x20if\x20forward\x20was\x20held\x20by\x20another\x20address,\x20next()\x20aborts','E_FORWARD_ALREADY_ACCOMPLISHED:\x20re-hold\x20on\x20completed\x20forward\x20is\x20blocked','⚠\x20ROUTING\x20RULE:\x20Forward.namedOperator=\x22\x22\x20(empty)\x20→\x20MUST\x20call\x20order.progress\x20(order_next);\x20'+'non-empty\x20namedOperator\x20or\x20permissionIndex-only\x20→\x20MUST\x20call\x20progress.operate\x20(next).\x20'+'Wrong\x20path\x20→\x20Permission\x20denied\x20(abort\x20code\x205).\x20See\x20file\x20header\x20CRITICAL\x20ROUTING\x20RULE.'],'recommended_templates':['T-PR-04']}];export const PROGRESS_LEDGER_VERSION='1.0.0';export function getScenesByPhase(a){return PROGRESS_SCENES['filter'](b=>b['phases']['includes'](a));}export function findSceneById(a){return PROGRESS_SCENES['find'](b=>b['id']===a);}export function getScenesByIndustry(a){return PROGRESS_SCENES['filter'](b=>b['industry']['includes'](a)||b['industry']['includes']('universal'));}export function getBuiltinPermissionByIndex(a){return PROGRESS_PERMISSIONS['find'](b=>b['index']===a);}export function isProgressBuiltinPermission(a){return getBuiltinPermissionByIndex(a)!==undefined;}export function inferSceneFromIntent(a){const b=a['toLowerCase'](),c=[['adminunhold','progress_unhold'],['admin\x20unhold','progress_unhold'],['force\x20unhold','progress_unhold'],['unhold','progress_unhold'],['release\x20hold','progress_unhold'],['owner_receive','progress_owner_receive'],['owner\x20receive','progress_owner_receive'],['unwrap','progress_owner_receive'],['context_repository','progress_context_repository'],['context\x20repository','progress_context_repository'],['repository\x20binding','progress_context_repository'],['named_operator','progress_named_operator'],['named\x20operator','progress_named_operator'],['namedoperator','progress_named_operator'],['task_set','progress_task_submit'],['task\x20set','progress_task_submit'],['submit\x20task','progress_task_submit'],['next','progress_completed'],['order_next','progress_completed'],['advance','progress_completed'],['complete','progress_completed']];for(const [d,e]of c){if(b['includes'](d)){const f=findSceneById(e);if(f)return f;}}return undefined;}export function getAllBuiltinPermissions(){return[...PROGRESS_PERMISSIONS];}export function getProgressScenesCount(){return PROGRESS_SCENES['length'];}export function validateNamedOperatorAddressList(b){const c=[];b['length']>MAX_NAMED_OPERATOR_ADDRESS_COUNT&&c['push']('Named\x20operator\x20address\x20count\x20'+b['length']+'\x20exceeds\x20MAX_NAMED_OPERATOR_ADDRESS_COUNT\x20'+MAX_NAMED_OPERATOR_ADDRESS_COUNT);const d=new Set();for(const e of b){if(d['has'](e)){c['push']('Duplicate\x20address\x20in\x20list:\x20'+e+'\x20(Move\x20will\x20dedupe\x20silently)');break;}d['add'](e);}return{'ok':c['length']===0x0,'violations':c};}export function validateNamedOperatorCount(a){if(a>=MAX_NAMED_OPERATOR_COUNT)return{'ok':![],'violation':'Named\x20operator\x20count\x20'+a+'\x20would\x20exceed\x20MAX_NAMED_OPERATOR_COUNT\x20'+MAX_NAMED_OPERATOR_COUNT};return{'ok':!![]};}export function validateContextRepositoryCount(a,b){const c=a+b;if(c>MAX_CONTEXT_REPOSITORY_COUNT)return{'ok':![],'violation':'Context\x20repository\x20count\x20'+c+'\x20would\x20exceed\x20MAX_CONTEXT_REPOSITORY_COUNT\x20'+MAX_CONTEXT_REPOSITORY_COUNT};return{'ok':!![]};}export const PROGRESS_CROSS_OBJECT_REFS=[{'object':'Machine','phase':'universal','relationship':'Progress.machine\x20(immutable\x20bind,\x20E_MACHINE_NOT_MATCH\x20on\x20every\x20op)'},{'object':'Order','phase':'forward_advance','relationship':'Progress.task\x20=\x20Order.address\x20(1:1,\x20set\x20via\x20task_set\x20or\x20service::buy)'},{'object':'Order','phase':'forward_advance','relationship':'order_next\x20/\x20order_hold:\x20order.has_op_permission(order,\x20ctx)\x20gates\x20Forward\x20advance'},{'object':'Permission','phase':'universal','relationship':'Machine.permission\x20is\x20borrowed\x20for\x20ALL\x20220-225\x20assertions'},{'object':'Repository','phase':'context_binding','relationship':'context_repositories:\x20vector<address>\x20(≤\x2030),\x20affiliated\x20via\x20Registrar'},{'object':'Service','phase':'creation','relationship':'service::buy\x20→\x20new_imp\x20(bypasses\x20220\x20assertion\x20—\x20package-internal\x20entry)'},{'object':'Passport','phase':'forward_advance','relationship':'Forward.guard\x20(Some)\x20requires\x20Passport\x20+\x20passport::result_for_guard'},{'object':'Passport','phase':'unhold_state','relationship':'unhold_with_passport:\x20224\x20check\x20via\x20passport\x20(fallback\x20when\x20sender_has_permission_idcheck\x20fails)'},{'object':'Payment','phase':'owner_receive','relationship':'owner_receive\x20unwraps\x20CoinWrapper<T>\x20via\x20Payment.unwrap_with_check'},{'object':'Allocation','phase':'completed','relationship':'Terminal\x20node\x20triggers\x20Allocation\x20alloc\x20(e.g.\x20\x27completed\x27,\x20\x27enforced\x27,\x20\x27return_approved\x27)'}];
1
+ import{MAX_NAMED_OPERATOR_COUNT,MAX_NAMED_OPERATOR_ADDRESS_COUNT,MAX_CONTEXT_REPOSITORY_COUNT}from'@wowok/wowok';export{MAX_NAMED_OPERATOR_COUNT,MAX_NAMED_OPERATOR_ADDRESS_COUNT,MAX_CONTEXT_REPOSITORY_COUNT};export const PROGRESS_NEW={'index':0xdc,'name':'PROGRESS_NEW','description':'Create\x20new\x20Progress\x20(asserted\x20by\x20progress::new\x20/\x20new_with_passport)','governed_operations':['progress::new','progress::new_with_passport'],'sdk_exposed':![]};export const PROGRESS_NAMED_OPERATOR={'index':0xdd,'name':'PROGRESS_NAMED_OPERATOR','description':'Manage\x20named\x20operators\x20(add/set/remove)\x20for\x20the\x20namedOperator\x20namespace','governed_operations':['progress::namedOperator_add','progress::namedOperator_set','progress::namedOperator_remove','progress::namedOperator_add_with_passport','progress::namedOperator_set_with_passport','progress::namedOperator_remove_with_passport'],'sdk_exposed':!![]};export const PROGRESS_TASK={'index':0xde,'name':'PROGRESS_TASK','description':'Submit\x20task\x20(one-time,\x20immutable\x20once\x20set\x20—\x20E_TASK_ALREADY_SET)','governed_operations':['progress::task_set','progress::task_set_with_passport'],'sdk_exposed':!![]};export const PROGRESS_CONTEXT_REPOSITORY={'index':0xdf,'name':'PROGRESS_CONTEXT_REPOSITORY','description':'Bind/unbind\x20context\x20Repository\x20(≤\x20MAX_CONTEXT_REPOSITORY_COUNT=30)','governed_operations':['progress::context_repository_add','progress::context_repository_remove','progress::context_repository_clear','progress::context_repository_add_with_passport','progress::context_repository_remove_with_passport','progress::context_repository_clear_with_passport'],'sdk_exposed':!![]};export const PROGRESS_UNHOLD={'index':0xe0,'name':'PROGRESS_UNHOLD','description':'Force\x20unhold\x20(adminUnhold)\x20—\x20bypasses\x20holder\x20check,\x20releases\x20blocked\x20forward','governed_operations':['progress::unhold','progress::unhold_with_passport'],'sdk_exposed':!![]};export const PROGRESS_OWNER_RECEIVE={'index':0xe1,'name':'PROGRESS_OWNER_RECEIVE','description':'Owner\x20receives\x20objects/coins\x20(unwrap\x20Receiving<K>\x20→\x20owner)','governed_operations':['progress::owner_receive','progress::owner_receive_object','progress::owner_receive_with_passport','progress::owner_receive_object_with_passport'],'sdk_exposed':![]};export const PROGRESS_PERMISSIONS=[PROGRESS_NEW,PROGRESS_NAMED_OPERATOR,PROGRESS_TASK,PROGRESS_CONTEXT_REPOSITORY,PROGRESS_UNHOLD,PROGRESS_OWNER_RECEIVE];export const PROGRESS_SCENES=[{'id':'progress_task_submit','name':'Task\x20submission\x20&\x20binding\x20workflow','industry':['universal','ecommerce','logistics','education'],'scenario':'Submit\x20a\x20task\x20(Order/Reward/etc.)\x20to\x20Progress\x20via\x20task_set.\x20'+'Task\x20is\x20one-time,\x20immutable\x20—\x20once\x20set,\x20E_TASK_ALREADY_SET\x20blocks\x20any\x20re-assignment.\x20'+'Binds\x20Progress\x201:1\x20to\x20the\x20task\x20object\x20for\x20the\x20rest\x20of\x20its\x20lifecycle.','phases':['task_binding','forward_advance'],'requires_published_machine':!![],'requires_order_bound':!![],'named_operator_roles':[],'builtin_indexes_consumed':[PROGRESS_TASK],'typical_context_repository_count':0x0,'uses_hold_mechanism':![],'uses_admin_unhold':![],'common_patterns':['task_set\x20is\x20one-time:\x20verify\x20task\x20address\x20before\x20submission\x20(E_TASK_ALREADY_SET\x20blocks\x20reset)','task\x20is\x20usually\x20an\x20Order\x20created\x20by\x20service::buy\x20→\x20Progress.task\x20=\x20Order\x20address','Without\x20task,\x20Forward\x20advancement\x20falls\x20back\x20to\x20non-order\x20next()/hold()\x20paths'],'recommended_templates':['T-PR-01']},{'id':'progress_named_operator','name':'Named\x20operator\x20namespace\x20management','industry':['universal','logistics','arbitration','freelance'],'scenario':'Manage\x20named_operator\x20namespace\x20for\x20a\x20Progress.\x20Each\x20named\x20operator\x20is\x20a\x20(name\x20→\x20address\x20list)\x20'+'binding\x20used\x20by\x20Machine.forward.namedOperator\x20to\x20gate\x20next()/hold()\x20advancement.\x20'+'Up\x20to\x2060\x20named\x20operators\x20per\x20Progress,\x20up\x20to\x2080\x20addresses\x20per\x20operator.','phases':['named_operator_mgmt'],'requires_published_machine':!![],'requires_order_bound':![],'named_operator_roles':[{'role':'seller','typical_count':0x1},{'role':'logistics','typical_count':0x1},{'role':'reviewer','typical_count':0x3},{'role':'arbitrator','typical_count':0x5}],'builtin_indexes_consumed':[PROGRESS_NAMED_OPERATOR],'typical_context_repository_count':0x0,'uses_hold_mechanism':![],'uses_admin_unhold':![],'common_patterns':['namedOperator\x20name=\x27\x27:\x20special\x20case\x20—\x20means\x20OrderHolder\x20(order.owner/agent),\x20NOT\x20a\x20real\x20named\x20operator','add/set/remove\x20are\x20idempotent\x20on\x20duplicate\x20addresses\x20(vector::contains\x20check\x20before\x20push)','Use\x20\x27set\x27\x20to\x20REPLACE\x20an\x20operator\x27s\x20address\x20list;\x20use\x20\x27add\x27\x20to\x20extend;\x20\x27remove\x27\x20to\x20subtract','Names\x20must\x20satisfy\x20common::NAME\x20(isValidName)\x20—\x20non-empty,\x20length-bounded'],'recommended_templates':['T-PR-01','T-PR-02']},{'id':'progress_unhold','name':'Hold\x20release\x20(unhold\x20/\x20adminUnhold)\x20workflow','industry':['content','rental','arbitration','subscription'],'scenario':'Release\x20a\x20forward\x20that\x20was\x20previously\x20held.\x20Two\x20paths:\x20'+'(a)\x20unhold\x20by\x20original\x20holder\x20(named_operator\x20match);\x20'+'(b)\x20adminUnhold\x20(224)\x20by\x20permission-table\x20holder\x20—\x20bypasses\x20holder\x20check.\x20'+'adminUnhold\x20is\x20the\x20deadlock-resolution\x20escape\x20hatch\x20when\x20a\x20holder\x20is\x20unresponsive.','phases':['hold_state','unhold_state'],'requires_published_machine':!![],'requires_order_bound':!![],'named_operator_roles':[{'role':'holder','typical_count':0x1},{'role':'admin','typical_count':0x1}],'builtin_indexes_consumed':[PROGRESS_UNHOLD],'typical_context_repository_count':0x0,'uses_hold_mechanism':!![],'uses_admin_unhold':!![],'common_patterns':['unhold\x20checks\x20sender_has_permission_idcheck(224):\x20if\x20yes,\x20force\x20release;\x20if\x20no,\x20require\x20holder\x20match','adminUnhold\x20has\x20wider\x20blast\x20radius\x20—\x20only\x20grant\x20224\x20to\x20trusted\x20recovery\x20operators','If\x20forward\x20already\x20accomplished,\x20E_FORWARD_ALREADY_ACCOMPLISHED\x20blocks\x20re-hold','Repeated\x20hold/unhold\x20cycles\x20indicate\x20a\x20stuck\x20workflow\x20—\x20surface\x20to\x20order-monitor'],'recommended_templates':['T-PR-05']},{'id':'progress_context_repository','name':'Context\x20Repository\x20binding\x20workflow','industry':['education','content','rental','cross_chain'],'scenario':'Bind/unbind\x20Repository\x20objects\x20as\x20Progress\x20context_repositories.\x20'+'Used\x20to\x20provide\x20query-time\x20context\x20(learning\x20progress,\x20inspection\x20records,\x20bridge\x20state).\x20'+'Up\x20to\x20MAX_CONTEXT_REPOSITORY_COUNT=30\x20repositories\x20per\x20Progress.','phases':['context_binding'],'requires_published_machine':!![],'requires_order_bound':![],'named_operator_roles':[],'builtin_indexes_consumed':[PROGRESS_CONTEXT_REPOSITORY],'typical_context_repository_count':0x3,'uses_hold_mechanism':![],'uses_admin_unhold':![],'common_patterns':['context_repository_add\x20registers\x20binding\x20via\x20object_linker::affiliation_tx\x20(enables\x20cross-object\x20queries)','context_repository_remove\x20disaffiliates\x20via\x20object_linker::disaffiliation_tx\x20—\x20Repository\x20may\x20be\x20garbage-collected\x20if\x20no\x20other\x20refs','context_repository_clear\x20empties\x20the\x20entire\x20list\x20in\x20one\x20transaction','add\x20is\x20idempotent:\x20if\x20Repository\x20already\x20in\x20list,\x20no-op\x20(vector::contains\x20check)','Bind\x20before\x20forward\x20advance\x20so\x20on-chain\x20guards\x20can\x20read\x20context\x20data'],'recommended_templates':['T-PR-03']},{'id':'progress_owner_receive','name':'Owner\x20receive\x20(unwrap)\x20workflow','industry':['finance','treasury','rental','freelance'],'scenario':'Owner\x20receives\x20Receiving<K>\x20objects\x20or\x20CoinWrapper<T>\x20coins\x20sent\x20to\x20the\x20Progress\x20object.\x20'+'unwrap\x20→\x20permission::owner_receive_inner\x20forwards\x20to\x20Permission\x20owner.\x20'+'Used\x20at\x20terminal\x20nodes\x20(return_approved,\x20completed,\x20enforced)\x20to\x20disburse\x20funds.','phases':['owner_receive'],'requires_published_machine':!![],'requires_order_bound':!![],'named_operator_roles':[],'builtin_indexes_consumed':[PROGRESS_OWNER_RECEIVE],'typical_context_repository_count':0x0,'uses_hold_mechanism':![],'uses_admin_unhold':![],'common_patterns':['owner_receive\x20unwraps\x20CoinWrapper<T>\x20via\x20Payment.unwrap_with_check\x20(amount\x20validation)','owner_receive_object\x20receives\x20a\x20generic\x20K:key+store\x20object\x20and\x20forwards\x20to\x20Permission\x20owner','Triggered\x20at\x20terminal\x20nodes\x20(e.g.\x20\x27return_approved\x27\x20in\x20rental,\x20\x27enforced\x27\x20in\x20arbitration)','Permission\x20owner\x20≠\x20Progress\x20creator:\x20receives\x20flow\x20to\x20whoever\x20owns\x20the\x20bound\x20Machine\x27s\x20Permission'],'recommended_templates':['T-PR-06']},{'id':'progress_completed','name':'Forward\x20advancement\x20&\x20session\x20completion','industry':['universal'],'scenario':'Advance\x20Progress\x20via\x20next()/order_next()\x20—\x20accumulates\x20weights\x20in\x20session.forwards,\x20'+'and\x20when\x20weights\x20≥\x20threshold,\x20moves\x20session\x20into\x20history\x20and\x20updates\x20Progress.current.\x20'+'This\x20is\x20the\x20canonical\x20Forward\x20advancement\x20path\x20for\x20ALL\x20non-hold\x20operations.','phases':['forward_advance','completed'],'requires_published_machine':!![],'requires_order_bound':!![],'named_operator_roles':[{'role':'OrderHolder','typical_count':0x1},{'role':'next_node_operator','typical_count':0x1}],'builtin_indexes_consumed':[],'typical_context_repository_count':0x0,'uses_hold_mechanism':![],'uses_admin_unhold':![],'common_patterns':['Forward\x20guard\x20(Some):\x20requires\x20Passport;\x20uses\x20passport::result_for_guard\x20for\x20verification','Forward\x20guard\x20(None):\x20requires\x20permissionIndex\x20(Some)\x20or\x20namedOperator\x20match\x20(ASSERT_PERMISSION)','session.weights\x20+=\x20forward.weight;\x20when\x20≥\x20threshold,\x20push\x20session\x20into\x20ParentTableVec<History>','Progress.current\x20=\x20next_node\x20only\x20after\x20session\x20completes\x20(atomic\x20update)','E_NOT_THE_HOLDER:\x20if\x20forward\x20was\x20held\x20by\x20another\x20address,\x20next()\x20aborts','E_FORWARD_ALREADY_ACCOMPLISHED:\x20re-hold\x20on\x20completed\x20forward\x20is\x20blocked','⚠\x20ROUTING\x20RULE:\x20Forward.namedOperator=\x22\x22\x20(empty)\x20→\x20MUST\x20call\x20order.progress\x20(order_next);\x20'+'non-empty\x20namedOperator\x20or\x20permissionIndex-only\x20→\x20MUST\x20call\x20progress.operate\x20(next).\x20'+'Wrong\x20path\x20→\x20Permission\x20denied\x20(abort\x20code\x205).\x20See\x20file\x20header\x20CRITICAL\x20ROUTING\x20RULE.'],'recommended_templates':['T-PR-04']}];export const PROGRESS_LEDGER_VERSION='1.0.0';export function getScenesByPhase(a){return PROGRESS_SCENES['filter'](b=>b['phases']['includes'](a));}export function findSceneById(a){return PROGRESS_SCENES['find'](b=>b['id']===a);}export function getScenesByIndustry(a){return PROGRESS_SCENES['filter'](b=>b['industry']['includes'](a)||b['industry']['includes']('universal'));}export function getBuiltinPermissionByIndex(a){return PROGRESS_PERMISSIONS['find'](b=>b['index']===a);}export function isProgressBuiltinPermission(a){return getBuiltinPermissionByIndex(a)!==undefined;}export function inferSceneFromIntent(a){const b=a['toLowerCase'](),c=[['adminunhold','progress_unhold'],['admin\x20unhold','progress_unhold'],['force\x20unhold','progress_unhold'],['unhold','progress_unhold'],['release\x20hold','progress_unhold'],['owner_receive','progress_owner_receive'],['owner\x20receive','progress_owner_receive'],['unwrap','progress_owner_receive'],['context_repository','progress_context_repository'],['context\x20repository','progress_context_repository'],['repository\x20binding','progress_context_repository'],['named_operator','progress_named_operator'],['named\x20operator','progress_named_operator'],['namedoperator','progress_named_operator'],['task_set','progress_task_submit'],['task\x20set','progress_task_submit'],['submit\x20task','progress_task_submit'],['next','progress_completed'],['order_next','progress_completed'],['advance','progress_completed'],['complete','progress_completed']];for(const [d,e]of c){if(b['includes'](d)){const f=findSceneById(e);if(f)return f;}}return undefined;}export function getAllBuiltinPermissions(){return[...PROGRESS_PERMISSIONS];}export function getProgressScenesCount(){return PROGRESS_SCENES['length'];}export function validateNamedOperatorAddressList(b){const c=[];b['length']>MAX_NAMED_OPERATOR_ADDRESS_COUNT&&c['push']('Named\x20operator\x20address\x20count\x20'+b['length']+'\x20exceeds\x20MAX_NAMED_OPERATOR_ADDRESS_COUNT\x20'+MAX_NAMED_OPERATOR_ADDRESS_COUNT);const d=new Set();for(const e of b){if(d['has'](e)){c['push']('Duplicate\x20address\x20in\x20list:\x20'+e+'\x20(Move\x20will\x20dedupe\x20silently)');break;}d['add'](e);}return{'ok':c['length']===0x0,'violations':c};}export function validateNamedOperatorCount(a){if(a>=MAX_NAMED_OPERATOR_COUNT)return{'ok':![],'violation':'Named\x20operator\x20count\x20'+a+'\x20would\x20exceed\x20MAX_NAMED_OPERATOR_COUNT\x20'+MAX_NAMED_OPERATOR_COUNT};return{'ok':!![]};}export function validateContextRepositoryCount(a,b){const c=a+b;if(c>MAX_CONTEXT_REPOSITORY_COUNT)return{'ok':![],'violation':'Context\x20repository\x20count\x20'+c+'\x20would\x20exceed\x20MAX_CONTEXT_REPOSITORY_COUNT\x20'+MAX_CONTEXT_REPOSITORY_COUNT};return{'ok':!![]};}export const PROGRESS_CROSS_OBJECT_REFS=[{'object':'Machine','phase':'universal','relationship':'Progress.machine\x20(immutable\x20bind,\x20E_MACHINE_NOT_MATCH\x20on\x20every\x20op)'},{'object':'Order','phase':'forward_advance','relationship':'Progress.task\x20=\x20Order.address\x20(1:1,\x20set\x20via\x20task_set\x20or\x20service::buy)'},{'object':'Order','phase':'forward_advance','relationship':'order_next\x20/\x20order_hold:\x20order.has_op_permission(order,\x20ctx)\x20gates\x20Forward\x20advance'},{'object':'Permission','phase':'universal','relationship':'Machine.permission\x20is\x20borrowed\x20for\x20ALL\x20220-225\x20assertions'},{'object':'Repository','phase':'context_binding','relationship':'context_repositories:\x20vector<address>\x20(≤\x2030),\x20bound\x20via\x20object_linker::affiliation_tx'},{'object':'Service','phase':'creation','relationship':'service::buy\x20→\x20new_imp\x20(bypasses\x20220\x20assertion\x20—\x20package-internal\x20entry)'},{'object':'Passport','phase':'forward_advance','relationship':'Forward.guard\x20(Some)\x20requires\x20Passport\x20+\x20passport::result_for_guard'},{'object':'Passport','phase':'unhold_state','relationship':'unhold_with_passport:\x20224\x20check\x20via\x20passport\x20(fallback\x20when\x20sender_has_permission_idcheck\x20fails)'},{'object':'Payment','phase':'owner_receive','relationship':'owner_receive\x20unwraps\x20CoinWrapper<T>\x20via\x20Payment.unwrap_with_check'},{'object':'Allocation','phase':'completed','relationship':'Terminal\x20node\x20triggers\x20Allocation\x20alloc\x20(e.g.\x20\x27completed\x27,\x20\x27enforced\x27,\x20\x27return_approved\x27)'}];
@@ -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\x20Registrar\x20affiliation\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\x20Registrar\x20affiliation','description':'Adding\x20'+a['repository']['objects']['length']+'\x20repository(ies)\x20creates\x20Registrar\x20affiliation\x20'+'entries.\x20If\x20the\x20Repository\x20is\x20later\x20removed\x20(disaffiliation),\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\x20affiliations\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 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 +1 @@
1
- export const PROGRESS_TEMPLATES=[{'id':'T-PR-01','name':'Single\x20named_operator\x20workflow','description':'Bind\x20a\x20single\x20named_operator\x20role\x20(e.g.\x20\x27seller\x27\x20or\x20\x27logistics\x27)\x20to\x20a\x20Progress.\x20'+'Suitable\x20for\x20linear\x20flows\x20with\x20one\x20external\x20operator\x20besides\x20OrderHolder.','applicable_scenes':['progress_named_operator','progress_task_submit'],'industry_tags':['universal','ecommerce'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'operator_name','type':'name','description':'named_operator\x20name\x20(e.g.\x20\x27seller\x27,\x20\x27logistics\x27)','required':!![]},{'name':'operator_address','type':'address','description':'Single\x20operator\x20address','required':!![]}],'body':a=>({'object':a['progress_address'],'progress_namedOperator':{'op':'set','name':a['operator_name'],'operators':[a['operator_address']]}}),'notes':['Use\x20\x27set\x27\x20for\x20initial\x20assignment\x20(REPLACE\x20list);\x20use\x20\x27add\x27\x20for\x20extending\x20existing\x20list','Operator\x20name\x20must\x20be\x20a\x20valid\x20NAME\x20(common::NAME)\x20—\x20non-empty,\x20length-bounded','Empty\x20name\x20\x27\x27\x20is\x20reserved\x20for\x20OrderHolder\x20—\x20do\x20not\x20use\x20here']},{'id':'T-PR-02','name':'Multi\x20named_operator\x20collaborative\x20workflow','description':'Bind\x20multiple\x20named_operator\x20roles\x20in\x20one\x20transaction\x20(e.g.\x20seller\x20+\x20logistics\x20+\x20reviewer).\x20'+'Suitable\x20for\x20collaborative\x20workflows\x20where\x20different\x20roles\x20advance\x20different\x20forwards.','applicable_scenes':['progress_named_operator'],'industry_tags':['logistics','arbitration','freelance'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'roles','type':'string[]','description':'named_operator\x20names\x20(e.g.\x20[\x27seller\x27,\x27logistics\x27,\x27reviewer\x27])','required':!![]},{'name':'addresses_per_role','type':'string','description':'Comma-separated\x20addresses\x20per\x20role,\x20semicolon-separated\x20roles\x20(e.g.\x20\x270xA,0xB;0xC;0xD,0xE\x27)','required':!![]}],'body':a=>{const b=a['roles'],c=a['addresses_per_role']['split'](';'),d=[];for(let e=0x0;e<b['length'];e++){const f=b[e],g=(c[e]??'')['split'](',')['map'](h=>h['trim']())['filter'](h=>h['length']>0x0);d['push']({'object':a['progress_address'],'progress_namedOperator':{'op':'set','name':f,'operators':g}});}return{'_batch':d,'_note':'Each\x20entry\x20is\x20a\x20separate\x20CallProgress_Data;\x20submit\x20all\x20in\x20one\x20transaction'};},'notes':['Each\x20role\x20must\x20satisfy\x20common::NAME\x20—\x20non-empty,\x20length-bounded','Total\x20roles\x20≤\x20MAX_NAMED_OPERATOR_COUNT\x20(60);\x20each\x20role\x27s\x20addresses\x20≤\x20MAX_NAMED_OPERATOR_ADDRESS_COUNT\x20(80)','Submit\x20all\x20operations\x20in\x20a\x20single\x20transaction\x20for\x20atomicity']},{'id':'T-PR-03','name':'Context_repository\x20binding\x20workflow','description':'Bind\x20context\x20Repository\x20objects\x20to\x20a\x20Progress\x20for\x20query-time\x20context\x20'+'(learning\x20progress,\x20inspection\x20records,\x20bridge\x20state).\x20Up\x20to\x2030\x20repositories.','applicable_scenes':['progress_context_repository'],'industry_tags':['education','content','rental','cross_chain'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'repository_addresses','type':'string[]','description':'Repository\x20object\x20addresses\x20to\x20bind','required':!![]},{'name':'op','type':'string','description':'Operation:\x20\x27add\x27\x20(extend)\x20|\x20\x27set\x27\x20(replace)\x20|\x20\x27remove\x27\x20|\x20\x27clear\x27','required':![],'default':'add'}],'body':a=>({'object':a['progress_address'],'repository':{'op':a['op']||'add','objects':a['repository_addresses']}}),'notes':['op=\x27add\x27\x20is\x20idempotent\x20(vector::contains\x20check);\x20op=\x27set\x27\x20clears\x20then\x20adds','Total\x20count\x20≤\x20MAX_CONTEXT_REPOSITORY_COUNT\x20(30);\x20E_MAX_CONTEXT_REPOSITORY_COUNT\x20on\x20overflow','Binding\x20creates\x20Registrar\x20affiliation\x20—\x20remove\x20before\x20deleting\x20Repository\x20to\x20avoid\x20dangling\x20refs','Bind\x20BEFORE\x20forward\x20advance\x20so\x20on-chain\x20guards\x20can\x20read\x20context\x20data']},{'id':'T-PR-04','name':'Forward\x20advancement\x20workflow','description':'Advance\x20a\x20Progress\x20forward\x20(next\x20or\x20hold).\x20Forwards\x20are\x20defined\x20in\x20the\x20bound\x20Machine;\x20'+'this\x20template\x20emits\x20the\x20operate\x20payload\x20for\x20a\x20single\x20forward\x20step.','applicable_scenes':['progress_completed','progress_unhold'],'industry_tags':['universal'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'next_node_name','type':'name','description':'Target\x20node\x20name\x20(must\x20exist\x20in\x20Machine)','required':!![]},{'name':'forward','type':'name','description':'Forward\x20name\x20(from\x20current\x20→\x20next_node_name)','required':!![]},{'name':'op','type':'string','description':'\x27next\x27\x20to\x20advance\x20the\x20forward,\x20\x27hold\x27\x20to\x20lock\x20the\x20forward','required':![],'default':'next'},{'name':'message','type':'string','description':'Deliverable\x20message\x20(≤\x20MAX_LONG_NAME_LENGTH)','required':![],'default':''}],'body':a=>({'object':a['progress_address'],'operate':{'operation':{'next_node_name':a['next_node_name'],'forward':a['forward']},'op':a['op']||'next','message':a['message']||''}}),'notes':['Forward\x20must\x20exist\x20in\x20Machine:\x20query\x20machine::info_borrow(machine,\x20current,\x20next_node,\x20forward)','If\x20Forward.guard\x20is\x20Some,\x20use\x20*_with_passport\x20variant\x20(SDK\x20auto-selects\x20based\x20on\x20submission)','If\x20Forward.namedOperator\x20is\x20set,\x20caller\x20must\x20be\x20in\x20that\x20operator\x20list\x20(IsNamedOperator\x20short-circuit)','op=\x27hold\x27\x20blocks\x20the\x20forward;\x20op=\x27next\x27\x20advances\x20it;\x20op=\x27unhold\x27\x20self-releases;\x20op=\x27adminUnhold\x27\x20force-releases\x20via\x20224']},{'id':'T-PR-05','name':'Unhold\x20/\x20adminUnhold\x20workflow','description':'Release\x20a\x20previously-held\x20forward.\x20Two\x20modes:\x20(a)\x20self-unhold\x20by\x20original\x20holder\x20(op=\x27unhold\x27);\x20'+'(b)\x20adminUnhold\x20via\x20224\x20permission\x20to\x20bypass\x20holder\x20check\x20(op=\x27adminUnhold\x27,\x20deadlock\x20recovery).','applicable_scenes':['progress_unhold'],'industry_tags':['content','rental','arbitration','subscription'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'next_node_name','type':'name','description':'Target\x20node\x20name\x20(matches\x20the\x20held\x20forward)','required':!![]},{'name':'forward','type':'name','description':'Forward\x20name\x20(matches\x20the\x20held\x20forward)','required':!![]},{'name':'admin_unhold','type':'string','description':'\x27true\x27\x20to\x20force-release\x20via\x20224\x20permission\x20(op=\x27adminUnhold\x27);\x20\x27false\x27\x20for\x20self-unhold\x20(op=\x27unhold\x27)','required':![],'default':'false'},{'name':'message','type':'string','description':'Release\x20message\x20(≤\x20MAX_LONG_NAME_LENGTH)','required':![],'default':''}],'body':a=>({'object':a['progress_address'],'operate':{'operation':{'next_node_name':a['next_node_name'],'forward':a['forward']},'op':a['admin_unhold']==='true'?'adminUnhold':'unhold','message':a['message']||''}}),'notes':['op=\x27unhold\x27:\x20sender\x20must\x20==\x20Holder.who;\x20else\x20E_NOT_THE_HOLDER','op=\x27adminUnhold\x27:\x20requires\x20224\x20permission\x20(PROGRESS_UNHOLD);\x20bypasses\x20holder\x20check','Re-hold\x20on\x20already-accomplished\x20forward\x20→\x20E_FORWARD_ALREADY_ACCOMPLISHED','Use\x20adminUnhold\x20sparingly\x20—\x20log\x20every\x20invocation\x20for\x20audit']},{'id':'T-PR-06','name':'Owner\x20receive\x20workflow','description':'Owner\x20receives\x20Receiving<K>\x20objects\x20or\x20CoinWrapper<T>\x20coins\x20at\x20a\x20terminal\x20node.\x20'+'Unwraps\x20via\x20Payment.unwrap_with_check;\x20forwards\x20to\x20Permission\x20owner.\x20'+'Note:\x20NOT\x20exposed\x20in\x20CallProgress_Data\x20—\x20direct\x20Move\x20call\x20required.','applicable_scenes':['progress_owner_receive'],'industry_tags':['finance','treasury','rental','freelance'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'machine_address','type':'address','description':'Bound\x20Machine\x20object\x20address','required':!![]},{'name':'permission_address','type':'address','description':'Machine\x27s\x20Permission\x20object\x20address','required':!![]},{'name':'asset_type','type':'string','description':'\x27coin\x27\x20or\x20\x27object\x27','required':!![]},{'name':'received_object','type':'address','description':'Receiving<K>\x20object\x20address\x20(the\x20received\x20\x27envelope\x27)','required':!![]},{'name':'payment_object','type':'address','description':'Payment<T>\x20object\x20address\x20(only\x20for\x20asset_type=\x27coin\x27)','required':![]}],'body':a=>({'_note':'This\x20operation\x20is\x20NOT\x20exposed\x20via\x20CallProgress_Data;\x20must\x20be\x20called\x20via\x20direct\x20Move\x20call.','_move_target':a['asset_type']==='coin'?'progress::owner_receive<T>':'progress::owner_receive_object<K>','_arguments':a['asset_type']==='coin'?[a['progress_address'],a['machine_address'],a['permission_address'],a['received_object'],a['payment_object']]:[a['progress_address'],a['machine_address'],a['permission_address'],a['received_object']],'_permission_required':0xe1,'_permission_label':'PROGRESS_OWNER_RECEIVE'}),'notes':['Permission\x20225\x20(PROGRESS_OWNER_RECEIVE)\x20is\x20required;\x20SDK\x20CallProgress_Data\x20does\x20NOT\x20expose\x20this\x20op','Recipient\x20is\x20Permission\x20owner\x20(Machine.permission\x27s\x20owner),\x20NOT\x20Progress\x20creator','Triggered\x20at\x20terminal\x20nodes:\x20\x27return_approved\x27,\x20\x27completed\x27,\x20\x27enforced\x27,\x20\x27paid\x27','For\x20coins:\x20Payment.unwrap_with_check\x20validates\x20amount\x20before\x20forwarding\x20to\x20owner','For\x20objects:\x20generic\x20K:key+store\x20—\x20forwarded\x20directly\x20via\x20permission::owner_receive_inner']}];export const PROGRESS_TEMPLATES_VERSION='1.0.0';export function getAllProgressTemplates(){return[...PROGRESS_TEMPLATES];}export function getProgressTemplateById(a){return PROGRESS_TEMPLATES['find'](b=>b['id']===a);}export function getProgressTemplatesByScene(a){return PROGRESS_TEMPLATES['filter'](b=>b['applicable_scenes']['includes'](a));}export function getProgressTemplatesByIndustry(a){return PROGRESS_TEMPLATES['filter'](b=>b['industry_tags']['includes'](a)||b['industry_tags']['includes']('universal'));}export function suggestProgressTemplateForScene(a){const b=getProgressTemplatesByScene(a);return b['length']>0x0?b[0x0]:undefined;}export function listProgressTemplates(){return PROGRESS_TEMPLATES['map'](a=>({'id':a['id'],'name':a['name'],'description':a['description'],'scenes':a['applicable_scenes']}));}export function fillProgressTemplate(a,b){const c=getProgressTemplateById(a);if(!c)return{'ok':![],'error':'Template\x20'+a+'\x20not\x20found'};for(const d of c['params']){if(d['required']&&!(d['name']in b))return{'ok':![],'error':'Missing\x20required\x20param:\x20'+d['name']};}return{'ok':!![],'body':c['body'](b)};}
1
+ export const PROGRESS_TEMPLATES=[{'id':'T-PR-01','name':'Single\x20named_operator\x20workflow','description':'Bind\x20a\x20single\x20named_operator\x20role\x20(e.g.\x20\x27seller\x27\x20or\x20\x27logistics\x27)\x20to\x20a\x20Progress.\x20'+'Suitable\x20for\x20linear\x20flows\x20with\x20one\x20external\x20operator\x20besides\x20OrderHolder.','applicable_scenes':['progress_named_operator','progress_task_submit'],'industry_tags':['universal','ecommerce'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'operator_name','type':'name','description':'named_operator\x20name\x20(e.g.\x20\x27seller\x27,\x20\x27logistics\x27)','required':!![]},{'name':'operator_address','type':'address','description':'Single\x20operator\x20address','required':!![]}],'body':a=>({'object':a['progress_address'],'progress_namedOperator':{'op':'set','name':a['operator_name'],'operators':[a['operator_address']]}}),'notes':['Use\x20\x27set\x27\x20for\x20initial\x20assignment\x20(REPLACE\x20list);\x20use\x20\x27add\x27\x20for\x20extending\x20existing\x20list','Operator\x20name\x20must\x20be\x20a\x20valid\x20NAME\x20(common::NAME)\x20—\x20non-empty,\x20length-bounded','Empty\x20name\x20\x27\x27\x20is\x20reserved\x20for\x20OrderHolder\x20—\x20do\x20not\x20use\x20here']},{'id':'T-PR-02','name':'Multi\x20named_operator\x20collaborative\x20workflow','description':'Bind\x20multiple\x20named_operator\x20roles\x20in\x20one\x20transaction\x20(e.g.\x20seller\x20+\x20logistics\x20+\x20reviewer).\x20'+'Suitable\x20for\x20collaborative\x20workflows\x20where\x20different\x20roles\x20advance\x20different\x20forwards.','applicable_scenes':['progress_named_operator'],'industry_tags':['logistics','arbitration','freelance'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'roles','type':'string[]','description':'named_operator\x20names\x20(e.g.\x20[\x27seller\x27,\x27logistics\x27,\x27reviewer\x27])','required':!![]},{'name':'addresses_per_role','type':'string','description':'Comma-separated\x20addresses\x20per\x20role,\x20semicolon-separated\x20roles\x20(e.g.\x20\x270xA,0xB;0xC;0xD,0xE\x27)','required':!![]}],'body':a=>{const b=a['roles'],c=a['addresses_per_role']['split'](';'),d=[];for(let e=0x0;e<b['length'];e++){const f=b[e],g=(c[e]??'')['split'](',')['map'](h=>h['trim']())['filter'](h=>h['length']>0x0);d['push']({'object':a['progress_address'],'progress_namedOperator':{'op':'set','name':f,'operators':g}});}return{'_batch':d,'_note':'Each\x20entry\x20is\x20a\x20separate\x20CallProgress_Data;\x20submit\x20all\x20in\x20one\x20transaction'};},'notes':['Each\x20role\x20must\x20satisfy\x20common::NAME\x20—\x20non-empty,\x20length-bounded','Total\x20roles\x20≤\x20MAX_NAMED_OPERATOR_COUNT\x20(60);\x20each\x20role\x27s\x20addresses\x20≤\x20MAX_NAMED_OPERATOR_ADDRESS_COUNT\x20(80)','Submit\x20all\x20operations\x20in\x20a\x20single\x20transaction\x20for\x20atomicity']},{'id':'T-PR-03','name':'Context_repository\x20binding\x20workflow','description':'Bind\x20context\x20Repository\x20objects\x20to\x20a\x20Progress\x20for\x20query-time\x20context\x20'+'(learning\x20progress,\x20inspection\x20records,\x20bridge\x20state).\x20Up\x20to\x2030\x20repositories.','applicable_scenes':['progress_context_repository'],'industry_tags':['education','content','rental','cross_chain'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'repository_addresses','type':'string[]','description':'Repository\x20object\x20addresses\x20to\x20bind','required':!![]},{'name':'op','type':'string','description':'Operation:\x20\x27add\x27\x20(extend)\x20|\x20\x27set\x27\x20(replace)\x20|\x20\x27remove\x27\x20|\x20\x27clear\x27','required':![],'default':'add'}],'body':a=>({'object':a['progress_address'],'repository':{'op':a['op']||'add','objects':a['repository_addresses']}}),'notes':['op=\x27add\x27\x20is\x20idempotent\x20(vector::contains\x20check);\x20op=\x27set\x27\x20clears\x20then\x20adds','Total\x20count\x20≤\x20MAX_CONTEXT_REPOSITORY_COUNT\x20(30);\x20E_MAX_CONTEXT_REPOSITORY_COUNT\x20on\x20overflow','Binding\x20creates\x20object-linker\x20tx\x20binding\x20—\x20remove\x20before\x20deleting\x20Repository\x20to\x20avoid\x20dangling\x20refs','Bind\x20BEFORE\x20forward\x20advance\x20so\x20on-chain\x20guards\x20can\x20read\x20context\x20data']},{'id':'T-PR-04','name':'Forward\x20advancement\x20workflow','description':'Advance\x20a\x20Progress\x20forward\x20(next\x20or\x20hold).\x20Forwards\x20are\x20defined\x20in\x20the\x20bound\x20Machine;\x20'+'this\x20template\x20emits\x20the\x20operate\x20payload\x20for\x20a\x20single\x20forward\x20step.','applicable_scenes':['progress_completed','progress_unhold'],'industry_tags':['universal'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'next_node_name','type':'name','description':'Target\x20node\x20name\x20(must\x20exist\x20in\x20Machine)','required':!![]},{'name':'forward','type':'name','description':'Forward\x20name\x20(from\x20current\x20→\x20next_node_name)','required':!![]},{'name':'op','type':'string','description':'\x27next\x27\x20to\x20advance\x20the\x20forward,\x20\x27hold\x27\x20to\x20lock\x20the\x20forward','required':![],'default':'next'},{'name':'message','type':'string','description':'Deliverable\x20message\x20(≤\x20MAX_LONG_NAME_LENGTH)','required':![],'default':''}],'body':a=>({'object':a['progress_address'],'operate':{'operation':{'next_node_name':a['next_node_name'],'forward':a['forward']},'op':a['op']||'next','message':a['message']||''}}),'notes':['Forward\x20must\x20exist\x20in\x20Machine:\x20query\x20machine::info_borrow(machine,\x20current,\x20next_node,\x20forward)','If\x20Forward.guard\x20is\x20Some,\x20use\x20*_with_passport\x20variant\x20(SDK\x20auto-selects\x20based\x20on\x20submission)','If\x20Forward.namedOperator\x20is\x20set,\x20caller\x20must\x20be\x20in\x20that\x20operator\x20list\x20(IsNamedOperator\x20short-circuit)','op=\x27hold\x27\x20blocks\x20the\x20forward;\x20op=\x27next\x27\x20advances\x20it;\x20op=\x27unhold\x27\x20self-releases;\x20op=\x27adminUnhold\x27\x20force-releases\x20via\x20224']},{'id':'T-PR-05','name':'Unhold\x20/\x20adminUnhold\x20workflow','description':'Release\x20a\x20previously-held\x20forward.\x20Two\x20modes:\x20(a)\x20self-unhold\x20by\x20original\x20holder\x20(op=\x27unhold\x27);\x20'+'(b)\x20adminUnhold\x20via\x20224\x20permission\x20to\x20bypass\x20holder\x20check\x20(op=\x27adminUnhold\x27,\x20deadlock\x20recovery).','applicable_scenes':['progress_unhold'],'industry_tags':['content','rental','arbitration','subscription'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'next_node_name','type':'name','description':'Target\x20node\x20name\x20(matches\x20the\x20held\x20forward)','required':!![]},{'name':'forward','type':'name','description':'Forward\x20name\x20(matches\x20the\x20held\x20forward)','required':!![]},{'name':'admin_unhold','type':'string','description':'\x27true\x27\x20to\x20force-release\x20via\x20224\x20permission\x20(op=\x27adminUnhold\x27);\x20\x27false\x27\x20for\x20self-unhold\x20(op=\x27unhold\x27)','required':![],'default':'false'},{'name':'message','type':'string','description':'Release\x20message\x20(≤\x20MAX_LONG_NAME_LENGTH)','required':![],'default':''}],'body':a=>({'object':a['progress_address'],'operate':{'operation':{'next_node_name':a['next_node_name'],'forward':a['forward']},'op':a['admin_unhold']==='true'?'adminUnhold':'unhold','message':a['message']||''}}),'notes':['op=\x27unhold\x27:\x20sender\x20must\x20==\x20Holder.who;\x20else\x20E_NOT_THE_HOLDER','op=\x27adminUnhold\x27:\x20requires\x20224\x20permission\x20(PROGRESS_UNHOLD);\x20bypasses\x20holder\x20check','Re-hold\x20on\x20already-accomplished\x20forward\x20→\x20E_FORWARD_ALREADY_ACCOMPLISHED','Use\x20adminUnhold\x20sparingly\x20—\x20log\x20every\x20invocation\x20for\x20audit']},{'id':'T-PR-06','name':'Owner\x20receive\x20workflow','description':'Owner\x20receives\x20Receiving<K>\x20objects\x20or\x20CoinWrapper<T>\x20coins\x20at\x20a\x20terminal\x20node.\x20'+'Unwraps\x20via\x20Payment.unwrap_with_check;\x20forwards\x20to\x20Permission\x20owner.\x20'+'Note:\x20NOT\x20exposed\x20in\x20CallProgress_Data\x20—\x20direct\x20Move\x20call\x20required.','applicable_scenes':['progress_owner_receive'],'industry_tags':['finance','treasury','rental','freelance'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'machine_address','type':'address','description':'Bound\x20Machine\x20object\x20address','required':!![]},{'name':'permission_address','type':'address','description':'Machine\x27s\x20Permission\x20object\x20address','required':!![]},{'name':'asset_type','type':'string','description':'\x27coin\x27\x20or\x20\x27object\x27','required':!![]},{'name':'received_object','type':'address','description':'Receiving<K>\x20object\x20address\x20(the\x20received\x20\x27envelope\x27)','required':!![]},{'name':'payment_object','type':'address','description':'Payment<T>\x20object\x20address\x20(only\x20for\x20asset_type=\x27coin\x27)','required':![]}],'body':a=>({'_note':'This\x20operation\x20is\x20NOT\x20exposed\x20via\x20CallProgress_Data;\x20must\x20be\x20called\x20via\x20direct\x20Move\x20call.','_move_target':a['asset_type']==='coin'?'progress::owner_receive<T>':'progress::owner_receive_object<K>','_arguments':a['asset_type']==='coin'?[a['progress_address'],a['machine_address'],a['permission_address'],a['received_object'],a['payment_object']]:[a['progress_address'],a['machine_address'],a['permission_address'],a['received_object']],'_permission_required':0xe1,'_permission_label':'PROGRESS_OWNER_RECEIVE'}),'notes':['Permission\x20225\x20(PROGRESS_OWNER_RECEIVE)\x20is\x20required;\x20SDK\x20CallProgress_Data\x20does\x20NOT\x20expose\x20this\x20op','Recipient\x20is\x20Permission\x20owner\x20(Machine.permission\x27s\x20owner),\x20NOT\x20Progress\x20creator','Triggered\x20at\x20terminal\x20nodes:\x20\x27return_approved\x27,\x20\x27completed\x27,\x20\x27enforced\x27,\x20\x27paid\x27','For\x20coins:\x20Payment.unwrap_with_check\x20validates\x20amount\x20before\x20forwarding\x20to\x20owner','For\x20objects:\x20generic\x20K:key+store\x20—\x20forwarded\x20directly\x20via\x20permission::owner_receive_inner']}];export const PROGRESS_TEMPLATES_VERSION='1.0.0';export function getAllProgressTemplates(){return[...PROGRESS_TEMPLATES];}export function getProgressTemplateById(a){return PROGRESS_TEMPLATES['find'](b=>b['id']===a);}export function getProgressTemplatesByScene(a){return PROGRESS_TEMPLATES['filter'](b=>b['applicable_scenes']['includes'](a));}export function getProgressTemplatesByIndustry(a){return PROGRESS_TEMPLATES['filter'](b=>b['industry_tags']['includes'](a)||b['industry_tags']['includes']('universal'));}export function suggestProgressTemplateForScene(a){const b=getProgressTemplatesByScene(a);return b['length']>0x0?b[0x0]:undefined;}export function listProgressTemplates(){return PROGRESS_TEMPLATES['map'](a=>({'id':a['id'],'name':a['name'],'description':a['description'],'scenes':a['applicable_scenes']}));}export function fillProgressTemplate(a,b){const c=getProgressTemplateById(a);if(!c)return{'ok':![],'error':'Template\x20'+a+'\x20not\x20found'};for(const d of c['params']){if(d['required']&&!(d['name']in b))return{'ok':![],'error':'Missing\x20required\x20param:\x20'+d['name']};}return{'ok':!![],'body':c['body'](b)};}