@wowok/agent-mcp 3.1.3 → 3.1.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/config/config-audit.spec.d.ts +1 -0
- package/dist/config/config-audit.spec.js +1 -0
- package/dist/config/exposure.d.ts +108 -0
- package/dist/config/exposure.js +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.js +1 -1
- package/dist/config/judgment.d.ts +1228 -0
- package/dist/config/judgment.js +1 -0
- package/dist/config/judgment.spec.d.ts +1 -0
- package/dist/config/judgment.spec.js +1 -0
- package/dist/config/rule-engine.d.ts +299 -0
- package/dist/config/rule-engine.js +1 -0
- package/dist/config/rule-engine.spec.d.ts +1 -0
- package/dist/config/rule-engine.spec.js +1 -0
- package/dist/config/severity.d.ts +7 -0
- package/dist/config/severity.js +1 -0
- package/dist/customer/order-monitor.d.ts +3 -1
- package/dist/customer/order-monitor.js +1 -1
- package/dist/evaluation/acceptance.d.ts +1 -0
- package/dist/evaluation/acceptance.js +1 -1
- package/dist/evaluation/arbitration-game.js +1 -1
- package/dist/evaluation/builtins/demand-match.js +1 -1
- package/dist/evaluation/builtins/graph-service.js +1 -1
- package/dist/evaluation/builtins/graph-service.spec.js +1 -1
- package/dist/evaluation/engine.js +1 -1
- package/dist/evaluation/game-strategy.d.ts +2 -2
- package/dist/evaluation/game-strategy.js +1 -1
- package/dist/evaluation/match-operation.d.ts +2 -2
- package/dist/evaluation/match-operation.js +1 -1
- package/dist/evaluation/standards.d.ts +3 -25
- package/dist/evaluation/standards.js +1 -1
- package/dist/evaluation/types.d.ts +2 -1
- package/dist/experience/realtime-feedback.js +1 -1
- package/dist/extensions/business-modules.js +1 -1
- package/dist/extensions/custom-registry-file.js +1 -1
- package/dist/extensions/industry-audit.spec.d.ts +1 -0
- package/dist/extensions/industry-audit.spec.js +1 -0
- package/dist/extensions/industry-layers.d.ts +8 -0
- package/dist/extensions/industry-layers.js +1 -1
- package/dist/extensions/industry-pack.d.ts +2 -0
- package/dist/extensions/industry-pack.js +1 -1
- package/dist/extensions/mode-evaluator.js +1 -1
- package/dist/extensions/modes.js +1 -1
- package/dist/graph/onchain/analyze.d.ts +3 -1
- package/dist/graph/onchain/analyze.js +1 -1
- package/dist/graph/onchain/analyze.spec.js +1 -1
- package/dist/graph/onchain/edge-schema.d.ts +1 -0
- package/dist/graph/onchain/edge-schema.js +1 -1
- package/dist/graph/onchain/expand.js +1 -1
- package/dist/graph/onchain/exploration.d.ts +28 -0
- package/dist/graph/onchain/exploration.js +1 -0
- package/dist/graph/onchain/exploration.spec.d.ts +1 -0
- package/dist/graph/onchain/exploration.spec.js +1 -0
- package/dist/graph/onchain/exposure.d.ts +18 -0
- package/dist/graph/onchain/exposure.js +1 -0
- package/dist/graph/onchain/exposure.spec.d.ts +1 -0
- package/dist/graph/onchain/exposure.spec.js +1 -0
- package/dist/graph/onchain/graph-policy.spec.d.ts +1 -0
- package/dist/graph/onchain/graph-policy.spec.js +1 -0
- package/dist/graph/onchain/index.d.ts +6 -0
- package/dist/graph/onchain/index.js +1 -1
- package/dist/graph/onchain/interest.js +1 -1
- package/dist/graph/onchain/interest.spec.js +1 -1
- package/dist/graph/onchain/names.js +1 -1
- package/dist/graph/onchain/names.spec.js +1 -1
- package/dist/graph/onchain/policy.d.ts +8 -0
- package/dist/graph/onchain/policy.js +1 -0
- package/dist/graph/onchain/proposal-graph.js +1 -1
- package/dist/graph/onchain/proposal-graph.spec.js +1 -1
- package/dist/graph/onchain/synthesis.d.ts +20 -0
- package/dist/graph/onchain/synthesis.js +1 -0
- package/dist/graph/onchain/synthesis.spec.d.ts +1 -0
- package/dist/graph/onchain/synthesis.spec.js +1 -0
- package/dist/graph/onchain/types.d.ts +11 -1
- package/dist/keeper/keeper.spec.js +1 -1
- package/dist/knowledge/alloc-audit-policy.spec.d.ts +1 -0
- package/dist/knowledge/alloc-audit-policy.spec.js +1 -0
- package/dist/knowledge/allocation-ledger.js +1 -1
- package/dist/knowledge/allocation-puzzle.d.ts +1 -1
- package/dist/knowledge/allocation-puzzle.js +1 -1
- package/dist/knowledge/allocation-risk.d.ts +4 -1
- package/dist/knowledge/allocation-risk.js +1 -1
- package/dist/knowledge/allocation-templates.js +1 -1
- package/dist/knowledge/arb-risk.d.ts +6 -5
- package/dist/knowledge/arb-risk.js +1 -1
- package/dist/knowledge/arbitration-ledger.d.ts +4 -4
- package/dist/knowledge/arbitration-ledger.js +1 -1
- package/dist/knowledge/arbitration-puzzle.d.ts +1 -1
- package/dist/knowledge/arbitration-puzzle.js +1 -1
- package/dist/knowledge/arbitration-risk.d.ts +4 -1
- package/dist/knowledge/arbitration-risk.js +1 -1
- package/dist/knowledge/arbitration-templates.js +1 -1
- package/dist/knowledge/baselines/judgment-baselines.json +289 -0
- package/dist/knowledge/baselines/risk-baselines.spec.js +1 -1
- package/dist/knowledge/baselines/rules/alloc_audit.json +290 -0
- package/dist/knowledge/baselines/rules/allocation.json +492 -0
- package/dist/knowledge/baselines/rules/arb.json +155 -0
- package/dist/knowledge/baselines/rules/arbitration.json +366 -0
- package/dist/knowledge/baselines/rules/bridge.json +197 -0
- package/dist/knowledge/baselines/rules/contact.json +152 -0
- package/dist/knowledge/baselines/rules/demand.json +158 -0
- package/dist/knowledge/baselines/rules/graph.json +453 -0
- package/dist/knowledge/baselines/rules/guard.json +981 -0
- package/dist/knowledge/baselines/rules/machine.json +706 -0
- package/dist/knowledge/baselines/rules/order.json +549 -0
- package/dist/knowledge/baselines/rules/payment.json +205 -0
- package/dist/knowledge/baselines/rules/permission.json +330 -0
- package/dist/knowledge/baselines/rules/personal.json +139 -0
- package/dist/knowledge/baselines/rules/progress.json +346 -0
- package/dist/knowledge/baselines/rules/proof.json +158 -0
- package/dist/knowledge/baselines/rules/registrar.json +159 -0
- package/dist/knowledge/baselines/rules/repository.json +244 -0
- package/dist/knowledge/baselines/rules/resource.json +117 -0
- package/dist/knowledge/baselines/rules/reward.json +471 -0
- package/dist/knowledge/baselines/rules/service.json +595 -0
- package/dist/knowledge/baselines/rules/treasury.json +440 -0
- package/dist/knowledge/baselines/rules/util.json +101 -0
- package/dist/knowledge/bridge-risk.d.ts +6 -5
- package/dist/knowledge/bridge-risk.js +1 -1
- package/dist/knowledge/builtin-templates.d.ts +26 -0
- package/dist/knowledge/builtin-templates.js +1 -0
- package/dist/knowledge/contact-risk.d.ts +6 -5
- package/dist/knowledge/contact-risk.js +1 -1
- package/dist/knowledge/demand-risk.d.ts +6 -5
- package/dist/knowledge/demand-risk.js +1 -1
- package/dist/knowledge/event-semantics.js +1 -1
- package/dist/knowledge/facts-sync.spec.d.ts +1 -0
- package/dist/knowledge/facts-sync.spec.js +1 -0
- package/dist/knowledge/getting-started.js +1 -1
- package/dist/knowledge/guard-design-patterns.js +1 -1
- package/dist/knowledge/guard-field-cognition.d.ts +1 -1
- package/dist/knowledge/guard-field-cognition.js +1 -1
- package/dist/knowledge/guard-ledger.js +1 -1
- package/dist/knowledge/guard-risk.d.ts +4 -1
- package/dist/knowledge/guard-risk.js +1 -1
- package/dist/knowledge/guard-templates.js +1 -1
- package/dist/knowledge/guard-translation.js +1 -1
- package/dist/knowledge/index.d.ts +10 -2
- package/dist/knowledge/index.js +1 -1
- package/dist/knowledge/industry-registry.js +1 -1
- package/dist/knowledge/industry-strategy.js +1 -1
- package/dist/knowledge/jsonrpc-enum.js +1 -1
- package/dist/knowledge/machine-ledger.js +1 -1
- package/dist/knowledge/machine-risk.d.ts +4 -1
- package/dist/knowledge/machine-risk.js +1 -1
- package/dist/knowledge/machine-templates.js +1 -1
- package/dist/knowledge/machine-translation.js +1 -1
- package/dist/knowledge/migration-preflight.js +1 -1
- package/dist/knowledge/operation-dictionary.js +1 -1
- package/dist/knowledge/order-ledger.js +1 -1
- package/dist/knowledge/order-puzzle.d.ts +3 -3
- package/dist/knowledge/order-puzzle.js +1 -1
- package/dist/knowledge/order-risk.d.ts +6 -3
- package/dist/knowledge/order-risk.js +1 -1
- package/dist/knowledge/order-templates.js +1 -1
- package/dist/knowledge/passport-ledger.js +1 -1
- package/dist/knowledge/passport-templates.js +1 -1
- package/dist/knowledge/payment-risk.d.ts +8 -6
- package/dist/knowledge/payment-risk.js +1 -1
- package/dist/knowledge/payment-tracker.js +1 -1
- package/dist/knowledge/permission-ledger.js +1 -1
- package/dist/knowledge/permission-puzzle.d.ts +12 -12
- package/dist/knowledge/permission-puzzle.js +1 -1
- package/dist/knowledge/permission-risk.d.ts +4 -7
- package/dist/knowledge/permission-risk.js +1 -1
- package/dist/knowledge/permission-templates.js +1 -1
- package/dist/knowledge/personal-risk.d.ts +6 -5
- package/dist/knowledge/personal-risk.js +1 -1
- package/dist/knowledge/progress-ledger.js +1 -1
- package/dist/knowledge/progress-puzzle.d.ts +2 -2
- package/dist/knowledge/progress-puzzle.js +1 -1
- package/dist/knowledge/progress-risk.d.ts +4 -1
- package/dist/knowledge/progress-risk.js +1 -1
- package/dist/knowledge/progress-templates.js +1 -1
- package/dist/knowledge/proof-risk.d.ts +6 -5
- package/dist/knowledge/proof-risk.js +1 -1
- package/dist/knowledge/puzzle-projections.js +1 -1
- package/dist/knowledge/recipient-constraint.d.ts +20 -1
- package/dist/knowledge/recipient-constraint.js +1 -1
- package/dist/knowledge/registrar-risk.d.ts +6 -5
- package/dist/knowledge/registrar-risk.js +1 -1
- package/dist/knowledge/repository-risk.d.ts +7 -6
- package/dist/knowledge/repository-risk.js +1 -1
- package/dist/knowledge/resource-risk.d.ts +6 -5
- package/dist/knowledge/resource-risk.js +1 -1
- package/dist/knowledge/reward-ledger.d.ts +1 -1
- package/dist/knowledge/reward-ledger.js +1 -1
- package/dist/knowledge/reward-puzzle.d.ts +2 -2
- package/dist/knowledge/reward-puzzle.js +1 -1
- package/dist/knowledge/reward-risk.d.ts +4 -1
- package/dist/knowledge/reward-risk.js +1 -1
- package/dist/knowledge/rule-node-analyzers.spec.js +1 -1
- package/dist/knowledge/rule-outcome.js +1 -1
- package/dist/knowledge/scenario-modes.d.ts +2 -2
- package/dist/knowledge/scenario-modes.js +1 -1
- package/dist/knowledge/scenario-topology.js +1 -1
- package/dist/knowledge/service-allocator-audit-node.js +1 -1
- package/dist/knowledge/service-ledger.js +1 -1
- package/dist/knowledge/service-puzzle.d.ts +2 -2
- package/dist/knowledge/service-puzzle.js +1 -1
- package/dist/knowledge/service-risk-node.js +1 -1
- package/dist/knowledge/service-risk.d.ts +4 -1
- package/dist/knowledge/service-risk.js +1 -1
- package/dist/knowledge/service-templates.js +1 -1
- package/dist/knowledge/strategy-manuals.d.ts +1 -1
- package/dist/knowledge/strategy-manuals.js +1 -1
- package/dist/knowledge/template-loader.d.ts +84 -0
- package/dist/knowledge/template-loader.js +1 -0
- package/dist/knowledge/template-loader.spec.d.ts +1 -0
- package/dist/knowledge/template-loader.spec.js +1 -0
- package/dist/knowledge/template-registry.js +1 -1
- package/dist/knowledge/template-scanner.d.ts +17 -0
- package/dist/knowledge/template-scanner.js +1 -0
- package/dist/knowledge/template-scanner.spec.d.ts +1 -0
- package/dist/knowledge/template-scanner.spec.js +1 -0
- package/dist/knowledge/tools-reference.js +1 -1
- package/dist/knowledge/treasury-ledger.d.ts +1 -1
- package/dist/knowledge/treasury-ledger.js +1 -1
- package/dist/knowledge/treasury-puzzle.d.ts +3 -3
- package/dist/knowledge/treasury-puzzle.js +1 -1
- package/dist/knowledge/treasury-risk.d.ts +4 -1
- package/dist/knowledge/treasury-risk.js +1 -1
- package/dist/knowledge/treasury-templates.js +1 -1
- package/dist/knowledge/util-risk.d.ts +6 -5
- package/dist/knowledge/util-risk.js +1 -1
- package/dist/knowledge/workflow-guidance.d.ts +4 -0
- package/dist/knowledge/workflow-guidance.js +1 -1
- package/dist/knowledge/workspace-lists.js +1 -1
- package/dist/monitor/MonitorLoop.js +1 -1
- package/dist/participation/arbitrator-interest.js +1 -1
- package/dist/participation/radar-core.js +1 -1
- package/dist/persona/analyzer.js +1 -1
- package/dist/persona/index.js +1 -1
- package/dist/persona/model.js +1 -1
- package/dist/persona/persona-audit.spec.d.ts +1 -0
- package/dist/persona/persona-audit.spec.js +1 -0
- package/dist/persona/types.d.ts +2 -0
- package/dist/playbooks/service-build/business-puzzle.js +1 -1
- package/dist/playbooks/service-build/facet-money.d.ts +11 -0
- package/dist/playbooks/service-build/facet-money.js +1 -1
- package/dist/playbooks/service-build/machine-panorama.d.ts +17 -0
- package/dist/playbooks/service-build/machine-panorama.js +1 -1
- package/dist/playbooks/service-build/merchant-guide.d.ts +2 -2
- package/dist/playbooks/service-build/migration-planner.d.ts +43 -0
- package/dist/playbooks/service-build/migration-planner.js +1 -0
- package/dist/playbooks/service-build/object-panorama.d.ts +42 -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/pipeline-actions.d.ts +1 -1
- package/dist/playbooks/service-build/reverse-mapping.d.ts +1 -0
- package/dist/playbooks/service-build/reverse-mapping.js +1 -1
- package/dist/playbooks/service-build/risk-aggregator.d.ts +2 -1
- package/dist/playbooks/service-build/risk-aggregator.js +1 -1
- package/dist/playbooks/service-build/semantic-graph.js +1 -1
- package/dist/playbooks/service-build/service-panorama.d.ts +53 -1
- package/dist/playbooks/service-build/service-panorama.js +1 -1
- package/dist/playbooks/service-build/topology-evaluation.spec.js +1 -1
- package/dist/playbooks/service-build/topology-query.js +1 -1
- package/dist/playbooks/service-build/workflow-design-assessment.d.ts +2 -2
- package/dist/playbooks/service-build/workflow-design-assessment.js +1 -1
- package/dist/relationship/registry.js +1 -1
- package/dist/review/machine.js +1 -1
- package/dist/review/order.js +1 -1
- package/dist/review/service.js +1 -1
- package/dist/review/types.d.ts +7 -0
- package/dist/safety/confirm-gate.js +1 -1
- package/dist/schema/benchmark-migration/index.d.ts +207 -0
- package/dist/schema/benchmark-migration/index.js +1 -0
- package/dist/schema/call/allocation.d.ts +1 -1
- package/dist/schema/call/allocation.js +1 -1
- package/dist/schema/call/arbitration.d.ts +1 -1
- package/dist/schema/call/arbitration.js +1 -1
- package/dist/schema/call/base.d.ts +5 -5
- package/dist/schema/call/base.js +1 -1
- package/dist/schema/call/contact.d.ts +1 -1
- package/dist/schema/call/demand.d.ts +1 -1
- package/dist/schema/call/guard.d.ts +3 -3
- package/dist/schema/call/machine.d.ts +5 -5
- package/dist/schema/call/order.d.ts +3 -3
- package/dist/schema/call/payment.js +1 -1
- package/dist/schema/call/permission-handler.d.ts +1 -1
- package/dist/schema/call/permission-handler.js +1 -1
- package/dist/schema/call/permission.d.ts +16 -16
- package/dist/schema/call/permission.js +1 -1
- package/dist/schema/call/personal.d.ts +8 -8
- package/dist/schema/call/personal.js +1 -1
- package/dist/schema/call/progress.d.ts +3 -3
- package/dist/schema/call/repository.d.ts +11 -11
- package/dist/schema/call/repository.js +1 -1
- package/dist/schema/call/reward.d.ts +1 -1
- package/dist/schema/call/semantic.js +1 -1
- package/dist/schema/call/service.d.ts +7 -7
- package/dist/schema/call/service.js +1 -1
- package/dist/schema/call/treasury.d.ts +1 -1
- package/dist/schema/common/index.d.ts +6 -6
- package/dist/schema/common/index.js +1 -1
- package/dist/schema/config/index.d.ts +50 -1
- package/dist/schema/config/index.js +1 -1
- package/dist/schema/evaluation/index.d.ts +27 -11
- package/dist/schema/evaluation/index.js +1 -1
- package/dist/schema/goal/index.d.ts +5 -5
- package/dist/schema/goal/planning.d.ts +15 -15
- package/dist/schema/goal/planning.js +1 -1
- package/dist/schema/index.d.ts +1 -0
- package/dist/schema/index.js +1 -1
- package/dist/schema/interaction/index.d.ts +1 -1
- package/dist/schema/local/index.js +1 -1
- package/dist/schema/messenger/index.d.ts +26 -26
- package/dist/schema/operations.d.ts +33 -33
- package/dist/schema/operations.js +1 -1
- package/dist/schema/persona/index.d.ts +4708 -0
- package/dist/schema/persona/index.js +1 -1
- package/dist/schema/query/bi.d.ts +232 -25
- package/dist/schema/query/bi.js +1 -1
- package/dist/schema/query/index.d.ts +35 -35
- package/dist/schema/query/index.js +1 -1
- package/dist/schema/schema-version.js +1 -1
- package/dist/schema/workflow/index.d.ts +1 -1
- package/dist/schema-query-impl/index.d.ts +9 -0
- package/dist/schema-query-impl/index.js +1 -1
- package/dist/schemas/benchmark_migration_operation.output.json +793 -0
- package/dist/schemas/benchmark_migration_operation.schema.json +83 -0
- package/dist/schemas/bridge_operation.schema.json +5 -5
- package/dist/schemas/config_operation.output.json +252 -0
- package/dist/schemas/config_operation.schema.json +21 -1
- package/dist/schemas/evaluation_operation.output.json +22 -10
- package/dist/schemas/goal_operation.schema.json +8 -8
- package/dist/schemas/guard2file.schema.json +1 -1
- package/dist/schemas/index.json +7 -1
- package/dist/schemas/machineNode2file.schema.json +1 -1
- package/dist/schemas/messenger_operation.schema.json +24 -12
- package/dist/schemas/onchain_events.output.json +1 -1
- package/dist/schemas/onchain_operations.output.json +4 -2
- package/dist/schemas/onchain_operations.schema.json +189 -139
- package/dist/schemas/onchain_operations_allocation.schema.json +13 -11
- package/dist/schemas/onchain_operations_arbitration.schema.json +10 -8
- package/dist/schemas/onchain_operations_contact.schema.json +7 -5
- package/dist/schemas/onchain_operations_demand.schema.json +7 -5
- package/dist/schemas/onchain_operations_gen_passport.schema.json +5 -3
- package/dist/schemas/onchain_operations_gen_proof.schema.json +1 -1
- package/dist/schemas/onchain_operations_guard.schema.json +5 -3
- package/dist/schemas/onchain_operations_machine.schema.json +22 -18
- package/dist/schemas/onchain_operations_order.schema.json +11 -7
- package/dist/schemas/onchain_operations_payment.schema.json +3 -3
- package/dist/schemas/onchain_operations_permission.schema.json +19 -11
- package/dist/schemas/onchain_operations_personal.schema.json +16 -10
- package/dist/schemas/onchain_operations_progress.schema.json +11 -7
- package/dist/schemas/onchain_operations_proof.schema.json +5 -3
- package/dist/schemas/onchain_operations_repository.schema.json +12 -8
- package/dist/schemas/onchain_operations_reward.schema.json +11 -9
- package/dist/schemas/onchain_operations_service.schema.json +28 -22
- package/dist/schemas/onchain_operations_treasury.schema.json +11 -9
- package/dist/schemas/onchain_table_data.output.json +27 -17
- package/dist/schemas/persona_operation.output.json +15875 -1
- package/dist/schemas/persona_operation.schema.json +3056 -478
- package/dist/schemas/query_toolkit.output.json +343 -63
- package/dist/schemas/query_toolkit.schema.json +1 -1
- package/dist/schemas/workflow_operation.schema.json +4 -2
- package/dist/strategy/scorecard.js +1 -1
- package/dist/tools/handlers/benchmark-migration.d.ts +2 -0
- package/dist/tools/handlers/benchmark-migration.js +1 -0
- package/dist/tools/handlers/config.js +1 -1
- package/dist/tools/handlers/industry-pack.js +1 -1
- package/dist/tools/handlers/onchain.js +1 -1
- package/dist/tools/handlers/query.js +1 -1
- package/dist/tools/handlers/schema-query.js +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/move-fn-index.gen.d.ts +3 -0
- package/dist/tools/move-fn-index.gen.js +1 -0
- package/dist/tools/registry/business.js +1 -1
- package/dist/tools/registry/config.js +1 -1
- package/dist/tools/registry/evaluation.js +1 -1
- package/dist/tools/registry/onchain.js +1 -1
- package/dist/tools/sanitize-output.d.ts +3 -0
- package/dist/tools/sanitize-output.js +1 -0
- package/dist/tools/sanitize-output.spec.d.ts +1 -0
- package/dist/tools/sanitize-output.spec.js +1 -0
- package/package.json +9 -4
- package/dist/knowledge/baselines/evaluation-baselines.json +0 -79
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
{
|
|
2
|
+
"comment": "Personal rule pack (R-PERSONAL) — declarative form of the retired in-code Personal risk rules. Facts are produced by the kernel extractor (personal-risk.ts, bound to the inherited registrar record caps and the sensitive-content heuristic); 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
|
+
"sensitive_hits_found": "True when the sensitive-content heuristic matched at least one information entry (phone / email / private key / mnemonic / secret-named).",
|
|
5
|
+
"sensitive_patterns_text": "Pre-rendered match list ('name=kind' entries joined by '; ') for the evidence text.",
|
|
6
|
+
"is_mark_destroy": "The caller is invoking the irreversible mark destroy operation.",
|
|
7
|
+
"has_referrer": "A referrer address is set (self-attested, unverified on-chain).",
|
|
8
|
+
"is_mark_transfer": "The caller is invoking the mark transfer operation (the source address loses the mark).",
|
|
9
|
+
"information_count": "Raw information record count, passed through for evidence text.",
|
|
10
|
+
"information_count_over_limit": "True when information_count is provided and meets or exceeds the inherited record-count cap.",
|
|
11
|
+
"expects_dedicated_move_struct": "The caller assumes a dedicated Personal Move struct exists (it does not — Personal composes Entity + Resource).",
|
|
12
|
+
"singleton_enforced": "True when the SDK enforces the one-record-per-account singleton invariant.",
|
|
13
|
+
"max_record_count_registrar": "KERNEL CONSTANT — record-count cap Personal inherits from the registrar entity layer.",
|
|
14
|
+
"max_record_length": "KERNEL CONSTANT — per-record length cap inherited from the registrar entity layer.",
|
|
15
|
+
"max_address_count": "KERNEL CONSTANT — address-list cap that applies via the entity layer.",
|
|
16
|
+
"max_tags_count": "KERNEL CONSTANT — tag cap that applies via the resource layer."
|
|
17
|
+
},
|
|
18
|
+
"rules": [
|
|
19
|
+
{
|
|
20
|
+
"rule_id": "R-PERSONAL-01",
|
|
21
|
+
"dimension": "semantic",
|
|
22
|
+
"trigger": "sensitive-content heuristic matched an information entry",
|
|
23
|
+
"cases": [
|
|
24
|
+
{
|
|
25
|
+
"when": { "field": "sensitive_hits_found", "op": "eq", "value": true },
|
|
26
|
+
"level": "high",
|
|
27
|
+
"title": "Sensitive information leakage — on-chain data is permanent",
|
|
28
|
+
"description": "information is stored via Entity.info_add as on-chain Records. The schema description warns 'NEVER: phone, address, private keys' but the Move layer does not validate content. Once a phone number, physical address, email, or private key is written on-chain, it is permanent and publicly readable — there is no delete (info_remove only removes the named entry from the user's record; the data remains in the transaction history).",
|
|
29
|
+
"scenario": "User adds information {name: 'phone', value: '+8613800000000'}; number is public forever",
|
|
30
|
+
"mitigation": "MCP schema description MUST warn. AI agents MUST re-confirm before adding any information entry. Business layer should run a sensitive-data regex (phone/email/private-key/mnemonic) and reject matches. Use the 'local' tool for private data.",
|
|
31
|
+
"evidence": "sensitive patterns: ${sensitive_patterns_text}",
|
|
32
|
+
"stakeholders": ["user"]
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"rule_id": "R-PERSONAL-02",
|
|
38
|
+
"dimension": "lifecycle",
|
|
39
|
+
"trigger": "mark destroy is being invoked",
|
|
40
|
+
"cases": [
|
|
41
|
+
{
|
|
42
|
+
"when": { "field": "is_mark_destroy", "op": "eq", "value": true },
|
|
43
|
+
"level": "medium",
|
|
44
|
+
"title": "mark destroy is irreversible — identity mark permanently lost",
|
|
45
|
+
"description": "The 'destroy' mark op permanently deletes the Resource object backing the user's identity mark. There is no archive, no event, and no rollback. After destroy, the user has no on-chain identity mark until they create a new one, and any external system keyed on the old Resource address breaks.",
|
|
46
|
+
"scenario": "User destroys their mark; downstream services keyed on the old Resource address fail",
|
|
47
|
+
"mitigation": "Require explicit confirmation before destroy. SDK should refuse destroy if any live consumer still references the mark. Provide a 'replace' alternative that swaps the underlying Resource without losing continuity.",
|
|
48
|
+
"evidence": "is_mark_destroy=true (irreversible)",
|
|
49
|
+
"stakeholders": ["user", "consumer"]
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"rule_id": "R-PERSONAL-03",
|
|
55
|
+
"dimension": "semantic",
|
|
56
|
+
"trigger": "a referrer address is set",
|
|
57
|
+
"cases": [
|
|
58
|
+
{
|
|
59
|
+
"when": { "field": "has_referrer", "op": "eq", "value": true },
|
|
60
|
+
"level": "medium",
|
|
61
|
+
"title": "referrer chain can be abused to fabricate trust signals",
|
|
62
|
+
"description": "When registering, a user may specify any referrer address. There is no on-chain verification that the referrer actually invited the user. A sybil attacker can register many accounts chained to a reputable address, fabricating an association to borrow trust. The Registrar records referrer but does not validate consent.",
|
|
63
|
+
"scenario": "Attacker registers 100 accounts all citing a reputable merchant as referrer",
|
|
64
|
+
"mitigation": "Business layer should treat referrer as a self-attested hint, not a verified trust signal. Audit referrer chains off-chain; require the referrer to co-sign if used for trust scoring.",
|
|
65
|
+
"evidence": "has_referrer=true (self-attested, unverified)",
|
|
66
|
+
"stakeholders": ["user", "consumer"]
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"rule_id": "R-PERSONAL-04",
|
|
72
|
+
"dimension": "structural",
|
|
73
|
+
"trigger": "information record count meets or exceeds the inherited cap",
|
|
74
|
+
"cases": [
|
|
75
|
+
{
|
|
76
|
+
"when": { "field": "information_count_over_limit", "op": "eq", "value": true },
|
|
77
|
+
"level": "low",
|
|
78
|
+
"title": "information inherits MAX_RECORD_COUNT_REGISTRAR=${max_record_count_registrar} — permissive",
|
|
79
|
+
"description": "Personal does not define its own record cap; it inherits Entity's MAX_RECORD_COUNT_REGISTRAR=${max_record_count_registrar} and MAX_RECORD_LENGTH=${max_record_length} per record. ${max_record_count_registrar} records per user is generous and can bloat on-chain storage if users add many entries. MAX_ADDRESS_COUNT=${max_address_count} and MAX_TAGS_COUNT=${max_tags_count} also apply via Entity/Resource.",
|
|
80
|
+
"scenario": "User adds 1000 information entries; Entity record storage is heavy and slow to read",
|
|
81
|
+
"mitigation": "Business layer should self-limit information count (e.g. ≤50). For bulk profile data, store off-chain and reference via a Repository or Proof.",
|
|
82
|
+
"evidence": "information_count=${information_count}, limit=${max_record_count_registrar}",
|
|
83
|
+
"stakeholders": ["user", "system"]
|
|
84
|
+
}
|
|
85
|
+
]
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"rule_id": "R-PERSONAL-05",
|
|
89
|
+
"dimension": "lifecycle",
|
|
90
|
+
"trigger": "mark transfer is being invoked",
|
|
91
|
+
"cases": [
|
|
92
|
+
{
|
|
93
|
+
"when": { "field": "is_mark_transfer", "op": "eq", "value": true },
|
|
94
|
+
"level": "medium",
|
|
95
|
+
"title": "mark transfer loses identity mark at the source address",
|
|
96
|
+
"description": "The 'transfer' mark op moves the Resource backing the identity mark to a new address. After transfer, the source address has no mark — any service that keyed identity on the source address loses the binding. There is no automatic forwarding stub left behind.",
|
|
97
|
+
"scenario": "User transfers mark to a new wallet; old-wallet-based logins all break",
|
|
98
|
+
"mitigation": "Surface a 'transfer will detach the mark from this address' warning. Consumers should track marks by Resource address, not by user address. Provide a migration window where both addresses are valid.",
|
|
99
|
+
"evidence": "is_mark_transfer=true (source loses mark)",
|
|
100
|
+
"stakeholders": ["user", "consumer"]
|
|
101
|
+
}
|
|
102
|
+
]
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"rule_id": "R-PERSONAL-06",
|
|
106
|
+
"dimension": "cross_object",
|
|
107
|
+
"trigger": "caller assumes a dedicated Personal Move struct",
|
|
108
|
+
"cases": [
|
|
109
|
+
{
|
|
110
|
+
"when": { "field": "expects_dedicated_move_struct", "op": "eq", "value": true },
|
|
111
|
+
"level": "low",
|
|
112
|
+
"title": "Personal has no dedicated Move struct — depends entirely on Entity + Resource",
|
|
113
|
+
"description": "Personal is an SDK-layer construct: there is no dedicated Move module. The SDK composes Entity (information/description) and Resource (mark) on behalf of the user. Any breaking change in Entity or Resource directly affects Personal. The MCP layer cannot fix Personal bugs without touching Entity/Resource.",
|
|
114
|
+
"scenario": "Entity schema changes; Personal.information silently breaks",
|
|
115
|
+
"mitigation": "Track Entity and Resource changelogs as first-order dependencies of Personal. Add integration tests that exercise Personal flows whenever Entity/Resource change.",
|
|
116
|
+
"evidence": "expects_dedicated_move_struct=true (none exists)",
|
|
117
|
+
"stakeholders": ["system"]
|
|
118
|
+
}
|
|
119
|
+
]
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"rule_id": "R-PERSONAL-07",
|
|
123
|
+
"dimension": "lifecycle",
|
|
124
|
+
"trigger": "singleton invariant not enforced by the SDK",
|
|
125
|
+
"cases": [
|
|
126
|
+
{
|
|
127
|
+
"when": { "field": "singleton_enforced", "op": "falsy" },
|
|
128
|
+
"level": "medium",
|
|
129
|
+
"title": "Singleton assumption — if violated, multiple Personal instances conflict",
|
|
130
|
+
"description": "Personal assumes each account has exactly one Entity record (and one Resource mark). The Move layer enforces this via the registration operation's idempotency (returns the existing Resource for already-registered users). But if the SDK ever bypasses registration and creates duplicates (e.g. via the forced re-registration path), downstream code that assumes a singleton would see inconsistent state.",
|
|
131
|
+
"scenario": "SDK calls the forced re-registration path; user now has two Resource marks",
|
|
132
|
+
"mitigation": "SDK MUST enforce the singleton invariant: refuse to call the forced re-registration path unless the user explicitly opts in. Document that forced re-registration invalidates the old Resource address.",
|
|
133
|
+
"evidence": "singleton_enforced=false (needs SDK guard)",
|
|
134
|
+
"stakeholders": ["user", "consumer"]
|
|
135
|
+
}
|
|
136
|
+
]
|
|
137
|
+
}
|
|
138
|
+
]
|
|
139
|
+
}
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
{
|
|
2
|
+
"comment": "Progress rule pack (R-PR) — declarative form of the retired in-code Progress risk rules. Facts are produced by the kernel extractor (progress-risk.ts, bound to the on-chain count limits and the Machine/Order/Repository cross-object semantics); 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. R-PR-5-01 ships disabled: its E_ORDER_NOT_MATCH check needs an Order query and is left to the confirmation layer (the retired in-code check was a no-op).",
|
|
3
|
+
"facts": {
|
|
4
|
+
"named_operator_addr_count": "Address count of the progress_namedOperator op's operator list.",
|
|
5
|
+
"named_operator_name": "The named_operator name targeted by the op (display form).",
|
|
6
|
+
"max_named_operator_address_count": "KERNEL CONSTANT — on-chain MAX_NAMED_OPERATOR_ADDRESS_COUNT bound imported from @wowok/wowok.",
|
|
7
|
+
"named_operator_addr_count_exceeded": "True when the op's address list exceeds MAX_NAMED_OPERATOR_ADDRESS_COUNT (E_MAX_NAMED_OPERATOR_ADDRESS_COUNT ahead).",
|
|
8
|
+
"named_operator_count_current": "Current named-operator namespace count on the Progress (0 when unknown).",
|
|
9
|
+
"max_named_operator_count": "KERNEL CONSTANT — on-chain MAX_NAMED_OPERATOR_COUNT bound imported from @wowok/wowok.",
|
|
10
|
+
"named_operator_count_at_limit": "True when an 'add' op lands on a Progress already at MAX_NAMED_OPERATOR_COUNT (E_MAX_NAMED_OPERATOR_COUNT ahead).",
|
|
11
|
+
"context_repo_current": "Current context repository count on the Progress (0 when unknown).",
|
|
12
|
+
"context_repo_add_count": "Repositories the op would add (0 for remove; the clear op is not a candidate).",
|
|
13
|
+
"context_repo_total": "Projected repository count after the op.",
|
|
14
|
+
"max_context_repository_count": "KERNEL CONSTANT — on-chain MAX_CONTEXT_REPOSITORY_COUNT bound imported from @wowok/wowok.",
|
|
15
|
+
"context_repo_count_exceeded": "True when the projected repository count exceeds MAX_CONTEXT_REPOSITORY_COUNT (E_MAX_CONTEXT_REPOSITORY_COUNT ahead).",
|
|
16
|
+
"named_operator_empty_name": "True when a non-remove named_operator op targets the empty-string name — the reserved OrderHolder namespace.",
|
|
17
|
+
"task_submit_blocked": "True when a task submission targets a Progress that already has a task bound (E_TASK_ALREADY_SET ahead).",
|
|
18
|
+
"current_task_display": "The currently bound task (Order) object id (display form).",
|
|
19
|
+
"operate_message_over_long": "True when operate.message exceeds the 1024-char common::LONG_NAME bound.",
|
|
20
|
+
"operate_message_length": "Length of operate.message in characters.",
|
|
21
|
+
"operate_op_invalid": "True when operate.op is set but not one of next/hold/unhold/adminUnhold.",
|
|
22
|
+
"operate_op": "The operate.op value (display form).",
|
|
23
|
+
"admin_unhold_op": "True when operate.op is 'adminUnhold' (224-permission force release).",
|
|
24
|
+
"operate_forward": "The forward name the operate op advances (display form).",
|
|
25
|
+
"operate_next_node_name": "The target node name of the operate op (display form).",
|
|
26
|
+
"forward_named_operator": "The namedOperator governing the forward being advanced (echo).",
|
|
27
|
+
"forward_named_op_bypass": "True when the forward advance rides the namedOperator short-circuit, skipping the 220-225 permission-index check.",
|
|
28
|
+
"forward_has_guard_display": "Echo of whether the forward carries a Guard (display form).",
|
|
29
|
+
"guard_passport_required": "True when the forward has a Guard but no permission index — a Passport is required for the advance (E_NEED_PASSPORT ahead).",
|
|
30
|
+
"machine_published_false": "True when the context explicitly marks the Machine as unpublished (strict false).",
|
|
31
|
+
"machine_name": "The Machine object id the Progress binds to (raw echo, display form).",
|
|
32
|
+
"machine_name_or_unknown": "The Machine object id, or '(unknown)' when absent (description display form).",
|
|
33
|
+
"forward_reaccomplish": "True when an operate targets a forward that is already accomplished (E_FORWARD_ALREADY_ACCOMPLISHED ahead).",
|
|
34
|
+
"unhold_non_holder": "True when an 'unhold' op is signed by an address other than the current holder (E_NOT_THE_HOLDER ahead).",
|
|
35
|
+
"holder_display": "The address currently holding the forward (display form).",
|
|
36
|
+
"signer_display": "The address signing the operate op (display form).",
|
|
37
|
+
"repository_add_op": "True when the context carries a repository 'add' op (creates object-linker tx bindings).",
|
|
38
|
+
"repo_add_count": "Number of repositories the 'add' op introduces.",
|
|
39
|
+
"heterogeneous_host_types": "True when the target object types span more than one distinct host type (≥2 entries).",
|
|
40
|
+
"unique_target_types_csv_space": "Distinct target host types, comma-space-joined (description display form).",
|
|
41
|
+
"unique_target_types_csv": "Distinct target host types, comma-joined (evidence display form).",
|
|
42
|
+
"orderless_operate": "True when an operate targets a Progress with no bound task (task=null) — order-holder advance/hold unavailable (E_ORDER_NOT_MATCH)."
|
|
43
|
+
},
|
|
44
|
+
"rules": [
|
|
45
|
+
{
|
|
46
|
+
"rule_id": "R-PR-1-01",
|
|
47
|
+
"dimension": "structural",
|
|
48
|
+
"trigger": "named_operator addresses count > MAX_NAMED_OPERATOR_ADDRESS_COUNT (80)",
|
|
49
|
+
"cases": [
|
|
50
|
+
{
|
|
51
|
+
"when": { "field": "named_operator_addr_count_exceeded", "op": "eq", "value": true },
|
|
52
|
+
"level": "high",
|
|
53
|
+
"title": "named_operator address count exceeds limit",
|
|
54
|
+
"description": "named_operator \"${named_operator_name}\" has ${named_operator_addr_count} addresses, exceeds MAX_NAMED_OPERATOR_ADDRESS_COUNT ${max_named_operator_address_count}. Move aborts with E_MAX_NAMED_OPERATOR_ADDRESS_COUNT.",
|
|
55
|
+
"scenario": "Adding > 80 addresses to a single named operator",
|
|
56
|
+
"mitigation": "Split into multiple named_operator names, or remove inactive addresses first",
|
|
57
|
+
"evidence": "addr_count=${named_operator_addr_count}",
|
|
58
|
+
"stakeholders": ["owner", "named_operator"]
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"rule_id": "R-PR-1-02",
|
|
64
|
+
"dimension": "structural",
|
|
65
|
+
"trigger": "Adding new named_operator would exceed MAX_NAMED_OPERATOR_COUNT (60)",
|
|
66
|
+
"cases": [
|
|
67
|
+
{
|
|
68
|
+
"when": { "field": "named_operator_count_at_limit", "op": "eq", "value": true },
|
|
69
|
+
"level": "high",
|
|
70
|
+
"title": "named_operator namespace count at limit",
|
|
71
|
+
"description": "Progress already has ${named_operator_count_current} named operators, at MAX_NAMED_OPERATOR_COUNT ${max_named_operator_count}. Adding a new name will abort with E_MAX_NAMED_OPERATOR_COUNT.",
|
|
72
|
+
"scenario": "Adding a 61st named_operator name to a full Progress",
|
|
73
|
+
"mitigation": "Use 'set' on an existing name (replace address list), or remove an unused name first",
|
|
74
|
+
"evidence": "named_operator_count=${named_operator_count_current}",
|
|
75
|
+
"stakeholders": ["owner"]
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"rule_id": "R-PR-1-03",
|
|
81
|
+
"dimension": "structural",
|
|
82
|
+
"trigger": "context_repository add would exceed MAX_CONTEXT_REPOSITORY_COUNT (30)",
|
|
83
|
+
"cases": [
|
|
84
|
+
{
|
|
85
|
+
"when": { "field": "context_repo_count_exceeded", "op": "eq", "value": true },
|
|
86
|
+
"level": "high",
|
|
87
|
+
"title": "context_repository count exceeds limit",
|
|
88
|
+
"description": "Progress has ${context_repo_current} repositories, adding ${context_repo_add_count} would total ${context_repo_total}, exceeds MAX_CONTEXT_REPOSITORY_COUNT ${max_context_repository_count}. Move aborts with E_MAX_CONTEXT_REPOSITORY_COUNT.",
|
|
89
|
+
"scenario": "Adding too many context repositories",
|
|
90
|
+
"mitigation": "Remove unused repositories first, or use repository 'set' to replace the list",
|
|
91
|
+
"evidence": "current=${context_repo_current}, add=${context_repo_add_count}",
|
|
92
|
+
"stakeholders": ["owner"]
|
|
93
|
+
}
|
|
94
|
+
]
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"rule_id": "R-PR-1-04",
|
|
98
|
+
"dimension": "structural",
|
|
99
|
+
"trigger": "named_operator name is empty string but is_order_holder_namespace=false",
|
|
100
|
+
"cases": [
|
|
101
|
+
{
|
|
102
|
+
"when": { "field": "named_operator_empty_name", "op": "eq", "value": true },
|
|
103
|
+
"level": "medium",
|
|
104
|
+
"title": "named_operator name is empty (OrderHolder namespace)",
|
|
105
|
+
"description": "progress_namedOperator.name=\"\" — empty string maps to the OrderHolder namespace (the reserved no-name operator slot). This is typically set automatically when an Order is created through the buy flow, not by direct user op. Manual manipulation may overwrite order-payer authorization.",
|
|
106
|
+
"scenario": "User manually setting the empty-name namespace",
|
|
107
|
+
"mitigation": "If intentional (e.g. an internal order-ownership call), confirm. Otherwise use a non-empty name.",
|
|
108
|
+
"evidence": "name=\"\"",
|
|
109
|
+
"stakeholders": ["owner", "named_operator"]
|
|
110
|
+
}
|
|
111
|
+
]
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"rule_id": "R-PR-2-01",
|
|
115
|
+
"dimension": "semantic",
|
|
116
|
+
"trigger": "task submission on a Progress that already has a task (E_TASK_ALREADY_SET)",
|
|
117
|
+
"cases": [
|
|
118
|
+
{
|
|
119
|
+
"when": { "field": "task_submit_blocked", "op": "eq", "value": true },
|
|
120
|
+
"level": "high",
|
|
121
|
+
"title": "Task already bound on this Progress (irreversible)",
|
|
122
|
+
"description": "Progress already has task=${current_task_display}. Task submission is one-time; Move aborts with E_TASK_ALREADY_SET. There is no way to change the task after first set.",
|
|
123
|
+
"scenario": "User tries to rebind Progress to a different Order",
|
|
124
|
+
"mitigation": "Create a new Progress through a new buy flow with the new Order; the old Progress is permanently bound",
|
|
125
|
+
"evidence": "current_task=${current_task_display}",
|
|
126
|
+
"stakeholders": ["owner", "submitter"]
|
|
127
|
+
}
|
|
128
|
+
]
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"rule_id": "R-PR-2-02",
|
|
132
|
+
"dimension": "semantic",
|
|
133
|
+
"trigger": "operate.message exceeds MAX_LONG_NAME_LENGTH (long-name constraint)",
|
|
134
|
+
"cases": [
|
|
135
|
+
{
|
|
136
|
+
"when": { "field": "operate_message_over_long", "op": "eq", "value": true },
|
|
137
|
+
"level": "medium",
|
|
138
|
+
"title": "operate.message exceeds long-name length",
|
|
139
|
+
"description": "operate.message length ${operate_message_length} exceeds MAX_LONG_NAME_LENGTH (1024). Move aborts in common::LONG_NAME check.",
|
|
140
|
+
"scenario": "Long deliverable message",
|
|
141
|
+
"mitigation": "Truncate message to ≤ 1024 chars; store full payload in a context Repository",
|
|
142
|
+
"evidence": "msg_len=${operate_message_length}",
|
|
143
|
+
"stakeholders": ["submitter"]
|
|
144
|
+
}
|
|
145
|
+
]
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"rule_id": "R-PR-2-03",
|
|
149
|
+
"dimension": "semantic",
|
|
150
|
+
"trigger": "operate.op is not a valid enum value (schema-enforced, defense-in-depth)",
|
|
151
|
+
"cases": [
|
|
152
|
+
{
|
|
153
|
+
"when": { "field": "operate_op_invalid", "op": "eq", "value": true },
|
|
154
|
+
"level": "high",
|
|
155
|
+
"title": "operate.op must be one of: next, hold, unhold, adminUnhold",
|
|
156
|
+
"description": "op enum selects the Move function: next=accomplish, hold=hold(bHold=true), unhold=hold(bHold=false), adminUnhold=unhold (224 permission).",
|
|
157
|
+
"scenario": "Schema validation bypassed or stale client",
|
|
158
|
+
"mitigation": "Use one of: next, hold, unhold, adminUnhold",
|
|
159
|
+
"evidence": "op=${operate_op}",
|
|
160
|
+
"stakeholders": ["submitter"]
|
|
161
|
+
}
|
|
162
|
+
]
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"rule_id": "R-PR-3-01",
|
|
166
|
+
"dimension": "permission",
|
|
167
|
+
"trigger": "op='adminUnhold' (224 permission) — force release bypassing holder check",
|
|
168
|
+
"cases": [
|
|
169
|
+
{
|
|
170
|
+
"when": { "field": "admin_unhold_op", "op": "eq", "value": true },
|
|
171
|
+
"level": "high",
|
|
172
|
+
"title": "adminUnhold bypasses holder check (broad blast radius)",
|
|
173
|
+
"description": "adminUnhold uses 224 permission to release a held forward WITHOUT verifying sender == holder. If 224 is granted too broadly, any 224-holder can release ANY held forward in this Progress.",
|
|
174
|
+
"scenario": "Admin force-releases a forward that the original holder still wanted held",
|
|
175
|
+
"mitigation": "1) Grant 224 only to dedicated recovery addresses. 2) Log every adminUnhold for audit. 3) Prefer normal unhold (holder self-release) when possible.",
|
|
176
|
+
"evidence": "adminUnhold=true, forward=${operate_forward}",
|
|
177
|
+
"stakeholders": ["owner", "named_operator", "submitter"],
|
|
178
|
+
"exposure": {
|
|
179
|
+
"loss_parties": [
|
|
180
|
+
{ "role": "buyer", "basis": "A hold is the objection brake on a disputed delivery; a forced release lets the workflow advance past it toward the terminal allocation despite the objection." }
|
|
181
|
+
],
|
|
182
|
+
"gain_paths": [
|
|
183
|
+
{
|
|
184
|
+
"role": "neutral",
|
|
185
|
+
"path": "A broad 224-grantee force-releases the blocking hold and the workflow proceeds to the allocation the hold was placed to stop.",
|
|
186
|
+
"viability": "conditional",
|
|
187
|
+
"gate": "Executes only when the 224 permission is granted beyond dedicated recovery addresses — the rule flags grant breadth, not an observed over-grant."
|
|
188
|
+
}
|
|
189
|
+
]
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
]
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
"rule_id": "R-PR-3-02",
|
|
196
|
+
"dimension": "permission",
|
|
197
|
+
"trigger": "namedOperator short-circuit bypasses 220-225 permission check",
|
|
198
|
+
"cases": [
|
|
199
|
+
{
|
|
200
|
+
"when": { "field": "forward_named_op_bypass", "op": "eq", "value": true },
|
|
201
|
+
"level": "medium",
|
|
202
|
+
"title": "Forward advance via named_operator short-circuits 220-225 check",
|
|
203
|
+
"description": "Forward \"${operate_forward}\" uses namedOperator=\"${forward_named_operator}\". Move's ASSERT_PERMISSION returns immediately if IsNamedOperator() succeeds, WITHOUT checking any permission index. Anyone in the named_operator list can advance this forward.",
|
|
204
|
+
"scenario": "Operator list too permissive (e.g. includes expired/compromised addresses)",
|
|
205
|
+
"mitigation": "1) Keep named_operator lists minimal. 2) Use namedOperator_remove to revoke access promptly. 3) For sensitive forwards, prefer Forward.permissionIndex (Some) for dual-check.",
|
|
206
|
+
"evidence": "named_operator=${forward_named_operator}",
|
|
207
|
+
"stakeholders": ["owner", "named_operator"]
|
|
208
|
+
}
|
|
209
|
+
]
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"rule_id": "R-PR-3-03",
|
|
213
|
+
"dimension": "permission",
|
|
214
|
+
"trigger": "Forward has guard (Some) — Passport required but not provided",
|
|
215
|
+
"cases": [
|
|
216
|
+
{
|
|
217
|
+
"when": { "field": "guard_passport_required", "op": "eq", "value": true },
|
|
218
|
+
"level": "high",
|
|
219
|
+
"title": "Forward guard requires Passport",
|
|
220
|
+
"description": "Forward \"${operate_forward}\" has a guard (Some). The advance asserts E_NEED_PASSPORT for guarded forwards when called without a passport. Use the passport-bearing advance path (progress-level or order-holder) instead.",
|
|
221
|
+
"scenario": "User calls next() on a guarded forward without passport",
|
|
222
|
+
"mitigation": "Submit via *_with_passport variant; ensure submission data is valid for the Guard",
|
|
223
|
+
"evidence": "forward=${operate_forward}, has_guard=${forward_has_guard_display}",
|
|
224
|
+
"stakeholders": ["submitter"]
|
|
225
|
+
}
|
|
226
|
+
]
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
"rule_id": "R-PR-4-01",
|
|
230
|
+
"dimension": "lifecycle",
|
|
231
|
+
"trigger": "Machine not published — Progress cannot be created",
|
|
232
|
+
"cases": [
|
|
233
|
+
{
|
|
234
|
+
"when": { "field": "machine_published_false", "op": "eq", "value": true },
|
|
235
|
+
"level": "critical",
|
|
236
|
+
"title": "Machine not published — Progress creation blocked",
|
|
237
|
+
"description": "Machine ${machine_name_or_unknown} is not published. Progress requires a published Machine (creation asserts the published state). All Progress ops will fail with E_MACHINE_NOT_MATCH or similar.",
|
|
238
|
+
"scenario": "User attempts to create Progress before Machine publish",
|
|
239
|
+
"mitigation": "Publish the Machine first (205 permission), then create Progress",
|
|
240
|
+
"evidence": "machine=${machine_name}, published=false",
|
|
241
|
+
"stakeholders": ["owner"]
|
|
242
|
+
}
|
|
243
|
+
]
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
"rule_id": "R-PR-4-02",
|
|
247
|
+
"dimension": "lifecycle",
|
|
248
|
+
"trigger": "operate on already-accomplished forward (E_FORWARD_ALREADY_ACCOMPLISHED)",
|
|
249
|
+
"cases": [
|
|
250
|
+
{
|
|
251
|
+
"when": { "field": "forward_reaccomplish", "op": "eq", "value": true },
|
|
252
|
+
"level": "medium",
|
|
253
|
+
"title": "Forward already accomplished — re-hold blocked",
|
|
254
|
+
"description": "Forward \"${operate_forward}\" to \"${operate_next_node_name}\" is already accomplished. Move aborts with E_FORWARD_ALREADY_ACCOMPLISHED on any re-hold attempt.",
|
|
255
|
+
"scenario": "User retries an already-completed forward (race condition or stale state)",
|
|
256
|
+
"mitigation": "Query Progress.current — if already past target, no action needed; if parallel session, use a different forward",
|
|
257
|
+
"evidence": "forward=${operate_forward}, accomplished=true",
|
|
258
|
+
"stakeholders": ["submitter"]
|
|
259
|
+
}
|
|
260
|
+
]
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
"rule_id": "R-PR-4-03",
|
|
264
|
+
"dimension": "lifecycle",
|
|
265
|
+
"trigger": "unhold by non-holder without 224 permission (E_NOT_THE_HOLDER)",
|
|
266
|
+
"cases": [
|
|
267
|
+
{
|
|
268
|
+
"when": { "field": "unhold_non_holder", "op": "eq", "value": true },
|
|
269
|
+
"level": "high",
|
|
270
|
+
"title": "unhold by non-holder — Move will abort E_NOT_THE_HOLDER",
|
|
271
|
+
"description": "Forward is held by ${holder_display}, but signer is ${signer_display}. Move aborts with E_NOT_THE_HOLDER unless signer has 224 permission (adminUnhold path).",
|
|
272
|
+
"scenario": "User other than holder tries to release a hold",
|
|
273
|
+
"mitigation": "1) Have the original holder call unhold. 2) If holder is unresponsive, use adminUnhold=true (requires 224).",
|
|
274
|
+
"evidence": "holder=${holder_display}, signer=${signer_display}",
|
|
275
|
+
"stakeholders": ["submitter"]
|
|
276
|
+
}
|
|
277
|
+
]
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
"rule_id": "R-PR-5-01",
|
|
281
|
+
"dimension": "cross_object",
|
|
282
|
+
"trigger": "order-holder advance called but progress.task != order address (E_ORDER_NOT_MATCH)",
|
|
283
|
+
"enabled": false,
|
|
284
|
+
"cases": [
|
|
285
|
+
{
|
|
286
|
+
"when": { "field": "always_true", "op": "eq", "value": false },
|
|
287
|
+
"level": "low",
|
|
288
|
+
"title": "order-holder advance without a matching bound Order (retired-inert)",
|
|
289
|
+
"description": "R-PR-5-01 is retired-inert in the factory pack (enabled=false): the E_ORDER_NOT_MATCH check needs an Order query that the pack-level context cannot perform, so it is left to the confirmation layer — mirroring the retired in-code check, which never fired. Re-enabling cannot make this case fire (its guard is unsatisfiable by design).",
|
|
290
|
+
"mitigation": "Full check requires querying Order — done at the confirmation layer."
|
|
291
|
+
}
|
|
292
|
+
]
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
"rule_id": "R-PR-5-02",
|
|
296
|
+
"dimension": "cross_object",
|
|
297
|
+
"trigger": "context repository add without object-linker tx binding check",
|
|
298
|
+
"cases": [
|
|
299
|
+
{
|
|
300
|
+
"when": { "field": "repository_add_op", "op": "eq", "value": true },
|
|
301
|
+
"level": "low",
|
|
302
|
+
"title": "Context repository add creates object-linker tx binding",
|
|
303
|
+
"description": "Adding ${repo_add_count} repository(ies) creates object-linker tx binding entries. If the Repository is later deleted through a disaffiliation transaction, cross-object queries that depend on it will return empty results without warning.",
|
|
304
|
+
"scenario": "Repository deleted while Progress still references it",
|
|
305
|
+
"mitigation": "Remove the context repository binding before deleting a Repository; audit object-linker bindings periodically",
|
|
306
|
+
"evidence": "add_count=${repo_add_count}",
|
|
307
|
+
"stakeholders": ["owner", "system"]
|
|
308
|
+
}
|
|
309
|
+
]
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
"rule_id": "R-PR-5-03",
|
|
313
|
+
"dimension": "cross_object",
|
|
314
|
+
"trigger": "Permission used by Progress is shared with other host objects",
|
|
315
|
+
"cases": [
|
|
316
|
+
{
|
|
317
|
+
"when": { "field": "heterogeneous_host_types", "op": "eq", "value": true },
|
|
318
|
+
"level": "medium",
|
|
319
|
+
"title": "Permission shared across heterogeneous host objects",
|
|
320
|
+
"description": "Single Permission applied to ${unique_target_types_csv_space}. Progress builtin indexes (220-225) have different semantics per host object; granting 221 (PROGRESS_NAMED_OPERATOR) to a non-Progress entity is meaningless.",
|
|
321
|
+
"scenario": "One Permission for both Progress and Machine",
|
|
322
|
+
"mitigation": "Use separate Permission objects per host object type",
|
|
323
|
+
"evidence": "types=${unique_target_types_csv}",
|
|
324
|
+
"stakeholders": ["owner"]
|
|
325
|
+
}
|
|
326
|
+
]
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
"rule_id": "R-PR-5-04",
|
|
330
|
+
"dimension": "cross_object",
|
|
331
|
+
"trigger": "Progress without bound Order (order=null) — order-holder advance/hold blocked",
|
|
332
|
+
"cases": [
|
|
333
|
+
{
|
|
334
|
+
"when": { "field": "orderless_operate", "op": "eq", "value": true },
|
|
335
|
+
"level": "medium",
|
|
336
|
+
"title": "operate without bound Order — order-holder advance/hold unavailable",
|
|
337
|
+
"description": "Progress has no bound task (task=null). The order-holder advance and hold paths require progress.task == order address (E_ORDER_NOT_MATCH). Use plain next()/hold() instead.",
|
|
338
|
+
"scenario": "User tries order variant on a task-less Progress",
|
|
339
|
+
"mitigation": "Use non-order next()/hold() variant, OR submit the task first to bind an Order",
|
|
340
|
+
"evidence": "task=null",
|
|
341
|
+
"stakeholders": ["submitter"]
|
|
342
|
+
}
|
|
343
|
+
]
|
|
344
|
+
}
|
|
345
|
+
]
|
|
346
|
+
}
|