@wowok/agent-mcp 3.4.3 → 3.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.build-stamp.json +3 -3
- package/dist/build-stamp.js +1 -0
- package/dist/chain-semantics/composition-truth.js +1 -1
- package/dist/chain-semantics/eval-order.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/object-graph.js +1 -1
- package/dist/composition/audit.js +1 -1
- package/dist/composition/compile.js +1 -1
- package/dist/composition/emit-phases.js +1 -1
- package/dist/composition/generate.js +1 -1
- package/dist/composition/guard-fill.js +1 -1
- package/dist/composition/input-normalize.js +1 -1
- package/dist/composition/materialize.js +1 -1
- package/dist/composition/mode-gates.js +1 -1
- package/dist/composition/plan.js +1 -1
- package/dist/composition/product-card.js +1 -1
- package/dist/composition/shape-expand.js +1 -0
- package/dist/config/judgment.js +1 -1
- package/dist/config/template-params.js +1 -1
- package/dist/data/sync/cdc.js +1 -1
- package/dist/data/sync/graphql-source.js +1 -1
- package/dist/evaluation/engine.js +1 -1
- package/dist/experience/realtime-feedback.js +1 -1
- package/dist/graph/onchain/expand.js +1 -1
- package/dist/graph/onchain/exposure.js +1 -1
- package/dist/graph/onchain/sdk-batch.js +1 -1
- package/dist/harness/entry-ignite-selfheal.js +1 -0
- package/dist/harness/forward-leg-preflight.js +1 -0
- package/dist/harness/recover.js +1 -1
- package/dist/keeper/detectors.js +1 -1
- package/dist/knowledge/allocator-rail-verifier.js +1 -1
- package/dist/knowledge/arb-operation-face.js +1 -0
- package/dist/knowledge/arbitration-rail-verifier.js +1 -1
- package/dist/knowledge/arbitration-templates.js +1 -1
- package/dist/knowledge/audit-rules.d.ts +15 -0
- package/dist/knowledge/audit-rules.js +1 -1
- package/dist/knowledge/baselines/rules/alloc_audit.json.good +310 -0
- package/dist/knowledge/baselines/rules/allocation.json.good +568 -0
- package/dist/knowledge/baselines/rules/arb.json.good +174 -0
- package/dist/knowledge/baselines/rules/arbitration.json.good +393 -0
- package/dist/knowledge/baselines/rules/bridge.json.good +197 -0
- package/dist/knowledge/baselines/rules/contact.json.good +152 -0
- package/dist/knowledge/baselines/rules/demand.json.good +158 -0
- package/dist/knowledge/baselines/rules/graph.json.good +534 -0
- package/dist/knowledge/baselines/rules/guard.json +18 -5
- package/dist/knowledge/baselines/rules/guard.json.good +1192 -0
- package/dist/knowledge/baselines/rules/machine.json.good +734 -0
- package/dist/knowledge/baselines/rules/oracle.json +1 -1
- package/dist/knowledge/baselines/rules/oracle.json.good +120 -0
- package/dist/knowledge/baselines/rules/order.json.good +549 -0
- package/dist/knowledge/baselines/rules/payment.json.good +205 -0
- package/dist/knowledge/baselines/rules/permission.json.good +330 -0
- package/dist/knowledge/baselines/rules/personal.json.good +139 -0
- package/dist/knowledge/baselines/rules/plan.json +343 -1
- package/dist/knowledge/baselines/rules/plan.json.good +1187 -0
- package/dist/knowledge/baselines/rules/progress.json.good +364 -0
- package/dist/knowledge/baselines/rules/proof.json.good +158 -0
- package/dist/knowledge/baselines/rules/registrar.json.good +159 -0
- package/dist/knowledge/baselines/rules/repository.json.good +244 -0
- package/dist/knowledge/baselines/rules/resource.json.good +117 -0
- package/dist/knowledge/baselines/rules/reward.json +10 -10
- package/dist/knowledge/baselines/rules/reward.json.good +586 -0
- package/dist/knowledge/baselines/rules/service.json.good +595 -0
- package/dist/knowledge/baselines/rules/treasury.json.good +440 -0
- package/dist/knowledge/baselines/rules/util.json.good +101 -0
- package/dist/knowledge/builtin-templates.d.ts +13 -1
- package/dist/knowledge/builtin-templates.js +1 -1
- package/dist/knowledge/chain-query-registry.js +1 -1
- package/dist/knowledge/discount-threshold.js +1 -1
- package/dist/knowledge/fee-param-bindings.js +1 -1
- package/dist/knowledge/fund-layer.d.ts +2 -0
- package/dist/knowledge/fund-layer.js +1 -1
- package/dist/knowledge/getting-started.js +1 -1
- package/dist/knowledge/guard-binding-table.js +1 -1
- package/dist/knowledge/guard-binding-verifier.js +1 -1
- package/dist/knowledge/guard-create-preflight.js +1 -0
- package/dist/knowledge/guard-field-cognition.js +1 -1
- package/dist/knowledge/guard-host-context.js +1 -1
- package/dist/knowledge/guard-leg-eval.js +1 -0
- package/dist/knowledge/guard-node-gates.js +1 -1
- package/dist/knowledge/guard-puzzle.js +1 -1
- package/dist/knowledge/guard-quality.js +1 -0
- package/dist/knowledge/guard-render.js +1 -1
- package/dist/knowledge/guard-risk.js +1 -1
- package/dist/knowledge/guard-semantic-walk.js +1 -0
- package/dist/knowledge/guard-templates.d.ts +1 -0
- 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/jsonrpc-enum.js +1 -1
- package/dist/knowledge/param-schema.js +1 -1
- package/dist/knowledge/param-tiers.js +1 -1
- package/dist/knowledge/path-oracle/coverage.js +1 -1
- package/dist/knowledge/path-oracle/index.js +1 -1
- package/dist/knowledge/path-oracle/products/airbnb.js +1 -0
- package/dist/knowledge/path-oracle/products/algora.js +1 -0
- package/dist/knowledge/path-oracle/products/alibaba-1688.js +1 -0
- package/dist/knowledge/path-oracle/products/amazon.js +1 -0
- package/dist/knowledge/path-oracle/products/beatstars.js +1 -0
- package/dist/knowledge/path-oracle/products/booking-com.js +1 -0
- package/dist/knowledge/path-oracle/products/contra.js +1 -0
- package/dist/knowledge/path-oracle/products/costco.js +1 -0
- package/dist/knowledge/path-oracle/products/coursera.js +1 -0
- package/dist/knowledge/path-oracle/products/duoduo-maicai.js +1 -0
- package/dist/knowledge/path-oracle/products/etsy.js +1 -0
- package/dist/knowledge/path-oracle/products/food-delivery.js +1 -1
- package/dist/knowledge/path-oracle/products/gamefound.js +1 -0
- package/dist/knowledge/path-oracle/products/gofundme.js +1 -0
- package/dist/knowledge/path-oracle/products/hackerone.js +1 -0
- package/dist/knowledge/path-oracle/products/kickstarter.js +1 -0
- package/dist/knowledge/path-oracle/products/klook.js +1 -0
- package/dist/knowledge/path-oracle/products/ninety-nine-designs.js +1 -0
- package/dist/knowledge/path-oracle/products/onlyfans.js +1 -0
- package/dist/knowledge/path-oracle/products/patreon.js +1 -0
- package/dist/knowledge/path-oracle/products/pinduoduo-kuaituantuan.js +1 -0
- package/dist/knowledge/path-oracle/products/royalty-exchange.js +1 -0
- package/dist/knowledge/path-oracle/products/shansong.js +1 -0
- package/dist/knowledge/path-oracle/products/taobao-presale.js +1 -0
- package/dist/knowledge/path-oracle/products/upwork-catalog.js +1 -0
- package/dist/knowledge/path-oracle/products/upwork.js +1 -0
- package/dist/knowledge/path-oracle/products/yuanfudao.js +1 -0
- package/dist/knowledge/path-oracle/products/ziroom.js +1 -0
- package/dist/knowledge/pattern-resolutions.js +1 -1
- package/dist/knowledge/product-detail-source.js +1 -1
- package/dist/knowledge/product-doc-b5.js +1 -1
- package/dist/knowledge/product-doc-facets.js +1 -0
- package/dist/knowledge/projection.js +1 -1
- package/dist/knowledge/publish-gate.js +1 -1
- package/dist/knowledge/publish-surface-contract.js +1 -1
- package/dist/knowledge/recipient-constraint.d.ts +20 -0
- package/dist/knowledge/recipient-constraint.js +1 -1
- package/dist/knowledge/rule-declaration-types.d.ts +13 -0
- package/dist/knowledge/rule-declaration-types.js +1 -0
- package/dist/knowledge/rule-declarations.js +1 -0
- package/dist/knowledge/scenario-modes.d.ts +6 -0
- package/dist/knowledge/scenario-topology.js +1 -1
- package/dist/knowledge/template-loader.js +1 -1
- package/dist/knowledge/template-prose.js +1 -1
- package/dist/knowledge/template-registry.js +1 -1
- package/dist/knowledge/template-scanner.js +1 -1
- package/dist/knowledge/tools-reference.js +1 -1
- package/dist/monitor/MonitorLoop.js +1 -1
- package/dist/playbooks/service-build/business-puzzle.js +1 -1
- package/dist/playbooks/service-build/machine-panorama.js +1 -1
- package/dist/playbooks/service-build/merchant-guide.js +1 -1
- package/dist/playbooks/service-build/object-panorama.js +1 -1
- 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.js +1 -1
- package/dist/playbooks/service-build/service-quote.js +1 -1
- package/dist/review/index.js +1 -1
- package/dist/review/service.js +1 -1
- package/dist/safety/confirm-gate.js +1 -1
- package/dist/schema/benchmark-migration/index.d.ts +9 -0
- package/dist/schema/benchmark-migration/index.js +1 -1
- package/dist/schema/call/arbitration.d.ts +8 -0
- 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/handler.d.ts +2 -1
- package/dist/schema/call/handler.js +1 -1
- package/dist/schema/call/order.d.ts +10 -0
- package/dist/schema/call/permission-handler.js +1 -1
- package/dist/schema/call/permission.js +1 -1
- package/dist/schema/call/progress.d.ts +15 -0
- package/dist/schema/call/progress.js +1 -1
- package/dist/schema/call/receipt.d.ts +1 -0
- package/dist/schema/call/receipt.js +1 -1
- package/dist/schema/call/repository.d.ts +12 -0
- package/dist/schema/call/repository.js +1 -1
- package/dist/schema/call/reward.js +1 -1
- package/dist/schema/call/semantic.d.ts +1 -0
- package/dist/schema/call/semantic.js +1 -1
- package/dist/schema/call/service.d.ts +5 -3
- package/dist/schema/call/service.js +1 -1
- package/dist/schema/common/index.js +1 -1
- package/dist/schema/envelope-unify.js +1 -1
- package/dist/schema/goal/index.d.ts +23 -0
- package/dist/schema/goal/planning.js +1 -1
- package/dist/schema/industry-pack/index.d.ts +2 -2
- package/dist/schema/local/index.d.ts +20 -0
- package/dist/schema/local/index.js +1 -1
- package/dist/schema/local/wip.d.ts +4 -0
- package/dist/schema/local/wip.js +1 -1
- package/dist/schema/messenger/index.d.ts +5 -0
- package/dist/schema/messenger/index.js +1 -1
- package/dist/schema/operations.d.ts +944 -1
- package/dist/schema/operations.js +1 -1
- 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/workspace/index.d.ts +2 -2
- package/dist/schema-query-impl/index.js +1 -1
- package/dist/schemas/account_operation.schema.json +1 -257
- package/dist/schemas/ask_user.schema.json +1 -78
- package/dist/schemas/benchmark_migration_operation.schema.json +1 -626
- package/dist/schemas/bridge_operation.schema.json +1 -1069
- package/dist/schemas/config_operation.schema.json +1 -82
- package/dist/schemas/employee_operation.schema.json +1 -319
- package/dist/schemas/evaluation_operation.schema.json +1 -3932
- package/dist/schemas/goal_operation.schema.json +1 -1650
- package/dist/schemas/guard2file.schema.json +1 -137
- package/dist/schemas/index.json +1 -285
- package/dist/schemas/industry_pack_operation.schema.json +1 -582
- package/dist/schemas/intent_radar.schema.json +1 -155
- package/dist/schemas/keeper_operation.schema.json +1 -364
- package/dist/schemas/local_cache_operation.schema.json +1 -116
- package/dist/schemas/local_history_operation.schema.json +1 -105
- package/dist/schemas/local_info_operation.schema.json +1 -140
- package/dist/schemas/local_mark_operation.schema.json +1 -124
- package/dist/schemas/machineNode2file.schema.json +1 -137
- package/dist/schemas/messenger_operation.schema.json +1 -2068
- package/dist/schemas/monitor_events.schema.json +1 -87
- package/dist/schemas/monitor_subscription.schema.json +1 -327
- package/dist/schemas/onchain_events.schema.json +1 -207
- package/dist/schemas/onchain_operations.schema.json +1 -28699
- package/dist/schemas/onchain_operations_allocation.schema.json +1 -1376
- package/dist/schemas/onchain_operations_arbitration.schema.json +1 -1355
- package/dist/schemas/onchain_operations_contact.schema.json +1 -988
- package/dist/schemas/onchain_operations_demand.schema.json +1 -1146
- package/dist/schemas/onchain_operations_gen_passport.schema.json +1 -663
- package/dist/schemas/onchain_operations_gen_proof.schema.json +1 -180
- package/dist/schemas/onchain_operations_guard.schema.json +1 -8518
- package/dist/schemas/onchain_operations_machine.schema.json +1 -1879
- package/dist/schemas/onchain_operations_order.schema.json +1 -1121
- package/dist/schemas/onchain_operations_payment.schema.json +1 -316
- package/dist/schemas/onchain_operations_permission.schema.json +1 -1036
- package/dist/schemas/onchain_operations_personal.schema.json +1 -1463
- package/dist/schemas/onchain_operations_progress.schema.json +1 -1041
- package/dist/schemas/onchain_operations_proof.schema.json +1 -750
- package/dist/schemas/onchain_operations_repository.schema.json +1 -2046
- package/dist/schemas/onchain_operations_reward.schema.json +1 -1286
- package/dist/schemas/onchain_operations_service.schema.json +1 -2602
- package/dist/schemas/onchain_operations_treasury.schema.json +1 -1527
- package/dist/schemas/onchain_table_data.schema.json +1 -1146
- package/dist/schemas/permission_operation.schema.json +1 -43
- package/dist/schemas/persona_operation.schema.json +1 -10424
- package/dist/schemas/query_toolkit.schema.json +1 -1867
- package/dist/schemas/schema_query.schema.json +1 -116
- package/dist/schemas/service_clone_operation.schema.json +1 -49
- package/dist/schemas/settle_sweep.schema.json +1 -0
- package/dist/schemas/strategy_review_operation.schema.json +1 -66
- package/dist/schemas/verify_guard_dry_run.schema.json +1 -0
- package/dist/schemas/watch_operation.schema.json +1 -145
- package/dist/schemas/wip_file.schema.json +1 -299
- package/dist/schemas/workflow_operation.schema.json +1 -722
- package/dist/schemas/workspace_operation.schema.json +1 -104
- package/dist/schemas/wowok_buildin_info.schema.json +1 -758
- package/dist/tools/handlers/benchmark-migration.js +1 -1
- package/dist/tools/handlers/config.js +1 -1
- package/dist/tools/handlers/entry-edge-recipe.js +1 -1
- package/dist/tools/handlers/file-export.js +1 -1
- package/dist/tools/handlers/local.js +1 -1
- package/dist/tools/handlers/messenger.js +1 -1
- package/dist/tools/handlers/onchain.js +1 -1
- package/dist/tools/handlers/pending-settlement-recipe.js +1 -0
- package/dist/tools/handlers/plan-recovery.js +1 -0
- package/dist/tools/handlers/query.js +1 -1
- package/dist/tools/handlers/repository-row-id.js +1 -0
- package/dist/tools/handlers/review-chain.js +1 -1
- package/dist/tools/handlers/settle-sweep.js +1 -0
- package/dist/tools/handlers/stale-build-check.js +1 -1
- package/dist/tools/handlers/submission-assembly.js +1 -1
- package/dist/tools/handlers/verify-guard-dry-run.js +1 -0
- package/dist/tools/handlers/wip-upload.js +1 -1
- package/dist/tools/index.d.ts +3 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/move-fn-index.gen.js +1 -1
- package/dist/tools/publish-gate-state.js +1 -1
- package/dist/tools/registry/business.js +1 -1
- package/dist/tools/registry/onchain.js +1 -1
- package/dist/tools/shared.js +1 -1
- package/dist/tools/types.d.ts +1 -1
- package/dist/tools/wrap.js +1 -1
- package/package.json +11 -4
- package/dist/chain-semantics/composition-truth.d.ts +0 -102
- package/dist/chain-semantics/eval-order.d.ts +0 -17
- package/dist/chain-semantics/field-capability.d.ts +0 -11
- package/dist/chain-semantics/freeze-map.d.ts +0 -11
- package/dist/chain-semantics/fund-flow.d.ts +0 -10
- package/dist/chain-semantics/guard-verbs.d.ts +0 -22
- package/dist/chain-semantics/index.d.ts +0 -12
- package/dist/chain-semantics/object-graph.d.ts +0 -18
- package/dist/communication/evidence.d.ts +0 -6
- package/dist/communication/message-cursors.d.ts +0 -35
- package/dist/communication/proof-reuse.d.ts +0 -9
- package/dist/communication/wts-attestation.d.ts +0 -39
- package/dist/composition/audit.d.ts +0 -15
- package/dist/composition/blueprint-view.d.ts +0 -63
- package/dist/composition/compile.d.ts +0 -83
- package/dist/composition/emit-phases.d.ts +0 -234
- package/dist/composition/generate.d.ts +0 -40
- package/dist/composition/guard-fill.d.ts +0 -52
- package/dist/composition/inflight.d.ts +0 -86
- package/dist/composition/input-normalize.d.ts +0 -15
- package/dist/composition/materialize.d.ts +0 -78
- package/dist/composition/mode-gates.d.ts +0 -35
- package/dist/composition/param-disclosure.d.ts +0 -61
- package/dist/composition/plan-retry-ledger.d.ts +0 -37
- package/dist/composition/plan.d.ts +0 -121
- package/dist/composition/product-card.d.ts +0 -94
- package/dist/composition/reflux.d.ts +0 -28
- package/dist/composition/supply-chain-emit.d.ts +0 -46
- package/dist/config/config-audit.spec.d.ts +0 -1
- package/dist/config/config-audit.spec.js +0 -1
- package/dist/config/config-warnings.d.ts +0 -2
- package/dist/config/index.d.ts +0 -4
- package/dist/config/judgment.spec.d.ts +0 -1
- package/dist/config/judgment.spec.js +0 -1
- package/dist/config/match-policy-file.d.ts +0 -34
- package/dist/config/match-policy-file.spec.d.ts +0 -1
- package/dist/config/match-policy-file.spec.js +0 -1
- package/dist/config/rule-engine.spec.d.ts +0 -1
- package/dist/config/rule-engine.spec.js +0 -1
- package/dist/config/runtime.d.ts +0 -29
- package/dist/config/store-policy.d.ts +0 -14
- package/dist/config/store-policy.spec.d.ts +0 -1
- package/dist/config/store-policy.spec.js +0 -1
- package/dist/config/template-params.d.ts +0 -42
- package/dist/config/template-params.spec.d.ts +0 -1
- package/dist/config/template-params.spec.js +0 -1
- package/dist/customer/account-events.d.ts +0 -32
- package/dist/data/api/api.spec.d.ts +0 -1
- package/dist/data/api/api.spec.js +0 -1
- package/dist/data/api/cli.d.ts +0 -1
- package/dist/data/api/head.d.ts +0 -16
- package/dist/data/api/head.spec.d.ts +0 -1
- package/dist/data/api/head.spec.js +0 -1
- package/dist/data/api/index.d.ts +0 -2
- package/dist/data/api/match.d.ts +0 -69
- package/dist/data/api/match.spec.d.ts +0 -1
- package/dist/data/api/match.spec.js +0 -1
- package/dist/data/api/server.d.ts +0 -13
- package/dist/data/projection/cli.d.ts +0 -1
- package/dist/data/projection/edges.d.ts +0 -8
- package/dist/data/projection/edges.spec.d.ts +0 -1
- package/dist/data/projection/edges.spec.js +0 -1
- package/dist/data/projection/facets.d.ts +0 -18
- package/dist/data/projection/facets.spec.d.ts +0 -1
- package/dist/data/projection/facets.spec.js +0 -1
- package/dist/data/projection/facts.d.ts +0 -40
- package/dist/data/projection/index.d.ts +0 -6
- package/dist/data/projection/project.d.ts +0 -10
- package/dist/data/projection/projection.spec.d.ts +0 -1
- package/dist/data/projection/projection.spec.js +0 -1
- package/dist/data/projection/schema.d.ts +0 -1
- package/dist/data/projection/store.d.ts +0 -51
- package/dist/data/projection/types.d.ts +0 -169
- package/dist/data/sync/cdc.d.ts +0 -33
- package/dist/data/sync/cdc.spec.d.ts +0 -1
- package/dist/data/sync/cdc.spec.js +0 -1
- package/dist/data/sync/graphql-source.d.ts +0 -16
- package/dist/data/sync/index.d.ts +0 -5
- package/dist/data/sync/reconciler.d.ts +0 -14
- package/dist/data/sync/reconciler.spec.d.ts +0 -1
- package/dist/data/sync/reconciler.spec.js +0 -1
- package/dist/data/sync/schema.d.ts +0 -1
- package/dist/data/sync/store.d.ts +0 -24
- package/dist/data/sync/sync.spec.d.ts +0 -1
- package/dist/data/sync/sync.spec.js +0 -1
- package/dist/data/sync/synchronizer.d.ts +0 -10
- package/dist/data/sync/types.d.ts +0 -164
- package/dist/evaluation/acceptance.d.ts +0 -33
- package/dist/evaluation/architecture.spec.d.ts +0 -1
- package/dist/evaluation/architecture.spec.js +0 -1
- package/dist/evaluation/builtins/arbitration-score.d.ts +0 -42
- package/dist/evaluation/builtins/demand-match.d.ts +0 -16
- package/dist/evaluation/builtins/graph-service.spec.d.ts +0 -1
- package/dist/evaluation/builtins/graph-service.spec.js +0 -1
- package/dist/evaluation/builtins/index.d.ts +0 -4
- package/dist/evaluation/builtins/purity.spec.d.ts +0 -1
- package/dist/evaluation/builtins/purity.spec.js +0 -1
- package/dist/evaluation/composer.d.ts +0 -38
- package/dist/evaluation/facets/catalog.d.ts +0 -19
- package/dist/evaluation/gap.d.ts +0 -2
- package/dist/evaluation/guard-scan.d.ts +0 -10
- package/dist/evaluation/index.d.ts +0 -14
- package/dist/evaluation/injection.d.ts +0 -6
- package/dist/evaluation/location-match.d.ts +0 -42
- package/dist/evaluation/match-operation.d.ts +0 -23
- package/dist/evaluation/match-policy-resolver.d.ts +0 -9
- package/dist/evaluation/match-policy.spec.d.ts +0 -1
- package/dist/evaluation/match-policy.spec.js +0 -1
- package/dist/evaluation/path-reasoning.d.ts +0 -37
- package/dist/evaluation/standards.d.ts +0 -11
- package/dist/evaluation/standards.spec.d.ts +0 -1
- package/dist/evaluation/standards.spec.js +0 -1
- package/dist/evaluation/structured-lines.d.ts +0 -8
- package/dist/evaluation/user-injection.d.ts +0 -6
- package/dist/experience/experience-reuse.d.ts +0 -10
- package/dist/experience/index.d.ts +0 -7
- package/dist/experience/persistence-config.d.ts +0 -6
- package/dist/experience/persistence.d.ts +0 -21
- package/dist/experience/realtime-feedback.d.ts +0 -5
- package/dist/experience/user-profile.d.ts +0 -25
- package/dist/extensions/capability.d.ts +0 -91
- package/dist/extensions/industry-audit.spec.d.ts +0 -1
- package/dist/extensions/industry-audit.spec.js +0 -1
- package/dist/goal/GoalClassifier.d.ts +0 -17
- package/dist/goal/GoalEngine.d.ts +0 -175
- package/dist/goal/GoalStore.d.ts +0 -27
- package/dist/goal/next-steps.d.ts +0 -12
- package/dist/goal/plan-approval.d.ts +0 -5
- package/dist/goal/pursue.d.ts +0 -18
- package/dist/graph/base.d.ts +0 -8
- package/dist/graph/onchain/analyze.d.ts +0 -59
- package/dist/graph/onchain/analyze.spec.d.ts +0 -1
- package/dist/graph/onchain/analyze.spec.js +0 -1
- package/dist/graph/onchain/anti-cheat.d.ts +0 -69
- package/dist/graph/onchain/anti-cheat.spec.d.ts +0 -1
- package/dist/graph/onchain/anti-cheat.spec.js +0 -1
- package/dist/graph/onchain/dataplane.d.ts +0 -44
- package/dist/graph/onchain/edge-batch.spec.d.ts +0 -1
- package/dist/graph/onchain/edge-batch.spec.js +0 -1
- package/dist/graph/onchain/edge-schema.d.ts +0 -69
- package/dist/graph/onchain/entity-profile.spec.d.ts +0 -1
- package/dist/graph/onchain/entity-profile.spec.js +0 -1
- package/dist/graph/onchain/event-history.spec.d.ts +0 -1
- package/dist/graph/onchain/event-history.spec.js +0 -1
- package/dist/graph/onchain/expand.d.ts +0 -4
- package/dist/graph/onchain/exploration.d.ts +0 -28
- package/dist/graph/onchain/exploration.spec.d.ts +0 -1
- package/dist/graph/onchain/exploration.spec.js +0 -1
- package/dist/graph/onchain/exposure.d.ts +0 -18
- package/dist/graph/onchain/exposure.spec.d.ts +0 -1
- package/dist/graph/onchain/exposure.spec.js +0 -1
- package/dist/graph/onchain/extract-deep.spec.d.ts +0 -1
- package/dist/graph/onchain/extract-deep.spec.js +0 -1
- package/dist/graph/onchain/extract.d.ts +0 -29
- package/dist/graph/onchain/facet-projection.d.ts +0 -99
- package/dist/graph/onchain/facet-projection.spec.d.ts +0 -1
- package/dist/graph/onchain/facet-projection.spec.js +0 -1
- package/dist/graph/onchain/facts.spec.d.ts +0 -1
- package/dist/graph/onchain/facts.spec.js +0 -1
- package/dist/graph/onchain/field-manifest.d.ts +0 -29
- package/dist/graph/onchain/field-manifest.spec.d.ts +0 -1
- package/dist/graph/onchain/field-manifest.spec.js +0 -1
- package/dist/graph/onchain/fixtures.d.ts +0 -80
- package/dist/graph/onchain/fixtures.spec.d.ts +0 -1
- package/dist/graph/onchain/fixtures.spec.js +0 -1
- package/dist/graph/onchain/graph-policy.spec.d.ts +0 -1
- package/dist/graph/onchain/graph-policy.spec.js +0 -1
- package/dist/graph/onchain/index.d.ts +0 -29
- package/dist/graph/onchain/interest.d.ts +0 -10
- package/dist/graph/onchain/interest.spec.d.ts +0 -1
- package/dist/graph/onchain/interest.spec.js +0 -1
- package/dist/graph/onchain/label-lint.spec.d.ts +0 -1
- package/dist/graph/onchain/label-lint.spec.js +0 -1
- package/dist/graph/onchain/names.d.ts +0 -23
- package/dist/graph/onchain/names.spec.d.ts +0 -1
- package/dist/graph/onchain/names.spec.js +0 -1
- package/dist/graph/onchain/object-held-receipts.d.ts +0 -20
- package/dist/graph/onchain/object-held-receipts.spec.d.ts +0 -1
- package/dist/graph/onchain/object-held-receipts.spec.js +0 -1
- package/dist/graph/onchain/onchain.spec.d.ts +0 -1
- package/dist/graph/onchain/onchain.spec.js +0 -1
- package/dist/graph/onchain/policy.d.ts +0 -8
- package/dist/graph/onchain/project-relationship.d.ts +0 -3
- package/dist/graph/onchain/proposal-graph.d.ts +0 -11
- package/dist/graph/onchain/proposal-graph.spec.d.ts +0 -1
- package/dist/graph/onchain/proposal-graph.spec.js +0 -1
- package/dist/graph/onchain/sdk-batch.d.ts +0 -129
- package/dist/graph/onchain/sdk-dataplane.d.ts +0 -44
- package/dist/graph/onchain/strategy.spec.d.ts +0 -1
- package/dist/graph/onchain/strategy.spec.js +0 -1
- package/dist/graph/onchain/synthesis.d.ts +0 -20
- package/dist/graph/onchain/synthesis.spec.d.ts +0 -1
- package/dist/graph/onchain/synthesis.spec.js +0 -1
- package/dist/graph/onchain/table-ledger.spec.d.ts +0 -1
- package/dist/graph/onchain/table-ledger.spec.js +0 -1
- package/dist/graph/onchain/viewport.d.ts +0 -6
- package/dist/harness/auto-escalation.d.ts +0 -15
- package/dist/intent/enrich.d.ts +0 -1
- package/dist/intent/index.d.ts +0 -23
- package/dist/intent/matcher.d.ts +0 -2
- package/dist/intent/store.d.ts +0 -19
- package/dist/intent/types.d.ts +0 -32
- package/dist/keeper/KeeperScan.d.ts +0 -41
- package/dist/keeper/KeeperStore.d.ts +0 -43
- package/dist/keeper/detectors.d.ts +0 -42
- package/dist/keeper/keeper.spec.d.ts +0 -1
- package/dist/keeper/keeper.spec.js +0 -1
- package/dist/keeper/types.d.ts +0 -67
- package/dist/knowledge/account-marks.d.ts +0 -36
- package/dist/knowledge/allocation-ledger.d.ts +0 -75
- package/dist/knowledge/allocation-puzzle.d.ts +0 -138
- package/dist/knowledge/allocation-risk.d.ts +0 -82
- package/dist/knowledge/allocation-templates.d.ts +0 -38
- package/dist/knowledge/allocator-rail-verifier.d.ts +0 -59
- package/dist/knowledge/anti-cheat.d.ts +0 -2
- package/dist/knowledge/arb-fund-facts.d.ts +0 -51
- package/dist/knowledge/arb-risk.d.ts +0 -39
- package/dist/knowledge/arbitration-puzzle.d.ts +0 -84
- package/dist/knowledge/arbitration-rail-verifier.d.ts +0 -35
- package/dist/knowledge/arbitration-risk.d.ts +0 -114
- package/dist/knowledge/arbitration-templates.d.ts +0 -39
- package/dist/knowledge/arbitration-venue-order.d.ts +0 -25
- package/dist/knowledge/baselines/guard-lint-baseline.spec.d.ts +0 -1
- package/dist/knowledge/baselines/guard-lint-baseline.spec.js +0 -1
- package/dist/knowledge/baselines/risk-baselines.spec.d.ts +0 -1
- package/dist/knowledge/baselines/risk-baselines.spec.js +0 -1
- package/dist/knowledge/baselines/risk-cases.d.ts +0 -8
- package/dist/knowledge/baselines/semantic-facts.d.ts +0 -12
- package/dist/knowledge/bridge-risk.d.ts +0 -36
- package/dist/knowledge/catalog-facts.d.ts +0 -4
- package/dist/knowledge/chain-query-registry.d.ts +0 -14
- package/dist/knowledge/commission-landing.d.ts +0 -26
- package/dist/knowledge/component-schema.d.ts +0 -64
- package/dist/knowledge/contact-risk.d.ts +0 -32
- package/dist/knowledge/contact-templates.d.ts +0 -26
- package/dist/knowledge/contract-invariants.d.ts +0 -54
- package/dist/knowledge/demand-risk.d.ts +0 -30
- package/dist/knowledge/discount-threshold.d.ts +0 -26
- package/dist/knowledge/dynamic-pricing.d.ts +0 -29
- package/dist/knowledge/entity-recipient-guard.d.ts +0 -21
- package/dist/knowledge/event-semantics.d.ts +0 -23
- package/dist/knowledge/evidence-review.d.ts +0 -35
- package/dist/knowledge/fee-param-bindings.d.ts +0 -28
- package/dist/knowledge/flywheel-loop.d.ts +0 -41
- package/dist/knowledge/game-scenarios.d.ts +0 -21
- package/dist/knowledge/getting-started.d.ts +0 -37
- package/dist/knowledge/goal-completion.d.ts +0 -31
- package/dist/knowledge/guard-anchor-reach.d.ts +0 -19
- package/dist/knowledge/guard-binding-table.d.ts +0 -52
- package/dist/knowledge/guard-binding-verifier.d.ts +0 -37
- package/dist/knowledge/guard-bindings.d.ts +0 -21
- package/dist/knowledge/guard-blueprint.d.ts +0 -68
- package/dist/knowledge/guard-design-patterns.d.ts +0 -38
- package/dist/knowledge/guard-eval.d.ts +0 -15
- package/dist/knowledge/guard-field-cognition.d.ts +0 -48
- package/dist/knowledge/guard-host-context.d.ts +0 -24
- package/dist/knowledge/guard-ledger.d.ts +0 -19
- package/dist/knowledge/guard-leg-map.d.ts +0 -5
- package/dist/knowledge/guard-lint.d.ts +0 -79
- package/dist/knowledge/guard-node-gates.d.ts +0 -9
- package/dist/knowledge/guard-puzzle.d.ts +0 -188
- package/dist/knowledge/guard-render.d.ts +0 -71
- package/dist/knowledge/guard-risk.d.ts +0 -71
- package/dist/knowledge/guard-submission-brief.d.ts +0 -94
- package/dist/knowledge/guard-submission-prompt.d.ts +0 -63
- package/dist/knowledge/guard-translation.d.ts +0 -58
- package/dist/knowledge/index.d.ts +0 -299
- package/dist/knowledge/industry-evolution.d.ts +0 -82
- package/dist/knowledge/industry-generalizer.d.ts +0 -63
- package/dist/knowledge/industry-rule-node.d.ts +0 -7
- package/dist/knowledge/industry-strategy.d.ts +0 -91
- package/dist/knowledge/intent-metrics.d.ts +0 -43
- package/dist/knowledge/jsonrpc-enum.d.ts +0 -102
- package/dist/knowledge/knob-docs.d.ts +0 -5
- package/dist/knowledge/machine-fork-watch.d.ts +0 -9
- package/dist/knowledge/machine-ledger.d.ts +0 -42
- package/dist/knowledge/machine-puzzle.d.ts +0 -206
- package/dist/knowledge/machine-risk.d.ts +0 -72
- package/dist/knowledge/machine-templates.d.ts +0 -92
- package/dist/knowledge/machine-topology.d.ts +0 -116
- package/dist/knowledge/machine-translation.d.ts +0 -96
- package/dist/knowledge/market-metrics.d.ts +0 -34
- package/dist/knowledge/market-operations.d.ts +0 -46
- package/dist/knowledge/migration-preflight.d.ts +0 -27
- package/dist/knowledge/object-dependency.d.ts +0 -31
- package/dist/knowledge/operation-dictionary.d.ts +0 -18
- package/dist/knowledge/order-ledger.d.ts +0 -69
- package/dist/knowledge/order-puzzle.d.ts +0 -162
- package/dist/knowledge/order-risk.d.ts +0 -62
- package/dist/knowledge/order-templates.d.ts +0 -50
- package/dist/knowledge/param-schema.d.ts +0 -93
- package/dist/knowledge/param-tiers.d.ts +0 -27
- package/dist/knowledge/passport-ledger.d.ts +0 -60
- package/dist/knowledge/passport-templates.d.ts +0 -40
- package/dist/knowledge/path-oracle/coverage.d.ts +0 -16
- package/dist/knowledge/path-oracle/index.d.ts +0 -5
- package/dist/knowledge/path-oracle/products/food-delivery.d.ts +0 -2
- package/dist/knowledge/path-oracle/schema.d.ts +0 -188
- package/dist/knowledge/pattern-resolutions.d.ts +0 -110
- package/dist/knowledge/payment-risk.d.ts +0 -38
- package/dist/knowledge/payment-tracker.d.ts +0 -63
- package/dist/knowledge/permission-ledger.d.ts +0 -49
- package/dist/knowledge/permission-puzzle.d.ts +0 -122
- package/dist/knowledge/permission-risk.d.ts +0 -70
- package/dist/knowledge/permission-templates.d.ts +0 -38
- package/dist/knowledge/personal-risk.d.ts +0 -36
- package/dist/knowledge/product-detail-source.d.ts +0 -37
- package/dist/knowledge/product-doc-b5.d.ts +0 -16
- package/dist/knowledge/progress-ledger.d.ts +0 -63
- package/dist/knowledge/progress-puzzle.d.ts +0 -82
- package/dist/knowledge/progress-risk.d.ts +0 -75
- package/dist/knowledge/progress-templates.d.ts +0 -38
- package/dist/knowledge/projection.d.ts +0 -54
- package/dist/knowledge/projection.spec.d.ts +0 -1
- package/dist/knowledge/projection.spec.js +0 -1
- package/dist/knowledge/proof-risk.d.ts +0 -33
- package/dist/knowledge/protocol-facts.d.ts +0 -17
- package/dist/knowledge/publish-gate.d.ts +0 -20
- package/dist/knowledge/publish-readiness.d.ts +0 -25
- package/dist/knowledge/publish-surface-contract.d.ts +0 -16
- package/dist/knowledge/puzzle-projections.d.ts +0 -11
- package/dist/knowledge/rail-exit-satisfiability.d.ts +0 -25
- package/dist/knowledge/registrar-risk.d.ts +0 -34
- package/dist/knowledge/release-sentinel.d.ts +0 -12
- package/dist/knowledge/repository-risk.d.ts +0 -46
- package/dist/knowledge/repository-write-semantics.d.ts +0 -27
- package/dist/knowledge/reputation-rules.d.ts +0 -36
- package/dist/knowledge/requirement-families.d.ts +0 -13
- package/dist/knowledge/resource-risk.d.ts +0 -32
- package/dist/knowledge/reward-ledger.d.ts +0 -97
- package/dist/knowledge/reward-puzzle.d.ts +0 -98
- package/dist/knowledge/reward-risk.d.ts +0 -86
- package/dist/knowledge/reward-templates.d.ts +0 -25
- package/dist/knowledge/rule-node-analyzers.d.ts +0 -49
- package/dist/knowledge/rule-outcome.d.ts +0 -5
- package/dist/knowledge/scenario-topology.d.ts +0 -48
- package/dist/knowledge/semantic-ir.d.ts +0 -136
- package/dist/knowledge/service-allocation-semantics.d.ts +0 -36
- package/dist/knowledge/service-allocator-audit-node.d.ts +0 -3
- package/dist/knowledge/service-ledger.d.ts +0 -87
- package/dist/knowledge/service-puzzle.d.ts +0 -158
- package/dist/knowledge/service-risk-node.d.ts +0 -3
- package/dist/knowledge/service-risk.d.ts +0 -110
- package/dist/knowledge/service-templates.d.ts +0 -41
- package/dist/knowledge/settlement-semantics.d.ts +0 -1
- package/dist/knowledge/strategy-manuals.d.ts +0 -15
- package/dist/knowledge/supply-chain.d.ts +0 -35
- package/dist/knowledge/template-index.d.ts +0 -19
- package/dist/knowledge/template-loader.d.ts +0 -425
- package/dist/knowledge/template-nav.d.ts +0 -9
- package/dist/knowledge/template-prose.d.ts +0 -50
- package/dist/knowledge/template-registry.d.ts +0 -48
- package/dist/knowledge/template-scanner.d.ts +0 -158
- package/dist/knowledge/template-test-profiles.d.ts +0 -17
- package/dist/knowledge/template-validation.d.ts +0 -3
- package/dist/knowledge/tools-reference.d.ts +0 -17
- package/dist/knowledge/treasury-ledger.d.ts +0 -42
- package/dist/knowledge/treasury-puzzle.d.ts +0 -163
- package/dist/knowledge/treasury-risk.d.ts +0 -88
- package/dist/knowledge/treasury-templates.d.ts +0 -38
- package/dist/knowledge/universal-template.d.ts +0 -22
- package/dist/knowledge/util-risk.d.ts +0 -30
- package/dist/knowledge/workflow-guidance.d.ts +0 -194
- package/dist/knowledge/workspace-lists.d.ts +0 -61
- package/dist/monitor/SuggestionBridge.spec.d.ts +0 -1
- package/dist/monitor/SuggestionBridge.spec.js +0 -1
- package/dist/participation/arbitrator-interest.d.ts +0 -22
- package/dist/participation/demander-interest.d.ts +0 -23
- package/dist/participation/employee-kpi.d.ts +0 -37
- package/dist/participation/employee-kpi.spec.d.ts +0 -1
- package/dist/participation/employee-kpi.spec.js +0 -1
- package/dist/participation/employee-store.d.ts +0 -16
- package/dist/participation/game-context.d.ts +0 -25
- package/dist/participation/index.d.ts +0 -2
- package/dist/participation/node-action-advisor.d.ts +0 -68
- package/dist/participation/time-window.d.ts +0 -48
- package/dist/persona/facet-profile.d.ts +0 -33
- package/dist/persona/persona-audit.spec.d.ts +0 -1
- package/dist/persona/persona-audit.spec.js +0 -1
- package/dist/playbooks/service-build/business-puzzle.d.ts +0 -48
- package/dist/playbooks/service-build/context-assembly.d.ts +0 -32
- package/dist/playbooks/service-build/facet-money.d.ts +0 -33
- package/dist/playbooks/service-build/facet-money.spec.d.ts +0 -1
- package/dist/playbooks/service-build/facet-money.spec.js +0 -1
- package/dist/playbooks/service-build/game-theory.d.ts +0 -47
- package/dist/playbooks/service-build/index.d.ts +0 -15
- package/dist/playbooks/service-build/intent-analyzer.d.ts +0 -72
- package/dist/playbooks/service-build/machine-nodes.d.ts +0 -27
- package/dist/playbooks/service-build/machine-panorama.d.ts +0 -71
- package/dist/playbooks/service-build/merchant-guide.d.ts +0 -382
- package/dist/playbooks/service-build/migration-planner.d.ts +0 -61
- package/dist/playbooks/service-build/mode-actions.d.ts +0 -260
- package/dist/playbooks/service-build/object-panorama.d.ts +0 -317
- package/dist/playbooks/service-build/object-type.d.ts +0 -1
- package/dist/playbooks/service-build/participation-radar.d.ts +0 -20
- package/dist/playbooks/service-build/pipeline-actions.d.ts +0 -108
- package/dist/playbooks/service-build/process.d.ts +0 -6
- package/dist/playbooks/service-build/relationship-profile.d.ts +0 -3
- package/dist/playbooks/service-build/reverse-mapping-nk4.spec.d.ts +0 -1
- package/dist/playbooks/service-build/reverse-mapping-nk4.spec.js +0 -1
- package/dist/playbooks/service-build/reverse-mapping-refund-p0-5.spec.d.ts +0 -1
- package/dist/playbooks/service-build/reverse-mapping-refund-p0-5.spec.js +0 -1
- package/dist/playbooks/service-build/reverse-mapping.d.ts +0 -66
- package/dist/playbooks/service-build/risk-aggregator.d.ts +0 -59
- package/dist/playbooks/service-build/service-panorama.d.ts +0 -229
- package/dist/playbooks/service-build/service-quote.d.ts +0 -2
- package/dist/playbooks/service-build/service-quote.spec.d.ts +0 -1
- package/dist/playbooks/service-build/service-quote.spec.js +0 -1
- package/dist/playbooks/service-build/topology-evaluation.spec.d.ts +0 -1
- package/dist/playbooks/service-build/topology-evaluation.spec.js +0 -1
- package/dist/playbooks/service-build/topology-query.d.ts +0 -25
- package/dist/playbooks/service-build/workflow-design-assessment.d.ts +0 -33
- package/dist/relationship/derivation.d.ts +0 -95
- package/dist/relationship/derivation.spec.d.ts +0 -1
- package/dist/relationship/derivation.spec.js +0 -1
- package/dist/relationship/incentive.d.ts +0 -38
- package/dist/relationship/index.d.ts +0 -4
- package/dist/relationship/registry.d.ts +0 -13
- package/dist/relationship/types.d.ts +0 -45
- package/dist/review/arb.d.ts +0 -4
- package/dist/review/demand.d.ts +0 -3
- package/dist/review/index.d.ts +0 -3
- package/dist/review/machine.d.ts +0 -3
- package/dist/review/order.d.ts +0 -8
- package/dist/review/progress.d.ts +0 -3
- package/dist/review/repository.d.ts +0 -3
- package/dist/review/service.d.ts +0 -5
- package/dist/review/types.d.ts +0 -163
- package/dist/role/derivation.d.ts +0 -35
- package/dist/role/index.d.ts +0 -6
- package/dist/role/intent.d.ts +0 -23
- package/dist/role/model.d.ts +0 -9
- package/dist/role/profiles.d.ts +0 -26
- package/dist/role/resolution.d.ts +0 -27
- package/dist/runtime/instance-registry.d.ts +0 -14
- package/dist/safety/index.d.ts +0 -3
- package/dist/schema/call/permission-handler.d.ts +0 -5
- package/dist/schema/call/semantic-customer-advice.spec.d.ts +0 -1
- package/dist/schema/call/semantic-customer-advice.spec.js +0 -1
- package/dist/schema/common/tokentype-short-probe.spec.d.ts +0 -1
- package/dist/schema/common/tokentype-short-probe.spec.js +0 -1
- package/dist/schema/envelope-unify.d.ts +0 -5
- package/dist/schema/goal/planning.d.ts +0 -742
- package/dist/schema/industry-pack/modes.d.ts +0 -447
- package/dist/schema/query/bi.d.ts +0 -3369
- package/dist/schema/utils/guard-query-utils.d.ts +0 -18
- package/dist/schema/utils/permission-index-utils.d.ts +0 -2
- package/dist/schema/utils/skills-recommendation.d.ts +0 -2
- package/dist/schema-query-impl/index.d.ts +0 -83
- package/dist/schemas/account_operation.output.json +0 -3869
- package/dist/schemas/ask_user.output.json +0 -54
- package/dist/schemas/benchmark_migration_operation.output.json +0 -1669
- package/dist/schemas/bridge_operation.output.json +0 -1548
- package/dist/schemas/config_operation.output.json +0 -896
- package/dist/schemas/employee_operation.output.json +0 -307
- package/dist/schemas/evaluation_operation.output.json +0 -4716
- package/dist/schemas/guard2file.output.json +0 -83
- package/dist/schemas/industry_pack_operation.output.json +0 -2985
- package/dist/schemas/intent_radar.output.json +0 -326
- package/dist/schemas/keeper_operation.output.json +0 -1441
- package/dist/schemas/local_cache_operation.output.json +0 -1718
- package/dist/schemas/local_history_operation.output.json +0 -1644
- package/dist/schemas/local_info_operation.output.json +0 -1530
- package/dist/schemas/local_mark_operation.output.json +0 -1622
- package/dist/schemas/machineNode2file.output.json +0 -88
- package/dist/schemas/messenger_operation.output.json +0 -4692
- package/dist/schemas/monitor_events.output.json +0 -1602
- package/dist/schemas/monitor_subscription.output.json +0 -1629
- package/dist/schemas/onchain_events.output.json +0 -4053
- package/dist/schemas/onchain_operations.output.json +0 -7788
- package/dist/schemas/onchain_table_data.output.json +0 -11868
- package/dist/schemas/permission_operation.output.json +0 -205
- package/dist/schemas/persona_operation.output.json +0 -64612
- package/dist/schemas/query_toolkit.output.json +0 -28302
- package/dist/schemas/schema_query.output.json +0 -81
- package/dist/schemas/service_clone_operation.output.json +0 -247
- package/dist/schemas/strategy_review_operation.output.json +0 -532
- package/dist/schemas/watch_operation.output.json +0 -930
- package/dist/schemas/wip_file.output.json +0 -360
- package/dist/schemas/workflow_operation.output.json +0 -422
- package/dist/schemas/workspace_operation.output.json +0 -477
- package/dist/schemas/wowok_buildin_info.output.json +0 -2477
- package/dist/strategy/collectors.d.ts +0 -66
- package/dist/strategy/collectors.spec.d.ts +0 -1
- package/dist/strategy/collectors.spec.js +0 -1
- package/dist/strategy/index.d.ts +0 -5
- package/dist/strategy/metrics.d.ts +0 -20
- package/dist/strategy/review.d.ts +0 -48
- package/dist/strategy/scorecard.d.ts +0 -32
- package/dist/strategy/store.d.ts +0 -26
- package/dist/task/ProcessStore.d.ts +0 -98
- package/dist/task/playbook.d.ts +0 -11
- package/dist/task/substep-trace.d.ts +0 -91
- package/dist/tools/build-fingerprint.d.ts +0 -28
- package/dist/tools/error-catalog.d.ts +0 -17
- package/dist/tools/handlers/ask-user.d.ts +0 -3
- package/dist/tools/handlers/benchmark-migration.d.ts +0 -121
- package/dist/tools/handlers/bridge.d.ts +0 -8
- package/dist/tools/handlers/config.d.ts +0 -2
- package/dist/tools/handlers/dispatch-expectations.d.ts +0 -2
- package/dist/tools/handlers/dispatch-expectations.spec.d.ts +0 -1
- package/dist/tools/handlers/dispatch-expectations.spec.js +0 -1
- package/dist/tools/handlers/employee.d.ts +0 -8
- package/dist/tools/handlers/employee.spec.d.ts +0 -1
- package/dist/tools/handlers/employee.spec.js +0 -1
- package/dist/tools/handlers/entry-edge-recipe.d.ts +0 -101
- package/dist/tools/handlers/escrow-deficit.d.ts +0 -10
- package/dist/tools/handlers/evaluation.d.ts +0 -2
- package/dist/tools/handlers/evaluation.spec.d.ts +0 -1
- package/dist/tools/handlers/evaluation.spec.js +0 -1
- package/dist/tools/handlers/file-export.d.ts +0 -3
- package/dist/tools/handlers/fund-rail-recipe.d.ts +0 -10
- package/dist/tools/handlers/goal.d.ts +0 -4
- package/dist/tools/handlers/industry-pack.d.ts +0 -3
- package/dist/tools/handlers/intent-radar.d.ts +0 -2
- package/dist/tools/handlers/keeper.d.ts +0 -12
- package/dist/tools/handlers/local.d.ts +0 -6
- package/dist/tools/handlers/mark-namespace.d.ts +0 -30
- package/dist/tools/handlers/messenger.d.ts +0 -24
- package/dist/tools/handlers/monitor.d.ts +0 -26
- package/dist/tools/handlers/name-resolution.d.ts +0 -4
- package/dist/tools/handlers/name-resolution.spec.d.ts +0 -1
- package/dist/tools/handlers/name-resolution.spec.js +0 -1
- package/dist/tools/handlers/network.d.ts +0 -1
- package/dist/tools/handlers/onchain-name-registration.d.ts +0 -49
- package/dist/tools/handlers/onchain-name-registration.spec.d.ts +0 -1
- package/dist/tools/handlers/onchain-name-registration.spec.js +0 -1
- package/dist/tools/handlers/onchain.d.ts +0 -132
- package/dist/tools/handlers/permission.d.ts +0 -2
- package/dist/tools/handlers/persona.d.ts +0 -4
- package/dist/tools/handlers/publish-binding-echo.d.ts +0 -22
- package/dist/tools/handlers/review-chain.d.ts +0 -19
- package/dist/tools/handlers/schema-query.d.ts +0 -2
- package/dist/tools/handlers/service-clone.d.ts +0 -20
- package/dist/tools/handlers/stale-build-check.d.ts +0 -9
- package/dist/tools/handlers/strategy-review.d.ts +0 -2
- package/dist/tools/handlers/submission-assembly.d.ts +0 -55
- package/dist/tools/handlers/watch.d.ts +0 -2
- package/dist/tools/handlers/winner-derivation.d.ts +0 -20
- package/dist/tools/handlers/wip-upload.d.ts +0 -22
- package/dist/tools/handlers/wip.d.ts +0 -2
- package/dist/tools/handlers/workflow.d.ts +0 -2
- package/dist/tools/handlers/workspace.d.ts +0 -4
- package/dist/tools/move-fn-index.gen.d.ts +0 -3
- package/dist/tools/publish-gate-state.d.ts +0 -5
- package/dist/tools/registry/agent.d.ts +0 -2
- package/dist/tools/registry/bridge.d.ts +0 -2
- package/dist/tools/registry/business.d.ts +0 -2
- package/dist/tools/registry/config.d.ts +0 -2
- package/dist/tools/registry/evaluation.d.ts +0 -2
- package/dist/tools/registry/files.d.ts +0 -2
- package/dist/tools/registry/identity.d.ts +0 -2
- package/dist/tools/registry/interaction.d.ts +0 -2
- package/dist/tools/registry/local.d.ts +0 -2
- package/dist/tools/registry/messenger.d.ts +0 -2
- package/dist/tools/registry/monitor.d.ts +0 -2
- package/dist/tools/registry/onchain.d.ts +0 -2
- package/dist/tools/registry/query.d.ts +0 -2
- package/dist/tools/retry.d.ts +0 -8
- package/dist/tools/rules-hook.d.ts +0 -5
- package/dist/tools/runtime-health.d.ts +0 -10
- package/dist/tools/sanitize-description-roundtrip.spec.d.ts +0 -1
- package/dist/tools/sanitize-description-roundtrip.spec.js +0 -1
- package/dist/tools/sanitize-output.d.ts +0 -4
- package/dist/tools/sanitize-output.spec.d.ts +0 -1
- package/dist/tools/sanitize-output.spec.js +0 -1
- package/dist/tools/shared.d.ts +0 -20
- package/dist/tools/transport-integrity.d.ts +0 -7
- package/dist/tools/upgrade-check.d.ts +0 -75
- package/dist/tools/wip-deploy-assist.d.ts +0 -34
- package/dist/tools/wip-verify-ledger.d.ts +0 -16
- package/dist/tools/wrap.d.ts +0 -45
|
@@ -0,0 +1,1192 @@
|
|
|
1
|
+
{
|
|
2
|
+
"comment": "Guard rule pack (R-C/R-X) — declarative form of the retired in-code Guard risk rules (the guard condition-tree lint pack: 39 rules over the serialized root, table classification and the scene ledger). Facts are produced by the kernel extractor (guard-risk.ts, bound to the GUARDQUERY invariant catalog, the witness chain table, the certain-outcome folder and the per-scene reentrancy specs); rules only reference fact names. Levels/wording can be retuned per rule and rules can be disabled (enabled=false, trace left) via the judgment document — factory rules can never be deleted or invented here.",
|
|
3
|
+
"facts": {
|
|
4
|
+
"has_signer_check": "KERNEL — the serialized root contains a context(Signer) check.",
|
|
5
|
+
"has_clock_check": "KERNEL — the serialized root contains a context(Clock) node.",
|
|
6
|
+
"has_guard_self_ref": "KERNEL — the serialized root contains a context(Guard) self-reference.",
|
|
7
|
+
"has_witness": "KERNEL — the serialized root contains a convert_witness field.",
|
|
8
|
+
"queries_repository": "KERNEL — the serialized root mentions repository (Repository data source).",
|
|
9
|
+
"queries_progress": "KERNEL — the serialized root mentions progress (Progress data source).",
|
|
10
|
+
"root_has_query": "KERNEL — the serialized root contains a \"query\" node marker.",
|
|
11
|
+
"root_has_clock_token": "KERNEL — the lowercased serialized root contains the clock token.",
|
|
12
|
+
"root_has_calc_number_add": "KERNEL — the serialized root uses calc_number_add.",
|
|
13
|
+
"root_has_logic_string_contains": "KERNEL — the serialized root uses logic_string_contains.",
|
|
14
|
+
"root_has_logic_string_nocase": "KERNEL — the serialized root uses the logic_string_nocase variant.",
|
|
15
|
+
"root_has_logic_as_u256_greater_or_equal": "KERNEL — the serialized root uses logic_as_u256_greater_or_equal.",
|
|
16
|
+
"root_has_logic_as_u256_greater": "KERNEL — the serialized root uses logic_as_u256_greater (substring semantics: also matches the greater_or_equal form, as the retired code did).",
|
|
17
|
+
"root_has_logic_equal": "KERNEL — the serialized root contains a logic_equal node.",
|
|
18
|
+
"root_has_logic_not_equal": "KERNEL — the serialized root contains a logic_not_equal node.",
|
|
19
|
+
"root_is_identifier": "KERNEL — the root node itself is an identifier node.",
|
|
20
|
+
"root_identifier_is_submission": "KERNEL — when the root is an identifier, the referenced table entry has b_submission=true (false when the entry is missing or constant).",
|
|
21
|
+
"root_query_ids_csv": "KERNEL — all GUARDQUERY ids referenced in the root (numeric ids and resolved names), comma-space joined.",
|
|
22
|
+
"root_has_progress_current_query": "KERNEL — the root queries progress.current (query id 1253).",
|
|
23
|
+
"queries_arb_status": "KERNEL — the serialized root mentions arb.status (Arb case state query).",
|
|
24
|
+
"arb_status_transient_gate": "KERNEL — the root queries arb.status AND the table pins a constant numeric value of 5 (Finished): a transient-state gate that arb_withdraw (5→6 Withdrawn) will permanently overtake (testnet o10 refund-edge deadlock).",
|
|
25
|
+
"logic_and_count": "KERNEL — number of logic_and markers in the serialized root.",
|
|
26
|
+
"const_addr_list": "KERNEL — constant Address table entries (b_submission=false, value set) rendered as '#id=value', comma joined.",
|
|
27
|
+
"const_addr_count": "KERNEL — number of constant Address table entries (b_submission=false, value set).",
|
|
28
|
+
"sys_addr_list": "KERNEL — system-address table entries (0xaab/0xaaa) rendered as '#id=value(name)', comma joined.",
|
|
29
|
+
"sys_addr_wrong": "KERNEL — a system-address entry's name annotation names a DIFFERENT system object (0xaab annotated as linker/permission/contact/messenger, or 0xaaa annotated as entity/permission/contact/messenger). Note: 0xaab is the Move-level Entity object (SDK constant ENTITY_REGISTRAR_ADDRESS — legacy alias) and 0xaaa is the Registrar object (SDK constant ENTITY_LINKER_ADDRESS — legacy alias); alias-vs-Move-name divergence is documented, not flagged (rex5 T-06).",
|
|
30
|
+
"witness_multihop_codes": "KERNEL — multi-hop witness codes (106/107/108) present in the root.",
|
|
31
|
+
"witness_multihop_csv": "KERNEL — witness_multihop_codes comma-space joined.",
|
|
32
|
+
"witness_multihop_names_block": "KERNEL — one ' - <code>: <chain name>' line per multi-hop witness code, newline joined.",
|
|
33
|
+
"rc2_02_issue_count": "KERNEL — witness-source table annotation issues found (hard mismatches + missing annotations).",
|
|
34
|
+
"rc2_02_has_hard_mismatch": "KERNEL — at least one explicit object_type contradiction with the witness derivation chain.",
|
|
35
|
+
"rc2_02_evidence_lines": "KERNEL — the issue list rendered as ' - <issue>' lines, newline joined.",
|
|
36
|
+
"rc2_02_evidence_csv": "KERNEL — the issue list joined with '; '.",
|
|
37
|
+
"rc2_04_queries_repo": "KERNEL — the root queries repository data (translation-relevant).",
|
|
38
|
+
"rc2_04_queries_progress_history": "KERNEL — the root queries progress history (translation-relevant).",
|
|
39
|
+
"rc2_04_has_conversion": "KERNEL — the root already uses a type-conversion node (convert_number_address / convert_address_number / convert_u256 / convert_string).",
|
|
40
|
+
"rc2_04_conversion_note": "KERNEL — final description tail for the conversion-present vs conversion-missing branches.",
|
|
41
|
+
"rc2_04_conversion_evidence": "KERNEL — final evidence for the conversion-present vs conversion-missing branches.",
|
|
42
|
+
"rc2_05_mismatch_count": "KERNEL — query prefixes that contradict their convert_witness target type (the witness matrix is directional; zrmn-261012 R-WITNESS-01).",
|
|
43
|
+
"rc2_05_evidence_lines": "KERNEL — the prefix-mismatch list rendered as ' - <detail>' lines, newline joined.",
|
|
44
|
+
"rc2_06_issue_count": "KERNEL — progress.* queries on a source without convert_witness that cannot be proven to be a Progress (no PROGRESS→ORDER reverse edge).",
|
|
45
|
+
"rc2_06_has_hard_mismatch": "KERNEL — at least one such source is explicitly annotated as a non-Progress (hard violation; unannotated sources grade soft).",
|
|
46
|
+
"rc2_06_evidence_lines": "KERNEL — the reverse-edge issue list rendered as ' - <detail>' lines, newline joined.",
|
|
47
|
+
"rc2_07_keys_where_count": "KERNEL — number of 'keys where' query nodes whose parameter shape DIVERGES from the native signature (nnd3-mn-261103 F-NND-04: the native 1177 signature IS (Address, VectorU8), wobject.rs:773-780 — the parameter-carrying form works on chain, mainnet-verified tx CdNmNcTf…; only arity/type mismatches abort with GUARD_QUERY_PARAM_INVALID).",
|
|
48
|
+
"rc2_07_evidence_lines": "KERNEL — per-node evidence lines for the divergent keys-where shapes counted by rc2_07_keys_where_count (query id, param arity/type vs the native signature, materialization failure mode).",
|
|
49
|
+
"has_submission": "KERNEL — the table has at least one b_submission=true entry.",
|
|
50
|
+
"scene_present": "KERNEL — a binding scene was supplied.",
|
|
51
|
+
"scene_id": "KERNEL — the binding scene id (e.g. service_order_allocators_guard).",
|
|
52
|
+
"scene_host_object": "KERNEL — the binding scene host object type (Service/Machine/...).",
|
|
53
|
+
"scene_binding_field": "KERNEL — the binding scene binding field (buy_guard/order_allocators/...).",
|
|
54
|
+
"scene_mutable_after_publish": "KERNEL — whether the scene binding can be modified after the host object is published.",
|
|
55
|
+
"rc3_01_sharing_exempt": "KERNEL — allocators scene with Entity/GuardIdentifier-only sharing (Signer binding advice does not apply; R-C3-06 owns the semantics).",
|
|
56
|
+
"rc3_01_order_anchored": "KERNEL — allocators scene where EVERY submission slot is unread by the root: submitted values cannot influence the verdict, and the chain binds GuardIdentifier recipients to the paying order via payment_info.for_object (ptrn-mn-261013 F-03).",
|
|
57
|
+
"rc3_02_numeric_count": "KERNEL — submitted numeric table entries (U8..U256) in the voting_guard scene.",
|
|
58
|
+
"rc3_02_numeric_list": "KERNEL — submitted numeric entries rendered as '#id(TYPE)', comma joined.",
|
|
59
|
+
"rc3_03_submitted_addr_count": "KERNEL — submitted Address table entries (b_submission=true, value_type=Address).",
|
|
60
|
+
"rc3_03_no_type_count": "KERNEL — submitted Address entries missing the object_type annotation.",
|
|
61
|
+
"rc3_03_evidence": "KERNEL — final evidence listing the missing-object_type or annotated entries.",
|
|
62
|
+
"rc3_05_applies": "KERNEL — a project-relevant object (Order/Progress/Arb) is submitted in an affected scene without a project-binding query (1563/1560/1250/1402/1401) in the root.",
|
|
63
|
+
"rc3_05_critical": "KERNEL — the scene belongs to the critical set. Since protocol v148 (assert_task_binding live) the set is machine_forward_guard only: the forward-stage replay past acceptance gates is not closed by the chain, while allocator scenes carry the v148 chain backstop and grade info.",
|
|
64
|
+
"rc3_05_unbound_csv": "KERNEL — unbound project-relevant submission entries rendered '#id(Order|Progress|Arb|inferred …)', comma joined.",
|
|
65
|
+
"rc3_05_scene_label": "KERNEL — scene label for the evidence ('unknown scene (conservative flag)' when absent).",
|
|
66
|
+
"rc3_06_applies": "KERNEL — allocators scene, Guard without Signer binding, and sharing is not provably Entity/GuardIdentifier-only.",
|
|
67
|
+
"rc3_06_signer_sharing": "KERNEL — sharing.who=Signer confirmed via the sharing_recipients hint.",
|
|
68
|
+
"rc3_06_recipients_label": "KERNEL — rendered sharing recipients hint ('[Signer]' or '(not provided — conservative flag)').",
|
|
69
|
+
"rc3_06_title_suffix": "KERNEL — final title suffix for the confirmed vs conservative branches.",
|
|
70
|
+
"rc3_06_level_rationale": "KERNEL — final level rationale for the evidence line.",
|
|
71
|
+
"rc4_01_comparison_detail": "KERNEL — detected comparison operators rendered 'logic_equal(==) logic_not_equal(!=)' (blank when absent).",
|
|
72
|
+
"rc4_01_comparison_ops": "KERNEL — detected comparison operators rendered '== !=' (blank when absent).",
|
|
73
|
+
"rc4_01_identity_legal": "KERNEL — the root carries a LEGAL identity form (order.owner equality / order.agent leg / order.service binding / permission.(owner|admin) role) => the blanket 'direction needs manual confirmation' WARN is silenced (K3 C4 bkg F-04).",
|
|
74
|
+
"rc4_01_identity_form": "KERNEL — the detected identity form label: 'order.owner ==', 'order.agent leg', 'order.service binding', 'permission role', or 'unrecognized'.",
|
|
75
|
+
"rc4_01_settlement_buyer_trigger": "KERNEL — a BUYER-form leg (order.owner equality / order.agent) on a NON-refund order_allocators rail => the role-reversal WARN stays: the buyer's signature would release the merchant's money. Refund rails are exempt (user slot 0 = submitted Order).",
|
|
76
|
+
"rc4_02_has_greater_or_equal": "KERNEL — the root uses logic_as_u256_greater_or_equal (Clock boundary form).",
|
|
77
|
+
"rc4_02_has_greater": "KERNEL — the root uses logic_as_u256_greater (substring semantics).",
|
|
78
|
+
"rc4_02_comparison_ops": "KERNEL — detected comparison operators rendered '>= >' (blank when absent).",
|
|
79
|
+
"rc4_04_detected": "KERNEL — Level 1 strict single-identity Signer binding detected (logic_equal[context(Signer), identifier[N]] on a fixed Address constant, not wrapped in logic_or).",
|
|
80
|
+
"rc4_04_entry_identifier": "KERNEL — table identifier of the detected Level 1 strict-binding entry.",
|
|
81
|
+
"rc4_04_entry_value": "KERNEL — fixed Address value of the detected entry.",
|
|
82
|
+
"rc4_04_entry_detail": "KERNEL — entry constraint detail rendered 'b_submission=false, value=\"…\"(, name=\"…\")?'.",
|
|
83
|
+
"rx1_01_trigger": "KERNEL — greater_or_equal + clock + calc_number_add + query present and at least one root query lacks a non-zero invariant.",
|
|
84
|
+
"rx1_01_evidence": "KERNEL — final evidence listing queries without a non-zero invariant (or the static fallback).",
|
|
85
|
+
"rx1_02_trigger": "KERNEL — greater + query present and at least one root query lacks a non-zero invariant.",
|
|
86
|
+
"rx1_02_evidence": "KERNEL — final evidence listing queries without a non-zero invariant (or the static fallback).",
|
|
87
|
+
"rely_guards_count": "KERNEL — number of external Guards in the rely configuration.",
|
|
88
|
+
"rely_is_or": "KERNEL — the rely combination is OR (vs AND).",
|
|
89
|
+
"rely_logic": "KERNEL — final 'OR'/'AND' label of the rely combination.",
|
|
90
|
+
"rx1_11_self_rep_false": "KERNEL — this Guard queries repository.data with a submitted Repository address (own rep=false).",
|
|
91
|
+
"rx1_11_warning_tail": "KERNEL — final description tail appended when own rep=false (empty otherwise).",
|
|
92
|
+
"rx1_11_evidence": "KERNEL — final evidence for the own rep=false vs to-be-confirmed branches.",
|
|
93
|
+
"rx1_12_vague_count": "KERNEL — submitted entries with an EMPTY name (no data contract on any layer). Short identifier-style names are schema-conformant and NOT flagged (docs#46-1).",
|
|
94
|
+
"rx1_12_vague_csv": "KERNEL — unnamed entries rendered 'identifier=N, name=\"…\"', '; ' joined.",
|
|
95
|
+
"rx1_13_detected": "KERNEL — a table Address constant's object_type equals the scene host object (circular reference pattern).",
|
|
96
|
+
"rx1_13_identifier": "KERNEL — identifier of the circular-reference table entry.",
|
|
97
|
+
"rx1_19_order_query_count": "KERNEL — order.* query occurrences in a buy-scene guard root (the Order does not exist at buy time, zrmn-261012 R-BUY-GUARD-CIRCULAR).",
|
|
98
|
+
"rx1_19_evidence_csv": "KERNEL — the matched order.* query JSON fragments, comma-space joined.",
|
|
99
|
+
"reentry_applicable": "KERNEL — the scene has a reentrancy spec (ALLOWED scenes stay silent).",
|
|
100
|
+
"reentry_state": "KERNEL — anti-reentrancy protection state: 'protected' / 'pseudo' / 'absent'.",
|
|
101
|
+
"reentry_scene_id": "KERNEL — reentrancy scene id from the spec table.",
|
|
102
|
+
"reentry_found_primitive": "KERNEL — GUARDQUERY name of the anti-reentrancy primitive found in the root.",
|
|
103
|
+
"reentry_evidence": "KERNEL — final detection evidence of the reentrancy scan.",
|
|
104
|
+
"reentry_rationale": "KERNEL — per-scene reentrancy rationale (spec table, Move-verified).",
|
|
105
|
+
"reentry_mitigation": "KERNEL — per-scene reentrancy mitigation (spec table, Move-verified).",
|
|
106
|
+
"tree_folds_always_true": "KERNEL — the condition tree provably evaluates to TRUE for every submission and every on-chain state (certain-outcome folder in guard-risk.ts: constant-true table leaf, reflexive comparison of the same operand, unsigned value compared >= the constant 0, or an and/or/logic_not fold of such).",
|
|
107
|
+
"tree_folds_always_true_reason": "KERNEL — the decisive tautology pattern rendered for the evidence line.",
|
|
108
|
+
"tree_folds_always_false": "KERNEL — the condition tree provably evaluates to FALSE (always denies: legitimate dead-edge / frozen-service pattern, reported as a notice, not as open access).",
|
|
109
|
+
"tree_folds_always_false_reason": "KERNEL — the decisive always-false pattern rendered for the evidence line.",
|
|
110
|
+
"write_guard_scene": "KERNEL — the Guard is bound as a Repository policy write_guard (scene binding_field=write_guard / id repository_write_guard).",
|
|
111
|
+
"write_guard_no_identity_check": "KERNEL — write_guard scene AND no context(Signer) leaf anywhere in the root: the gate binds a STATE, never the WRITER, so any caller satisfying it may write or overwrite any row.",
|
|
112
|
+
"write_guard_open": "KERNEL — write_guard scene AND (the tree folds true OR it binds no caller identity): the Repository write is effectively unauthenticated even though the policy has a guard.",
|
|
113
|
+
"bare_bool_query_count": "KERNEL — number of DISTINCT query nodes sitting directly under logic_and/logic_or (bare Bool clause position; absent when zero).",
|
|
114
|
+
"bare_bool_query_csv_sp": "KERNEL — those bare-clause queries rendered '#<id>' or by name, comma-space joined."
|
|
115
|
+
},
|
|
116
|
+
"rules": [
|
|
117
|
+
{
|
|
118
|
+
"rule_id": "R-X1-16",
|
|
119
|
+
"dimension": "data_source_trust",
|
|
120
|
+
"trigger": "Guard queries arb.status and pins a constant numeric table entry to 5 (Finished) — a transient state that arb_withdraw overtakes (5→6 Withdrawn)",
|
|
121
|
+
"cases": [
|
|
122
|
+
{
|
|
123
|
+
"when": { "field": "arb_status_transient_gate", "op": "eq", "value": true },
|
|
124
|
+
"level": "high",
|
|
125
|
+
"title": "arb.status==5 gate is transient: fee withdrawal permanently kills the refund edge",
|
|
126
|
+
"description": "arb.status is a U8 lifecycle state. After a ruling the case sits at 5 (Finished), but a legitimate arb_withdraw by the arbitrator advances it to 6 (Withdrawn) — the gate silently flips false and never returns. Guard AND Machine are immutable after publish (IMMUT-001), so any forward gated on ==5 dies permanently and strands its funds (verified on testnet, booking o10: 1.5 WOW locked with no on-chain exit).",
|
|
127
|
+
"scenario": "Arbitration refund forward gated on arb.status==5: the arbitrator withdraws the case fee before the refund executes — the forward aborts forever",
|
|
128
|
+
"mitigation": "Gate on the stable ruling signal instead: arb.indemnity some == true (Bool — set by the ruling; arb_withdraw sweeps only the fee balance and never touches it, so a fee withdrawal cannot clear it; cleared by reset, which correctly re-gates). Template: tpl_forward_arb_ruling_won. Time-bounded variant: arb.indemnity.time (U64 ruling timestamp). Merchant-favor dismissal edges: tpl_forward_arb_ruling_dismissed (arb.indemnity.amount == 0 — fail-closed on the None field).",
|
|
129
|
+
"evidence": "Root queries arb.status; table pins a constant numeric value of 5 (Finished).",
|
|
130
|
+
"stakeholders": ["provider", "customer"]
|
|
131
|
+
}
|
|
132
|
+
]
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"rule_id": "R-X1-17",
|
|
136
|
+
"dimension": "logic_gap",
|
|
137
|
+
"trigger": "The condition tree folds to TRUE for every input (tautology), or a Repository write_guard binds no caller identity — the chain checks that a write_guard EXISTS, never that it PROVES anything",
|
|
138
|
+
"cases": [
|
|
139
|
+
{
|
|
140
|
+
"when": { "all": [{ "field": "write_guard_scene", "op": "eq", "value": true }, { "field": "tree_folds_always_true", "op": "eq", "value": true }] },
|
|
141
|
+
"level": "critical",
|
|
142
|
+
"title": "Repository write_guard is a tautology — evidence writes are open to every address",
|
|
143
|
+
"description": "policy_add_imp asserts only that the write_guard LIST IS NON-EMPTY when a policy's id_from is NONE (repository.move L511-536, E_POLICY_WRITE_GUARD_REQUIRED = 22); nothing on chain evaluates what the Guard authorizes. A Guard that returns true for every caller is therefore accepted silently and is exactly the open door an empty list would have been — the schema warning for 'write_guard missing' does not fire, so the misconfiguration is invisible until exploited. Verified on testnet (test-14, HIGH-04): a NON-merchant signer wrote a forged tracking row for another buyer's order (tx BLA7F62r…), then the merchant's legitimate write simply upserted over it (tx DaZaPn6o…). Every downstream Guard that gates a forward on repository.data EXISTENCE (repository.data has / count where) is satisfied by the forged row, so shipping/return evidence stops being evidence; Repository rows carry no author field, so a signed WTS Proof (proof.signer / proof.about / proof.time) is the only on-chain provenance.",
|
|
144
|
+
"scenario": "Merchant binds a 'true' placeholder as the evidence Repository write_guard to satisfy the schema; a stranger (or the counterparty in a dispute) pre-writes the shipping/return receipt row and the delivery forward's evidence gate passes on forged data",
|
|
145
|
+
"mitigation": "Delete the placeholder: bind the writer. Minimum = context(Signer) equality against a constant Address or a vec_contains_address allowlist entry; better = the merchant Permission entity (permission index) or the Order holder via witness, so the row is attributable to the party that owns the order. For evidence that must survive a dispute, store a signed WTS Proof (Prover+Time+Content, repository.move L160-171) instead of a bare string. If genuinely open writes are intended, use id_from=Signer/Clock instead of a write_guard — that is the protocol's declared way to allow anyone.",
|
|
146
|
+
"evidence": "Tautology: ${tree_folds_always_true_reason}",
|
|
147
|
+
"stakeholders": ["customer", "provider", "arbitrator"]
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"when": { "all": [{ "field": "write_guard_scene", "op": "eq", "value": true }, { "field": "tree_folds_always_true", "op": "eq", "value": false }, { "field": "write_guard_no_identity_check", "op": "eq", "value": true }] },
|
|
151
|
+
"level": "high",
|
|
152
|
+
"title": "Repository write_guard gates a state, not a writer — any qualifying caller may overwrite any row",
|
|
153
|
+
"description": "The policy has a write_guard, but the tree contains no context(Signer) leaf, so it never asks WHO is writing. The gate can be satisfied by anyone who can present the referenced objects (or who simply owns them), and once satisfied the writer may add OR OVERWRITE any data ID under that policy — Repository rows carry no author. Downstream Guards that check existence (repository.data has) then trust data with no provenance.",
|
|
154
|
+
"scenario": "Ship-evidence policy guarded only by 'the submitted Order exists': the buyer writes the seller-side shipping receipt themselves, and the deliver forward's evidence check passes",
|
|
155
|
+
"mitigation": "Add the identity leaf: context(Signer) == a constant merchant Address, or vec_contains_address against an allowlist / permission entity table, or the Order holder derived by witness. Where the row must be provably authored, write a signed WTS Proof rather than a bare value, and have the consuming Guard check proof.attestation == the expected party instead of mere existence.",
|
|
156
|
+
"evidence": "write_guard scene with no context(Signer) leaf in the root",
|
|
157
|
+
"stakeholders": ["customer", "provider", "arbitrator"]
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"when": { "all": [{ "field": "scene_id", "op": "eq", "value": "arbitration_voting_guard" }, { "field": "tree_folds_always_true", "op": "eq", "value": true }] },
|
|
161
|
+
"level": "low",
|
|
162
|
+
"title": "Open-vote tautology on voting_guard — the declared voter universe, not a placeholder",
|
|
163
|
+
"description": "On the Arbitration voting slot an always-true guard is the SANCTIONED open-voting form: every Passport holder passes and votes at the row's FixedValue weight (tpl_voting_guard_open_vote). It matches the tautology signature R-X1-17 hunts, but here the alternative is the real hazard: an EMPTY voting_guard does not mean 'everyone may vote' — plain votes hard-require the vote permission (358), admin-only by default, and a dispute dead-locks when that admin is unresponsive (R-ARB-VOTE-LOCK blocks the service publish; crs9-F-36, mainnet-verified 2026-10-15).",
|
|
164
|
+
"scenario": "A merchant designs a public arbitration venue and binds the always-true voting guard; the tautology check must not scare them into leaving voting_guard empty",
|
|
165
|
+
"mitigation": "None needed — this is the declared intent. Confirm the weight row is FixedValue (flat one-voter-one-vote) or an intentional tier, and remember every vote call must carry the voting_guard payload once the field is set (a plain vote aborts with E_VOTING_GUARD_USED, abort 2). Weighted panels should use tpl_voting_guard_numeric_weight instead.",
|
|
166
|
+
"evidence": "Tautology: ${tree_folds_always_true_reason} (voting_guard scene — open-vote semantics)",
|
|
167
|
+
"stakeholders": ["customer", "provider", "arbitrator"]
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
"when": { "all": [{ "field": "tree_folds_always_true", "op": "eq", "value": true }, { "field": "write_guard_scene", "op": "eq", "value": false }] },
|
|
171
|
+
"level": "high",
|
|
172
|
+
"title": "Guard is a tautology — whatever it gates is unrestricted",
|
|
173
|
+
"description": "The condition tree evaluates to true for every submission and every on-chain state, so binding it to a Forward / buy / allocator / usage slot authorizes every caller while LOOKING guarded. Guards are immutable once published (IMMUT-001): the binding cannot be repaired in place, only by standing up new objects and rebinding what is still mutable (L3 fields).",
|
|
174
|
+
"scenario": "A placeholder guard (constant-true entry, self-comparison, x >= 0) shipped as 'to be filled in later' gets bound to a forward; the workflow accepts any caller from day one and can never be tightened after publish",
|
|
175
|
+
"mitigation": "Before publishing the host object, replace the placeholder with a real predicate; if the intent is genuinely 'no gate', leave the binding EMPTY instead of binding an always-true Guard (an empty binding is honest; a tautology is a false assurance). Re-check with the Guard analyzer after every edit.",
|
|
176
|
+
"evidence": "Tautology: ${tree_folds_always_true_reason}",
|
|
177
|
+
"stakeholders": ["customer", "provider"]
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"when": { "field": "tree_folds_always_false", "op": "eq", "value": true },
|
|
181
|
+
"level": "low",
|
|
182
|
+
"title": "Guard is always false — nothing it gates can ever run",
|
|
183
|
+
"description": "The tree folds to false for every input (the certain-outcome folder found a decisive always-false expression). This is the safe direction of error — it denies rather than opens — and is sometimes intentional (a deliberately frozen edge), but it is far more often a polarity or identifier mistake, and after publish the gated path is dead permanently (IMMUT-001).",
|
|
184
|
+
"scenario": "Merchant wants 'not yet shipped' and writes logic_equal[current_node, shipped_constant] inside a forward that only runs AFTER shipping; the forward can never fire",
|
|
185
|
+
"mitigation": "Confirm the intent. If the edge must ever run, fix the predicate before publishing; if it is a permanent block, prefer NOT binding a Guard at all and instead leaving the edge unreachable in the Machine graph (clearer to readers and to the workflow analyzer).",
|
|
186
|
+
"evidence": "Always-false: ${tree_folds_always_false_reason}",
|
|
187
|
+
"stakeholders": ["provider"]
|
|
188
|
+
}
|
|
189
|
+
]
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"rule_id": "R-X1-18",
|
|
193
|
+
"dimension": "logic_gap",
|
|
194
|
+
"trigger": "A query node sits directly under logic_and/logic_or — a bare Bool clause asserting the POSITIVE state of whatever it reads (OFN mainnet #P-01)",
|
|
195
|
+
"cases": [
|
|
196
|
+
{
|
|
197
|
+
"when": { "field": "bare_bool_query_count", "op": "present" },
|
|
198
|
+
"level": "medium",
|
|
199
|
+
"title": "Bare Bool query clause (${bare_bool_query_csv_sp}) asserts the POSITIVE state — polarity unchecked",
|
|
200
|
+
"description": "A query placed directly under logic_and/logic_or must return Bool and asserts that the condition IS true ('is set / exists / claimed'). OFN mainnet #P-01: a refund guard used a bare order.claimed_by-some query (id 1570) — it reads 'already claimed', so it is FALSE on every fresh order; all five refund rails aborted (code 7), and order_allocators is immutable after publish (service.move asserts !bPublished), so the Service had to be rebuilt from scratch. When the intent is the NEGATIVE — the common refund/double-spend guard pattern ('not yet claimed', 'no allocation yet') — a bare clause expresses the exact opposite of what the author meant.",
|
|
201
|
+
"scenario": "Refund guard with a bare claimed_by query: every refund call aborts on a fresh order, and publish freezes the misconfiguration permanently",
|
|
202
|
+
"mitigation": "Wrap the query in logic_equal with an explicit Bool constant so the polarity is stated: logic_equal[query(order.claimed_by some), Bool false] for 'not yet claimed' (the refund pattern); logic_equal[query(...), Bool true] when the positive state is genuinely required. Re-run the Guard analyzer after the edit.",
|
|
203
|
+
"evidence": "Bare query clause(s) under logic_and/logic_or: ${bare_bool_query_csv_sp}",
|
|
204
|
+
"stakeholders": ["provider", "customer"]
|
|
205
|
+
}
|
|
206
|
+
]
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
"rule_id": "R-X1-19",
|
|
210
|
+
"dimension": "logic_gap",
|
|
211
|
+
"trigger": "A buy-scene guard queries order.* — the Order does not exist at buy time (zrmn-261012 R-BUY-GUARD-CIRCULAR)",
|
|
212
|
+
"cases": [
|
|
213
|
+
{
|
|
214
|
+
"when": { "field": "rx1_19_order_query_count", "op": "gt", "value": 0 },
|
|
215
|
+
"level": "critical",
|
|
216
|
+
"title": "Buy guard queries order.* (${rx1_19_evidence_csv}) — the Order does not exist yet, creation aborts",
|
|
217
|
+
"description": "The buy guard evaluates BEFORE the Order object exists (it gates the transaction that creates it), so every order.* query inside it is circular and cannot resolve. The ziroom mainnet run (zrmn-261012) shipped exactly this shape: a buy guard querying order.item has / order.amount — creation failed at name resolution.",
|
|
218
|
+
"scenario": "Circular buy gate: guard creation or first purchase aborts because the queried Order is the one being created",
|
|
219
|
+
"mitigation": "1) Buy-time state lives on the SERVICE, not the Order: query service.* fields (e.g. service.paused) or use table constants;\n2) Post-purchase invariants (amount, item) belong on forward/allocator guards, which run after the Order exists;\n3) ${rx1_19_evidence_csv}",
|
|
220
|
+
"evidence": "order.* queries in buy-scene guard: ${rx1_19_evidence_csv}",
|
|
221
|
+
"stakeholders": ["provider"]
|
|
222
|
+
}
|
|
223
|
+
]
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"rule_id": "R-C1-01",
|
|
227
|
+
"dimension": "data_source_trust",
|
|
228
|
+
"trigger": "Guard table contains Address constants with b_submission=false; values may change after Guard rebuild",
|
|
229
|
+
"cases": [
|
|
230
|
+
{
|
|
231
|
+
"when": { "field": "const_addr_list", "op": "present" },
|
|
232
|
+
"level": "low",
|
|
233
|
+
"title": "Constant object addresses may be inconsistent after Guard rebuild",
|
|
234
|
+
"description": "Guard table contains ${const_addr_count} Address constants (b_submission=false).Guard is immutable, but if a future Guard rebuild is needed (e.g. to fix logic), the new Guard's table constant addresses may differ from the old version.Objects referencing the old Guard (Machine/Service, etc.) will not auto-update, leading to constant address inconsistency.",
|
|
235
|
+
"scenario": "Guard iteration: after rebuild, constant addresses change but references still point to the old Guard",
|
|
236
|
+
"mitigation": "1) After Guard rebuild, update all references (Machine forward guard, Service buy_guard, etc.);2) Use guard2file to export a backup and record constant-address-to-semantics mappings;3) Document constant-address changes in the migration notes",
|
|
237
|
+
"evidence": "Constant Address entries: ${const_addr_list}",
|
|
238
|
+
"stakeholders": ["provider"]
|
|
239
|
+
}
|
|
240
|
+
]
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
"rule_id": "R-C1-02",
|
|
244
|
+
"dimension": "data_source_trust",
|
|
245
|
+
"trigger": "Guard table contains Entity-object(0xaab) or Registrar(0xaaa) system address constants",
|
|
246
|
+
"cases": [
|
|
247
|
+
{
|
|
248
|
+
"when": { "all": [{ "field": "sys_addr_list", "op": "present" }, { "field": "sys_addr_wrong", "op": "eq", "value": true }] },
|
|
249
|
+
"level": "medium",
|
|
250
|
+
"title": "System address name annotation suspected to be wrong",
|
|
251
|
+
"description": "Chain truth: 0xaab is the Entity object (WOW_ENTITY_OBJECT_ID — where per-address entity registration records live) and 0xaaa is the Registrar object (WOW_REGISTRAR_OBJECT_ID). The SDK exported constants use legacy aliases (ENTITY_REGISTRAR_ADDRESS=0xaab, ENTITY_LINKER_ADDRESS=0xaaa). The detected annotation names a DIFFERENT system object (e.g. 0xaab annotated as linker), which may cause the Guard to query the wrong object.",
|
|
252
|
+
"scenario": "System address misuse: an annotation naming another system object causes query-target confusion",
|
|
253
|
+
"mitigation": "1) 0xaab is the Entity object (registration records; SDK alias 'EntityRegistrar');2) 0xaaa is the Registrar object (SDK alias 'EntityLinker');3) The table entry name should indicate the intended system object purpose",
|
|
254
|
+
"evidence": "System address entries: ${sys_addr_list}",
|
|
255
|
+
"stakeholders": ["provider"]
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
"when": { "all": [{ "field": "sys_addr_list", "op": "present" }, { "field": "sys_addr_wrong", "op": "eq", "value": false }] },
|
|
259
|
+
"level": "low",
|
|
260
|
+
"title": "Guard uses Entity-object/Registrar system address constants",
|
|
261
|
+
"description": "Chain truth: 0xaab is the Entity object (WOW_ENTITY_OBJECT_ID) and 0xaaa is the Registrar object (WOW_REGISTRAR_OBJECT_ID); SDK constants use legacy aliases (ENTITY_REGISTRAR_ADDRESS=0xaab, ENTITY_LINKER_ADDRESS=0xaaa). Address usage looks consistent; keep the name annotation clear to avoid later maintenance confusion.",
|
|
262
|
+
"scenario": "System address usage: alias-vs-Move-name divergence documented for maintainers",
|
|
263
|
+
"mitigation": "1) 0xaab is the Entity object (registration records; SDK alias 'EntityRegistrar');2) 0xaaa is the Registrar object (SDK alias 'EntityLinker');3) The table entry name should indicate the intended system object purpose",
|
|
264
|
+
"evidence": "System address entries: ${sys_addr_list}",
|
|
265
|
+
"stakeholders": ["provider"]
|
|
266
|
+
}
|
|
267
|
+
]
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
"rule_id": "R-C1-03",
|
|
271
|
+
"dimension": "data_source_trust",
|
|
272
|
+
"trigger": "Guard queries Repository data without verifying writer permissions",
|
|
273
|
+
"cases": [
|
|
274
|
+
{
|
|
275
|
+
"when": { "all": [{ "field": "queries_repository", "op": "eq", "value": true }, { "field": "has_signer_check", "op": "eq", "value": false }] },
|
|
276
|
+
"level": "high",
|
|
277
|
+
"title": "Repository data source does not verify writer permissions",
|
|
278
|
+
"description": "Guard queries Repository data but does not verify who has permission to write to that Repository.A malicious writer can manipulate Repository data to deceive the Guard. As a Type1 constant object, the Repository's address is immutable, but its internal data can be modified by authorized writers.",
|
|
279
|
+
"scenario": "Data source manipulation: attacker writes false data so Guard passes",
|
|
280
|
+
"mitigation": "1) Restrict writer permissions in the Repository write_guard;2) Add context(Signer) in the current Guard to verify writer identity;3) Use multi-point data source cross-validation",
|
|
281
|
+
"stakeholders": ["customer", "provider"]
|
|
282
|
+
}
|
|
283
|
+
]
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
"rule_id": "R-C2-01",
|
|
287
|
+
"dimension": "data_source_trust",
|
|
288
|
+
"trigger": "Guard uses multi-hop witness (106/107/108: Arb→Progress/Machine/Service) to derive target object",
|
|
289
|
+
"cases": [
|
|
290
|
+
{
|
|
291
|
+
"when": { "field": "witness_multihop_codes", "op": "truthy" },
|
|
292
|
+
"level": "medium",
|
|
293
|
+
"title": "Multi-hop witness chain derivation may break",
|
|
294
|
+
"description": "Guard uses multi-hop witness [${witness_multihop_csv}] to derive target object.Multi-hop witness (e.g. Arb→Progress requires reading arb.order then order.progress) requires intermediate objects to exist and fields to be set.If an intermediate object does not exist (e.g. Arb's order field is empty) or the relationship chain breaks, witness derivation fails.In the WoWok protocol this usually returns empty or 0, potentially causing unexpected Guard behavior.\n${witness_multihop_names_block}",
|
|
295
|
+
"scenario": "Witness break: intermediate object missing causes derivation failure and unexpected Guard behavior",
|
|
296
|
+
"mitigation": "1) Confirm the Arb object's order field is properly set (Arb is bound to Order at creation);2) Add null checks for derived results in Guard logic;3) Prefer single-hop witness (100-105) to reduce derivation chain length;4) Test the edge case where Arb is not associated with an Order",
|
|
297
|
+
"evidence": "Multi-hop witness codes: ${witness_multihop_csv}",
|
|
298
|
+
"stakeholders": ["customer", "provider", "arbitrator"]
|
|
299
|
+
}
|
|
300
|
+
]
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
"rule_id": "R-C2-02",
|
|
304
|
+
"dimension": "data_source_trust",
|
|
305
|
+
"trigger": "Guard uses witness but source object's object_type may not match the witness source type, or multi-hop chain has missing intermediate objects",
|
|
306
|
+
"cases": [
|
|
307
|
+
{
|
|
308
|
+
"when": { "all": [{ "field": "rc2_02_issue_count", "op": "gt", "value": 0 }, { "field": "rc2_02_has_hard_mismatch", "op": "eq", "value": true }] },
|
|
309
|
+
"level": "medium",
|
|
310
|
+
"title": "witness source object_type explicitly contradicts the witness derivation chain",
|
|
311
|
+
"description": "Guard uses witness derivation, but the source object's object_type in table is either inconsistent with the witness expected source type, or the annotation is missing (preventing validation), or the multi-hop chain lacks an intermediate object.\n${rc2_02_evidence_lines}\nNote: object_type is an auxiliary annotation field on table entries; it is not strictly validated at on-chain creation. However, wrong or missing annotations cause semantic misunderstanding and maintenance difficulty, and may indicate a deeper structural mismatch.",
|
|
312
|
+
"scenario": "Type annotation mismatch: witness source type annotation is wrong, causing semantic confusion",
|
|
313
|
+
"mitigation": "1) Set or fix the table entry's object_type field to match the witness source type;\n2) witness 100-102 source type is Order; 103 is Progress; 104-108 is Arb;\n3) For multi-hop witnesses (106-108), ensure the intermediate Order object is also in the table;\n4) Use wowok_buildin_info(info='guard instructions') to query the full witness definition",
|
|
314
|
+
"evidence": "${rc2_02_evidence_csv}",
|
|
315
|
+
"stakeholders": ["provider"]
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
"when": { "all": [{ "field": "rc2_02_issue_count", "op": "gt", "value": 0 }, { "field": "rc2_02_has_hard_mismatch", "op": "eq", "value": false }] },
|
|
319
|
+
"level": "low",
|
|
320
|
+
"title": "witness source object_type annotation missing or multi-hop chain incomplete",
|
|
321
|
+
"description": "Guard uses witness derivation, but the source object's object_type in table is either inconsistent with the witness expected source type, or the annotation is missing (preventing validation), or the multi-hop chain lacks an intermediate object.\n${rc2_02_evidence_lines}\nNote: object_type is an auxiliary annotation field on table entries; it is not strictly validated at on-chain creation. However, wrong or missing annotations cause semantic misunderstanding and maintenance difficulty, and may indicate a deeper structural mismatch.",
|
|
322
|
+
"scenario": "Type annotation missing: witness source type cannot be validated, raising maintenance risk",
|
|
323
|
+
"mitigation": "1) Set or fix the table entry's object_type field to match the witness source type;\n2) witness 100-102 source type is Order; 103 is Progress; 104-108 is Arb;\n3) For multi-hop witnesses (106-108), ensure the intermediate Order object is also in the table;\n4) Use wowok_buildin_info(info='guard instructions') to query the full witness definition",
|
|
324
|
+
"evidence": "${rc2_02_evidence_csv}",
|
|
325
|
+
"stakeholders": ["provider"]
|
|
326
|
+
}
|
|
327
|
+
]
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
"rule_id": "R-C2-03",
|
|
331
|
+
"dimension": "data_source_trust",
|
|
332
|
+
"trigger": "Guard queries Progress status without verifying Machine publish state",
|
|
333
|
+
"cases": [
|
|
334
|
+
{
|
|
335
|
+
"when": { "all": [{ "field": "queries_progress", "op": "eq", "value": true }, { "field": "has_witness", "op": "eq", "value": true }, { "field": "scene_host_object", "op": "eq", "value": "Machine" }] },
|
|
336
|
+
"level": "medium",
|
|
337
|
+
"title": "Progress data depends on Machine immutability",
|
|
338
|
+
"description": "Guard queries Progress status via witness, and the Guard is bound to a Machine.If the Machine is not published (bPublished=false), the Provider can modify the Machine node structure, causing node names validated by the Guard to become invalid or be renamed. Progress's current node name, node time, etc. all depend on the Machine's node definitions.",
|
|
339
|
+
"scenario": "Provider modifies Machine node names to invalidate Guard verification",
|
|
340
|
+
"mitigation": "1) Ensure the Machine is published (bPublished=true) before binding the Guard;2) Query the Machine.bPublished field in the Guard to verify;3) Use node IDs instead of node names for comparison",
|
|
341
|
+
"stakeholders": ["customer"]
|
|
342
|
+
}
|
|
343
|
+
]
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
"rule_id": "R-C2-04",
|
|
347
|
+
"dimension": "data_source_trust",
|
|
348
|
+
"trigger": "Guard uses witness query and the query parameter requires type conversion (e.g. Address → U64 timestamp key)",
|
|
349
|
+
"cases": [
|
|
350
|
+
{
|
|
351
|
+
"when": { "all": [{ "field": "has_witness", "op": "eq", "value": true }, { "any": [{ "field": "rc2_04_queries_repo", "op": "eq", "value": true }, { "field": "rc2_04_queries_progress_history", "op": "eq", "value": true }] }] },
|
|
352
|
+
"level": "medium",
|
|
353
|
+
"title": "witness query parameter requires type translation (missing will cause type mismatch or wrong comparison)",
|
|
354
|
+
"description": "Guard queries object fields via witness, but the query parameter type may not match the type declared in table.\nTypical scenarios:\n - Repository.data query: the key may be of Address type (vector<u8> address representation in Move), but the actual semantics is a U64 timestamp, requiring convert_number_address translation\n - Progress.history query: Forward ID may need to be converted from String to Address\n - Order field query: some ID fields may be stored as Address but need U256 for comparison${rc2_04_conversion_note}",
|
|
355
|
+
"scenario": "Query parameter type does not match the parameters type defined by GUARDQUERY, causing creation failure or runtime comparison error",
|
|
356
|
+
"mitigation": "1) Query GUARDQUERY to confirm the parameters type and return type of each query instruction;\n2) If table declares Address but the query needs U64, use convert_number_address to translate;\n3) Use wowok_buildin_info info='guard instructions' to verify parameter types;\n4) Verify type compatibility via schema_query before creation",
|
|
357
|
+
"evidence": "${rc2_04_conversion_evidence}",
|
|
358
|
+
"stakeholders": ["provider", "customer"]
|
|
359
|
+
}
|
|
360
|
+
]
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
"rule_id": "R-C2-05",
|
|
364
|
+
"dimension": "data_source_trust",
|
|
365
|
+
"trigger": "Guard uses convert_witness but the query path prefix does not live on the witness target type (zrmn-261012 R-WITNESS-01: 17 mainnet guards rejected)",
|
|
366
|
+
"cases": [
|
|
367
|
+
{
|
|
368
|
+
"when": { "field": "rc2_05_mismatch_count", "op": "gt", "value": 0 },
|
|
369
|
+
"level": "critical",
|
|
370
|
+
"title": "Query path contradicts the witness target type — the chain rejects this guard",
|
|
371
|
+
"description": "convert_witness resolves the object reference to the edge's TARGET type, and the query path prefix must exist on that type. The on-chain witness matrix (common.move) is directional and has NO reverse edges.\n${rc2_05_evidence_lines}\nThis shape aborts at guard creation (native verifier type check) or silently gates on nothing — both are deterministic failures.",
|
|
372
|
+
"scenario": "Witness misuse: convert to Progress then query order.* — type mismatch rejects the guard",
|
|
373
|
+
"mitigation": "1) Make the query prefix match the witness target: 100 OrderProgress→progress.*, 101 OrderMachine→machine.*, 102 OrderService→service.*, 103 ProgressMachine→machine.*, 104 ArbOrder→order.*, 105 ArbArbitration→arb.*, 106-108 Arb→progress./service./machine.*, 109 OrderAllocation→allocation.*;\n2) If you meant to read Order fields, DROP the convert_witness (query order.* directly on the submitted Order);\n3) Run analyze_guard_semantics before creation",
|
|
374
|
+
"evidence": "${rc2_05_evidence_lines}",
|
|
375
|
+
"stakeholders": ["provider"]
|
|
376
|
+
}
|
|
377
|
+
]
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
"rule_id": "R-C2-06",
|
|
381
|
+
"dimension": "data_source_trust",
|
|
382
|
+
"trigger": "Guard queries progress.* without convert_witness on an object that is not a Progress (no PROGRESS→ORDER reverse edge)",
|
|
383
|
+
"cases": [
|
|
384
|
+
{
|
|
385
|
+
"when": { "all": [{ "field": "rc2_06_issue_count", "op": "gt", "value": 0 }, { "field": "rc2_06_has_hard_mismatch", "op": "eq", "value": true }] },
|
|
386
|
+
"level": "critical",
|
|
387
|
+
"title": "progress.* queried on a non-Progress object without conversion — unresolvable on-chain",
|
|
388
|
+
"description": "The chain has NO PROGRESS→ORDER reverse edge: the only legal way to read progress fields from an Order submission is convert_witness 100 (OrderProgress).\n${rc2_06_evidence_lines}",
|
|
389
|
+
"scenario": "Reverse-edge misuse: order submitted, progress.current queried without conversion — query returns empty or aborts",
|
|
390
|
+
"mitigation": "1) Add convert_witness 100 (or the string name 'OrderProgress') to the query's object ref;\n2) Keep the query path as progress.* after conversion;\n3) Alternatively submit the Progress object itself and annotate object_type=Progress",
|
|
391
|
+
"evidence": "${rc2_06_evidence_lines}",
|
|
392
|
+
"stakeholders": ["provider"]
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
"when": { "all": [{ "field": "rc2_06_issue_count", "op": "gt", "value": 0 }, { "field": "rc2_06_has_hard_mismatch", "op": "eq", "value": false }] },
|
|
396
|
+
"level": "high",
|
|
397
|
+
"title": "progress.* queried on an annotated submission without object_type — verify the source type",
|
|
398
|
+
"description": "A query reads progress.* from a submission without convert_witness, and the table entry lacks an object_type annotation, so the source type cannot be validated statically.\n${rc2_06_evidence_lines}\nIf the submitted value is the ORDER address, the query is unresolvable (no PROGRESS→ORDER reverse edge).",
|
|
399
|
+
"scenario": "Unverifiable source type: progress query on an unannotated submission may target the Order",
|
|
400
|
+
"mitigation": "1) Annotate the table entry's object_type (Progress/Order/Arb);\n2) If the submission is the Order, add convert_witness 100 (OrderProgress);\n3) Verify with analyze_guard_semantics before creation",
|
|
401
|
+
"evidence": "${rc2_06_evidence_lines}",
|
|
402
|
+
"stakeholders": ["provider"]
|
|
403
|
+
}
|
|
404
|
+
]
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
"rule_id": "R-C2-07",
|
|
408
|
+
"dimension": "data_source_trust",
|
|
409
|
+
"trigger": "Guard uses a repository.data 'keys where' predicate whose parameter shape diverges from the native signature (nnd3-mn-261103 F-NND-04: parameter-carrying 1177 (Address, VectorU8) is the native canonical shape and works on chain — mainnet-verified)",
|
|
410
|
+
"cases": [
|
|
411
|
+
{
|
|
412
|
+
"when": { "field": "rc2_07_keys_where_count", "op": "gt", "value": 0 },
|
|
413
|
+
"level": "high",
|
|
414
|
+
"title": "keys-where query parameter shape diverges from the native signature",
|
|
415
|
+
"description": "The native 1177 'repository.data keys where' signature IS (Address, VectorU8) — wobject.rs:773-780, enforced len()==2 in repository.rs data_keys_where. The parameter-carrying canonical shape WORKS on chain (nnd3 mainnet: the 1177 prize rail paid out, tx CdNmNcTf…/GytKV75b…), and the parameter-free Range-gte shape (predicate in the BCS conditions blob) also stays valid. What aborts is a DIVERGENT shape: wrong arity or a constant whose value_type can never materialize as the required parameter type — MovePrimitiveRuntimeError GUARD_QUERY_PARAM_INVALID at verification. ${rc2_07_keys_where_count} divergent node(s) found:\n${rc2_07_evidence_lines}",
|
|
416
|
+
"scenario": "Native abort: a keys-where node with a parameter arity/type mismatch fails verification with GUARD_QUERY_PARAM_INVALID",
|
|
417
|
+
"mitigation": "1) Match the native signature exactly — 1177 wants (Address candidate id, VectorU8 BCS predicate);\n2) or drop parameters entirely and express the predicate as Range-gte inside the BCS conditions blob (batch-14 certified shape);\n3) See guard-design-patterns pattern.repository_data_check and LAYERED RATING-RANGE RULING in builtin-templates for proven shapes",
|
|
418
|
+
"stakeholders": ["provider", "customer"]
|
|
419
|
+
}
|
|
420
|
+
]
|
|
421
|
+
},
|
|
422
|
+
{
|
|
423
|
+
"rule_id": "R-C3-01",
|
|
424
|
+
"dimension": "submission_forgery",
|
|
425
|
+
"trigger": "Guard depends on submitted data but does not verify signer identity (no Signer check=high; with Signer check=info downgrade)",
|
|
426
|
+
"cases": [
|
|
427
|
+
{
|
|
428
|
+
"when": { "all": [{ "field": "has_submission", "op": "eq", "value": true }, { "field": "scene_binding_field", "op": "neq", "value": "voting_guard" }, { "field": "rc3_01_sharing_exempt", "op": "eq", "value": false }, { "field": "scene_id", "op": "eq", "value": "machine_forward_guard" }, { "field": "has_signer_check", "op": "eq", "value": false }] },
|
|
429
|
+
"level": "medium",
|
|
430
|
+
"title": "Submitted data not bound to signer identity (Forward scenario implicitly verified by permissionIndex)",
|
|
431
|
+
"description": "Guard accepts runtime-submitted data (b_submission=true), and root does not explicitly verify Signer.This Guard is used for Machine Forward; Forward's permissionIndex/namedOperator already implicitly verifies operator identity, so the Signer binding risk is reduced. But permissionIndex only verifies 'operator has permission', not 'submitted data belongs to operator' — for example, a merchant holding permissionIndex can still submit someone else's credentials.",
|
|
432
|
+
"scenario": "In-permission forgery: an authorized operator submits someone else's data (e.g. someone else's Merkle Root)",
|
|
433
|
+
"mitigation": "1) If the submitted data should belong to the operator (e.g. the operator's address), it is still recommended to add context(Signer) binding;2) If the submitted data is a public credential (e.g. Merkle Root string), the current risk is acceptable;3) Use retained_submission to retain submitted data for later audit",
|
|
434
|
+
"stakeholders": ["customer", "provider"]
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
"when": { "all": [{ "field": "has_submission", "op": "eq", "value": true }, { "field": "rc3_01_order_anchored", "op": "eq", "value": true }, { "field": "rc3_01_sharing_exempt", "op": "eq", "value": false }, { "field": "has_signer_check", "op": "eq", "value": false }] },
|
|
438
|
+
"level": "info",
|
|
439
|
+
"title": "Order-anchored recipient slots — Signer binding is structurally inapplicable",
|
|
440
|
+
"description": "Every submission slot is unread by the condition tree, so submitted values cannot influence the verdict. In the order_allocators scene the only consumption is the chain-side GuardIdentifier recipient read, which payment_info.for_object hard-binds to the paying order: order-created allocations always bind, and submitted != for_object aborts (ERECIPIENT_NOT_FOR_OBJECT). Adding a Signer binding here would BREAK keeper/service-triggered rails — a merchant-triggered refund cannot satisfy Signer==recipient. Verified live on mainnet: a merchant-triggered refund still paid the buyer (ptrn-mn-261013 F-03).",
|
|
441
|
+
"scenario": "Order-anchored payout rails (refund / recovery / settlement allocators resolved through a GuardIdentifier recipient).",
|
|
442
|
+
"mitigation": "No change needed. Residual: only standalone (non-order) Allocation runs with an unbound payment_info let the passport builder choose the recipient — that surface is the allocation owner's policy decision, not a guard defect. If a submitted slot is later READ by the condition tree, the normal R-C3-01 binding rules resume.",
|
|
443
|
+
"stakeholders": ["provider", "customer"]
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
"when": { "all": [{ "field": "has_submission", "op": "eq", "value": true }, { "field": "scene_binding_field", "op": "neq", "value": "voting_guard" }, { "field": "rc3_01_sharing_exempt", "op": "eq", "value": false }, { "field": "has_signer_check", "op": "eq", "value": false }] },
|
|
447
|
+
"level": "high",
|
|
448
|
+
"title": "Submitted data not bound to signer identity",
|
|
449
|
+
"description": "Guard accepts runtime-submitted data (b_submission=true), but does not verify whether the submitter is the current transaction signer.An attacker can submit someone else's data (e.g. someone else's address, someone else's credentials) to pass the Guard.Type3 submitted objects are isomorphic with Type1 at the native layer (TYPE_QUERY+TYPE_CONSTANT), the only difference being that the value is injected by submission, so identity must be bound via logical constraints.",
|
|
450
|
+
"scenario": "Identity forgery: attacker submits someone else's address to impersonate an authorized user",
|
|
451
|
+
"mitigation": "1) Add context(Signer) binding with the submitted data for verification;2) Use vec_contains_address to verify the signer is in the whitelist;3) Use Passport credentials instead of bare address submission",
|
|
452
|
+
"stakeholders": ["customer", "provider"],
|
|
453
|
+
"exposure": {
|
|
454
|
+
"loss_parties": [
|
|
455
|
+
{ "role": "merchant", "basis": "An attacker who passes the unbound Guard exercises the operation it gates as if authorized — the project's funds and objects are exposed to unauthorized execution." },
|
|
456
|
+
{ "role": "buyer", "basis": "Forged submissions can push the buyer's order through states the buyer never authorized." }
|
|
457
|
+
],
|
|
458
|
+
"gain_paths": [
|
|
459
|
+
{
|
|
460
|
+
"role": "neutral",
|
|
461
|
+
"path": "The attacker submits someone else's address or credential, the unbound check passes, and the gated operation (forward/claim/allocation) executes for the attacker's benefit.",
|
|
462
|
+
"viability": "viable",
|
|
463
|
+
"gate": "The Guard verifies submitted values but never ties them to the transaction signer — nothing on-chain blocks the forged-submission pass."
|
|
464
|
+
}
|
|
465
|
+
]
|
|
466
|
+
}
|
|
467
|
+
},
|
|
468
|
+
{
|
|
469
|
+
"when": { "all": [{ "field": "has_submission", "op": "eq", "value": true }, { "field": "scene_binding_field", "op": "neq", "value": "voting_guard" }, { "field": "rc3_01_sharing_exempt", "op": "eq", "value": false }, { "field": "has_signer_check", "op": "eq", "value": true }] },
|
|
470
|
+
"level": "low",
|
|
471
|
+
"title": "Submitted data is indirectly bound via context(Signer) (confirm the binding direction is correct)",
|
|
472
|
+
"description": "Guard accepts runtime-submitted data, and the root subtree contains a context(Signer) check, forming an indirect binding between submitted data and signer, reducing forgery risk.But manual confirmation is needed: the constant compared with context(Signer) is the correct role (e.g. Provider address rather than Customer address), and the submitted data should indeed be provided by that signer. See R-C4-01 Signer direction risk.",
|
|
473
|
+
"scenario": "Indirect binding to confirm: whether the Signer check direction matches the submitted data ownership",
|
|
474
|
+
"mitigation": "1) Confirm context(Signer) is compared with the correct table constant (Provider address rather than Customer address);2) Confirm the source role of the submitted data matches the Signer check;3) For stricter binding, use query to verify the submitter's on-chain identity",
|
|
475
|
+
"stakeholders": ["customer", "provider"]
|
|
476
|
+
}
|
|
477
|
+
]
|
|
478
|
+
},
|
|
479
|
+
{
|
|
480
|
+
"rule_id": "R-C3-02",
|
|
481
|
+
"dimension": "submission_forgery",
|
|
482
|
+
"trigger": "voting_guard weight comes from submitted data without verifying source",
|
|
483
|
+
"cases": [
|
|
484
|
+
{
|
|
485
|
+
"when": { "all": [{ "field": "scene_binding_field", "op": "eq", "value": "voting_guard" }, { "field": "rc3_02_numeric_count", "op": "gt", "value": 0 }] },
|
|
486
|
+
"level": "critical",
|
|
487
|
+
"title": "Voting weight comes from user submission and may be forged",
|
|
488
|
+
"description": "voting_guard weight data comes from table entries with b_submission=true (Type3 submitted values).If the weight is not verified through EntityRegistrar or other trusted sources, a voter can submit arbitrarily high weights to manipulate the voting result.Type3 submitted values are only validated by type byte (value[0]) at the native layer; value range and source are not checked.",
|
|
489
|
+
"scenario": "Weight forgery: voters submit fake high scores to manipulate the arbitration result",
|
|
490
|
+
"mitigation": "1) Weights should be queried from EntityRegistrar rather than submitted by users;2) Use query(entity.records) to obtain on-chain registered reputation scores;3) Verify in the Guard that the submitted weight matches the on-chain record",
|
|
491
|
+
"evidence": "Submitted numeric entries: ${rc3_02_numeric_list}",
|
|
492
|
+
"stakeholders": ["arbitrator"],
|
|
493
|
+
"exposure": {
|
|
494
|
+
"loss_parties": [
|
|
495
|
+
{ "role": "buyer", "basis": "A forged voting weight can swing the arbitration ruling — the buyer may be denied a deserved payout or charged a wrongful one." },
|
|
496
|
+
{ "role": "merchant", "basis": "The same manipulated ruling can force an unjustified compensation payout from the merchant side." }
|
|
497
|
+
],
|
|
498
|
+
"gain_paths": [
|
|
499
|
+
{
|
|
500
|
+
"role": "neutral",
|
|
501
|
+
"path": "A voter submits an arbitrarily high weight in the passport; the voting count consumes the forged value directly.",
|
|
502
|
+
"viability": "viable",
|
|
503
|
+
"gate": "Submitted numeric entries are only type-byte validated — no on-chain check ties the weight to a trusted source."
|
|
504
|
+
}
|
|
505
|
+
]
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
]
|
|
509
|
+
},
|
|
510
|
+
{
|
|
511
|
+
"rule_id": "R-C3-03",
|
|
512
|
+
"dimension": "submission_forgery",
|
|
513
|
+
"trigger": "Guard contains Address entries with b_submission=true; the runtime submitted object type may not match expectations",
|
|
514
|
+
"cases": [
|
|
515
|
+
{
|
|
516
|
+
"when": { "all": [{ "field": "rc3_03_submitted_addr_count", "op": "gt", "value": 0 }, { "field": "root_has_query", "op": "eq", "value": true }, { "field": "rc3_03_no_type_count", "op": "gt", "value": 0 }] },
|
|
517
|
+
"level": "medium",
|
|
518
|
+
"title": "Submitted object missing object_type annotation; runtime type validation relies on native inference",
|
|
519
|
+
"description": "Guard contains ${rc3_03_submitted_addr_count} Address entries with b_submission=true (Type3 submitted objects).The native layer (passport.rs#parse_table_items) only checks the value[0] type byte for submission; object_type is derived at runtime by wobject_type and does not strictly validate the actual submitted object type.\nWarning: ${rc3_03_no_type_count} entries are missing object_type annotation, semantics are unclear.",
|
|
520
|
+
"scenario": "Type mismatch: submitting a wrong-typed object causes query to return unexpected values",
|
|
521
|
+
"mitigation": "1) Annotate object_type for all Address entries with b_submission=true;2) object_type should match the object type expected by the query instruction;3) Indirectly verify the object type via query results in Guard logic (e.g. query order.amount to verify it is an Order)",
|
|
522
|
+
"evidence": "${rc3_03_evidence}",
|
|
523
|
+
"stakeholders": ["customer", "provider"]
|
|
524
|
+
},
|
|
525
|
+
{
|
|
526
|
+
"when": { "all": [{ "field": "rc3_03_submitted_addr_count", "op": "gt", "value": 0 }, { "field": "root_has_query", "op": "eq", "value": true }, { "field": "rc3_03_no_type_count", "op": "eq", "value": 0 }] },
|
|
527
|
+
"level": "low",
|
|
528
|
+
"title": "Submitted object type validation relies on runtime native inference",
|
|
529
|
+
"description": "Guard contains ${rc3_03_submitted_addr_count} Address entries with b_submission=true (Type3 submitted objects).The native layer (passport.rs#parse_table_items) only checks the value[0] type byte for submission; object_type is derived at runtime by wobject_type and does not strictly validate the actual submitted object type.\nobject_type is annotated, but still confirm the annotation matches what the query expects.",
|
|
530
|
+
"scenario": "Type mismatch: submitting a wrong-typed object causes query to return unexpected values",
|
|
531
|
+
"mitigation": "1) Annotate object_type for all Address entries with b_submission=true;2) object_type should match the object type expected by the query instruction;3) Indirectly verify the object type via query results in Guard logic (e.g. query order.amount to verify it is an Order)",
|
|
532
|
+
"evidence": "${rc3_03_evidence}",
|
|
533
|
+
"stakeholders": ["customer", "provider"]
|
|
534
|
+
}
|
|
535
|
+
]
|
|
536
|
+
},
|
|
537
|
+
{
|
|
538
|
+
"rule_id": "R-C3-04",
|
|
539
|
+
"dimension": "binding_risk",
|
|
540
|
+
"trigger": "Repository write_guard does not verify id_from_submission type",
|
|
541
|
+
"cases": [
|
|
542
|
+
{
|
|
543
|
+
"when": { "field": "scene_binding_field", "op": "eq", "value": "write_guard" },
|
|
544
|
+
"level": "high",
|
|
545
|
+
"title": "Repository write_guard must verify id_from_submission type",
|
|
546
|
+
"description": "The table entry referenced by Repository write_guard's id_from_submission must be of Address type (Type3 submitted object).The entry referenced by data_from_submission must match the Repository value_type.Type mismatch will cause write failure or data corruption. The write_guard submission contains both id and data parts; the native layer distinguishes them by op_code, but value types must match the table declaration.",
|
|
547
|
+
"scenario": "Type mismatch: write failure or data corruption",
|
|
548
|
+
"mitigation": "1) Confirm the entry referenced by id_from_submission has value_type=Address;2) Confirm the entry referenced by data_from_submission has value_type matching the Repository;3) Cover write scenarios in gen_passport tests",
|
|
549
|
+
"stakeholders": ["provider"]
|
|
550
|
+
}
|
|
551
|
+
]
|
|
552
|
+
},
|
|
553
|
+
{
|
|
554
|
+
"rule_id": "R-C3-05",
|
|
555
|
+
"dimension": "submission_forgery",
|
|
556
|
+
"trigger": "Guard accepts a runtime-submitted Order/Progress/Arb object (Type3) but does NOT verify the submitted object belongs to the current project (Machine or Service). The WoWok runtime does NOT enforce any binding between the submitted order_id and the actual Progress being forwarded — the guard verification receives only the caller-provided submission bytes, never the Progress object under advancement. A caller can therefore submit an unrelated order_id from a DIFFERENT project while forwarding a different Progress, causing witness=100 (Order->Progress) to evaluate against foreign data.",
|
|
557
|
+
"cases": [
|
|
558
|
+
{
|
|
559
|
+
"when": { "all": [{ "field": "rc3_05_applies", "op": "eq", "value": true }, { "field": "rc3_05_critical", "op": "eq", "value": true }] },
|
|
560
|
+
"level": "critical",
|
|
561
|
+
"title": "Submitted Order/Progress/Arb is NOT verified to belong to the current project (cross-project bypass — CRITICAL trust-boundary gap)",
|
|
562
|
+
"description": "Guard accepts runtime-submitted Order/Progress/Arb object(s) [${rc3_05_unbound_csv}] but the root does NOT verify the submitted object belongs to the current project (no query of order.service/order.machine/progress.machine/arb.service compared to a project constant).\n\nTRUST-BOUNDARY GAP (verified via Move source):\n - The Passport submission is built by the CALLER, not auto-injected by the runtime\n - the guard verification receives ONLY the caller-provided submission bytes — it never sees the Progress/Order actually being forwarded\n - the passport-driven forward performs NO linkage check between the passport submission and the Progress under advancement\n - Even the order forward's E_ORDER_NOT_MATCH only checks the separate `order:&Order` parameter, NOT the order_id embedded in the passport submission\n\nEXPLOIT (scene=${rc3_05_scene_label}):\n 1. Attacker holds Order Y from project B (where progress.current_time is old enough to pass the time-lock)\n 2. Attacker calls forward on Order X's Progress (project A, freshly entered the node)\n 3. Attacker submits Order Y's ID in the passport (lying about which order is being forwarded)\n 4. Guard's witness=100 reads Order Y's Progress -> time-lock passes (Order Y is old)\n 5. forward actually executes on Order X's Progress -> TIME-LOCK BYPASSED\n\nThis is distinct from R-C3-01 (Signer binding — WHO can submit) and R-C3-03 (type matching — WHAT type is submitted). R-C3-05 addresses WHETHER the submitted object belongs to the current project — a third orthogonal axis of submission trust. Even with R-C3-01 satisfied (authorized Signer) and R-C3-03 satisfied (correct type), the Signer can still submit an unrelated project's object.",
|
|
563
|
+
"scenario": "Cross-project bypass: authorized signer submits an unrelated project's order/progress/arb to bypass time-lock, status, or allocation conditions",
|
|
564
|
+
"mitigation": "Add a project-binding check to the root (wrap existing root in logic_and):\n - For submitted Order: add logic_equal[query(1563: order.service), identifier[N](project_service_address)] — RECOMMENDED (service is the canonical project anchor)\n - For submitted Order: add logic_equal[query(1560: order.machine), identifier[N](project_machine_address)] — alternative (machine anchor)\n - For submitted Progress: add logic_equal[query(1250: progress.machine), identifier[N](project_machine_address)]\n - For submitted Arb: add logic_equal[query(1402: arb.service), identifier[N](project_service_address)]\n - Use witness=102 (TypeOrderService) on the submitted Order to derive the Service, then compare to the project service constant\n\nIntentional cross-project exception: if the Guard is DESIGNED to accept cross-project submissions (rare), document this explicitly in the description and add a binding_hint annotation 'cross_project_intentional:true' to suppress this rule.",
|
|
565
|
+
"evidence": "Unbound submitted project-relevant entries: ${rc3_05_unbound_csv}. Scene: ${rc3_05_scene_label}. Missing project-binding queries: none of [1563(order.service), 1560(order.machine), 1250(progress.machine), 1402(arb.service)] present in root.",
|
|
566
|
+
"stakeholders": ["customer", "provider", "arbitrator"],
|
|
567
|
+
"exposure": {
|
|
568
|
+
"loss_parties": [
|
|
569
|
+
{ "role": "merchant", "basis": "Time-lock, status and allocation conditions stop protecting the project — funds can be released before the merchant's obligations are met." },
|
|
570
|
+
{ "role": "buyer", "basis": "The buyer's order protections (time-locks, status gates) can be bypassed with a foreign project's object." }
|
|
571
|
+
],
|
|
572
|
+
"gain_paths": [
|
|
573
|
+
{
|
|
574
|
+
"role": "neutral",
|
|
575
|
+
"path": "The caller submits an unrelated project's order/progress id in the passport while forwarding the real Progress; the Guard witness reads the foreign object and passes.",
|
|
576
|
+
"viability": "viable",
|
|
577
|
+
"gate": "The runtime never links the passport submission to the Progress under advancement — the bypass executes exactly as described in the exploit."
|
|
578
|
+
}
|
|
579
|
+
]
|
|
580
|
+
}
|
|
581
|
+
},
|
|
582
|
+
{
|
|
583
|
+
"when": { "all": [{ "field": "rc3_05_applies", "op": "eq", "value": true }, { "field": "rc3_05_critical", "op": "eq", "value": false }] },
|
|
584
|
+
"level": "info",
|
|
585
|
+
"title": "Submitted Order/Progress/Arb is NOT verified to belong to the current project — advisory: the chain now rejects cross-order submissions at the Progress layer (protocol v148, N-1 assert_task_binding); keep the project binding as defense-in-depth",
|
|
586
|
+
"description": "Guard accepts runtime-submitted Order/Progress/Arb object(s) [${rc3_05_unbound_csv}] but the root does NOT verify the submitted object belongs to the current project (no query of order.service/order.machine/progress.machine/arb.service compared to a project constant).\n\nTRUST-BOUNDARY GAP (verified via Move source):\n - The Passport submission is built by the CALLER, not auto-injected by the runtime\n - the guard verification receives ONLY the caller-provided submission bytes — it never sees the Progress/Order actually being forwarded\n - the passport-driven forward performs NO linkage check between the passport submission and the Progress under advancement\n - Even the order forward's E_ORDER_NOT_MATCH only checks the separate `order:&Order` parameter, NOT the order_id embedded in the passport submission\n\nEXPLOIT (scene=${rc3_05_scene_label}):\n 1. Attacker holds Order Y from project B (where progress.current_time is old enough to pass the time-lock)\n 2. Attacker calls forward on Order X's Progress (project A, freshly entered the node)\n 3. Attacker submits Order Y's ID in the passport (lying about which order is being forwarded)\n 4. Guard's witness=100 reads Order Y's Progress -> time-lock passes (Order Y is old)\n 5. forward actually executes on Order X's Progress -> TIME-LOCK BYPASSED\n\nThis is distinct from R-C3-01 (Signer binding — WHO can submit) and R-C3-03 (type matching — WHAT type is submitted). R-C3-05 addresses WHETHER the submitted object belongs to the current project — a third orthogonal axis of submission trust. Even with R-C3-01 satisfied (authorized Signer) and R-C3-03 satisfied (correct type), the Signer can still submit an unrelated project's object.",
|
|
587
|
+
"scenario": "Cross-project bypass: authorized signer submits an unrelated project's order/progress/arb to bypass time-lock, status, or allocation conditions",
|
|
588
|
+
"mitigation": "Add a project-binding check to the root (wrap existing root in logic_and):\n - For submitted Order: add logic_equal[query(1563: order.service), identifier[N](project_service_address)] — RECOMMENDED (service is the canonical project anchor)\n - For submitted Order: add logic_equal[query(1560: order.machine), identifier[N](project_machine_address)] — alternative (machine anchor)\n - For submitted Progress: add logic_equal[query(1250: progress.machine), identifier[N](project_machine_address)]\n - For submitted Arb: add logic_equal[query(1402: arb.service), identifier[N](project_service_address)]\n - Use witness=102 (TypeOrderService) on the submitted Order to derive the Service, then compare to the project service constant\n\nIntentional cross-project exception: if the Guard is DESIGNED to accept cross-project submissions (rare), document this explicitly in the description and add a binding_hint annotation 'cross_project_intentional:true' to suppress this rule.",
|
|
589
|
+
"evidence": "Unbound submitted project-relevant entries: ${rc3_05_unbound_csv}. Scene: ${rc3_05_scene_label}. Missing project-binding queries: none of [1563(order.service), 1560(order.machine), 1250(progress.machine), 1402(arb.service)] present in root. Chain backstop (protocol v148): progress.move assert_task_binding requires the passport's identifier-254 submission to equal Progress.task on every guard-gated forward of a task-bound Progress — cross-order replay aborts with 11 (binding required) / 12 (binding mismatch).",
|
|
590
|
+
"stakeholders": ["customer", "provider", "arbitrator"],
|
|
591
|
+
"exposure": {
|
|
592
|
+
"loss_parties": [
|
|
593
|
+
{ "role": "merchant", "basis": "Historical (pre-v148): time-lock, status and allocation conditions stopped protecting the project — funds could be released before the merchant's obligations were met. Since protocol v148 the chain rejects cross-order evidence at the Progress layer, so this loss path no longer materializes." },
|
|
594
|
+
{ "role": "buyer", "basis": "Historical (pre-v148): the buyer's order protections (time-locks, status gates) could be bypassed with a foreign project's object. Since protocol v148 the task binding closes that path; the missing project queries remain a defense-in-depth gap only." }
|
|
595
|
+
],
|
|
596
|
+
"gain_paths": [
|
|
597
|
+
{
|
|
598
|
+
"role": "neutral",
|
|
599
|
+
"path": "The caller submits an unrelated project's order/progress id in the passport while forwarding the real Progress; the Guard witness reads the foreign object and passes.",
|
|
600
|
+
"viability": "blocked",
|
|
601
|
+
"gate": "protocol v148 assert_task_binding runs on every guard-gated forward of a task-bound Progress and aborts when the identifier-254 submission does not equal Progress.task — the forged-evidence forward is rejected by the chain after guard verification, before the node can advance."
|
|
602
|
+
}
|
|
603
|
+
]
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
]
|
|
607
|
+
},
|
|
608
|
+
{
|
|
609
|
+
"rule_id": "R-C3-06",
|
|
610
|
+
"dimension": "binding_risk",
|
|
611
|
+
"trigger": "Guard is bound to Service order_allocators (service_order_allocators_guard scene). In this scene the Guard decides IF allocation happens, while sharing.who decides WHERE funds go. If sharing.who=Signer, the transaction caller receives the funds — so a Guard that does NOT bind context(Signer) lets ANYONE who passes the Guard steal 100% of the order funds. This is a Guard+sharing coupling risk: neither piece alone reveals the theft — only their combination.",
|
|
612
|
+
"cases": [
|
|
613
|
+
{
|
|
614
|
+
"when": { "all": [{ "field": "rc3_06_applies", "op": "eq", "value": true }, { "field": "rc3_06_signer_sharing", "op": "eq", "value": true }] },
|
|
615
|
+
"level": "critical",
|
|
616
|
+
"title": "allocators Guard without Signer binding — ${rc3_06_title_suffix}",
|
|
617
|
+
"description": "Guard is bound to Service order_allocators but does NOT verify context(Signer). In the allocators scene, sharing.who determines the fund recipient:\n - sharing.who=Signer → funds flow to the CALLER (transaction signer)\n - sharing.who=Entity → funds flow to a FIXED address (Treasury/personal)\n - sharing.who=GuardIdentifier → funds flow to the submitted constrained object (e.g. an Order), receivable only by that object's owner (object receipt = owner receipt); see RC-FIND-03 residual in the recipient constraint audit\n\nWhen sharing.who=Signer and the Guard does not bind Signer, ANY caller who passes the Guard receives the order funds — a direct theft. Even an authorized caller is unnecessary: the attacker only needs to pass the Guard's condition (e.g. submit any completed order_id), then the funds go to their own address.\n\nThis is distinct from R-C3-01 (generic Signer binding) and R-C3-05 (cross-project bypass). R-C3-06 addresses the allocators-specific Guard+sharing coupling: the SAFE design uses sharing.who=Entity so the recipient is fixed, making Guard Signer binding unnecessary.\n\nsharing_recipients hint: ${rc3_06_recipients_label}",
|
|
618
|
+
"scenario": "Fund theft: attacker passes the allocators Guard (e.g. submits a completed order_id) and sharing.who=Signer routes 100% of the order funds to the attacker's address",
|
|
619
|
+
"mitigation": "TWO mitigation options:\n (A) Traditional: add context(Signer) binding to the Guard root (logic_equal[context(Signer), identifier[N](authorized_address)]) so only the authorized recipient can trigger allocation.\n (B) PREFERRED: use sharing.who=Entity (Treasury object or fixed personal address) in the Allocator's sharing config. Funds then always flow to the designated recipient regardless of who triggers allocation — the Guard does NOT need to bind Signer. This is more robust because it does not depend on Guard correctness.\n\nDesign checklist when using sharing.who=Entity:\n - If Entity points to a Treasury object, verify the Treasury's permission is consistent with the Service's permission (different permissions = different permission organizations = minor risk).\n - allocators require unique guard addresses: create separate Guard objects (identical root/table, different descriptions) for each allocator.\n - Each allocator is bound to a DIFFERENT guard — the caller's submitted guard selects which path fires. Same-guard allocators fire sequentially on the same call (waterfall); different-guard allocators are alternative paths.\n - Still add order.service project binding (query 1563) to prevent cross-project bypass (R-C3-05) triggering premature allocation.",
|
|
620
|
+
"evidence": "Scene: service_order_allocators_guard. Guard binds Signer: no. sharing_recipients: ${rc3_06_recipients_label}. Level rationale: ${rc3_06_level_rationale}.",
|
|
621
|
+
"stakeholders": ["provider", "customer"],
|
|
622
|
+
"exposure": {
|
|
623
|
+
"loss_parties": [
|
|
624
|
+
{ "role": "merchant", "basis": "The order's full fund allocation can be redirected away from the configured recipients on the very first qualifying call." },
|
|
625
|
+
{ "role": "buyer", "basis": "The buyer's payment is distributed to an attacker instead of the intended revenue/refund split." }
|
|
626
|
+
],
|
|
627
|
+
"gain_paths": [
|
|
628
|
+
{
|
|
629
|
+
"role": "neutral",
|
|
630
|
+
"path": "Any caller who passes the allocators Guard (e.g. submits any completed order_id) triggers the allocation; sharing.who=Signer routes 100% of the order funds to the caller's own address.",
|
|
631
|
+
"viability": "viable",
|
|
632
|
+
"gate": "The Guard never compares context(Signer) to an authorized party, so passing the Guard's condition is the only requirement — the theft path is executable by anyone."
|
|
633
|
+
}
|
|
634
|
+
]
|
|
635
|
+
}
|
|
636
|
+
},
|
|
637
|
+
{
|
|
638
|
+
"when": { "all": [{ "field": "rc3_06_applies", "op": "eq", "value": true }, { "field": "rc3_06_signer_sharing", "op": "eq", "value": false }] },
|
|
639
|
+
"level": "medium",
|
|
640
|
+
"title": "allocators Guard without Signer binding — ${rc3_06_title_suffix}",
|
|
641
|
+
"description": "Guard is bound to Service order_allocators but does NOT verify context(Signer). In the allocators scene, sharing.who determines the fund recipient:\n - sharing.who=Signer → funds flow to the CALLER (transaction signer)\n - sharing.who=Entity → funds flow to a FIXED address (Treasury/personal)\n - sharing.who=GuardIdentifier → funds flow to the submitted constrained object (e.g. an Order), receivable only by that object's owner (object receipt = owner receipt); see RC-FIND-03 residual in the recipient constraint audit\n\nWhen sharing.who=Signer and the Guard does not bind Signer, ANY caller who passes the Guard receives the order funds — a direct theft. Even an authorized caller is unnecessary: the attacker only needs to pass the Guard's condition (e.g. submit any completed order_id), then the funds go to their own address.\n\nThis is distinct from R-C3-01 (generic Signer binding) and R-C3-05 (cross-project bypass). R-C3-06 addresses the allocators-specific Guard+sharing coupling: the SAFE design uses sharing.who=Entity so the recipient is fixed, making Guard Signer binding unnecessary.\n\nsharing_recipients hint: ${rc3_06_recipients_label}",
|
|
642
|
+
"scenario": "Fund theft: attacker passes the allocators Guard (e.g. submits a completed order_id) and sharing.who=Signer routes 100% of the order funds to the attacker's address",
|
|
643
|
+
"mitigation": "TWO mitigation options:\n (A) Traditional: add context(Signer) binding to the Guard root (logic_equal[context(Signer), identifier[N](authorized_address)]) so only the authorized recipient can trigger allocation.\n (B) PREFERRED: use sharing.who=Entity (Treasury object or fixed personal address) in the Allocator's sharing config. Funds then always flow to the designated recipient regardless of who triggers allocation — the Guard does NOT need to bind Signer. This is more robust because it does not depend on Guard correctness.\n\nDesign checklist when using sharing.who=Entity:\n - If Entity points to a Treasury object, verify the Treasury's permission is consistent with the Service's permission (different permissions = different permission organizations = minor risk).\n - allocators require unique guard addresses: create separate Guard objects (identical root/table, different descriptions) for each allocator.\n - Each allocator is bound to a DIFFERENT guard — the caller's submitted guard selects which path fires. Same-guard allocators fire sequentially on the same call (waterfall); different-guard allocators are alternative paths.\n - Still add order.service project binding (query 1563) to prevent cross-project bypass (R-C3-05) triggering premature allocation.",
|
|
644
|
+
"evidence": "Scene: service_order_allocators_guard. Guard binds Signer: no. sharing_recipients: ${rc3_06_recipients_label}. Level rationale: ${rc3_06_level_rationale}.",
|
|
645
|
+
"stakeholders": ["provider", "customer"]
|
|
646
|
+
}
|
|
647
|
+
]
|
|
648
|
+
},
|
|
649
|
+
{
|
|
650
|
+
"rule_id": "R-C4-01",
|
|
651
|
+
"dimension": "system_context_risk",
|
|
652
|
+
"trigger": "Guard contains context(Signer) check; need to confirm comparison direction (== vs !=) and compared object role. K3 C4 (2026-11-08): the LEGAL caller-identity set for fund rails — order.owner==signer | order.agent has signer | order.service binding leg | permission.owner/admin role leg (the guard face of permission-index 1000/1001 rails) — is SILENT; the WARN stays only for (a) a buyer-form leg firing a NON-refund allocator rail (the settlement role-reversal disclosure) and (b) unrecognized identity forms.",
|
|
653
|
+
"cases": [
|
|
654
|
+
{
|
|
655
|
+
"when": { "all": [{ "field": "has_signer_check", "op": "eq", "value": true }, { "field": "rc4_01_settlement_buyer_trigger", "op": "eq", "value": true }] },
|
|
656
|
+
"level": "medium",
|
|
657
|
+
"title": "Buyer-triggered settlement (role-reversal disclosure): identity form ${rc4_01_identity_form}",
|
|
658
|
+
"description": "This allocator rail's ONLY caller face is the order-holder identity (${rc4_01_identity_form}) — the BUYER's signature is what releases the rail's money. On a NON-refund allocator rail that is the disclosed role reversal: the buyer can time or withhold the payout and the merchant cannot settle unilaterally. Legal by design when buyer-controlled release IS the contract (buyer-claimed completion), silent otherwise per the C4 relaxation — service-binding and permission-role faces are merchant-side by construction and are NOT warned. Refund rails (slot-0 Order submission) are exempt: a buyer-triggered refund is the correct semantics.",
|
|
659
|
+
"scenario": "Buyer claims completion and fires the settlement rail; or withholds the signature and the merchant's revenue is stuck despite delivered work",
|
|
660
|
+
"mitigation": "If unilateral merchant settlement is intended, widen the rail's caller face to the C4-legal set: a permission.owner/admin role leg (riding the merchant permission rail 1000/1001) or an order.service binding leg plus the permission-index rail. Keep the buyer-only face only where buyer-controlled release is the contract.",
|
|
661
|
+
"evidence": "Scene: service_order_allocators_guard. Identity form: ${rc4_01_identity_form}. Comparison: ${rc4_01_comparison_ops}",
|
|
662
|
+
"stakeholders": ["customer", "provider"]
|
|
663
|
+
},
|
|
664
|
+
{
|
|
665
|
+
"when": { "all": [{ "field": "has_signer_check", "op": "eq", "value": true }, { "field": "rc4_01_identity_legal", "op": "falsy" }] },
|
|
666
|
+
"level": "medium",
|
|
667
|
+
"title": "Signer check direction needs manual confirmation (comparison operator and role match)",
|
|
668
|
+
"description": "Guard contains a context(Signer) check whose identity form is NOT in the C4-legal caller set (order.owner==signer | order.agent | order.service binding | permission.owner/admin role). Signer is a Type4 system context, from TransactionContext.sender() (transaction initiator address).\nDetected comparison: ${rc4_01_comparison_detail}\nManual confirmation required:\n 1) Whether the comparison direction is correct: use == for identity verification (Signer == authorized address), use != for exclusion (Signer != blacklist address)\n 2) Whether the compared object role is correct: buy_guard should compare the Customer address, Forward.guard may compare the Provider address\n 3) Wrong direction causes reverse effect: == blacklist address would only allow blacklisted users",
|
|
669
|
+
"scenario": "Wrong direction: Signer == blacklist address would only allow blacklisted users",
|
|
670
|
+
"mitigation": "1) Confirm logic_equal is used for identity verification (Signer == authorized address);2) Confirm logic_not_equal is used for exclusion (Signer != blacklist address);3) Confirm the compared table constant is the address of the correct role;4) Prefer a C4-legal caller face (order.owner / order.agent / order.service binding / permission.owner-admin role);5) Cover both expected-pass and expected-fail scenarios in gen_passport tests",
|
|
671
|
+
"evidence": "Comparison: ${rc4_01_comparison_ops}. Identity form: ${rc4_01_identity_form}",
|
|
672
|
+
"stakeholders": ["customer", "provider"]
|
|
673
|
+
}
|
|
674
|
+
]
|
|
675
|
+
},
|
|
676
|
+
{
|
|
677
|
+
"rule_id": "R-C4-02",
|
|
678
|
+
"dimension": "system_context_risk",
|
|
679
|
+
"trigger": "Guard uses context(Clock) for precise boundary time-lock comparison",
|
|
680
|
+
"cases": [
|
|
681
|
+
{
|
|
682
|
+
"when": { "all": [{ "field": "has_clock_check", "op": "eq", "value": true }, { "any": [{ "field": "rc4_02_has_greater_or_equal", "op": "eq", "value": true }, { "field": "rc4_02_has_greater", "op": "eq", "value": true }] }] },
|
|
683
|
+
"level": "low",
|
|
684
|
+
"title": "Clock time-lock should have tolerance to avoid boundary invalidation from validator block-time variance",
|
|
685
|
+
"description": "Guard uses context(Clock) for time-lock comparison. Clock comes from the timestamp_ms field (U64 millisecond timestamp) of system shared object 0x6.The Wow on-chain timestamp is produced by validator consensus and has a slight deviation from real time (usually < 1 second), and block-time variance may cause timestamp jumps. Using precise boundaries (>= or ==) may cause:\n - The time-lock expiration transaction is packaged exactly at the moment but fails due to slight timestamp deviation\n - Or conversely, slight deviation causes the time-lock to pass early\nIt is recommended to use > instead of >=, or add a small tolerance constant.",
|
|
686
|
+
"scenario": "Timestamp variance: validator block-time deviation causes boundary transactions to fail or pass early",
|
|
687
|
+
"mitigation": "1) Use logic_as_u256_greater (>) instead of greater_or_equal (>=) for expiration judgment;2) Or add a small tolerance constant (e.g. 1000ms) in calc_number_add;3) Time-locks should not rely on second-level precision; reserve minute-level tolerance;4) Design timeout Forward nodes in the Machine as a fallback",
|
|
688
|
+
"evidence": "Comparison: ${rc4_02_comparison_ops}",
|
|
689
|
+
"stakeholders": ["customer", "provider"]
|
|
690
|
+
}
|
|
691
|
+
]
|
|
692
|
+
},
|
|
693
|
+
{
|
|
694
|
+
"rule_id": "R-C4-03",
|
|
695
|
+
"dimension": "system_context_risk",
|
|
696
|
+
"trigger": "Guard uses context(Guard) self-reference",
|
|
697
|
+
"cases": [
|
|
698
|
+
{
|
|
699
|
+
"when": { "field": "has_guard_self_ref", "op": "eq", "value": true },
|
|
700
|
+
"level": "low",
|
|
701
|
+
"title": "Guard uses context(Guard) self-reference (rare scenario, needs special explanation)",
|
|
702
|
+
"description": "Guard contains a context(Guard) node. Guard is a Type4 system context, returning the ObjectID of the currently verified Guard object itself.\nThis is a rare scenario, typically used for:\n 1) Guard referencing its own address as a replacement for a table constant (avoiding hardcoding)\n 2) Identifying the current Guard in a rely combination (rare)\nNeed to confirm whether the use of context(Guard) is necessary and whether the comparison object is correct.",
|
|
703
|
+
"scenario": "Self-reference misuse: context(Guard) comparing wrong object causes logic invalidation",
|
|
704
|
+
"mitigation": "1) Confirm the context(Guard) comparison object is the Guard ObjectID rather than an address constant;2) Evaluate whether self-reference is truly needed; usually a table constant can replace it;3) Verify in gen_passport tests that self-reference behavior meets expectations",
|
|
705
|
+
"stakeholders": ["provider"]
|
|
706
|
+
}
|
|
707
|
+
]
|
|
708
|
+
},
|
|
709
|
+
{
|
|
710
|
+
"rule_id": "R-C4-04",
|
|
711
|
+
"dimension": "system_context_risk",
|
|
712
|
+
"trigger": "Guard uses logic_equal[context(Signer), identifier[N](fixed_address)] — Level 1 strict single-identity Signer binding. Only ONE address can pass the Guard, and because Guards are immutable, changing the authorized address requires rebuilding the Guard and migrating all references. This creates a convenience trade-off: maximum security but maximum inflexibility (key loss or personnel change permanently blocks the operation).",
|
|
713
|
+
"cases": [
|
|
714
|
+
{
|
|
715
|
+
"when": { "field": "rc4_04_detected", "op": "eq", "value": true },
|
|
716
|
+
"level": "low",
|
|
717
|
+
"title": "Level 1 strict single-identity Signer binding — convenience trade-off (consider Level 2/3 alternatives)",
|
|
718
|
+
"description": "Guard uses logic_equal[context(Signer), identifier[${rc4_04_entry_identifier}](fixed address)] — only the address \"${rc4_04_entry_value}\" can pass.\nThis is Level 1 strict single-identity binding: maximally secure but maximally inconvenient.\nGuards are immutable on-chain. If the authorized address becomes unavailable (key loss, personnel change, role rotation), the Guard permanently blocks the operation — the only recovery is to build a new Guard and migrate ALL references (Machine forward guards, Service buy_guard, allocators, etc.).\n\nThree verifier constraint levels trade off security vs convenience:\n - Level 1 (current): strict single-identity — one address, no flexibility (AVOID unless justified)\n - Level 2: identity-set — logic_or of multiple valid identities (e.g. order.owner OR order.agent; permission.owner OR permission.admin). Recommended for role-based access.\n - Level 3: scene-combined — verify whether Signer binding is even needed. Many scenes (allocators with sharing.who=Entity, machine forward with permissionIndex) already ensure safety without Signer binding.\n\nUse Level 1 only when: (a) the role is permanently tied to one address, AND (b) the designer explicitly accepts the immutability lock-in risk. Otherwise prefer Level 2 or Level 3.",
|
|
719
|
+
"scenario": "Immutability lock-in: authorized address becomes unavailable, Guard permanently blocks the operation, requiring full Guard rebuild and reference migration",
|
|
720
|
+
"mitigation": "Consider these alternatives before settling on Level 1 strict binding:\n (A) Level 2 identity-set (RECOMMENDED for role-based access): use logic_or to allow multiple valid identities.\n - Order holder: logic_or[logic_equal[query(1562: order.owner), context(Signer)], query(1567: order.agent has, parameters: [context(Signer)])]\n - Service provider: logic_or[logic_equal[query(1002: permission.owner), context(Signer)], query(1004: permission.admin has, parameters: [context(Signer)])]\n - Dynamic permission (survives rotation): submit permission address, verify query(1488: service.permission) == submitted, then check 1002/1004\n (B) Level 3 scene-combined: evaluate whether Signer binding is needed at all.\n - If using allocators with sharing.who=Entity (Treasury): funds flow to a fixed recipient regardless of caller — no Signer binding needed (R-C3-06 safe)\n - If using machine forward: permissionIndex already verifies operator identity — Signer binding may be redundant\n (C) If Level 1 is truly required: document the justification in the Guard description and ensure a key-recovery / address-rotation plan exists.",
|
|
721
|
+
"evidence": "Level 1 strict binding detected: logic_equal[context(Signer), identifier[${rc4_04_entry_identifier}]] where identifier[${rc4_04_entry_identifier}] is a fixed Address constant (${rc4_04_entry_detail}). Not wrapped in logic_or (not Level 2 identity-set).",
|
|
722
|
+
"stakeholders": ["provider"]
|
|
723
|
+
}
|
|
724
|
+
]
|
|
725
|
+
},
|
|
726
|
+
{
|
|
727
|
+
"rule_id": "R-X1-01",
|
|
728
|
+
"dimension": "logic_gap",
|
|
729
|
+
"trigger": "Time-lock uses logic_as_u256_greater_or_equal with a baseline query that has NO non-zero invariant (i.e. the query MAY legitimately return 0 when it succeeds), causing Clock >= 0 + timeout to always be true",
|
|
730
|
+
"cases": [
|
|
731
|
+
{
|
|
732
|
+
"when": { "field": "rx1_01_trigger", "op": "eq", "value": true },
|
|
733
|
+
"level": "medium",
|
|
734
|
+
"title": "Time-lock baseline query may return 0 causing >= comparison to always be true",
|
|
735
|
+
"description": "Guard uses logic_as_u256_greater_or_equal for time-lock comparison, and the compared baseline value comes from a query (Type1/2/3 data sources). If the query SUCCEEDS but its stored value is 0 (e.g. a count that is 0 in the empty initial state, a user-submitted value of 0, or a Some(0) from an Option field), then Clock >= 0 + timeout is always true, the time-lock is effectively void, and the disadvantaged party can bypass the time constraint immediately.\n\nIMPORTANT — 'VM error = Guard failure' baseline: if a query targets an absent object, unset Option, or missing collection entry, the WoWok native runtime aborts with a VM error (e.g. W_FIELD_NOT_FOUND) and the Guard fails as a whole (does NOT silently return 0). Therefore the null-bypass risk ONLY applies to queries whose stored value can legitimately be 0 while the query itself succeeds. Such queries are exactly those WITHOUT an `invariant` annotation in the SDK GUARDQUERY catalog.",
|
|
736
|
+
"scenario": "Time-lock invalidation: baseline query returns 0 (not VM error), making the >= condition always pass",
|
|
737
|
+
"mitigation": "1) Use a query whose return is guaranteed non-zero (look for `invariant` in guard-ins.ts — e.g. progress.current_time id=1272 with invariant='clock_derived'); 2) Add a precondition check query > 0 before the time-lock (for queries without an invariant, e.g. user-submitted baselines); 3) Avoid using count/index/find/user-submitted values as time-lock baselines — these can all legitimately return 0; 4) Distinguish 'VM error' (safe — Guard fails) from 'query returns 0' (unsafe — Guard bypassed). Only the latter is a null-bypass risk.",
|
|
738
|
+
"evidence": "${rx1_01_evidence}",
|
|
739
|
+
"stakeholders": ["customer", "provider"]
|
|
740
|
+
}
|
|
741
|
+
]
|
|
742
|
+
},
|
|
743
|
+
{
|
|
744
|
+
"rule_id": "R-X1-02",
|
|
745
|
+
"dimension": "logic_gap",
|
|
746
|
+
"trigger": "Guard uses logic_as_u256_greater with a query operand that has NO non-zero invariant (i.e. the query MAY legitimately return 0 when it succeeds), and the comparison does not distinguish 'query succeeded with 0' from 'query failed'",
|
|
747
|
+
"cases": [
|
|
748
|
+
{
|
|
749
|
+
"when": { "field": "rx1_02_trigger", "op": "eq", "value": true },
|
|
750
|
+
"level": "medium",
|
|
751
|
+
"title": "Numeric comparison with a query that may legitimately return 0",
|
|
752
|
+
"description": "Guard uses logic_as_u256_greater for numeric comparison, and one of the operands comes from a query (Type1/2/3 data sources) that has NO non-zero invariant annotation. If the query SUCCEEDS but its stored value is 0 (e.g. a count that is 0 in the empty initial state, a user-submitted value of 0, or a Some(0) from an Option field), the comparison may produce an unexpected result (e.g. `query > 0` fails, or `query > some_threshold` is silently bypassed).\n\nIMPORTANT — 'VM error = Guard failure' baseline: if a query targets absent data (e.g. object does not exist, Option is None, collection entry is missing), the WoWok native runtime aborts with a VM error (not 0). The Guard fails as a whole (does NOT silently return 0). Therefore this rule only flags queries whose stored value can be 0 while the query succeeds.",
|
|
753
|
+
"scenario": "Null misjudgment: query succeeds with value 0, causing > 0 condition to unexpectedly fail (or > threshold to be bypassed)",
|
|
754
|
+
"mitigation": "1) Prefer queries with an `invariant` annotation (e.g. clock_derived / positive_lower_bound); 2) Add a precondition check (query > 0) before the main comparison when using count/index/find/user-submitted baselines; 3) Distinguish 'VM error' (safe — Guard fails) from 'query returns 0' (potentially unsafe). Only the latter is a null-bypass risk.",
|
|
755
|
+
"evidence": "${rx1_02_evidence}",
|
|
756
|
+
"stakeholders": ["customer", "provider"]
|
|
757
|
+
}
|
|
758
|
+
]
|
|
759
|
+
},
|
|
760
|
+
{
|
|
761
|
+
"rule_id": "R-X1-03",
|
|
762
|
+
"dimension": "logic_gap",
|
|
763
|
+
"trigger": "Guard uses logic_string_contains and may be bypassed by substring matching",
|
|
764
|
+
"cases": [
|
|
765
|
+
{
|
|
766
|
+
"when": { "all": [{ "field": "root_has_logic_string_contains", "op": "eq", "value": true }, { "field": "root_has_logic_string_nocase", "op": "eq", "value": false }] },
|
|
767
|
+
"level": "low",
|
|
768
|
+
"title": "logic_string_contains substring match may be bypassed",
|
|
769
|
+
"description": "Guard uses logic_string_contains for string matching.Substring matching may be bypassed: e.g. when checking 'Completed', 'NotCompleted' also contains 'Completed'.In addition, case sensitivity may cause unexpected failures. String data may come from Type1 (query object fields), Type3 (submitted values), or the context of a rely-dependent Guard.",
|
|
770
|
+
"scenario": "Substring mismatch: 'NotCompleted' contains 'Completed', causing false pass",
|
|
771
|
+
"mitigation": "1) Prefer logic_equal for exact matching;2) If substring matching is needed, add boundary conditions (e.g. prefix + suffix);3) Confirm whether case-insensitivity is needed (use the nocase variant)",
|
|
772
|
+
"stakeholders": ["customer", "provider"]
|
|
773
|
+
}
|
|
774
|
+
]
|
|
775
|
+
},
|
|
776
|
+
{
|
|
777
|
+
"rule_id": "R-X1-04",
|
|
778
|
+
"dimension": "logic_gap",
|
|
779
|
+
"trigger": "Guard root is an identifier directly returning Bool",
|
|
780
|
+
"cases": [
|
|
781
|
+
{
|
|
782
|
+
"when": { "all": [{ "field": "root_is_identifier", "op": "eq", "value": true }, { "field": "root_identifier_is_submission", "op": "eq", "value": true }] },
|
|
783
|
+
"level": "medium",
|
|
784
|
+
"title": "Root directly returns identifier value, no operation logic",
|
|
785
|
+
"description": "Guard root is an identifier node, directly returning the value (Bool) from table.This entry has b_submission=true (Type3 submitted value); the caller can directly submit true to bypass all verification.",
|
|
786
|
+
"scenario": "Bypass verification: caller submits true to pass the Guard directly",
|
|
787
|
+
"mitigation": "1) Ensure the entry referenced by identifier has b_submission=false (constant);2) Or add an additional logic_and condition for cross-validation",
|
|
788
|
+
"stakeholders": ["customer", "provider"]
|
|
789
|
+
},
|
|
790
|
+
{
|
|
791
|
+
"when": { "all": [{ "field": "root_is_identifier", "op": "eq", "value": true }, { "field": "root_identifier_is_submission", "op": "eq", "value": false }] },
|
|
792
|
+
"level": "low",
|
|
793
|
+
"title": "Root directly returns identifier value, no operation logic",
|
|
794
|
+
"description": "Guard root is an identifier node, directly returning the value (Bool) from table.This entry has b_submission=false (Type1 constant); the value is fixed but the Guard has no actual verification logic.",
|
|
795
|
+
"scenario": "No verification logic: Guard always returns a fixed value, providing no actual protection",
|
|
796
|
+
"mitigation": "1) Add actual verification logic (query + logic comparison);2) Evaluate whether this Guard needs to exist",
|
|
797
|
+
"stakeholders": ["customer", "provider"]
|
|
798
|
+
}
|
|
799
|
+
]
|
|
800
|
+
},
|
|
801
|
+
{
|
|
802
|
+
"rule_id": "R-X1-05",
|
|
803
|
+
"dimension": "game_theory",
|
|
804
|
+
"trigger": "Allocation Guard may cause some participants to be skipped",
|
|
805
|
+
"cases": [
|
|
806
|
+
{
|
|
807
|
+
"when": { "field": "scene_binding_field", "op": "eq", "value": "order_allocators" },
|
|
808
|
+
"level": "medium",
|
|
809
|
+
"title": "order_allocators multi-guard paths may cause unfair allocation",
|
|
810
|
+
"description": "A distribution call submits ONE guard; every allocator bound to that guard fires in vector order against the shrinking pool (the on-chain allocation). If a single guard binds multiple allocators with overlapping conditions, the pool is split repeatedly and later allocators may receive less than intended or abort on insufficient balance. For alternative business paths (settle vs refund), use DIFFERENT guards so the caller's guard choice selects exactly one path.",
|
|
811
|
+
"scenario": "Allocation path overlap: multiple allocators bound to the same guard all fire, draining the pool in unexpected order",
|
|
812
|
+
"mitigation": "1) Bind each business path (settle/refund/damage) to its OWN Guard object; 2) Make guard conditions mutually exclusive via guard logic, not list order; 3) When a waterfall IS intended (fee first, then split remainder), keep the shared guard and verify the vector order matches the intended payout sequence",
|
|
813
|
+
"stakeholders": ["provider"]
|
|
814
|
+
}
|
|
815
|
+
]
|
|
816
|
+
},
|
|
817
|
+
{
|
|
818
|
+
"rule_id": "R-X1-06",
|
|
819
|
+
"dimension": "game_theory",
|
|
820
|
+
"trigger": "Workflow Guard time-lock may lock the disadvantaged party",
|
|
821
|
+
"cases": [
|
|
822
|
+
{
|
|
823
|
+
"when": { "all": [{ "field": "root_has_clock_token", "op": "eq", "value": true }, { "field": "root_has_calc_number_add", "op": "eq", "value": true }] },
|
|
824
|
+
"level": "medium",
|
|
825
|
+
"title": "Time-lock may lock the disadvantaged party",
|
|
826
|
+
"description": "Guard uses a time-lock (context(Clock) + calc_number_add). The time-lock itself is neutral, but the locking direction needs to be checked: if the Customer is locked to pay first but cannot accept in time, the Provider gains advantage; if the Provider is locked to deliver first but cannot receive payment in time, the Customer gains advantage.The time-lock combines Type4 (Clock) and Type1/2 (query time fields) data sources.",
|
|
827
|
+
"scenario": "Time asymmetry: one party is locked by time while the other has freedom of action",
|
|
828
|
+
"mitigation": "1) Ensure the time-lock is symmetric (both parties have time constraints);2) Provide an exit mechanism after the time-lock expires (e.g. auto-refund/auto-complete);3) Design corresponding timeout Forward nodes in the Machine",
|
|
829
|
+
"stakeholders": ["customer", "provider"]
|
|
830
|
+
}
|
|
831
|
+
]
|
|
832
|
+
},
|
|
833
|
+
{
|
|
834
|
+
"rule_id": "R-X1-07",
|
|
835
|
+
"dimension": "game_theory",
|
|
836
|
+
"trigger": "Arbitration usage_guard may block legitimate disputes",
|
|
837
|
+
"cases": [
|
|
838
|
+
{
|
|
839
|
+
"when": { "all": [{ "field": "scene_binding_field", "op": "eq", "value": "usage_guard" }, { "field": "logic_and_count", "op": "gte", "value": 3 }] },
|
|
840
|
+
"level": "high",
|
|
841
|
+
"title": "usage_guard has too many conditions and may block legitimate disputes",
|
|
842
|
+
"description": "Detected ${logic_and_count} logic_and combinations. Too many AND conditions make the dispute threshold too high, the Customer may not be able to initiate a legitimate dispute, and the Provider gains an unfair advantage.usage_guard typically combines Type4 (Signer identity), Type3 (submit Passport credentials), and Type1 (query EntityRegistrar verification) data sources.",
|
|
843
|
+
"scenario": "Dispute threshold too high: Customer cannot initiate a legitimate dispute",
|
|
844
|
+
"mitigation": "1) Re-evaluate the necessity of each AND condition;2) Consider using logic_or to lower the threshold;3) Move non-essential conditions to voting_guard rather than usage_guard",
|
|
845
|
+
"stakeholders": ["customer"],
|
|
846
|
+
"exposure": {
|
|
847
|
+
"loss_parties": [
|
|
848
|
+
{ "role": "buyer", "basis": "The dispute entry threshold is stacked so high that a legitimate dispute cannot be initiated — the buyer's compensation path becomes inaccessible." }
|
|
849
|
+
],
|
|
850
|
+
"gain_paths": []
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
]
|
|
854
|
+
},
|
|
855
|
+
{
|
|
856
|
+
"rule_id": "R-X1-08",
|
|
857
|
+
"dimension": "binding_risk",
|
|
858
|
+
"trigger": "Guard is bound to a published Machine/Service (immutable)",
|
|
859
|
+
"cases": [
|
|
860
|
+
{
|
|
861
|
+
"when": { "all": [{ "field": "scene_present", "op": "eq", "value": true }, { "field": "scene_mutable_after_publish", "op": "falsy" }] },
|
|
862
|
+
"level": "low",
|
|
863
|
+
"title": "Guard is bound to immutable ${scene_host_object} (cannot be modified after publish)",
|
|
864
|
+
"description": "After ${scene_host_object} is published, ${scene_binding_field} cannot be modified.If the Guard design is flawed, a new Machine/Service must be created and all references migrated.This is a design constraint rather than a risk, but the Guard design must be correct before publishing.",
|
|
865
|
+
"scenario": "Irreversible binding: after publish, a flawed Guard design cannot be modified",
|
|
866
|
+
"mitigation": "1) Use gen_passport for thorough testing before publishing;2) Test both expected-pass and expected-fail scenarios;3) Export a Guard backup (guard2file) before publishing",
|
|
867
|
+
"stakeholders": ["provider"]
|
|
868
|
+
}
|
|
869
|
+
]
|
|
870
|
+
},
|
|
871
|
+
{
|
|
872
|
+
"rule_id": "R-X1-09",
|
|
873
|
+
"dimension": "dependency_risk",
|
|
874
|
+
"trigger": "Guard uses rely but the dependent Guard may fail",
|
|
875
|
+
"cases": [
|
|
876
|
+
{
|
|
877
|
+
"when": { "all": [{ "field": "rely_guards_count", "op": "gt", "value": 0 }, { "field": "rely_is_or", "op": "eq", "value": true }] },
|
|
878
|
+
"level": "low",
|
|
879
|
+
"title": "rely ${rely_logic} depends on ${rely_guards_count} external Guards",
|
|
880
|
+
"description": "Guard uses rely ${rely_logic} to depend on ${rely_guards_count} external Guards.OR logic: any one passing is enough. If a dependent Guard is loosely designed, it may become a bypass entry point. rely-dependent Guards must have rep=true (repository.data queries do not depend on runtime submission).",
|
|
881
|
+
"scenario": "Dependency bypass: a loose dependent Guard becomes an attack entry point",
|
|
882
|
+
"mitigation": "1) Review the strictness of each dependent Guard; 2) Ensure all dependent Guards are at least as strict as the current Guard",
|
|
883
|
+
"stakeholders": ["customer", "provider"]
|
|
884
|
+
},
|
|
885
|
+
{
|
|
886
|
+
"when": { "all": [{ "field": "rely_guards_count", "op": "gt", "value": 0 }, { "field": "rely_is_or", "op": "eq", "value": false }] },
|
|
887
|
+
"level": "medium",
|
|
888
|
+
"title": "rely ${rely_logic} depends on ${rely_guards_count} external Guards",
|
|
889
|
+
"description": "Guard uses rely ${rely_logic} to depend on ${rely_guards_count} external Guards.AND logic: all dependencies must pass. If a dependent Guard fails or is deleted, the current Guard will always fail. rely-dependent Guards must have rep=true (repository.data queries do not depend on runtime submission).",
|
|
890
|
+
"scenario": "Dependency failure: a dependent Guard is deleted, causing the current Guard to always fail",
|
|
891
|
+
"mitigation": "1) Confirm all dependent Guards have rep=true and cannot be deleted; 2) Consider whether AND dependency is truly needed",
|
|
892
|
+
"stakeholders": ["customer", "provider"]
|
|
893
|
+
}
|
|
894
|
+
]
|
|
895
|
+
},
|
|
896
|
+
{
|
|
897
|
+
"rule_id": "R-X1-10",
|
|
898
|
+
"dimension": "impack_risk",
|
|
899
|
+
"trigger": "Guard uses repository.data query (query 1167) and the Repository has quote_guard set — rigid verification requirement",
|
|
900
|
+
"cases": [
|
|
901
|
+
{
|
|
902
|
+
"when": { "all": [{ "field": "queries_repository", "op": "eq", "value": true }, { "field": "root_has_query", "op": "eq", "value": true }] },
|
|
903
|
+
"level": "low",
|
|
904
|
+
"title": "repository.data quote_guard is a RIGID verification requirement (data subscription access control)",
|
|
905
|
+
"description": "When a Guard queries repository.data (query 1167), if the Repository policy has quote_guard set (Some(addr)), then the quote_guard MUST be verified. This is a RIGID requirement — not context-dependent.\n\nTWO-PHASE VERIFICATION MECHANISM (VERIFIED: passport.rs#L756-769, passport.rs#L545-612):\n Phase 1 — Passport generation (scan guard): The system scans the Guard to identify that it queries repository data. If the Repository has a quote_guard, the system prepares the quote_guard for verification (adds it to the required verification set, populating impack_list).\n Phase 2 — Passport verification: The system re-checks (a) is the quote_guard prepared/in impack_list? (b) rigidly verify the quote_guard (e.g., verify Payment proof for subscription).\n\nSEMANTIC INTENT: Any Guard that uses a Repository's data MUST satisfy that Repository's quote_guard. This is the intended access control mechanism for data subscription — e.g., accessing weather data requires payment proof verified by the quote_guard.\n\nDESIGN PHILOSOPHY: On-chain data is consumed by guard verifiers. The quote_guard gates Repository data access, enabling subscription revenue models. The Guard only verifies logic + data accuracy (verifier-evidence design).",
|
|
906
|
+
"scenario": "quote_guard rigid verification: any guard querying repository data must satisfy the repository's quote_guard (e.g., payment requirement)",
|
|
907
|
+
"mitigation": "1) This is an INTENDED capability, not a limitation — quote_guard enables data subscription access control;\n2) When designing a Guard that queries Repository data with quote_guard: ensure the Passport includes the quote_guard verification with necessary submissions (e.g., Payment proof);\n3) Pattern: Repository with quote_guard for data subscription — quote_guard verifies Payment (for_object, for_guard, index), user submits Payment via Passport, quote_guard verified in both phases, repository data query passes;\n4) If quote_guard==None: no access control — Repository data is freely queryable",
|
|
908
|
+
"stakeholders": ["customer", "provider"]
|
|
909
|
+
}
|
|
910
|
+
]
|
|
911
|
+
},
|
|
912
|
+
{
|
|
913
|
+
"rule_id": "R-X1-11",
|
|
914
|
+
"dimension": "rep_risk",
|
|
915
|
+
"trigger": "Guard uses rely to depend on other Guards; need to confirm the rep flag of dependent Guards is correct",
|
|
916
|
+
"cases": [
|
|
917
|
+
{
|
|
918
|
+
"when": { "all": [{ "field": "rely_guards_count", "op": "gt", "value": 0 }, { "field": "rx1_11_self_rep_false", "op": "eq", "value": true }] },
|
|
919
|
+
"level": "medium",
|
|
920
|
+
"title": "rep semantics needs confirmation (when repository.data query depends on submission, rep=false and cannot be depended on)",
|
|
921
|
+
"description": "Guard uses rely to depend on external Guards. In the WoWok protocol, rely-dependent Guards must have rep=true.\nPrecise rep semantics (guard.rs#L483-L492): repository.data query (query 1167) does not depend on runtime submission.\n - rep=true: repository.data query is fully constant-driven (object address b_submission=false and query parameters are not submission)\n - rep=false: repository address comes from runtime submission, or query parameters come from submission\nGuards with rep=false cannot appear in other Guards' rely lists.\n${rx1_11_warning_tail}",
|
|
922
|
+
"scenario": "rep misjudgment: depending on a rep=false Guard causes creation failure, or its own rep=false is wrongly depended on",
|
|
923
|
+
"mitigation": "1) Confirm all rely-dependent Guards have rep=true (do not depend on submission to query repository.data);2) If the current Guard queries repository.data and the address comes from submission, its own rep=false; annotate that it cannot be depended on;3) rep is not 'no Repository dependency', but 'repository.data query does not depend on submission';4) Use wowok_buildin_info to query the full definition of the rep flag",
|
|
924
|
+
"evidence": "${rx1_11_evidence}",
|
|
925
|
+
"stakeholders": ["provider"]
|
|
926
|
+
},
|
|
927
|
+
{
|
|
928
|
+
"when": { "all": [{ "field": "rely_guards_count", "op": "gt", "value": 0 }, { "field": "rx1_11_self_rep_false", "op": "eq", "value": false }] },
|
|
929
|
+
"level": "low",
|
|
930
|
+
"title": "rep semantics needs confirmation (when repository.data query depends on submission, rep=false and cannot be depended on)",
|
|
931
|
+
"description": "Guard uses rely to depend on external Guards. In the WoWok protocol, rely-dependent Guards must have rep=true.\nPrecise rep semantics (guard.rs#L483-L492): repository.data query (query 1167) does not depend on runtime submission.\n - rep=true: repository.data query is fully constant-driven (object address b_submission=false and query parameters are not submission)\n - rep=false: repository address comes from runtime submission, or query parameters come from submission\nGuards with rep=false cannot appear in other Guards' rely lists.\n${rx1_11_warning_tail}",
|
|
932
|
+
"scenario": "rep misjudgment: depending on a rep=false Guard causes creation failure, or its own rep=false is wrongly depended on",
|
|
933
|
+
"mitigation": "1) Confirm all rely-dependent Guards have rep=true (do not depend on submission to query repository.data);2) If the current Guard queries repository.data and the address comes from submission, its own rep=false; annotate that it cannot be depended on;3) rep is not 'no Repository dependency', but 'repository.data query does not depend on submission';4) Use wowok_buildin_info to query the full definition of the rep flag",
|
|
934
|
+
"evidence": "${rx1_11_evidence}",
|
|
935
|
+
"stakeholders": ["provider"]
|
|
936
|
+
}
|
|
937
|
+
]
|
|
938
|
+
},
|
|
939
|
+
{
|
|
940
|
+
"rule_id": "R-X1-12",
|
|
941
|
+
"dimension": "submission_forgery",
|
|
942
|
+
"trigger": "Guard table contains b_submission=true entries with NO name (empty)",
|
|
943
|
+
"cases": [
|
|
944
|
+
{
|
|
945
|
+
"when": { "field": "rx1_12_vague_count", "op": "gt", "value": 0 },
|
|
946
|
+
"level": "medium",
|
|
947
|
+
"title": "Submitted data entry has no name (retained_submission risk: caller may submit wrong data)",
|
|
948
|
+
"description": "Guard table has ${rx1_12_vague_count} b_submission=true entries with an EMPTY name.\nAn unnamed submission entry has no data contract on any layer: the caller sees neither a field identifier (table name) nor a human explanation (Guard description).\nThe caller may:\n - Submit a wrong-typed object address (e.g. submit a Service address instead of an Order address)\n - Submit a wrong value (e.g. inconsistent amount units)\n - Confuse submission slots of different Guards in multi-Guard scenarios\nNote: SHORT identifier-style names (e.g. 'order_id', 'delivery_node') are schema-conformant and are NOT a risk — do not rename them to natural-language sentences; table names are limited to 64 BCS characters and the SDK rejects longer values.",
|
|
949
|
+
"scenario": "Caller submits wrong data because no layer explains what the field expects; the Guard passes verification but the business logic is wrong",
|
|
950
|
+
"mitigation": "1) Give every submission entry a short identifier name (e.g. 'order_id', 'delivery_node') — max 64 BCS characters;\n2) Explain what each submitted field means (expected type, expected object role) in the Guard's 'description' field — that is the human-readable data contract, not the name;\n3) Add failure_conditions in binding_hint to clarify failure scenarios;\n4) Consider adding type validation logic in root (e.g. query the submitted object's objectType and match with expectation)",
|
|
951
|
+
"evidence": "Unnamed entries: ${rx1_12_vague_csv}",
|
|
952
|
+
"stakeholders": ["customer", "provider"]
|
|
953
|
+
}
|
|
954
|
+
]
|
|
955
|
+
},
|
|
956
|
+
{
|
|
957
|
+
"rule_id": "R-X1-13",
|
|
958
|
+
"dimension": "binding_risk",
|
|
959
|
+
"trigger": "Guard references its host object (Host Object) itself — circular reference pattern",
|
|
960
|
+
"cases": [
|
|
961
|
+
{
|
|
962
|
+
"when": { "field": "rx1_13_detected", "op": "eq", "value": true },
|
|
963
|
+
"level": "medium",
|
|
964
|
+
"title": "Circular reference pattern (Guard references the host object itself; note creation order)",
|
|
965
|
+
"description": "In the Guard's table, identifier=${rx1_13_identifier} has object_type equal to the host object type \"${scene_host_object}\".\nCircular reference pattern: the Guard is bound to a Host Object (e.g. Service.buy_guard) and also queries the Host Object's own fields.\nCreation order constraints:\n 1. The Host Object must be created first (unpublished state)\n 2. When the Guard is created, the table uses the Host Object's name (not address); the SDK resolves it at binding time\n 3. After the Guard is bound to the Host Object, the Host Object is published\nRisks:\n - If the Host Object is already published (immutable), the Guard can no longer be bound\n - If the Host Object's name is modified after the Guard is created, the Guard's table reference is invalidated\n - Circular reference makes the Guard not independently testable (the Host Object must exist to verify)",
|
|
966
|
+
"scenario": "Guard queries fields of the Service/Machine/Reward it is bound to; wrong creation order causes binding failure",
|
|
967
|
+
"mitigation": "1) Ensure the Host Object is unpublished (bPublished=false) when creating and binding the Guard;\n2) Use the Host Object's name rather than address in table (the SDK auto-resolves);\n3) Perform Guard verification tests after the Host Object is published;\n4) Use guard2file to export a Guard backup for restoring references during rebuild",
|
|
968
|
+
"evidence": "Circular reference: identifier=${rx1_13_identifier}, object_type=\"${scene_host_object}\" → ${scene_host_object}",
|
|
969
|
+
"stakeholders": ["provider"]
|
|
970
|
+
}
|
|
971
|
+
]
|
|
972
|
+
},
|
|
973
|
+
{
|
|
974
|
+
"rule_id": "R-X1-14",
|
|
975
|
+
"dimension": "logic_gap",
|
|
976
|
+
"trigger": "Scene-specific reentrancy: Guard pass triggers a state-changing side effect (fund distribution, vote count, Arb creation) that does NOT naturally invalidate the Guard condition. Without an anti-reentrancy primitive, the same Signer can repeatedly pass the Guard. Additionally detects pseudo-protection: primitive present but not properly wrapped in logic_not (for Bool queries) or logic_equal(0) (for count queries).",
|
|
977
|
+
"cases": [
|
|
978
|
+
{
|
|
979
|
+
"when": { "all": [{ "field": "reentry_applicable", "op": "eq", "value": true }, { "field": "reentry_state", "op": "eq", "value": "pseudo" }, { "field": "reentry_scene_id", "op": "eq", "value": "reward_claim" }] },
|
|
980
|
+
"level": "medium",
|
|
981
|
+
"title": "Reentrancy pseudo-protection: anti-reentrancy primitive present but not properly wrapped (${reentry_scene_id})",
|
|
982
|
+
"description": "Scene: ${reentry_scene_id}\nThe Guard root contains an anti-reentrancy primitive (${reentry_found_primitive}), but it is NOT properly wrapped.\nProper wrapping rules:\n - Bool-returning primitives (exists-style): must be wrapped in logic_not\n - U64-returning primitives (count-style): must be compared to 0 via logic_equal\n - Address-returning primitives: must be wrapped in logic_not (None check)\n\nWHY THIS IS DANGEROUS:\n The developer likely intended to prevent reentrancy but the wrapping is incorrect, so the primitive does NOT actually block repeated Guard passes. This is arguably MORE dangerous than absence — code reviewers see the primitive and assume protection is in place.\n\nScene rationale: ${reentry_rationale}",
|
|
983
|
+
"scenario": "Developer added anti-reentrancy primitive but used wrong wrapping; reentrancy exploit still possible in ${reentry_scene_id}",
|
|
984
|
+
"mitigation": "Fix the wrapping:\n - For exists-style (Bool) primitives: wrap in logic_not — { type: 'logic_not', node: { type: 'query', query: <primitive>, ... } }\n - For count-style (U64) primitives: compare to 0 — { type: 'logic_equal', nodes: [ { type: 'query', query: <primitive>, ... }, identifier(N) ] } where table[N].value = 0\n - For address-style primitives: wrap in logic_not (None check)\nThen wrap the protection in logic_and with the existing root conditions.\n\nFull mitigation for ${reentry_scene_id}:\n${reentry_mitigation}",
|
|
985
|
+
"evidence": "${reentry_evidence}",
|
|
986
|
+
"stakeholders": ["claimant", "provider"],
|
|
987
|
+
"exposure": {
|
|
988
|
+
"loss_parties": [
|
|
989
|
+
{ "role": "merchant", "basis": "The reward pool is the merchant's deposited budget — repeated Guard passes let the same signer drain it multiple times." }
|
|
990
|
+
],
|
|
991
|
+
"gain_paths": [
|
|
992
|
+
{
|
|
993
|
+
"role": "neutral",
|
|
994
|
+
"path": "The same signer repeatedly passes the claim Guard and collects the payout again each time.",
|
|
995
|
+
"viability": "viable",
|
|
996
|
+
"gate": "The anti-reentrancy primitive is absent or mis-wrapped, so no on-chain check blocks the repeat pass."
|
|
997
|
+
}
|
|
998
|
+
]
|
|
999
|
+
}
|
|
1000
|
+
},
|
|
1001
|
+
{
|
|
1002
|
+
"when": { "all": [{ "field": "reentry_applicable", "op": "eq", "value": true }, { "field": "reentry_state", "op": "eq", "value": "pseudo" }, { "field": "reentry_scene_id", "op": "eq", "value": "arbitration_voting_guard" }] },
|
|
1003
|
+
"level": "medium",
|
|
1004
|
+
"title": "Reentrancy pseudo-protection: anti-reentrancy primitive present but not properly wrapped (${reentry_scene_id})",
|
|
1005
|
+
"description": "Scene: ${reentry_scene_id}\nThe Guard root contains an anti-reentrancy primitive (${reentry_found_primitive}), but it is NOT properly wrapped.\nProper wrapping rules:\n - Bool-returning primitives (exists-style): must be wrapped in logic_not\n - U64-returning primitives (count-style): must be compared to 0 via logic_equal\n - Address-returning primitives: must be wrapped in logic_not (None check)\n\nWHY THIS IS DANGEROUS:\n The developer likely intended to prevent reentrancy but the wrapping is incorrect, so the primitive does NOT actually block repeated Guard passes. This is arguably MORE dangerous than absence — code reviewers see the primitive and assume protection is in place.\n\nScene rationale: ${reentry_rationale}",
|
|
1006
|
+
"scenario": "Developer added anti-reentrancy primitive but used wrong wrapping; reentrancy exploit still possible in ${reentry_scene_id}",
|
|
1007
|
+
"mitigation": "Fix the wrapping:\n - For exists-style (Bool) primitives: wrap in logic_not — { type: 'logic_not', node: { type: 'query', query: <primitive>, ... } }\n - For count-style (U64) primitives: compare to 0 — { type: 'logic_equal', nodes: [ { type: 'query', query: <primitive>, ... }, identifier(N) ] } where table[N].value = 0\n - For address-style primitives: wrap in logic_not (None check)\nThen wrap the protection in logic_and with the existing root conditions.\n\nFull mitigation for ${reentry_scene_id}:\n${reentry_mitigation}",
|
|
1008
|
+
"evidence": "${reentry_evidence}",
|
|
1009
|
+
"stakeholders": ["customer", "provider", "arbitrator"],
|
|
1010
|
+
"exposure": {
|
|
1011
|
+
"loss_parties": [
|
|
1012
|
+
{ "role": "buyer", "basis": "Repeated vote counting can swing the arbitration ruling — the buyer may be denied a deserved payout or charged a wrongful one." },
|
|
1013
|
+
{ "role": "merchant", "basis": "The same manipulated ruling can force an unjustified compensation payout from the merchant side." }
|
|
1014
|
+
],
|
|
1015
|
+
"gain_paths": [
|
|
1016
|
+
{
|
|
1017
|
+
"role": "neutral",
|
|
1018
|
+
"path": "The same signer repeatedly passes the voting Guard, re-triggering the vote-count side effect until the tally favors them.",
|
|
1019
|
+
"viability": "viable",
|
|
1020
|
+
"gate": "The anti-reentrancy primitive is absent or mis-wrapped, so no on-chain check blocks the repeat pass."
|
|
1021
|
+
}
|
|
1022
|
+
]
|
|
1023
|
+
}
|
|
1024
|
+
},
|
|
1025
|
+
{
|
|
1026
|
+
"when": { "all": [{ "field": "reentry_applicable", "op": "eq", "value": true }, { "field": "reentry_state", "op": "eq", "value": "pseudo" }, { "field": "reentry_scene_id", "op": "eq", "value": "arbitration_usage_guard" }] },
|
|
1027
|
+
"level": "medium",
|
|
1028
|
+
"title": "Reentrancy pseudo-protection: anti-reentrancy primitive present but not properly wrapped (${reentry_scene_id})",
|
|
1029
|
+
"description": "Scene: ${reentry_scene_id}\nThe Guard root contains an anti-reentrancy primitive (${reentry_found_primitive}), but it is NOT properly wrapped.\nProper wrapping rules:\n - Bool-returning primitives (exists-style): must be wrapped in logic_not\n - U64-returning primitives (count-style): must be compared to 0 via logic_equal\n - Address-returning primitives: must be wrapped in logic_not (None check)\n\nWHY THIS IS DANGEROUS:\n The developer likely intended to prevent reentrancy but the wrapping is incorrect, so the primitive does NOT actually block repeated Guard passes. This is arguably MORE dangerous than absence — code reviewers see the primitive and assume protection is in place.\n\nScene rationale: ${reentry_rationale}",
|
|
1030
|
+
"scenario": "Developer added anti-reentrancy primitive but used wrong wrapping; reentrancy exploit still possible in ${reentry_scene_id}",
|
|
1031
|
+
"mitigation": "Fix the wrapping:\n - For exists-style (Bool) primitives: wrap in logic_not — { type: 'logic_not', node: { type: 'query', query: <primitive>, ... } }\n - For count-style (U64) primitives: compare to 0 — { type: 'logic_equal', nodes: [ { type: 'query', query: <primitive>, ... }, identifier(N) ] } where table[N].value = 0\n - For address-style primitives: wrap in logic_not (None check)\nThen wrap the protection in logic_and with the existing root conditions.\n\nFull mitigation for ${reentry_scene_id}:\n${reentry_mitigation}",
|
|
1032
|
+
"evidence": "${reentry_evidence}",
|
|
1033
|
+
"stakeholders": ["customer", "provider"]
|
|
1034
|
+
},
|
|
1035
|
+
{
|
|
1036
|
+
"when": { "all": [{ "field": "reentry_applicable", "op": "eq", "value": true }, { "field": "reentry_state", "op": "eq", "value": "pseudo" }, { "field": "reentry_scene_id", "op": "eq", "value": "service_order_allocators_guard" }] },
|
|
1037
|
+
"level": "medium",
|
|
1038
|
+
"title": "Reentrancy pseudo-protection: anti-reentrancy primitive present but not properly wrapped (${reentry_scene_id})",
|
|
1039
|
+
"description": "Scene: ${reentry_scene_id}\nThe Guard root contains an anti-reentrancy primitive (${reentry_found_primitive}), but it is NOT properly wrapped.\nProper wrapping rules:\n - Bool-returning primitives (exists-style): must be wrapped in logic_not\n - U64-returning primitives (count-style): must be compared to 0 via logic_equal\n - Address-returning primitives: must be wrapped in logic_not (None check)\n\nWHY THIS IS DANGEROUS:\n The developer likely intended to prevent reentrancy but the wrapping is incorrect, so the primitive does NOT actually block repeated Guard passes. This is arguably MORE dangerous than absence — code reviewers see the primitive and assume protection is in place.\n\nScene rationale: ${reentry_rationale}",
|
|
1040
|
+
"scenario": "Developer added anti-reentrancy primitive but used wrong wrapping; reentrancy exploit still possible in ${reentry_scene_id}",
|
|
1041
|
+
"mitigation": "Fix the wrapping:\n - For exists-style (Bool) primitives: wrap in logic_not — { type: 'logic_not', node: { type: 'query', query: <primitive>, ... } }\n - For count-style (U64) primitives: compare to 0 — { type: 'logic_equal', nodes: [ { type: 'query', query: <primitive>, ... }, identifier(N) ] } where table[N].value = 0\n - For address-style primitives: wrap in logic_not (None check)\nThen wrap the protection in logic_and with the existing root conditions.\n\nFull mitigation for ${reentry_scene_id}:\n${reentry_mitigation}",
|
|
1042
|
+
"evidence": "${reentry_evidence}",
|
|
1043
|
+
"stakeholders": ["customer", "provider"]
|
|
1044
|
+
},
|
|
1045
|
+
{
|
|
1046
|
+
"when": { "all": [{ "field": "reentry_applicable", "op": "eq", "value": true }, { "field": "reentry_state", "op": "eq", "value": "pseudo" }, { "field": "reentry_scene_id", "op": "eq", "value": "service_buy_guard" }] },
|
|
1047
|
+
"level": "medium",
|
|
1048
|
+
"title": "Reentrancy pseudo-protection: anti-reentrancy primitive present but not properly wrapped (${reentry_scene_id})",
|
|
1049
|
+
"description": "Scene: ${reentry_scene_id}\nThe Guard root contains an anti-reentrancy primitive (${reentry_found_primitive}), but it is NOT properly wrapped.\nProper wrapping rules:\n - Bool-returning primitives (exists-style): must be wrapped in logic_not\n - U64-returning primitives (count-style): must be compared to 0 via logic_equal\n - Address-returning primitives: must be wrapped in logic_not (None check)\n\nWHY THIS IS DANGEROUS:\n The developer likely intended to prevent reentrancy but the wrapping is incorrect, so the primitive does NOT actually block repeated Guard passes. This is arguably MORE dangerous than absence — code reviewers see the primitive and assume protection is in place.\n\nScene rationale: ${reentry_rationale}",
|
|
1050
|
+
"scenario": "Developer added anti-reentrancy primitive but used wrong wrapping; reentrancy exploit still possible in ${reentry_scene_id}",
|
|
1051
|
+
"mitigation": "Fix the wrapping:\n - For exists-style (Bool) primitives: wrap in logic_not — { type: 'logic_not', node: { type: 'query', query: <primitive>, ... } }\n - For count-style (U64) primitives: compare to 0 — { type: 'logic_equal', nodes: [ { type: 'query', query: <primitive>, ... }, identifier(N) ] } where table[N].value = 0\n - For address-style primitives: wrap in logic_not (None check)\nThen wrap the protection in logic_and with the existing root conditions.\n\nFull mitigation for ${reentry_scene_id}:\n${reentry_mitigation}",
|
|
1052
|
+
"evidence": "${reentry_evidence}",
|
|
1053
|
+
"stakeholders": ["provider"]
|
|
1054
|
+
},
|
|
1055
|
+
{
|
|
1056
|
+
"when": { "all": [{ "field": "reentry_applicable", "op": "eq", "value": true }, { "field": "reentry_state", "op": "eq", "value": "pseudo" }, { "field": "reentry_scene_id", "op": "eq", "value": "repository_write_guard" }] },
|
|
1057
|
+
"level": "medium",
|
|
1058
|
+
"title": "Reentrancy pseudo-protection: anti-reentrancy primitive present but not properly wrapped (${reentry_scene_id})",
|
|
1059
|
+
"description": "Scene: ${reentry_scene_id}\nThe Guard root contains an anti-reentrancy primitive (${reentry_found_primitive}), but it is NOT properly wrapped.\nProper wrapping rules:\n - Bool-returning primitives (exists-style): must be wrapped in logic_not\n - U64-returning primitives (count-style): must be compared to 0 via logic_equal\n - Address-returning primitives: must be wrapped in logic_not (None check)\n\nWHY THIS IS DANGEROUS:\n The developer likely intended to prevent reentrancy but the wrapping is incorrect, so the primitive does NOT actually block repeated Guard passes. This is arguably MORE dangerous than absence — code reviewers see the primitive and assume protection is in place.\n\nScene rationale: ${reentry_rationale}",
|
|
1060
|
+
"scenario": "Developer added anti-reentrancy primitive but used wrong wrapping; reentrancy exploit still possible in ${reentry_scene_id}",
|
|
1061
|
+
"mitigation": "Fix the wrapping:\n - For exists-style (Bool) primitives: wrap in logic_not — { type: 'logic_not', node: { type: 'query', query: <primitive>, ... } }\n - For count-style (U64) primitives: compare to 0 — { type: 'logic_equal', nodes: [ { type: 'query', query: <primitive>, ... }, identifier(N) ] } where table[N].value = 0\n - For address-style primitives: wrap in logic_not (None check)\nThen wrap the protection in logic_and with the existing root conditions.\n\nFull mitigation for ${reentry_scene_id}:\n${reentry_mitigation}",
|
|
1062
|
+
"evidence": "${reentry_evidence}",
|
|
1063
|
+
"stakeholders": ["provider"]
|
|
1064
|
+
},
|
|
1065
|
+
{
|
|
1066
|
+
"when": { "all": [{ "field": "reentry_applicable", "op": "eq", "value": true }, { "field": "reentry_state", "op": "eq", "value": "pseudo" }, { "field": "reentry_scene_id", "op": "eq", "value": "gen_passport_guard" }] },
|
|
1067
|
+
"level": "medium",
|
|
1068
|
+
"title": "Reentrancy pseudo-protection: anti-reentrancy primitive present but not properly wrapped (${reentry_scene_id})",
|
|
1069
|
+
"description": "Scene: ${reentry_scene_id}\nThe Guard root contains an anti-reentrancy primitive (${reentry_found_primitive}), but it is NOT properly wrapped.\nProper wrapping rules:\n - Bool-returning primitives (exists-style): must be wrapped in logic_not\n - U64-returning primitives (count-style): must be compared to 0 via logic_equal\n - Address-returning primitives: must be wrapped in logic_not (None check)\n\nWHY THIS IS DANGEROUS:\n The developer likely intended to prevent reentrancy but the wrapping is incorrect, so the primitive does NOT actually block repeated Guard passes. This is arguably MORE dangerous than absence — code reviewers see the primitive and assume protection is in place.\n\nScene rationale: ${reentry_rationale}",
|
|
1070
|
+
"scenario": "Developer added anti-reentrancy primitive but used wrong wrapping; reentrancy exploit still possible in ${reentry_scene_id}",
|
|
1071
|
+
"mitigation": "Fix the wrapping:\n - For exists-style (Bool) primitives: wrap in logic_not — { type: 'logic_not', node: { type: 'query', query: <primitive>, ... } }\n - For count-style (U64) primitives: compare to 0 — { type: 'logic_equal', nodes: [ { type: 'query', query: <primitive>, ... }, identifier(N) ] } where table[N].value = 0\n - For address-style primitives: wrap in logic_not (None check)\nThen wrap the protection in logic_and with the existing root conditions.\n\nFull mitigation for ${reentry_scene_id}:\n${reentry_mitigation}",
|
|
1072
|
+
"evidence": "${reentry_evidence}",
|
|
1073
|
+
"stakeholders": ["provider"]
|
|
1074
|
+
},
|
|
1075
|
+
{
|
|
1076
|
+
"when": { "all": [{ "field": "reentry_applicable", "op": "eq", "value": true }, { "field": "reentry_state", "op": "eq", "value": "absent" }, { "field": "reentry_scene_id", "op": "eq", "value": "reward_claim" }] },
|
|
1077
|
+
"level": "critical",
|
|
1078
|
+
"title": "Reentrancy risk: ${reentry_scene_id} has NO anti-reentrancy protection (CRITICAL)",
|
|
1079
|
+
"description": "Scene: ${reentry_scene_id}\nReentrancy risk level: CRITICAL\n\nRATIONALE:\n${reentry_rationale}\n\nDETECTION:\n${reentry_evidence}\n\nIMPACT: Without protection, the same Signer can repeatedly trigger the side effect (fund distribution / vote counting), causing direct fund loss or result manipulation. THIS IS A CRITICAL VULNERABILITY — the Guard MUST be rebuilt with an anti-reentrancy primitive before deployment.\n\n",
|
|
1080
|
+
"scenario": "${reentry_scene_id} lacks anti-reentrancy primitive; same Signer can repeatedly trigger the side effect",
|
|
1081
|
+
"mitigation": "${reentry_mitigation}",
|
|
1082
|
+
"evidence": "${reentry_evidence}",
|
|
1083
|
+
"stakeholders": ["claimant", "provider"],
|
|
1084
|
+
"exposure": {
|
|
1085
|
+
"loss_parties": [
|
|
1086
|
+
{ "role": "merchant", "basis": "The reward pool is the merchant's deposited budget — repeated Guard passes let the same signer drain it multiple times." }
|
|
1087
|
+
],
|
|
1088
|
+
"gain_paths": [
|
|
1089
|
+
{
|
|
1090
|
+
"role": "neutral",
|
|
1091
|
+
"path": "The same signer repeatedly passes the claim Guard and collects the payout again each time.",
|
|
1092
|
+
"viability": "viable",
|
|
1093
|
+
"gate": "The anti-reentrancy primitive is absent or mis-wrapped, so no on-chain check blocks the repeat pass."
|
|
1094
|
+
}
|
|
1095
|
+
]
|
|
1096
|
+
}
|
|
1097
|
+
},
|
|
1098
|
+
{
|
|
1099
|
+
"when": { "all": [{ "field": "reentry_applicable", "op": "eq", "value": true }, { "field": "reentry_state", "op": "eq", "value": "absent" }, { "field": "reentry_scene_id", "op": "eq", "value": "arbitration_voting_guard" }] },
|
|
1100
|
+
"level": "critical",
|
|
1101
|
+
"title": "Reentrancy risk: ${reentry_scene_id} has NO anti-reentrancy protection (CRITICAL)",
|
|
1102
|
+
"description": "Scene: ${reentry_scene_id}\nReentrancy risk level: CRITICAL\n\nRATIONALE:\n${reentry_rationale}\n\nDETECTION:\n${reentry_evidence}\n\nIMPACT: Without protection, the same Signer can repeatedly trigger the side effect (fund distribution / vote counting), causing direct fund loss or result manipulation. THIS IS A CRITICAL VULNERABILITY — the Guard MUST be rebuilt with an anti-reentrancy primitive before deployment.\n\n",
|
|
1103
|
+
"scenario": "${reentry_scene_id} lacks anti-reentrancy primitive; same Signer can repeatedly trigger the side effect",
|
|
1104
|
+
"mitigation": "${reentry_mitigation}",
|
|
1105
|
+
"evidence": "${reentry_evidence}",
|
|
1106
|
+
"stakeholders": ["customer", "provider", "arbitrator"],
|
|
1107
|
+
"exposure": {
|
|
1108
|
+
"loss_parties": [
|
|
1109
|
+
{ "role": "buyer", "basis": "Repeated vote counting can swing the arbitration ruling — the buyer may be denied a deserved payout or charged a wrongful one." },
|
|
1110
|
+
{ "role": "merchant", "basis": "The same manipulated ruling can force an unjustified compensation payout from the merchant side." }
|
|
1111
|
+
],
|
|
1112
|
+
"gain_paths": [
|
|
1113
|
+
{
|
|
1114
|
+
"role": "neutral",
|
|
1115
|
+
"path": "The same signer repeatedly passes the voting Guard, re-triggering the vote-count side effect until the tally favors them.",
|
|
1116
|
+
"viability": "viable",
|
|
1117
|
+
"gate": "The anti-reentrancy primitive is absent or mis-wrapped, so no on-chain check blocks the repeat pass."
|
|
1118
|
+
}
|
|
1119
|
+
]
|
|
1120
|
+
}
|
|
1121
|
+
},
|
|
1122
|
+
{
|
|
1123
|
+
"when": { "all": [{ "field": "reentry_applicable", "op": "eq", "value": true }, { "field": "reentry_state", "op": "eq", "value": "absent" }, { "field": "reentry_scene_id", "op": "eq", "value": "arbitration_usage_guard" }] },
|
|
1124
|
+
"level": "high",
|
|
1125
|
+
"title": "Reentrancy risk: ${reentry_scene_id} has NO anti-reentrancy protection (HIGH)",
|
|
1126
|
+
"description": "Scene: ${reentry_scene_id}\nReentrancy risk level: HIGH\n\nRATIONALE:\n${reentry_rationale}\n\nDETECTION:\n${reentry_evidence}\n\nIMPACT: Without protection, the system can be abused (multiple dispute cases, arbitration harassment). Strongly recommended to add protection.\n\n",
|
|
1127
|
+
"scenario": "${reentry_scene_id} lacks anti-reentrancy primitive; same Signer can repeatedly trigger the side effect",
|
|
1128
|
+
"mitigation": "${reentry_mitigation}",
|
|
1129
|
+
"evidence": "${reentry_evidence}",
|
|
1130
|
+
"stakeholders": ["customer", "provider"]
|
|
1131
|
+
},
|
|
1132
|
+
{
|
|
1133
|
+
"when": { "all": [{ "field": "reentry_applicable", "op": "eq", "value": true }, { "field": "reentry_state", "op": "eq", "value": "absent" }, { "field": "reentry_scene_id", "op": "eq", "value": "service_order_allocators_guard" }] },
|
|
1134
|
+
"level": "low",
|
|
1135
|
+
"title": "Reentrancy reminder: ${reentry_scene_id} has no anti-reentrancy primitive (LOW risk)",
|
|
1136
|
+
"description": "Scene: ${reentry_scene_id}\nReentrancy risk level: LOW\n\nRATIONALE:\n${reentry_rationale}\n\nDETECTION:\n${reentry_evidence}\n\nIMPACT: Low by default; only relevant if business intent requires single-action enforcement. Review the rationale above.\n\n",
|
|
1137
|
+
"scenario": "${reentry_scene_id} lacks anti-reentrancy primitive; may or may not be needed depending on business intent",
|
|
1138
|
+
"mitigation": "${reentry_mitigation}",
|
|
1139
|
+
"evidence": "${reentry_evidence}",
|
|
1140
|
+
"stakeholders": ["customer", "provider"]
|
|
1141
|
+
},
|
|
1142
|
+
{
|
|
1143
|
+
"when": { "all": [{ "field": "reentry_applicable", "op": "eq", "value": true }, { "field": "reentry_state", "op": "eq", "value": "absent" }, { "field": "reentry_scene_id", "op": "eq", "value": "service_buy_guard" }] },
|
|
1144
|
+
"level": "low",
|
|
1145
|
+
"title": "Reentrancy reminder: ${reentry_scene_id} has no anti-reentrancy primitive (LOW risk)",
|
|
1146
|
+
"description": "Scene: ${reentry_scene_id}\nReentrancy risk level: LOW\n\nRATIONALE:\n${reentry_rationale}\n\nDETECTION:\n${reentry_evidence}\n\nIMPACT: Low by default; only relevant if business intent requires single-action enforcement. Review the rationale above.\n\n",
|
|
1147
|
+
"scenario": "${reentry_scene_id} lacks anti-reentrancy primitive; may or may not be needed depending on business intent",
|
|
1148
|
+
"mitigation": "${reentry_mitigation}",
|
|
1149
|
+
"evidence": "${reentry_evidence}",
|
|
1150
|
+
"stakeholders": ["provider"]
|
|
1151
|
+
},
|
|
1152
|
+
{
|
|
1153
|
+
"when": { "all": [{ "field": "reentry_applicable", "op": "eq", "value": true }, { "field": "reentry_state", "op": "eq", "value": "absent" }, { "field": "reentry_scene_id", "op": "eq", "value": "repository_write_guard" }] },
|
|
1154
|
+
"level": "low",
|
|
1155
|
+
"title": "Reentrancy reminder: ${reentry_scene_id} has no anti-reentrancy primitive (LOW risk)",
|
|
1156
|
+
"description": "Scene: ${reentry_scene_id}\nReentrancy risk level: LOW\n\nRATIONALE:\n${reentry_rationale}\n\nDETECTION:\n${reentry_evidence}\n\nIMPACT: Low by default; only relevant if business intent requires single-action enforcement. Review the rationale above.\n\n",
|
|
1157
|
+
"scenario": "${reentry_scene_id} lacks anti-reentrancy primitive; may or may not be needed depending on business intent",
|
|
1158
|
+
"mitigation": "${reentry_mitigation}",
|
|
1159
|
+
"evidence": "${reentry_evidence}",
|
|
1160
|
+
"stakeholders": ["provider"]
|
|
1161
|
+
},
|
|
1162
|
+
{
|
|
1163
|
+
"when": { "all": [{ "field": "reentry_applicable", "op": "eq", "value": true }, { "field": "reentry_state", "op": "eq", "value": "absent" }, { "field": "reentry_scene_id", "op": "eq", "value": "gen_passport_guard" }] },
|
|
1164
|
+
"level": "low",
|
|
1165
|
+
"title": "Reentrancy reminder: ${reentry_scene_id} has no anti-reentrancy primitive (LOW risk)",
|
|
1166
|
+
"description": "Scene: ${reentry_scene_id}\nReentrancy risk level: LOW\n\nRATIONALE:\n${reentry_rationale}\n\nDETECTION:\n${reentry_evidence}\n\nIMPACT: Low by default; only relevant if business intent requires single-action enforcement. Review the rationale above.\n\n",
|
|
1167
|
+
"scenario": "${reentry_scene_id} lacks anti-reentrancy primitive; may or may not be needed depending on business intent",
|
|
1168
|
+
"mitigation": "${reentry_mitigation}",
|
|
1169
|
+
"evidence": "${reentry_evidence}",
|
|
1170
|
+
"stakeholders": ["provider"]
|
|
1171
|
+
}
|
|
1172
|
+
]
|
|
1173
|
+
},
|
|
1174
|
+
{
|
|
1175
|
+
"rule_id": "R-X1-15",
|
|
1176
|
+
"dimension": "logic_gap",
|
|
1177
|
+
"trigger": "Guard root contains a progress.current query (id=1253 or name='progress.current'); if bound to a forward of the SAME Progress object, the guard evaluates before state transition",
|
|
1178
|
+
"cases": [
|
|
1179
|
+
{
|
|
1180
|
+
"when": { "field": "root_has_progress_current_query", "op": "eq", "value": true },
|
|
1181
|
+
"level": "medium",
|
|
1182
|
+
"title": "Guard queries progress.current — verify it is NOT the same Progress object the hosting operation mutates",
|
|
1183
|
+
"description": "Cognitive Principle P1: Guard validation ALWAYS occurs BEFORE the operation. This Guard contains a progress.current query. If this Guard is bound to a forward of the SAME Progress object it queries, the Guard will see the PRE-transition value (source node, not target node) and may always fail. Querying a DIFFERENT Progress object (e.g. another Machine's progress) is a valid and reasonable design pattern — the principle does not apply in that case. Allocator-bound guards are also unaffected because allocation.alloc() runs AFTER the state transition completes.",
|
|
1184
|
+
"scenario": "Forward guard checks progress.current == target_node of the same Progress — always fails because the guard runs before the state transition sets the new current node",
|
|
1185
|
+
"mitigation": "1) If this Guard queries the SAME Progress object the forward operates on: remove the guard from the forward, bind it ONLY to the Allocator (which runs after transition); OR change the check to verify the SOURCE node instead of the target node. 2) If this Guard queries a DIFFERENT Progress object (cross-machine): no action needed — this is a legitimate pattern. 3) The full principle and code evidence are stated in the description above (Cognitive Principle P1).",
|
|
1186
|
+
"evidence": "Root contains progress.current query (id=1253). Query IDs detected: [${root_query_ids_csv}].",
|
|
1187
|
+
"stakeholders": ["provider"]
|
|
1188
|
+
}
|
|
1189
|
+
]
|
|
1190
|
+
}
|
|
1191
|
+
]
|
|
1192
|
+
}
|