@wowok/agent-mcp 3.3.8 → 3.4.0
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.
- package/dist/chain-semantics/field-capability.js +1 -1
- package/dist/chain-semantics/freeze-map.js +1 -1
- package/dist/chain-semantics/fund-flow.js +1 -1
- package/dist/chain-semantics/guard-verbs.js +1 -1
- package/dist/chain-semantics/object-graph.js +1 -1
- package/dist/composition/audit.js +1 -1
- package/dist/composition/compile.d.ts +3 -2
- package/dist/composition/compile.js +1 -1
- package/dist/composition/inflight.d.ts +6 -0
- package/dist/composition/inflight.js +1 -1
- package/dist/composition/materialize.d.ts +4 -0
- package/dist/composition/materialize.js +1 -1
- package/dist/composition/param-disclosure.d.ts +61 -0
- package/dist/composition/param-disclosure.js +1 -0
- package/dist/composition/plan.d.ts +11 -1
- package/dist/composition/plan.js +1 -1
- package/dist/customer/account-events.js +1 -1
- package/dist/data/api/api.spec.js +1 -1
- package/dist/data/api/cli.js +1 -1
- package/dist/data/api/server.d.ts +1 -0
- package/dist/data/api/server.js +1 -1
- package/dist/data/projection/store.d.ts +2 -1
- package/dist/data/projection/store.js +1 -1
- package/dist/data/projection/types.d.ts +10 -0
- package/dist/data/sync/cdc.js +1 -1
- package/dist/data/sync/cdc.spec.js +1 -1
- package/dist/data/sync/store.d.ts +5 -0
- package/dist/data/sync/store.js +1 -1
- package/dist/data/sync/types.d.ts +2 -0
- package/dist/evaluation/builtins/graph-service.spec.js +1 -1
- package/dist/evaluation/engine.js +1 -1
- package/dist/evaluation/guard-scan.js +1 -1
- package/dist/experience/realtime-feedback.js +1 -1
- package/dist/extensions/business-modules.js +1 -1
- package/dist/extensions/industry-pack.js +1 -1
- package/dist/extensions/modes.js +1 -1
- package/dist/graph/onchain/expand.js +1 -1
- package/dist/graph/onchain/exposure.js +1 -1
- package/dist/harness/recover.js +1 -1
- package/dist/index.js +1 -1
- package/dist/knowledge/allocation-risk.js +1 -1
- package/dist/knowledge/allocation-templates.js +1 -1
- package/dist/knowledge/allocator-rail-verifier.js +1 -1
- package/dist/knowledge/arb-fund-facts.d.ts +1 -0
- package/dist/knowledge/arb-fund-facts.js +1 -1
- package/dist/knowledge/arbitration-ledger.js +1 -1
- package/dist/knowledge/arbitration-risk.d.ts +1 -0
- package/dist/knowledge/arbitration-risk.js +1 -1
- package/dist/knowledge/audit-rules.js +1 -1
- package/dist/knowledge/baselines/rules/allocation.json +6 -6
- package/dist/knowledge/baselines/rules/arb.json +2 -2
- package/dist/knowledge/baselines/rules/guard.json +11 -11
- package/dist/knowledge/baselines/rules/order.json +1 -1
- package/dist/knowledge/baselines/rules/plan.json +1 -1
- package/dist/knowledge/baselines/semantic-facts.js +1 -1
- package/dist/knowledge/builtin-templates.d.ts +14 -1
- package/dist/knowledge/builtin-templates.js +1 -1
- package/dist/knowledge/catalog-facts.d.ts +4 -0
- package/dist/knowledge/catalog-facts.js +1 -0
- package/dist/knowledge/commission-landing.js +1 -1
- package/dist/knowledge/component-schema.d.ts +64 -0
- package/dist/knowledge/component-schema.js +1 -0
- package/dist/knowledge/entity-recipient-guard.js +1 -1
- package/dist/knowledge/event-semantics.js +1 -1
- package/dist/knowledge/fee-param-bindings.d.ts +26 -0
- package/dist/knowledge/fee-param-bindings.js +1 -0
- package/dist/knowledge/fund-layer.js +1 -1
- package/dist/knowledge/getting-started.d.ts +2 -2
- package/dist/knowledge/getting-started.js +1 -1
- package/dist/knowledge/guard-anchor-reach.js +1 -1
- package/dist/knowledge/guard-design-patterns.js +1 -1
- package/dist/knowledge/guard-ledger.js +1 -1
- package/dist/knowledge/guard-lint.d.ts +1 -0
- package/dist/knowledge/guard-lint.js +1 -1
- package/dist/knowledge/guard-puzzle.js +1 -1
- package/dist/knowledge/guard-risk.js +1 -1
- package/dist/knowledge/guard-templates.d.ts +1 -1
- package/dist/knowledge/guard-templates.js +1 -1
- package/dist/knowledge/guard-translation.js +1 -1
- package/dist/knowledge/index.js +1 -1
- package/dist/knowledge/industry-registry.js +1 -1
- package/dist/knowledge/industry-strategy.js +1 -1
- package/dist/knowledge/jsonrpc-enum.d.ts +14 -3
- package/dist/knowledge/jsonrpc-enum.js +1 -1
- package/dist/knowledge/knob-docs.d.ts +5 -0
- package/dist/knowledge/knob-docs.js +1 -0
- package/dist/knowledge/machine-templates.js +1 -1
- package/dist/knowledge/machine-topology.js +1 -1
- package/dist/knowledge/machine-translation.js +1 -1
- package/dist/knowledge/onchain-constants.d.ts +2 -0
- package/dist/knowledge/onchain-constants.js +1 -1
- package/dist/knowledge/order-ledger.js +1 -1
- package/dist/knowledge/param-schema.d.ts +70 -0
- package/dist/knowledge/param-schema.js +1 -0
- package/dist/knowledge/param-tiers.d.ts +25 -0
- package/dist/knowledge/param-tiers.js +1 -0
- package/dist/knowledge/passport-ledger.d.ts +1 -1
- package/dist/knowledge/passport-ledger.js +1 -1
- package/dist/knowledge/pattern-resolutions.d.ts +106 -0
- package/dist/knowledge/pattern-resolutions.js +1 -0
- package/dist/knowledge/projection.spec.js +1 -1
- package/dist/knowledge/safety-rules.js +1 -1
- package/dist/knowledge/scenario-modes.d.ts +1 -0
- package/dist/knowledge/scenario-modes.js +1 -1
- package/dist/knowledge/scenario-topology.js +1 -1
- package/dist/knowledge/service-allocation-semantics.js +1 -1
- package/dist/knowledge/service-ledger.js +1 -1
- package/dist/knowledge/service-templates.js +1 -1
- package/dist/knowledge/strategy-manuals.d.ts +1 -1
- package/dist/knowledge/strategy-manuals.js +1 -1
- package/dist/knowledge/template-loader.d.ts +101 -1
- package/dist/knowledge/template-loader.js +1 -1
- package/dist/knowledge/template-nav.d.ts +7 -0
- package/dist/knowledge/template-nav.js +1 -0
- package/dist/knowledge/template-registry.js +1 -1
- package/dist/knowledge/template-scanner.d.ts +33 -0
- package/dist/knowledge/template-scanner.js +1 -1
- package/dist/knowledge/template-test-profiles.d.ts +17 -0
- package/dist/knowledge/template-test-profiles.js +1 -0
- package/dist/knowledge/template-validation.d.ts +1 -0
- package/dist/knowledge/template-validation.js +1 -1
- package/dist/knowledge/tools-reference.js +1 -1
- package/dist/knowledge/treasury-templates.js +1 -1
- package/dist/knowledge/workflow-guidance.js +1 -1
- package/dist/monitor/MonitorLoop.js +1 -1
- package/dist/participation/time-window.d.ts +37 -0
- package/dist/participation/time-window.js +1 -0
- package/dist/playbooks/service-build/business-puzzle.js +1 -1
- package/dist/playbooks/service-build/machine-panorama.d.ts +1 -0
- package/dist/playbooks/service-build/machine-panorama.js +1 -1
- package/dist/playbooks/service-build/merchant-guide.d.ts +4 -1
- package/dist/playbooks/service-build/merchant-guide.js +1 -1
- package/dist/playbooks/service-build/migration-planner.js +1 -1
- package/dist/playbooks/service-build/object-panorama.js +1 -1
- package/dist/playbooks/service-build/participation-radar.d.ts +1 -0
- package/dist/playbooks/service-build/participation-radar.js +1 -1
- package/dist/playbooks/service-build/relationship-profile.js +1 -1
- package/dist/playbooks/service-build/service-panorama.d.ts +1 -0
- package/dist/playbooks/service-build/service-panorama.js +1 -1
- package/dist/playbooks/service-build/service-quote.js +1 -1
- package/dist/playbooks/service-build/service-quote.spec.js +1 -1
- package/dist/playbooks/service-build/workflow-design-assessment.js +1 -1
- package/dist/relationship/registry.js +1 -1
- package/dist/review/index.js +1 -1
- package/dist/runtime/instance-registry.d.ts +7 -1
- package/dist/runtime/instance-registry.js +1 -1
- package/dist/safety/confirm-gate.js +1 -1
- package/dist/schema/benchmark-migration/index.d.ts +2 -0
- package/dist/schema/benchmark-migration/index.js +1 -1
- package/dist/schema/call/allocation.js +1 -1
- package/dist/schema/call/arbitration.js +1 -1
- package/dist/schema/call/base.d.ts +8 -0
- package/dist/schema/call/base.js +1 -1
- package/dist/schema/call/bridge.d.ts +2 -0
- package/dist/schema/call/error-codes.d.ts +1 -1
- package/dist/schema/call/error-codes.js +1 -1
- package/dist/schema/call/guard.js +1 -1
- package/dist/schema/call/handler.js +1 -1
- package/dist/schema/call/machine.js +1 -1
- package/dist/schema/call/semantic.js +1 -1
- package/dist/schema/call/service.d.ts +3 -3
- package/dist/schema/call/service.js +1 -1
- package/dist/schema/common/index.js +1 -1
- package/dist/schema/evaluation/index.d.ts +8 -0
- package/dist/schema/evaluation/index.js +1 -1
- package/dist/schema/goal/planning.d.ts +1 -0
- package/dist/schema/goal/planning.js +1 -1
- package/dist/schema/industry-pack/index.d.ts +29 -0
- package/dist/schema/industry-pack/index.js +1 -1
- package/dist/schema/local/index.d.ts +20 -0
- package/dist/schema/local/index.js +1 -1
- package/dist/schema/messenger/index.d.ts +2 -0
- package/dist/schema/messenger/index.js +1 -1
- package/dist/schema/operations.d.ts +1 -1
- package/dist/schema/operations.js +1 -1
- package/dist/schema/query/bi.d.ts +106 -0
- package/dist/schema/query/bi.js +1 -1
- package/dist/schema/query/index.d.ts +5 -5
- package/dist/schema/query/index.js +1 -1
- package/dist/schema/schema-version.js +1 -1
- package/dist/schema/watch/index.js +1 -1
- package/dist/schema-query-impl/index.js +1 -1
- package/dist/schemas/account_operation.output.json +4 -2
- package/dist/schemas/benchmark_migration_operation.output.json +3 -3
- package/dist/schemas/benchmark_migration_operation.schema.json +16 -2
- package/dist/schemas/bridge_operation.output.json +4 -2
- package/dist/schemas/bridge_operation.schema.json +5 -5
- package/dist/schemas/evaluation_operation.output.json +16 -0
- package/dist/schemas/guard2file.schema.json +1 -1
- package/dist/schemas/index.json +1 -1
- package/dist/schemas/industry_pack_operation.output.json +150 -1
- package/dist/schemas/industry_pack_operation.schema.json +9 -3
- package/dist/schemas/keeper_operation.output.json +2 -2
- package/dist/schemas/local_cache_operation.output.json +4 -2
- package/dist/schemas/local_history_operation.output.json +4 -2
- package/dist/schemas/local_info_operation.output.json +4 -2
- package/dist/schemas/local_mark_operation.output.json +4 -2
- package/dist/schemas/machineNode2file.schema.json +1 -1
- package/dist/schemas/messenger_operation.output.json +13 -2
- package/dist/schemas/messenger_operation.schema.json +41 -34
- package/dist/schemas/monitor_events.output.json +2 -2
- package/dist/schemas/monitor_subscription.output.json +2 -2
- package/dist/schemas/onchain_events.output.json +14 -14
- package/dist/schemas/onchain_operations.output.json +13 -10
- package/dist/schemas/onchain_operations.schema.json +124 -99
- package/dist/schemas/onchain_operations_allocation.schema.json +7 -6
- package/dist/schemas/onchain_operations_arbitration.schema.json +7 -6
- package/dist/schemas/onchain_operations_contact.schema.json +4 -3
- package/dist/schemas/onchain_operations_demand.schema.json +4 -3
- package/dist/schemas/onchain_operations_gen_passport.schema.json +4 -3
- package/dist/schemas/onchain_operations_gen_proof.schema.json +1 -1
- package/dist/schemas/onchain_operations_guard.schema.json +7 -6
- package/dist/schemas/onchain_operations_machine.schema.json +9 -7
- package/dist/schemas/onchain_operations_order.schema.json +6 -4
- package/dist/schemas/onchain_operations_payment.schema.json +2 -2
- package/dist/schemas/onchain_operations_permission.schema.json +19 -15
- package/dist/schemas/onchain_operations_personal.schema.json +17 -14
- package/dist/schemas/onchain_operations_progress.schema.json +6 -4
- package/dist/schemas/onchain_operations_proof.schema.json +4 -3
- package/dist/schemas/onchain_operations_repository.schema.json +9 -7
- package/dist/schemas/onchain_operations_reward.schema.json +5 -4
- package/dist/schemas/onchain_operations_service.schema.json +15 -12
- package/dist/schemas/onchain_operations_treasury.schema.json +4 -3
- package/dist/schemas/onchain_table_data.output.json +18 -13
- package/dist/schemas/onchain_table_data.schema.json +13 -13
- package/dist/schemas/query_toolkit.output.json +301 -33
- package/dist/schemas/query_toolkit.schema.json +6 -6
- package/dist/schemas/watch_operation.output.json +3 -3
- package/dist/schemas/workflow_operation.schema.json +3 -2
- package/dist/schemas/wowok_buildin_info.schema.json +1 -1
- package/dist/task/playbook.js +1 -1
- package/dist/tools/handlers/benchmark-migration.d.ts +1 -0
- package/dist/tools/handlers/benchmark-migration.js +1 -1
- package/dist/tools/handlers/config.js +1 -1
- package/dist/tools/handlers/evaluation.js +1 -1
- package/dist/tools/handlers/evaluation.spec.js +1 -1
- package/dist/tools/handlers/industry-pack.js +1 -1
- package/dist/tools/handlers/messenger.js +1 -1
- package/dist/tools/handlers/onchain.d.ts +4 -0
- package/dist/tools/handlers/onchain.js +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/registry/business.js +1 -1
- package/dist/tools/registry/onchain.js +1 -1
- package/dist/tools/registry/query.js +1 -1
- package/dist/tools/sanitize-output.js +1 -1
- package/dist/tools/sanitize-output.spec.js +1 -1
- package/dist/tools/types.d.ts +1 -0
- package/dist/tools/upgrade-check.d.ts +22 -0
- package/dist/tools/upgrade-check.js +1 -1
- package/dist/tools/wrap.d.ts +1 -1
- package/dist/tools/wrap.js +1 -1
- package/package.json +7 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
export const GUARD_SCENES=[{'id':'service_buy_guard','name':'Service\x20purchase\x20validation\x20(buy_guard)','host_object':'Service','binding_field':'buy_guard','validation_scene':'When\x20a\x20customer\x20places\x20an\x20order\x20to\x20purchase\x20a\x20service,\x20the\x20Guard\x20validates\x20whether\x20the\x20customer\x20is\x20eligible\x20to\x20purchase\x20(identity/permission/condition)','pass_result':'Create\x20the\x20Order\x20object;\x20the\x20customer\x20enters\x20the\x20payment\x20flow','fail_result':'Transaction\x20rejected;\x20Order\x20is\x20not\x20created;\x20the\x20customer\x20cannot\x20purchase','submission_source':'Customer\x20(signer\x20address,\x20credentials,\x20Passport,\x20etc.)','special_constraints':['The\x20Guard\x20table\x20must\x20declare\x20all\x20data\x20the\x20customer\x20needs\x20to\x20submit','The\x20name\x20of\x20b_submission=true\x20entries\x20must\x20be\x20a\x20natural-language\x20description\x20(the\x20contract\x20the\x20customer\x20sees)','If\x20the\x20Guard\x20references\x20the\x20Service\x20itself,\x20use\x20the\x20circular\x20reference\x20pattern\x20(CREATE\x20Service\x20→\x20CREATE\x20Guard\x20→\x20MODIFY\x20Service)','buy_guard\x20can\x20still\x20be\x20modified\x20after\x20Service\x20is\x20published\x20(via\x20MODIFY\x20Service)','Reentrancy:\x20LOW\x20—\x20Each\x20purchase\x20creates\x20a\x20fresh\x20Order;\x20no\x20existing\x20Order\x20state\x20is\x20modified.\x20Default:\x20no\x20reentrancy\x20risk.\x20IF\x20business\x20intent\x20is\x20\x27limit\x20one\x20purchase\x20per\x20user\x27\x20(limited-edition\x20goods,\x20whitelist\x20single-buy),\x20an\x20anti-reentrancy\x20check\x20is\x20REQUIRED\x20but\x20no\x20direct\x20GUARDQUERY\x20primitive\x20exists\x20for\x20per-user\x20purchase\x20history\x20—\x20use\x20a\x20Repository\x20to\x20record\x20prior\x20purchases\x20and\x20add\x20`repository.data\x20has`\x20(query\x201166)\x20+\x20`logic_not`\x20to\x20the\x20BUY\x20guard\x20root\x20(READ\x20side\x20only\x20—\x20never\x20inside\x20a\x20write-guard\x20verified\x20in\x20the\x20write\x20PTB,\x20ofn-mn-261012\x20F-02),\x20or\x20revoke\x20EntityRegistrar\x20membership\x20after\x20first\x20buy'],'common_patterns':['Identity\x20check:\x20context(Signer)\x20+\x20logic_equal\x20(single\x20address)\x20/\x20vec_contains_address\x20(whitelist)','Membership\x20validation:\x20query\x20EntityRegistrar(0xaab)\x20+\x20logic_and\x20combination','Time\x20limit:\x20context(Clock)\x20+\x20logic_as_u256_greater_or_equal(open_time)\x20for\x20an\x20OPENING\x20window\x20(valid\x20from\x20open\x20onwards);\x20for\x20a\x20DEADLINE\x20window\x20use\x20logic_as_u256_lesser_or_equal(calc_number_add(anchor,\x20duration))\x20—\x20Clock\x20<=\x20anchor+N.\x20NEVER\x20greater_or_equal(end_time):\x20inverts\x20the\x20window\x20(rejects\x20everything\x20inside\x20it,\x20admits\x20everything\x20after\x20it).\x20See\x20pattern.deadline_window','Multi-condition:\x20logic_and\x20combining\x20multiple\x20checks'],'mutable_after_publish':!![],'r_rounds_focus':['R1','R2','R3','R5','R7','R9']},{'id':'service_order_allocators_guard','name':'Allocation\x20strategy\x20selection\x20validation\x20(order_allocators[].guard)','host_object':'Service','binding_field':'order_allocators','validation_scene':'When\x20an\x20order\x20is\x20completed\x20or\x20allocation\x20conditions\x20are\x20met,\x20the\x20caller\x20submits\x20ONE\x20guard.\x20Every\x20allocator\x20bound\x20to\x20that\x20guard\x20fires,\x20in\x20vector\x20order,\x20each\x20against\x20the\x20balance\x20left\x20by\x20the\x20previous\x20(allocation.move:366-368).','pass_result':'Execute\x20the\x20allocation\x20strategy\x20for\x20every\x20allocator\x20bound\x20to\x20the\x20submitted\x20guard','fail_result':'If\x20the\x20submitted\x20guard\x20does\x20not\x20match\x20any\x20allocator\x27s\x20guard,\x20or\x20if\x20the\x20guard\x27s\x20conditions\x20fail,\x20no\x20funds\x20are\x20distributed','submission_source':'System\x20auto-derives\x20from\x20Progress\x20state\x20(no\x20explicit\x20customer\x20submission\x20needed)','special_constraints':['A\x20distribution\x20call\x20submits\x20ONE\x20guard;\x20every\x20allocator\x20bound\x20to\x20that\x20guard\x20fires\x20in\x20vector\x20order\x20against\x20the\x20shrinking\x20pool\x20(allocation.move:366-368).\x20Allocator\x20list\x20order\x20determines\x20the\x20firing\x20sequence\x20when\x20multiple\x20allocators\x20share\x20the\x20same\x20guard,\x20NOT\x20which\x20path\x20is\x20selected','order_allocators\x20cannot\x20be\x20modified\x20after\x20Service\x20is\x20published\x20(immutable)','Guard\x20usually\x20queries\x20Order/Progress\x20state\x20to\x20determine\x20allocation\x20conditions','Common\x20queries:\x20order.amount,\x20progress.current_node,\x20order.completed,\x20etc.','GuardIdentifier\x20can\x20be\x20used\x20for\x20dynamic\x20amounts\x20(extract\x20u64\x20value\x20from\x20table\x20as\x20allocation\x20ratio)','Guard+sharing\x20coupling:\x20Guard\x20determines\x20IF\x20allocation\x20happens;\x20sharing.who\x20determines\x20WHERE\x20funds\x20go.\x20If\x20sharing.who=Signer,\x20the\x20caller\x20receives\x20funds\x20—\x20the\x20Guard\x20MUST\x20bind\x20Signer\x20(context(Signer)==authorized)\x20to\x20prevent\x20theft.\x20PREFERRED:\x20use\x20sharing.who=Entity\x20(Treasury\x20or\x20fixed\x20address)\x20so\x20funds\x20always\x20go\x20to\x20the\x20legitimate\x20recipient\x20regardless\x20of\x20caller.','allocators\x20require\x20unique\x20guard\x20addresses\x20when\x20they\x20represent\x20alternative\x20paths:\x20bind\x20each\x20path\x20to\x20its\x20OWN\x20Guard\x20object\x20(they\x20may\x20share\x20root/table\x20but\x20must\x20differ\x20in\x20description).\x20Same-guard\x20allocators\x20fire\x20sequentially\x20on\x20the\x20same\x20call,\x20which\x20is\x20only\x20correct\x20for\x20intended\x20waterfalls\x20(fee\x20first,\x20then\x20split\x20remainder)','Every\x20allocator\x20bound\x20to\x20the\x20submitted\x20guard\x20fires\x20in\x20vector\x20order.\x20Alternative\x20business\x20paths\x20(settle\x20vs\x20refund\x20vs\x20damage)\x20must\x20use\x20DIFFERENT\x20guards\x20—\x20the\x20caller\x27s\x20guard\x20choice\x20selects\x20the\x20path,\x20not\x20the\x20allocator\x20list\x20position','If\x20sharing.who=Entity\x20references\x20a\x20Treasury\x20object,\x20verify\x20the\x20Treasury\x27s\x20permission\x20is\x20consistent\x20with\x20the\x20Service\x27s\x20permission\x20(different\x20permissions\x20=\x20different\x20permission\x20organizations\x20=\x20minor\x20risk).','Reentrancy:\x20LOW\x20—\x20Protocol-level\x20protection:\x20the\x20Order\x20layer\x20asserts\x20the\x20`allocation`\x20field\x20is\x20None\x20(E_ALLOCATION_ALREADY_SPECIFIED),\x20enforcing\x20ONE\x20Allocation\x20object\x20per\x20Order,\x20ever.\x20After\x20alloc()\x20executes,\x20typical\x20Rate-mode\x20allocators\x20(sum=10000)\x20and\x20any\x20Surplus-mode\x20allocator\x20drain\x20balance\x20to\x200\x20via\x20balance::withdraw_all,\x20making\x20a\x20second\x20alloc()\x20fail\x20at\x20`assert!(balance\x20>=\x20threshold)`.\x20EDGE\x20CASE:\x20Amount-mode-only\x20allocators\x20(no\x20Surplus,\x20total\x20<\x20full\x20balance)\x20leave\x20remainder;\x20a\x20second\x20alloc()\x20could\x20extract\x20more\x20—\x20mitigated\x20by\x20preferring\x20Rate/Surplus\x20modes.\x20External\x20deposit\x20via\x20receive()\x20is\x20possible\x20but\x20irrational\x20(attacker\x20funds\x20the\x20Allocation\x20they\x20attack).\x20Optional\x20anti-reentrancy\x20primitive:\x20`order.allocation\x20some`\x20(query\x201568)\x20+\x20logic_not'],'common_patterns':['Node\x20state\x20check:\x20query(Progress.current_node)\x20+\x20logic_equal(\x27Completed\x27)','Amount\x20threshold:\x20query(Order.amount)\x20+\x20logic_as_u256_greater_or_equal(threshold)','Multi-condition\x20combination:\x20logic_and\x20(node\x20state\x20+\x20amount\x20+\x20time)','GuardIdentifier\x20dynamic\x20ratio:\x20table[u64]\x20extracts\x20allocation\x20ratio','Treasury+personal\x202-allocator\x20pattern:\x202\x20Guard\x20objects\x20(identical\x20root/table,\x20different\x20descriptions)\x20+\x202\x20allocators\x20(sharing.who=Entity\x20Treasury\x20/\x20Entity\x20personal)\x20—\x202\x20alternative\x20merchant\x20collection\x20approaches\x20bound\x20to\x20DIFFERENT\x20guards;\x20the\x20caller\x27s\x20guard\x20choice\x20selects\x20which\x20allocator\x20fires'],'mutable_after_publish':![],'r_rounds_focus':['R1','R2','R3','R5','R6','R7']},{'id':'machine_forward_guard','name':'Workflow\x20node\x20advancement\x20validation\x20(Forward.guard)','host_object':'Machine','binding_field':'Forward.guard','validation_scene':'When\x20a\x20customer\x20or\x20provider\x20executes\x20a\x20Forward\x20operation\x20to\x20advance\x20the\x20workflow,\x20the\x20Guard\x20validates\x20whether\x20advancement\x20to\x20the\x20next\x20node\x20is\x20allowed','pass_result':'Progress\x20advances\x20to\x20next_node;\x20session\x20accumulates\x20weight','fail_result':'Forward\x20is\x20blocked;\x20Progress\x20stays\x20at\x20the\x20current\x20node.\x20Optional\x20retained_submission\x20retains\x20audit\x20data','submission_source':'The\x20party\x20executing\x20Forward\x20(Customer\x20or\x20Provider,\x20depending\x20on\x20Forward\x20configuration)','special_constraints':['Forward.guard\x20cannot\x20be\x20modified\x20after\x20Machine\x20is\x20published\x20(a\x20new\x20Machine\x20must\x20be\x20created)','Optional\x20retained_submission:\x20stores\x20submission\x20data\x20in\x20Progress\x20for\x20later\x20audit','retained_submission\x20indices\x20must\x20correspond\x20to\x20the\x20Guard\x20table','Common\x20queries:\x20progress.current_node,\x20progress.session_forward,\x20order.service,\x20etc.','Fund\x20gate\x20(crs\x20P2-3):\x20allocation.balance\x20(query\x201051;\x20witness\x20TypeOrderAllocation(109)\x20resolves\x20it\x20from\x20the\x20Order\x20address)\x20gates\x20a\x20forward\x20on\x20the\x20order\x27s\x20escrow\x20balance\x20—\x20the\x20canonical\x20renewal-loop\x20convention\x20is\x20balance\x20>=\x20new-period\x20price','Time\x20lock:\x20context(Clock)\x20+\x20calc_number_add(progress.current_time,\x20duration)\x20tested\x20with\x201000ms','Reentrancy:\x20ALLOWED\x20—\x20By\x20design,\x20Forward\x20moves\x20progress.current_node\x20to\x20next_node,\x20naturally\x20invalidating\x20the\x20Guard\x20at\x20the\x20old\x20node.\x20Re-submission\x20at\x20the\x20SAME\x20node\x20(before\x20forward\x20completes)\x20is\x20intentional:\x20users\x20may\x20fix\x20prior\x20submission\x20data\x20or\x20accumulate\x20session\x20weight\x20toward\x20threshold.\x20No\x20anti-reentrancy\x20primitive\x20needed.\x20Optional\x20observability\x20queries:\x20`progress.session_forward`\x20(1262),\x20`progress.history`\x20(1273),\x20`query_progress_history_find`\x20(1274)'],'common_patterns':['Identity\x20check:\x20context(Signer)\x20+\x20logic_equal\x20(only\x20specific\x20parties\x20can\x20advance)','Time\x20lock:\x20context(Clock)\x20+\x20calc_number_add\x20+\x20logic_as_u256_greater_or_equal','Prior\x20Forward\x20completion:\x20query_progress_history_find\x20+\x20logic_equal(accomplished=true)','Submission\x20data\x20validation:\x20identifier(submission)\x20+\x20logic_equal(expected_value)','Cross-object\x20query:\x20convert_witness=TypeOrderProgress(100)\x20queries\x20Progress\x20from\x20Order;\x20convert_witness=TypeOrderAllocation(109)\x20queries\x20the\x20Allocation\x20(escrow)\x20from\x20Order'],'mutable_after_publish':![],'r_rounds_focus':['R1','R2','R3','R5','R6','R7','R8','R9']},{'id':'progress_submission_guard','name':'Progress\x20submission\x20data\x20validation\x20(submission\x20guard)','host_object':'Progress','binding_field':'submission','validation_scene':'Whether\x20the\x20data\x20(e.g.\x20signature,\x20credential,\x20confirmation)\x20submitted\x20during\x20Forward\x20execution\x20satisfies\x20the\x20Guard\x20condition','pass_result':'Forward\x20completes;\x20node\x20advances\x20after\x20session\x20accumulates\x20weight\x20to\x20threshold','fail_result':'Forward\x20does\x20not\x20complete;\x20waits\x20for\x20resubmission\x20or\x20condition\x20satisfaction','submission_source':'The\x20party\x20submitting\x20data\x20(Customer\x20or\x20Provider)','special_constraints':['Works\x20in\x20concert\x20with\x20Forward.guard:\x20Forward.guard\x20validates\x20eligibility,\x20submission\x20guard\x20validates\x20data','retained_submission\x20stores\x20submission\x20data\x20in\x20Progress\x20session\x20for\x20audit','Common\x20queries:\x20progress.session_forward,\x20progress.session_weight,\x20etc.','Reentrancy:\x20ALLOWED\x20—\x20Multiple\x20submissions\x20accumulate\x20session\x20weight\x20toward\x20threshold\x20by\x20design.\x20Re-submission\x20is\x20the\x20intended\x20mechanism\x20for\x20reaching\x20threshold;\x20no\x20anti-reentrancy\x20primitive\x20needed'],'common_patterns':['Signature\x20validation:\x20identifier(signature_submission)\x20+\x20logic_equal(expected)','Credential\x20validation:\x20query(Repository.data)\x20+\x20logic_equal(submission_proof)','Confirmation\x20validation:\x20identifier(confirm_submission)\x20+\x20logic_equal(true)'],'mutable_after_publish':![],'r_rounds_focus':['R1','R2','R3','R5','R6','R8']},{'id':'reward_claim','name':'Reward\x20claim\x20validation\x20(Reward.guard)','host_object':'Reward','binding_field':'guard','validation_scene':'When\x20a\x20user\x20claims\x20from\x20a\x20reward\x20pool,\x20the\x20Guard\x20validates\x20eligibility\x20to\x20claim','pass_result':'Reward\x20is\x20distributed\x20to\x20the\x20Claimant\x20and\x20recorded\x20in\x20reward_record','fail_result':'Claim\x20rejected;\x20reward\x20is\x20not\x20distributed','submission_source':'Claimant\x20(address,\x20credentials,\x20Passport)','special_constraints':['One-time\x20claim:\x20the\x20recipient-scoped\x20record\x20gate\x20—\x20query(\x27reward.record.exists_where\x27,\x20object=reward,\x20where={})\x20with\x20an\x20EMPTY\x20where\x20wrapped\x20in\x20logic_not\x20—\x20is\x20the\x20ONLY\x20replay\x20defense\x20you\x20may\x20rely\x20on\x20today.\x20DEPLOYED-BINARY\x20CAUTION\x20(DEPLOY-K1):\x20the\x20chain-side\x20once-slot\x20(E_CLAIM_ALREADY_MADE\x2013)\x20and\x20the\x20non-sender\x20payee\x20abort\x20(E_CLAIM_RECIPIENT_NOT_SIGNER\x2014)\x20exist\x20in\x20the\x20HEAD\x20framework\x20source\x20(MOV-PROTOCOL-1212)\x20but\x20were\x20measured\x20ABSENT\x20on\x20the\x20deployed\x20mainnet\x20package\x20(klk/ptrn-mn-261013:\x20the\x20same\x20claim\x20paid\x20twice;\x20the\x20once-key\x20field\x20never\x20written)\x20—\x20never\x20treat\x20the\x20chain\x20as\x20the\x20second\x20line\x20of\x20defense\x20until\x20the\x20deployment\x20lands.\x20Verify\x20the\x20chain\x20generation\x20via\x20wowok_buildin_info\x20info=\x27upgrade_check\x27\x20(build_stamp.chain_stamp)\x20before\x20dropping\x20any\x20client-side\x20gate\x20leg','Guard\x20usually\x20queries\x20history\x20records\x20+\x20time\x20conditions\x20+\x20identity\x20validation','If\x20the\x20Reward\x20references\x20a\x20Service,\x20use\x20the\x20circular\x20reference\x20pattern','Reentrancy:\x20the\x20chain-side\x20once-slot\x20(per-(recipient,\x20guard,\x20store_from\x20value)\x20dynamic-field\x20key\x20—\x20empty\x20slot\x20=\x20once\x20per\x20recipient,\x20a\x20store_from\x20value\x20pins\x20a\x20per-order\x20slot)\x20is\x20HEAD-SOURCE\x20ONLY\x20(MOV-PROTOCOL-1212)\x20and\x20NOT\x20yet\x20confirmed\x20on\x20the\x20deployed\x20binary\x20(DEPLOY-K1:\x20double-claim\x20measured\x20on\x20mainnet).\x20The\x20recipient-scoped\x20gate\x20(query\x201629\x20EMPTY\x20where\x20+\x20logic_not)\x20is\x20therefore\x20the\x20load-bearing\x20defense,\x20NOT\x20a\x20UX\x20pre-check;\x20keep\x20the\x20identity\x20leg\x20Signer\x20==\x20order.owner\x20as\x20defense-in-depth\x20(the\x20payee-must-be-sender\x20abort,\x20E_CLAIM_RECIPIENT_NOT_SIGNER\x2014,\x20is\x20likewise\x20head-source\x20until\x20the\x20deployment\x20lands).\x20NEVER\x20bind\x20storeFromId\x20in\x20the\x20where\x20of\x20LEGACY\x20rewards\x20—\x20old\x20claim\x20records\x20carry\x20no\x20store_from\x20key\x20so\x20the\x20filter\x20matches\x20nothing\x20(silent\x20no-op);\x20strict\x20once-per-order\x20semantics\x20stay\x20on\x20the\x20254\x20task-binding\x20Allocation\x20leg'],'common_patterns':['One-time\x20claim:\x20query_reward_record_count(recipient)\x20+\x20logic_equal(0)','Time\x20window:\x20context(Clock)\x20+\x20logic_as_u256_greater_or_equal(start_time)\x20opens\x20claiming\x20from\x20start\x20onwards;\x20a\x20claim\x20DEADLINE\x20needs\x20the\x20opposite\x20direction\x20—\x20logic_as_u256_lesser_or_equal(calc_number_add(start_time,\x20duration))\x20i.e.\x20Clock\x20<=\x20start+N.\x20NEVER\x20greater_or_equal(end_time)\x20(inverts:\x20whole\x20window\x20rejected,\x20everything\x20after\x20admitted).\x20See\x20pattern.deadline_window','Identity\x20validation:\x20context(Signer)\x20+\x20vec_contains_address(allowlist)','Multi-condition:\x20logic_and\x20(identity\x20+\x20time\x20+\x20not\x20claimed\x20before)'],'mutable_after_publish':!![],'r_rounds_focus':['R1','R2','R3','R5','R7','R8','R9']},{'id':'repository_write_guard','name':'Repository\x20write\x20validation\x20(write_guard)','host_object':'Repository','binding_field':'write_guard','validation_scene':'When\x20writing\x20to\x20on-chain\x20storage,\x20the\x20Guard\x20validates\x20write\x20eligibility\x20and\x20optionally\x20extracts\x20data','pass_result':'Write\x20succeeds;\x20optional\x20id_from_submission\x20extracts\x20the\x20entity\x20ID,\x20data_from_submission\x20extracts\x20the\x20data\x20value','fail_result':'Write\x20rejected','submission_source':'Writer/Reader','special_constraints':['The\x20table\x20entry\x20referenced\x20by\x20id_from_submission\x20must\x20be\x20of\x20Address\x20type','The\x20table\x20entry\x20referenced\x20by\x20data_from_submission\x20must\x20match\x20the\x20Repository\x27s\x20value_type','Type\x20mismatch\x20leads\x20to\x20write\x20failure\x20or\x20data\x20corruption','Commonly\x20used\x20for\x20oracle\x20data\x20writes,\x20third-party\x20credential\x20attestation,\x20etc.','Reentrancy:\x20LOW\x20—\x20Default\x20writes\x20are\x20idempotent\x20(same\x20ID\x20overwrites,\x20different\x20ID\x20appends);\x20no\x20fund\x20flow.\x20GUARD-side\x20one-write-per-ID\x20(a\x20logic_not\x20over\x20a\x20`repository.data\x20has`\x20probe\x20as\x20the\x20write\x20guard)\x20is\x20NOT\x20enforceable\x20TODAY\x20(ofn-mn-261012\x20F-02,\x20mainnet\x20A/B\x20verified):\x20the\x20write\x20guard\x20is\x20verified\x20inside\x20the\x20write\x20PTB\x20and\x20the\x20probe\x20always\x20aborts\x20at\x20the\x20write\x20site;\x20do\x20NOT\x20emit\x20it.\x20POLICY-side\x20one-write\x20IS\x20enforceable\x20TODAY\x20(K3(a)):\x20set\x20write_once\x20on\x20the\x20Repository\x20policy\x20rule\x20—\x20a\x20second\x20write\x20to\x20the\x20same\x20(id,\x20key)\x20aborts\x20E_POLICY_WRITE_ONCE_CONFLICT=24\x20(compile\x20emits\x20it\x20on\x20the\x20review/rating\x20policies).\x20Also\x20usable:\x20the\x20protocol-255\x20ONCE\x20slot\x20(per\x20guard\x20pool)\x20plus\x20the\x20254\x20task-binding\x20slot\x20(per-order\x20scoping);\x20per-row\x20value\x20ranges\x20(e.g.\x20rating\x201-5)\x20go\x20through\x20a\x20Repository\x20write\x20policy.\x20A\x20chain-side\x20write-guard\x20post-state\x20read\x20is\x20on\x20the\x20protocol\x20decision\x20list','CONTENT\x20BLIND\x20SPOT\x20(testnet\x20test-14\x20HIGH-04):\x20under\x20id_from=None\x20the\x20chain\x20asserts\x20only\x20that\x20the\x20write_guard\x20LIST\x20is\x20non-empty\x20(the\x20Repository\x20policy-creation\x20entry,\x20repository.move\x20L511-536,\x20E_POLICY_WRITE_GUARD_REQUIRED=22)\x20—\x20never\x20what\x20a\x20listed\x20Guard\x20proves.\x20A\x20guard\x20that\x20returns\x20true\x20for\x20every\x20caller\x20(constant-true\x20leaf,\x20self-comparison,\x20unsigned\x20>=\x200)\x20therefore\x20publishes\x20as\x20\x27guarded\x27\x20while\x20being\x20an\x20OPEN\x20write:\x20any\x20address\x20can\x20add\x20or\x20overwrite\x20any\x20row,\x20and\x20rows\x20carry\x20no\x20author\x20field.\x20Rule\x20R-X1-17\x20folds\x20the\x20tree\x20and\x20reports\x20it;\x20generate\x20the\x20guard\x20from\x20pattern.repository_write_authorization\x20(an\x20identity\x20leaf\x20—\x20context(Signer)\x20/\x20allowlist\x20/\x20Permission\x20staff\x20/\x20Order\x20holder\x20—\x20is\x20mandatory).\x20Under\x20id_from=Signer|Clock\x20the\x20list\x20MAY\x20stay\x20non-empty,\x20but\x20every\x20PolicyGuard\x27s\x20id_from_submission\x20must\x20be\x20None\x20(E_POLICY_ID_FROM_SUBMISSION_FORBIDDEN=23)'],'common_patterns':['Authorized\x20writer:\x20context(Signer)\x20+\x20vec_contains_address(authorized_writers)','Data\x20format\x20validation:\x20identifier(data_submission)\x20+\x20logic_string_contains(expected_prefix)','ID\x20extraction:\x20id_from_submission\x20+\x20data_from_submission\x20combination'],'mutable_after_publish':!![],'r_rounds_focus':['R1','R2','R3','R5','R6','R7']},{'id':'arbitration_usage_guard','name':'Dispute\x20initiation\x20validation\x20(usage_guard)','host_object':'Arbitration','binding_field':'usage_guard','validation_scene':'When\x20a\x20customer\x20initiates\x20a\x20dispute\x20against\x20an\x20order,\x20the\x20Guard\x20validates\x20whether\x20the\x20customer\x20is\x20eligible\x20to\x20initiate\x20the\x20dispute','pass_result':'Create\x20an\x20Arb\x20case\x20and\x20enter\x20the\x20arbitration\x20flow','fail_result':'Dispute\x20rejected;\x20Arb\x20is\x20not\x20created','submission_source':'Customer\x20(Passport\x20credential)','special_constraints':['When\x20Arbitration\x20bPaused=true,\x20it\x20blocks\x20first\x20(before\x20the\x20Guard\x20check)','The\x20customer\x20must\x20first\x20generate\x20a\x20Passport\x20(gen_passport\x20passes\x20usage_guard)','Common\x20queries:\x20order.completed,\x20order.service,\x20entity.has,\x20etc.','Guard\x20validates\x20customer\x20identity\x20+\x20order\x20status\x20+\x20dispute\x20eligibility','Reentrancy:\x20HIGH\x20—\x20Guard\x20pass\x20creates\x20a\x20new\x20Arb\x20case.\x20Without\x20anti-reentrancy,\x20a\x20customer\x20can\x20create\x20multiple\x20Arb\x20cases\x20for\x20the\x20SAME\x20Order\x20(up\x20to\x20MAX_DISPUTE_COUNT=10),\x20harassing\x20the\x20counterparty\x20and\x20inflating\x20arbitration\x20system\x20load.\x20Not\x20direct\x20fund\x20loss,\x20but\x20severe\x20system\x20abuse.\x20Note:\x20the\x20dispute\x20entry\x20point\x20deduplicates\x20by\x20Arb\x20address\x20but\x20does\x20NOT\x20prevent\x20multiple\x20distinct\x20Arbs\x20for\x20the\x20same\x20Order.\x20REQUIRED\x20anti-reentrancy\x20primitive\x20(any\x20one):\x20`order.dispute\x20has`\x20(query\x201565,\x20Bool,\x20per-Arb\x20check)\x20+\x20`logic_not`;\x20OR\x20`order.dispute\x20count`\x20(query\x201564,\x20U64)\x20+\x20`logic_equal(0)`\x20(strict:\x20block\x20any\x20prior\x20dispute)\x20or\x20`logic_as_u256_lesser_or_equal(N)`\x20(lenient:\x20allow\x20up\x20to\x20N\x20disputes)'],'common_patterns':['Order\x20status\x20validation:\x20query(Order.status)\x20+\x20logic_equal(\x27completed\x27)','Membership\x20validation:\x20query(EntityRegistrar)\x20+\x20logic_and','Dispute\x20deadline\x20window:\x20context(Clock)\x20+\x20logic_as_u256_lesser_or_equal(calc_number_add(query(Order.time),\x20N))\x20—\x20Clock\x20<=\x20order_time+N\x20closes\x20disputes\x20after\x20N;\x20a\x20bare\x20query(Order.time)\x20+\x20calc_number_add\x20+\x20context(Clock)\x20chain\x20has\x20NO\x20comparison\x20direction\x20and\x20guards\x20nothing.\x20See\x20pattern.deadline_window','Passport\x20credential:\x20identifier(passport_submission)\x20+\x20context(Signer)'],'mutable_after_publish':!![],'r_rounds_focus':['R1','R2','R3','R5','R7','R8','R9']},{'id':'arbitration_voting_guard','name':'Arbitration\x20voting\x20weight\x20validation\x20(voting_guard[])','host_object':'Arbitration','binding_field':'voting_guard','validation_scene':'When\x20an\x20arbitrator\x20votes,\x20the\x20Guard\x20validates\x20voting\x20eligibility\x20and\x20extracts\x20the\x20voting\x20weight\x20(u32)\x20from\x20GuardIdentifier','pass_result':'Vote\x20is\x20counted;\x20weight\x20is\x20the\x20value\x20extracted\x20by\x20GuardIdentifier','fail_result':'Vote\x20rejected','submission_source':'Voter\x20(Passport\x20credential\x20with\x20weight\x20data)','special_constraints':['The\x20table\x20entry\x20referenced\x20by\x20GuardIdentifier\x20must\x20be\x20of\x20a\x20numeric\x20type\x20(U8-U256),\x20cast\x20to\x20u32','Non-numeric\x20types\x20cause\x20E_GUARD_IDENTIFIER_NOT_NUMBER\x20error','b_submission\x20must\x20be\x20true\x20(weight\x20is\x20submitted\x20at\x20runtime\x20by\x20the\x20voter)','Multiple\x20voting_guards\x20can\x20be\x20configured,\x20each\x20corresponding\x20to\x20a\x20different\x20voter\x20group','When\x20Arbitration\x20bPaused=true,\x20voting\x20is\x20blocked','Reentrancy:\x20CRITICAL\x20—\x20Guard\x20pass\x20counts\x20the\x20vote\x20with\x20the\x20extracted\x20weight.\x20Without\x20anti-reentrancy,\x20the\x20same\x20voter\x20can\x20vote\x20MULTIPLE\x20times,\x20multiplying\x20their\x20weight\x20and\x20skewing\x20the\x20arbitration\x20result\x20(which\x20directly\x20determines\x20fund\x20ownership\x20via\x20compensation).\x20The\x20voter\x27s\x20eligibility\x20(identity,\x20reputation)\x20does\x20NOT\x20naturally\x20invalidate\x20after\x20voting.\x20REQUIRED\x20anti-reentrancy\x20primitive\x20(any\x20one):\x20`arb.voted\x20has`\x20(query\x201404,\x20Bool,\x20per-voter)\x20+\x20`logic_not`;\x20OR\x20`arb.voted.agree\x20has`\x20(query\x201406,\x20Bool,\x20per-voter-per-proposition)\x20+\x20`logic_not`;\x20OR\x20`arb.voted.agree\x20count`\x20(query\x201405,\x20U64,\x20per-voter)\x20+\x20`logic_equal(0)`.\x20Note:\x20`arb.voted_count`\x20(1403)\x20is\x20total\x20voter\x20count\x20(NOT\x20per-voter)\x20and\x20does\x20NOT\x20serve\x20as\x20an\x20anti-reentrancy\x20primitive\x20for\x20individual\x20voters'],'common_patterns':['Reputation\x20score\x20weight:\x20query(EntityRegistrar.records[reputation])\x20+\x20GuardIdentifier(u64)','Fixed\x20weight:\x20identifier(constant_weight)\x20+\x20GuardIdentifier','Multi-tier\x20voting:\x20different\x20voting_guards\x20correspond\x20to\x20different\x20weight\x20tiers','Eligibility\x20+\x20weight:\x20logic_and\x20(eligibility\x20check\x20+\x20GuardIdentifier\x20extracts\x20weight)'],'mutable_after_publish':!![],'r_rounds_focus':['R1','R2','R3','R5','R6','R7','R8','R9']},{'id':'gen_passport_guard','name':'Passport\x20credential\x20generation\x20validation\x20(gen_passport)','host_object':'Standalone','binding_field':'none','validation_scene':'When\x20a\x20user\x20calls\x20gen_passport,\x20the\x20Guard\x20validates\x20user\x20eligibility\x20and\x20generates\x20a\x20Passport\x20with\x20credentials','pass_result':'Passport\x20is\x20generated,\x20containing\x20credentials\x20validated\x20by\x20the\x20Guard','fail_result':'Passport\x20generation\x20fails;\x20the\x20user\x20did\x20not\x20pass\x20validation','submission_source':'Passport\x20applicant\x20(signer\x20+\x20credentials)','special_constraints':['quote_guard\x20is\x20a\x20RIGID\x20verification\x20requirement\x20when\x20querying\x20Repository\x20data\x20(query\x201167)','Two-phase:\x20passport\x20generation\x20scans\x20guard\x20+\x20prepares\x20quote_guard,\x20passport\x20verification\x20re-checks\x20+\x20verifies','If\x20quote_guard==None:\x20Repository\x20data\x20is\x20freely\x20queryable\x20(no\x20access\x20control)','Guard\x20can\x20be\x20created\x20standalone\x20(not\x20bound\x20to\x20a\x20specific\x20Host\x20Object)','Guard\x20can\x20be\x20depended\x20on\x20by\x20other\x20Guards\x20via\x20rely\x20(requires\x20rep=true)','The\x20Passport\x20generated\x20by\x20gen_passport\x20can\x20be\x20used\x20as\x20submission\x20data\x20for\x20subsequent\x20operations','Reentrancy:\x20LOW\x20—\x20Each\x20gen_passport\x20call\x20generates\x20an\x20independent\x20Passport\x20(one\x20Passport\x20per\x20operation).\x20Multiple\x20Passports\x20for\x20the\x20same\x20user\x20are\x20usually\x20valid\x20(each\x20serves\x20a\x20different\x20subsequent\x20operation).\x20IF\x20business\x20intent\x20is\x20\x27one\x20active\x20Passport\x20per\x20user\x27,\x20an\x20anti-reentrancy\x20check\x20is\x20needed\x20but\x20no\x20direct\x20GUARDQUERY\x20primitive\x20exists\x20—\x20use\x20off-chain\x20tracking\x20or\x20a\x20Repository\x20to\x20record\x20issued\x20Passport\x20IDs'],'common_patterns':['Identity\x20validation:\x20context(Signer)\x20+\x20logic_equal\x20(single\x20address/whitelist)','Membership\x20eligibility:\x20query(EntityRegistrar)\x20+\x20logic_equal','Reputation\x20threshold:\x20query(EntityRegistrar.records[reputation])\x20+\x20logic_as_u256_greater_or_equal','Multi-condition\x20combination:\x20logic_and\x20(identity\x20+\x20eligibility\x20+\x20reputation)'],'mutable_after_publish':![],'r_rounds_focus':['R1','R2','R3','R5','R6','R7']}];export function findScene(a,b){return GUARD_SCENES['find'](c=>c['host_object']===a&&c['binding_field']===b);}export function inferSceneFromAction(a){const b={'buy':'service_buy_guard','forward':'machine_forward_guard','allocate':'service_order_allocators_guard','claim_reward':'reward_claim','vote':'arbitration_voting_guard','dispute':'arbitration_usage_guard','write_repository':'repository_write_guard','submit_progress':'progress_submission_guard','gen_passport':'gen_passport_guard'},c=b[a];return GUARD_SCENES['find'](d=>d['id']===c);}export function getImmutableScenes(){return GUARD_SCENES['filter'](a=>!a['mutable_after_publish']);}export function getNumericIdentifierScenes(){return GUARD_SCENES['filter'](a=>a['special_constraints']['some'](b=>b['includes']('numeric')||b['includes']('GuardIdentifier')));}
|
|
1
|
+
export const GUARD_SCENES=[{'id':'service_buy_guard','name':'Service\x20purchase\x20validation\x20(buy_guard)','host_object':'Service','binding_field':'buy_guard','validation_scene':'When\x20a\x20customer\x20places\x20an\x20order\x20to\x20purchase\x20a\x20service,\x20the\x20Guard\x20validates\x20whether\x20the\x20customer\x20is\x20eligible\x20to\x20purchase\x20(identity/permission/condition)','pass_result':'Create\x20the\x20Order\x20object;\x20the\x20customer\x20enters\x20the\x20payment\x20flow','fail_result':'Transaction\x20rejected;\x20Order\x20is\x20not\x20created;\x20the\x20customer\x20cannot\x20purchase','submission_source':'Customer\x20(signer\x20address,\x20credentials,\x20Passport,\x20etc.)','special_constraints':['The\x20Guard\x20table\x20must\x20declare\x20all\x20data\x20the\x20customer\x20needs\x20to\x20submit','The\x20name\x20of\x20b_submission=true\x20entries\x20must\x20be\x20a\x20natural-language\x20description\x20(the\x20contract\x20the\x20customer\x20sees)','If\x20the\x20Guard\x20references\x20the\x20Service\x20itself,\x20use\x20the\x20circular\x20reference\x20pattern\x20(CREATE\x20Service\x20→\x20CREATE\x20Guard\x20→\x20MODIFY\x20Service)','buy_guard\x20can\x20still\x20be\x20modified\x20after\x20Service\x20is\x20published\x20(via\x20MODIFY\x20Service)','Reentrancy:\x20LOW\x20—\x20Each\x20purchase\x20creates\x20a\x20fresh\x20Order;\x20no\x20existing\x20Order\x20state\x20is\x20modified.\x20Default:\x20no\x20reentrancy\x20risk.\x20IF\x20business\x20intent\x20is\x20\x27limit\x20one\x20purchase\x20per\x20user\x27\x20(limited-edition\x20goods,\x20whitelist\x20single-buy),\x20an\x20anti-reentrancy\x20check\x20is\x20REQUIRED\x20but\x20no\x20direct\x20GUARDQUERY\x20primitive\x20exists\x20for\x20per-user\x20purchase\x20history\x20—\x20use\x20a\x20Repository\x20to\x20record\x20prior\x20purchases\x20and\x20add\x20`repository.data\x20has`\x20(query\x201166)\x20+\x20`logic_not`\x20to\x20the\x20BUY\x20guard\x20root\x20(READ\x20side\x20only\x20—\x20never\x20inside\x20a\x20write-guard\x20verified\x20in\x20the\x20write\x20PTB,\x20ofn-mn-261012\x20F-02),\x20or\x20revoke\x20EntityRegistrar\x20membership\x20after\x20first\x20buy'],'common_patterns':['Identity\x20check:\x20context(Signer)\x20+\x20logic_equal\x20(single\x20address)\x20/\x20vec_contains_address\x20(whitelist)','Membership\x20validation:\x20query\x20entity\x20registry\x20(0xaab\x20—\x20the\x20Move-level\x20Entity\x20object;\x20SDK\x20alias\x20\x27EntityRegistrar\x27)\x20+\x20logic_and\x20combination','Time\x20limit:\x20context(Clock)\x20+\x20logic_as_u256_greater_or_equal(open_time)\x20for\x20an\x20OPENING\x20window\x20(valid\x20from\x20open\x20onwards);\x20for\x20a\x20DEADLINE\x20window\x20use\x20logic_as_u256_lesser_or_equal(calc_number_add(anchor,\x20duration))\x20—\x20Clock\x20<=\x20anchor+N.\x20NEVER\x20greater_or_equal(end_time):\x20inverts\x20the\x20window\x20(rejects\x20everything\x20inside\x20it,\x20admits\x20everything\x20after\x20it).\x20See\x20pattern.deadline_window','Multi-condition:\x20logic_and\x20combining\x20multiple\x20checks'],'mutable_after_publish':!![],'r_rounds_focus':['R1','R2','R3','R5','R7','R9']},{'id':'service_order_allocators_guard','name':'Allocation\x20strategy\x20selection\x20validation\x20(order_allocators[].guard)','host_object':'Service','binding_field':'order_allocators','validation_scene':'When\x20an\x20order\x20is\x20completed\x20or\x20allocation\x20conditions\x20are\x20met,\x20the\x20caller\x20submits\x20ONE\x20guard.\x20Every\x20allocator\x20bound\x20to\x20that\x20guard\x20fires,\x20in\x20vector\x20order,\x20each\x20against\x20the\x20balance\x20left\x20by\x20the\x20previous\x20(the\x20on-chain\x20distribution\x20loop).','pass_result':'Execute\x20the\x20allocation\x20strategy\x20for\x20every\x20allocator\x20bound\x20to\x20the\x20submitted\x20guard','fail_result':'If\x20the\x20submitted\x20guard\x20does\x20not\x20match\x20any\x20allocator\x27s\x20guard,\x20or\x20if\x20the\x20guard\x27s\x20conditions\x20fail,\x20no\x20funds\x20are\x20distributed','submission_source':'System\x20auto-derives\x20from\x20Progress\x20state\x20(no\x20explicit\x20customer\x20submission\x20needed)','special_constraints':['A\x20distribution\x20call\x20submits\x20ONE\x20guard;\x20every\x20allocator\x20bound\x20to\x20that\x20guard\x20fires\x20in\x20vector\x20order\x20against\x20the\x20shrinking\x20pool\x20(the\x20on-chain\x20distribution\x20loop).\x20Allocator\x20list\x20order\x20determines\x20the\x20firing\x20sequence\x20when\x20multiple\x20allocators\x20share\x20the\x20same\x20guard,\x20NOT\x20which\x20path\x20is\x20selected','order_allocators\x20cannot\x20be\x20modified\x20after\x20Service\x20is\x20published\x20(immutable)','Guard\x20usually\x20queries\x20Order/Progress\x20state\x20to\x20determine\x20allocation\x20conditions','Common\x20queries:\x20order.amount,\x20progress.current_node,\x20order.completed,\x20etc.','GuardIdentifier\x20can\x20be\x20used\x20for\x20dynamic\x20amounts\x20(extract\x20u64\x20value\x20from\x20table\x20as\x20allocation\x20ratio)','Guard+sharing\x20coupling:\x20Guard\x20determines\x20IF\x20allocation\x20happens;\x20sharing.who\x20determines\x20WHERE\x20funds\x20go.\x20If\x20sharing.who=Signer,\x20the\x20caller\x20receives\x20funds\x20—\x20the\x20Guard\x20MUST\x20bind\x20Signer\x20(context(Signer)==authorized)\x20to\x20prevent\x20theft.\x20PREFERRED:\x20use\x20sharing.who=Entity\x20(Treasury\x20or\x20fixed\x20address)\x20so\x20funds\x20always\x20go\x20to\x20the\x20legitimate\x20recipient\x20regardless\x20of\x20caller.','allocators\x20require\x20unique\x20guard\x20addresses\x20when\x20they\x20represent\x20alternative\x20paths:\x20bind\x20each\x20path\x20to\x20its\x20OWN\x20Guard\x20object\x20(they\x20may\x20share\x20root/table\x20but\x20must\x20differ\x20in\x20description).\x20Same-guard\x20allocators\x20fire\x20sequentially\x20on\x20the\x20same\x20call,\x20which\x20is\x20only\x20correct\x20for\x20intended\x20waterfalls\x20(fee\x20first,\x20then\x20split\x20remainder)','Every\x20allocator\x20bound\x20to\x20the\x20submitted\x20guard\x20fires\x20in\x20vector\x20order.\x20Alternative\x20business\x20paths\x20(settle\x20vs\x20refund\x20vs\x20damage)\x20must\x20use\x20DIFFERENT\x20guards\x20—\x20the\x20caller\x27s\x20guard\x20choice\x20selects\x20the\x20path,\x20not\x20the\x20allocator\x20list\x20position','If\x20sharing.who=Entity\x20references\x20a\x20Treasury\x20object,\x20verify\x20the\x20Treasury\x27s\x20permission\x20is\x20consistent\x20with\x20the\x20Service\x27s\x20permission\x20(different\x20permissions\x20=\x20different\x20permission\x20organizations\x20=\x20minor\x20risk).','Reentrancy:\x20LOW\x20—\x20Protocol-level\x20protection:\x20the\x20Order\x20layer\x20asserts\x20the\x20`allocation`\x20field\x20is\x20None\x20(E_ALLOCATION_ALREADY_SPECIFIED),\x20enforcing\x20ONE\x20Allocation\x20object\x20per\x20Order,\x20ever.\x20After\x20alloc()\x20executes,\x20typical\x20Rate-mode\x20allocators\x20(sum=10000)\x20and\x20any\x20Surplus-mode\x20allocator\x20drain\x20balance\x20to\x200\x20via\x20balance::withdraw_all,\x20making\x20a\x20second\x20alloc()\x20fail\x20at\x20`assert!(balance\x20>=\x20threshold)`.\x20EDGE\x20CASE:\x20Amount-mode-only\x20allocators\x20(no\x20Surplus,\x20total\x20<\x20full\x20balance)\x20leave\x20remainder;\x20a\x20second\x20alloc()\x20could\x20extract\x20more\x20—\x20mitigated\x20by\x20preferring\x20Rate/Surplus\x20modes.\x20External\x20deposit\x20via\x20receive()\x20is\x20possible\x20but\x20irrational\x20(attacker\x20funds\x20the\x20Allocation\x20they\x20attack).\x20Optional\x20anti-reentrancy\x20primitive:\x20`order.allocation\x20some`\x20(query\x201568)\x20+\x20logic_not'],'common_patterns':['Node\x20state\x20check:\x20query(Progress.current_node)\x20+\x20logic_equal(\x27Completed\x27)','Amount\x20threshold:\x20query(Order.amount)\x20+\x20logic_as_u256_greater_or_equal(threshold)','Multi-condition\x20combination:\x20logic_and\x20(node\x20state\x20+\x20amount\x20+\x20time)','GuardIdentifier\x20dynamic\x20ratio:\x20table[u64]\x20extracts\x20allocation\x20ratio','Treasury+personal\x202-allocator\x20pattern:\x202\x20Guard\x20objects\x20(identical\x20root/table,\x20different\x20descriptions)\x20+\x202\x20allocators\x20(sharing.who=Entity\x20Treasury\x20/\x20Entity\x20personal)\x20—\x202\x20alternative\x20merchant\x20collection\x20approaches\x20bound\x20to\x20DIFFERENT\x20guards;\x20the\x20caller\x27s\x20guard\x20choice\x20selects\x20which\x20allocator\x20fires'],'mutable_after_publish':![],'r_rounds_focus':['R1','R2','R3','R5','R6','R7']},{'id':'machine_forward_guard','name':'Workflow\x20node\x20advancement\x20validation\x20(Forward.guard)','host_object':'Machine','binding_field':'Forward.guard','validation_scene':'When\x20a\x20customer\x20or\x20provider\x20executes\x20a\x20Forward\x20operation\x20to\x20advance\x20the\x20workflow,\x20the\x20Guard\x20validates\x20whether\x20advancement\x20to\x20the\x20next\x20node\x20is\x20allowed','pass_result':'Progress\x20advances\x20to\x20next_node;\x20session\x20accumulates\x20weight','fail_result':'Forward\x20is\x20blocked;\x20Progress\x20stays\x20at\x20the\x20current\x20node.\x20Optional\x20retained_submission\x20retains\x20audit\x20data','submission_source':'The\x20party\x20executing\x20Forward\x20(Customer\x20or\x20Provider,\x20depending\x20on\x20Forward\x20configuration)','special_constraints':['Forward.guard\x20cannot\x20be\x20modified\x20after\x20Machine\x20is\x20published\x20(a\x20new\x20Machine\x20must\x20be\x20created)','Optional\x20retained_submission:\x20stores\x20submission\x20data\x20in\x20Progress\x20for\x20later\x20audit','retained_submission\x20indices\x20must\x20correspond\x20to\x20the\x20Guard\x20table','Common\x20queries:\x20progress.current_node,\x20progress.session_forward,\x20order.service,\x20etc.','Fund\x20gate\x20(crs\x20P2-3):\x20allocation.balance\x20(query\x201051;\x20witness\x20TypeOrderAllocation(109)\x20resolves\x20it\x20from\x20the\x20Order\x20address)\x20gates\x20a\x20forward\x20on\x20the\x20order\x27s\x20escrow\x20balance\x20—\x20the\x20canonical\x20renewal-loop\x20convention\x20is\x20balance\x20>=\x20new-period\x20price','Time\x20lock:\x20context(Clock)\x20+\x20calc_number_add(progress.current_time,\x20duration)\x20tested\x20with\x201000ms','Reentrancy:\x20ALLOWED\x20—\x20By\x20design,\x20Forward\x20moves\x20progress.current_node\x20to\x20next_node,\x20naturally\x20invalidating\x20the\x20Guard\x20at\x20the\x20old\x20node.\x20Re-submission\x20at\x20the\x20SAME\x20node\x20(before\x20forward\x20completes)\x20is\x20intentional:\x20users\x20may\x20fix\x20prior\x20submission\x20data\x20or\x20accumulate\x20session\x20weight\x20toward\x20threshold.\x20No\x20anti-reentrancy\x20primitive\x20needed.\x20Optional\x20observability\x20queries:\x20`progress.session_forward`\x20(1262),\x20`progress.history`\x20(1273),\x20`query_progress_history_find`\x20(1274)'],'common_patterns':['Identity\x20check:\x20context(Signer)\x20+\x20logic_equal\x20(only\x20specific\x20parties\x20can\x20advance)','Time\x20lock:\x20context(Clock)\x20+\x20calc_number_add\x20+\x20logic_as_u256_greater_or_equal','Prior\x20Forward\x20completion:\x20query_progress_history_find\x20+\x20logic_equal(accomplished=true)','Submission\x20data\x20validation:\x20identifier(submission)\x20+\x20logic_equal(expected_value)','Cross-object\x20query:\x20convert_witness=TypeOrderProgress(100)\x20queries\x20Progress\x20from\x20Order;\x20convert_witness=TypeOrderAllocation(109)\x20queries\x20the\x20Allocation\x20(escrow)\x20from\x20Order'],'mutable_after_publish':![],'r_rounds_focus':['R1','R2','R3','R5','R6','R7','R8','R9']},{'id':'progress_submission_guard','name':'Progress\x20submission\x20data\x20validation\x20(submission\x20guard)','host_object':'Progress','binding_field':'submission','validation_scene':'Whether\x20the\x20data\x20(e.g.\x20signature,\x20credential,\x20confirmation)\x20submitted\x20during\x20Forward\x20execution\x20satisfies\x20the\x20Guard\x20condition','pass_result':'Forward\x20completes;\x20node\x20advances\x20after\x20session\x20accumulates\x20weight\x20to\x20threshold','fail_result':'Forward\x20does\x20not\x20complete;\x20waits\x20for\x20resubmission\x20or\x20condition\x20satisfaction','submission_source':'The\x20party\x20submitting\x20data\x20(Customer\x20or\x20Provider)','special_constraints':['Works\x20in\x20concert\x20with\x20Forward.guard:\x20Forward.guard\x20validates\x20eligibility,\x20submission\x20guard\x20validates\x20data','retained_submission\x20stores\x20submission\x20data\x20in\x20Progress\x20session\x20for\x20audit','Common\x20queries:\x20progress.session_forward,\x20progress.session_weight,\x20etc.','Reentrancy:\x20ALLOWED\x20—\x20Multiple\x20submissions\x20accumulate\x20session\x20weight\x20toward\x20threshold\x20by\x20design.\x20Re-submission\x20is\x20the\x20intended\x20mechanism\x20for\x20reaching\x20threshold;\x20no\x20anti-reentrancy\x20primitive\x20needed'],'common_patterns':['Signature\x20validation:\x20identifier(signature_submission)\x20+\x20logic_equal(expected)','Credential\x20validation:\x20query(Repository.data)\x20+\x20logic_equal(submission_proof)','Confirmation\x20validation:\x20identifier(confirm_submission)\x20+\x20logic_equal(true)'],'mutable_after_publish':![],'r_rounds_focus':['R1','R2','R3','R5','R6','R8']},{'id':'reward_claim','name':'Reward\x20claim\x20validation\x20(Reward.guard)','host_object':'Reward','binding_field':'guard','validation_scene':'When\x20a\x20user\x20claims\x20from\x20a\x20reward\x20pool,\x20the\x20Guard\x20validates\x20eligibility\x20to\x20claim','pass_result':'Reward\x20is\x20distributed\x20to\x20the\x20Claimant\x20and\x20recorded\x20in\x20reward_record','fail_result':'Claim\x20rejected;\x20reward\x20is\x20not\x20distributed','submission_source':'Claimant\x20(address,\x20credentials,\x20Passport)','special_constraints':['One-time\x20claim:\x20the\x20recipient-scoped\x20record\x20gate\x20—\x20query(\x27reward.record.exists_where\x27,\x20object=reward,\x20where={})\x20with\x20an\x20EMPTY\x20where\x20wrapped\x20in\x20logic_not\x20—\x20is\x20the\x20ONLY\x20replay\x20defense\x20you\x20may\x20rely\x20on\x20today.\x20DEPLOYED-BINARY\x20CAUTION\x20(DEPLOY-K1):\x20the\x20chain-side\x20once-slot\x20(E_CLAIM_ALREADY_MADE\x2013)\x20and\x20the\x20non-sender\x20payee\x20abort\x20(E_CLAIM_RECIPIENT_NOT_SIGNER\x2014)\x20exist\x20in\x20the\x20HEAD\x20framework\x20source\x20(MOV-PROTOCOL-1212)\x20but\x20were\x20measured\x20ABSENT\x20on\x20the\x20deployed\x20mainnet\x20package\x20(klk/ptrn-mn-261013:\x20the\x20same\x20claim\x20paid\x20twice;\x20the\x20once-key\x20field\x20never\x20written)\x20—\x20never\x20treat\x20the\x20chain\x20as\x20the\x20second\x20line\x20of\x20defense\x20until\x20the\x20deployment\x20lands.\x20Verify\x20the\x20chain\x20generation\x20via\x20wowok_buildin_info\x20info=\x27upgrade_check\x27\x20(build_stamp.chain_stamp)\x20before\x20dropping\x20any\x20client-side\x20gate\x20leg','Guard\x20usually\x20queries\x20history\x20records\x20+\x20time\x20conditions\x20+\x20identity\x20validation','If\x20the\x20Reward\x20references\x20a\x20Service,\x20use\x20the\x20circular\x20reference\x20pattern','Reentrancy:\x20the\x20chain-side\x20once-slot\x20(per-(recipient,\x20guard,\x20store_from\x20value)\x20dynamic-field\x20key\x20—\x20empty\x20slot\x20=\x20once\x20per\x20recipient,\x20a\x20store_from\x20value\x20pins\x20a\x20per-order\x20slot)\x20is\x20HEAD-SOURCE\x20ONLY\x20(MOV-PROTOCOL-1212)\x20and\x20NOT\x20yet\x20confirmed\x20on\x20the\x20deployed\x20binary\x20(DEPLOY-K1:\x20double-claim\x20measured\x20on\x20mainnet).\x20The\x20recipient-scoped\x20gate\x20(query\x201629\x20EMPTY\x20where\x20+\x20logic_not)\x20is\x20therefore\x20the\x20load-bearing\x20defense,\x20NOT\x20a\x20UX\x20pre-check;\x20keep\x20the\x20identity\x20leg\x20Signer\x20==\x20order.owner\x20as\x20defense-in-depth\x20(the\x20payee-must-be-sender\x20abort,\x20E_CLAIM_RECIPIENT_NOT_SIGNER\x2014,\x20is\x20likewise\x20head-source\x20until\x20the\x20deployment\x20lands).\x20NEVER\x20bind\x20storeFromId\x20in\x20the\x20where\x20of\x20LEGACY\x20rewards\x20—\x20old\x20claim\x20records\x20carry\x20no\x20store_from\x20key\x20so\x20the\x20filter\x20matches\x20nothing\x20(silent\x20no-op);\x20strict\x20once-per-order\x20semantics\x20stay\x20on\x20the\x20254\x20task-binding\x20Allocation\x20leg'],'common_patterns':['One-time\x20claim:\x20query_reward_record_count(recipient)\x20+\x20logic_equal(0)','Time\x20window:\x20context(Clock)\x20+\x20logic_as_u256_greater_or_equal(start_time)\x20opens\x20claiming\x20from\x20start\x20onwards;\x20a\x20claim\x20DEADLINE\x20needs\x20the\x20opposite\x20direction\x20—\x20logic_as_u256_lesser_or_equal(calc_number_add(start_time,\x20duration))\x20i.e.\x20Clock\x20<=\x20start+N.\x20NEVER\x20greater_or_equal(end_time)\x20(inverts:\x20whole\x20window\x20rejected,\x20everything\x20after\x20admitted).\x20See\x20pattern.deadline_window','Identity\x20validation:\x20context(Signer)\x20+\x20vec_contains_address(allowlist)','Multi-condition:\x20logic_and\x20(identity\x20+\x20time\x20+\x20not\x20claimed\x20before)'],'mutable_after_publish':!![],'r_rounds_focus':['R1','R2','R3','R5','R7','R8','R9']},{'id':'repository_write_guard','name':'Repository\x20write\x20validation\x20(write_guard)','host_object':'Repository','binding_field':'write_guard','validation_scene':'When\x20writing\x20to\x20on-chain\x20storage,\x20the\x20Guard\x20validates\x20write\x20eligibility\x20and\x20optionally\x20extracts\x20data','pass_result':'Write\x20succeeds;\x20optional\x20id_from_submission\x20extracts\x20the\x20entity\x20ID,\x20data_from_submission\x20extracts\x20the\x20data\x20value','fail_result':'Write\x20rejected','submission_source':'Writer/Reader','special_constraints':['The\x20table\x20entry\x20referenced\x20by\x20id_from_submission\x20must\x20be\x20of\x20Address\x20type','The\x20table\x20entry\x20referenced\x20by\x20data_from_submission\x20must\x20match\x20the\x20Repository\x27s\x20value_type','Type\x20mismatch\x20leads\x20to\x20write\x20failure\x20or\x20data\x20corruption','Commonly\x20used\x20for\x20oracle\x20data\x20writes,\x20third-party\x20credential\x20attestation,\x20etc.','Reentrancy:\x20LOW\x20—\x20Default\x20writes\x20are\x20idempotent\x20(same\x20ID\x20overwrites,\x20different\x20ID\x20appends);\x20no\x20fund\x20flow.\x20GUARD-side\x20one-write-per-ID\x20(a\x20logic_not\x20over\x20a\x20`repository.data\x20has`\x20probe\x20as\x20the\x20write\x20guard)\x20is\x20NOT\x20enforceable\x20TODAY\x20(ofn-mn-261012\x20F-02,\x20mainnet\x20A/B\x20verified):\x20the\x20write\x20guard\x20is\x20verified\x20inside\x20the\x20write\x20PTB\x20and\x20the\x20probe\x20always\x20aborts\x20at\x20the\x20write\x20site;\x20do\x20NOT\x20emit\x20it.\x20POLICY-side\x20one-write\x20IS\x20enforceable\x20TODAY\x20(K3(a)):\x20set\x20write_once\x20on\x20the\x20Repository\x20policy\x20rule\x20—\x20a\x20second\x20write\x20to\x20the\x20same\x20(id,\x20key)\x20aborts\x20E_POLICY_WRITE_ONCE_CONFLICT=24\x20(compile\x20emits\x20it\x20on\x20the\x20review/rating\x20policies).\x20Also\x20usable:\x20the\x20protocol-255\x20ONCE\x20slot\x20(per\x20guard\x20pool)\x20plus\x20the\x20254\x20task-binding\x20slot\x20(per-order\x20scoping);\x20per-row\x20value\x20ranges\x20(e.g.\x20rating\x201-5)\x20go\x20through\x20a\x20Repository\x20write\x20policy.\x20A\x20chain-side\x20write-guard\x20post-state\x20read\x20is\x20on\x20the\x20protocol\x20decision\x20list','CONTENT\x20BLIND\x20SPOT\x20(testnet\x20test-14\x20HIGH-04):\x20under\x20id_from=None\x20the\x20chain\x20asserts\x20only\x20that\x20the\x20write_guard\x20LIST\x20is\x20non-empty\x20(the\x20Repository\x20policy-creation\x20entry,\x20E_POLICY_WRITE_GUARD_REQUIRED=22)\x20—\x20never\x20what\x20a\x20listed\x20Guard\x20proves.\x20A\x20guard\x20that\x20returns\x20true\x20for\x20every\x20caller\x20(constant-true\x20leaf,\x20self-comparison,\x20unsigned\x20>=\x200)\x20therefore\x20publishes\x20as\x20\x27guarded\x27\x20while\x20being\x20an\x20OPEN\x20write:\x20any\x20address\x20can\x20add\x20or\x20overwrite\x20any\x20row,\x20and\x20rows\x20carry\x20no\x20author\x20field.\x20Rule\x20R-X1-17\x20folds\x20the\x20tree\x20and\x20reports\x20it;\x20generate\x20the\x20guard\x20from\x20pattern.repository_write_authorization\x20(an\x20identity\x20leaf\x20—\x20context(Signer)\x20/\x20allowlist\x20/\x20Permission\x20staff\x20/\x20Order\x20holder\x20—\x20is\x20mandatory).\x20Under\x20id_from=Signer|Clock\x20the\x20list\x20MAY\x20stay\x20non-empty,\x20but\x20every\x20PolicyGuard\x27s\x20id_from_submission\x20must\x20be\x20None\x20(E_POLICY_ID_FROM_SUBMISSION_FORBIDDEN=23)'],'common_patterns':['Authorized\x20writer:\x20context(Signer)\x20+\x20vec_contains_address(authorized_writers)','Data\x20format\x20validation:\x20identifier(data_submission)\x20+\x20logic_string_contains(expected_prefix)','ID\x20extraction:\x20id_from_submission\x20+\x20data_from_submission\x20combination'],'mutable_after_publish':!![],'r_rounds_focus':['R1','R2','R3','R5','R6','R7']},{'id':'arbitration_usage_guard','name':'Dispute\x20initiation\x20validation\x20(usage_guard)','host_object':'Arbitration','binding_field':'usage_guard','validation_scene':'When\x20a\x20customer\x20initiates\x20a\x20dispute\x20against\x20an\x20order,\x20the\x20Guard\x20validates\x20whether\x20the\x20customer\x20is\x20eligible\x20to\x20initiate\x20the\x20dispute','pass_result':'Create\x20an\x20Arb\x20case\x20and\x20enter\x20the\x20arbitration\x20flow','fail_result':'Dispute\x20rejected;\x20Arb\x20is\x20not\x20created','submission_source':'Customer\x20(Passport\x20credential)','special_constraints':['When\x20Arbitration\x20bPaused=true,\x20it\x20blocks\x20first\x20(before\x20the\x20Guard\x20check)','The\x20customer\x20must\x20first\x20generate\x20a\x20Passport\x20(gen_passport\x20passes\x20usage_guard)','Common\x20queries:\x20order.completed,\x20order.service,\x20entity.has,\x20etc.','Guard\x20validates\x20customer\x20identity\x20+\x20order\x20status\x20+\x20dispute\x20eligibility','Reentrancy:\x20HIGH\x20—\x20Guard\x20pass\x20creates\x20a\x20new\x20Arb\x20case.\x20Without\x20anti-reentrancy,\x20a\x20customer\x20can\x20create\x20multiple\x20Arb\x20cases\x20for\x20the\x20SAME\x20Order\x20(up\x20to\x20MAX_DISPUTE_COUNT=10),\x20harassing\x20the\x20counterparty\x20and\x20inflating\x20arbitration\x20system\x20load.\x20Not\x20direct\x20fund\x20loss,\x20but\x20severe\x20system\x20abuse.\x20Note:\x20the\x20dispute\x20entry\x20point\x20deduplicates\x20by\x20Arb\x20address\x20but\x20does\x20NOT\x20prevent\x20multiple\x20distinct\x20Arbs\x20for\x20the\x20same\x20Order.\x20REQUIRED\x20anti-reentrancy\x20primitive\x20(any\x20one):\x20`order.dispute\x20has`\x20(query\x201565,\x20Bool,\x20per-Arb\x20check)\x20+\x20`logic_not`;\x20OR\x20`order.dispute\x20count`\x20(query\x201564,\x20U64)\x20+\x20`logic_equal(0)`\x20(strict:\x20block\x20any\x20prior\x20dispute)\x20or\x20`logic_as_u256_lesser_or_equal(N)`\x20(lenient:\x20allow\x20up\x20to\x20N\x20disputes)'],'common_patterns':['Order\x20status\x20validation:\x20query(Order.status)\x20+\x20logic_equal(\x27completed\x27)','Membership\x20validation:\x20query(EntityRegistrar)\x20+\x20logic_and','Dispute\x20deadline\x20window:\x20context(Clock)\x20+\x20logic_as_u256_lesser_or_equal(calc_number_add(query(Order.time),\x20N))\x20—\x20Clock\x20<=\x20order_time+N\x20closes\x20disputes\x20after\x20N;\x20a\x20bare\x20query(Order.time)\x20+\x20calc_number_add\x20+\x20context(Clock)\x20chain\x20has\x20NO\x20comparison\x20direction\x20and\x20guards\x20nothing.\x20See\x20pattern.deadline_window','Passport\x20credential:\x20identifier(passport_submission)\x20+\x20context(Signer)'],'mutable_after_publish':!![],'r_rounds_focus':['R1','R2','R3','R5','R7','R8','R9']},{'id':'arbitration_voting_guard','name':'Arbitration\x20voting\x20weight\x20validation\x20(voting_guard[])','host_object':'Arbitration','binding_field':'voting_guard','validation_scene':'When\x20an\x20arbitrator\x20votes,\x20the\x20Guard\x20validates\x20voting\x20eligibility\x20and\x20extracts\x20the\x20voting\x20weight\x20(u32)\x20from\x20GuardIdentifier','pass_result':'Vote\x20is\x20counted;\x20weight\x20is\x20the\x20value\x20extracted\x20by\x20GuardIdentifier','fail_result':'Vote\x20rejected','submission_source':'Voter\x20(Passport\x20credential\x20with\x20weight\x20data)','special_constraints':['The\x20table\x20entry\x20referenced\x20by\x20GuardIdentifier\x20must\x20be\x20of\x20a\x20numeric\x20type\x20(U8-U256),\x20cast\x20to\x20u32','Non-numeric\x20types\x20cause\x20E_GUARD_IDENTIFIER_NOT_NUMBER\x20error','b_submission\x20must\x20be\x20true\x20(weight\x20is\x20submitted\x20at\x20runtime\x20by\x20the\x20voter)','Multiple\x20voting_guards\x20can\x20be\x20configured,\x20each\x20corresponding\x20to\x20a\x20different\x20voter\x20group','When\x20Arbitration\x20bPaused=true,\x20voting\x20is\x20blocked','Reentrancy:\x20CRITICAL\x20—\x20Guard\x20pass\x20counts\x20the\x20vote\x20with\x20the\x20extracted\x20weight.\x20Without\x20anti-reentrancy,\x20the\x20same\x20voter\x20can\x20vote\x20MULTIPLE\x20times,\x20multiplying\x20their\x20weight\x20and\x20skewing\x20the\x20arbitration\x20result\x20(which\x20directly\x20determines\x20fund\x20ownership\x20via\x20compensation).\x20The\x20voter\x27s\x20eligibility\x20(identity,\x20reputation)\x20does\x20NOT\x20naturally\x20invalidate\x20after\x20voting.\x20REQUIRED\x20anti-reentrancy\x20primitive\x20(any\x20one):\x20`arb.voted\x20has`\x20(query\x201404,\x20Bool,\x20per-voter)\x20+\x20`logic_not`;\x20OR\x20`arb.voted.agree\x20has`\x20(query\x201406,\x20Bool,\x20per-voter-per-proposition)\x20+\x20`logic_not`;\x20OR\x20`arb.voted.agree\x20count`\x20(query\x201405,\x20U64,\x20per-voter)\x20+\x20`logic_equal(0)`.\x20Note:\x20`arb.voted_count`\x20(1403)\x20is\x20total\x20voter\x20count\x20(NOT\x20per-voter)\x20and\x20does\x20NOT\x20serve\x20as\x20an\x20anti-reentrancy\x20primitive\x20for\x20individual\x20voters'],'common_patterns':['Reputation\x20score\x20weight:\x20query(EntityRegistrar.records[reputation])\x20+\x20GuardIdentifier(u64)','Fixed\x20weight:\x20identifier(constant_weight)\x20+\x20GuardIdentifier','Multi-tier\x20voting:\x20different\x20voting_guards\x20correspond\x20to\x20different\x20weight\x20tiers','Eligibility\x20+\x20weight:\x20logic_and\x20(eligibility\x20check\x20+\x20GuardIdentifier\x20extracts\x20weight)'],'mutable_after_publish':!![],'r_rounds_focus':['R1','R2','R3','R5','R6','R7','R8','R9']},{'id':'gen_passport_guard','name':'Passport\x20credential\x20generation\x20validation\x20(gen_passport)','host_object':'Standalone','binding_field':'none','validation_scene':'When\x20a\x20user\x20calls\x20gen_passport,\x20the\x20Guard\x20validates\x20user\x20eligibility\x20and\x20generates\x20a\x20Passport\x20with\x20credentials','pass_result':'Passport\x20is\x20generated,\x20containing\x20credentials\x20validated\x20by\x20the\x20Guard','fail_result':'Passport\x20generation\x20fails;\x20the\x20user\x20did\x20not\x20pass\x20validation','submission_source':'Passport\x20applicant\x20(signer\x20+\x20credentials)','special_constraints':['quote_guard\x20is\x20a\x20RIGID\x20verification\x20requirement\x20when\x20querying\x20Repository\x20data\x20(query\x201167)','Two-phase:\x20passport\x20generation\x20scans\x20guard\x20+\x20prepares\x20quote_guard,\x20passport\x20verification\x20re-checks\x20+\x20verifies','If\x20quote_guard==None:\x20Repository\x20data\x20is\x20freely\x20queryable\x20(no\x20access\x20control)','Guard\x20can\x20be\x20created\x20standalone\x20(not\x20bound\x20to\x20a\x20specific\x20Host\x20Object)','Guard\x20can\x20be\x20depended\x20on\x20by\x20other\x20Guards\x20via\x20rely\x20(requires\x20rep=true)','The\x20Passport\x20generated\x20by\x20gen_passport\x20can\x20be\x20used\x20as\x20submission\x20data\x20for\x20subsequent\x20operations','Reentrancy:\x20LOW\x20—\x20Each\x20gen_passport\x20call\x20generates\x20an\x20independent\x20Passport\x20(one\x20Passport\x20per\x20operation).\x20Multiple\x20Passports\x20for\x20the\x20same\x20user\x20are\x20usually\x20valid\x20(each\x20serves\x20a\x20different\x20subsequent\x20operation).\x20IF\x20business\x20intent\x20is\x20\x27one\x20active\x20Passport\x20per\x20user\x27,\x20an\x20anti-reentrancy\x20check\x20is\x20needed\x20but\x20no\x20direct\x20GUARDQUERY\x20primitive\x20exists\x20—\x20use\x20off-chain\x20tracking\x20or\x20a\x20Repository\x20to\x20record\x20issued\x20Passport\x20IDs'],'common_patterns':['Identity\x20validation:\x20context(Signer)\x20+\x20logic_equal\x20(single\x20address/whitelist)','Membership\x20eligibility:\x20query(EntityRegistrar)\x20+\x20logic_equal','Reputation\x20threshold:\x20query(EntityRegistrar.records[reputation])\x20+\x20logic_as_u256_greater_or_equal','Multi-condition\x20combination:\x20logic_and\x20(identity\x20+\x20eligibility\x20+\x20reputation)'],'mutable_after_publish':![],'r_rounds_focus':['R1','R2','R3','R5','R6','R7']}];export function findScene(a,b){return GUARD_SCENES['find'](c=>c['host_object']===a&&c['binding_field']===b);}export function inferSceneFromAction(a){const b={'buy':'service_buy_guard','forward':'machine_forward_guard','allocate':'service_order_allocators_guard','claim_reward':'reward_claim','vote':'arbitration_voting_guard','dispute':'arbitration_usage_guard','write_repository':'repository_write_guard','submit_progress':'progress_submission_guard','gen_passport':'gen_passport_guard'},c=b[a];return GUARD_SCENES['find'](d=>d['id']===c);}export function getImmutableScenes(){return GUARD_SCENES['filter'](a=>!a['mutable_after_publish']);}export function getNumericIdentifierScenes(){return GUARD_SCENES['filter'](a=>a['special_constraints']['some'](b=>b['includes']('numeric')||b['includes']('GuardIdentifier')));}
|
|
@@ -71,6 +71,7 @@ export declare function autoFixGuard(json: GuardJsonInput): {
|
|
|
71
71
|
};
|
|
72
72
|
export declare function lintGuard(input: GuardJsonInput, options?: {
|
|
73
73
|
auto_fix?: boolean;
|
|
74
|
+
host_published?: boolean;
|
|
74
75
|
}): Promise<GuardLintResult>;
|
|
75
76
|
export declare function isGuardReady(json: GuardJsonInput): Promise<boolean>;
|
|
76
77
|
export declare function getGuardErrors(json: GuardJsonInput): Promise<GuardDiagnostic[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{validateGuardData,MAX_DESCRIPTION_LENGTH,MAX_GUARD_TABLE_ITEM_LENGTH,MAX_NAME_LENGTH,ValueType}from'@wowok/wowok';import{rootReferencedIdentifiers}from'./guard-risk.js';import{evaluateGuardDraft}from'./guard-eval.js';import{findScene,inferSceneFromAction}from'./guard-ledger.js';import{suggestTemplateForScene}from'./guard-templates.js';import{validateGuardTreeShape}from'./guard-render.js';import{isBoolReturningQuery}from'../schema/utils/guard-query-utils.js';import{valueTypeName}from'./guard-submission-brief.js';const VALUE_TYPE_ID_TO_NAME={[ValueType['Bool']]:'Bool',[ValueType['Address']]:'Address',[ValueType['String']]:'String',[ValueType['U8']]:'U8',[ValueType['U16']]:'U16',[ValueType['U32']]:'U32',[ValueType['U64']]:'U64',[ValueType['U128']]:'U128',[ValueType['U256']]:'U256',[ValueType['VecBool']]:'VecBool',[ValueType['VecAddress']]:'VecAddress',[ValueType['VecString']]:'VecString',[ValueType['VecU8']]:'VecU8',[ValueType['VecU16']]:'VecU16',[ValueType['VecU32']]:'VecU32',[ValueType['VecU64']]:'VecU64',[ValueType['VecU128']]:'VecU128',[ValueType['VecU256']]:'VecU256',[ValueType['VecVecU8']]:'VecVecU8'};function normalizeValueTypeNames(a){if(!a['table']['some'](b=>typeof b['value_type']==='number'))return a;return{...a,'table':a['table']['map'](b=>typeof b['value_type']==='number'?{...b,'value_type':VALUE_TYPE_ID_TO_NAME[b['value_type']]??String(b['value_type'])}:b)};}function deepClone(a){return JSON['parse'](JSON['stringify'](a));}function rootToString(a){return JSON['stringify'](a);}function canonicalNode(a){if(a===null||typeof a!=='object')return JSON['stringify'](a)??'null';if(Array['isArray'](a))return'['+a['map'](canonicalNode)['join'](',')+']';const b=Object['keys'](a)['sort']();return'{'+b['map'](c=>JSON['stringify'](c)+':'+canonicalNode(a[c]))['join'](',')+'}';}const GE_NODE='logic_as_u256_greater_or_equal',LE_NODE='logic_as_u256_lesser_or_equal';function findDegenerateTimeWindows(a){const b=[],c=new Set(),d=g=>{const h=g['filter'](j=>j?.['type']===GE_NODE&&Array['isArray'](j['nodes'])&&j['nodes']['length']>=0x2),i=g['filter'](j=>j?.['type']===LE_NODE&&Array['isArray'](j['nodes'])&&j['nodes']['length']>=0x2);for(const j of h){for(const k of i){const l=canonicalNode(j['nodes'][0x0])===canonicalNode(k['nodes'][0x0]),m=canonicalNode(j['nodes'][0x1])===canonicalNode(k['nodes'][0x1]);if(!l||!m)continue;const n=canonicalNode(j)+'|'+canonicalNode(k);if(c['has'](n))continue;c['add'](n),b['push']({'ge':j,'le':k});}}},e=g=>{if(g?.['type']==='logic_and'&&Array['isArray'](g['nodes']))return g['nodes']['flatMap'](e);return[g];},f=g=>{if(!g||typeof g!=='object')return;if(g['type']==='logic_not')return;if(g['type']==='logic_and'&&Array['isArray'](g['nodes'])){const h=e(g);d(h),h['forEach'](f);return;}if(g['type']==='logic_or'&&Array['isArray'](g['nodes'])){for(const i of g['nodes']){i?.['type']==='logic_and'&&Array['isArray'](i['nodes'])?(d(i['nodes']),i['nodes']['forEach'](f)):f(i);}return;}if(g['type']===GE_NODE||g['type']===LE_NODE)d([g]);if(Array['isArray'](g['nodes']))g['nodes']['forEach'](f);};return f(a),b;}function hasSignerContext(a){const b=rootToString(a);return b['includes']('\x22Signer\x22')||b['includes']('\x22context\x22:\x22Signer\x22')||b['includes']('\x22context\x22:\x20\x22Signer\x22');}function getSubmissionEntries(a){return a['filter'](b=>b['b_submission']===!![]);}function inferValueType(a){if(typeof a==='string'){if(a['startsWith']('0x')&&a['length']>=0x3)return'Address';return'String';}if(typeof a==='number'){if(Number['isInteger'](a)){if(a>=0x0&&a<=0xff)return'U8';if(a>=0x0&&a<=0xffff)return'U16';return'U64';}return'U256';}if(typeof a==='boolean')return'Bool';if(Array['isArray'](a)){if(a['length']>0x0){const b=inferValueType(a[0x0]);if(b==='Address')return'Vec<Address>';if(b==='String')return'Vec<String>';if(b==='Bool')return'Vec<Bool>';}return'Vec<Address>';}return undefined;}function sdkIssueToDiagnostic(a){return{'code':a['code'],'message':a['message'],'severity':a['severity'],'source':'sdk','location':{'path':a['path']},'fix':{'description':'SDK\x20validation\x20failed\x20('+(a['sdk_error']??'InvalidParam')+');\x20manual\x20fix\x20required','auto_fixable':![]}};}async function checkSdkSyntax(a){const b=validateGuardTreeShape(a['root']);if(b['length']>0x0)return b['map'](f=>({'code':'G-001','message':f['message'],'severity':'error','source':'sdk','location':{'path':f['path']},'fix':{'description':'Unary\x20operators\x20(logic_not,\x20value_type,\x20vec_length,\x20calc_string_length,\x20convert_*)\x20take\x20a\x20single\x20\x27node\x27\x20child;\x20only\x20multi-operand\x20forms\x20(logic_and,\x20logic_or,\x20logic_equal,\x20logic_as_u256_*,\x20calc_number_*,\x20vec_contains_*)\x20take\x20a\x20\x27nodes\x27\x20array.','auto_fixable':![]}}));const c=a['table']['map'](f=>({'identifier':f['identifier'],'b_submission':f['b_submission']??![],'value_type':f['value_type']??'Address','value':f['value'],'name':f['name']??''}));let d;try{d=await validateGuardData({'description':a['description'],'table':c,'root':a['root'],'rely':a['rely']});}catch(f){const g=f?.['message']??String(f),h=/guard tree ([^:]+):/['exec'](g);return[{'code':'G-001','message':g,'severity':'error','source':'sdk','location':{'path':h?toJsonPointer(h[0x1]):'/root'},'fix':{'description':'Repair\x20the\x20tree\x20at\x20the\x20named\x20path:\x20unary\x20operators\x20(logic_not,\x20convert_*,\x20value_type)\x20take\x20a\x20single\x20\x27node\x27\x20child;\x20only\x20multi-operand\x20forms\x20(logic_and,\x20logic_or,\x20logic_equal,\x20calc_*,\x20vec_*)\x20take\x20\x27nodes\x27.','auto_fixable':![]}}];}return d['map'](sdkIssueToDiagnostic);}function toJsonPointer(a){const b=a['replace'](/^\/+/,'');return b['startsWith']('root')?'/'+b:'/root/'+b;}function checkSemanticErrors(a){const b=[],{table:c,root:d,binding_hint:e}=a,f=e?findScene(e['host_object']??'',e['binding_field']??''):undefined,g=getSubmissionEntries(c);if(g['length']>0x0&&d&&!hasSignerContext(d)){const i=g['some'](l=>l['value_type']==='Address'),j=f?.['id']==='service_order_allocators_guard'&&e?.['sharing_recipients']!==undefined&&e['sharing_recipients']['length']>0x0&&!e['sharing_recipients']['includes']('Signer'),k=f?.['id']==='service_order_allocators_guard'&&g['length']>0x0&&g['every'](l=>!rootReferencedIdentifiers(d)['has'](l['identifier']));if(i&&!j&&!k){const l=g['filter'](m=>m['value_type']==='Address')['map'](m=>c['indexOf'](m));b['push']({'code':'LE-04','message':'Submitted\x20data\x20has\x20no\x20Signer\x20binding\x20(submission\x20forgery\x20risk)','severity':'error','source':'lint','location':{'path':l['map'](m=>'/table/'+m)['join']('\x20→\x20')},'fix':{'description':'Add\x20logic_equal(context(Signer),\x20identifier[N])\x20in\x20root\x20to\x20bind\x20the\x20submitter\x20identity','auto_fixable':![]}});}}if(f?.['id']==='arbitration_voting_guard'){const m=g['some'](n=>['U8','U16','U32','U64','U128','U256']['includes'](n['value_type']??''));if(m){const n=g['filter'](o=>['U8','U16','U32','U64','U128','U256']['includes'](o['value_type']??''))['map'](o=>c['indexOf'](o));b['push']({'code':'LE-05','message':'voting_guard\x20voting\x20weight\x20comes\x20from\x20submitted\x20data\x20(weight\x20forgery\x20risk)','severity':'error','source':'lint','location':{'path':n['map'](o=>'/table/'+o)['join']('\x20→\x20')},'fix':{'description':'Derive\x20arbitrator\x20weights\x20from\x20the\x20Arb\x20object\x20via\x20witness\x20(e.g.\x20105\x20TypeArbArbitration)\x20rather\x20than\x20submitting\x20them\x20directly','auto_fixable':![]}});}}if(f?.['id']==='gen_passport_guard'||e?.['action']==='gen_passport'){const o=rootToString(d);if(o['includes']('1167')||o['includes']('repository.data')){const p=o['includes']('quote_guard');p&&b['push']({'code':'LE-06','message':'repository.data\x20query\x20with\x20quote_guard:\x20rigid\x20verification\x20requirement\x20—\x20ensure\x20Passport\x20includes\x20quote_guard\x20verification\x20with\x20necessary\x20submissions\x20(e.g.,\x20Payment\x20proof)','severity':'info','source':'lint','location':{'path':'/root'},'fix':{'description':'Ensure\x20the\x20quote_guard\x20is\x20verified:\x20user\x20submits\x20Payment\x20via\x20Passport,\x20quote_guard\x20verifies\x20Payment\x20fields,\x20repository\x20data\x20query\x20passes','auto_fixable':![]}});}}if(e?.['host_object']&&f){const q=e['host_object'],r=c['filter'](s=>!s['b_submission']&&s['value_type']==='Address'&&typeof s['value']==='string'&&s['value']['startsWith']('0x')&&s['object_type']===q);if(r['length']>0x0){const s=r['map'](t=>c['indexOf'](t));b['push']({'code':'LE-07','message':'Circular\x20reference\x20uses\x20an\x20address\x20rather\x20than\x20a\x20name\x20(Host\x20Object\x20may\x20not\x20be\x20published\x20yet\x20when\x20the\x20Guard\x20is\x20created)','severity':'error','source':'lint','location':{'path':s['map'](t=>'/table/'+t+'/value')['join']('\x20→\x20')},'fix':{'description':'Change\x20value\x20from\x20an\x20address\x20to\x20an\x20object\x20name\x20(e.g.\x20\x22service1\x22);\x20the\x20SDK\x20will\x20resolve\x20it\x20to\x20an\x20address\x20after\x20the\x20Host\x20Object\x20is\x20published','auto_fixable':![]}});}}const h=c['filter'](t=>t['b_submission']===![]&&Array['isArray'](t['value'])&&t['value']['length']===0x0);h['length']>0x0&&b['push']({'code':'LE-10','message':'Static\x20table\x20slot(s)\x20'+h['map'](t=>t['identifier'])['join'](',\x20')+'\x20carry\x20an\x20EMPTY\x20array\x20value\x20—\x20'+'guard\x20table\x20construction\x20silently\x20DROPS\x20empty\x20vectors:\x20the\x20created\x20Guard\x20will\x20MISS\x20these\x20rows\x20while\x20creation\x20still\x20succeeds.','severity':'error','source':'lint','location':{'path':h['map'](t=>'/table['+t['identifier']+']')['join']('\x20→\x20')},'fix':{'description':'Give\x20each\x20flagged\x20slot\x20a\x20non-empty\x20static\x20value,\x20or\x20flip\x20it\x20to\x20b_submission=true\x20and\x20supply\x20the\x20value\x20at\x20Guard\x20trigger\x20time\x20(protocol\x20once-slots:\x20255\x20keys\x20on\x20the\x20submitted\x20bytes,\x20254\x20on\x20the\x20chain-derived\x20object\x20key).','auto_fixable':![]}});for(const {ge:t,le:u}of findDegenerateTimeWindows(d)){b['push']({'code':'LE-08','message':'Degenerate\x20time\x20window:\x20the\x20same\x20conjunction\x20asserts\x20`L\x20>=\x20R`\x20and\x20`L\x20<=\x20R`\x20over\x20'+'structurally\x20identical\x20operands.\x20Their\x20conjunction\x20is\x20`L\x20==\x20R`\x20—\x20on\x20a\x20millisecond\x20Clock\x20'+'an\x20~1\x20ms\x20window,\x20i.e.\x20the\x20guarded\x20forward\x20is\x20effectively\x20unreachable.\x20'+'`logic_as_u256_greater_or_equal`\x20is\x20a\x20LOWER\x20bound\x20(deadline\x20passed);\x20an\x20upper\x20bound\x20'+'(`logic_as_u256_lesser_or_equal`)\x20must\x20use\x20a\x20DIFFERENT\x20right-hand\x20side.','severity':'error','source':'lint','location':{'path':'/root'},'fix':{'description':'For\x20\x22the\x20deadline\x20has\x20passed\x22,\x20keep\x20ONLY\x20`L\x20>=\x20R`\x20and\x20delete\x20the\x20`<=`\x20clause.\x20'+'For\x20\x22the\x20window\x20is\x20open\x22,\x20keep\x20both\x20clauses\x20but\x20make\x20the\x20right-hand\x20sides\x20differ,\x20'+'e.g.\x20`L\x20>=\x20t`\x20and\x20`L\x20<=\x20t\x20+\x20K`.\x20Remember\x20`progress.current_time`\x20is\x20refreshed\x20on\x20'+'every\x20forward,\x20so\x20anchoring\x20a\x20release\x20lock\x20on\x20it\x20restarts\x20the\x20clock\x20at\x20each\x20node\x20change.','auto_fixable':![]}});}{const w=[],x=(z,A)=>{if(!A||typeof A!=='object')return;if(A['type']==='query'&&A['query']!==undefined){if(!isBoolReturningQuery(A['query'])){const B=typeof A['query']==='string'?A['query']:String(A['query']);w['push']({'op':z,'describe':'query\x20'+B,'claimedByTwin':/claimed_by/i['test'](B)&&!/\bsome\b/i['test'](B)});}}else{if(A['type']==='identifier'&&A['identifier']!==undefined){const C=c['find'](E=>E['identifier']===A['identifier']),D=C?.['value_type'];D&&D!=='Bool'&&D!=='Value'&&w['push']({'op':z,'describe':'identifier\x20'+A['identifier']+'\x20(table\x20value_type\x20'+D+')','claimedByTwin':![]});}}},y=z=>{if(!z||typeof z!=='object')return;if(z['type']==='logic_not'){x('logic_not',z['node']),y(z['node']);return;}Array['isArray'](z['nodes'])&&((z['type']==='logic_and'||z['type']==='logic_or')&&z['nodes']['forEach'](A=>x(z['type'],A)),z['nodes']['forEach'](y));if(z['node'])y(z['node']);};y(d);for(const z of w){b['push']({'code':'LE-09','message':z['op']+'\x20consumes\x20a\x20non-Bool\x20leaf\x20('+z['describe']+')\x20—\x20Bool\x20operators\x20take\x20Bool\x20operands\x20only\x20(crs\x20P2-1/P2-2)'+(z['claimedByTwin']?'.\x20TEACHING:\x20order.claimed_by\x20(query\x201571)\x20returns\x20Address;\x20its\x20Bool\x20twin\x20is\x20`order.claimed_by\x20some`\x20(query\x201570)\x20—\x20use\x20THAT\x20in\x20logic_not\x20/\x20logic_equal.':'.\x20TEACHING:\x20wrap\x20the\x20leaf\x20in\x20logic_equal[leaf,\x20identifier[N]]\x20(any\x20type)\x20or\x20a\x20logic_as_u256_*\x20operator\x20(numeric\x20comparison)\x20to\x20produce\x20a\x20Bool.'),'severity':'error','source':'lint','location':{'path':'/root'},'fix':{'description':z['claimedByTwin']?'Replace\x20query\x20order.claimed_by\x20with\x20order.claimed_by\x20some\x20(query\x201570)':'Wrap\x20the\x20leaf\x20in\x20logic_equal\x20against\x20identifier[N]\x20so\x20'+z['op']+'\x20receives\x20a\x20Bool','auto_fixable':![]}});}}return b;}function checkSyntaxHints(a){const b=[],{table:c}=a;(!a['description']||a['description']['trim']()==='')&&b['push']({'code':'SH-01','message':'description\x20is\x20missing\x20or\x20empty','severity':'info','source':'lint','location':{'path':'/description'},'fix':{'description':'Add\x20a\x20description,\x20e.g.\x20\x27Service\x20buy_guard:\x20whitelist\x20validation\x27','auto_fixable':!![]}});for(let d=0x0;d<c['length'];d++){const e=c[d];(!e['name']||e['name']['trim']()==='')&&b['push']({'code':'SH-03','message':'table['+d+']\x20is\x20missing\x20name','severity':'warning','source':'lint','location':{'path':'/table/'+d+'/name'},'fix':{'description':'Add\x20a\x20name,\x20e.g.\x20\x22data\x20entry\x20'+e['identifier']+'\x22','auto_fixable':!![]}});}for(let f=0x0;f<c['length'];f++){const g=c[f];!g['value_type']&&b['push']({'code':'SH-05','message':'table['+f+']\x20is\x20missing\x20value_type','severity':'warning','source':'lint','location':{'path':'/table/'+f+'/value_type'},'fix':{'description':'Infer\x20value_type\x20from\x20value\x20(e.g.\x20Address/String/U64,\x20etc.)','auto_fixable':!![]}});}c['length']>MAX_GUARD_TABLE_ITEM_LENGTH&&b['push']({'code':'SH-07','message':'table\x20entry\x20count\x20'+c['length']+'\x20exceeds\x20the\x20maximum\x20limit\x20'+MAX_GUARD_TABLE_ITEM_LENGTH,'severity':'error','source':'lint','location':{'path':'/table'},'fix':{'description':'Slim\x20down\x20the\x20table\x20by\x20merging\x20similar\x20entries,\x20or\x20split\x20into\x20multiple\x20Guards\x20+\x20rely','auto_fixable':![]}});for(let h=0x0;h<c['length'];h++){c[h]['b_submission']===undefined&&b['push']({'code':'SH-10','message':'table['+h+']\x20b_submission\x20is\x20missing','severity':'info','source':'lint','location':{'path':'/table/'+h+'/b_submission'},'fix':{'description':'Set\x20to\x20false\x20(constant)\x20or\x20true\x20(submitted\x20data)','auto_fixable':!![]}});}for(let j=0x0;j<c['length'];j++){const k=c[j];k['b_submission']===!![]&&k['value']!==undefined&&k['value']!==null&&b['push']({'code':'SH-11','message':'table['+j+']\x20has\x20a\x20redundant\x20value\x20field\x20on\x20b_submission=true\x20entry\x20(the\x20verifier\x20supplies\x20the\x20value\x20at\x20runtime;\x20this\x20value\x20is\x20ignored\x20by\x20BCS\x20encoding\x20and\x20wastes\x20gas)','severity':'warning','source':'lint','location':{'path':'/table/'+j+'/value'},'fix':{'description':'Remove\x20the\x20value\x20field\x20—\x20it\x20is\x20ignored\x20for\x20b_submission=true\x20entries','auto_fixable':!![]}});}return b;}function checkSuggestions(a){const b=[],{root:c,binding_hint:d,table:e,description:f}=a;if(c){const i=rootToString(c);if(i['includes']('vec_contains_address')&&i['includes']('Signer'))b['push']({'code':'SG-01','message':'Matches\x20Pattern\x20P04\x20(whitelist\x20validation)','severity':'hint','source':'lint','location':{'path':'/root'},'fix':{'description':'Refer\x20to\x20the\x20P04\x20Pattern\x20to\x20ensure\x20best\x20practices','auto_fixable':![]}});else{if(i['includes']('logic_equal')&&i['includes']('Signer')){const j=e['some'](k=>!k['b_submission']&&k['value_type']==='Address'&&typeof k['value']==='string'&&k['value']['length']>0x0);j&&b['push']({'code':'SG-01','message':'Matches\x20Pattern\x20P04\x20(whitelist\x20validation\x20—\x20single-address\x20variant)','severity':'hint','source':'lint','location':{'path':'/root'},'fix':{'description':'P04\x20single-address\x20form;\x20for\x20multi-address\x20scenarios,\x20consider\x20vec_contains_address','auto_fixable':![]}});}}(i['includes']('logic_as_u256_greater')||i['includes']('logic_as_u256_lesser'))&&b['push']({'code':'SG-01','message':'Matches\x20Pattern\x20P02\x20(numeric\x20threshold\x20validation)','severity':'hint','source':'lint','location':{'path':'/root'},'fix':{'description':'Suitable\x20for\x20amount/quantity\x20threshold\x20validation\x20scenarios','auto_fixable':![]}}),i['includes']('convert_witness')&&b['push']({'code':'SG-01','message':'Matches\x20Pattern\x20P09\x20(witness-derived\x20validation)','severity':'hint','source':'lint','location':{'path':'/root'},'fix':{'description':'Suitable\x20for\x20cross-object\x20relationship\x20validation\x20(e.g.\x20Order→Progress)','auto_fixable':![]}});}if(d?.['action']){const k=['buy','forward','allocate','claim_reward','vote','dispute','write_repository','submit_progress','gen_passport'];if(k['includes'](d['action'])){const l=inferSceneFromAction(d['action']);if(l){const m=suggestTemplateForScene(l['id']);m&&b['push']({'code':'SG-02','message':'Recommended\x20scene\x20template:\x20'+m['name'],'severity':'hint','source':'lint','location':{'path':'/'},'fix':{'description':'Refer\x20to\x20template\x20'+m['id']+'\x20('+m['example_use_case']+')','auto_fixable':![]}});}}}const g=n=>new TextEncoder()['encode'](n)['length'],h=getSubmissionEntries(e);for(const [n,o]of e['entries']()){const p=o['name']??'';if(p['length']===0x0)continue;if(g(p)>MAX_NAME_LENGTH)b['push']({'code':'SG-03','message':'table['+n+']\x20name\x20is\x20'+g(p)+'\x20BCS\x20characters,\x20maximum\x20is\x20'+MAX_NAME_LENGTH+'.\x20Use\x20a\x20short\x20identifier\x20(e.g.\x20\x27order_id\x27,\x20\x27delivery_node\x27);\x20the\x20human-readable\x20explanation\x20belongs\x20in\x20the\x20Guard\x27s\x20\x27description\x27\x20field','severity':'warning','source':'lint','location':{'path':'/table/'+n+'/name'},'fix':{'description':'Shorten\x20the\x20name\x20to\x20'+MAX_NAME_LENGTH+'\x20BCS\x20characters\x20or\x20fewer','auto_fixable':![]}});else p['toLowerCase']()['startsWith']('0x')&&b['push']({'code':'SG-03','message':'table['+n+']\x20name\x20must\x20not\x20start\x20with\x20\x220x\x22\x20(reserved\x20for\x20object\x20IDs)','severity':'warning','source':'lint','location':{'path':'/table/'+n+'/name'},'fix':{'description':'Rename\x20the\x20entry\x20without\x20the\x200x\x20prefix','auto_fixable':![]}});}if(h['length']>0x0){const q=(f??'')['trim']();q['length']<0xa&&b['push']({'code':'SG-03','message':'This\x20Guard\x20accepts\x20submitted\x20data\x20('+h['length']+'\x20table\x20'+(h['length']===0x1?'entry':'entries')+'\x20with\x20b_submission=true)\x20but\x20its\x20description\x20is\x20too\x20short\x20for\x20a\x20verifier\x20to\x20know\x20what\x20to\x20submit.\x20Explain\x20the\x20expected\x20submitted\x20data\x20in\x20the\x20Guard\x27s\x20\x27description\x27\x20field,\x20e.g.\x20\x27user-submitted\x20operation\x20type\x20(return/damage)\x27','severity':'info','source':'lint','location':{'path':'/'},'fix':{'description':'Explain\x20the\x20expected\x20submitted\x20data\x20in\x20the\x20Guard\x27s\x20\x27description\x27\x20field','auto_fixable':![]}});}if(c){const r=rootToString(c),s=r['includes']('proof.signer'),t=r['includes']('proof.time'),u=r['includes']('calc_string_length'),v=h['some'](w=>w['value_type']==='String');if(s&&t)b['push']({'code':'SG-04','message':'Strict-mode\x20privacy-delivery\x20guard\x20detected\x20(proof.signer\x20+\x20proof.time).\x20'+'Recommended\x20three\x20conditions:\x20Signer==proof.signer\x20(submitter\x20accountability),\x20'+'proof.time>order.time\x20(freshness),\x20order.service==service\x20(project\x20binding).\x20'+'No\x20content\x20verification\x20—\x20only\x20submission\x20responsibility\x20(\x27whoever\x20benefits\x20bears\x20the\x20burden\x20of\x20proof\x27).','severity':'info','source':'lint','location':{'path':'/root'},'fix':{'description':'Ensure\x20all\x20three\x20conditions\x20are\x20present\x20(logic_and).\x20Refer\x20to\x20template\x20tpl_forward_privacy_delivery_proof.\x20'+'Query\x20IDs:\x20proof.signer=1958,\x20proof.time=1960,\x20order.time=1574,\x20order.service=1563.','auto_fixable':![]}});else u&&v&&b['push']({'code':'SG-04','message':'Broad-mode\x20privacy-delivery\x20guard\x20detected\x20(String\x20submission\x20+\x20length\x20check,\x20e.g.\x20Merkle\x20Root\x20length\x20==\x2066).\x20'+'This\x20trusts\x20the\x20submitter\x27s\x20honesty;\x20the\x20counterparty\x20can\x20dispute\x20by\x20checking\x20their\x20own\x20Messenger\x20conversation.\x20'+'Suitable\x20as\x20an\x20arbitration\x20basis,\x20not\x20a\x20fund-flow\x20gate.','severity':'info','source':'lint','location':{'path':'/root'},'fix':{'description':'For\x20stronger\x20assurance,\x20consider\x20strict\x20mode:\x20submit\x20a\x20Proof\x20object\x20address\x20(from\x20messenger.submitChainProof)\x20+\x20'+'Order\x20address,\x20then\x20verify\x20proof.signer/proof.time/order.service.\x20See\x20template\x20tpl_forward_privacy_delivery_proof.','auto_fixable':![]}});}return b;}export function autoFixGuard(a){const b=deepClone(a),c=[];(!b['description']||b['description']['trim']()==='')&&(b['description']='Guard\x20(table:\x20'+b['table']['length']+'\x20items,\x20root:\x20'+(b['root']?.['type']??'unknown')+')',c['push']({'diagnostic_code':'SH-01','description':'Fill\x20in\x20default\x20description','after':b['description'],'path':'/description'}));if(b['description']&&b['description']['length']>MAX_DESCRIPTION_LENGTH){const f=b['description'];b['description']=b['description']['substring'](0x0,MAX_DESCRIPTION_LENGTH),c['push']({'diagnostic_code':'G-001','description':'Truncate\x20description\x20to\x20'+MAX_DESCRIPTION_LENGTH+'\x20characters','before':f['length']+'\x20characters','after':b['description']['length']+'\x20characters','path':'/description'});}for(let g=0x0;g<b['table']['length'];g++){const h=b['table'][g];(!h['name']||h['name']['trim']()==='')&&(h['name']='data\x20entry\x20'+h['identifier'],c['push']({'diagnostic_code':'SH-03','description':'table['+g+']\x20fill\x20in\x20name','after':h['name'],'path':'/table/'+g+'/name'}));}for(let j=0x0;j<b['table']['length'];j++){const k=b['table'][j];if(!k['value_type']&&k['value']!==undefined&&k['value']!==null){const l=inferValueType(k['value']);l&&(k['value_type']=l,c['push']({'diagnostic_code':'SH-05','description':'table['+j+']\x20infer\x20value_type','after':l,'path':'/table/'+j+'/value_type'}));}}const d=new Map();let e=0x0;for(let m=0x0;m<b['table']['length'];m++){const n=b['table'][m];if(!d['has'](n['identifier']))d['set'](n['identifier'],e),n['identifier']!==e&&c['push']({'diagnostic_code':'G-007','description':'table['+m+']\x20identifier\x20'+n['identifier']+'\x20→\x20'+e,'before':String(n['identifier']),'after':String(e),'path':'/table/'+m+'/identifier'}),n['identifier']=e,e++;else{const o=n['identifier'];n['identifier']=e,d['set'](o,e),c['push']({'diagnostic_code':'G-007','description':'table['+m+']\x20identifier\x20'+o+'\x20duplicate\x20→\x20reallocated\x20to\x20'+e,'before':String(o),'after':String(e),'path':'/table/'+m+'/identifier'}),e++;}}for(let p=0x0;p<b['table']['length'];p++){const q=b['table'][p];q['b_submission']===undefined&&(q['b_submission']=![],c['push']({'diagnostic_code':'SH-10','description':'table['+p+']\x20b_submission\x20default\x20set\x20to\x20false','after':'false','path':'/table/'+p+'/b_submission'}));}if(b['rely']?.['guards']&&b['rely']['guards']['length']>0x0){const r=[...new Set(b['rely']['guards'])];r['length']!==b['rely']['guards']['length']&&(c['push']({'diagnostic_code':'G-009','description':'rely\x20deduplicate:\x20'+b['rely']['guards']['length']+'\x20→\x20'+r['length'],'before':JSON['stringify'](b['rely']['guards']),'after':JSON['stringify'](r),'path':'/rely/guards'}),b['rely']['guards']=r);}for(let s=0x0;s<b['table']['length'];s++){const t=b['table'][s];if(t['b_submission']===!![]&&t['value']!==undefined&&t['value']!==null){const u=JSON['stringify'](t['value']);delete t['value'],c['push']({'diagnostic_code':'SH-11','description':'table['+s+']\x20remove\x20redundant\x20value\x20on\x20b_submission=true\x20entry','before':u,'after':'(removed)','path':'/table/'+s+'/value'});}}return{'fixed':b,'actions':c};}export async function lintGuard(a,b){const c=b?.['auto_fix']??!![],d=normalizeValueTypeNames(a),{table:e,root:f,rely:g,binding_hint:h}=d,i=[];let j;const k=await checkSdkSyntax(d);i['push'](...k);const l=checkSemanticErrors(d);i['push'](...l);const m=checkSyntaxHints(d);i['push'](...m);let n,o=[];if(c){const {fixed:w,actions:x}=autoFixGuard(d);x['length']>0x0&&(n=w,o=x);}if(e['length']>0x0&&f){const y=h?findScene(h['host_object']??'',h['binding_field']??''):undefined,z=e['map'](B=>({'identifier':B['identifier'],'b_submission':B['b_submission']??![],'value_type':B['value_type']??'Address','value':B['value'],'name':B['name'],'object_type':B['object_type']})),A=evaluateGuardDraft({'table':z,'root':f,'rely':g,'scene':y,'sharing_recipients':h?.['sharing_recipients']});j=A['assessment'];for(const B of j['risks']){const C=B['level']==='critical'||B['level']==='high'?'error':B['level']==='medium'?'warning':B['level']==='low'?'info':'hint',D=B['evidence']??'',E=D['startsWith']('/')?D:'/';i['push']({'code':B['id'],'message':'['+B['level']+']\x20'+B['title'],'severity':C,'source':'risk','location':{'path':E},'fix':{'description':B['mitigation'],'auto_fixable':![]}});}}const p=checkSuggestions(d);i['push'](...p);const q=i['filter'](F=>F['severity']==='error')['length'],s=i['filter'](F=>F['severity']==='warning')['length'],t=i['filter'](F=>F['severity']==='info'||F['severity']==='hint')['length'],u=q===0x0;let v;if(q>0x0)v='Fix\x20'+q+'\x20error(s)\x20and\x20re-run\x20lint';else s>0x0?v='Consider\x20addressing\x20'+s+'\x20warning(s),\x20then\x20submit\x20to\x20SDK\x20newGuard()\x20for\x20final\x20syntax\x20validation':v='lint\x20passed\x20(no\x20errors);\x20submit\x20to\x20SDK\x20newGuard()\x20for\x20final\x20syntax\x20validation\x20before\x20going\x20on-chain';return{'json_summary':{'table_count':e['length'],'root_type':f?.['type']??'unknown','has_rely':!!g?.['guards']?.['length'],'rely_count':g?.['guards']?.['length']??0x0,'has_description':!!d['description']},'diagnostics':i,'fixed_json':n,'fix_actions':o,'risk_assessment':j,'summary':{'errors':q,'warnings':s,'infos':t,'auto_fixes_applied':o['length'],'ready':u,'next_step':v}};}export async function isGuardReady(a){const b=await lintGuard(a,{'auto_fix':![]});return b['summary']['ready'];}export async function getGuardErrors(a){const b=await lintGuard(a,{'auto_fix':![]});return b['diagnostics']['filter'](c=>c['severity']==='error');}export function formatLintResult(a){const b=[];b['push']('===\x20Guard\x20JSON\x20Lint\x20Report\x20==='),b['push'](''),b['push']('Summary:'),b['push']('\x20\x20Errors:\x20\x20\x20\x20\x20'+a['summary']['errors']),b['push']('\x20\x20Warnings:\x20\x20\x20'+a['summary']['warnings']),b['push']('\x20\x20Infos:\x20\x20\x20\x20\x20\x20'+a['summary']['infos']),b['push']('\x20\x20Auto-fixes:\x20'+a['summary']['auto_fixes_applied']),b['push']('\x20\x20Ready:\x20\x20\x20\x20\x20\x20'+(a['summary']['ready']?'YES':'NO')),b['push']('\x20\x20Next\x20step:\x20\x20'+a['summary']['next_step']),b['push']('');if(a['fix_actions']['length']>0x0){b['push']('---\x20Auto-fix\x20Actions\x20---');for(const g of a['fix_actions']){b['push']('\x20\x20['+g['diagnostic_code']+']\x20'+g['description']),b['push']('\x20\x20\x20\x20Path:\x20'+g['path']),g['before']&&g['after']&&b['push']('\x20\x20\x20\x20'+g['before']+'\x20->\x20'+g['after']);}b['push']('');}const c=a['diagnostics']['filter'](h=>h['severity']==='error'),e=a['diagnostics']['filter'](h=>h['severity']==='warning'),f=a['diagnostics']['filter'](h=>h['severity']==='info'||h['severity']==='hint');if(c['length']>0x0){b['push']('---\x20Errors\x20(must\x20fix)\x20---');for(const h of c){b['push']('\x20\x20['+h['code']+']\x20('+h['source']+')\x20'+h['message']),b['push']('\x20\x20\x20\x20Path:\x20'+h['location']['path']);if(h['fix'])b['push']('\x20\x20\x20\x20Fix:\x20\x20'+h['fix']['description']);}b['push']('');}if(e['length']>0x0){b['push']('---\x20Warnings\x20(consider\x20fixing)\x20---');for(const i of e){b['push']('\x20\x20['+i['code']+']\x20('+i['source']+')\x20'+i['message']),b['push']('\x20\x20\x20\x20Path:\x20'+i['location']['path']);if(i['fix'])b['push']('\x20\x20\x20\x20Fix:\x20\x20'+i['fix']['description']);}b['push']('');}if(f['length']>0x0){b['push']('---\x20Info\x20&\x20Hints\x20---');for(const j of f){b['push']('\x20\x20['+j['code']+']\x20('+j['source']+')\x20'+j['message']),b['push']('\x20\x20\x20\x20Path:\x20'+j['location']['path']);}}return b['join']('\x0a');}export function translateGuardTypeError(a){if(!a)return undefined;let b='',c=-0x1,d=-0x1;const e=a['match'](/([\w.[\]-]+)\s*(?:→|->)\s*checkType:\s*(\d+)\s+require type:\s*(\d+)/);if(e)b=e[0x1],c=Number(e[0x2]),d=Number(e[0x3]);else{const j=a['match'](/checkType:\s*(\d+)\s+require type:\s*(\d+)/);if(!j)return undefined;c=Number(j[0x1]),d=Number(j[0x2]);}const f=b?'at\x20'+b+':\x20':'',g=valueTypeName(c),h=valueTypeName(d),i=[];if(d===0x0){i['push'](f+'the\x20parent\x20operator\x20needs\x20a\x20BOOL\x20operand,\x20but\x20the\x20child\x20returns\x20'+g+'.');if(c===0x1&&/claimed_by/i['test'](a))i['push']('TEACHING\x20(Bool/Address\x20twin,\x20crs\x20P2-2):\x20order.claimed_by\x20(query\x201571)\x20returns\x20Address;\x20'+'its\x20Bool\x20twin\x20is\x20`order.claimed_by\x20some`\x20(query\x201570\x20—\x20has\x20ANY\x20claimer).\x20Invert\x20THAT\x20with\x20'+'logic_not,\x20or\x20assert\x20logic_equal[query\x201570,\x20false].');else{if(c===0x1)i['push']('TEACHING:\x20wrap\x20the\x20Address\x20leaf\x20in\x20logic_equal\x20against\x20identifier[N]\x20—\x20'+'logic_equal[{type:\x22query\x22,\x20query:\x22...\x22},\x20{type:\x22identifier\x22,\x20identifier:N}].\x20'+'A\x20Bool\x20operator\x20(logic_and/or/not)\x20can\x20never\x20consume\x20a\x20bare\x20Address.');else{if(c===0x2)i['push']('TEACHING:\x20wrap\x20the\x20String\x20leaf\x20in\x20logic_equal\x20against\x20identifier[N].\x20A\x20multi-node\x20'+'membership\x20test\x20\x27current\x20in\x20{a,b,c}\x27\x20has\x20NO\x20set\x20operator\x20yet\x20(crs\x20P2-1):\x20express\x20one\x20'+'logic_equal\x20per\x20value\x20joined\x20by\x20logic_or\x20—\x20each\x20value\x20a\x20frozen\x20table\x20entry\x20(Guards\x20are\x20'+'create-only,\x20IMMUT-003).');else c>=0x3&&c<=0x8?i['push']('TEACHING:\x20numeric\x20leaf\x20—\x20compare\x20via\x20the\x20logic_as_u256_greater/lesser/equal\x20variants,\x20'+'or\x20wrap\x20in\x20logic_equal\x20against\x20a\x20numeric\x20identifier[N].'):i['push']('TEACHING:\x20wrap\x20the\x20leaf\x20in\x20a\x20Bool-producing\x20operator\x20(logic_equal\x20/\x20logic_as_u256_*)\x20'+'before\x20feeding\x20logic_and/or/not.');}}}else i['push'](f+'the\x20operator\x20requires\x20'+h+',\x20but\x20the\x20child\x20returns\x20'+g+'.\x20TEACHING:\x20align\x20the\x20operand\x20'+'types\x20—\x20wrap\x20in\x20logic_equal\x20(any\x20type)\x20or\x20convert\x20with\x20the\x20logic_as_u256_*\x20family\x20(numeric)\x20'+'before\x20the\x20comparison.');return['GUARD\x20TYPE\x20ERROR\x20(with\x20teaching\x20notes\x20below):',a['trim'](),...i]['join']('\x0a');}
|
|
1
|
+
import{validateGuardData,MAX_DESCRIPTION_LENGTH,MAX_GUARD_TABLE_ITEM_LENGTH,MAX_NAME_LENGTH,ValueType}from'@wowok/wowok';import{rootReferencedIdentifiers}from'./guard-risk.js';import{evaluateGuardDraft}from'./guard-eval.js';import{findScene,inferSceneFromAction}from'./guard-ledger.js';import{suggestTemplateForScene}from'./guard-templates.js';import{validateGuardTreeShape}from'./guard-render.js';import{isBoolReturningQuery}from'../schema/utils/guard-query-utils.js';import{valueTypeName}from'./guard-submission-brief.js';const VALUE_TYPE_ID_TO_NAME={[ValueType['Bool']]:'Bool',[ValueType['Address']]:'Address',[ValueType['String']]:'String',[ValueType['U8']]:'U8',[ValueType['U16']]:'U16',[ValueType['U32']]:'U32',[ValueType['U64']]:'U64',[ValueType['U128']]:'U128',[ValueType['U256']]:'U256',[ValueType['VecBool']]:'VecBool',[ValueType['VecAddress']]:'VecAddress',[ValueType['VecString']]:'VecString',[ValueType['VecU8']]:'VecU8',[ValueType['VecU16']]:'VecU16',[ValueType['VecU32']]:'VecU32',[ValueType['VecU64']]:'VecU64',[ValueType['VecU128']]:'VecU128',[ValueType['VecU256']]:'VecU256',[ValueType['VecVecU8']]:'VecVecU8'};function normalizeValueTypeNames(a){if(!a['table']['some'](b=>typeof b['value_type']==='number'))return a;return{...a,'table':a['table']['map'](b=>typeof b['value_type']==='number'?{...b,'value_type':VALUE_TYPE_ID_TO_NAME[b['value_type']]??String(b['value_type'])}:b)};}function deepClone(a){return JSON['parse'](JSON['stringify'](a));}function rootToString(a){return JSON['stringify'](a);}function canonicalNode(a){if(a===null||typeof a!=='object')return JSON['stringify'](a)??'null';if(Array['isArray'](a))return'['+a['map'](canonicalNode)['join'](',')+']';const b=Object['keys'](a)['sort']();return'{'+b['map'](c=>JSON['stringify'](c)+':'+canonicalNode(a[c]))['join'](',')+'}';}const GE_NODE='logic_as_u256_greater_or_equal',LE_NODE='logic_as_u256_lesser_or_equal';function findDegenerateTimeWindows(a){const b=[],c=new Set(),d=g=>{const h=g['filter'](j=>j?.['type']===GE_NODE&&Array['isArray'](j['nodes'])&&j['nodes']['length']>=0x2),i=g['filter'](j=>j?.['type']===LE_NODE&&Array['isArray'](j['nodes'])&&j['nodes']['length']>=0x2);for(const j of h){for(const k of i){const l=canonicalNode(j['nodes'][0x0])===canonicalNode(k['nodes'][0x0]),m=canonicalNode(j['nodes'][0x1])===canonicalNode(k['nodes'][0x1]);if(!l||!m)continue;const n=canonicalNode(j)+'|'+canonicalNode(k);if(c['has'](n))continue;c['add'](n),b['push']({'ge':j,'le':k});}}},e=g=>{if(g?.['type']==='logic_and'&&Array['isArray'](g['nodes']))return g['nodes']['flatMap'](e);return[g];},f=g=>{if(!g||typeof g!=='object')return;if(g['type']==='logic_not')return;if(g['type']==='logic_and'&&Array['isArray'](g['nodes'])){const h=e(g);d(h),h['forEach'](f);return;}if(g['type']==='logic_or'&&Array['isArray'](g['nodes'])){for(const i of g['nodes']){i?.['type']==='logic_and'&&Array['isArray'](i['nodes'])?(d(i['nodes']),i['nodes']['forEach'](f)):f(i);}return;}if(g['type']===GE_NODE||g['type']===LE_NODE)d([g]);if(Array['isArray'](g['nodes']))g['nodes']['forEach'](f);};return f(a),b;}function hasSignerContext(a){const b=rootToString(a);return b['includes']('\x22Signer\x22')||b['includes']('\x22context\x22:\x22Signer\x22')||b['includes']('\x22context\x22:\x20\x22Signer\x22');}function getSubmissionEntries(a){return a['filter'](b=>b['b_submission']===!![]);}function inferValueType(a){if(typeof a==='string'){if(a['startsWith']('0x')&&a['length']>=0x3)return'Address';return'String';}if(typeof a==='number'){if(Number['isInteger'](a)){if(a>=0x0&&a<=0xff)return'U8';if(a>=0x0&&a<=0xffff)return'U16';return'U64';}return'U256';}if(typeof a==='boolean')return'Bool';if(Array['isArray'](a)){if(a['length']>0x0){const b=inferValueType(a[0x0]);if(b==='Address')return'Vec<Address>';if(b==='String')return'Vec<String>';if(b==='Bool')return'Vec<Bool>';}return'Vec<Address>';}return undefined;}function sdkIssueToDiagnostic(a){return{'code':a['code'],'message':a['message'],'severity':a['severity'],'source':'sdk','location':{'path':a['path']},'fix':{'description':'SDK\x20validation\x20failed\x20('+(a['sdk_error']??'InvalidParam')+');\x20manual\x20fix\x20required','auto_fixable':![]}};}async function checkSdkSyntax(a){const b=validateGuardTreeShape(a['root']);if(b['length']>0x0)return b['map'](g=>({'code':'G-001','message':g['message'],'severity':'error','source':'sdk','location':{'path':g['path']},'fix':{'description':'Unary\x20operators\x20(logic_not,\x20value_type,\x20vec_length,\x20calc_string_length,\x20convert_*)\x20take\x20a\x20single\x20\x27node\x27\x20child;\x20only\x20multi-operand\x20forms\x20(logic_and,\x20logic_or,\x20logic_equal,\x20logic_as_u256_*,\x20calc_number_*,\x20vec_contains_*)\x20take\x20a\x20\x27nodes\x27\x20array.','auto_fixable':![]}}));const c=a['table']['map'](g=>({'identifier':g['identifier'],'b_submission':g['b_submission']??![],'value_type':g['value_type']??'Address','value':g['value'],'name':g['name']??''}));let d;try{d=await validateGuardData({'description':a['description'],'table':c,'root':a['root'],'rely':a['rely']});}catch(g){const h=g?.['message']??String(g),i=/guard tree ([^:]+):/['exec'](h);return[{'code':'G-001','message':h,'severity':'error','source':'sdk','location':{'path':i?toJsonPointer(i[0x1]):'/root'},'fix':{'description':'Repair\x20the\x20tree\x20at\x20the\x20named\x20path:\x20unary\x20operators\x20(logic_not,\x20convert_*,\x20value_type)\x20take\x20a\x20single\x20\x27node\x27\x20child;\x20only\x20multi-operand\x20forms\x20(logic_and,\x20logic_or,\x20logic_equal,\x20calc_*,\x20vec_*)\x20take\x20\x27nodes\x27.','auto_fixable':![]}}];}const f=d['map'](sdkIssueToDiagnostic);if(!hasRepositoryIdSlotRef(a['root']))return f;return f['map'](j=>j['code']==='G-008'&&/invalid parameter:checkType/i['test'](j['message'])?{...j,'severity':'warning','message':j['message']+'\x20—\x20KNOWN\x20ANALYZER\x20GAP\x20(rex5\x20T-29):\x20the\x20checker\x20does\x20not\x20implement\x20the\x20id\x20slot-reference\x20grammar\x20'+'({identifier:N})\x20that\x20the\x20chain\x20resolves\x20for\x20repository-data\x20queries;\x20chain-proven\x20guards\x20ship\x20this\x20exact\x20shape.','fix':{'description':'Do\x20NOT\x20rebuild\x20the\x20guard\x20on\x20this\x20diagnostic\x20alone:\x20run\x20a\x20free\x20dry\x20run\x20of\x20the\x20guarded\x20operation.\x20'+'If\x20it\x20accepts\x20the\x20slot-reference\x20leg\x20on-chain,\x20the\x20guard\x20is\x20valid\x20—\x20the\x20SDK\x20checker\x27s\x20grammar\x20gap\x20is\x20tracked\x20separately.','auto_fixable':![]}}:j);}function hasRepositoryIdSlotRef(a){const b=c=>{if(!c||typeof c!=='object')return![];if(Array['isArray'](c))return c['some'](b);const d=c;if(typeof d['type']==='string'&&d['type']['startsWith']('query_repository_data')&&d['id']!==undefined&&d['id']!==null&&typeof d['id']==='object'&&!Array['isArray'](d['id'])&&Number['isFinite'](d['id']['identifier']))return!![];return Object['values'](d)['some'](b);};return b(a);}function toJsonPointer(a){const b=a['replace'](/^\/+/,'');return b['startsWith']('root')?'/'+b:'/root/'+b;}function checkSemanticErrors(a,b){const c=[],{table:d,root:e,binding_hint:f}=a,g=f?findScene(f['host_object']??'',f['binding_field']??''):undefined,h=getSubmissionEntries(d);if(h['length']>0x0&&e&&!hasSignerContext(e)){const j=h['some'](m=>m['value_type']==='Address'),k=g?.['id']==='service_order_allocators_guard'&&f?.['sharing_recipients']!==undefined&&f['sharing_recipients']['length']>0x0&&!f['sharing_recipients']['includes']('Signer'),l=g?.['id']==='service_order_allocators_guard'&&h['length']>0x0&&h['every'](m=>!rootReferencedIdentifiers(e)['has'](m['identifier']));if(j&&!k&&!l){const m=h['filter'](n=>n['value_type']==='Address')['map'](n=>d['indexOf'](n));c['push']({'code':'LE-04','message':'Submitted\x20data\x20has\x20no\x20Signer\x20binding\x20(submission\x20forgery\x20risk)','severity':'error','source':'lint','location':{'path':m['map'](n=>'/table/'+n)['join']('\x20→\x20')},'fix':{'description':'Add\x20logic_equal(context(Signer),\x20identifier[N])\x20in\x20root\x20to\x20bind\x20the\x20submitter\x20identity','auto_fixable':![]}});}}if(g?.['id']==='arbitration_voting_guard'){const n=h['some'](o=>['U8','U16','U32','U64','U128','U256']['includes'](o['value_type']??''));if(n){const o=h['filter'](p=>['U8','U16','U32','U64','U128','U256']['includes'](p['value_type']??''))['map'](p=>d['indexOf'](p));c['push']({'code':'LE-05','message':'voting_guard\x20voting\x20weight\x20comes\x20from\x20submitted\x20data\x20(weight\x20forgery\x20risk)','severity':'error','source':'lint','location':{'path':o['map'](p=>'/table/'+p)['join']('\x20→\x20')},'fix':{'description':'Derive\x20arbitrator\x20weights\x20from\x20the\x20Arb\x20object\x20via\x20witness\x20(e.g.\x20105\x20TypeArbArbitration)\x20rather\x20than\x20submitting\x20them\x20directly','auto_fixable':![]}});}}if(g?.['id']==='gen_passport_guard'||f?.['action']==='gen_passport'){const p=rootToString(e);if(p['includes']('1167')||p['includes']('repository.data')){const q=p['includes']('quote_guard');q&&c['push']({'code':'LE-06','message':'repository.data\x20query\x20with\x20quote_guard:\x20rigid\x20verification\x20requirement\x20—\x20ensure\x20Passport\x20includes\x20quote_guard\x20verification\x20with\x20necessary\x20submissions\x20(e.g.,\x20Payment\x20proof)','severity':'info','source':'lint','location':{'path':'/root'},'fix':{'description':'Ensure\x20the\x20quote_guard\x20is\x20verified:\x20user\x20submits\x20Payment\x20via\x20Passport,\x20quote_guard\x20verifies\x20Payment\x20fields,\x20repository\x20data\x20query\x20passes','auto_fixable':![]}});}}if(f?.['host_object']&&g&&b?.['host_published']!==!![]){const r=f['host_object'],s=d['filter'](t=>!t['b_submission']&&t['value_type']==='Address'&&typeof t['value']==='string'&&t['value']['startsWith']('0x')&&t['object_type']===r);if(s['length']>0x0){const t=s['map'](w=>d['indexOf'](w)),u=b?.['host_published']===![];c['push']({'code':'LE-07','message':'Circular\x20reference\x20uses\x20an\x20address\x20rather\x20than\x20a\x20name\x20(Host\x20Object\x20may\x20not\x20be\x20published\x20yet\x20when\x20the\x20Guard\x20is\x20created)','severity':u?'error':'warning','source':'lint','location':{'path':t['map'](w=>'/table/'+w+'/value')['join']('\x20→\x20')},'fix':{'description':'Change\x20value\x20from\x20an\x20address\x20to\x20an\x20object\x20name\x20(e.g.\x20\x22service1\x22);\x20the\x20SDK\x20will\x20resolve\x20it\x20to\x20an\x20address\x20after\x20the\x20Host\x20Object\x20is\x20published','auto_fixable':![]}});}}const i=d['filter'](w=>w['b_submission']===![]&&Array['isArray'](w['value'])&&w['value']['length']===0x0);i['length']>0x0&&c['push']({'code':'LE-10','message':'Static\x20table\x20slot(s)\x20'+i['map'](w=>w['identifier'])['join'](',\x20')+'\x20carry\x20an\x20EMPTY\x20array\x20value\x20—\x20'+'guard\x20table\x20construction\x20silently\x20DROPS\x20empty\x20vectors:\x20the\x20created\x20Guard\x20will\x20MISS\x20these\x20rows\x20while\x20creation\x20still\x20succeeds.','severity':'error','source':'lint','location':{'path':i['map'](w=>'/table['+w['identifier']+']')['join']('\x20→\x20')},'fix':{'description':'Give\x20each\x20flagged\x20slot\x20a\x20non-empty\x20static\x20value,\x20or\x20flip\x20it\x20to\x20b_submission=true\x20and\x20supply\x20the\x20value\x20at\x20Guard\x20trigger\x20time\x20(protocol\x20once-slots:\x20255\x20keys\x20on\x20the\x20submitted\x20bytes,\x20254\x20on\x20the\x20chain-derived\x20object\x20key).','auto_fixable':![]}});for(const {ge:w,le:x}of findDegenerateTimeWindows(e)){c['push']({'code':'LE-08','message':'Degenerate\x20time\x20window:\x20the\x20same\x20conjunction\x20asserts\x20`L\x20>=\x20R`\x20and\x20`L\x20<=\x20R`\x20over\x20'+'structurally\x20identical\x20operands.\x20Their\x20conjunction\x20is\x20`L\x20==\x20R`\x20—\x20on\x20a\x20millisecond\x20Clock\x20'+'an\x20~1\x20ms\x20window,\x20i.e.\x20the\x20guarded\x20forward\x20is\x20effectively\x20unreachable.\x20'+'`logic_as_u256_greater_or_equal`\x20is\x20a\x20LOWER\x20bound\x20(deadline\x20passed);\x20an\x20upper\x20bound\x20'+'(`logic_as_u256_lesser_or_equal`)\x20must\x20use\x20a\x20DIFFERENT\x20right-hand\x20side.','severity':'error','source':'lint','location':{'path':'/root'},'fix':{'description':'For\x20\x22the\x20deadline\x20has\x20passed\x22,\x20keep\x20ONLY\x20`L\x20>=\x20R`\x20and\x20delete\x20the\x20`<=`\x20clause.\x20'+'For\x20\x22the\x20window\x20is\x20open\x22,\x20keep\x20both\x20clauses\x20but\x20make\x20the\x20right-hand\x20sides\x20differ,\x20'+'e.g.\x20`L\x20>=\x20t`\x20and\x20`L\x20<=\x20t\x20+\x20K`.\x20Remember\x20`progress.current_time`\x20is\x20refreshed\x20on\x20'+'every\x20forward,\x20so\x20anchoring\x20a\x20release\x20lock\x20on\x20it\x20restarts\x20the\x20clock\x20at\x20each\x20node\x20change.','auto_fixable':![]}});}{const y=[],z=(B,C)=>{if(!C||typeof C!=='object')return;if(C['type']==='query'&&C['query']!==undefined){if(!isBoolReturningQuery(C['query'])){const D=typeof C['query']==='string'?C['query']:String(C['query']);y['push']({'op':B,'describe':'query\x20'+D,'claimedByTwin':/claimed_by/i['test'](D)&&!/\bsome\b/i['test'](D)});}}else{if(C['type']==='identifier'&&C['identifier']!==undefined){const E=d['find'](G=>G['identifier']===C['identifier']),F=E?.['value_type'];F&&F!=='Bool'&&F!=='Value'&&y['push']({'op':B,'describe':'identifier\x20'+C['identifier']+'\x20(table\x20value_type\x20'+F+')','claimedByTwin':![]});}}},A=B=>{if(!B||typeof B!=='object')return;if(B['type']==='logic_not'){z('logic_not',B['node']),A(B['node']);return;}Array['isArray'](B['nodes'])&&((B['type']==='logic_and'||B['type']==='logic_or')&&B['nodes']['forEach'](C=>z(B['type'],C)),B['nodes']['forEach'](A));if(B['node'])A(B['node']);};A(e);for(const B of y){c['push']({'code':'LE-09','message':B['op']+'\x20consumes\x20a\x20non-Bool\x20leaf\x20('+B['describe']+')\x20—\x20Bool\x20operators\x20take\x20Bool\x20operands\x20only\x20(crs\x20P2-1/P2-2)'+(B['claimedByTwin']?'.\x20TEACHING:\x20order.claimed_by\x20(query\x201571)\x20returns\x20Address;\x20its\x20Bool\x20twin\x20is\x20`order.claimed_by\x20some`\x20(query\x201570)\x20—\x20use\x20THAT\x20in\x20logic_not\x20/\x20logic_equal.':'.\x20TEACHING:\x20wrap\x20the\x20leaf\x20in\x20logic_equal[leaf,\x20identifier[N]]\x20(any\x20type)\x20or\x20a\x20logic_as_u256_*\x20operator\x20(numeric\x20comparison)\x20to\x20produce\x20a\x20Bool.'),'severity':'error','source':'lint','location':{'path':'/root'},'fix':{'description':B['claimedByTwin']?'Replace\x20query\x20order.claimed_by\x20with\x20order.claimed_by\x20some\x20(query\x201570)':'Wrap\x20the\x20leaf\x20in\x20logic_equal\x20against\x20identifier[N]\x20so\x20'+B['op']+'\x20receives\x20a\x20Bool','auto_fixable':![]}});}}return c;}function checkSyntaxHints(a){const b=[],{table:c}=a;(!a['description']||a['description']['trim']()==='')&&b['push']({'code':'SH-01','message':'description\x20is\x20missing\x20or\x20empty','severity':'info','source':'lint','location':{'path':'/description'},'fix':{'description':'Add\x20a\x20description,\x20e.g.\x20\x27Service\x20buy_guard:\x20whitelist\x20validation\x27','auto_fixable':!![]}});for(let d=0x0;d<c['length'];d++){const e=c[d];(!e['name']||e['name']['trim']()==='')&&b['push']({'code':'SH-03','message':'table['+d+']\x20is\x20missing\x20name','severity':'warning','source':'lint','location':{'path':'/table/'+d+'/name'},'fix':{'description':'Add\x20a\x20name,\x20e.g.\x20\x22data\x20entry\x20'+e['identifier']+'\x22','auto_fixable':!![]}});}for(let f=0x0;f<c['length'];f++){const g=c[f];!g['value_type']&&b['push']({'code':'SH-05','message':'table['+f+']\x20is\x20missing\x20value_type','severity':'warning','source':'lint','location':{'path':'/table/'+f+'/value_type'},'fix':{'description':'Infer\x20value_type\x20from\x20value\x20(e.g.\x20Address/String/U64,\x20etc.)','auto_fixable':!![]}});}c['length']>MAX_GUARD_TABLE_ITEM_LENGTH&&b['push']({'code':'SH-07','message':'table\x20entry\x20count\x20'+c['length']+'\x20exceeds\x20the\x20maximum\x20limit\x20'+MAX_GUARD_TABLE_ITEM_LENGTH,'severity':'error','source':'lint','location':{'path':'/table'},'fix':{'description':'Slim\x20down\x20the\x20table\x20by\x20merging\x20similar\x20entries,\x20or\x20split\x20into\x20multiple\x20Guards\x20+\x20rely','auto_fixable':![]}});for(let h=0x0;h<c['length'];h++){c[h]['b_submission']===undefined&&b['push']({'code':'SH-10','message':'table['+h+']\x20b_submission\x20is\x20missing','severity':'info','source':'lint','location':{'path':'/table/'+h+'/b_submission'},'fix':{'description':'Set\x20to\x20false\x20(constant)\x20or\x20true\x20(submitted\x20data)','auto_fixable':!![]}});}for(let j=0x0;j<c['length'];j++){const k=c[j];k['b_submission']===!![]&&k['value']!==undefined&&k['value']!==null&&b['push']({'code':'SH-11','message':'table['+j+']\x20has\x20a\x20redundant\x20value\x20field\x20on\x20b_submission=true\x20entry\x20(the\x20verifier\x20supplies\x20the\x20value\x20at\x20runtime;\x20this\x20value\x20is\x20ignored\x20by\x20BCS\x20encoding\x20and\x20wastes\x20gas)','severity':'warning','source':'lint','location':{'path':'/table/'+j+'/value'},'fix':{'description':'Remove\x20the\x20value\x20field\x20—\x20it\x20is\x20ignored\x20for\x20b_submission=true\x20entries','auto_fixable':!![]}});}return b;}function checkSuggestions(a){const b=[],{root:c,binding_hint:d,table:e,description:f}=a;if(c){const i=rootToString(c);if(i['includes']('vec_contains_address')&&i['includes']('Signer'))b['push']({'code':'SG-01','message':'Matches\x20Pattern\x20P04\x20(whitelist\x20validation)','severity':'hint','source':'lint','location':{'path':'/root'},'fix':{'description':'Refer\x20to\x20the\x20P04\x20Pattern\x20to\x20ensure\x20best\x20practices','auto_fixable':![]}});else{if(i['includes']('logic_equal')&&i['includes']('Signer')){const j=e['some'](k=>!k['b_submission']&&k['value_type']==='Address'&&typeof k['value']==='string'&&k['value']['length']>0x0);j&&b['push']({'code':'SG-01','message':'Matches\x20Pattern\x20P04\x20(whitelist\x20validation\x20—\x20single-address\x20variant)','severity':'hint','source':'lint','location':{'path':'/root'},'fix':{'description':'P04\x20single-address\x20form;\x20for\x20multi-address\x20scenarios,\x20consider\x20vec_contains_address','auto_fixable':![]}});}}(i['includes']('logic_as_u256_greater')||i['includes']('logic_as_u256_lesser'))&&b['push']({'code':'SG-01','message':'Matches\x20Pattern\x20P02\x20(numeric\x20threshold\x20validation)','severity':'hint','source':'lint','location':{'path':'/root'},'fix':{'description':'Suitable\x20for\x20amount/quantity\x20threshold\x20validation\x20scenarios','auto_fixable':![]}}),i['includes']('convert_witness')&&b['push']({'code':'SG-01','message':'Matches\x20Pattern\x20P09\x20(witness-derived\x20validation)','severity':'hint','source':'lint','location':{'path':'/root'},'fix':{'description':'Suitable\x20for\x20cross-object\x20relationship\x20validation\x20(e.g.\x20Order→Progress)','auto_fixable':![]}});}if(d?.['action']){const k=['buy','forward','allocate','claim_reward','vote','dispute','write_repository','submit_progress','gen_passport'];if(k['includes'](d['action'])){const l=inferSceneFromAction(d['action']);if(l){const m=suggestTemplateForScene(l['id']);m&&b['push']({'code':'SG-02','message':'Recommended\x20scene\x20template:\x20'+m['name'],'severity':'hint','source':'lint','location':{'path':'/'},'fix':{'description':'Refer\x20to\x20template\x20'+m['id']+'\x20('+m['example_use_case']+')','auto_fixable':![]}});}}}const g=n=>new TextEncoder()['encode'](n)['length'],h=getSubmissionEntries(e);for(const [n,o]of e['entries']()){const p=o['name']??'';if(p['length']===0x0)continue;if(g(p)>MAX_NAME_LENGTH)b['push']({'code':'SG-03','message':'table['+n+']\x20name\x20is\x20'+g(p)+'\x20BCS\x20characters,\x20maximum\x20is\x20'+MAX_NAME_LENGTH+'.\x20Use\x20a\x20short\x20identifier\x20(e.g.\x20\x27order_id\x27,\x20\x27delivery_node\x27);\x20the\x20human-readable\x20explanation\x20belongs\x20in\x20the\x20Guard\x27s\x20\x27description\x27\x20field','severity':'warning','source':'lint','location':{'path':'/table/'+n+'/name'},'fix':{'description':'Shorten\x20the\x20name\x20to\x20'+MAX_NAME_LENGTH+'\x20BCS\x20characters\x20or\x20fewer','auto_fixable':![]}});else p['toLowerCase']()['startsWith']('0x')&&b['push']({'code':'SG-03','message':'table['+n+']\x20name\x20must\x20not\x20start\x20with\x20\x220x\x22\x20(reserved\x20for\x20object\x20IDs)','severity':'warning','source':'lint','location':{'path':'/table/'+n+'/name'},'fix':{'description':'Rename\x20the\x20entry\x20without\x20the\x200x\x20prefix','auto_fixable':![]}});}if(h['length']>0x0){const q=(f??'')['trim']();q['length']<0xa&&b['push']({'code':'SG-03','message':'This\x20Guard\x20accepts\x20submitted\x20data\x20('+h['length']+'\x20table\x20'+(h['length']===0x1?'entry':'entries')+'\x20with\x20b_submission=true)\x20but\x20its\x20description\x20is\x20too\x20short\x20for\x20a\x20verifier\x20to\x20know\x20what\x20to\x20submit.\x20Explain\x20the\x20expected\x20submitted\x20data\x20in\x20the\x20Guard\x27s\x20\x27description\x27\x20field,\x20e.g.\x20\x27user-submitted\x20operation\x20type\x20(return/damage)\x27','severity':'info','source':'lint','location':{'path':'/'},'fix':{'description':'Explain\x20the\x20expected\x20submitted\x20data\x20in\x20the\x20Guard\x27s\x20\x27description\x27\x20field','auto_fixable':![]}});}if(c){const r=rootToString(c),s=r['includes']('proof.signer'),t=r['includes']('proof.time'),u=r['includes']('calc_string_length'),v=h['some'](w=>w['value_type']==='String');if(s&&t)b['push']({'code':'SG-04','message':'Strict-mode\x20privacy-delivery\x20guard\x20detected\x20(proof.signer\x20+\x20proof.time).\x20'+'Recommended\x20three\x20conditions:\x20Signer==proof.signer\x20(submitter\x20accountability),\x20'+'proof.time>order.time\x20(freshness),\x20order.service==service\x20(project\x20binding).\x20'+'No\x20content\x20verification\x20—\x20only\x20submission\x20responsibility\x20(\x27whoever\x20benefits\x20bears\x20the\x20burden\x20of\x20proof\x27).','severity':'info','source':'lint','location':{'path':'/root'},'fix':{'description':'Ensure\x20all\x20three\x20conditions\x20are\x20present\x20(logic_and).\x20Refer\x20to\x20template\x20tpl_forward_privacy_delivery_proof.\x20'+'Query\x20IDs:\x20proof.signer=1958,\x20proof.time=1960,\x20order.time=1574,\x20order.service=1563.','auto_fixable':![]}});else u&&v&&b['push']({'code':'SG-04','message':'Broad-mode\x20privacy-delivery\x20guard\x20detected\x20(String\x20submission\x20+\x20length\x20check,\x20e.g.\x20Merkle\x20Root\x20length\x20==\x2066).\x20'+'This\x20trusts\x20the\x20submitter\x27s\x20honesty;\x20the\x20counterparty\x20can\x20dispute\x20by\x20checking\x20their\x20own\x20Messenger\x20conversation.\x20'+'Suitable\x20as\x20an\x20arbitration\x20basis,\x20not\x20a\x20fund-flow\x20gate.','severity':'info','source':'lint','location':{'path':'/root'},'fix':{'description':'For\x20stronger\x20assurance,\x20consider\x20strict\x20mode:\x20submit\x20a\x20Proof\x20object\x20address\x20(from\x20messenger.submitChainProof)\x20+\x20'+'Order\x20address,\x20then\x20verify\x20proof.signer/proof.time/order.service.\x20See\x20template\x20tpl_forward_privacy_delivery_proof.','auto_fixable':![]}});}return b;}export function autoFixGuard(a){const b=deepClone(a),c=[];(!b['description']||b['description']['trim']()==='')&&(b['description']='Guard\x20(table:\x20'+b['table']['length']+'\x20items,\x20root:\x20'+(b['root']?.['type']??'unknown')+')',c['push']({'diagnostic_code':'SH-01','description':'Fill\x20in\x20default\x20description','after':b['description'],'path':'/description'}));if(b['description']&&b['description']['length']>MAX_DESCRIPTION_LENGTH){const f=b['description'];b['description']=b['description']['substring'](0x0,MAX_DESCRIPTION_LENGTH),c['push']({'diagnostic_code':'G-001','description':'Truncate\x20description\x20to\x20'+MAX_DESCRIPTION_LENGTH+'\x20characters','before':f['length']+'\x20characters','after':b['description']['length']+'\x20characters','path':'/description'});}for(let g=0x0;g<b['table']['length'];g++){const h=b['table'][g];(!h['name']||h['name']['trim']()==='')&&(h['name']='data\x20entry\x20'+h['identifier'],c['push']({'diagnostic_code':'SH-03','description':'table['+g+']\x20fill\x20in\x20name','after':h['name'],'path':'/table/'+g+'/name'}));}for(let j=0x0;j<b['table']['length'];j++){const k=b['table'][j];if(!k['value_type']&&k['value']!==undefined&&k['value']!==null){const l=inferValueType(k['value']);l&&(k['value_type']=l,c['push']({'diagnostic_code':'SH-05','description':'table['+j+']\x20infer\x20value_type','after':l,'path':'/table/'+j+'/value_type'}));}}const d=new Map();let e=0x0;for(let m=0x0;m<b['table']['length'];m++){const n=b['table'][m];if(!d['has'](n['identifier']))d['set'](n['identifier'],e),n['identifier']!==e&&c['push']({'diagnostic_code':'G-007','description':'table['+m+']\x20identifier\x20'+n['identifier']+'\x20→\x20'+e,'before':String(n['identifier']),'after':String(e),'path':'/table/'+m+'/identifier'}),n['identifier']=e,e++;else{const o=n['identifier'];n['identifier']=e,d['set'](o,e),c['push']({'diagnostic_code':'G-007','description':'table['+m+']\x20identifier\x20'+o+'\x20duplicate\x20→\x20reallocated\x20to\x20'+e,'before':String(o),'after':String(e),'path':'/table/'+m+'/identifier'}),e++;}}for(let p=0x0;p<b['table']['length'];p++){const q=b['table'][p];q['b_submission']===undefined&&(q['b_submission']=![],c['push']({'diagnostic_code':'SH-10','description':'table['+p+']\x20b_submission\x20default\x20set\x20to\x20false','after':'false','path':'/table/'+p+'/b_submission'}));}if(b['rely']?.['guards']&&b['rely']['guards']['length']>0x0){const r=[...new Set(b['rely']['guards'])];r['length']!==b['rely']['guards']['length']&&(c['push']({'diagnostic_code':'G-009','description':'rely\x20deduplicate:\x20'+b['rely']['guards']['length']+'\x20→\x20'+r['length'],'before':JSON['stringify'](b['rely']['guards']),'after':JSON['stringify'](r),'path':'/rely/guards'}),b['rely']['guards']=r);}for(let s=0x0;s<b['table']['length'];s++){const t=b['table'][s];if(t['b_submission']===!![]&&t['value']!==undefined&&t['value']!==null){const u=JSON['stringify'](t['value']);delete t['value'],c['push']({'diagnostic_code':'SH-11','description':'table['+s+']\x20remove\x20redundant\x20value\x20on\x20b_submission=true\x20entry','before':u,'after':'(removed)','path':'/table/'+s+'/value'});}}return{'fixed':b,'actions':c};}export async function lintGuard(a,b){const c=b?.['auto_fix']??!![],d=normalizeValueTypeNames(a),{table:e,root:f,rely:g,binding_hint:h}=d,i=[];let j;const k=await checkSdkSyntax(d);i['push'](...k);const l=checkSemanticErrors(d,b);i['push'](...l);const m=checkSyntaxHints(d);i['push'](...m);let n,o=[];if(c){const {fixed:w,actions:x}=autoFixGuard(d);x['length']>0x0&&(n=w,o=x);}if(e['length']>0x0&&f){const y=h?findScene(h['host_object']??'',h['binding_field']??''):undefined,z=e['map'](B=>({'identifier':B['identifier'],'b_submission':B['b_submission']??![],'value_type':B['value_type']??'Address','value':B['value'],'name':B['name'],'object_type':B['object_type']})),A=evaluateGuardDraft({'table':z,'root':f,'rely':g,'scene':y,'sharing_recipients':h?.['sharing_recipients']});j=A['assessment'];for(const B of j['risks']){const C=B['level']==='critical'||B['level']==='high'?'error':B['level']==='medium'?'warning':B['level']==='low'?'info':'hint',D=B['evidence']??'',E=D['startsWith']('/')?D:'/';i['push']({'code':B['id'],'message':'['+B['level']+']\x20'+B['title'],'severity':C,'source':'risk','location':{'path':E},'fix':{'description':B['mitigation'],'auto_fixable':![]}});}}const p=checkSuggestions(d);i['push'](...p);const q=i['filter'](F=>F['severity']==='error')['length'],s=i['filter'](F=>F['severity']==='warning')['length'],t=i['filter'](F=>F['severity']==='info'||F['severity']==='hint')['length'],u=q===0x0;let v;if(q>0x0)v='Fix\x20'+q+'\x20error(s)\x20and\x20re-run\x20lint';else s>0x0?v='Consider\x20addressing\x20'+s+'\x20warning(s),\x20then\x20submit\x20to\x20SDK\x20newGuard()\x20for\x20final\x20syntax\x20validation':v='lint\x20passed\x20(no\x20errors);\x20submit\x20to\x20SDK\x20newGuard()\x20for\x20final\x20syntax\x20validation\x20before\x20going\x20on-chain';return{'json_summary':{'table_count':e['length'],'root_type':f?.['type']??'unknown','has_rely':!!g?.['guards']?.['length'],'rely_count':g?.['guards']?.['length']??0x0,'has_description':!!d['description']},'diagnostics':i,'fixed_json':n,'fix_actions':o,'risk_assessment':j,'summary':{'errors':q,'warnings':s,'infos':t,'auto_fixes_applied':o['length'],'ready':u,'next_step':v}};}export async function isGuardReady(a){const b=await lintGuard(a,{'auto_fix':![]});return b['summary']['ready'];}export async function getGuardErrors(a){const b=await lintGuard(a,{'auto_fix':![]});return b['diagnostics']['filter'](c=>c['severity']==='error');}export function formatLintResult(a){const b=[];b['push']('===\x20Guard\x20JSON\x20Lint\x20Report\x20==='),b['push'](''),b['push']('Summary:'),b['push']('\x20\x20Errors:\x20\x20\x20\x20\x20'+a['summary']['errors']),b['push']('\x20\x20Warnings:\x20\x20\x20'+a['summary']['warnings']),b['push']('\x20\x20Infos:\x20\x20\x20\x20\x20\x20'+a['summary']['infos']),b['push']('\x20\x20Auto-fixes:\x20'+a['summary']['auto_fixes_applied']),b['push']('\x20\x20Ready:\x20\x20\x20\x20\x20\x20'+(a['summary']['ready']?'YES':'NO')),b['push']('\x20\x20Next\x20step:\x20\x20'+a['summary']['next_step']),b['push']('');if(a['fix_actions']['length']>0x0){b['push']('---\x20Auto-fix\x20Actions\x20---');for(const g of a['fix_actions']){b['push']('\x20\x20['+g['diagnostic_code']+']\x20'+g['description']),b['push']('\x20\x20\x20\x20Path:\x20'+g['path']),g['before']&&g['after']&&b['push']('\x20\x20\x20\x20'+g['before']+'\x20->\x20'+g['after']);}b['push']('');}const c=a['diagnostics']['filter'](h=>h['severity']==='error'),e=a['diagnostics']['filter'](h=>h['severity']==='warning'),f=a['diagnostics']['filter'](h=>h['severity']==='info'||h['severity']==='hint');if(c['length']>0x0){b['push']('---\x20Errors\x20(must\x20fix)\x20---');for(const h of c){b['push']('\x20\x20['+h['code']+']\x20('+h['source']+')\x20'+h['message']),b['push']('\x20\x20\x20\x20Path:\x20'+h['location']['path']);if(h['fix'])b['push']('\x20\x20\x20\x20Fix:\x20\x20'+h['fix']['description']);}b['push']('');}if(e['length']>0x0){b['push']('---\x20Warnings\x20(consider\x20fixing)\x20---');for(const i of e){b['push']('\x20\x20['+i['code']+']\x20('+i['source']+')\x20'+i['message']),b['push']('\x20\x20\x20\x20Path:\x20'+i['location']['path']);if(i['fix'])b['push']('\x20\x20\x20\x20Fix:\x20\x20'+i['fix']['description']);}b['push']('');}if(f['length']>0x0){b['push']('---\x20Info\x20&\x20Hints\x20---');for(const j of f){b['push']('\x20\x20['+j['code']+']\x20('+j['source']+')\x20'+j['message']),b['push']('\x20\x20\x20\x20Path:\x20'+j['location']['path']);}}return b['join']('\x0a');}export function translateGuardTypeError(a){if(!a)return undefined;let b='',c=-0x1,d=-0x1;const e=a['match'](/([\w.[\]-]+)\s*(?:→|->)\s*checkType:\s*(\d+)\s+require type:\s*(\d+)/);if(e)b=e[0x1],c=Number(e[0x2]),d=Number(e[0x3]);else{const j=a['match'](/checkType:\s*(\d+)\s+require type:\s*(\d+)/);if(!j)return undefined;c=Number(j[0x1]),d=Number(j[0x2]);}const f=b?'at\x20'+b+':\x20':'',g=valueTypeName(c),h=valueTypeName(d),i=[];if(d===0x0){i['push'](f+'the\x20parent\x20operator\x20needs\x20a\x20BOOL\x20operand,\x20but\x20the\x20child\x20returns\x20'+g+'.');if(c===0x1&&/claimed_by/i['test'](a))i['push']('TEACHING\x20(Bool/Address\x20twin,\x20crs\x20P2-2):\x20order.claimed_by\x20(query\x201571)\x20returns\x20Address;\x20'+'its\x20Bool\x20twin\x20is\x20`order.claimed_by\x20some`\x20(query\x201570\x20—\x20has\x20ANY\x20claimer).\x20Invert\x20THAT\x20with\x20'+'logic_not,\x20or\x20assert\x20logic_equal[query\x201570,\x20false].');else{if(c===0x1)i['push']('TEACHING:\x20wrap\x20the\x20Address\x20leaf\x20in\x20logic_equal\x20against\x20identifier[N]\x20—\x20'+'logic_equal[{type:\x22query\x22,\x20query:\x22...\x22},\x20{type:\x22identifier\x22,\x20identifier:N}].\x20'+'A\x20Bool\x20operator\x20(logic_and/or/not)\x20can\x20never\x20consume\x20a\x20bare\x20Address.');else{if(c===0x2)i['push']('TEACHING:\x20wrap\x20the\x20String\x20leaf\x20in\x20logic_equal\x20against\x20identifier[N].\x20A\x20multi-node\x20'+'membership\x20test\x20\x27current\x20in\x20{a,b,c}\x27\x20has\x20NO\x20set\x20operator\x20yet\x20(crs\x20P2-1):\x20express\x20one\x20'+'logic_equal\x20per\x20value\x20joined\x20by\x20logic_or\x20—\x20each\x20value\x20a\x20frozen\x20table\x20entry\x20(Guards\x20are\x20'+'create-only,\x20IMMUT-003).');else c>=0x3&&c<=0x8?i['push']('TEACHING:\x20numeric\x20leaf\x20—\x20compare\x20via\x20the\x20logic_as_u256_greater/lesser/equal\x20variants,\x20'+'or\x20wrap\x20in\x20logic_equal\x20against\x20a\x20numeric\x20identifier[N].'):i['push']('TEACHING:\x20wrap\x20the\x20leaf\x20in\x20a\x20Bool-producing\x20operator\x20(logic_equal\x20/\x20logic_as_u256_*)\x20'+'before\x20feeding\x20logic_and/or/not.');}}}else i['push'](f+'the\x20operator\x20requires\x20'+h+',\x20but\x20the\x20child\x20returns\x20'+g+'.\x20TEACHING:\x20align\x20the\x20operand\x20'+'types\x20—\x20wrap\x20in\x20logic_equal\x20(any\x20type)\x20or\x20convert\x20with\x20the\x20logic_as_u256_*\x20family\x20(numeric)\x20'+'before\x20the\x20comparison.');return['GUARD\x20TYPE\x20ERROR\x20(with\x20teaching\x20notes\x20below):',a['trim'](),...i]['join']('\x0a');}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MAX_SUBMISSION_SIZE_PASSPORT,WOW_SYSTEM_SINGLETONS}from'@wowok/wowok';export function checkPuzzleCompleteness(a){const b={'intent':isIntentComplete(a['intent']),'binding':isBindingComplete(a['binding']),'data_sources':isDataSourcesComplete(a['data_sources']),'query':isQueryComplete(a['queries']),'logic':isLogicComplete(a['logic']),'constraints':isConstraintsComplete(a['constraints'])},c=Object['keys'](b)['filter'](g=>!b[g]),d=[];!b['intent']&&d['push']('A.\x20Intent:\x20protected\x20action,\x20validation\x20rule,\x20or\x20failure\x20conditions\x20not\x20clarified');!b['binding']&&d['push']('B.\x20Binding:\x20Host\x20Object,\x20binding\x20field,\x20or\x20circular\x20reference\x20mode\x20not\x20determined');!b['data_sources']&&d['push']('C.\x20Data\x20sources:\x20data\x20sources\x20not\x20declared\x20by\x204\x20classifications\x20(on-chain\x20constant\x20/\x20witness-derived\x20/\x20submitted\x20object\x20/\x20system\x20context)');!b['query']&&d['push']('D.\x20Query:\x20query\x20instruction\x20not\x20determined\x20(if\x20the\x20Guard\x20needs\x20to\x20query\x20on-chain\x20data)');!b['logic']&&d['push']('E.\x20Logic:\x20computation\x20tree\x20root\x20or\x20rely\x20composition\x20not\x20designed');!b['constraints']&&d['push']('F.\x20Constraints:\x20creation-time\x2010\x20+\x20runtime\x206\x20constraint\x20checks\x20not\x20completed');const e=c['length']===0x0,f=recommendNextStep(a,c);return{'dimensions':b,'missing':c,'missing_details':d,'complete':e,'next_step':f};}function isIntentComplete(a){return!!a&&!!a['action']&&!!a['rule_sentence']&&a['failure_conditions']['length']>0x0;}function isBindingComplete(a){return!!a&&!!a['host_object']&&!!a['binding_field'];}function isDataSourcesComplete(a){if(!a)return![];const b=a['on_chain_constants']['length']>0x0,c=a['witness_derived']['length']>0x0,d=a['submitted_objects']['length']>0x0,e=a['submitted_values']['length']>0x0,f=a['system_contexts']['length']>0x0;if(!b&&!c&&!d&&!e&&!f)return![];const g=a['submitted_objects']['some'](h=>!h['binding_constraint']);if(g)return![];return!![];}function isQueryComplete(a){return!![];}function isLogicComplete(a){return!!a&&!!a['root']&&a['root']['return_type']==='Bool';}function isConstraintsComplete(a){if(!a)return![];return Object['values'](a)['every'](b=>b===!![]);}function recommendNextStep(a,b){if(b['includes']('intent'))return{'round':'R1','action':'Capture\x20validation\x20intent','questions':['What\x20action\x20do\x20you\x20want\x20to\x20protect?\x20(buy/forward/claim/vote/dispute/write/allocate)','Describe\x20the\x20validation\x20rule\x20in\x20one\x20sentence','List\x20the\x20conditions\x20under\x20which\x20the\x20Guard\x20should\x20FAIL']};if(b['includes']('binding'))return{'round':'R5','action':'Determine\x20binding\x20target','questions':['Which\x20Host\x20Object\x20will\x20the\x20Guard\x20bind\x20to?\x20(Service/Machine/Arbitration/Reward/Repository)','Which\x20field\x20will\x20it\x20bind\x20to?\x20(buy_guard/order_allocators/Forward.guard/...)','Does\x20the\x20Guard\x20need\x20to\x20reference\x20the\x20Host\x20Object?\x20(circular\x20reference\x20mode)']};if(b['includes']('data_sources'))return{'round':'R2','action':'Declare\x20data\x20sources\x20by\x204\x20classifications','questions':['Type1\x20(on-chain\x20constant):\x20Which\x20already-published\x20on-chain\x20objects\x20does\x20the\x20Guard\x20need\x20to\x20query?\x20(Service/Machine/Reward\x20addresses)','Type2\x20(witness-derived):\x20Do\x20you\x20need\x20to\x20derive\x20Progress/Machine/Service\x20from\x20Order/Arb?\x20(choose\x20witness\x20100-109)','Type3\x20(submitted\x20object):\x20Which\x20object\x20addresses\x20does\x20the\x20caller\x20need\x20to\x20submit?\x20(Order/Reward/Progress)\x20—\x20constraint\x20rules\x20must\x20be\x20designed','Type3\x20(submitted\x20value):\x20Which\x20scalar\x20values\x20does\x20the\x20caller\x20need\x20to\x20submit?\x20(amount/weight/node\x20name)','Type4\x20(system\x20context):\x20Do\x20you\x20need\x20Signer\x20(identity)\x20/\x20Clock\x20(time)\x20/\x20Guard\x20(self-reference)?','Do\x20you\x20need\x20to\x20query\x20EntityRegistrar(0xaab)\x20or\x20EntityLinker(0xaaa)?']};if(b['includes']('query'))return{'round':'R3','action':'Design\x20query\x20nodes','questions':['Which\x20on-chain\x20objects\x20does\x20the\x20Guard\x20need\x20to\x20query?','Which\x20instruction\x20ID\x20does\x20each\x20query\x20use?\x20(look\x20up\x20from\x20GUARDQUERY)','Do\x20you\x20need\x20convert_witness\x20to\x20convert\x20objects?\x20(linked\x20to\x20Type2\x20declaration)']};if(b['includes']('logic'))return{'round':'R3','action':'Design\x20computation\x20tree','questions':['What\x20is\x20the\x20root\x20node?\x20(must\x20return\x20Bool)','Which\x20data\x20source\x20nodes\x20are\x20there?\x20(by\x204\x20classifications:\x20identifier/context/query)','Which\x20intermediate\x20conversion\x20nodes\x20are\x20there?\x20(calc_*/convert_*/vec_*)','Do\x20you\x20need\x20rely\x20to\x20compose\x20with\x20other\x20Guards?']};if(b['includes']('constraints'))return{'round':'R6','action':'Pre-creation\x20review','questions':['Run\x20the\x20creation-time\x2010\x20+\x20runtime\x206\x20constraint\x20checklist']};return{'round':'R7','action':'Prepare\x20for\x20on-chain\x20creation','questions':['All\x20dimensions\x20are\x20complete;\x20ready\x20to\x20generate\x20the\x20semantic\x20confirmation\x20text']};}export function generateConfirmationText(a){if(!a['intent']||!a['binding']||!a['data_sources']||!a['logic'])return'[Puzzle\x20incomplete]\x20Cannot\x20generate\x20confirmation\x20text;\x20please\x20complete\x20all\x20dimensions\x20first';const b=[];b['push']('═══════════════════════════════════════════════════════'),b['push']('\x20\x20Guard\x20Semantic\x20Confirmation\x20Report\x20(User\x20Review\x20Edition)'),b['push']('═══════════════════════════════════════════════════════'),b['push'](''),b['push']('[Intent]'),b['push']('Protected\x20action:\x20'+a['intent']['action']),b['push']('Validation\x20rule:\x20'+a['intent']['rule_sentence']),b['push']('Failure\x20conditions:'),a['intent']['failure_conditions']['forEach']((d,e)=>{b['push']('\x20\x20'+(e+0x1)+'.\x20'+d);}),b['push'](''),b['push']('[Binding]'),b['push']('Host\x20Object:\x20'+a['binding']['host_object']);a['binding']['host_object_name']&&b['push']('Host\x20Object\x20name:\x20'+a['binding']['host_object_name']);b['push']('Binding\x20field:\x20'+a['binding']['binding_field']),b['push']('Circular\x20reference:\x20'+(a['binding']['circular_reference']?'Yes\x20(Guard\x20references\x20Host\x20Object)':'No')),b['push']('Host\x20Object\x20state:\x20'+a['binding']['host_object_state']),b['push'](''),b['push']('[Data\x20sources\x20(4\x20classifications)]'),printDataSources(b,a['data_sources']),b['push']('');a['queries']&&a['queries']['length']>0x0&&(b['push']('[Query\x20instructions]'),b['push']('┌──────┬──────────────────────────┬────────────┬──────────┬──────────┐'),b['push']('│\x20ID\x20\x20\x20│\x20Query\x20instruction\x20\x20\x20\x20\x20\x20\x20\x20│\x20Target\x20obj\x20│\x20Params\x20\x20\x20│\x20Return\x20\x20\x20│'),b['push']('├──────┼──────────────────────────┼────────────┼──────────┼──────────┤'),a['queries']['forEach'](d=>{const e=String(d['query_id'])['padEnd'](0x4),f=d['query_name']['length']>0x18?d['query_name']['slice'](0x0,0x17)+'…':d['query_name']['padEnd'](0x18),g=d['object_type']['padEnd'](0xa),h=(d['parameters']['length']===0x0?'(none)':d['parameters']['join'](','))['padEnd'](0x8),i=d['return_type']['padEnd'](0x8);b['push']('│\x20'+e+'\x20│\x20'+f+'\x20│\x20'+g+'\x20│\x20'+h+'\x20│\x20'+i+'\x20│');}),b['push']('└──────┴──────────────────────────┴────────────┴──────────┴──────────┘'),b['push'](''));b['push']('[Computation\x20tree]'),b['push']('root:\x20'+a['logic']['root']['node_type']+'\x20(returns:\x20'+a['logic']['root']['return_type']+')'),b['push']('\x20\x20'+a['logic']['root']['description']);a['logic']['root']['children']&&printLogicTree(b,a['logic']['root']['children'],0x1);b['push']('');a['logic']['rely']&&(b['push']('[rely\x20composition]'),b['push']('Dependent\x20Guards:\x20'+a['logic']['rely']['guards']['join'](',\x20')),b['push']('Logic:\x20'+(a['logic']['rely']['logic_or']?'OR\x20(any\x20passes)':'AND\x20(all\x20must\x20pass)')),b['push']('rep\x20verification:\x20'+(a['logic']['rely']['rep_verified']['every'](d=>d)?'all\x20passed':'some\x20unverified')),b['push'](''));if(a['constraints']){b['push']('[Constraint\x20checklist\x20(creation-time\x2022\x20+\x20runtime\x2011\x20=\x2033;\x20MCP\x20layer\x20static\x20check\x2016)]');const d=[['01','All\x20identifiers\x20exist\x20in\x20the\x20table',a['constraints']['pitfall_01_identifiers_in_table']],['02','Comparison\x20node\x20types\x20are\x20compatible',a['constraints']['pitfall_02_type_compatibility']],['03','Query\x20instruction\x20ID\x20and\x20parameter\x20count\x20are\x20correct',a['constraints']['pitfall_03_query_instruction_valid']],['04','convert_witness\x20type\x20is\x20correct',a['constraints']['pitfall_04_witness_correct']],['05','Time-lock\x20tests\x20use\x20small\x20values',a['constraints']['pitfall_05_time_lock_test_safe']],['06','Old\x20Guard\x20exported\x20before\x20iteration',a['constraints']['pitfall_06_exported_before_recreate']],['07','root\x20returns\x20Bool',a['constraints']['pitfall_07_root_returns_bool']],['08','rely\x20dependency\x20rep=true',a['constraints']['pitfall_08_rely_rep_true']],['09','voting_guard\x20GuardIdentifier\x20numeric',a['constraints']['pitfall_09_voting_weight_numeric']],['10','Arbitration\x20not\x20paused',a['constraints']['pitfall_10_arbitration_not_paused']]],e=[['R1','Guard\x20immutable=true\x20to\x20verify',a['constraints']['runtime_01_guard_immutable']],['R2','submission\x20type\x20bytes\x20match\x20table\x20declaration',a['constraints']['runtime_02_submission_type_match']],['R3','b_submission=true\x20entry\x20found\x20in\x20submission',a['constraints']['runtime_03_submission_complete']],['R4','submission\x20total\x20bytes\x20≤\x20'+MAX_SUBMISSION_SIZE_PASSPORT,a['constraints']['runtime_04_submission_size']],['R5','witness\x20derivation\x20source\x20object\x20has\x20related\x20field',a['constraints']['runtime_05_witness_source_valid']],['R6','query\x20target\x20object\x20exists\x20and\x20types\x20match',a['constraints']['runtime_06_query_object_valid']]];b['push']('\x20\x20Creation-time\x20constraints:'),d['forEach'](([f,g,h])=>{b['push']('\x20\x20'+(h?'✓':'✗')+'\x20['+f+']\x20'+g);}),b['push']('\x20\x20Runtime\x20constraints:'),e['forEach'](([f,g,h])=>{b['push']('\x20\x20'+(h?'✓':'✗')+'\x20['+f+']\x20'+g);}),b['push']('');}b['push']('[Risk\x20warnings]'),b['push']('\x20\x20⚠\x20Guard\x20cannot\x20be\x20modified\x20or\x20deleted\x20after\x20creation\x20(CREATE-only)'),b['push']('\x20\x20⚠\x20On-chain\x20execution\x20will\x20consume\x20gas'),b['push']('\x20\x20⚠\x20To\x20modify\x20after\x20creation:\x20export\x20→\x20edit\x20→\x20create\x20new\x20→\x20rebind'),b['push'](''),b['push']('[Test\x20plan\x20(gen_passport\x20static\x20test)]'),b['push']('\x20\x20Expected\x20pass\x20scenario:\x20submit\x20data\x20meeting\x20conditions\x20→\x20PASS\x20→\x20Passport\x20generated'),b['push']('\x20\x20Expected\x20fail\x20scenario:\x20submit\x20data\x20not\x20meeting\x20conditions\x20→\x20FAIL\x20→\x20verify\x20logic\x20direction'),b['push'](''),b['push']('[Post-creation\x20actions\x20(important)]'),b['push']('\x20\x201.\x20Use\x20guard2file\x20to\x20export\x20the\x20Guard\x20backup\x20(JSON\x20file)\x20for\x20later\x20rebuild\x20or\x20migration'),b['push']('\x20\x202.\x20Record\x20the\x20Guard\x20object\x20ID\x20for\x20subsequent\x20binding\x20and\x20invocation'),b['push']('\x20\x203.\x20If\x20the\x20Guard\x20binds\x20to\x20a\x20Host\x20Object,\x20ensure\x20the\x20Host\x20Object\x20is\x20published\x20after\x20Guard\x20creation'),b['push']('\x20\x204.\x20Verify\x20the\x20Guard\x20logic\x20direction\x20via\x20gen_passport\x20static\x20test'),b['push']('');const c=creationChecksForReadiness(a);return b['push']('[Creation\x20readiness\x20signal]'),b['push']('\x20\x20Puzzle\x20completeness:\x20'+(c?'✓\x20All\x20passed\x20—\x20ready\x20for\x20on-chain\x20CREATE':'✗\x20Some\x20items\x20not\x20passed\x20—\x20please\x20fix\x20first')),b['push'](''),b['push']('═══════════════════════════════════════════════════════'),b['push']('\x20\x20Please\x20review\x20the\x20Guard\x20semantic\x20confirmation\x20report\x20above'),b['push']('\x20\x20After\x20confirming\x20no\x20issues,\x20reply\x20\x22confirm\x20creation\x22\x20to\x20execute\x20on-chain\x20CREATE'),b['push']('\x20\x20If\x20modifications\x20are\x20needed,\x20please\x20point\x20out\x20the\x20parts\x20to\x20adjust'),b['push']('═══════════════════════════════════════════════════════'),b['join']('\x0a');}function creationChecksForReadiness(a){if(!a['intent']||!a['binding']||!a['data_sources']||!a['logic']||!a['constraints'])return![];const b=a['constraints'],d=b['pitfall_01_identifiers_in_table']&&b['pitfall_02_type_compatibility']&&b['pitfall_03_query_instruction_valid']&&b['pitfall_04_witness_correct']&&b['pitfall_05_time_lock_test_safe']&&b['pitfall_06_exported_before_recreate']&&b['pitfall_07_root_returns_bool']&&b['pitfall_08_rely_rep_true']&&b['pitfall_09_voting_weight_numeric']&&b['pitfall_10_arbitration_not_paused'],e=b['runtime_01_guard_immutable']&&b['runtime_02_submission_type_match']&&b['runtime_03_submission_complete']&&b['runtime_04_submission_size']&&b['runtime_05_witness_source_valid']&&b['runtime_06_query_object_valid'];return d&&e;}function printDataSources(a,b){b['on_chain_constants']['length']>0x0&&(a['push']('\x20\x20Type1\x20—\x20On-chain\x20constant\x20objects\x20(OnChainConstant,\x20b_submission=false):'),b['on_chain_constants']['forEach'](c=>{const d=c['is_system_address']?'\x20[system\x20address]':'';a['push']('\x20\x20\x20\x20[id='+c['identifier']+']\x20'+c['object_type']+'('+c['object_address']+')'+d+'\x20—\x20'+c['name']);})),b['witness_derived']['length']>0x0&&(a['push']('\x20\x20Type2\x20—\x20Witness-derived\x20objects\x20(WitnessDerived,\x20convert_witness\x20100-109):'),b['witness_derived']['forEach'](c=>{const d=c['source_b_submission']?'submitted':'constant';a['push']('\x20\x20\x20\x20[id='+c['identifier']+']\x20'+c['source_type']+'('+d+')\x20→\x20'+c['target_type']+'\x20via\x20'+c['witness_name']+'('+c['witness_type']+')\x20—\x20'+c['name']);})),b['submitted_objects']['length']>0x0&&(a['push']('\x20\x20Type3\x20—\x20Submitted\x20objects\x20(SubmittedObject,\x20b_submission=true):'),b['submitted_objects']['forEach'](c=>{a['push']('\x20\x20\x20\x20[id='+c['identifier']+']\x20'+c['expected_object_type']+'('+c['value_type']+')\x20—\x20'+c['name']),c['binding_constraint']&&a['push']('\x20\x20\x20\x20\x20\x20Constraint:\x20'+c['binding_constraint']);})),b['submitted_values']['length']>0x0&&(a['push']('\x20\x20Type3\x20—\x20Submitted\x20values\x20(SubmittedValue,\x20b_submission=true,\x20scalar):'),b['submitted_values']['forEach'](c=>{a['push']('\x20\x20\x20\x20[id='+c['identifier']+']\x20'+c['value_type']+'\x20—\x20'+c['name']),c['binding_constraint']&&a['push']('\x20\x20\x20\x20\x20\x20Constraint:\x20'+c['binding_constraint']);})),b['system_contexts']['length']>0x0&&(a['push']('\x20\x20Type4\x20—\x20System\x20contexts\x20(SystemContext,\x20not\x20in\x20table):'),b['system_contexts']['forEach'](c=>{a['push']('\x20\x20\x20\x20context('+c['context_type']+')\x20—\x20'+c['usage']);})),b['on_chain_constants']['length']===0x0&&b['witness_derived']['length']===0x0&&b['submitted_objects']['length']===0x0&&b['submitted_values']['length']===0x0&&b['system_contexts']['length']===0x0&&a['push']('\x20\x20(No\x20data\x20sources\x20declared)');}function printLogicTree(a,b,c){const d='\x20\x20'['repeat'](c+0x1);b['forEach']((e,f)=>{const g=f===b['length']-0x1?'└──\x20':'├──\x20';a['push'](''+d+g+e['node_type']+'\x20('+e['return_type']+')\x20—\x20'+e['description']),e['references_identifier']!==undefined&&a['push'](d+'\x20\x20\x20\x20→\x20table['+e['references_identifier']+']'),e['query']&&a['push'](d+'\x20\x20\x20\x20→\x20query('+e['query']['query_id']+':\x20'+e['query']['query_name']+')'),e['children']&&printLogicTree(a,e['children'],c+0x1);});}export function initPuzzleFromIntent(a){return{'current_round':'R1','intent':{'action':a['action']??'custom','rule_sentence':a['rule_sentence']??'','failure_conditions':a['failure_conditions']??[]}};}export function inferBindingFromAction(a){const b={'buy':{'host_object':'Service','binding_field':'buy_guard'},'forward':{'host_object':'Machine','binding_field':'Forward.guard'},'allocate':{'host_object':'Service','binding_field':'order_allocators'},'claim_reward':{'host_object':'Reward','binding_field':'guard'},'vote':{'host_object':'Arbitration','binding_field':'voting_guard'},'dispute':{'host_object':'Arbitration','binding_field':'usage_guard'},'write_repository':{'host_object':'Repository','binding_field':'write_guard'},'submit_progress':{'host_object':'Progress','binding_field':'submission'},'gen_passport':{'host_object':'Standalone','binding_field':'none'},'custom':{}};return b[a]??{};}export function emptyDataSources(){return{'on_chain_constants':[],'witness_derived':[],'submitted_objects':[],'submitted_values':[],'system_contexts':[]};}export const WITNESS_NAME_MAP={0x64:{'name':'TypeOrderProgress','source':'Order','target':'Progress'},0x65:{'name':'TypeOrderMachine','source':'Order','target':'Machine'},0x66:{'name':'TypeOrderService','source':'Order','target':'Service'},0x67:{'name':'TypeProgressMachine','source':'Progress','target':'Machine'},0x68:{'name':'TypeArbOrder','source':'Arb','target':'Order'},0x69:{'name':'TypeArbArbitration','source':'Arb','target':'Arbitration'},0x6a:{'name':'TypeArbProgress','source':'Arb','target':'Progress'},0x6b:{'name':'TypeArbMachine','source':'Arb','target':'Machine'},0x6c:{'name':'TypeArbService','source':'Arb','target':'Service'},0x6d:{'name':'TypeOrderAllocation','source':'Order','target':'Allocation'}};export function getWitnessInfo(a){return WITNESS_NAME_MAP[a];}function traverseRoot(a,b){if(!a)return;a['type']==='identifier'&&typeof a['identifier']==='number'&&b['referencedIdentifiers']['add'](a['identifier']);a['type']==='context'&&a['context']&&b['contexts']['add'](a['context']);if(a['type']==='query'&&a['object']){const c=a['object']['identifier'];b['referencedIdentifiers']['add'](c);const d=a['object']['convert_witness'];typeof d==='number'&&d>=0x64&&d<=0x6d&&b['witnessCodes']['push']({'code':d,'objectIdentifier':c});b['queries']['push']({'query':a['query']??'','objectIdentifier':c,'convertWitness':d,'parametersCount':a['parameters']?.['length']??0x0});if(a['parameters'])for(const e of a['parameters']){traverseRoot(e,b);}}if(a['nodes'])for(const f of a['nodes']){traverseRoot(f,b);}a['node']&&traverseRoot(a['node'],b),a['nodeLeft']&&traverseRoot(a['nodeLeft'],b),a['nodeRight']&&traverseRoot(a['nodeRight'],b);}function buildLogicTree(a){if(!a)return undefined;const b={'node_type':a['type'],'return_type':inferNodeType(a['type']),'description':describeNode(a)};a['type']==='identifier'&&typeof a['identifier']==='number'&&(b['references_identifier']=a['identifier']);if(a['type']==='query'&&a['object']){b['query']={'query_id':typeof a['query']==='number'?a['query']:0x0,'query_name':typeof a['query']==='string'?a['query']:String(a['query']??''),'object_type':'','parameters':[],'return_type':'','purpose':''};if(a['object']['convert_witness']){const c=getWitnessInfo(a['object']['convert_witness']);c&&(b['query']['witness']={'witness_type':a['object']['convert_witness'],'witness_name':c['name'],'source_type':c['source'],'target_type':c['target'],'scenario':''});}}if(a['nodes']){const d=a['nodes']['map'](e=>buildLogicTree(e))['filter'](e=>e!==undefined);d['length']>0x0&&(b['children']=d);}if(a['node']){const e=buildLogicTree(a['node']);e&&(b['children']=[e]);}if(a['nodeLeft']){const f=buildLogicTree(a['nodeLeft']);f&&(b['children']=[...b['children']??[],f]);}if(a['nodeRight']){const g=buildLogicTree(a['nodeRight']);g&&(b['children']=[...b['children']??[],g]);}return b;}function inferNodeType(a){const b=['logic_equal','logic_not','logic_and','logic_or','logic_as_u256_greater','logic_as_u256_lesser','logic_as_u256_equal','logic_as_u256_greater_or_equal','logic_as_u256_lesser_or_equal','logic_string_contains','logic_string_nocase_contains','logic_string_nocase_equal','calc_string_contains','calc_string_nocase_contains','calc_string_nocase_equal','vec_contains_bool','vec_contains_address','vec_contains_string','vec_contains_string_nocase','vec_contains_number','query_reward_record_exists','query_order_named_operator_member','query_repository_data_has'];if(b['includes'](a))return'Bool';const c=['calc_string_length','calc_string_indexof','calc_string_nocase_indexof','vec_length','vec_indexof_bool','vec_indexof_address','vec_indexof_string','vec_indexof_string_nocase','vec_indexof_number','time_until','query_reward_record_count','query_progress_history_session_count','query_progress_history_session_forward_count','query_progress_history_session_forward_retained_submission_count','query_repository_data_count_where'];if(c['includes'](a))return'U64';const d=['calc_number_add','calc_number_subtract','calc_number_multiply','calc_number_divide','calc_number_mod','convert_address_number','convert_string_number','query_repository_data_sum_where','query_repository_data_sum_where_bound'];if(d['includes'](a))return'U256';const e={'query_repository_data_find_where':'VecAddress','query_repository_data_keys_where':'VecString','query_repository_policies_keys':'VecString','query_repository_data':'VecU8'};if(e[a])return e[a];const f=['convert_number_address'];if(f['includes'](a))return'Address';const g=['convert_number_string'];if(g['includes'](a))return'String';const h=['convert_safe_u8','convert_safe_u16','convert_safe_u32','convert_safe_u64','convert_safe_u128','convert_safe_u256'];if(h['includes'](a))return a['replace']('convert_safe_','U');if(a==='value_type')return'U8';if(a==='query')return'query_defined';if(a==='identifier')return'table_defined';if(a==='context')return'context_defined';return'unknown';}function describeNode(a){switch(a['type']){case'identifier':return'Reference\x20to\x20table['+(a['identifier']??'?')+']';case'context':return'System\x20context:\x20'+(a['context']??'?');case'query':return'Query\x20instruction\x20'+(a['query']??'?')+'\x20(target:\x20table['+(a['object']?.['identifier']??'?')+'])';case'logic_equal':return'Equality\x20comparison\x20(==)';case'logic_not':return'Logical\x20NOT\x20(!)';case'logic_and':return'Logical\x20AND';case'logic_or':return'Logical\x20OR';case'logic_as_u256_greater':return'Numeric\x20greater\x20than\x20(>)';case'logic_as_u256_lesser':return'Numeric\x20less\x20than\x20(<)';case'logic_as_u256_equal':return'Numeric\x20equality\x20(==)';case'logic_as_u256_greater_or_equal':return'Numeric\x20greater\x20than\x20or\x20equal\x20(>=)';case'logic_as_u256_lesser_or_equal':return'Numeric\x20less\x20than\x20or\x20equal\x20(<=)';case'calc_number_add':return'Numeric\x20addition\x20(+)';case'calc_number_subtract':return'Numeric\x20subtraction\x20(-)';case'time_until':return'Saturating\x20time\x20delta:\x20max(0,\x20target\x20-\x20now)\x20in\x20ms';case'calc_number_multiply':return'Numeric\x20multiplication\x20(*)';case'calc_number_divide':return'Numeric\x20division\x20(/)';case'calc_number_mod':return'Numeric\x20modulo\x20(%)';case'vec_contains_address':return'Whitelist\x20check\x20(vec_contains_address)';case'vec_length':return'Vector\x20length';case'convert_safe_u64':return'Safe\x20conversion\x20to\x20U64';default:return a['type'];}}function deriveConstraints(a,b,c,d){const e=Array['from'](d['referencedIdentifiers'])['every'](v=>a['some'](w=>w['identifier']===v)),f=b!==undefined,g=!![],h=d['witnessCodes']['every'](v=>v['code']>=0x64&&v['code']<=0x6d),i=!![],j=!![],k=b!==undefined,l=c?c['guards']['length']<=0x4:!![],m=!![],n=!![],o=!![],p=!![],q=!![],r=a['filter'](v=>v['b_submission']),s=r['length']<=MAX_SUBMISSION_SIZE_PASSPORT,t=!![],u=!![];return{'pitfall_01_identifiers_in_table':e,'pitfall_02_type_compatibility':f,'pitfall_03_query_instruction_valid':g,'pitfall_04_witness_correct':h,'pitfall_05_time_lock_test_safe':i,'pitfall_06_exported_before_recreate':j,'pitfall_07_root_returns_bool':k,'pitfall_08_rely_rep_true':l,'pitfall_09_voting_weight_numeric':m,'pitfall_10_arbitration_not_paused':n,'runtime_01_guard_immutable':o,'runtime_02_submission_type_match':p,'runtime_03_submission_complete':q,'runtime_04_submission_size':s,'runtime_05_witness_source_valid':t,'runtime_06_query_object_valid':u};}export function derivePuzzleFromCallData(a){const b=a['table']??[],c=a['root'],d=a['rely'],e=a['binding_hint'],f={'referencedIdentifiers':new Set(),'queries':[],'contexts':new Set(),'witnessCodes':[]};c&&traverseRoot(c,f);let g;e&&(g={'action':e['action'],'rule_sentence':e['rule_sentence']??'','failure_conditions':e['failure_conditions']??[]});let h;e&&(h={'host_object':e['host_object'],'binding_field':e['binding_field'],'circular_reference':e['circular_reference']??![],'host_object_state':'unknown'});const i=new Map();for(const t of f['witnessCodes']){i['set'](t['objectIdentifier'],t['code']);}const j=[],k=[],l=[],m=[];for(const u of b){const v=f['referencedIdentifiers']['has'](u['identifier']),x=i['get'](u['identifier']);if(x!==undefined){const y=getWitnessInfo(x);if(y){k['push']({'identifier':u['identifier'],'source_type':y['source'],'witness_type':x,'witness_name':y['name'],'target_type':y['target'],'source_b_submission':u['b_submission'],'name':u['name']||y['source']+'→'+y['target']+'\x20via\x20'+y['name']});continue;}}if(!u['b_submission']){const z=typeof u['value']==='string'?u['value']['toLowerCase']():'',A=z in WOW_SYSTEM_SINGLETONS||Object['values'](WOW_SYSTEM_SINGLETONS)['includes'](z);j['push']({'identifier':u['identifier'],'object_address':typeof u['value']==='string'?u['value']:String(u['value']??''),'object_type':u['object_type']??'','name':u['name']||'constant\x20#'+u['identifier'],'is_system_address':A});}else{const B=typeof u['value_type']==='string'?u['value_type']['toLowerCase']():String(u['value_type']);B==='address'?l['push']({'identifier':u['identifier'],'expected_object_type':u['object_type']??'','value_type':'Address','name':u['name']||'submitted\x20object\x20#'+u['identifier'],'binding_constraint':u['object_type']?'must\x20be\x20an\x20on-chain\x20object\x20address\x20of\x20type\x20'+u['object_type']:'must\x20be\x20a\x20valid\x20on-chain\x20object\x20address'}):m['push']({'identifier':u['identifier'],'value_type':typeof u['value_type']==='string'?u['value_type']:String(u['value_type']),'name':u['name']||'submitted\x20value\x20#'+u['identifier'],'binding_constraint':'value\x20type\x20must\x20be\x20'+u['value_type']});}}const n=[];for(const C of f['contexts']){const D={'Signer':'Current\x20transaction\x20signer\x20address\x20verification','Clock':'On-chain\x20timestamp\x20(used\x20for\x20time-lock/time-window)','Guard':'Guard\x20self\x20object\x20ID\x20self-reference'};n['push']({'context_type':C,'usage':D[C]??''});}const o={'on_chain_constants':j,'witness_derived':k,'submitted_objects':l,'submitted_values':m,'system_contexts':n},p=f['queries']['map'](E=>{const F=E['convertWitness']!==undefined?getWitnessInfo(E['convertWitness']):undefined;return{'query_id':typeof E['query']==='number'?E['query']:0x0,'query_name':typeof E['query']==='string'?E['query']:String(E['query']),'object_type':'','parameters':[],'return_type':'','witness':F?{'witness_type':E['convertWitness'],'witness_name':F['name'],'source_type':F['source'],'target_type':F['target'],'scenario':''}:undefined,'purpose':''};});let q;if(c){const E=buildLogicTree(c);if(E){E['return_type']='Bool';let F;d&&d['guards']['length']>0x0&&(F={'guards':d['guards'],'logic_or':d['logic_or']??![],'rep_verified':d['guards']['map'](()=>!![])}),q={'root':E,'rely':F};}}const r=deriveConstraints(b,c,d,f),s={'current_round':'R7','intent':g,'binding':h,'data_sources':o,'queries':p,'logic':q,'constraints':r};return s;}export function getPuzzleStatusBooleans(a){const b=checkPuzzleCompleteness(a);return{'intent':b['dimensions']['intent'],'binding':b['dimensions']['binding'],'data':b['dimensions']['data_sources'],'query':b['dimensions']['query'],'logic':b['dimensions']['logic'],'constraints':b['dimensions']['constraints']};}export function getPendingQuestions(a){const b=checkPuzzleCompleteness(a);if(b['complete'])return[];return b['next_step']['questions'];}
|
|
1
|
+
import{MAX_SUBMISSION_SIZE_PASSPORT,WOW_SYSTEM_SINGLETONS}from'@wowok/wowok';export function checkPuzzleCompleteness(a){const b={'intent':isIntentComplete(a['intent']),'binding':isBindingComplete(a['binding']),'data_sources':isDataSourcesComplete(a['data_sources']),'query':isQueryComplete(a['queries']),'logic':isLogicComplete(a['logic']),'constraints':isConstraintsComplete(a['constraints'])},c=Object['keys'](b)['filter'](g=>!b[g]),d=[];!b['intent']&&d['push']('A.\x20Intent:\x20protected\x20action,\x20validation\x20rule,\x20or\x20failure\x20conditions\x20not\x20clarified');!b['binding']&&d['push']('B.\x20Binding:\x20Host\x20Object,\x20binding\x20field,\x20or\x20circular\x20reference\x20mode\x20not\x20determined');!b['data_sources']&&d['push']('C.\x20Data\x20sources:\x20data\x20sources\x20not\x20declared\x20by\x204\x20classifications\x20(on-chain\x20constant\x20/\x20witness-derived\x20/\x20submitted\x20object\x20/\x20system\x20context)');!b['query']&&d['push']('D.\x20Query:\x20query\x20instruction\x20not\x20determined\x20(if\x20the\x20Guard\x20needs\x20to\x20query\x20on-chain\x20data)');!b['logic']&&d['push']('E.\x20Logic:\x20computation\x20tree\x20root\x20or\x20rely\x20composition\x20not\x20designed');!b['constraints']&&d['push']('F.\x20Constraints:\x20creation-time\x2010\x20+\x20runtime\x206\x20constraint\x20checks\x20not\x20completed');const e=c['length']===0x0,f=recommendNextStep(a,c);return{'dimensions':b,'missing':c,'missing_details':d,'complete':e,'next_step':f};}function isIntentComplete(a){return!!a&&!!a['action']&&!!a['rule_sentence']&&a['failure_conditions']['length']>0x0;}function isBindingComplete(a){return!!a&&!!a['host_object']&&!!a['binding_field'];}function isDataSourcesComplete(a){if(!a)return![];const b=a['on_chain_constants']['length']>0x0,c=a['witness_derived']['length']>0x0,d=a['submitted_objects']['length']>0x0,e=a['submitted_values']['length']>0x0,f=a['system_contexts']['length']>0x0;if(!b&&!c&&!d&&!e&&!f)return![];const g=a['submitted_objects']['some'](h=>!h['binding_constraint']);if(g)return![];return!![];}function isQueryComplete(a){return!![];}function isLogicComplete(a){return!!a&&!!a['root']&&a['root']['return_type']==='Bool';}function isConstraintsComplete(a){if(!a)return![];return Object['values'](a)['every'](b=>b===!![]);}function recommendNextStep(a,b){if(b['includes']('intent'))return{'round':'R1','action':'Capture\x20validation\x20intent','questions':['What\x20action\x20do\x20you\x20want\x20to\x20protect?\x20(buy/forward/claim/vote/dispute/write/allocate)','Describe\x20the\x20validation\x20rule\x20in\x20one\x20sentence','List\x20the\x20conditions\x20under\x20which\x20the\x20Guard\x20should\x20FAIL']};if(b['includes']('binding'))return{'round':'R5','action':'Determine\x20binding\x20target','questions':['Which\x20Host\x20Object\x20will\x20the\x20Guard\x20bind\x20to?\x20(Service/Machine/Arbitration/Reward/Repository)','Which\x20field\x20will\x20it\x20bind\x20to?\x20(buy_guard/order_allocators/Forward.guard/...)','Does\x20the\x20Guard\x20need\x20to\x20reference\x20the\x20Host\x20Object?\x20(circular\x20reference\x20mode)']};if(b['includes']('data_sources'))return{'round':'R2','action':'Declare\x20data\x20sources\x20by\x204\x20classifications','questions':['Type1\x20(on-chain\x20constant):\x20Which\x20already-published\x20on-chain\x20objects\x20does\x20the\x20Guard\x20need\x20to\x20query?\x20(Service/Machine/Reward\x20addresses)','Type2\x20(witness-derived):\x20Do\x20you\x20need\x20to\x20derive\x20Progress/Machine/Service\x20from\x20Order/Arb?\x20(choose\x20witness\x20100-109)','Type3\x20(submitted\x20object):\x20Which\x20object\x20addresses\x20does\x20the\x20caller\x20need\x20to\x20submit?\x20(Order/Reward/Progress)\x20—\x20constraint\x20rules\x20must\x20be\x20designed','Type3\x20(submitted\x20value):\x20Which\x20scalar\x20values\x20does\x20the\x20caller\x20need\x20to\x20submit?\x20(amount/weight/node\x20name)','Type4\x20(system\x20context):\x20Do\x20you\x20need\x20Signer\x20(identity)\x20/\x20Clock\x20(time)\x20/\x20Guard\x20(self-reference)?','Do\x20you\x20need\x20to\x20query\x20the\x20entity\x20registry\x20(0xaab\x20—\x20Move\x20Entity\x20object,\x20SDK\x20alias\x20EntityRegistrar)\x20or\x20the\x20registrar\x20(0xaaa\x20—\x20SDK\x20alias\x20EntityLinker)?']};if(b['includes']('query'))return{'round':'R3','action':'Design\x20query\x20nodes','questions':['Which\x20on-chain\x20objects\x20does\x20the\x20Guard\x20need\x20to\x20query?','Which\x20instruction\x20ID\x20does\x20each\x20query\x20use?\x20(look\x20up\x20from\x20GUARDQUERY)','Do\x20you\x20need\x20convert_witness\x20to\x20convert\x20objects?\x20(linked\x20to\x20Type2\x20declaration)']};if(b['includes']('logic'))return{'round':'R3','action':'Design\x20computation\x20tree','questions':['What\x20is\x20the\x20root\x20node?\x20(must\x20return\x20Bool)','Which\x20data\x20source\x20nodes\x20are\x20there?\x20(by\x204\x20classifications:\x20identifier/context/query)','Which\x20intermediate\x20conversion\x20nodes\x20are\x20there?\x20(calc_*/convert_*/vec_*)','Do\x20you\x20need\x20rely\x20to\x20compose\x20with\x20other\x20Guards?']};if(b['includes']('constraints'))return{'round':'R6','action':'Pre-creation\x20review','questions':['Run\x20the\x20creation-time\x2010\x20+\x20runtime\x206\x20constraint\x20checklist']};return{'round':'R7','action':'Prepare\x20for\x20on-chain\x20creation','questions':['All\x20dimensions\x20are\x20complete;\x20ready\x20to\x20generate\x20the\x20semantic\x20confirmation\x20text']};}export function generateConfirmationText(a){if(!a['intent']||!a['binding']||!a['data_sources']||!a['logic'])return'[Puzzle\x20incomplete]\x20Cannot\x20generate\x20confirmation\x20text;\x20please\x20complete\x20all\x20dimensions\x20first';const b=[];b['push']('═══════════════════════════════════════════════════════'),b['push']('\x20\x20Guard\x20Semantic\x20Confirmation\x20Report\x20(User\x20Review\x20Edition)'),b['push']('═══════════════════════════════════════════════════════'),b['push'](''),b['push']('[Intent]'),b['push']('Protected\x20action:\x20'+a['intent']['action']),b['push']('Validation\x20rule:\x20'+a['intent']['rule_sentence']),b['push']('Failure\x20conditions:'),a['intent']['failure_conditions']['forEach']((d,e)=>{b['push']('\x20\x20'+(e+0x1)+'.\x20'+d);}),b['push'](''),b['push']('[Binding]'),b['push']('Host\x20Object:\x20'+a['binding']['host_object']);a['binding']['host_object_name']&&b['push']('Host\x20Object\x20name:\x20'+a['binding']['host_object_name']);b['push']('Binding\x20field:\x20'+a['binding']['binding_field']),b['push']('Circular\x20reference:\x20'+(a['binding']['circular_reference']?'Yes\x20(Guard\x20references\x20Host\x20Object)':'No')),b['push']('Host\x20Object\x20state:\x20'+a['binding']['host_object_state']),b['push'](''),b['push']('[Data\x20sources\x20(4\x20classifications)]'),printDataSources(b,a['data_sources']),b['push']('');a['queries']&&a['queries']['length']>0x0&&(b['push']('[Query\x20instructions]'),b['push']('┌──────┬──────────────────────────┬────────────┬──────────┬──────────┐'),b['push']('│\x20ID\x20\x20\x20│\x20Query\x20instruction\x20\x20\x20\x20\x20\x20\x20\x20│\x20Target\x20obj\x20│\x20Params\x20\x20\x20│\x20Return\x20\x20\x20│'),b['push']('├──────┼──────────────────────────┼────────────┼──────────┼──────────┤'),a['queries']['forEach'](d=>{const e=String(d['query_id'])['padEnd'](0x4),f=d['query_name']['length']>0x18?d['query_name']['slice'](0x0,0x17)+'…':d['query_name']['padEnd'](0x18),g=d['object_type']['padEnd'](0xa),h=(d['parameters']['length']===0x0?'(none)':d['parameters']['join'](','))['padEnd'](0x8),i=d['return_type']['padEnd'](0x8);b['push']('│\x20'+e+'\x20│\x20'+f+'\x20│\x20'+g+'\x20│\x20'+h+'\x20│\x20'+i+'\x20│');}),b['push']('└──────┴──────────────────────────┴────────────┴──────────┴──────────┘'),b['push'](''));b['push']('[Computation\x20tree]'),b['push']('root:\x20'+a['logic']['root']['node_type']+'\x20(returns:\x20'+a['logic']['root']['return_type']+')'),b['push']('\x20\x20'+a['logic']['root']['description']);a['logic']['root']['children']&&printLogicTree(b,a['logic']['root']['children'],0x1);b['push']('');a['logic']['rely']&&(b['push']('[rely\x20composition]'),b['push']('Dependent\x20Guards:\x20'+a['logic']['rely']['guards']['join'](',\x20')),b['push']('Logic:\x20'+(a['logic']['rely']['logic_or']?'OR\x20(any\x20passes)':'AND\x20(all\x20must\x20pass)')),b['push']('rep\x20verification:\x20'+(a['logic']['rely']['rep_verified']['every'](d=>d)?'all\x20passed':'some\x20unverified')),b['push'](''));if(a['constraints']){b['push']('[Constraint\x20checklist\x20(creation-time\x2022\x20+\x20runtime\x2011\x20=\x2033;\x20MCP\x20layer\x20static\x20check\x2016)]');const d=[['01','All\x20identifiers\x20exist\x20in\x20the\x20table',a['constraints']['pitfall_01_identifiers_in_table']],['02','Comparison\x20node\x20types\x20are\x20compatible',a['constraints']['pitfall_02_type_compatibility']],['03','Query\x20instruction\x20ID\x20and\x20parameter\x20count\x20are\x20correct',a['constraints']['pitfall_03_query_instruction_valid']],['04','convert_witness\x20type\x20is\x20correct',a['constraints']['pitfall_04_witness_correct']],['05','Time-lock\x20tests\x20use\x20small\x20values',a['constraints']['pitfall_05_time_lock_test_safe']],['06','Old\x20Guard\x20exported\x20before\x20iteration',a['constraints']['pitfall_06_exported_before_recreate']],['07','root\x20returns\x20Bool',a['constraints']['pitfall_07_root_returns_bool']],['08','rely\x20dependency\x20rep=true',a['constraints']['pitfall_08_rely_rep_true']],['09','voting_guard\x20GuardIdentifier\x20numeric',a['constraints']['pitfall_09_voting_weight_numeric']],['10','Arbitration\x20not\x20paused',a['constraints']['pitfall_10_arbitration_not_paused']]],e=[['R1','Guard\x20immutable=true\x20to\x20verify',a['constraints']['runtime_01_guard_immutable']],['R2','submission\x20type\x20bytes\x20match\x20table\x20declaration',a['constraints']['runtime_02_submission_type_match']],['R3','b_submission=true\x20entry\x20found\x20in\x20submission',a['constraints']['runtime_03_submission_complete']],['R4','submission\x20total\x20bytes\x20≤\x20'+MAX_SUBMISSION_SIZE_PASSPORT,a['constraints']['runtime_04_submission_size']],['R5','witness\x20derivation\x20source\x20object\x20has\x20related\x20field',a['constraints']['runtime_05_witness_source_valid']],['R6','query\x20target\x20object\x20exists\x20and\x20types\x20match',a['constraints']['runtime_06_query_object_valid']]];b['push']('\x20\x20Creation-time\x20constraints:'),d['forEach'](([f,g,h])=>{b['push']('\x20\x20'+(h?'✓':'✗')+'\x20['+f+']\x20'+g);}),b['push']('\x20\x20Runtime\x20constraints:'),e['forEach'](([f,g,h])=>{b['push']('\x20\x20'+(h?'✓':'✗')+'\x20['+f+']\x20'+g);}),b['push']('');}b['push']('[Risk\x20warnings]'),b['push']('\x20\x20⚠\x20Guard\x20cannot\x20be\x20modified\x20or\x20deleted\x20after\x20creation\x20(CREATE-only)'),b['push']('\x20\x20⚠\x20On-chain\x20execution\x20will\x20consume\x20gas'),b['push']('\x20\x20⚠\x20To\x20modify\x20after\x20creation:\x20export\x20→\x20edit\x20→\x20create\x20new\x20→\x20rebind'),b['push'](''),b['push']('[Test\x20plan\x20(gen_passport\x20static\x20test)]'),b['push']('\x20\x20Expected\x20pass\x20scenario:\x20submit\x20data\x20meeting\x20conditions\x20→\x20PASS\x20→\x20Passport\x20generated'),b['push']('\x20\x20Expected\x20fail\x20scenario:\x20submit\x20data\x20not\x20meeting\x20conditions\x20→\x20FAIL\x20→\x20verify\x20logic\x20direction'),b['push'](''),b['push']('[Post-creation\x20actions\x20(important)]'),b['push']('\x20\x201.\x20Use\x20guard2file\x20to\x20export\x20the\x20Guard\x20backup\x20(JSON\x20file)\x20for\x20later\x20rebuild\x20or\x20migration'),b['push']('\x20\x202.\x20Record\x20the\x20Guard\x20object\x20ID\x20for\x20subsequent\x20binding\x20and\x20invocation'),b['push']('\x20\x203.\x20If\x20the\x20Guard\x20binds\x20to\x20a\x20Host\x20Object,\x20ensure\x20the\x20Host\x20Object\x20is\x20published\x20after\x20Guard\x20creation'),b['push']('\x20\x204.\x20Verify\x20the\x20Guard\x20logic\x20direction\x20via\x20gen_passport\x20static\x20test'),b['push']('');const c=creationChecksForReadiness(a);return b['push']('[Creation\x20readiness\x20signal]'),b['push']('\x20\x20Puzzle\x20completeness:\x20'+(c?'✓\x20All\x20passed\x20—\x20ready\x20for\x20on-chain\x20CREATE':'✗\x20Some\x20items\x20not\x20passed\x20—\x20please\x20fix\x20first')),b['push'](''),b['push']('═══════════════════════════════════════════════════════'),b['push']('\x20\x20Please\x20review\x20the\x20Guard\x20semantic\x20confirmation\x20report\x20above'),b['push']('\x20\x20After\x20confirming\x20no\x20issues,\x20reply\x20\x22confirm\x20creation\x22\x20to\x20execute\x20on-chain\x20CREATE'),b['push']('\x20\x20If\x20modifications\x20are\x20needed,\x20please\x20point\x20out\x20the\x20parts\x20to\x20adjust'),b['push']('═══════════════════════════════════════════════════════'),b['join']('\x0a');}function creationChecksForReadiness(a){if(!a['intent']||!a['binding']||!a['data_sources']||!a['logic']||!a['constraints'])return![];const b=a['constraints'],d=b['pitfall_01_identifiers_in_table']&&b['pitfall_02_type_compatibility']&&b['pitfall_03_query_instruction_valid']&&b['pitfall_04_witness_correct']&&b['pitfall_05_time_lock_test_safe']&&b['pitfall_06_exported_before_recreate']&&b['pitfall_07_root_returns_bool']&&b['pitfall_08_rely_rep_true']&&b['pitfall_09_voting_weight_numeric']&&b['pitfall_10_arbitration_not_paused'],e=b['runtime_01_guard_immutable']&&b['runtime_02_submission_type_match']&&b['runtime_03_submission_complete']&&b['runtime_04_submission_size']&&b['runtime_05_witness_source_valid']&&b['runtime_06_query_object_valid'];return d&&e;}function printDataSources(a,b){b['on_chain_constants']['length']>0x0&&(a['push']('\x20\x20Type1\x20—\x20On-chain\x20constant\x20objects\x20(OnChainConstant,\x20b_submission=false):'),b['on_chain_constants']['forEach'](c=>{const d=c['is_system_address']?'\x20[system\x20address]':'';a['push']('\x20\x20\x20\x20[id='+c['identifier']+']\x20'+c['object_type']+'('+c['object_address']+')'+d+'\x20—\x20'+c['name']);})),b['witness_derived']['length']>0x0&&(a['push']('\x20\x20Type2\x20—\x20Witness-derived\x20objects\x20(WitnessDerived,\x20convert_witness\x20100-109):'),b['witness_derived']['forEach'](c=>{const d=c['source_b_submission']?'submitted':'constant';a['push']('\x20\x20\x20\x20[id='+c['identifier']+']\x20'+c['source_type']+'('+d+')\x20→\x20'+c['target_type']+'\x20via\x20'+c['witness_name']+'('+c['witness_type']+')\x20—\x20'+c['name']);})),b['submitted_objects']['length']>0x0&&(a['push']('\x20\x20Type3\x20—\x20Submitted\x20objects\x20(SubmittedObject,\x20b_submission=true):'),b['submitted_objects']['forEach'](c=>{a['push']('\x20\x20\x20\x20[id='+c['identifier']+']\x20'+c['expected_object_type']+'('+c['value_type']+')\x20—\x20'+c['name']),c['binding_constraint']&&a['push']('\x20\x20\x20\x20\x20\x20Constraint:\x20'+c['binding_constraint']);})),b['submitted_values']['length']>0x0&&(a['push']('\x20\x20Type3\x20—\x20Submitted\x20values\x20(SubmittedValue,\x20b_submission=true,\x20scalar):'),b['submitted_values']['forEach'](c=>{a['push']('\x20\x20\x20\x20[id='+c['identifier']+']\x20'+c['value_type']+'\x20—\x20'+c['name']),c['binding_constraint']&&a['push']('\x20\x20\x20\x20\x20\x20Constraint:\x20'+c['binding_constraint']);})),b['system_contexts']['length']>0x0&&(a['push']('\x20\x20Type4\x20—\x20System\x20contexts\x20(SystemContext,\x20not\x20in\x20table):'),b['system_contexts']['forEach'](c=>{a['push']('\x20\x20\x20\x20context('+c['context_type']+')\x20—\x20'+c['usage']);})),b['on_chain_constants']['length']===0x0&&b['witness_derived']['length']===0x0&&b['submitted_objects']['length']===0x0&&b['submitted_values']['length']===0x0&&b['system_contexts']['length']===0x0&&a['push']('\x20\x20(No\x20data\x20sources\x20declared)');}function printLogicTree(a,b,c){const d='\x20\x20'['repeat'](c+0x1);b['forEach']((e,f)=>{const g=f===b['length']-0x1?'└──\x20':'├──\x20';a['push'](''+d+g+e['node_type']+'\x20('+e['return_type']+')\x20—\x20'+e['description']),e['references_identifier']!==undefined&&a['push'](d+'\x20\x20\x20\x20→\x20table['+e['references_identifier']+']'),e['query']&&a['push'](d+'\x20\x20\x20\x20→\x20query('+e['query']['query_id']+':\x20'+e['query']['query_name']+')'),e['children']&&printLogicTree(a,e['children'],c+0x1);});}export function initPuzzleFromIntent(a){return{'current_round':'R1','intent':{'action':a['action']??'custom','rule_sentence':a['rule_sentence']??'','failure_conditions':a['failure_conditions']??[]}};}export function inferBindingFromAction(a){const b={'buy':{'host_object':'Service','binding_field':'buy_guard'},'forward':{'host_object':'Machine','binding_field':'Forward.guard'},'allocate':{'host_object':'Service','binding_field':'order_allocators'},'claim_reward':{'host_object':'Reward','binding_field':'guard'},'vote':{'host_object':'Arbitration','binding_field':'voting_guard'},'dispute':{'host_object':'Arbitration','binding_field':'usage_guard'},'write_repository':{'host_object':'Repository','binding_field':'write_guard'},'submit_progress':{'host_object':'Progress','binding_field':'submission'},'gen_passport':{'host_object':'Standalone','binding_field':'none'},'custom':{}};return b[a]??{};}export function emptyDataSources(){return{'on_chain_constants':[],'witness_derived':[],'submitted_objects':[],'submitted_values':[],'system_contexts':[]};}export const WITNESS_NAME_MAP={0x64:{'name':'TypeOrderProgress','source':'Order','target':'Progress'},0x65:{'name':'TypeOrderMachine','source':'Order','target':'Machine'},0x66:{'name':'TypeOrderService','source':'Order','target':'Service'},0x67:{'name':'TypeProgressMachine','source':'Progress','target':'Machine'},0x68:{'name':'TypeArbOrder','source':'Arb','target':'Order'},0x69:{'name':'TypeArbArbitration','source':'Arb','target':'Arbitration'},0x6a:{'name':'TypeArbProgress','source':'Arb','target':'Progress'},0x6b:{'name':'TypeArbMachine','source':'Arb','target':'Machine'},0x6c:{'name':'TypeArbService','source':'Arb','target':'Service'},0x6d:{'name':'TypeOrderAllocation','source':'Order','target':'Allocation'}};export function getWitnessInfo(a){return WITNESS_NAME_MAP[a];}function traverseRoot(a,b){if(!a)return;a['type']==='identifier'&&typeof a['identifier']==='number'&&b['referencedIdentifiers']['add'](a['identifier']);a['type']==='context'&&a['context']&&b['contexts']['add'](a['context']);if(a['type']==='query'&&a['object']){const c=a['object']['identifier'];b['referencedIdentifiers']['add'](c);const d=a['object']['convert_witness'];typeof d==='number'&&d>=0x64&&d<=0x6d&&b['witnessCodes']['push']({'code':d,'objectIdentifier':c});b['queries']['push']({'query':a['query']??'','objectIdentifier':c,'convertWitness':d,'parametersCount':a['parameters']?.['length']??0x0});if(a['parameters'])for(const e of a['parameters']){traverseRoot(e,b);}}if(a['nodes'])for(const f of a['nodes']){traverseRoot(f,b);}a['node']&&traverseRoot(a['node'],b),a['nodeLeft']&&traverseRoot(a['nodeLeft'],b),a['nodeRight']&&traverseRoot(a['nodeRight'],b);}function buildLogicTree(a){if(!a)return undefined;const b={'node_type':a['type'],'return_type':inferNodeType(a['type']),'description':describeNode(a)};a['type']==='identifier'&&typeof a['identifier']==='number'&&(b['references_identifier']=a['identifier']);if(a['type']==='query'&&a['object']){b['query']={'query_id':typeof a['query']==='number'?a['query']:0x0,'query_name':typeof a['query']==='string'?a['query']:String(a['query']??''),'object_type':'','parameters':[],'return_type':'','purpose':''};if(a['object']['convert_witness']){const c=getWitnessInfo(a['object']['convert_witness']);c&&(b['query']['witness']={'witness_type':a['object']['convert_witness'],'witness_name':c['name'],'source_type':c['source'],'target_type':c['target'],'scenario':''});}}if(a['nodes']){const d=a['nodes']['map'](e=>buildLogicTree(e))['filter'](e=>e!==undefined);d['length']>0x0&&(b['children']=d);}if(a['node']){const e=buildLogicTree(a['node']);e&&(b['children']=[e]);}if(a['nodeLeft']){const f=buildLogicTree(a['nodeLeft']);f&&(b['children']=[...b['children']??[],f]);}if(a['nodeRight']){const g=buildLogicTree(a['nodeRight']);g&&(b['children']=[...b['children']??[],g]);}return b;}function inferNodeType(a){const b=['logic_equal','logic_not','logic_and','logic_or','logic_as_u256_greater','logic_as_u256_lesser','logic_as_u256_equal','logic_as_u256_greater_or_equal','logic_as_u256_lesser_or_equal','logic_string_contains','logic_string_nocase_contains','logic_string_nocase_equal','calc_string_contains','calc_string_nocase_contains','calc_string_nocase_equal','vec_contains_bool','vec_contains_address','vec_contains_string','vec_contains_string_nocase','vec_contains_number','query_reward_record_exists','query_order_named_operator_member','query_repository_data_has'];if(b['includes'](a))return'Bool';const c=['calc_string_length','calc_string_indexof','calc_string_nocase_indexof','vec_length','vec_indexof_bool','vec_indexof_address','vec_indexof_string','vec_indexof_string_nocase','vec_indexof_number','time_until','query_reward_record_count','query_progress_history_session_count','query_progress_history_session_forward_count','query_progress_history_session_forward_retained_submission_count','query_repository_data_count_where'];if(c['includes'](a))return'U64';const d=['calc_number_add','calc_number_subtract','calc_number_multiply','calc_number_divide','calc_number_mod','convert_address_number','convert_string_number','query_repository_data_sum_where','query_repository_data_sum_where_bound'];if(d['includes'](a))return'U256';const e={'query_repository_data_find_where':'VecAddress','query_repository_data_keys_where':'VecString','query_repository_policies_keys':'VecString','query_repository_data':'VecU8'};if(e[a])return e[a];const f=['convert_number_address'];if(f['includes'](a))return'Address';const g=['convert_number_string'];if(g['includes'](a))return'String';const h=['convert_safe_u8','convert_safe_u16','convert_safe_u32','convert_safe_u64','convert_safe_u128','convert_safe_u256'];if(h['includes'](a))return a['replace']('convert_safe_','U');if(a==='value_type')return'U8';if(a==='query')return'query_defined';if(a==='identifier')return'table_defined';if(a==='context')return'context_defined';return'unknown';}function describeNode(a){switch(a['type']){case'identifier':return'Reference\x20to\x20table['+(a['identifier']??'?')+']';case'context':return'System\x20context:\x20'+(a['context']??'?');case'query':return'Query\x20instruction\x20'+(a['query']??'?')+'\x20(target:\x20table['+(a['object']?.['identifier']??'?')+'])';case'logic_equal':return'Equality\x20comparison\x20(==)';case'logic_not':return'Logical\x20NOT\x20(!)';case'logic_and':return'Logical\x20AND';case'logic_or':return'Logical\x20OR';case'logic_as_u256_greater':return'Numeric\x20greater\x20than\x20(>)';case'logic_as_u256_lesser':return'Numeric\x20less\x20than\x20(<)';case'logic_as_u256_equal':return'Numeric\x20equality\x20(==)';case'logic_as_u256_greater_or_equal':return'Numeric\x20greater\x20than\x20or\x20equal\x20(>=)';case'logic_as_u256_lesser_or_equal':return'Numeric\x20less\x20than\x20or\x20equal\x20(<=)';case'calc_number_add':return'Numeric\x20addition\x20(+)';case'calc_number_subtract':return'Numeric\x20subtraction\x20(-)';case'time_until':return'Saturating\x20time\x20delta:\x20max(0,\x20target\x20-\x20now)\x20in\x20ms';case'calc_number_multiply':return'Numeric\x20multiplication\x20(*)';case'calc_number_divide':return'Numeric\x20division\x20(/)';case'calc_number_mod':return'Numeric\x20modulo\x20(%)';case'vec_contains_address':return'Whitelist\x20check\x20(vec_contains_address)';case'vec_length':return'Vector\x20length';case'convert_safe_u64':return'Safe\x20conversion\x20to\x20U64';default:return a['type'];}}function deriveConstraints(a,b,c,d){const e=Array['from'](d['referencedIdentifiers'])['every'](x=>a['some'](y=>y['identifier']===x)),f=b!==undefined,g=!![],h=d['witnessCodes']['every'](x=>x['code']>=0x64&&x['code']<=0x6d),i=!![],j=!![],k=b!==undefined,l=c?c['guards']['length']<=0x4:!![],m=!![],n=!![],o=!![],p=!![],q=!![],r={'Address':0x20,'address':0x20,'U8':0x1,'U64':0x8,'U128':0x10,'U256':0x20,'Bool':0x1},s=a['filter'](x=>x['b_submission']),t=s['reduce']((x,y)=>{const z=y['value_type']??'';return x+(r[z]??MAX_SUBMISSION_SIZE_PASSPORT);},0x0),u=t<=MAX_SUBMISSION_SIZE_PASSPORT,v=!![],w=!![];return{'pitfall_01_identifiers_in_table':e,'pitfall_02_type_compatibility':f,'pitfall_03_query_instruction_valid':g,'pitfall_04_witness_correct':h,'pitfall_05_time_lock_test_safe':i,'pitfall_06_exported_before_recreate':j,'pitfall_07_root_returns_bool':k,'pitfall_08_rely_rep_true':l,'pitfall_09_voting_weight_numeric':m,'pitfall_10_arbitration_not_paused':n,'runtime_01_guard_immutable':o,'runtime_02_submission_type_match':p,'runtime_03_submission_complete':q,'runtime_04_submission_size':u,'runtime_05_witness_source_valid':v,'runtime_06_query_object_valid':w};}export function derivePuzzleFromCallData(a){const b=a['table']??[],c=a['root'],d=a['rely'],e=a['binding_hint'],f={'referencedIdentifiers':new Set(),'queries':[],'contexts':new Set(),'witnessCodes':[]};c&&traverseRoot(c,f);let g;e&&(g={'action':e['action'],'rule_sentence':e['rule_sentence']??'','failure_conditions':e['failure_conditions']??[]});let h;e&&(h={'host_object':e['host_object'],'binding_field':e['binding_field'],'circular_reference':e['circular_reference']??![],'host_object_state':'unknown'});const i=new Map();for(const t of f['witnessCodes']){i['set'](t['objectIdentifier'],t['code']);}const j=[],k=[],l=[],m=[];for(const u of b){const v=f['referencedIdentifiers']['has'](u['identifier']),x=i['get'](u['identifier']);if(x!==undefined){const y=getWitnessInfo(x);if(y){k['push']({'identifier':u['identifier'],'source_type':y['source'],'witness_type':x,'witness_name':y['name'],'target_type':y['target'],'source_b_submission':u['b_submission'],'name':u['name']||y['source']+'→'+y['target']+'\x20via\x20'+y['name']});continue;}}if(!u['b_submission']){const z=typeof u['value']==='string'?u['value']['toLowerCase']():'',A=z in WOW_SYSTEM_SINGLETONS||Object['values'](WOW_SYSTEM_SINGLETONS)['includes'](z);j['push']({'identifier':u['identifier'],'object_address':typeof u['value']==='string'?u['value']:String(u['value']??''),'object_type':u['object_type']??'','name':u['name']||'constant\x20#'+u['identifier'],'is_system_address':A});}else{const B=typeof u['value_type']==='string'?u['value_type']['toLowerCase']():String(u['value_type']);B==='address'?l['push']({'identifier':u['identifier'],'expected_object_type':u['object_type']??'','value_type':'Address','name':u['name']||'submitted\x20object\x20#'+u['identifier'],'binding_constraint':u['object_type']?'must\x20be\x20an\x20on-chain\x20object\x20address\x20of\x20type\x20'+u['object_type']:'must\x20be\x20a\x20valid\x20on-chain\x20object\x20address'}):m['push']({'identifier':u['identifier'],'value_type':typeof u['value_type']==='string'?u['value_type']:String(u['value_type']),'name':u['name']||'submitted\x20value\x20#'+u['identifier'],'binding_constraint':'value\x20type\x20must\x20be\x20'+u['value_type']});}}const n=[];for(const C of f['contexts']){const D={'Signer':'Current\x20transaction\x20signer\x20address\x20verification','Clock':'On-chain\x20timestamp\x20(used\x20for\x20time-lock/time-window)','Guard':'Guard\x20self\x20object\x20ID\x20self-reference'};n['push']({'context_type':C,'usage':D[C]??''});}const o={'on_chain_constants':j,'witness_derived':k,'submitted_objects':l,'submitted_values':m,'system_contexts':n},p=f['queries']['map'](E=>{const F=E['convertWitness']!==undefined?getWitnessInfo(E['convertWitness']):undefined;return{'query_id':typeof E['query']==='number'?E['query']:0x0,'query_name':typeof E['query']==='string'?E['query']:String(E['query']),'object_type':'','parameters':[],'return_type':'','witness':F?{'witness_type':E['convertWitness'],'witness_name':F['name'],'source_type':F['source'],'target_type':F['target'],'scenario':''}:undefined,'purpose':''};});let q;if(c){const E=buildLogicTree(c);if(E){E['return_type']='Bool';let F;d&&d['guards']['length']>0x0&&(F={'guards':d['guards'],'logic_or':d['logic_or']??![],'rep_verified':d['guards']['map'](()=>!![])}),q={'root':E,'rely':F};}}const r=deriveConstraints(b,c,d,f),s={'current_round':'R7','intent':g,'binding':h,'data_sources':o,'queries':p,'logic':q,'constraints':r};return s;}export function getPuzzleStatusBooleans(a){const b=checkPuzzleCompleteness(a);return{'intent':b['dimensions']['intent'],'binding':b['dimensions']['binding'],'data':b['dimensions']['data_sources'],'query':b['dimensions']['query'],'logic':b['dimensions']['logic'],'constraints':b['dimensions']['constraints']};}export function getPendingQuestions(a){const b=checkPuzzleCompleteness(a);if(b['complete'])return[];return b['next_step']['questions'];}
|