@wowok/agent-mcp 3.4.1 → 3.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.build-stamp.json +5 -0
- package/dist/chain-semantics/composition-truth.js +1 -1
- package/dist/chain-semantics/eval-order.js +1 -1
- package/dist/chain-semantics/field-capability.js +1 -1
- package/dist/chain-semantics/freeze-map.js +1 -1
- package/dist/chain-semantics/fund-flow.js +1 -1
- package/dist/chain-semantics/guard-verbs.js +1 -1
- package/dist/chain-semantics/object-graph.js +1 -1
- package/dist/composition/audit.js +1 -1
- package/dist/composition/compile.d.ts +10 -3
- package/dist/composition/compile.js +1 -1
- package/dist/composition/emit-phases.d.ts +30 -2
- package/dist/composition/emit-phases.js +1 -1
- package/dist/composition/guard-fill.d.ts +8 -0
- package/dist/composition/guard-fill.js +1 -1
- package/dist/composition/inflight.js +1 -1
- package/dist/composition/input-normalize.js +1 -1
- package/dist/composition/materialize.d.ts +2 -0
- package/dist/composition/materialize.js +1 -1
- package/dist/composition/mode-gates.js +1 -1
- package/dist/composition/param-disclosure.js +1 -1
- package/dist/composition/plan-retry-ledger.d.ts +16 -0
- package/dist/composition/plan-retry-ledger.js +1 -1
- package/dist/composition/plan.d.ts +15 -1
- package/dist/composition/plan.js +1 -1
- package/dist/config/config-audit.spec.js +1 -1
- package/dist/config/judgment.d.ts +5 -0
- package/dist/config/judgment.js +1 -1
- package/dist/evaluation/builtins/arbitration-score.d.ts +1 -0
- package/dist/evaluation/builtins/arbitration-score.js +1 -1
- package/dist/evaluation/builtins/demand-match.js +1 -1
- package/dist/evaluation/builtins/graph-service.d.ts +8 -0
- package/dist/evaluation/builtins/graph-service.js +1 -1
- package/dist/evaluation/capability.d.ts +9 -0
- package/dist/evaluation/engine.js +1 -1
- package/dist/evaluation/extract.d.ts +9 -1
- package/dist/evaluation/extract.js +1 -1
- package/dist/evaluation/match-operation.js +1 -1
- package/dist/evaluation/match-policy.d.ts +5 -3
- package/dist/evaluation/match-policy.js +1 -1
- package/dist/evaluation/standards.d.ts +1 -0
- package/dist/evaluation/standards.js +1 -1
- package/dist/evaluation/structured-lines.js +1 -1
- package/dist/evaluation/types.d.ts +1 -0
- package/dist/extensions/capability.js +1 -1
- package/dist/extensions/industry-pack.js +1 -1
- package/dist/extensions/modes.js +1 -1
- package/dist/harness/recover.js +1 -1
- package/dist/index.js +1 -1
- package/dist/intent/types.d.ts +1 -1
- package/dist/intent/types.js +1 -1
- package/dist/knowledge/allocation-ledger.js +1 -1
- package/dist/knowledge/allocator-rail-verifier.d.ts +17 -1
- package/dist/knowledge/allocator-rail-verifier.js +1 -1
- package/dist/knowledge/arb-fund-facts.d.ts +7 -0
- package/dist/knowledge/arb-fund-facts.js +1 -1
- package/dist/knowledge/arbitration-rail-verifier.d.ts +35 -0
- package/dist/knowledge/arbitration-rail-verifier.js +1 -0
- package/dist/knowledge/arbitration-templates.js +1 -1
- package/dist/knowledge/audit-rules.d.ts +13 -1
- package/dist/knowledge/audit-rules.js +1 -1
- package/dist/knowledge/baselines/judgment-baselines.json +1 -0
- package/dist/knowledge/baselines/rules/guard.json +7 -6
- package/dist/knowledge/baselines/rules/progress.json +4 -4
- package/dist/knowledge/baselines/rules/reward.json +118 -3
- package/dist/knowledge/builtin-templates.d.ts +19 -2
- package/dist/knowledge/builtin-templates.js +1 -1
- package/dist/knowledge/chain-query-registry.d.ts +14 -0
- package/dist/knowledge/chain-query-registry.js +1 -0
- package/dist/knowledge/event-semantics.js +1 -1
- package/dist/knowledge/fee-param-bindings.d.ts +2 -0
- package/dist/knowledge/fee-param-bindings.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.d.ts +7 -0
- package/dist/knowledge/guard-binding-verifier.js +1 -1
- package/dist/knowledge/guard-bindings.js +1 -1
- package/dist/knowledge/guard-design-patterns.d.ts +1 -1
- package/dist/knowledge/guard-design-patterns.js +1 -1
- package/dist/knowledge/guard-field-cognition.js +1 -1
- package/dist/knowledge/guard-host-context.js +1 -1
- package/dist/knowledge/guard-lint.js +1 -1
- package/dist/knowledge/guard-node-gates.d.ts +3 -1
- package/dist/knowledge/guard-node-gates.js +1 -1
- package/dist/knowledge/guard-puzzle.js +1 -1
- package/dist/knowledge/guard-render.js +1 -1
- package/dist/knowledge/guard-risk.js +1 -1
- package/dist/knowledge/guard-templates.d.ts +2 -1
- package/dist/knowledge/guard-templates.js +1 -1
- package/dist/knowledge/guard-translation.js +1 -1
- package/dist/knowledge/index.d.ts +2 -0
- 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/knob-docs.js +1 -1
- package/dist/knowledge/param-schema.d.ts +1 -1
- package/dist/knowledge/param-schema.js +1 -1
- package/dist/knowledge/param-tiers.d.ts +2 -0
- package/dist/knowledge/param-tiers.js +1 -1
- package/dist/knowledge/path-oracle/products/food-delivery.js +1 -1
- package/dist/knowledge/pattern-resolutions.d.ts +2 -0
- package/dist/knowledge/pattern-resolutions.js +1 -1
- package/dist/knowledge/product-detail-source.d.ts +37 -0
- package/dist/knowledge/product-detail-source.js +1 -0
- package/dist/knowledge/product-doc-b5.d.ts +16 -0
- package/dist/knowledge/product-doc-b5.js +1 -0
- package/dist/knowledge/progress-ledger.js +1 -1
- package/dist/knowledge/projection.spec.js +1 -1
- package/dist/knowledge/publish-gate.d.ts +20 -0
- package/dist/knowledge/publish-gate.js +1 -0
- package/dist/knowledge/publish-readiness.d.ts +25 -0
- package/dist/knowledge/publish-readiness.js +1 -0
- package/dist/knowledge/publish-surface-contract.d.ts +16 -0
- package/dist/knowledge/publish-surface-contract.js +1 -0
- package/dist/knowledge/rail-exit-satisfiability.d.ts +25 -0
- package/dist/knowledge/rail-exit-satisfiability.js +1 -0
- package/dist/knowledge/reward-ledger.d.ts +1 -1
- package/dist/knowledge/reward-ledger.js +1 -1
- package/dist/knowledge/reward-risk.d.ts +1 -1
- package/dist/knowledge/reward-risk.js +1 -1
- package/dist/knowledge/scenario-modes.js +1 -1
- package/dist/knowledge/service-ledger.d.ts +3 -1
- package/dist/knowledge/service-ledger.js +1 -1
- package/dist/knowledge/template-loader.d.ts +41 -2
- package/dist/knowledge/template-loader.js +1 -1
- package/dist/knowledge/template-registry.js +1 -1
- package/dist/knowledge/template-scanner.d.ts +17 -0
- package/dist/knowledge/template-scanner.js +1 -1
- package/dist/knowledge/template-test-profiles.js +1 -1
- package/dist/knowledge/workflow-guidance.d.ts +4 -0
- package/dist/knowledge/workflow-guidance.js +1 -1
- package/dist/monitor/MonitorLoop.js +1 -1
- package/dist/monitor/normalize.d.ts +1 -1
- package/dist/monitor/normalize.js +1 -1
- package/dist/monitor/types.js +1 -1
- package/dist/participation/customer-interest.d.ts +4 -0
- package/dist/participation/customer-interest.js +1 -1
- package/dist/participation/game-context.js +1 -1
- package/dist/participation/node-action-advisor.d.ts +4 -0
- package/dist/participation/node-action-advisor.js +1 -1
- package/dist/participation/radar-core.js +1 -1
- package/dist/participation/time-window.d.ts +11 -0
- package/dist/participation/time-window.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.d.ts +28 -3
- package/dist/playbooks/service-build/merchant-guide.js +1 -1
- package/dist/playbooks/service-build/object-panorama.d.ts +4 -0
- 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/order.js +1 -1
- package/dist/safety/confirm-gate.js +1 -1
- package/dist/schema/benchmark-migration/index.d.ts +24 -0
- package/dist/schema/benchmark-migration/index.js +1 -1
- package/dist/schema/call/allocation.d.ts +11 -7
- package/dist/schema/call/allocation.js +1 -1
- package/dist/schema/call/arbitration.d.ts +4 -0
- package/dist/schema/call/arbitration.js +1 -1
- package/dist/schema/call/base.d.ts +28 -0
- package/dist/schema/call/base.js +1 -1
- package/dist/schema/call/bridge.d.ts +21 -0
- package/dist/schema/call/contact.d.ts +4 -0
- package/dist/schema/call/demand.d.ts +4 -0
- package/dist/schema/call/guard.d.ts +12 -0
- package/dist/schema/call/handler.d.ts +1 -0
- package/dist/schema/call/handler.js +1 -1
- package/dist/schema/call/machine.d.ts +16 -8
- package/dist/schema/call/normalize-error.d.ts +1 -0
- package/dist/schema/call/normalize-error.js +1 -0
- package/dist/schema/call/order.d.ts +7 -3
- package/dist/schema/call/order.js +1 -1
- package/dist/schema/call/payment.d.ts +7 -3
- package/dist/schema/call/permission.d.ts +4 -0
- package/dist/schema/call/personal.d.ts +4 -0
- package/dist/schema/call/progress.d.ts +4 -0
- package/dist/schema/call/progress.js +1 -1
- package/dist/schema/call/proof.d.ts +8 -0
- package/dist/schema/call/proof.js +1 -1
- package/dist/schema/call/receipt.js +1 -1
- package/dist/schema/call/repository.d.ts +4 -0
- package/dist/schema/call/reward.d.ts +6 -2
- package/dist/schema/call/reward.js +1 -1
- package/dist/schema/call/semantic.d.ts +2 -2
- package/dist/schema/call/semantic.js +1 -1
- package/dist/schema/call/service.d.ts +21 -7
- package/dist/schema/call/service.js +1 -1
- package/dist/schema/call/treasury.d.ts +10 -6
- package/dist/schema/common/index.js +1 -1
- package/dist/schema/envelope-unify.d.ts +1 -0
- package/dist/schema/envelope-unify.js +1 -1
- package/dist/schema/evaluation/index.d.ts +43 -0
- package/dist/schema/evaluation/index.js +1 -1
- package/dist/schema/goal/index.d.ts +14 -2
- package/dist/schema/goal/planning.d.ts +18 -0
- package/dist/schema/goal/planning.js +1 -1
- package/dist/schema/intent-radar/index.d.ts +12 -0
- package/dist/schema/intent-radar/index.js +1 -1
- package/dist/schema/keeper/index.d.ts +1 -0
- package/dist/schema/local/index.d.ts +10 -0
- package/dist/schema/local/index.js +1 -1
- package/dist/schema/local/wip.js +1 -1
- package/dist/schema/messenger/index.d.ts +1 -0
- package/dist/schema/messenger/index.js +1 -1
- package/dist/schema/operations.d.ts +98 -13
- package/dist/schema/operations.js +1 -1
- package/dist/schema/persona/index.d.ts +22 -0
- package/dist/schema/query/bi.d.ts +28 -2
- package/dist/schema/query/bi.js +1 -1
- package/dist/schema/query/index.d.ts +67 -61
- package/dist/schema/query/index.js +1 -1
- package/dist/schema/schema-version.js +1 -1
- package/dist/schema/workflow/index.js +1 -1
- package/dist/schema-query-impl/index.d.ts +1 -0
- package/dist/schema-query-impl/index.js +1 -1
- package/dist/schemas/account_operation.output.json +2 -1
- package/dist/schemas/benchmark_migration_operation.output.json +74 -0
- package/dist/schemas/benchmark_migration_operation.schema.json +33 -1
- package/dist/schemas/bridge_operation.output.json +2 -1
- package/dist/schemas/bridge_operation.schema.json +40 -0
- package/dist/schemas/evaluation_operation.output.json +96 -0
- package/dist/schemas/evaluation_operation.schema.json +39 -0
- package/dist/schemas/goal_operation.schema.json +32 -0
- package/dist/schemas/guard2file.schema.json +8 -0
- package/dist/schemas/index.json +1 -1
- package/dist/schemas/intent_radar.output.json +10 -2
- package/dist/schemas/intent_radar.schema.json +5 -1
- package/dist/schemas/keeper_operation.output.json +2 -1
- package/dist/schemas/local_cache_operation.output.json +2 -1
- package/dist/schemas/local_history_operation.output.json +2 -1
- package/dist/schemas/local_info_operation.output.json +2 -1
- package/dist/schemas/local_mark_operation.output.json +2 -1
- package/dist/schemas/local_mark_operation.schema.json +10 -1
- package/dist/schemas/machineNode2file.schema.json +8 -0
- package/dist/schemas/messenger_operation.output.json +2 -1
- package/dist/schemas/messenger_operation.schema.json +2 -1
- package/dist/schemas/monitor_events.output.json +2 -1
- package/dist/schemas/monitor_subscription.output.json +2 -1
- package/dist/schemas/onchain_events.output.json +206 -13
- package/dist/schemas/onchain_events.schema.json +16 -0
- package/dist/schemas/onchain_operations.output.json +22 -3
- package/dist/schemas/onchain_operations.schema.json +982 -327
- package/dist/schemas/onchain_operations_allocation.schema.json +20 -13
- package/dist/schemas/onchain_operations_arbitration.schema.json +9 -1
- package/dist/schemas/onchain_operations_contact.schema.json +8 -0
- package/dist/schemas/onchain_operations_demand.schema.json +8 -0
- package/dist/schemas/onchain_operations_gen_passport.schema.json +8 -0
- package/dist/schemas/onchain_operations_gen_proof.schema.json +8 -0
- package/dist/schemas/onchain_operations_guard.schema.json +655 -115
- package/dist/schemas/onchain_operations_machine.schema.json +11 -3
- package/dist/schemas/onchain_operations_order.schema.json +14 -11
- package/dist/schemas/onchain_operations_payment.schema.json +12 -9
- package/dist/schemas/onchain_operations_permission.schema.json +8 -0
- package/dist/schemas/onchain_operations_personal.schema.json +8 -0
- package/dist/schemas/onchain_operations_progress.schema.json +9 -1
- package/dist/schemas/onchain_operations_proof.schema.json +9 -1
- package/dist/schemas/onchain_operations_repository.schema.json +8 -0
- package/dist/schemas/onchain_operations_reward.schema.json +14 -11
- package/dist/schemas/onchain_operations_service.schema.json +25 -12
- package/dist/schemas/onchain_operations_treasury.schema.json +17 -19
- package/dist/schemas/onchain_table_data.output.json +52 -10
- package/dist/schemas/persona_operation.output.json +57 -0
- package/dist/schemas/persona_operation.schema.json +9 -0
- package/dist/schemas/query_toolkit.output.json +326 -23
- package/dist/schemas/query_toolkit.schema.json +18 -5
- package/dist/schemas/wip_file.output.json +2 -2
- package/dist/schemas/wip_file.schema.json +2 -2
- package/dist/schemas/workflow_operation.schema.json +1 -1
- package/dist/tools/error-catalog.d.ts +17 -0
- package/dist/tools/error-catalog.js +1 -0
- package/dist/tools/handlers/benchmark-migration.d.ts +29 -8
- package/dist/tools/handlers/benchmark-migration.js +1 -1
- package/dist/tools/handlers/config.js +1 -1
- package/dist/tools/handlers/entry-edge-recipe.d.ts +101 -0
- package/dist/tools/handlers/entry-edge-recipe.js +1 -0
- package/dist/tools/handlers/escrow-deficit.d.ts +10 -0
- package/dist/tools/handlers/escrow-deficit.js +1 -0
- package/dist/tools/handlers/evaluation.js +1 -1
- package/dist/tools/handlers/fund-rail-recipe.d.ts +10 -0
- package/dist/tools/handlers/fund-rail-recipe.js +1 -0
- package/dist/tools/handlers/intent-radar.js +1 -1
- package/dist/tools/handlers/local.js +1 -1
- package/dist/tools/handlers/mark-namespace.d.ts +30 -0
- package/dist/tools/handlers/mark-namespace.js +1 -0
- package/dist/tools/handlers/messenger.js +1 -1
- package/dist/tools/handlers/onchain-name-registration.d.ts +1 -0
- package/dist/tools/handlers/onchain-name-registration.js +1 -1
- package/dist/tools/handlers/onchain-name-registration.spec.js +1 -1
- package/dist/tools/handlers/onchain.d.ts +40 -1
- package/dist/tools/handlers/onchain.js +1 -1
- package/dist/tools/handlers/publish-binding-echo.d.ts +22 -0
- package/dist/tools/handlers/publish-binding-echo.js +1 -0
- package/dist/tools/handlers/query.d.ts +1 -1
- package/dist/tools/handlers/query.js +1 -1
- package/dist/tools/handlers/review-chain.d.ts +1 -0
- package/dist/tools/handlers/review-chain.js +1 -1
- package/dist/tools/handlers/schema-query.js +1 -1
- package/dist/tools/handlers/stale-build-check.d.ts +9 -0
- package/dist/tools/handlers/stale-build-check.js +1 -0
- package/dist/tools/handlers/submission-assembly.d.ts +55 -0
- package/dist/tools/handlers/submission-assembly.js +1 -0
- package/dist/tools/handlers/wip.js +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.js +1 -1
- package/dist/tools/move-fn-index.gen.js +1 -1
- package/dist/tools/publish-gate-state.d.ts +5 -0
- package/dist/tools/publish-gate-state.js +1 -0
- package/dist/tools/registry/business.js +1 -1
- package/dist/tools/registry/onchain.js +1 -1
- package/dist/tools/registry/query.js +1 -1
- package/dist/tools/retry.js +1 -1
- package/dist/tools/runtime-health.js +1 -1
- package/dist/tools/shared.js +1 -1
- package/dist/tools/upgrade-check.d.ts +1 -0
- package/dist/tools/upgrade-check.js +1 -1
- package/dist/tools/wip-verify-ledger.d.ts +2 -0
- package/dist/tools/wip-verify-ledger.js +1 -1
- package/dist/tools/wrap.d.ts +15 -1
- package/dist/tools/wrap.js +1 -1
- package/package.json +5 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MAX_INDEMNITY_MULTIPLE,TASK_BINDING_SLOT,declaresTaskBindingSlot}from'./onchain-constants.js';import{TWO_TX_RENEW_RECIPE}from'./protocol-facts.js';import{lintForwardAmbiguity,findLoopCycles}from'./machine-topology.js';import{isRenewalLoopEdge}from'../participation/radar-core.js';function numericAmount(a){if(typeof a==='number')return Number['isFinite'](a)?a:undefined;if(typeof a==='string'){const b=a['trim']();if(/^\d+$/['test'](b))return Number(b);}return undefined;}export{numericAmount};export function salesItemsOf(a){if(Array['isArray'](a?.['sales']))return a['sales'];if(Array['isArray'](a?.['sales']?.['sales']))return a['sales']['sales'];return[];}export function allocatorCountOf(a){const b=a?.['order_allocators'];if(Array['isArray'](b))return b['length'];if(Array['isArray'](b?.['allocators']))return b['allocators']['length'];return 0x0;}export function arbitrationRefsOf(b){const c=b?.['arbitrations'];if(Array['isArray'](c))return c['filter'](e=>typeof e==='string');if(Array['isArray'](c?.['objects']))return c['objects']['filter'](e=>typeof e==='string');return[];}export function compensationFundOf(a){if(a?.['compensation_fund_add']?.['balance']!=null)return a['compensation_fund_add']['balance'];if(a?.['compensation_fund']!=null)return a['compensation_fund'];return undefined;}export function serviceNameOf(a){if(typeof a?.['object']==='string')return a['object'];if(typeof a?.['object']?.['name']==='string'&&a['object']['name'])return a['object']['name'];if(typeof a?.['namedNew']?.['name']==='string'&&a['namedNew']['name'])return a['namedNew']['name'];return undefined;}export function typeParameterOf(a){if(typeof a?.['type_parameter']==='string'&&a['type_parameter'])return a['type_parameter'];if(typeof a?.['object']?.['type_parameter']==='string'&&a['object']['type_parameter'])return a['object']['type_parameter'];if(typeof a?.['namedNew']?.['type_parameter']==='string'&&a['namedNew']['type_parameter'])return a['namedNew']['type_parameter'];return undefined;}export const DISPUTE_FAMILY_NODE_REGEX=/(^|_)(disputed?|arbitration|arb)(_|$)/i;export const FUND_TERMINAL_NODE_REGEX=/^(refund|refunded|deposit_refunded|deposit_deducted|cancel|cancelled)$/i;export const ANTI_PATTERN_NODE_REGEX=new RegExp(DISPUTE_FAMILY_NODE_REGEX['source']+'|'+FUND_TERMINAL_NODE_REGEX['source'],'i');export const REMEDY_FAMILY_NODE_REGEX=/(revis|review|rework|refund|cancel|return|claim)/i;export function classifyLoopCycle(a,b){for(let c=0x0;c<a['length'];c++){if(isRenewalLoopEdge(a[c],a[(c+0x1)%a['length']]))return'renewal';}if(b==='review-loop')return'remedy';if(b==='paid-cycle')return'charge';if(a['some'](d=>REMEDY_FAMILY_NODE_REGEX['test'](d)))return'remedy';return'charge';}export function auditMachineNodes(a,b){const c=[],d=[];if(!Array['isArray'](a)||a['length']===0x0)return d['push']('pre_publish:\x20machine\x20node\x20set\x20unavailable\x20—\x20topology\x20not\x20verifiable;\x20'+'verify\x20via\x20machineNode2file\x20BEFORE\x20publish\x20(immutable\x20after\x20publish,\x20IMMUT-001)'),{'critical':c,'warnings':d};const e=a;for(const u of e){const v=typeof u?.['name']==='string'?u['name']:'';if(!v)continue;if(DISPUTE_FAMILY_NODE_REGEX['test'](v))c['push']('R-M1-11:\x20machine\x20node\x20\x22'+v+'\x22\x20models\x20dispute\x20flow\x20—\x20'+'disputes\x20must\x20route\x20via\x20the\x20separate\x20Arbitration\x20object\x20(off-Machine);\x20'+'rename\x20the\x20node\x20to\x20the\x20business\x20state\x20that\x20triggers\x20it.\x20'+'COMPLETE-FIX\x20CHECKLIST\x20(the\x20same\x20publish\x20pass\x20ALSO\x20blocks\x20on\x20—\x20clear\x20all\x20in\x20one\x20edit,\x20'+'F-RQD2-09):\x20(1)\x20every\x20terminal\x20node\x20needs\x20an\x20allocator\x20rail\x20whose\x20guard\x20anchors\x20to\x20it\x20'+'(R-ESCROW-LEAF);\x20(2)\x20a\x20bound\x20arbitration\x20must\x20NOT\x20share\x20the\x20service\x20Permission\x20'+'(R-ARB-SAME-CONTROLLER);\x20(3)\x20its\x20voting_guard\x20must\x20be\x20non-empty\x20(R-ARB-VOTE-LOCK).');else FUND_TERMINAL_NODE_REGEX['test'](v)&&d['push']('R-M1-11:\x20machine\x20node\x20\x22'+v+'\x22\x20uses\x20a\x20bare\x20fund-terminal\x20name\x20—\x20reaching\x20'+'it\x20moves\x20no\x20funds\x20by\x20itself.\x20This\x20is\x20legitimate\x20ONLY\x20when\x20a\x20refund\x20allocator\x20'+'rail\x27s\x20guard\x20anchors\x20to\x20this\x20node\x20(per-node\x20refund\x20tracks);\x20otherwise\x20rename\x20it\x20'+'to\x20the\x20business\x20state\x20(e.g.\x20cancel_requested\x20/\x20closed_cancel)\x20and\x20route\x20the\x20'+'refund\x20via\x20an\x20Allocator\x20triggered\x20by\x20that\x20state.\x20The\x20template\x20scanner\x20verifies\x20'+'the\x20anchoring\x20when\x20a\x20template\x20is\x20present.\x20Sibling\x20gates\x20in\x20the\x20SAME\x20publish\x20pass:\x20'+'R-ESCROW-LEAF\x20(terminal\x20without\x20anchored\x20rail),\x20R-ARB-SAME-CONTROLLER\x20/\x20R-ARB-VOTE-LOCK\x20'+'(bound\x20arbitration\x20config)\x20—\x20fix\x20all\x20at\x20once\x20to\x20avoid\x20extra\x20publish\x20rounds\x20(F-RQD2-09).');}const g=new Set();for(const w of e){const x=typeof w?.['name']==='string'?w['name']:'';if(!x)continue;g['has'](x)&&c['push']('MC-C-04:\x20duplicate\x20machine\x20node\x20name\x20\x22'+x+'\x22\x20—\x20on-chain\x20will\x20reject\x20the\x20publish\x20transaction'),g['add'](x);}const h=e['some'](y=>Array['isArray'](y?.['pairs'])&&y['pairs']['some'](z=>z?.['prev_node']===''));!h&&c['push']('Machine\x20has\x20no\x20entry\x20pair\x20(prev_node=\x22\x22)\x20—\x20Progress\x20can\x20never\x20advance\x20'+'from\x20the\x20initial\x20state;\x20orders\x20are\x20permanently\x20stuck');const i=new Map();for(const y of e){const z=typeof y?.['name']==='string'&&y['name']!==''?y['name']:'(unnamed\x20node)';for(const A of Array['isArray'](y?.['pairs'])?y['pairs']:[]){const B=A?.['prev_node'];if(typeof B!=='string')continue;const C=Array['isArray'](A?.['forwards'])?A['forwards']:[];for(const D of C){const E=typeof D==='string'?D:typeof D?.['name']==='string'?D['name']:'';if(E==='')continue;const F=B+'\x00'+E,G=i['get'](F);if(G===z)c['push']('H-09:\x20duplicate\x20machine\x20edge\x20(prev_node\x20\x22'+B+'\x22\x20->\x20forward\x20\x22'+E+'\x22)\x20re-declared\x20on\x20node\x20\x22'+z+'\x22\x20—\x20'+'partitioned\x20building\x20re-sends\x20are\x20APPEND-ONLY\x20on\x20the\x20draft\x20(sso-tn-261027:\x2017\x20entries\x20/\x2014\x20unique\x20names);\x20'+'the\x20chain\x20edge\x20lookup\x20takes\x20the\x20FIRST\x20match,\x20so\x20every\x20extra\x20copy\x20is\x20unreachable\x20dead\x20weight\x20that\x20ships\x20'+'the\x20draft\x27s\x20ghost\x20edges\x20into\x20an\x20immutable\x20machine\x20(IMMUT-001).\x20Drop\x20the\x20duplicate\x20pair\x20'+'(delete\x20it\x20on\x20the\x20still-unpublished\x20draft\x20machine)\x20before\x20publishing');else G===undefined&&i['set'](F,z);}}}const j=new Map();for(const H of e){const I=typeof H?.['name']==='string'?H['name']:'';if(!I)continue;if(!j['has'](I))j['set'](I,[]);for(const J of H?.['pairs']??[]){const K=J?.['prev_node'];if(typeof K==='string'&&K!==''){const L=j['get'](K);if(L)L['push'](I);else j['set'](K,[I]);}}}const k=findLoopCycles(j)['map'](M=>({'c':M,'tier':classifyLoopCycle(M['cycle'],b)})),l=k['filter'](M=>M['tier']==='renewal'),m=k['filter'](M=>M['tier']==='remedy'),o=k['filter'](M=>M['tier']==='charge');o['length']>0x0&&c['push']('pre_publish:\x20machine\x20contains\x20charge-bearing\x20loop\x20cycle(s)\x20'+o['map'](M=>'['+M['c']['cycle']['join']('\x20->\x20')+']')['join'](',\x20')+'\x20—\x20'+'on-chain\x20a\x20revisit\x20is\x20NOT\x20verified\x20to\x20re-fund\x20the\x20Allocation,\x20and\x20this\x20static\x20pass\x20sees\x20only\x20the\x20forward\x27s\x20guard\x20reference\x20'+'(never\x20the\x20guard\x20table),\x20so\x20a\x20per-revisit-fee\x20cycle\x20(retake\x20/\x20session-card\x20shape)\x20is\x20UNPROVABLE\x20here\x20even\x20though\x20the\x20'+'allocation.balance\x20Guard\x20query\x20(1051,\x20witness\x20OrderAllocation\x20109)\x20makes\x20the\x20fee\x20enforceable\x20at\x20the\x20guard\x20layer\x20'+'(zero-value\x20re-delivery\x20cycles,\x20test/11\x20R2-F3\x20/\x20crs\x20P2-3).\x20THREE\x20WAYS\x20OUT\x20—\x20'+'(1)\x20NO-CHARGE\x20revisit\x20(F-06,\x20ctra-mn\x20261019:\x20a\x20delivered->in_progress\x20revision\x20loop\x20is\x20business-correct\x20and\x20was\x20false-CRITICAL\x20here):\x20'+'declare\x20`reentry_kind:\x20\x22review-loop\x22`\x20on\x20this\x20publish\x20payload\x20(AP-3\x20—\x20machine-checkable,\x20no\x20renaming\x20needed)\x20'+'OR\x20rename\x20ANY\x20ONE\x20node\x20of\x20the\x20cycle\x20with\x20a\x20remedy\x20word\x20root\x20the\x20classifier\x20reads\x20—\x20revis*/review*/rework*/refund*/cancel*/return*/claim*\x20'+'(e.g.\x20\x27revising\x27\x20instead\x20of\x20\x27in_progress\x27)\x20—\x20and\x20the\x20cycle\x20reclassifies\x20as\x20remedy\x20tier\x20(warning,\x20not\x20a\x20blocker);\x20'+'(2)\x20GENUINELY\x20charge-bearing\x20with\x20neutral\x20names:\x20declare\x20`reentry_kind:\x20\x22paid-cycle\x22`\x20(keeps\x20this\x20block\x20—\x20'+'it\x20is\x20the\x20declaration\x20of\x20intent)\x20and\x20bind\x20the\x20fund-gate\x20Guard\x20on\x20the\x20loop\x20forward\x20'+'(constant\x20=\x20order\x20address,\x20convert_witness\x20OrderAllocation,\x20allocation.balance\x20>=\x20revisit\x20fee)\x20AND\x20publish\x20through\x20a\x20template\x20'+'carrying\x20that\x20convention\x20—\x20PRE-STATE\x20CONSTRAINT\x20(esound-mn-261021\x20B-1):\x20the\x20gate\x20reads\x20the\x20COMMITTED\x20pre-transaction\x20'+'balance,\x20so\x20the\x20revisit\x20funds\x20must\x20be\x20committed\x20in\x20a\x20PRIOR\x20transaction.\x20'+TWO_TX_RENEW_RECIPE+'\x20'+'Alternatively\x20replace\x20the\x20loop\x20with\x20per-period\x20NEW\x20Orders\x20(REUSE\x20pattern\x20—\x20a\x20fresh\x20order\x20per\x20period\x20instead\x20of\x20an\x20in-order\x20loop\x20that\x20replays\x20its\x20forwards\x20every\x20lap).\x20'+'(3)\x20A\x20funded\x20renewal\x20loop\x20(post-period\x20node\x20back\x20into\x20a\x20charging\x20node,\x20advanced\x20via\x20the\x20one-PTB\x20order_renew\x20call,\x20'+'NO\x20balance\x20gate\x20on\x20the\x20renew\x20forward\x20—\x20see\x20the\x20PRE-STATE\x20CONSTRAINT\x20above)\x20'+'is\x20the\x20only\x20sanctioned\x20charge-bearing\x20cycle\x20shape\x20for\x20in-order\x20renewals.');l['length']>0x0&&d['push']('pre_publish:\x20machine\x20contains\x20renewal\x20loop\x20cycle(s)\x20'+l['map'](M=>'['+M['c']['cycle']['join']('\x20->\x20')+']')['join'](',\x20')+'\x20—\x20on-chain\x20a\x20revisit\x20'+'is\x20NOT\x20verified\x20to\x20re-fund\x20the\x20Allocation.\x20Every\x20renewal/loop\x20forward\x20MUST\x20carry\x20the\x20new-period\x20'+'payment\x20into\x20the\x20order\x20escrow\x20(use\x20the\x20order\x20call\x27s\x20order_renew\x20field:\x20create\x20the\x20period\x20payment,\x20receive\x20it\x20into\x20the\x20'+'allocation,\x20and\x20advance\x20the\x20progress\x20—\x20all\x20in\x20one\x20transaction),\x20or\x20the\x20loop\x20allows\x20zero-value\x20'+'re-delivery\x20cycles\x20(test/11\x20R2-F3).\x20'+'PRE-STATE\x20CONSTRAINT\x20(esound-mn-261021\x20B-1,\x20mainnet-verified):\x20a\x20guard\x20on\x20the\x20renew\x20forward\x20reading\x20'+'allocation.balance\x20(query\x201051)\x20evaluates\x20the\x20COMMITTED\x20pre-transaction\x20balance\x20—\x20the\x20same-PTB\x20order_renew\x20'+'payment\x20is\x20INVISIBLE\x20to\x20it,\x20so\x20a\x20balance-gated\x20renew\x20forward\x20ALWAYS\x20aborts.\x20NEVER\x20bind\x20a\x20balance\x20gate\x20to\x20a\x20'+'forward\x20that\x20order_renew\x20advances\x20in\x20the\x20same\x20PTB.\x20'+TWO_TX_RENEW_RECIPE+'\x20'+'The\x20zero-value\x20protection\x20rides\x20this\x20routing\x20convention\x20(order_renew\x27s\x20amount).');m['length']>0x0&&d['push']('pre_publish:\x20machine\x20contains\x20remedy\x20loop\x20cycle(s)\x20'+m['map'](M=>'['+M['c']['cycle']['join']('\x20->\x20')+']')['join'](',\x20')+'\x20—\x20'+'a\x20same-order\x20revisit\x20(revision/review/rework/refund/cancel\x20family)\x20implies\x20NO\x20new\x20charge,\x20so\x20no\x20fund\x20gate\x20is\x20needed\x20on\x20it\x20'+'(the\x20allocation.balance\x20query\x20exists\x20but\x20is\x20irrelevant\x20here).\x20Visible\x20by\x20design\x20(crs\x20P2-3):\x20if\x20the\x20business\x20EVER\x20intends\x20'+'a\x20revisit\x20to\x20cost\x20money,\x20that\x20fee\x20IS\x20enforceable\x20via\x20the\x20balance\x20query\x20(1051)\x20—\x20but\x20that\x20reshapes\x20the\x20cycle\x20into\x20the\x20'+'charge\x20tier\x20above;\x20keep\x20remedy\x20revisits\x20free\x20or\x20restructure\x20as\x20per-period\x20NEW\x20Orders.');for(const M of e){const N=typeof M?.['name']==='string'?M['name']:'?';for(const O of M?.['pairs']??[]){for(const P of O?.['forwards']??[]){const Q=P?.['namedOperator']!==undefined&&P?.['namedOperator']!==null,R=P?.['permissionIndex']!==undefined&&P?.['permissionIndex']!==null,S=P?.['guard']!==undefined&&P?.['guard']!==null;!Q&&!R&&!S&&d['push']('pre_publish:\x20node\x20\x22'+N+'\x22\x20forward\x20\x22'+String(P?.['name']??'?')+'\x22\x20has\x20no\x20executor\x20binding\x20(namedOperator\x20/\x20permissionIndex\x20/\x20guard)\x20—\x20no\x20one\x20can\x20advance\x20it');}}}const q=computeTerminalReachability(a),r=new Map(),s=new Map();for(const T of e){for(const U of T?.['pairs']??[]){const V=U?.['prev_node'];if(typeof V!=='string'||V==='')continue;for(const W of U?.['forwards']??[]){const X=W?.['namedOperator']!=null&&String(W['namedOperator'])!==''?'operator:'+String(W['namedOperator']):W?.['permissionIndex']!=null?'permission:'+String(W['permissionIndex']):null;s['set'](V,(s['get'](V)??0x0)+0x1);if(X!=null){const Y=r['get'](V)??new Set();Y['add'](X),r['set'](V,Y);}}}}for(const [Z,a0]of r){(s['get'](Z)??0x0)>=0x1&&a0['size']===0x1&&d['push']('pre_publish:\x20LIVE-ACT-02\x20node\x20\x22'+Z+'\x22\x20—\x20every\x20outgoing\x20forward\x20binds\x20the\x20SAME\x20single\x20identity\x20('+[...a0]['join'](',\x20')+'):\x20'+'if\x20that\x20actor\x20goes\x20silent\x20the\x20order\x20LATCHES\x20here\x20and\x20the\x20escrow\x20freezes\x20—\x20there\x20is\x20no\x20counterparty\x20or\x20keeper\x20exit\x20'+'(alg26\x20261026\x20O9/O5\x20family:\x20changes_requested\x20with\x20only\x20a\x20contributor\x20resubmit\x20edge;\x20claimed\x20with\x20only\x20a\x20merchant\x20assign\x20edge).\x20'+'Design\x20the\x20exit\x20edge\x20NOW\x20(a\x20keeper\x20or\x20auto-close\x20forward\x20with\x20its\x20own\x20identity,\x20or\x20a\x20counterparty-signed\x20cancel/refund\x20edge)\x20—\x20'+'immutable\x20after\x20publish\x20(IMMUT-001).\x20If\x20single-operator-by-design,\x20this\x20warning\x20can\x20be\x20ignored');}const t=lintForwardAmbiguity(a,'pre_publish');return c['push'](...t['critical']),d['push'](...t['warnings']),q['unreachable']['length']>0x0&&d['push']('pre_publish:\x20unreachable\x20machine\x20node(s)\x20'+q['unreachable']['map'](a1=>'\x22'+a1+'\x22')['join'](',\x20')+'\x20—\x20'+'no\x20path\x20from\x20the\x20entry\x20pair\x20reaches\x20them;\x20dead\x20topology\x20is\x20frozen\x20at\x20publish\x20(IMMUT-001).\x20'+'Wire\x20them\x20into\x20the\x20flow\x20or\x20remove\x20them\x20before\x20publish'),{'critical':c,'warnings':d};}export function computeTerminalReachability(a){const b=[],c=[];if(!Array['isArray'](a)||a['length']===0x0)return{'terminals':b,'unreachable':c};const d=a,e=new Map(),f=[],g=[];for(const j of d){const k=typeof j?.['name']==='string'?j['name']:'';if(!k)continue;f['push'](k);if(!e['has'](k))e['set'](k,[]);let l=![];for(const m of j?.['pairs']??[]){const o=m?.['prev_node'];if(o==='')l=!![];else{if(typeof o==='string'&&o!==''&&o!==k){const q=e['get'](o);if(q)q['push'](k);else e['set'](o,[k]);}}}if(l)g['push'](k);}if(f['length']===0x0||g['length']===0x0)return{'terminals':b,'unreachable':c};const h=new Set(),i=[...g];while(i['length']>0x0){const r=i['pop']();if(h['has'](r))continue;h['add'](r);for(const s of e['get'](r)??[])i['push'](s);}for(const t of f){if(!h['has'](t))c['push'](t);else{if((e['get'](t)??[])['length']===0x0)b['push'](t);}}return{'terminals':b,'unreachable':c};}export const REVIEW_FAMILY_NODE_REGEX=/(^|_)(review|reviews|reviewed|reviewing|evaluated|evaluate|feedback|rating|rated)(_|$)/i;export function lintReviewLockedTerminals(a,b){const c=[],d=[];if(!Array['isArray'](a)||a['length']===0x0)return{'critical':c,'warnings':d};const e=a,h=u=>Array['isArray'](u?.['pairs'])?u['pairs']:Array['isArray'](u?.['value'])?u['value']:[],i=[],j=[],k=[];for(const u of e){const v=typeof u?.['name']==='string'?u['name']:'';if(!v)continue;j['push'](v);let w=![];for(const x of h(u)){const y=x,z=y?.['prev_node'];if(z==='')w=!![];const A=Array['isArray'](y?.['forwards'])?y['forwards']:[],B=[];for(const C of A){const D=C,E=D?.['guard'],F=typeof E==='string'&&E['trim']()!==''?E:E&&typeof E==='object'?E['guard']??E['$ref']:undefined;if(typeof F==='string'&&F['trim']()!=='')B['push'](F);}typeof z==='string'&&z!==''&&i['push']({'from':z,'to':v,'guardRefs':B});}if(w)k['push'](v);}if(j['length']===0x0||k['length']===0x0)return{'critical':c,'warnings':d};const l=computeTerminalReachability(a);if(l['terminals']['length']===0x0)return{'critical':c,'warnings':d};const m=G=>{if(G['guardRefs']['length']===0x0)return![];for(const H of G['guardRefs']){const I=b['get'](H['toLowerCase']());if(!I||I['length']===0x0)return![];const J=I['every'](K=>REVIEW_FAMILY_NODE_REGEX['test'](K));if(!J||I['includes'](G['from']))return![];}return!![];},o=G=>REVIEW_FAMILY_NODE_REGEX['test'](G),q=G=>{const H=new Map();for(const K of i){if(m(K))continue;if(G&&(o(K['from'])||o(K['to'])))continue;const L=H['get'](K['from']);if(L)L['push'](K['to']);else H['set'](K['from'],[K['to']]);}const I=new Set(),J=[...k];while(J['length']>0x0){const M=J['pop']();if(I['has'](M))continue;I['add'](M);for(const N of H['get'](M)??[])J['push'](N);}return I;},r=q(![]),s=q(!![]);for(const G of l['terminals']){if(!r['has'](G))c['push']('REVIEW-LOCK-01:\x20terminal\x20\x22'+G+'\x22\x20is\x20enterable\x20ONLY\x20through\x20forward(s)\x20whose\x20guard\x20pins\x20a\x20'+'review/feedback\x20node\x20the\x20edge\x20itself\x20does\x20not\x20depart\x20from\x20—\x20the\x20rail\x20can\x20never\x20fire\x20(the\x20guard\x20asserts\x20a\x20'+'progress\x20state\x20this\x20transition\x20cannot\x20produce),\x20so\x20a\x20buyer\x20who\x20never\x20reviews\x20strands\x20every\x20order\x27s\x20'+'escrow\x20permanently.\x20Machine\x20topology\x20is\x20immutable\x20after\x20publish\x20(IMMUT-001).\x20Fix\x20BEFORE\x20publish:\x20'+'re-pin\x20the\x20settlement\x20guard\x20to\x20the\x20node\x20the\x20forward\x20actually\x20departs\x20from,\x20and\x20add\x20a\x20time-lock\x20keeper\x20'+'auto-confirm\x20rail\x20(the\x20template\x20deliver_confirm_timeout\x20convention)\x20so\x20settlement\x20never\x20depends\x20on\x20the\x20'+'buyer\x20choosing\x20to\x20review');else!s['has'](G)&&d['push']('REVIEW-LOCK-01:\x20terminal\x20\x22'+G+'\x22\x20is\x20reachable\x20only\x20THROUGH\x20a\x20review/feedback\x20node\x20—\x20a\x20buyer\x20who\x20'+'silently\x20skips\x20reviewing\x20can\x20never\x20let\x20their\x20order\x20reach\x20it.\x20The\x20sanctioned\x20shape\x20keeps\x20the\x20review\x20'+'stop\x20OPTIONAL\x20with\x20an\x20exit\x20edge\x20back\x20to\x20the\x20settlement\x20rail,\x20and\x20a\x20keeper\x20time-lock\x20rail\x20that\x20opens\x20'+'settlement\x20independently\x20(retail\x20deliver_confirm_timeout\x20convention).\x20Verify\x20one\x20of\x20the\x20two\x20exists;\x20'+'if\x20the\x20review\x20node\x20is\x20meant\x20to\x20be\x20keeper-advanceable,\x20this\x20is\x20satisfied\x20and\x20may\x20be\x20ignored');}return{'critical':c,'warnings':d};}export function arbitrationVotingLockDetail(a){if(!Array['isArray'](a))return null;if(a['length']>0x0)return null;return'voting_guard\x20is\x20empty\x20(no\x20guard-weighted\x20voters).\x20Plain\x20votes\x20hard-require\x20the\x20vote\x20permission\x20(358)\x20on\x20the\x20'+'arbitration\x27s\x20own\x20Permission:\x20only\x20that\x20Permission\x27s\x20admin\x20(its\x20creator,\x20by\x20default)\x20and\x20explicit\x20358\x20'+'grantees\x20pass\x20the\x20assert,\x20so\x20without\x20grants\x20the\x20disputing\x20CUSTOMER\x20can\x20never\x20vote\x20and\x20the\x20arb\x20admin\x20is\x20the\x20'+'only\x20possible\x20voter\x20AND\x20the\x20judge\x20—\x20a\x20dispute\x20opened\x20against\x20this\x20service\x20dead-locks\x20when\x20that\x20admin\x20is\x20'+'unresponsive.\x20Configure\x20a\x20public\x20voting_guard\x20on\x20the\x20Arbitration\x20(voting_guard\x20op=\x27set\x27\x20with\x20guard\x20+\x20vote\x20'+'weight\x20—\x20the\x20field\x20stays\x20mutable\x20after\x20publish;\x20the\x20standard\x20shape\x20is\x20tpl_voting_guard_open_vote,\x20the\x20'+'always-true\x20guard\x20at\x20FixedValue\x20weight\x201)\x20or\x20bind\x20an\x20arbitration\x20that\x20already\x20carries\x20one,\x20BEFORE\x20'+'publishing\x20this\x20service';}const TIME_PROFILE_UNIT_MS={'ms':0x1,'msec':0x1,'msecs':0x1,'millisecond':0x1,'milliseconds':0x1,'s':0x3e8,'sec':0x3e8,'secs':0x3e8,'second':0x3e8,'seconds':0x3e8,'m':0xea60,'min':0xea60,'mins':0xea60,'minute':0xea60,'minutes':0xea60,'h':0x36ee80,'hr':0x36ee80,'hrs':0x36ee80,'hour':0x36ee80,'hours':0x36ee80,'d':0x5265c00,'day':0x5265c00,'days':0x5265c00,'w':0x240c8400,'wk':0x240c8400,'wks':0x240c8400,'week':0x240c8400,'weeks':0x240c8400},TIME_PROFILE_DURATION_REGEX=/(\d+(?:\.\d+)?)\s*(ms|milliseconds?|msecs?|minutes?|mins?|seconds?|secs?|hours?|hrs?|days?|weeks?|wks?|min|sec|hr|wk|[smhdw])\b/gi,TIME_PROFILE_ADMISSION_REGEX=/compress(?:ed|ion)|accelerat(?:ed|ion)|shorten(?:ed)?(?:\s+for)?|test\s+(?:value|window|duration|constant)|demo\s+(?:value|window|duration)|for\s+(?:fast\s+|quick\s+)?test(?:ing)?|regression\s+(?:value|window)/i,TIME_PROFILE_FLOOR_MS=0x36ee80;function timeProfileIsTimeQuery(a){if(typeof a==='number')return a===0x4f7||a===0x4f8||a===0x500||a===0x507;if(typeof a==='string')return/(^|\.)time$|current_time/i['test'](a);return![];}function timeProfileNodeChildren(a){const b=[];for(const c of['nodes','node','nodeLeft','nodeRight','parameters','historyIdx','sessionIdx','forwardIdx','where','find','recipient']){const d=a[c];if(Array['isArray'](d))b['push'](...d);else{if(d&&typeof d==='object')b['push'](d);}}return b;}export function guardTimeProfileDetail(a){const b=typeof a['description']==='string'?a['description']:'',c=TIME_PROFILE_ADMISSION_REGEX['test'](b);let d=0x0;for(const r of b['matchAll'](TIME_PROFILE_DURATION_REGEX)){const s=TIME_PROFILE_UNIT_MS[r[0x2]['toLowerCase']()];if(!s)continue;const t=Number(r[0x1])*s;if(Number['isFinite'](t)&&t>d)d=t;}if(!c&&d===0x0)return null;const e=Array['isArray'](a['table'])?a['table']:[],f=u=>{const v=e['find'](w=>Number(w?.['identifier'])===u);return numericAmount(v?.['value']);},h=u=>{if(!u||typeof u!=='object')return![];const v=u;if(v['type']==='context'&&v['context']==='Clock')return!![];if(v['type']==='query'&&timeProfileIsTimeQuery(v['query']))return!![];if(v['type']==='query_progress_history_time')return!![];if(v['type']==='query_progress_history_time_or_zero')return!![];return timeProfileNodeChildren(v)['some'](h);},i=u=>{const w=Number(u['identifier']),x=f(w);if(x===undefined||x<=0x0)return null;const y=e['find'](A=>Number(A?.['identifier'])===w),z=y&&typeof y['name']==='string'&&y['name']!==''?y['name']:null;return{'identifier':w,'name':z,'value':x};},j=u=>{if(!u||typeof u!=='object')return[];const v=u;if(v['type']==='identifier'){const w=i(v);return w?[w]:[];}return timeProfileNodeChildren(v)['flatMap'](j);},k=[],l=(u,v)=>{if(!u||typeof u!=='object')return;const w=u,x=v||typeof w['type']==='string'&&w['type']['startsWith']('calc_');if(x&&w['type']==='calc_number_multiply'){const y=j(w);y['length']>0x0&&k['push']({'identifier':y[0x0]['identifier'],'name':y['map'](z=>z['name']??'#'+z['identifier'])['join']('*'),'value':y['reduce']((z,A)=>z*A['value'],0x1)});return;}if(w['type']==='identifier'&&x){const z=i(w);if(z)k['push'](z);}for(const A of timeProfileNodeChildren(w))l(A,x);};if(a['root']&&typeof a['root']==='object'&&h(a['root']))l(a['root'],![]);const n=k['find'](u=>u['value']<d/0x64),o=u=>u>=0x5265c00?u/0x5265c00+'d':u>=0x36ee80?u/0x36ee80+'h':u>=0xea60?u/0xea60+'min':u/0x3e8+'s',p=u=>u['name']??'slot\x20#'+u['identifier'];if(n!==undefined)return{'level':'critical','detail':'time\x20constant\x20'+p(n)+'\x20=\x20'+o(n['value'])+'\x20is\x20>=100x\x20below\x20the\x20production\x20duration\x20the\x20description\x20itself\x20'+('declares\x20('+o(d)+')\x20—\x20a\x20compressed\x20test\x20value\x20frozen\x20into\x20a\x20production\x20guard.\x20Note:\x20operands\x20of\x20a\x20')+'calc_number_multiply\x20are\x20judged\x20as\x20their\x20PRODUCT\x20(a\x20duration\x20times\x20dimensionless\x20factors),\x20not\x20per-operand.\x20Guards\x20'+'freeze\x20at\x20publish\x20(IMMUT-001),\x20so\x20the\x20window\x20will\x20enforce\x20the\x20compressed\x20value\x20against\x20real\x20orders\x20'+'(klook\x20mainnet\x20261014:\x20\x2724h\x20free\x20cancellation\x27\x20enforced\x20as\x202\x20minutes).\x20Rebuild\x20the\x20guard\x20with\x20the\x20'+'production\x20duration\x20from\x20the\x20template\x20fee_params\x20BEFORE\x20publishing'};if(c)return{'level':'warning','detail':'description\x20admits\x20compressed/accelerated\x20time\x20constants,\x20but\x20NO\x20time\x20constant\x20in\x20this\x20guard\x27s\x20logic\x20'+'tree\x20is\x20>=100x\x20below\x20the\x20declared\x20production\x20duration\x20—\x20the\x20values\x20look\x20production-scaled.\x20Manual\x20'+'review\x20requested\x20(prose\x20alone\x20no\x20longer\x20blocks\x20publish,\x20BF-07):\x20confirm\x20the\x20tree\x20constants\x20match\x20the\x20'+'production\x20durations\x20in\x20the\x20template\x20fee_params\x20BEFORE\x20publishing\x20—\x20guards\x20freeze\x20at\x20publish\x20'+'(IMMUT-001),\x20so\x20a\x20mis-scaled\x20window\x20(klook\x20mainnet\x20261014:\x20\x2724h\x20free\x20cancellation\x27\x20enforced\x20as\x202\x20'+'minutes)\x20is\x20UNFIXABLE'};const q=k['find'](u=>u['value']<TIME_PROFILE_FLOOR_MS);if(q!==undefined)return{'level':'warning','detail':'time\x20constant\x20'+p(q)+'\x20=\x20'+o(q['value'])+'\x20is\x20below\x20the\x20'+TIME_PROFILE_FLOOR_MS/0x36ee80+'h\x20sanity\x20floor\x20'+'(the\x20description\x20declares\x20no\x20production\x20duration\x20and\x20admits\x20no\x20compression,\x20yet\x20the\x20window\x20is\x20'+'sub-hour)\x20—\x20almost\x20always\x20a\x20compressed\x20test\x20value\x20frozen\x20into\x20the\x20guard.\x20Guards\x20freeze\x20at\x20publish\x20'+'(IMMUT-001):\x20confirm\x20the\x20value\x20is\x20intended\x20for\x20LIVE\x20traffic,\x20or\x20rebuild\x20with\x20the\x20production\x20'+'duration\x20from\x20the\x20template\x20fee_params\x20BEFORE\x20mainnet\x20publish\x20(ddmc2\x20F-11:\x20a\x203-minute\x20filing\x20'+'window\x20permanently\x20revoked\x20a\x20buyer\x27s\x20dispute\x20right\x20on\x20one\x20transport\x20retry)'};return null;}export function rewardRefsOf(a){const b=a?.['rewards'];if(typeof b==='string'&&b['trim']()!=='')return[b];if(Array['isArray'](b))return b['filter'](c=>typeof c==='string'&&c['trim']()!=='');if(Array['isArray'](b?.['objects']))return b['objects']['filter'](c=>typeof c==='string'&&c['trim']()!=='');return[];}export function serviceRewardsUnfundedDetail(b){if(!b||typeof b!=='object')return null;const c=b['data']??b,d=Array['isArray'](c?.['guards'])?c['guards']:[],e=numericAmount(c?.['balance']?.['value']??c?.['balance']);if(e===undefined)return null;let f=0x0;for(const h of d){const i=h?.['amount'];if(i?.['type']!==0x1)continue;const j=numericAmount(i?.['value']?.['value']??i?.['value']);if(j!==undefined&&j>f)f=j;}if(f===0x0)return null;if(e>=f)return null;return'reward\x20pool\x20balance\x20'+e+'\x20cannot\x20cover\x20its\x20largest\x20single-claim\x20promise\x20('+f+').\x20'+'The\x20on-chain\x20publish\x20entry\x20does\x20NOT\x20verify\x20reward\x20funding\x20—\x20a\x20failed\x20reward_fund\x20transfer\x20still\x20'+'publishes\x20(onlyfans\x20mainnet\x20261014\x20shipped\x20a\x20store\x20promising\x20cashback\x20with\x20an\x20empty\x20pool),\x20and\x20the\x20'+'claim\x20aborts\x20once\x20the\x20pool\x20drains.\x20Fund\x20the\x20Reward\x20(reward_fund)\x20up\x20to\x20expected_orders\x20x\x20per-claim\x20'+'amount,\x20or\x20remove\x20the\x20reward\x20binding\x20BEFORE\x20publishing\x20this\x20service';}export const TASK_BINDING_REMEDIATION_ENTRY={'identifier':TASK_BINDING_SLOT,'b_submission':!![],'value_type':'Address','name':'task_binding\x20order\x20anchor\x20(protocol\x20slot\x20254;\x20written\x20by\x20order\x20creation)'};const TASK_BINDING_TRIGGER='the\x20triggering\x20Passport\x20must\x20submit\x20identifier\x20'+TASK_BINDING_SLOT+'\x20carrying\x20the\x20Order\x20address';export{declaresTaskBindingSlot};export const REFUND_RAIL_NODE_REGEX=/(^|_)(refund|refunded|cancel|cancelled|return|returned)(_|$)/i;export function lintTaskBindingAdvisories(a){const b=[];if(!Array['isArray'](a['table']))return b;const c=declaresTaskBindingSlot(a['table']),d=a['guardRef']!==undefined?'\x22'+a['guardRef']+'\x22':'this\x20guard';if(a['refundReentry']===!![]&&c)return b['push']({'code':'TASKBIND-254-REFUND-REPLAY','level':'warning','detail':'refund\x20rail\x20guard\x20'+d+'\x20declares\x20protocol\x20slot\x20'+TASK_BINDING_SLOT+'\x20(b_submission:\x20true).\x20'+(TASK_BINDING_SLOT+'\x20is\x20the\x20ONCE_FOR_OBJECT\x20task-binding\x20slot:\x20a\x20refund\x20rail\x20that\x20can\x20re-enter\x20its\x20')+'refund\x20node\x20in\x20a\x20later\x20period\x20(deposit\x20re-refund,\x20re-selected\x20order,\x20renewal\x20cycle)\x20re-fires\x20on\x20the\x20'+'SAME\x20order\x20and\x20aborts\x20E_ONCE_TRIGGERED\x20(code\x2016)\x20on\x20every\x20release\x20after\x20the\x20first\x20—\x20a\x20perpetual\x20'+('abort,\x20not\x20a\x20one-time\x20failure\x20(OFN\x20#P-04).\x20Remove\x20the\x20'+TASK_BINDING_SLOT+'\x20row\x20and\x20anchor\x20the\x20payee\x20')+'on\x20a\x20user\x20submission\x20slot\x20(slot\x200,\x20the\x20submitted\x20Order)\x20instead.\x20Guards\x20are\x20create-frozen\x20and\x20'+'order_allocators\x20freeze\x20at\x20service\x20publish\x20—\x20correct\x20it\x20BEFORE\x20the\x20irreversible\x20write.','remediation':{'entry':TASK_BINDING_REMEDIATION_ENTRY,'trigger':'delete\x20the\x20254\x20row;\x20pay\x20the\x20refund\x20through\x20a\x20user\x20slot\x20(slot\x200)\x20that\x20the\x20trigger\x20Passport\x20submits\x20'+'with\x20the\x20Order\x20address'}}),b;return a['allocatorBound']===!![]&&!c&&b['push']({'code':'TASKBIND-254-MISSING','level':'warning','detail':'allocator-bound\x20hand-composed\x20guard\x20'+d+'\x20declares\x20no\x20{identifier:\x20'+TASK_BINDING_SLOT+',\x20'+'b_submission:\x20true,\x20value_type:\x20\x22Address\x22}\x20row.\x20The\x20passport\x20only\x20emits\x20DECLARED\x20slots,\x20so\x20once\x20an\x20'+'order-bound\x20path\x20uses\x20this\x20guard\x20every\x20guarded\x20forward\x20aborts\x20(code\x2011)\x20—\x20and\x20a\x20NEW\x20buyer\x27s\x20first\x20'+'order\x20is\x20the\x20one\x20that\x20hits\x20the\x20254\x20placeholder\x20immediately.\x20Add\x20the\x20row\x20below;\x20the\x20trigger\x20Passport\x20'+('must\x20submit\x20identifier\x20'+TASK_BINDING_SLOT+'\x20(the\x20Order\x20address).\x20Guards\x20are\x20create-frozen\x20and\x20machine\x20')+'topology\x20/\x20order_allocators\x20freeze\x20at\x20publish\x20—\x20correct\x20it\x20BEFORE\x20the\x20irreversible\x20write.','remediation':{'entry':TASK_BINDING_REMEDIATION_ENTRY,'trigger':TASK_BINDING_TRIGGER}}),b;}export function lintMachineTaskBindingPreflight(a){if(!Array['isArray'](a['refs'])||a['refs']['length']===0x0)return[];if(a['resolved']['some'](f=>declaresTaskBindingSlot(f['table'])))return[];const b=new Set(a['resolved']['map'](f=>f['ref']['toLowerCase']())),c=a['refs']['filter'](f=>!b['has'](f['toLowerCase']())),d='NONE\x20of\x20this\x20machine\x27s\x20'+a['refs']['length']+'\x20forward\x20guard(s)\x20declares\x20the\x20protocol\x20slot\x20'+(TASK_BINDING_SLOT+'\x20Address\x20submission\x20row.\x20A\x20settlement/claim\x20guard\x20shared\x20with\x20an\x20allocator\x20rail,\x20and\x20every\x20')+'order-bound\x20forward,\x20will\x20abort\x20(code\x2011)\x20once\x20a\x20Service\x20attaches\x20—\x20a\x20new\x20buyer\x27s\x20first\x20order\x20hits\x20the\x20'+'placeholder\x20immediately.',e=a['readError']!==undefined?'the\x20forward-guard\x20definitions\x20could\x20not\x20be\x20read\x20('+a['readError']+'),\x20so\x20the\x20'+TASK_BINDING_SLOT+'\x20'+('declaration\x20is\x20UNVERIFIED.\x20Verify\x20'+d+'\x20Add\x20{identifier:\x20'+TASK_BINDING_SLOT+',\x20b_submission:\x20true,\x20')+'value_type:\x20\x22Address\x22}\x20to\x20each\x20guard\x20BEFORE\x20publish;\x20machine\x20topology\x20is\x20immutable\x20after\x20publish\x20and\x20'+'guards\x20are\x20create-frozen.':d+(c['length']>0x0?'\x20'+c['length']+'\x20ref(s)\x20could\x20not\x20be\x20resolved\x20by\x20this\x20read\x20('+c['join'](',\x20')+')\x20—\x20'+'their\x20declarations\x20are\x20unverified.':'')+('\x20Add\x20{identifier:\x20'+TASK_BINDING_SLOT+',\x20b_submission:\x20true,\x20value_type:\x20\x22Address\x22}\x20to\x20each\x20guard\x27s\x20table\x20')+'BEFORE\x20publish;\x20machine\x20topology\x20is\x20immutable\x20after\x20publish\x20(IMMUT-001)\x20and\x20guards\x20are\x20create-frozen.';return[{'code':a['readError']!==undefined?'TASKBIND-254-UNVERIFIED':'TASKBIND-254-MISSING','level':'warning','detail':e,'remediation':{'entry':TASK_BINDING_REMEDIATION_ENTRY,'trigger':TASK_BINDING_TRIGGER}}];}export function formatTaskBindingAdvisory(a,b='pre_publish'){return b+':\x20task-binding\x20advisory\x20['+a['code']+']\x20'+a['detail'];}export const AUDIT_RULES=[{'id':'audit_machine_bound','description':'Service\x20should\x20have\x20a\x20Machine\x20workflow\x20bound\x20before\x20publish','severity':'warning','fields':['machine'],'check':(a,b)=>{if(!a?.['publish'])return!![];return!!a?.['machine'];},'message':()=>'Publishing\x20a\x20service\x20without\x20a\x20Machine\x20workflow.\x20Customers\x20won\x27t\x20have\x20a\x20structured\x20order\x20process.','recommendation':'Create\x20a\x20Machine\x20(workflow\x20template)\x20and\x20bind\x20it\x20to\x20the\x20service\x20before\x20publishing.\x20The\x20machine\x20field\x20becomes\x20IMMUTABLE\x20after\x20publish.'},{'id':'audit_order_allocators','description':'Service\x20should\x20have\x20order_allocators\x20for\x20fund\x20distribution','severity':'warning','fields':['order_allocators'],'check':a=>{if(!a?.['publish'])return!![];return allocatorCountOf(a)>0x0;},'message':()=>'Publishing\x20a\x20service\x20without\x20order_allocators.\x20Order\x20funds\x20cannot\x20be\x20auto-distributed\x20to\x20suppliers.','recommendation':'Configure\x20order_allocators\x20before\x20publishing\x20—\x20this\x20field\x20becomes\x20IMMUTABLE\x20after\x20publish.'},{'id':'audit_buy_guard','description':'Service\x20should\x20have\x20a\x20buy_guard\x20for\x20customer\x20screening','severity':'info','fields':['buy_guard'],'check':a=>!!a?.['buy_guard'],'message':()=>'No\x20buy_guard\x20configured\x20—\x20anyone\x20can\x20purchase\x20this\x20service\x20without\x20verification.','recommendation':'Consider\x20adding\x20a\x20Guard\x20to\x20verify\x20customer\x20eligibility\x20(e.g.,\x20identity,\x20wallet\x20balance,\x20location).'},{'id':'audit_arb_alloc_boundary','description':'Arbitration\x20and\x20Allocator\x20coexist\x20→\x20surface\x20the\x20two-system\x20boundary\x20reminder','severity':'warning','fields':['arbitrations','compensation_fund_add','compensation_fund','order_allocators'],'check':a=>{if(!a?.['publish'])return!![];const b=arbitrationRefsOf(a)['length']>0x0||compensationFundOf(a)!==undefined;return!(b&&allocatorCountOf(a)>0x0);},'message':()=>'Arbitration\x20and\x20Allocator\x20are\x20INDEPENDENT\x20systems\x20by\x20design:\x20a\x20ruling\x20records\x20the\x20case\x20and\x20pays\x20from\x20the\x20service\x20compensation\x20fund\x20—\x20it\x20never\x20moves\x20escrow\x20and\x20never\x20advances\x20the\x20workflow.\x20Two-rail\x20independence\x20(decision\x2011):\x20the\x20escrow\x20refund\x20and\x20the\x20arbitration\x20award\x20are\x20separate\x20commercial\x20payouts\x20on\x20independent\x20tracks\x20—\x20a\x20buyer\x20MAY\x20collect\x20BOTH,\x20which\x20is\x20legal\x20and\x20disclosed\x20at\x20the\x20MCP\x20dual-payout\x20confirmation\x20gate.\x20This\x20is\x20a\x20boundary\x20reminder,\x20not\x20a\x20defect.','recommendation':'Keep\x20the\x20refund/settlement\x20rail\x20NODE-gated\x20(terminal\x20refund/settle\x20node)\x20and\x20free\x20of\x20any\x20order.claimed_by\x20leg\x20(decision\x2011:\x20RAIL_CLAIMED_BY_LEG\x20/\x20R-FUND-RAIL-CLAIMED-BY\x20critical\x20backstop).\x20Disclose\x20the\x20refund+award\x20overlap\x20at\x20the\x20dual-payout\x20confirmation\x20gate\x20instead\x20of\x20engineering\x20a\x20mutual\x20exclusion.\x20Do\x20NOT\x20couple\x20the\x20systems\x20the\x20other\x20way\x20(no\x20dispute\x20state\x20on\x20the\x20order\x20flow,\x20no\x20workflow\x20step\x20into\x20arbitration).\x20For\x20per-case\x20fund\x20actions,\x20the\x20deposit-reimbursement\x20pattern\x20(guard-design\x20patterns)\x20is\x20the\x20supported\x20route.'},{'id':'audit_compensation_fund','description':'Service\x20should\x20have\x20a\x20compensation_fund\x20for\x20trust','severity':'warning','fields':['compensation_fund_add','compensation_fund'],'check':a=>compensationFundOf(a)!==undefined,'message':()=>'No\x20compensation_fund\x20configured.\x20Customers\x20have\x20no\x20financial\x20protection\x20if\x20you\x20fail\x20to\x20deliver.','recommendation':'Deposit\x20via\x20compensation_fund_add\x20{balance}\x20to\x20enable\x20arbitration\x20payouts.\x20The\x20fund\x20deters\x20fraud\x20and\x20enables\x20arbitration\x20claims.'},{'id':'audit_arbitrations','description':'Service\x20should\x20have\x20arbitration\x20options\x20for\x20dispute\x20resolution','severity':'info','fields':['arbitrations'],'check':a=>arbitrationRefsOf(a)['length']>0x0,'message':()=>'No\x20arbitration\x20configured.\x20Disputes\x20cannot\x20be\x20resolved\x20through\x20a\x20third\x20party.','recommendation':'Add\x20at\x20least\x20one\x20Arbitration\x20object\x20via\x20arbitrations:{op:\x27add\x27,\x20objects:[...]}\x20to\x20enable\x20on-chain\x20dispute\x20resolution.'},{'id':'audit_arbitration_removal_strands_awards','description':'Removing\x20an\x20authorized\x20venue\x20can\x20strand\x20an\x20award\x20it\x20already\x20ruled\x20on','severity':'error','fields':['arbitrations'],'check':a=>{const b=a?.['arbitrations']?.['remove']??a?.['arbitrations']?.['clear'],c=Array['isArray'](b)?b['length']>0x0:a?.['arbitrations']?.['op']==='clear';if(!c)return!![];if(arbitrationRefsOf(a)['length']>0x0)return!![];return compensationFundOf(a)===undefined;},'message':a=>{const b=a?.['arbitrations']?.['clear']?'every\x20authorized\x20venue':'venue(s)\x20'+(a?.['arbitrations']?.['remove']??[])['join'](',\x20');return'Removing\x20'+b+'\x20while\x20a\x20compensation\x20fund\x20is\x20configured\x20makes\x20any\x20award\x20it\x20already\x20ruled\x20on\x20UNPAYABLE:\x20an\x20on-chain\x20payout\x20now\x20requires\x20the\x20deciding\x20venue\x20to\x20still\x20be\x20on\x20the\x20Service\x27s\x20allowlist,\x20so\x20paying\x20out\x20aborts\x20with\x20E_ARBITRATION_NOT_ALLOWED=39\x20and\x20the\x20escrowed\x20funds\x20stay\x20stranded.';},'recommendation':'Before\x20removing\x20a\x20venue,\x20confirm\x20no\x20case\x20it\x20ruled\x20on\x20is\x20still\x20awaiting\x20compensation\x20payout\x20(query\x20the\x20Arb\x20objects\x20for\x20status\x20Arbitrated,\x20not\x20Finished).\x20Add\x20the\x20replacement\x20venue\x20FIRST,\x20drain\x20the\x20old\x20venue\x27s\x20cases,\x20and\x20only\x20then\x20remove\x20it.\x20A\x20buyer\x20should\x20never\x20be\x20left\x20holding\x20an\x20uncollectable\x20award.'},{'id':'audit_price','description':'Service\x20should\x20have\x20at\x20least\x20one\x20priced\x20sale\x20item','severity':'error','fields':['sales'],'check':a=>{const b=salesItemsOf(a);if(b['length']===0x0)return!![];return b['some'](c=>c?.['price']!==undefined&&c?.['price']!==null);},'message':()=>'Sales\x20list\x20present\x20but\x20no\x20item\x20has\x20a\x20price.\x20Customers\x20cannot\x20place\x20orders\x20without\x20knowing\x20the\x20cost.','recommendation':'Set\x20price\x20on\x20each\x20sales\x20item\x20(smallest-unit\x20string\x20or\x20display\x20form\x20like\x20\x272.5WOW\x27).'},{'id':'audit_compensation_fund_covers_award_ceiling','description':'compensation_fund\x20should\x20cover\x20the\x203x\x20award\x20ceiling\x20of\x20the\x20largest\x20sale\x20(disclosure)','severity':'warning','fields':['compensation_fund_add','compensation_fund','sales'],'check':a=>{if(!a?.['publish'])return!![];const b=compensationFundOf(a);if(b===undefined)return!![];const c=numericAmount(b);if(c===undefined)return!![];if(c===0x0)return![];const e=salesItemsOf(a)['map'](g=>numericAmount(g?.['price']))['filter'](g=>g!==undefined&&g>0x0);if(e['length']===0x0)return!![];const f=e['reduce']((g,h)=>g+h,0x0);return c>=MAX_INDEMNITY_MULTIPLE*f;},'message':()=>'compensation_fund\x20does\x20not\x20cover\x20the\x20award\x20ceiling\x20of\x20the\x20largest\x20sale.\x20An\x20award\x20is\x20hard-capped\x20at\x20'+MAX_INDEMNITY_MULTIPLE+'x\x20'+'the\x20order\x20amount\x20(the\x20MAX_INDEMNITY_MULTIPLE\x20cap,\x20enforced\x20at\x20ruling\x20time),\x20so\x20a\x20ruling\x20at\x20the\x20ceiling\x20'+'would\x20abort\x20the\x20buyer\x27s\x20claim\x20with\x2027\x20(E_COMPENSATION_NOT_MATCH)\x20—\x20the\x20ruling\x20stands\x20but\x20is\x20unpayable\x20'+'until\x20you\x20deposit,\x20and\x20the\x20abort\x20does\x20NOT\x20consume\x20the\x20claim.\x20Disclosure\x20only:\x20this\x20no\x20longer\x20blocks\x20'+'publish\x20—\x20per-order\x20coverage\x20is\x20enforced\x20at\x20BUY\x20time\x20(the\x20buyer\x27s\x20order\x20is\x20rejected\x20while\x20the\x20fund\x20'+'cannot\x20cover\x203x\x20that\x20order),\x20so\x20under-ceiling\x20funding\x20stops\x20sales\x20instead\x20of\x20stranding\x20awards.','recommendation':'For\x20every\x20order\x20you\x20want\x20to\x20sell,\x20keep\x20the\x20fund\x20at\x20>=\x20'+MAX_INDEMNITY_MULTIPLE+'x\x20THAT\x20order\x20via\x20'+'compensation_fund_add\x20(a\x200.49\x20course\x20needs\x201.47;\x20a\x203.99\x20course\x20needs\x2011.97\x20—\x20no\x20cross-SKU\x20subsidy).\x20'+('Above\x20'+MAX_INDEMNITY_MULTIPLE+'x\x20the\x20current\x20order\x20is\x20optional:\x20it\x20only\x20buys\x20tolerance\x20for\x20several\x20')+'CONCURRENT\x20claims\x20against\x20the\x20one\x20per-Service\x20pool\x20(there\x20is\x20no\x20on-chain\x20concurrency\x20limit),\x20which\x20'+'is\x20a\x20capital-allocation\x20choice.\x20A\x20service\x20with\x20NO\x20fund\x20sells\x20freely\x20—\x20that\x20is\x20the\x20documented\x20'+'no-protection\x20posture\x20(audit_compensation_fund\x20discloses\x20it;\x20buyers\x20see\x20coverage\x20via\x20order\x20monitor).'},{'id':'audit_description','description':'Service\x20should\x20have\x20a\x20description','severity':'warning','fields':['description'],'check':a=>typeof a?.['description']==='string'&&a['description']['length']>0x0,'message':()=>'Service\x20has\x20no\x20description.\x20Customers\x20won\x27t\x20understand\x20what\x20you\x27re\x20offering.','recommendation':'Write\x20a\x20clear\x20description\x20of\x20the\x20service,\x20including\x20deliverables,\x20timelines,\x20and\x20terms.'},{'id':'audit_named_new_name','description':'Service\x20being\x20created\x20should\x20have\x20a\x20name','severity':'warning','check':a=>serviceNameOf(a)!==undefined,'message':()=>'Creating\x20a\x20service\x20without\x20a\x20name\x20makes\x20it\x20hard\x20to\x20reference\x20and\x20organize.','recommendation':'Set\x20object:{name:\x20...}\x20(or\x20namedNew.name)\x20following\x20the\x20convention:\x20<projectPrefix>_<service>_<purpose>.'},{'id':'audit_customer_required_needs_um','description':'customer_required\x20requires\x20a\x20Contact\x20bound\x20via\x20um\x20(SDK-enforced\x20hard\x20link;\x20mirrored\x20here)','severity':'error','fields':['customer_required','um'],'check':a=>{const b=Array['isArray'](a?.['customer_required'])?a['customer_required']:[];if(b['length']===0x0)return!![];return!!a?.['um'];},'message':()=>'customer_required\x20is\x20set\x20but\x20no\x20Contact\x20is\x20bound\x20via\x20um\x20—\x20customers\x20cannot\x20deliver\x20the\x20required\x20private\x20information\x20through\x20end-to-end\x20encrypted\x20Messenger.','recommendation':'Bind\x20um:{Contact\x20name/id}\x20in\x20the\x20same\x20call\x20(SDK\x20order_new\x20will\x20fail\x20the\x20buyer\x20otherwise).'},{'id':'audit_customer_required_is_declared_not_enforced','description':'customer_required\x20has\x20no\x20on-chain\x20enforcement\x20at\x20buy\x20time\x20—\x20a\x20Guard\x20must\x20gate\x20fulfilment','severity':'warning','fields':['customer_required'],'check':a=>{const b=Array['isArray'](a?.['customer_required'])?a['customer_required']:[];return b['length']===0x0;},'message':a=>{const b=Array['isArray'](a?.['customer_required'])?a['customer_required']:[];return'customer_required\x20('+b['length']+'\x20field(s):\x20'+b['join'](',\x20')+')\x20is\x20DECLARATIVE\x20ONLY:\x20the\x20on-chain\x20purchase\x20entry\x20never\x20reads\x20this\x20list,\x20so\x20an\x20order\x20that\x20supplies\x20none\x20of\x20these\x20fields\x20is\x20still\x20created\x20and\x20progresses.\x20Nothing\x20on-chain\x20will\x20stop\x20it.';},'recommendation':'Bind\x20pattern.required_info_evidence_gate\x20(schema_query\x20action=get_guard_design_patterns)\x20on\x20the\x20first\x20forward\x20that\x20needs\x20the\x20information:\x20query\x20\x27order.required_info\x20some\x27\x20(1572)\x20over\x20the\x20Order.\x20The\x20buyer\x20records\x20the\x20credential\x20via\x20order_required_info_update:\x20EITHER\x20the\x20merchant\x27s\x20IM\x20user\x20address\x20resolved\x20from\x20the\x20Service\x27s\x20Contact\x20(zero\x20cost,\x20address\x20record\x20only)\x20OR\x20an\x20on-chain\x20WTS\x20Proof\x20object\x20address\x20(embeds\x20the\x20merchant\x20IM\x20address\x20and\x20the\x20last-message\x20timestamp;\x20costs\x20gas,\x20publicly\x20verifiable).\x20\x27order.required_info\x27\x20(1573)\x20returns\x20the\x20recorded\x20address\x20but\x20aborts\x20while\x20nothing\x20is\x20recorded\x20—\x20gate\x20on\x201572\x20first.\x20When\x20the\x20listing\x20genuinely\x20promises\x20a\x20PER-ORDER\x20credential,\x20prefer\x20the\x20controlled\x20bind\x20entry\x20(order_required_info_bind):\x20the\x20chain\x20verifies\x20the\x20Proof\x20is\x20about\x20THIS\x20order\x20and\x20owner-created\x20at\x20write\x20time\x20and\x20rejects\x20a\x20mismatch\x20—\x20no\x20guard\x20needed\x20to\x20catch\x20a\x20wrong-proof\x20record.\x20BOUNDARY:\x20that\x20binding\x20proves\x20the\x20credential\x20AUTHOR\x20only,\x20never\x20its\x20content\x20or\x20any\x20rating\x20—\x20do\x20not\x20mirror\x20it\x20onto\x20review/reward\x20claims;\x20public\x20reviews\x20are\x20Repository\x20rows\x20whose\x20values\x20are\x20enforced\x20guard-side\x20via\x20data-value\x20probes,\x20not\x20through\x20Proof\x20objects.'},{'id':'audit_dangling_deps','description':'Service\x20dependencies\x20should\x20be\x20fully\x20created','severity':'error','check':(a,b)=>{if(!a?.['publish'])return!![];if(!b?.['graph'])return!![];const c=b['graph']['findDanglingDependencies']()??[];return c['length']===0x0;},'message':()=>'Service\x20references\x20objects\x20that\x20are\x20not\x20yet\x20created.\x20Publishing\x20will\x20lock\x20these\x20references.','recommendation':'Ensure\x20all\x20referenced\x20objects\x20(machine,\x20allocators,\x20guards)\x20are\x20created\x20and\x20finalized\x20before\x20publishing.'},{'id':'audit_type_parameter','description':'Service\x20should\x20have\x20a\x20token\x20type\x20specified','severity':'info','fields':['type_parameter','namedNew'],'check':a=>typeParameterOf(a)!==undefined,'message':()=>'No\x20payment\x20token\x20type\x20specified.\x20Defaulting\x20to\x20WOW\x20(0x2::wow::WOW).','recommendation':'Explicitly\x20set\x20type_parameter\x20(inside\x20object:{...})\x20if\x20you\x20want\x20to\x20accept\x20non-WOW\x20tokens\x20(e.g.,\x20USDT,\x20ETH).'},{'id':'audit_wip_unreachable_url','description':'sale.wip\x20must\x20be\x20a\x20publicly\x20reachable\x20URL\x20(no\x20localhost/LAN/file\x20paths)','severity':'error','fields':['sales'],'check':(a,b)=>{if(typeof b?.['network']==='string'&&/local/i['test'](b['network']))return!![];const c=salesItemsOf(a);if(c['length']===0x0)return!![];return c['every'](e=>{const f=e?.['wip'];if(typeof f!=='string'||f['trim']()==='')return!![];return!/^(https?:\/\/)?(localhost|127\.0\.0\.1|\[::1\]|0\.0\.0\.0)/i['test'](f)&&!/^https?:\/\/(192\.168\.|10\.|172\.(1[6-9]|2\d|3[01])\.)/i['test'](f)&&!/^file:/i['test'](f);});},'message':a=>{const b=salesItemsOf(a)['map'](c=>String(c?.['wip']??''))['filter'](c=>c!==''&&(/^(https?:\/\/)?(localhost|127\.0\.0\.1|\[::1\]|0\.0\.0\.0)/i['test'](c)||/^https?:\/\/(192\.168\.|10\.|172\.(1[6-9]|2\d|3[01])\.)/i['test'](c)||/^file:/i['test'](c)));return'sale.wip\x20is\x20NOT\x20publicly\x20reachable\x20('+b['join'](',\x20')+').\x20The\x20URL\x20is\x20stored\x20on-chain\x20and\x20every\x20'+'customer\x20fetches\x20it\x20at\x20order\x20time\x20—\x20order_new\x20aborts\x20100%\x20for\x20anyone\x20outside\x20your\x20machine.\x20'+'Host\x20the\x20file\x20publicly:\x20wip_file\x20upload\x20to\x20the\x20official\x20free\x20host\x20(wip.store.wowok.net)\x20or\x20your\x20own\x20'+'endpoint\x20(GitHub\x20Pages\x20/\x20IPFS\x20/\x20your\x20website)';},'recommendation':'Replace\x20the\x20internal\x20URL\x20with\x20a\x20public\x20one.\x20Internal\x20URLs\x20are\x20sanctioned\x20ONLY\x20on\x20env.network=localnet\x20for\x20testing.'},{'id':'audit_wip_missing_public','description':'On\x20public\x20networks\x20every\x20sale\x20item\x20should\x20carry\x20a\x20product-detail\x20(wip)\x20URL','severity':'info','fields':['sales'],'check':(a,b)=>{const c=b?.['network'];if(typeof c==='string'&&/local/i['test'](c))return!![];const e=salesItemsOf(a);if(e['length']===0x0)return!![];return e['every'](f=>typeof f?.['wip']==='string'&&f['wip']['trim']()!=='');},'message':()=>'One\x20or\x20more\x20sale\x20items\x20have\x20NO\x20product-detail\x20(wip)\x20URL.\x20The\x20listing\x20works,\x20but\x20customers\x20see\x20no\x20detail\x20'+'page\x20and\x20the\x20service\x27s\x20market\x20completeness\x20score\x20is\x20downgraded.\x20Easiest:\x20upload\x20the\x20detail\x20file\x20with\x20the\x20'+'wip_file\x20tool\x20to\x20the\x20official\x20free\x20host\x20(https://wip.store.wowok.net\x20—\x2010\x20files\x20per\x20account,\x20180-day\x20'+'retention,\x2012MB/file)\x20and\x20put\x20the\x20returned\x20URL\x20into\x20sale.wip;\x20or\x20host\x20your\x20own\x20(GitHub\x20Pages\x20/\x20IPFS\x20/\x20'+'your\x20website).\x20For\x20long-lived\x20mainnet\x20listings\x20prefer\x20your\x20own\x20endpoint\x20so\x20the\x20detail\x20outlives\x20the\x20free\x20'+'retention\x20window','recommendation':'Upload\x20a\x20WIP\x20file\x20via\x20wip_file\x20and\x20set\x20sale.wip\x20on\x20each\x20item\x20before/after\x20publish\x20(sales\x20stays\x20modifiable).'},{'id':'audit_free_cancel_window_anchor','description':'A\x20free-cancellation\x20window\x20must\x20either\x20ride\x20the\x20stay-date\x20Repository\x20rail\x20or\x20be\x20disclosed\x20as\x20anchored\x20on\x20booking\x20time','severity':'warning','fields':['creation_plan'],'check':(a,b)=>{if(!a?.['publish'])return!![];const c=Array['isArray'](a?.['creation_plan']?.['guards'])?a['creation_plan']['guards']:[],e=c['some'](h=>{const i=typeof h?.['key']==='string'?h['key']:'',j=typeof h?.['purpose']==='string'?h['purpose']:'';return/free[._ ]?cancel/i['test'](i)||/cancell?ation/i['test'](j)&&/window|hours?|days?/i['test'](j);});if(!e)return!![];const f=c['some'](h=>{const i=typeof h?.['template_id']==='string'?h['template_id']:'',j=typeof h?.['purpose']==='string'?h['purpose']:'',k=/repository_data_check/i['test'](i)&&/stay[._ ]?date|use[._ ]?date|check[._ ]?in[._ ]?date|arrival/i['test'](j),l=/anchored on (booking|order\.time)|booking time by default|service_start_ms|absolute (service|departure|event|use) (start|date)/i['test'](j);return k||l;});return f;},'message':()=>'A\x20free-cancellation\x20window\x20is\x20declared\x20WITHOUT\x20a\x20stay-date\x20anchor\x20and\x20WITHOUT\x20a\x20booking-time\x20disclosure.\x20'+'The\x20chain\x20has\x20no\x20use-date\x20primitive\x20(order.time\x20is\x20the\x20BOOKING\x20moment\x20—\x20written\x20once,\x20immutable),\x20so\x20the\x20'+'window\x20enforces\x20as\x20\x27from\x20booking\x27.\x20If\x20your\x20buyer-facing\x20copy\x20promises\x20\x27X\x20hours\x20before\x20arrival/check-in\x27,\x20'+'the\x20promised\x20window\x20has\x20typically\x20ALREADY\x20CLOSED\x20at\x20booking\x20(bkd8\x20BK-02,\x20live\x20mainnet)\x20—\x20a\x20silent\x20policy\x20'+'inversion\x20that\x20mis-sells\x20the\x20listing.\x20TWO\x20WAYS\x20OUT:\x20(1)\x20FAITHFUL\x20WINDOW\x20—\x20ride\x20the\x20STAY-DATE\x20PRESCRIPTION\x20'+'(time_anchors.free_cancel\x20in\x20the\x20travel\x20templates):\x20a\x20batched\x20id_from\x20None(0)\x20\x27stay_date\x27\x20row\x20(u64\x20epoch-ms)\x20'+'written\x20into\x20the\x20order-scoped\x20Repository\x20at\x20buy\x20time,\x20plus\x20a\x20pattern.repository_data_check\x20leg\x20comparing\x20'+'Clock\x20against\x20row\x20+\x20window\x20offset\x20(CLOSING\x20<=);\x20(2)\x20HONEST\x20DEFAULT\x20—\x20keep\x20the\x20booking-time\x20anchor\x20and\x20state\x20'+'\x27free\x20cancellation\x20within\x20X\x20hours\x20of\x20BOOKING\x27\x20in\x20the\x20buyer-facing\x20copy\x20so\x20the\x20promise\x20matches\x20the\x20chain','recommendation':'Either\x20add\x20the\x20stay-date\x20Repository\x20row\x20+\x20repository_data_check\x20leg\x20(faithful\x20pre-use\x20window),\x20or\x20restate\x20the\x20cancellation\x20policy\x20as\x20\x27from\x20booking\x27\x20in\x20all\x20buyer-facing\x20copy.'}];function readSeverityOverrides(){try{const {getJudgmentDoc:a}=require('../config/judgment.js');if(typeof a!=='function')return{};const b=a()?.['rules']?.['domains'];if(!b||typeof b!=='object')return{};const c={};for(const d of Object['values'](b)){const e=d?.['severity_overrides'];if(!e||typeof e!=='object')continue;for(const [f,g]of Object['entries'](e)){if(g==='error'||g==='warning'||g==='info')c[f]=g;}}return c;}catch{return{};}}export function auditService(a,b){const c=[],d=a?.['publish']===!![]&&typeof a?.['object']==='string',e=readSeverityOverrides();for(const f of AUDIT_RULES){try{if(d&&f['fields']&&!f['fields']['some'](g=>a[g]!==undefined))continue;!f['check'](a,b)&&c['push']({'rule_id':f['id'],'severity':e[f['id']]??f['severity'],'message':f['message'](a),'recommendation':f['recommendation']});}catch{}}return c;}export function hasBlockingErrors(a){return a['some'](b=>b['severity']==='error');}export function getErrors(a){return a['filter'](b=>b['severity']==='error');}export function getWarnings(a){return a['filter'](b=>b['severity']==='warning');}export function summarizeFindings(a){if(a['length']===0x0)return'All\x20audit\x20checks\x20passed.';const b=getErrors(a),c=getWarnings(a),d=a['filter'](g=>g['severity']==='info'),e=[];if(b['length']>0x0)e['push'](b['length']+'\x20error(s)');if(c['length']>0x0)e['push'](c['length']+'\x20warning(s)');if(d['length']>0x0)e['push'](d['length']+'\x20info');return'Audit:\x20'+e['join'](',\x20')+'.\x20Review\x20before\x20publishing.';}export const AUDIT_RULES_VERSION=0xb;
|
|
1
|
+
import{MAX_INDEMNITY_MULTIPLE,TASK_BINDING_SLOT,declaresTaskBindingSlot}from'./onchain-constants.js';import{TWO_TX_RENEW_RECIPE}from'./protocol-facts.js';import{lintForwardAmbiguity,findLoopCycles}from'./machine-topology.js';import{isRenewalLoopEdge}from'../participation/radar-core.js';function numericAmount(a){if(typeof a==='number')return Number['isFinite'](a)?a:undefined;if(typeof a==='string'){const b=a['trim']();if(/^\d+$/['test'](b))return Number(b);}return undefined;}export{numericAmount};export function salesItemsOf(a){if(Array['isArray'](a?.['sales']))return a['sales'];if(Array['isArray'](a?.['sales']?.['sales']))return a['sales']['sales'];return[];}export function allocatorCountOf(a){const b=a?.['order_allocators'];if(Array['isArray'](b))return b['length'];if(Array['isArray'](b?.['allocators']))return b['allocators']['length'];return 0x0;}export function arbitrationRefsOf(b){const c=b?.['arbitrations'];if(Array['isArray'](c))return c['filter'](e=>typeof e==='string');if(Array['isArray'](c?.['objects']))return c['objects']['filter'](e=>typeof e==='string');return[];}export function compensationFundOf(a){if(a?.['compensation_fund_add']?.['balance']!=null)return a['compensation_fund_add']['balance'];if(a?.['compensation_fund']!=null)return a['compensation_fund'];return undefined;}export function serviceNameOf(a){if(typeof a?.['object']==='string')return a['object'];if(typeof a?.['object']?.['name']==='string'&&a['object']['name'])return a['object']['name'];if(typeof a?.['namedNew']?.['name']==='string'&&a['namedNew']['name'])return a['namedNew']['name'];return undefined;}export function typeParameterOf(a){if(typeof a?.['type_parameter']==='string'&&a['type_parameter'])return a['type_parameter'];if(typeof a?.['object']?.['type_parameter']==='string'&&a['object']['type_parameter'])return a['object']['type_parameter'];if(typeof a?.['namedNew']?.['type_parameter']==='string'&&a['namedNew']['type_parameter'])return a['namedNew']['type_parameter'];return undefined;}export const DISPUTE_FAMILY_NODE_REGEX=/(^|_)(disputed?|arbitration|arb)(_|$)/i;export const FUND_TERMINAL_NODE_REGEX=/^(refund|refunded|deposit_refunded|deposit_deducted|cancel|cancelled)$/i;export const ANTI_PATTERN_NODE_REGEX=new RegExp(DISPUTE_FAMILY_NODE_REGEX['source']+'|'+FUND_TERMINAL_NODE_REGEX['source'],'i');export const REMEDY_FAMILY_NODE_REGEX=/(revis|review|rework|refund|cancel|return|claim)/i;export function classifyLoopCycle(a,b){for(let c=0x0;c<a['length'];c++){if(isRenewalLoopEdge(a[c],a[(c+0x1)%a['length']]))return'renewal';}if(b==='review-loop')return'remedy';if(b==='paid-cycle')return'charge';if(a['some'](d=>REMEDY_FAMILY_NODE_REGEX['test'](d)))return'remedy';return'charge';}export function auditMachineNodes(a,b){const c=[],d=[];if(!Array['isArray'](a)||a['length']===0x0)return d['push']('pre_publish:\x20machine\x20node\x20set\x20unavailable\x20—\x20topology\x20not\x20verifiable;\x20'+'verify\x20via\x20machineNode2file\x20BEFORE\x20publish\x20(immutable\x20after\x20publish,\x20IMMUT-001)'),{'critical':c,'warnings':d};const e=a;for(const u of e){const v=typeof u?.['name']==='string'?u['name']:'';if(!v)continue;if(DISPUTE_FAMILY_NODE_REGEX['test'](v))c['push']('R-M1-11:\x20machine\x20node\x20\x22'+v+'\x22\x20models\x20dispute\x20flow\x20—\x20'+'disputes\x20must\x20route\x20via\x20the\x20separate\x20Arbitration\x20object\x20(off-Machine);\x20'+'rename\x20the\x20node\x20to\x20the\x20business\x20state\x20that\x20triggers\x20it.\x20'+'COMPLETE-FIX\x20CHECKLIST\x20(the\x20same\x20publish\x20pass\x20ALSO\x20blocks\x20on\x20—\x20clear\x20all\x20in\x20one\x20edit,\x20'+'F-RQD2-09):\x20(1)\x20every\x20terminal\x20node\x20needs\x20an\x20allocator\x20rail\x20whose\x20guard\x20anchors\x20to\x20it\x20'+'(R-ESCROW-LEAF);\x20(2)\x20a\x20bound\x20arbitration\x20must\x20NOT\x20share\x20the\x20service\x20Permission\x20'+'(R-ARB-SAME-CONTROLLER);\x20(3)\x20its\x20voting_guard\x20must\x20be\x20non-empty\x20(R-ARB-VOTE-LOCK).');else FUND_TERMINAL_NODE_REGEX['test'](v)&&d['push']('R-M1-11:\x20machine\x20node\x20\x22'+v+'\x22\x20uses\x20a\x20bare\x20fund-terminal\x20name\x20—\x20reaching\x20'+'it\x20moves\x20no\x20funds\x20by\x20itself.\x20This\x20is\x20legitimate\x20ONLY\x20when\x20a\x20refund\x20allocator\x20'+'rail\x27s\x20guard\x20anchors\x20to\x20this\x20node\x20(per-node\x20refund\x20tracks);\x20otherwise\x20rename\x20it\x20'+'to\x20the\x20business\x20state\x20(e.g.\x20cancel_requested\x20/\x20closed_cancel)\x20and\x20route\x20the\x20'+'refund\x20via\x20an\x20Allocator\x20triggered\x20by\x20that\x20state.\x20The\x20template\x20scanner\x20verifies\x20'+'the\x20anchoring\x20when\x20a\x20template\x20is\x20present.\x20Sibling\x20gates\x20in\x20the\x20SAME\x20publish\x20pass:\x20'+'R-ESCROW-LEAF\x20(terminal\x20without\x20anchored\x20rail),\x20R-ARB-SAME-CONTROLLER\x20/\x20R-ARB-VOTE-LOCK\x20'+'(bound\x20arbitration\x20config)\x20—\x20fix\x20all\x20at\x20once\x20to\x20avoid\x20extra\x20publish\x20rounds\x20(F-RQD2-09).');}const g=new Set();for(const w of e){const x=typeof w?.['name']==='string'?w['name']:'';if(!x)continue;g['has'](x)&&c['push']('MC-C-04:\x20duplicate\x20machine\x20node\x20name\x20\x22'+x+'\x22\x20—\x20on-chain\x20will\x20reject\x20the\x20publish\x20transaction'),g['add'](x);}const h=e['some'](y=>Array['isArray'](y?.['pairs'])&&y['pairs']['some'](z=>z?.['prev_node']===''));!h&&c['push']('Machine\x20has\x20no\x20entry\x20pair\x20(prev_node=\x22\x22)\x20—\x20Progress\x20can\x20never\x20advance\x20'+'from\x20the\x20initial\x20state;\x20orders\x20are\x20permanently\x20stuck');const i=new Map();for(const y of e){const z=typeof y?.['name']==='string'&&y['name']!==''?y['name']:'(unnamed\x20node)';for(const A of Array['isArray'](y?.['pairs'])?y['pairs']:[]){const B=A?.['prev_node'];if(typeof B!=='string')continue;const C=Array['isArray'](A?.['forwards'])?A['forwards']:[];for(const D of C){const E=typeof D==='string'?D:typeof D?.['name']==='string'?D['name']:'';if(E==='')continue;const F=B+'\x00'+E,G=i['get'](F);if(G===z)c['push']('H-09:\x20duplicate\x20machine\x20edge\x20(prev_node\x20\x22'+B+'\x22\x20->\x20forward\x20\x22'+E+'\x22)\x20re-declared\x20on\x20node\x20\x22'+z+'\x22\x20—\x20'+'partitioned\x20building\x20re-sends\x20are\x20APPEND-ONLY\x20on\x20the\x20draft\x20(sso-tn-261027:\x2017\x20entries\x20/\x2014\x20unique\x20names);\x20'+'the\x20chain\x20edge\x20lookup\x20takes\x20the\x20FIRST\x20match,\x20so\x20every\x20extra\x20copy\x20is\x20unreachable\x20dead\x20weight\x20that\x20ships\x20'+'the\x20draft\x27s\x20ghost\x20edges\x20into\x20an\x20immutable\x20machine\x20(IMMUT-001).\x20Drop\x20the\x20duplicate\x20pair\x20'+'(delete\x20it\x20on\x20the\x20still-unpublished\x20draft\x20machine)\x20before\x20publishing');else G===undefined&&i['set'](F,z);}}}const j=new Map();for(const H of e){const I=typeof H?.['name']==='string'?H['name']:'';if(!I)continue;if(!j['has'](I))j['set'](I,[]);for(const J of H?.['pairs']??[]){const K=J?.['prev_node'];if(typeof K==='string'&&K!==''){const L=j['get'](K);if(L)L['push'](I);else j['set'](K,[I]);}}}const k=findLoopCycles(j)['map'](M=>({'c':M,'tier':classifyLoopCycle(M['cycle'],b)})),l=k['filter'](M=>M['tier']==='renewal'),m=k['filter'](M=>M['tier']==='remedy'),o=k['filter'](M=>M['tier']==='charge');o['length']>0x0&&c['push']('pre_publish:\x20machine\x20contains\x20charge-bearing\x20loop\x20cycle(s)\x20'+o['map'](M=>'['+M['c']['cycle']['join']('\x20->\x20')+']')['join'](',\x20')+'\x20—\x20'+'on-chain\x20a\x20revisit\x20is\x20NOT\x20verified\x20to\x20re-fund\x20the\x20Allocation,\x20and\x20this\x20static\x20pass\x20sees\x20only\x20the\x20forward\x27s\x20guard\x20reference\x20'+'(never\x20the\x20guard\x20table),\x20so\x20a\x20per-revisit-fee\x20cycle\x20(retake\x20/\x20session-card\x20shape)\x20is\x20UNPROVABLE\x20here\x20even\x20though\x20the\x20'+'allocation.balance\x20Guard\x20query\x20(1051,\x20witness\x20OrderAllocation\x20109)\x20makes\x20the\x20fee\x20enforceable\x20at\x20the\x20guard\x20layer\x20'+'(zero-value\x20re-delivery\x20cycles,\x20test/11\x20R2-F3\x20/\x20crs\x20P2-3).\x20THREE\x20WAYS\x20OUT\x20—\x20'+'(1)\x20NO-CHARGE\x20revisit\x20(F-06,\x20ctra-mn\x20261019:\x20a\x20delivered->in_progress\x20revision\x20loop\x20is\x20business-correct\x20and\x20was\x20false-CRITICAL\x20here):\x20'+'declare\x20`reentry_kind:\x20\x22review-loop\x22`\x20on\x20this\x20publish\x20payload\x20(AP-3\x20—\x20machine-checkable,\x20no\x20renaming\x20needed)\x20'+'OR\x20rename\x20ANY\x20ONE\x20node\x20of\x20the\x20cycle\x20with\x20a\x20remedy\x20word\x20root\x20the\x20classifier\x20reads\x20—\x20revis*/review*/rework*/refund*/cancel*/return*/claim*\x20'+'(e.g.\x20\x27revising\x27\x20instead\x20of\x20\x27in_progress\x27)\x20—\x20and\x20the\x20cycle\x20reclassifies\x20as\x20remedy\x20tier\x20(warning,\x20not\x20a\x20blocker);\x20'+'(2)\x20GENUINELY\x20charge-bearing\x20with\x20neutral\x20names:\x20declare\x20`reentry_kind:\x20\x22paid-cycle\x22`\x20(keeps\x20this\x20block\x20—\x20'+'it\x20is\x20the\x20declaration\x20of\x20intent)\x20and\x20bind\x20the\x20fund-gate\x20Guard\x20on\x20the\x20loop\x20forward\x20'+'(constant\x20=\x20order\x20address,\x20convert_witness\x20OrderAllocation,\x20allocation.balance\x20>=\x20revisit\x20fee)\x20AND\x20publish\x20through\x20a\x20template\x20'+'carrying\x20that\x20convention\x20—\x20PRE-STATE\x20CONSTRAINT\x20(esound-mn-261021\x20B-1):\x20the\x20gate\x20reads\x20the\x20COMMITTED\x20pre-transaction\x20'+'balance,\x20so\x20the\x20revisit\x20funds\x20must\x20be\x20committed\x20in\x20a\x20PRIOR\x20transaction.\x20'+TWO_TX_RENEW_RECIPE+'\x20'+'Alternatively\x20replace\x20the\x20loop\x20with\x20per-period\x20NEW\x20Orders\x20(REUSE\x20pattern\x20—\x20a\x20fresh\x20order\x20per\x20period\x20instead\x20of\x20an\x20in-order\x20loop\x20that\x20replays\x20its\x20forwards\x20every\x20lap).\x20'+'(3)\x20A\x20funded\x20renewal\x20loop\x20(post-period\x20node\x20back\x20into\x20a\x20charging\x20node,\x20advanced\x20via\x20the\x20one-PTB\x20order_renew\x20call,\x20'+'NO\x20balance\x20gate\x20on\x20the\x20renew\x20forward\x20—\x20see\x20the\x20PRE-STATE\x20CONSTRAINT\x20above)\x20'+'is\x20the\x20only\x20sanctioned\x20charge-bearing\x20cycle\x20shape\x20for\x20in-order\x20renewals.');l['length']>0x0&&d['push']('pre_publish:\x20machine\x20contains\x20renewal\x20loop\x20cycle(s)\x20'+l['map'](M=>'['+M['c']['cycle']['join']('\x20->\x20')+']')['join'](',\x20')+'\x20—\x20on-chain\x20a\x20revisit\x20'+'is\x20NOT\x20verified\x20to\x20re-fund\x20the\x20Allocation.\x20Every\x20renewal/loop\x20forward\x20MUST\x20carry\x20the\x20new-period\x20'+'payment\x20into\x20the\x20order\x20escrow\x20(use\x20the\x20order\x20call\x27s\x20order_renew\x20field:\x20create\x20the\x20period\x20payment,\x20receive\x20it\x20into\x20the\x20'+'allocation,\x20and\x20advance\x20the\x20progress\x20—\x20all\x20in\x20one\x20transaction),\x20or\x20the\x20loop\x20allows\x20zero-value\x20'+'re-delivery\x20cycles\x20(test/11\x20R2-F3).\x20'+'PRE-STATE\x20CONSTRAINT\x20(esound-mn-261021\x20B-1,\x20mainnet-verified):\x20a\x20guard\x20on\x20the\x20renew\x20forward\x20reading\x20'+'allocation.balance\x20(query\x201051)\x20evaluates\x20the\x20COMMITTED\x20pre-transaction\x20balance\x20—\x20the\x20same-PTB\x20order_renew\x20'+'payment\x20is\x20INVISIBLE\x20to\x20it,\x20so\x20a\x20balance-gated\x20renew\x20forward\x20ALWAYS\x20aborts.\x20NEVER\x20bind\x20a\x20balance\x20gate\x20to\x20a\x20'+'forward\x20that\x20order_renew\x20advances\x20in\x20the\x20same\x20PTB.\x20'+TWO_TX_RENEW_RECIPE+'\x20'+'The\x20zero-value\x20protection\x20rides\x20this\x20routing\x20convention\x20(order_renew\x27s\x20amount).');m['length']>0x0&&d['push']('pre_publish:\x20machine\x20contains\x20remedy\x20loop\x20cycle(s)\x20'+m['map'](M=>'['+M['c']['cycle']['join']('\x20->\x20')+']')['join'](',\x20')+'\x20—\x20'+'a\x20same-order\x20revisit\x20(revision/review/rework/refund/cancel\x20family)\x20implies\x20NO\x20new\x20charge,\x20so\x20no\x20fund\x20gate\x20is\x20needed\x20on\x20it\x20'+'(the\x20allocation.balance\x20query\x20exists\x20but\x20is\x20irrelevant\x20here).\x20Visible\x20by\x20design\x20(crs\x20P2-3):\x20if\x20the\x20business\x20EVER\x20intends\x20'+'a\x20revisit\x20to\x20cost\x20money,\x20that\x20fee\x20IS\x20enforceable\x20via\x20the\x20balance\x20query\x20(1051)\x20—\x20but\x20that\x20reshapes\x20the\x20cycle\x20into\x20the\x20'+'charge\x20tier\x20above;\x20keep\x20remedy\x20revisits\x20free\x20or\x20restructure\x20as\x20per-period\x20NEW\x20Orders.');for(const M of e){const N=typeof M?.['name']==='string'?M['name']:'?';for(const O of M?.['pairs']??[]){for(const P of O?.['forwards']??[]){const Q=P?.['namedOperator']!==undefined&&P?.['namedOperator']!==null,R=P?.['permissionIndex']!==undefined&&P?.['permissionIndex']!==null,S=P?.['guard']!==undefined&&P?.['guard']!==null;!Q&&!R&&!S&&d['push']('pre_publish:\x20node\x20\x22'+N+'\x22\x20forward\x20\x22'+String(P?.['name']??'?')+'\x22\x20has\x20no\x20executor\x20binding\x20(namedOperator\x20/\x20permissionIndex\x20/\x20guard)\x20—\x20no\x20one\x20can\x20advance\x20it');}}}const q=computeTerminalReachability(a),r=new Map(),s=new Map();for(const T of e){for(const U of T?.['pairs']??[]){const V=U?.['prev_node'];if(typeof V!=='string'||V==='')continue;for(const W of U?.['forwards']??[]){const X=W?.['namedOperator']!=null&&String(W['namedOperator'])!==''?'operator:'+String(W['namedOperator']):W?.['permissionIndex']!=null?'permission:'+String(W['permissionIndex']):null;s['set'](V,(s['get'](V)??0x0)+0x1);if(X!=null){const Y=r['get'](V)??new Set();Y['add'](X),r['set'](V,Y);}}}}for(const [Z,a0]of r){(s['get'](Z)??0x0)>=0x1&&a0['size']===0x1&&d['push']('pre_publish:\x20LIVE-ACT-02\x20node\x20\x22'+Z+'\x22\x20—\x20every\x20outgoing\x20forward\x20binds\x20the\x20SAME\x20single\x20identity\x20('+[...a0]['join'](',\x20')+'):\x20'+'if\x20that\x20actor\x20goes\x20silent\x20the\x20order\x20LATCHES\x20here\x20and\x20the\x20escrow\x20freezes\x20—\x20there\x20is\x20no\x20counterparty\x20or\x20keeper\x20exit\x20'+'(alg26\x20261026\x20O9/O5\x20family:\x20changes_requested\x20with\x20only\x20a\x20contributor\x20resubmit\x20edge;\x20claimed\x20with\x20only\x20a\x20merchant\x20assign\x20edge).\x20'+'Design\x20the\x20exit\x20edge\x20NOW\x20(a\x20keeper\x20or\x20auto-close\x20forward\x20with\x20its\x20own\x20identity,\x20or\x20a\x20counterparty-signed\x20cancel/refund\x20edge)\x20—\x20'+'immutable\x20after\x20publish\x20(IMMUT-001).\x20If\x20single-operator-by-design,\x20this\x20warning\x20can\x20be\x20ignored');}const t=lintForwardAmbiguity(a,'pre_publish');return c['push'](...t['critical']),d['push'](...t['warnings']),q['unreachable']['length']>0x0&&d['push']('pre_publish:\x20unreachable\x20machine\x20node(s)\x20'+q['unreachable']['map'](a1=>'\x22'+a1+'\x22')['join'](',\x20')+'\x20—\x20'+'no\x20path\x20from\x20the\x20entry\x20pair\x20reaches\x20them;\x20dead\x20topology\x20is\x20frozen\x20at\x20publish\x20(IMMUT-001).\x20'+'Wire\x20them\x20into\x20the\x20flow\x20or\x20remove\x20them\x20before\x20publish'),{'critical':c,'warnings':d};}export function computeTerminalReachability(a){const b=[],c=[];if(!Array['isArray'](a)||a['length']===0x0)return{'terminals':b,'unreachable':c};const d=a,e=new Map(),f=[],g=[];for(const j of d){const k=typeof j?.['name']==='string'?j['name']:'';if(!k)continue;f['push'](k);if(!e['has'](k))e['set'](k,[]);let l=![];for(const m of j?.['pairs']??[]){const o=m?.['prev_node'];if(o==='')l=!![];else{if(typeof o==='string'&&o!==''&&o!==k){const q=e['get'](o);if(q)q['push'](k);else e['set'](o,[k]);}}}if(l)g['push'](k);}if(f['length']===0x0||g['length']===0x0)return{'terminals':b,'unreachable':c};const h=new Set(),i=[...g];while(i['length']>0x0){const r=i['pop']();if(h['has'](r))continue;h['add'](r);for(const s of e['get'](r)??[])i['push'](s);}for(const t of f){if(!h['has'](t))c['push'](t);else{if((e['get'](t)??[])['length']===0x0)b['push'](t);}}return{'terminals':b,'unreachable':c};}export function chainNodeRailMatrix(a){const b=Array['isArray'](a)?a:[],{terminals:c}=computeTerminalReachability(b),d=new Set(c),e=[];for(const f of b){const g=typeof f?.['name']==='string'?f['name']:'';if(!g)continue;const h=[];for(const j of f?.['pairs']??[]){const k=typeof j?.['prev_node']==='string'?j['prev_node']:'';if(k===''||k===g)continue;if(!h['includes'](k))h['push'](k);}const i={'name':g};if(d['has'](g))i['semanticRole']='final';if(h['length']>0x0)i['fromNodes']=h;e['push'](i);}return e;}export const REVIEW_FAMILY_NODE_REGEX=/(^|_)(review|reviews|reviewed|reviewing|evaluated|evaluate|feedback|rating|rated)(_|$)/i;export function lintReviewLockedTerminals(a,b){const c=[],d=[];if(!Array['isArray'](a)||a['length']===0x0)return{'critical':c,'warnings':d};const e=a,h=u=>Array['isArray'](u?.['pairs'])?u['pairs']:Array['isArray'](u?.['value'])?u['value']:[],i=[],j=[],k=[];for(const u of e){const v=typeof u?.['name']==='string'?u['name']:'';if(!v)continue;j['push'](v);let w=![];for(const x of h(u)){const y=x,z=y?.['prev_node'];if(z==='')w=!![];const A=Array['isArray'](y?.['forwards'])?y['forwards']:[],B=[];for(const C of A){const D=C,E=D?.['guard'],F=typeof E==='string'&&E['trim']()!==''?E:E&&typeof E==='object'?E['guard']??E['$ref']:undefined;if(typeof F==='string'&&F['trim']()!=='')B['push'](F);}typeof z==='string'&&z!==''&&i['push']({'from':z,'to':v,'guardRefs':B});}if(w)k['push'](v);}if(j['length']===0x0||k['length']===0x0)return{'critical':c,'warnings':d};const l=computeTerminalReachability(a);if(l['terminals']['length']===0x0)return{'critical':c,'warnings':d};const m=G=>{if(G['guardRefs']['length']===0x0)return![];for(const H of G['guardRefs']){const I=b['get'](H['toLowerCase']());if(!I||I['length']===0x0)return![];const J=I['every'](K=>REVIEW_FAMILY_NODE_REGEX['test'](K));if(!J||I['includes'](G['from']))return![];}return!![];},o=G=>REVIEW_FAMILY_NODE_REGEX['test'](G),q=G=>{const H=new Map();for(const K of i){if(m(K))continue;if(G&&(o(K['from'])||o(K['to'])))continue;const L=H['get'](K['from']);if(L)L['push'](K['to']);else H['set'](K['from'],[K['to']]);}const I=new Set(),J=[...k];while(J['length']>0x0){const M=J['pop']();if(I['has'](M))continue;I['add'](M);for(const N of H['get'](M)??[])J['push'](N);}return I;},r=q(![]),s=q(!![]);for(const G of l['terminals']){if(!r['has'](G))c['push']('REVIEW-LOCK-01:\x20terminal\x20\x22'+G+'\x22\x20is\x20enterable\x20ONLY\x20through\x20forward(s)\x20whose\x20guard\x20pins\x20a\x20'+'review/feedback\x20node\x20the\x20edge\x20itself\x20does\x20not\x20depart\x20from\x20—\x20the\x20rail\x20can\x20never\x20fire\x20(the\x20guard\x20asserts\x20a\x20'+'progress\x20state\x20this\x20transition\x20cannot\x20produce),\x20so\x20a\x20buyer\x20who\x20never\x20reviews\x20strands\x20every\x20order\x27s\x20'+'escrow\x20permanently.\x20Machine\x20topology\x20is\x20immutable\x20after\x20publish\x20(IMMUT-001).\x20Fix\x20BEFORE\x20publish:\x20'+'re-pin\x20the\x20settlement\x20guard\x20to\x20the\x20node\x20the\x20forward\x20actually\x20departs\x20from,\x20and\x20add\x20a\x20time-lock\x20keeper\x20'+'auto-confirm\x20rail\x20(the\x20template\x20deliver_confirm_timeout\x20convention)\x20so\x20settlement\x20never\x20depends\x20on\x20the\x20'+'buyer\x20choosing\x20to\x20review');else!s['has'](G)&&d['push']('REVIEW-LOCK-01:\x20terminal\x20\x22'+G+'\x22\x20is\x20reachable\x20only\x20THROUGH\x20a\x20review/feedback\x20node\x20—\x20a\x20buyer\x20who\x20'+'silently\x20skips\x20reviewing\x20can\x20never\x20let\x20their\x20order\x20reach\x20it.\x20The\x20sanctioned\x20shape\x20keeps\x20the\x20review\x20'+'stop\x20OPTIONAL\x20with\x20an\x20exit\x20edge\x20back\x20to\x20the\x20settlement\x20rail,\x20and\x20a\x20keeper\x20time-lock\x20rail\x20that\x20opens\x20'+'settlement\x20independently\x20(retail\x20deliver_confirm_timeout\x20convention).\x20Verify\x20one\x20of\x20the\x20two\x20exists;\x20'+'if\x20the\x20review\x20node\x20is\x20meant\x20to\x20be\x20keeper-advanceable,\x20this\x20is\x20satisfied\x20and\x20may\x20be\x20ignored');}return{'critical':c,'warnings':d};}export function arbitrationVotingLockDetail(a){if(!Array['isArray'](a))return null;if(a['length']>0x0)return null;return'voting_guard\x20is\x20empty\x20(no\x20guard-weighted\x20voters).\x20Plain\x20votes\x20hard-require\x20the\x20vote\x20permission\x20(358)\x20on\x20the\x20'+'arbitration\x27s\x20own\x20Permission:\x20only\x20that\x20Permission\x27s\x20admin\x20(its\x20creator,\x20by\x20default)\x20and\x20explicit\x20358\x20'+'grantees\x20pass\x20the\x20assert,\x20so\x20without\x20grants\x20the\x20disputing\x20CUSTOMER\x20can\x20never\x20vote\x20and\x20the\x20arb\x20admin\x20is\x20the\x20'+'only\x20possible\x20voter\x20AND\x20the\x20judge\x20—\x20a\x20dispute\x20opened\x20against\x20this\x20service\x20dead-locks\x20when\x20that\x20admin\x20is\x20'+'unresponsive.\x20Configure\x20a\x20public\x20voting_guard\x20on\x20the\x20Arbitration\x20(voting_guard\x20op=\x27set\x27\x20with\x20guard\x20+\x20vote\x20'+'weight\x20—\x20the\x20field\x20stays\x20mutable\x20after\x20publish;\x20the\x20standard\x20shape\x20is\x20tpl_voting_guard_open_vote,\x20the\x20'+'always-true\x20guard\x20at\x20FixedValue\x20weight\x201)\x20or\x20bind\x20an\x20arbitration\x20that\x20already\x20carries\x20one,\x20BEFORE\x20'+'publishing\x20this\x20service';}export function arbitrationVotingGuardNoIdentityDetail(a,b){const c=(e,f=0x0)=>{if(f>0x18||e==null||typeof e!=='object')return![];const g=e;if(g['type']==='context'&&g['context']==='Signer')return!![];const h=Array['isArray'](g['nodes'])?g['nodes']:[];if(g['node']!=null&&typeof g['node']==='object')h['push'](g['node']);if(g['nodes']!=null&&!Array['isArray'](g['nodes'])&&typeof g['nodes']==='object')h['push'](g['nodes']);for(const i of Object['values'](g)){if(i!=null&&typeof i==='object'&&!Array['isArray'](i)&&i!==g)h['push'](i);}return h['some'](j=>c(j,f+0x1));};if(a==null||typeof a!=='object')return null;if(c(a))return null;const d=Array['isArray'](b)?b['length']:0x0;return'ARB-OPEN-VOTE-NO-IDENTITY:\x20this\x20voting_guard\x27s\x20root\x20has\x20NO\x20identity\x20leg\x20(no\x20Signer\x20comparison\x20anywhere\x20'+'in\x20the\x20tree),\x20so\x20EVERY\x20Passport\x20holder\x20passes\x20and\x20may\x20vote\x20—\x20on\x20a\x20venue\x20meant\x20for\x20the\x20dispute\x20parties\x20'+'that\x20is\x20a\x20ballot-integrity\x20hole\x20(mainnet\x20pddk-b4:\x20an\x20outsider\x20voted\x20on\x20a\x20live\x20case).\x20If\x20the\x20venue\x20is\x20'+'DELIBERATELY\x20public,\x20keep\x20this\x20shape\x20(tpl_voting_guard_open_vote)\x20and\x20disclose\x20the\x20open\x20universe;\x20'+'otherwise\x20rebind\x20a\x20party-scoped\x20guard\x20(tpl_voting_guard_party_only:\x20the\x20disputed\x20order\x27s\x20owner\x20via\x20'+'order.owner\x20+\x20the\x20arb.order\x20case\x20pin,\x20or\x20the\x20venue\x20panel\x20via\x20vec_contains_address)\x20while\x20voting_guard\x20'+'is\x20still\x20mutable'+(d>0x0?'\x20(the\x20guard\x27s\x20table\x20carries\x20'+d+'\x20row(s);\x20identity\x20is\x20about\x20the\x20ROOT\x20tree,\x20not\x20the\x20table)':'');}const TIME_PROFILE_UNIT_MS={'ms':0x1,'msec':0x1,'msecs':0x1,'millisecond':0x1,'milliseconds':0x1,'s':0x3e8,'sec':0x3e8,'secs':0x3e8,'second':0x3e8,'seconds':0x3e8,'m':0xea60,'min':0xea60,'mins':0xea60,'minute':0xea60,'minutes':0xea60,'h':0x36ee80,'hr':0x36ee80,'hrs':0x36ee80,'hour':0x36ee80,'hours':0x36ee80,'d':0x5265c00,'day':0x5265c00,'days':0x5265c00,'w':0x240c8400,'wk':0x240c8400,'wks':0x240c8400,'week':0x240c8400,'weeks':0x240c8400},TIME_PROFILE_DURATION_REGEX=/(\d+(?:\.\d+)?)\s*(ms|milliseconds?|msecs?|minutes?|mins?|seconds?|secs?|hours?|hrs?|days?|weeks?|wks?|min|sec|hr|wk|[smhdw])\b/gi,TIME_PROFILE_ADMISSION_REGEX=/compress(?:ed|ion)|accelerat(?:ed|ion)|shorten(?:ed)?(?:\s+for)?|test\s+(?:value|window|duration|constant)|demo\s+(?:value|window|duration)|for\s+(?:fast\s+|quick\s+)?test(?:ing)?|regression\s+(?:value|window)/i,TIME_PROFILE_FLOOR_MS=0x36ee80;function timeProfileIsTimeQuery(a){if(typeof a==='number')return a===0x4f7||a===0x4f8||a===0x500||a===0x507;if(typeof a==='string')return/(^|\.)time$|current_time/i['test'](a);return![];}function timeProfileNodeChildren(a){const b=[];for(const c of['nodes','node','nodeLeft','nodeRight','parameters','historyIdx','sessionIdx','forwardIdx','where','find','recipient']){const d=a[c];if(Array['isArray'](d))b['push'](...d);else{if(d&&typeof d==='object')b['push'](d);}}return b;}export function guardTimeProfileDetail(a){const b=typeof a['description']==='string'?a['description']:'',c=TIME_PROFILE_ADMISSION_REGEX['test'](b);let d=0x0;for(const r of b['matchAll'](TIME_PROFILE_DURATION_REGEX)){const s=TIME_PROFILE_UNIT_MS[r[0x2]['toLowerCase']()];if(!s)continue;const t=Number(r[0x1])*s;if(Number['isFinite'](t)&&t>d)d=t;}if(!c&&d===0x0)return null;const e=Array['isArray'](a['table'])?a['table']:[],f=u=>{const v=e['find'](w=>Number(w?.['identifier'])===u);return numericAmount(v?.['value']);},h=u=>{if(!u||typeof u!=='object')return![];const v=u;if(v['type']==='context'&&v['context']==='Clock')return!![];if(v['type']==='query'&&timeProfileIsTimeQuery(v['query']))return!![];if(v['type']==='query_progress_history_time')return!![];if(v['type']==='query_progress_history_time_or_zero')return!![];return timeProfileNodeChildren(v)['some'](h);},i=u=>{const w=Number(u['identifier']),x=f(w);if(x===undefined||x<=0x0)return null;const y=e['find'](A=>Number(A?.['identifier'])===w),z=y&&typeof y['name']==='string'&&y['name']!==''?y['name']:null;return{'identifier':w,'name':z,'value':x};},j=u=>{if(!u||typeof u!=='object')return[];const v=u;if(v['type']==='identifier'){const w=i(v);return w?[w]:[];}return timeProfileNodeChildren(v)['flatMap'](j);},k=[],l=(u,v)=>{if(!u||typeof u!=='object')return;const w=u,x=v||typeof w['type']==='string'&&w['type']['startsWith']('calc_');if(x&&w['type']==='calc_number_multiply'){const y=j(w);y['length']>0x0&&k['push']({'identifier':y[0x0]['identifier'],'name':y['map'](z=>z['name']??'#'+z['identifier'])['join']('*'),'value':y['reduce']((z,A)=>z*A['value'],0x1)});return;}if(w['type']==='identifier'&&x){const z=i(w);if(z)k['push'](z);}for(const A of timeProfileNodeChildren(w))l(A,x);};if(a['root']&&typeof a['root']==='object'&&h(a['root']))l(a['root'],![]);const n=k['find'](u=>u['value']<d/0x64),o=u=>u>=0x5265c00?u/0x5265c00+'d':u>=0x36ee80?u/0x36ee80+'h':u>=0xea60?u/0xea60+'min':u/0x3e8+'s',p=u=>u['name']??'slot\x20#'+u['identifier'];if(n!==undefined)return{'level':'critical','detail':'time\x20constant\x20'+p(n)+'\x20=\x20'+o(n['value'])+'\x20is\x20>=100x\x20below\x20the\x20production\x20duration\x20the\x20description\x20itself\x20'+('declares\x20('+o(d)+')\x20—\x20a\x20compressed\x20test\x20value\x20frozen\x20into\x20a\x20production\x20guard.\x20Note:\x20operands\x20of\x20a\x20')+'calc_number_multiply\x20are\x20judged\x20as\x20their\x20PRODUCT\x20(a\x20duration\x20times\x20dimensionless\x20factors),\x20not\x20per-operand.\x20Guards\x20'+'freeze\x20at\x20publish\x20(IMMUT-001),\x20so\x20the\x20window\x20will\x20enforce\x20the\x20compressed\x20value\x20against\x20real\x20orders\x20'+'(klook\x20mainnet\x20261014:\x20\x2724h\x20free\x20cancellation\x27\x20enforced\x20as\x202\x20minutes).\x20Rebuild\x20the\x20guard\x20with\x20the\x20'+'production\x20duration\x20from\x20the\x20template\x20fee_params\x20BEFORE\x20publishing'};if(c)return{'level':'warning','detail':'description\x20admits\x20compressed/accelerated\x20time\x20constants,\x20but\x20NO\x20time\x20constant\x20in\x20this\x20guard\x27s\x20logic\x20'+'tree\x20is\x20>=100x\x20below\x20the\x20declared\x20production\x20duration\x20—\x20the\x20values\x20look\x20production-scaled.\x20Manual\x20'+'review\x20requested\x20(prose\x20alone\x20no\x20longer\x20blocks\x20publish,\x20BF-07):\x20confirm\x20the\x20tree\x20constants\x20match\x20the\x20'+'production\x20durations\x20in\x20the\x20template\x20fee_params\x20BEFORE\x20publishing\x20—\x20guards\x20freeze\x20at\x20publish\x20'+'(IMMUT-001),\x20so\x20a\x20mis-scaled\x20window\x20(klook\x20mainnet\x20261014:\x20\x2724h\x20free\x20cancellation\x27\x20enforced\x20as\x202\x20'+'minutes)\x20is\x20UNFIXABLE'};const q=k['find'](u=>u['value']<TIME_PROFILE_FLOOR_MS);if(q!==undefined)return{'level':'warning','detail':'time\x20constant\x20'+p(q)+'\x20=\x20'+o(q['value'])+'\x20is\x20below\x20the\x20'+TIME_PROFILE_FLOOR_MS/0x36ee80+'h\x20sanity\x20floor\x20'+'(the\x20description\x20declares\x20no\x20production\x20duration\x20and\x20admits\x20no\x20compression,\x20yet\x20the\x20window\x20is\x20'+'sub-hour)\x20—\x20almost\x20always\x20a\x20compressed\x20test\x20value\x20frozen\x20into\x20the\x20guard.\x20Guards\x20freeze\x20at\x20publish\x20'+'(IMMUT-001):\x20confirm\x20the\x20value\x20is\x20intended\x20for\x20LIVE\x20traffic,\x20or\x20rebuild\x20with\x20the\x20production\x20'+'duration\x20from\x20the\x20template\x20fee_params\x20BEFORE\x20mainnet\x20publish\x20(ddmc2\x20F-11:\x20a\x203-minute\x20filing\x20'+'window\x20permanently\x20revoked\x20a\x20buyer\x27s\x20dispute\x20right\x20on\x20one\x20transport\x20retry)'};return null;}export function rewardRefsOf(a){const b=a?.['rewards'];if(typeof b==='string'&&b['trim']()!=='')return[b];if(Array['isArray'](b))return b['filter'](c=>typeof c==='string'&&c['trim']()!=='');if(Array['isArray'](b?.['objects']))return b['objects']['filter'](c=>typeof c==='string'&&c['trim']()!=='');return[];}export function serviceRewardsUnfundedDetail(b){if(!b||typeof b!=='object')return null;const c=b['data']??b,d=Array['isArray'](c?.['guards'])?c['guards']:[],e=numericAmount(c?.['balance']?.['value']??c?.['balance']);if(e===undefined)return null;let f=0x0;for(const h of d){const i=h?.['amount'];if(i?.['type']!==0x1)continue;const j=numericAmount(i?.['value']?.['value']??i?.['value']);if(j!==undefined&&j>f)f=j;}if(f===0x0)return null;if(e>=f)return null;return'reward\x20pool\x20balance\x20'+e+'\x20cannot\x20cover\x20its\x20largest\x20single-claim\x20promise\x20('+f+').\x20'+'The\x20on-chain\x20publish\x20entry\x20does\x20NOT\x20verify\x20reward\x20funding\x20—\x20a\x20failed\x20reward_fund\x20transfer\x20still\x20'+'publishes\x20(onlyfans\x20mainnet\x20261014\x20shipped\x20a\x20store\x20promising\x20cashback\x20with\x20an\x20empty\x20pool),\x20and\x20the\x20'+'claim\x20aborts\x20once\x20the\x20pool\x20drains.\x20Fund\x20the\x20Reward\x20(reward_fund)\x20up\x20to\x20expected_orders\x20x\x20per-claim\x20'+'amount,\x20or\x20remove\x20the\x20reward\x20binding\x20BEFORE\x20publishing\x20this\x20service';}export const TASK_BINDING_REMEDIATION_ENTRY={'identifier':TASK_BINDING_SLOT,'b_submission':!![],'value_type':'Address','name':'task_binding\x20order\x20anchor\x20(protocol\x20slot\x20254;\x20written\x20by\x20order\x20creation)'};const TASK_BINDING_TRIGGER='the\x20triggering\x20Passport\x20must\x20submit\x20identifier\x20'+TASK_BINDING_SLOT+'\x20carrying\x20the\x20Order\x20address';export{declaresTaskBindingSlot};export const REFUND_RAIL_NODE_REGEX=/(^|_)(refund|refunded|cancel|cancelled|return|returned)(_|$)/i;export function lintTaskBindingAdvisories(a){const b=[];if(!Array['isArray'](a['table']))return b;const c=declaresTaskBindingSlot(a['table']),d=a['guardRef']!==undefined?'\x22'+a['guardRef']+'\x22':'this\x20guard';if(a['refundReentry']===!![]&&c)return b['push']({'code':'TASKBIND-254-REFUND-REPLAY','level':'warning','detail':'refund\x20rail\x20guard\x20'+d+'\x20declares\x20protocol\x20slot\x20'+TASK_BINDING_SLOT+'\x20(b_submission:\x20true).\x20'+(TASK_BINDING_SLOT+'\x20is\x20the\x20ONCE_FOR_OBJECT\x20task-binding\x20slot:\x20a\x20refund\x20rail\x20that\x20can\x20re-enter\x20its\x20')+'refund\x20node\x20in\x20a\x20later\x20period\x20(deposit\x20re-refund,\x20re-selected\x20order,\x20renewal\x20cycle)\x20re-fires\x20on\x20the\x20'+'SAME\x20order\x20and\x20aborts\x20E_ONCE_TRIGGERED\x20(code\x2016)\x20on\x20every\x20release\x20after\x20the\x20first\x20—\x20a\x20perpetual\x20'+('abort,\x20not\x20a\x20one-time\x20failure\x20(OFN\x20#P-04).\x20Remove\x20the\x20'+TASK_BINDING_SLOT+'\x20row\x20and\x20anchor\x20the\x20payee\x20')+'on\x20a\x20user\x20submission\x20slot\x20(slot\x200,\x20the\x20submitted\x20Order)\x20instead.\x20Guards\x20are\x20create-frozen\x20and\x20'+'order_allocators\x20freeze\x20at\x20service\x20publish\x20—\x20correct\x20it\x20BEFORE\x20the\x20irreversible\x20write.','remediation':{'entry':TASK_BINDING_REMEDIATION_ENTRY,'trigger':'delete\x20the\x20254\x20row;\x20pay\x20the\x20refund\x20through\x20a\x20user\x20slot\x20(slot\x200)\x20that\x20the\x20trigger\x20Passport\x20submits\x20'+'with\x20the\x20Order\x20address'}}),b;return a['allocatorBound']===!![]&&!c&&b['push']({'code':'TASKBIND-254-MISSING','level':'warning','detail':'allocator-bound\x20hand-composed\x20guard\x20'+d+'\x20declares\x20no\x20{identifier:\x20'+TASK_BINDING_SLOT+',\x20'+'b_submission:\x20true,\x20value_type:\x20\x22Address\x22}\x20row.\x20The\x20passport\x20only\x20emits\x20DECLARED\x20slots,\x20so\x20once\x20an\x20'+'order-bound\x20path\x20uses\x20this\x20guard\x20every\x20guarded\x20forward\x20aborts\x20(code\x2011)\x20—\x20and\x20a\x20NEW\x20buyer\x27s\x20first\x20'+'order\x20is\x20the\x20one\x20that\x20hits\x20the\x20254\x20placeholder\x20immediately.\x20Add\x20the\x20row\x20below;\x20the\x20trigger\x20Passport\x20'+('must\x20submit\x20identifier\x20'+TASK_BINDING_SLOT+'\x20(the\x20Order\x20address).\x20Guards\x20are\x20create-frozen\x20and\x20machine\x20')+'topology\x20/\x20order_allocators\x20freeze\x20at\x20publish\x20—\x20correct\x20it\x20BEFORE\x20the\x20irreversible\x20write.','remediation':{'entry':TASK_BINDING_REMEDIATION_ENTRY,'trigger':TASK_BINDING_TRIGGER}}),b;}export function lintMachineTaskBindingPreflight(a){if(!Array['isArray'](a['refs'])||a['refs']['length']===0x0)return[];if(a['resolved']['some'](f=>declaresTaskBindingSlot(f['table'])))return[];const b=new Set(a['resolved']['map'](f=>f['ref']['toLowerCase']())),c=a['refs']['filter'](f=>!b['has'](f['toLowerCase']())),d='NONE\x20of\x20this\x20machine\x27s\x20'+a['refs']['length']+'\x20forward\x20guard(s)\x20declares\x20the\x20protocol\x20slot\x20'+(TASK_BINDING_SLOT+'\x20Address\x20submission\x20row.\x20A\x20settlement/claim\x20guard\x20shared\x20with\x20an\x20allocator\x20rail,\x20and\x20every\x20')+'order-bound\x20forward,\x20will\x20abort\x20(code\x2011)\x20once\x20a\x20Service\x20attaches\x20—\x20a\x20new\x20buyer\x27s\x20first\x20order\x20hits\x20the\x20'+'placeholder\x20immediately.',e=a['readError']!==undefined?'the\x20forward-guard\x20definitions\x20could\x20not\x20be\x20read\x20('+a['readError']+'),\x20so\x20the\x20'+TASK_BINDING_SLOT+'\x20'+('declaration\x20is\x20UNVERIFIED.\x20Verify\x20'+d+'\x20Add\x20{identifier:\x20'+TASK_BINDING_SLOT+',\x20b_submission:\x20true,\x20')+'value_type:\x20\x22Address\x22}\x20to\x20each\x20guard\x20BEFORE\x20publish;\x20machine\x20topology\x20is\x20immutable\x20after\x20publish\x20and\x20'+'guards\x20are\x20create-frozen.':d+(c['length']>0x0?'\x20'+c['length']+'\x20ref(s)\x20could\x20not\x20be\x20resolved\x20by\x20this\x20read\x20('+c['join'](',\x20')+')\x20—\x20'+'their\x20declarations\x20are\x20unverified.':'')+('\x20Add\x20{identifier:\x20'+TASK_BINDING_SLOT+',\x20b_submission:\x20true,\x20value_type:\x20\x22Address\x22}\x20to\x20each\x20guard\x27s\x20table\x20')+'BEFORE\x20publish;\x20machine\x20topology\x20is\x20immutable\x20after\x20publish\x20(IMMUT-001)\x20and\x20guards\x20are\x20create-frozen.';return[{'code':a['readError']!==undefined?'TASKBIND-254-UNVERIFIED':'TASKBIND-254-MISSING','level':'warning','detail':e,'remediation':{'entry':TASK_BINDING_REMEDIATION_ENTRY,'trigger':TASK_BINDING_TRIGGER}}];}export function formatTaskBindingAdvisory(a,b='pre_publish'){return b+':\x20task-binding\x20advisory\x20['+a['code']+']\x20'+a['detail'];}export const AUDIT_RULES=[{'id':'audit_machine_bound','description':'Service\x20should\x20have\x20a\x20Machine\x20workflow\x20bound\x20before\x20publish','severity':'warning','fields':['machine'],'check':(a,b)=>{if(!a?.['publish'])return!![];return!!a?.['machine'];},'message':()=>'Publishing\x20a\x20service\x20without\x20a\x20Machine\x20workflow.\x20Customers\x20won\x27t\x20have\x20a\x20structured\x20order\x20process.','recommendation':'Create\x20a\x20Machine\x20(workflow\x20template)\x20and\x20bind\x20it\x20to\x20the\x20service\x20before\x20publishing.\x20The\x20machine\x20field\x20becomes\x20IMMUTABLE\x20after\x20publish.'},{'id':'audit_order_allocators','description':'Service\x20should\x20have\x20order_allocators\x20for\x20fund\x20distribution','severity':'warning','fields':['order_allocators'],'check':a=>{if(!a?.['publish'])return!![];return allocatorCountOf(a)>0x0;},'message':()=>'Publishing\x20a\x20service\x20without\x20order_allocators.\x20Order\x20funds\x20cannot\x20be\x20auto-distributed\x20to\x20suppliers.','recommendation':'Configure\x20order_allocators\x20before\x20publishing\x20—\x20this\x20field\x20becomes\x20IMMUTABLE\x20after\x20publish.'},{'id':'audit_buy_guard','description':'Service\x20should\x20have\x20a\x20buy_guard\x20for\x20customer\x20screening','severity':'info','fields':['buy_guard'],'check':a=>!!a?.['buy_guard'],'message':()=>'No\x20buy_guard\x20configured\x20—\x20anyone\x20can\x20purchase\x20this\x20service\x20without\x20verification.','recommendation':'Consider\x20adding\x20a\x20Guard\x20to\x20verify\x20customer\x20eligibility\x20(e.g.,\x20identity,\x20wallet\x20balance,\x20location).'},{'id':'audit_arb_alloc_boundary','description':'Arbitration\x20and\x20Allocator\x20coexist\x20→\x20surface\x20the\x20two-system\x20boundary\x20reminder','severity':'warning','fields':['arbitrations','compensation_fund_add','compensation_fund','order_allocators'],'check':a=>{if(!a?.['publish'])return!![];const b=arbitrationRefsOf(a)['length']>0x0||compensationFundOf(a)!==undefined;return!(b&&allocatorCountOf(a)>0x0);},'message':()=>'Arbitration\x20and\x20Allocator\x20are\x20INDEPENDENT\x20systems\x20by\x20design:\x20a\x20ruling\x20records\x20the\x20case\x20and\x20pays\x20from\x20the\x20service\x20compensation\x20fund\x20—\x20it\x20never\x20moves\x20escrow\x20and\x20never\x20advances\x20the\x20workflow.\x20Two-rail\x20independence\x20(decision\x2011):\x20the\x20escrow\x20refund\x20and\x20the\x20arbitration\x20award\x20are\x20separate\x20commercial\x20payouts\x20on\x20independent\x20tracks\x20—\x20a\x20buyer\x20MAY\x20collect\x20BOTH,\x20which\x20is\x20legal\x20and\x20disclosed\x20at\x20the\x20MCP\x20dual-payout\x20confirmation\x20gate.\x20This\x20is\x20a\x20boundary\x20reminder,\x20not\x20a\x20defect.','recommendation':'Keep\x20the\x20refund/settlement\x20rail\x20NODE-gated\x20(terminal\x20refund/settle\x20node)\x20and\x20free\x20of\x20any\x20order.claimed_by\x20leg\x20(decision\x2011:\x20RAIL_CLAIMED_BY_LEG\x20/\x20R-FUND-RAIL-CLAIMED-BY\x20critical\x20backstop).\x20Disclose\x20the\x20refund+award\x20overlap\x20at\x20the\x20dual-payout\x20confirmation\x20gate\x20instead\x20of\x20engineering\x20a\x20mutual\x20exclusion.\x20Do\x20NOT\x20couple\x20the\x20systems\x20the\x20other\x20way\x20(no\x20dispute\x20state\x20on\x20the\x20order\x20flow,\x20no\x20workflow\x20step\x20into\x20arbitration).\x20For\x20per-case\x20fund\x20actions,\x20the\x20deposit-reimbursement\x20pattern\x20(guard-design\x20patterns)\x20is\x20the\x20supported\x20route.'},{'id':'audit_compensation_fund','description':'Service\x20should\x20have\x20a\x20compensation_fund\x20for\x20trust','severity':'warning','fields':['compensation_fund_add','compensation_fund'],'check':a=>compensationFundOf(a)!==undefined,'message':()=>'No\x20compensation_fund\x20configured.\x20Customers\x20have\x20no\x20financial\x20protection\x20if\x20you\x20fail\x20to\x20deliver.','recommendation':'Deposit\x20via\x20compensation_fund_add\x20{balance}\x20to\x20enable\x20arbitration\x20payouts.\x20The\x20fund\x20deters\x20fraud\x20and\x20enables\x20arbitration\x20claims.'},{'id':'audit_arbitrations','description':'Service\x20should\x20have\x20arbitration\x20options\x20for\x20dispute\x20resolution','severity':'info','fields':['arbitrations'],'check':a=>arbitrationRefsOf(a)['length']>0x0,'message':()=>'No\x20arbitration\x20configured.\x20Disputes\x20cannot\x20be\x20resolved\x20through\x20a\x20third\x20party.','recommendation':'Add\x20at\x20least\x20one\x20Arbitration\x20object\x20via\x20arbitrations:{op:\x27add\x27,\x20objects:[...]}\x20to\x20enable\x20on-chain\x20dispute\x20resolution.'},{'id':'audit_arbitration_removal_strands_awards','description':'Removing\x20an\x20authorized\x20venue\x20can\x20strand\x20an\x20award\x20it\x20already\x20ruled\x20on','severity':'error','fields':['arbitrations'],'check':a=>{const b=a?.['arbitrations']?.['remove']??a?.['arbitrations']?.['clear'],c=Array['isArray'](b)?b['length']>0x0:a?.['arbitrations']?.['op']==='clear';if(!c)return!![];if(arbitrationRefsOf(a)['length']>0x0)return!![];return compensationFundOf(a)===undefined;},'message':a=>{const b=a?.['arbitrations']?.['clear']?'every\x20authorized\x20venue':'venue(s)\x20'+(a?.['arbitrations']?.['remove']??[])['join'](',\x20');return'Removing\x20'+b+'\x20while\x20a\x20compensation\x20fund\x20is\x20configured\x20makes\x20any\x20award\x20it\x20already\x20ruled\x20on\x20UNPAYABLE:\x20an\x20on-chain\x20payout\x20now\x20requires\x20the\x20deciding\x20venue\x20to\x20still\x20be\x20on\x20the\x20Service\x27s\x20allowlist,\x20so\x20paying\x20out\x20aborts\x20with\x20E_ARBITRATION_NOT_ALLOWED=39\x20and\x20the\x20escrowed\x20funds\x20stay\x20stranded.';},'recommendation':'Before\x20removing\x20a\x20venue,\x20confirm\x20no\x20case\x20it\x20ruled\x20on\x20is\x20still\x20awaiting\x20compensation\x20payout\x20(query\x20the\x20Arb\x20objects\x20for\x20status\x20Arbitrated,\x20not\x20Finished).\x20Add\x20the\x20replacement\x20venue\x20FIRST,\x20drain\x20the\x20old\x20venue\x27s\x20cases,\x20and\x20only\x20then\x20remove\x20it.\x20A\x20buyer\x20should\x20never\x20be\x20left\x20holding\x20an\x20uncollectable\x20award.'},{'id':'audit_price','description':'Service\x20should\x20have\x20at\x20least\x20one\x20priced\x20sale\x20item','severity':'error','fields':['sales'],'check':a=>{const b=salesItemsOf(a);if(b['length']===0x0)return!![];return b['some'](c=>c?.['price']!==undefined&&c?.['price']!==null);},'message':()=>'Sales\x20list\x20present\x20but\x20no\x20item\x20has\x20a\x20price.\x20Customers\x20cannot\x20place\x20orders\x20without\x20knowing\x20the\x20cost.','recommendation':'Set\x20price\x20on\x20each\x20sales\x20item\x20(smallest-unit\x20string\x20or\x20display\x20form\x20like\x20\x272.5WOW\x27).'},{'id':'audit_compensation_fund_covers_award_ceiling','description':'compensation_fund\x20should\x20cover\x20the\x203x\x20award\x20ceiling\x20of\x20the\x20largest\x20sale\x20(disclosure)','severity':'warning','fields':['compensation_fund_add','compensation_fund','sales'],'check':a=>{if(!a?.['publish'])return!![];const b=compensationFundOf(a);if(b===undefined)return!![];const c=numericAmount(b);if(c===undefined)return!![];if(c===0x0)return![];const e=salesItemsOf(a)['map'](g=>numericAmount(g?.['price']))['filter'](g=>g!==undefined&&g>0x0);if(e['length']===0x0)return!![];const f=e['reduce']((g,h)=>g+h,0x0);return c>=MAX_INDEMNITY_MULTIPLE*f;},'message':()=>'compensation_fund\x20does\x20not\x20cover\x20the\x20award\x20ceiling\x20of\x20the\x20largest\x20sale.\x20An\x20award\x20is\x20hard-capped\x20at\x20'+MAX_INDEMNITY_MULTIPLE+'x\x20'+'the\x20order\x20amount\x20(the\x20MAX_INDEMNITY_MULTIPLE\x20cap,\x20enforced\x20at\x20ruling\x20time),\x20so\x20a\x20ruling\x20at\x20the\x20ceiling\x20'+'would\x20abort\x20the\x20buyer\x27s\x20claim\x20with\x2027\x20(E_COMPENSATION_NOT_MATCH)\x20—\x20the\x20ruling\x20stands\x20but\x20is\x20unpayable\x20'+'until\x20you\x20deposit,\x20and\x20the\x20abort\x20does\x20NOT\x20consume\x20the\x20claim.\x20Disclosure\x20only:\x20this\x20no\x20longer\x20blocks\x20'+'publish\x20—\x20per-order\x20coverage\x20is\x20enforced\x20at\x20BUY\x20time\x20(the\x20buyer\x27s\x20order\x20is\x20rejected\x20while\x20the\x20fund\x20'+'cannot\x20cover\x203x\x20that\x20order),\x20so\x20under-ceiling\x20funding\x20stops\x20sales\x20instead\x20of\x20stranding\x20awards.','recommendation':'For\x20every\x20order\x20you\x20want\x20to\x20sell,\x20keep\x20the\x20fund\x20at\x20>=\x20'+MAX_INDEMNITY_MULTIPLE+'x\x20THAT\x20order\x20via\x20'+'compensation_fund_add\x20(a\x200.49\x20course\x20needs\x201.47;\x20a\x203.99\x20course\x20needs\x2011.97\x20—\x20no\x20cross-SKU\x20subsidy).\x20'+('Above\x20'+MAX_INDEMNITY_MULTIPLE+'x\x20the\x20current\x20order\x20is\x20optional:\x20it\x20only\x20buys\x20tolerance\x20for\x20several\x20')+'CONCURRENT\x20claims\x20against\x20the\x20one\x20per-Service\x20pool\x20(there\x20is\x20no\x20on-chain\x20concurrency\x20limit),\x20which\x20'+'is\x20a\x20capital-allocation\x20choice.\x20A\x20service\x20with\x20NO\x20fund\x20sells\x20freely\x20—\x20that\x20is\x20the\x20documented\x20'+'no-protection\x20posture\x20(audit_compensation_fund\x20discloses\x20it;\x20buyers\x20see\x20coverage\x20via\x20order\x20monitor).'},{'id':'audit_description','description':'Service\x20should\x20have\x20a\x20description','severity':'warning','fields':['description'],'check':a=>typeof a?.['description']==='string'&&a['description']['length']>0x0,'message':()=>'Service\x20has\x20no\x20description.\x20Customers\x20won\x27t\x20understand\x20what\x20you\x27re\x20offering.','recommendation':'Write\x20a\x20clear\x20description\x20of\x20the\x20service,\x20including\x20deliverables,\x20timelines,\x20and\x20terms.'},{'id':'audit_named_new_name','description':'Service\x20being\x20created\x20should\x20have\x20a\x20name','severity':'warning','check':a=>serviceNameOf(a)!==undefined,'message':()=>'Creating\x20a\x20service\x20without\x20a\x20name\x20makes\x20it\x20hard\x20to\x20reference\x20and\x20organize.','recommendation':'Set\x20object:{name:\x20...}\x20(or\x20namedNew.name)\x20following\x20the\x20convention:\x20<projectPrefix>_<service>_<purpose>.'},{'id':'audit_customer_required_needs_um','description':'customer_required\x20requires\x20a\x20Contact\x20bound\x20via\x20um\x20(SDK-enforced\x20hard\x20link;\x20mirrored\x20here)','severity':'error','fields':['customer_required','um'],'check':a=>{const b=Array['isArray'](a?.['customer_required'])?a['customer_required']:[];if(b['length']===0x0)return!![];return!!a?.['um'];},'message':()=>'customer_required\x20is\x20set\x20but\x20no\x20Contact\x20is\x20bound\x20via\x20um\x20—\x20customers\x20cannot\x20deliver\x20the\x20required\x20private\x20information\x20through\x20end-to-end\x20encrypted\x20Messenger.','recommendation':'Bind\x20um:{Contact\x20name/id}\x20in\x20the\x20same\x20call\x20(SDK\x20order_new\x20will\x20fail\x20the\x20buyer\x20otherwise).'},{'id':'audit_customer_required_is_declared_not_enforced','description':'customer_required\x20has\x20no\x20on-chain\x20enforcement\x20at\x20buy\x20time\x20—\x20a\x20Guard\x20must\x20gate\x20fulfilment','severity':'warning','fields':['customer_required'],'check':a=>{const b=Array['isArray'](a?.['customer_required'])?a['customer_required']:[];return b['length']===0x0;},'message':a=>{const b=Array['isArray'](a?.['customer_required'])?a['customer_required']:[];return'customer_required\x20('+b['length']+'\x20field(s):\x20'+b['join'](',\x20')+')\x20is\x20DECLARATIVE\x20ONLY:\x20the\x20on-chain\x20purchase\x20entry\x20never\x20reads\x20this\x20list,\x20so\x20an\x20order\x20that\x20supplies\x20none\x20of\x20these\x20fields\x20is\x20still\x20created\x20and\x20progresses.\x20Nothing\x20on-chain\x20will\x20stop\x20it.';},'recommendation':'Bind\x20pattern.required_info_evidence_gate\x20(schema_query\x20action=get_guard_design_patterns)\x20on\x20the\x20first\x20forward\x20that\x20needs\x20the\x20information:\x20query\x20\x27order.required_info\x20some\x27\x20(1572)\x20over\x20the\x20Order.\x20The\x20buyer\x20records\x20the\x20credential\x20via\x20order_required_info_update:\x20EITHER\x20the\x20merchant\x27s\x20IM\x20user\x20address\x20resolved\x20from\x20the\x20Service\x27s\x20Contact\x20(zero\x20cost,\x20address\x20record\x20only)\x20OR\x20an\x20on-chain\x20WTS\x20Proof\x20object\x20address\x20(embeds\x20the\x20merchant\x20IM\x20address\x20and\x20the\x20last-message\x20timestamp;\x20costs\x20gas,\x20publicly\x20verifiable).\x20\x27order.required_info\x27\x20(1573)\x20returns\x20the\x20recorded\x20address\x20but\x20aborts\x20while\x20nothing\x20is\x20recorded\x20—\x20gate\x20on\x201572\x20first.\x20When\x20the\x20listing\x20genuinely\x20promises\x20a\x20PER-ORDER\x20credential,\x20prefer\x20the\x20controlled\x20bind\x20entry\x20(order_required_info_bind):\x20the\x20chain\x20verifies\x20the\x20Proof\x20is\x20about\x20THIS\x20order\x20and\x20owner-created\x20at\x20write\x20time\x20and\x20rejects\x20a\x20mismatch\x20—\x20no\x20guard\x20needed\x20to\x20catch\x20a\x20wrong-proof\x20record.\x20BOUNDARY:\x20that\x20binding\x20proves\x20the\x20credential\x20AUTHOR\x20only,\x20never\x20its\x20content\x20or\x20any\x20rating\x20—\x20do\x20not\x20mirror\x20it\x20onto\x20review/reward\x20claims;\x20public\x20reviews\x20are\x20Repository\x20rows\x20whose\x20values\x20are\x20enforced\x20guard-side\x20via\x20data-value\x20probes,\x20not\x20through\x20Proof\x20objects.'},{'id':'audit_dangling_deps','description':'Service\x20dependencies\x20should\x20be\x20fully\x20created','severity':'error','check':(a,b)=>{if(!a?.['publish'])return!![];if(!b?.['graph'])return!![];const c=b['graph']['findDanglingDependencies']()??[];return c['length']===0x0;},'message':()=>'Service\x20references\x20objects\x20that\x20are\x20not\x20yet\x20created.\x20Publishing\x20will\x20lock\x20these\x20references.','recommendation':'Ensure\x20all\x20referenced\x20objects\x20(machine,\x20allocators,\x20guards)\x20are\x20created\x20and\x20finalized\x20before\x20publishing.'},{'id':'audit_type_parameter','description':'Service\x20should\x20have\x20a\x20token\x20type\x20specified','severity':'info','fields':['type_parameter','namedNew'],'check':a=>typeParameterOf(a)!==undefined,'message':()=>'No\x20payment\x20token\x20type\x20specified.\x20Defaulting\x20to\x20WOW\x20(0x2::wow::WOW).','recommendation':'Explicitly\x20set\x20type_parameter\x20(inside\x20object:{...})\x20if\x20you\x20want\x20to\x20accept\x20non-WOW\x20tokens\x20(e.g.,\x20USDT,\x20ETH).'},{'id':'audit_wip_unreachable_url','description':'sale.wip\x20must\x20be\x20a\x20publicly\x20reachable\x20URL\x20(no\x20localhost/LAN/file\x20paths)','severity':'error','fields':['sales'],'check':(a,b)=>{if(typeof b?.['network']==='string'&&/local/i['test'](b['network']))return!![];const c=salesItemsOf(a);if(c['length']===0x0)return!![];return c['every'](e=>{const f=e?.['wip'];if(typeof f!=='string'||f['trim']()==='')return!![];return!/^(https?:\/\/)?(localhost|127\.0\.0\.1|\[::1\]|0\.0\.0\.0)/i['test'](f)&&!/^https?:\/\/(192\.168\.|10\.|172\.(1[6-9]|2\d|3[01])\.)/i['test'](f)&&!/^file:/i['test'](f);});},'message':a=>{const b=salesItemsOf(a)['map'](c=>String(c?.['wip']??''))['filter'](c=>c!==''&&(/^(https?:\/\/)?(localhost|127\.0\.0\.1|\[::1\]|0\.0\.0\.0)/i['test'](c)||/^https?:\/\/(192\.168\.|10\.|172\.(1[6-9]|2\d|3[01])\.)/i['test'](c)||/^file:/i['test'](c)));return'sale.wip\x20is\x20NOT\x20publicly\x20reachable\x20('+b['join'](',\x20')+').\x20The\x20URL\x20is\x20stored\x20on-chain\x20and\x20every\x20'+'customer\x20fetches\x20it\x20at\x20order\x20time\x20—\x20order_new\x20aborts\x20100%\x20for\x20anyone\x20outside\x20your\x20machine.\x20'+'Host\x20the\x20file\x20publicly:\x20wip_file\x20upload\x20to\x20the\x20official\x20free\x20host\x20(wip.store.wowok.net)\x20or\x20your\x20own\x20'+'endpoint\x20(GitHub\x20Pages\x20/\x20IPFS\x20/\x20your\x20website)';},'recommendation':'Replace\x20the\x20internal\x20URL\x20with\x20a\x20public\x20one.\x20Internal\x20URLs\x20are\x20sanctioned\x20ONLY\x20on\x20env.network=localnet\x20for\x20testing.'},{'id':'audit_wip_missing_public','description':'On\x20public\x20networks\x20every\x20sale\x20item\x20should\x20carry\x20a\x20product-detail\x20(wip)\x20URL','severity':'info','fields':['sales'],'check':(a,b)=>{const c=b?.['network'];if(typeof c==='string'&&/local/i['test'](c))return!![];const e=salesItemsOf(a);if(e['length']===0x0)return!![];return e['every'](f=>typeof f?.['wip']==='string'&&f['wip']['trim']()!=='');},'message':()=>'One\x20or\x20more\x20sale\x20items\x20have\x20NO\x20product-detail\x20(wip)\x20URL.\x20The\x20listing\x20works,\x20but\x20customers\x20see\x20no\x20detail\x20'+'page\x20and\x20the\x20service\x27s\x20market\x20completeness\x20score\x20is\x20downgraded.\x20Easiest:\x20upload\x20the\x20detail\x20file\x20with\x20the\x20'+'wip_file\x20tool\x20to\x20the\x20official\x20free\x20host\x20(https://wip.store.wowok.net\x20—\x2010\x20files\x20per\x20account,\x20180-day\x20'+'retention,\x2012MB/file)\x20and\x20put\x20the\x20returned\x20URL\x20into\x20sale.wip;\x20or\x20host\x20your\x20own\x20(GitHub\x20Pages\x20/\x20IPFS\x20/\x20'+'your\x20website).\x20For\x20long-lived\x20mainnet\x20listings\x20prefer\x20your\x20own\x20endpoint\x20so\x20the\x20detail\x20outlives\x20the\x20free\x20'+'retention\x20window','recommendation':'Upload\x20a\x20WIP\x20file\x20via\x20wip_file\x20and\x20set\x20sale.wip\x20on\x20each\x20item\x20before/after\x20publish\x20(sales\x20stays\x20modifiable).'},{'id':'audit_free_cancel_window_anchor','description':'A\x20free-cancellation\x20window\x20must\x20either\x20ride\x20the\x20stay-date\x20Repository\x20rail\x20or\x20be\x20disclosed\x20as\x20anchored\x20on\x20booking\x20time','severity':'warning','fields':['creation_plan'],'check':(a,b)=>{if(!a?.['publish'])return!![];const c=Array['isArray'](a?.['creation_plan']?.['guards'])?a['creation_plan']['guards']:[],e=c['some'](h=>{const i=typeof h?.['key']==='string'?h['key']:'',j=typeof h?.['purpose']==='string'?h['purpose']:'';return/free[._ ]?cancel/i['test'](i)||/cancell?ation/i['test'](j)&&/window|hours?|days?/i['test'](j);});if(!e)return!![];const f=c['some'](h=>{const i=typeof h?.['template_id']==='string'?h['template_id']:'',j=typeof h?.['purpose']==='string'?h['purpose']:'',k=/repository_data_check/i['test'](i)&&/stay[._ ]?date|use[._ ]?date|check[._ ]?in[._ ]?date|arrival/i['test'](j),l=/anchored on (booking|order\.time)|booking time by default|service_start_ms|absolute (service|departure|event|use) (start|date)/i['test'](j);return k||l;});return f;},'message':()=>'A\x20free-cancellation\x20window\x20is\x20declared\x20WITHOUT\x20a\x20stay-date\x20anchor\x20and\x20WITHOUT\x20a\x20booking-time\x20disclosure.\x20'+'The\x20chain\x20has\x20no\x20use-date\x20primitive\x20(order.time\x20is\x20the\x20BOOKING\x20moment\x20—\x20written\x20once,\x20immutable),\x20so\x20the\x20'+'window\x20enforces\x20as\x20\x27from\x20booking\x27.\x20If\x20your\x20buyer-facing\x20copy\x20promises\x20\x27X\x20hours\x20before\x20arrival/check-in\x27,\x20'+'the\x20promised\x20window\x20has\x20typically\x20ALREADY\x20CLOSED\x20at\x20booking\x20(bkd8\x20BK-02,\x20live\x20mainnet)\x20—\x20a\x20silent\x20policy\x20'+'inversion\x20that\x20mis-sells\x20the\x20listing.\x20TWO\x20WAYS\x20OUT:\x20(1)\x20FAITHFUL\x20WINDOW\x20—\x20ride\x20the\x20STAY-DATE\x20PRESCRIPTION\x20'+'(time_anchors.free_cancel\x20in\x20the\x20travel\x20templates):\x20a\x20batched\x20id_from\x20None(0)\x20\x27stay_date\x27\x20row\x20(u64\x20epoch-ms)\x20'+'written\x20into\x20the\x20order-scoped\x20Repository\x20at\x20buy\x20time,\x20plus\x20a\x20pattern.repository_data_check\x20leg\x20comparing\x20'+'Clock\x20against\x20row\x20+\x20window\x20offset\x20(CLOSING\x20<=);\x20(2)\x20HONEST\x20DEFAULT\x20—\x20keep\x20the\x20booking-time\x20anchor\x20and\x20state\x20'+'\x27free\x20cancellation\x20within\x20X\x20hours\x20of\x20BOOKING\x27\x20in\x20the\x20buyer-facing\x20copy\x20so\x20the\x20promise\x20matches\x20the\x20chain','recommendation':'Either\x20add\x20the\x20stay-date\x20Repository\x20row\x20+\x20repository_data_check\x20leg\x20(faithful\x20pre-use\x20window),\x20or\x20restate\x20the\x20cancellation\x20policy\x20as\x20\x27from\x20booking\x27\x20in\x20all\x20buyer-facing\x20copy.'}];function readSeverityOverrides(){try{const {getJudgmentDoc:a}=require('../config/judgment.js');if(typeof a!=='function')return{};const b=a()?.['rules']?.['domains'];if(!b||typeof b!=='object')return{};const c={};for(const d of Object['values'](b)){const e=d?.['severity_overrides'];if(!e||typeof e!=='object')continue;for(const [f,g]of Object['entries'](e)){if(g==='error'||g==='warning'||g==='info')c[f]=g;}}return c;}catch{return{};}}export function auditService(a,b){const c=[],d=a?.['publish']===!![]&&typeof a?.['object']==='string',e=readSeverityOverrides();for(const f of AUDIT_RULES){try{if(d&&f['fields']&&!f['fields']['some'](g=>a[g]!==undefined))continue;!f['check'](a,b)&&c['push']({'rule_id':f['id'],'severity':e[f['id']]??f['severity'],'message':f['message'](a),'recommendation':f['recommendation']});}catch{}}return c;}export function hasBlockingErrors(a){return a['some'](b=>b['severity']==='error');}export function getErrors(a){return a['filter'](b=>b['severity']==='error');}export function getWarnings(a){return a['filter'](b=>b['severity']==='warning');}export function summarizeFindings(a){if(a['length']===0x0)return'All\x20audit\x20checks\x20passed.';const b=getErrors(a),c=getWarnings(a),d=a['filter'](g=>g['severity']==='info'),e=[];if(b['length']>0x0)e['push'](b['length']+'\x20error(s)');if(c['length']>0x0)e['push'](c['length']+'\x20warning(s)');if(d['length']>0x0)e['push'](d['length']+'\x20info');return'Audit:\x20'+e['join'](',\x20')+'.\x20Review\x20before\x20publishing.';}export const AUDIT_RULES_VERSION=0xc;
|
|
@@ -44,7 +44,8 @@
|
|
|
44
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
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
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'
|
|
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).",
|
|
48
49
|
"has_submission": "KERNEL — the table has at least one b_submission=true entry.",
|
|
49
50
|
"scene_present": "KERNEL — a binding scene was supplied.",
|
|
50
51
|
"scene_id": "KERNEL — the binding scene id (e.g. service_order_allocators_guard).",
|
|
@@ -402,15 +403,15 @@
|
|
|
402
403
|
{
|
|
403
404
|
"rule_id": "R-C2-07",
|
|
404
405
|
"dimension": "data_source_trust",
|
|
405
|
-
"trigger": "Guard uses a repository.data 'keys where' predicate (
|
|
406
|
+
"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)",
|
|
406
407
|
"cases": [
|
|
407
408
|
{
|
|
408
409
|
"when": { "field": "rc2_07_keys_where_count", "op": "gt", "value": 0 },
|
|
409
410
|
"level": "high",
|
|
410
|
-
"title": "
|
|
411
|
-
"description": "
|
|
412
|
-
"scenario": "Native abort:
|
|
413
|
-
"mitigation": "1)
|
|
411
|
+
"title": "keys-where query parameter shape diverges from the native signature",
|
|
412
|
+
"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}",
|
|
413
|
+
"scenario": "Native abort: a keys-where node with a parameter arity/type mismatch fails verification with GUARD_QUERY_PARAM_INVALID",
|
|
414
|
+
"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",
|
|
414
415
|
"stakeholders": ["provider", "customer"]
|
|
415
416
|
}
|
|
416
417
|
]
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"operate_next_node_name": "The target node name of the operate op (display form).",
|
|
26
26
|
"forward_named_operator": "The namedOperator governing the forward being advanced (echo).",
|
|
27
27
|
"forward_named_op_bypass": "True when the forward advance rides the namedOperator short-circuit, skipping the 220-225 permission-index check.",
|
|
28
|
-
"forward_payer_scope": "True when the forward being advanced has namedOperator=\"\" (the reserved order-payer namespace) — payer-only authority: off the order-bound entry the advance asserts order-payer power, and a taskless Progress fails closed (
|
|
28
|
+
"forward_payer_scope": "True when the forward being advanced has namedOperator=\"\" (the reserved order-payer namespace) — payer-only authority: off the order-bound entry the advance asserts order-payer power, and a taskless Progress fails closed earlier (E_ORDER_TASK_REQUIRED — C-F06 split, the task assert precedes the payer check).",
|
|
29
29
|
"forward_has_guard_display": "Echo of whether the forward carries a Guard (display form).",
|
|
30
30
|
"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).",
|
|
31
31
|
"machine_published_false": "True when the context explicitly marks the Machine as unpublished (strict false).",
|
|
@@ -229,13 +229,13 @@
|
|
|
229
229
|
{
|
|
230
230
|
"rule_id": "R-PR-3-04",
|
|
231
231
|
"dimension": "permission",
|
|
232
|
-
"trigger": "Forward namedOperator=\"\" (order-payer namespace) — payer-only authority; taskless fail-closed (
|
|
232
|
+
"trigger": "Forward namedOperator=\"\" (order-payer namespace) — payer-only authority; taskless fail-closed (E_ORDER_TASK_REQUIRED)",
|
|
233
233
|
"cases": [
|
|
234
234
|
{
|
|
235
235
|
"when": { "field": "forward_payer_scope", "op": "eq", "value": true },
|
|
236
236
|
"level": "high",
|
|
237
237
|
"title": "Forward names the order payer — generic-entry advance aborts E_ORDER_PAYER_REQUIRED",
|
|
238
|
-
"description": "Forward \"${operate_forward}\" has namedOperator=\"\" — the reserved order-payer namespace. Only the payer of the bound Order (or an address holding op-permission on that Order) may drive it: generic entries (next/hold, with or without passport) assert payer authority and abort with E_ORDER_PAYER_REQUIRED otherwise
|
|
238
|
+
"description": "Forward \"${operate_forward}\" has namedOperator=\"\" — the reserved order-payer namespace. Only the payer of the bound Order (or an address holding op-permission on that Order) may drive it: generic entries (next/hold, with or without passport) assert payer authority and abort with E_ORDER_PAYER_REQUIRED otherwise; a taskless Progress (task=null) fails closed earlier with E_ORDER_TASK_REQUIRED (C-F06 split — no payer exists to name, so the forward is un-executable by design).",
|
|
239
239
|
"scenario": "An operator presses a buyer-owned (order-payer) edge from a generic entry, or a standalone machine is designed with \"\" forwards",
|
|
240
240
|
"mitigation": "Drive the step as the order payer via the order-bound path (the SDK auto-routes progress.operate to the order entries when the task is an Order), or grant the address op-permission on the bound Order. For standalone Progress workflows, declare forwards with a non-empty namedOperator or a permissionIndex instead of \"\".",
|
|
241
241
|
"evidence": "named_operator=\"\", forward=${operate_forward}",
|
|
@@ -352,7 +352,7 @@
|
|
|
352
352
|
"when": { "field": "orderless_operate", "op": "eq", "value": true },
|
|
353
353
|
"level": "medium",
|
|
354
354
|
"title": "operate without bound Order — order-holder advance/hold unavailable",
|
|
355
|
-
"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 — except for forwards with namedOperator=\"\": with no bound Order there is no payer to name, so those abort fail-closed (
|
|
355
|
+
"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 — except for forwards with namedOperator=\"\": with no bound Order there is no payer to name, so those abort fail-closed (E_ORDER_TASK_REQUIRED, C-F06 split) on any entry.",
|
|
356
356
|
"scenario": "User tries order variant on a task-less Progress",
|
|
357
357
|
"mitigation": "Use non-order next()/hold() variant (non-empty-namedOperator or permissionIndex forwards), OR submit the task first to bind an Order; \"\"-scoped forwards on a taskless Progress are un-executable by design",
|
|
358
358
|
"evidence": "task=null",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"comment": "Reward rule pack (R-R) — declarative form of the retired in-code Reward risk rules. Facts are produced by the kernel extractor (reward-risk.ts, bound to the Reward Guard/record caps and the Guard constructor table); rules only reference fact names. Array walks (guard_add scans, first-offender picks, intent keyword matching) are sunk into the extractor; R-R-4-01 is a catalog stub (the retired check always returned null) kept silent via a never-true condition, and R-R-7-01 carries two cases for the deposit-dependent level branch. 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.",
|
|
2
|
+
"comment": "Reward rule pack (R-R) — declarative form of the retired in-code Reward risk rules. Facts are produced by the kernel extractor (reward-risk.ts, bound to the Reward Guard/record caps and the Guard constructor table); rules only reference fact names. Array walks (guard_add scans, first-offender picks, intent keyword matching) are sunk into the extractor; R-R-4-01 is a catalog stub (the retired check always returned null) kept silent via a never-true condition, and R-R-7-01 carries two cases for the deposit-dependent level branch. R-R-8-01..05 are the experience-compensation disclosure layer (C-11 decision: buyer-experience compensation rides the Reward object — solvency, withdraw reversibility, claim friction, submission-computed amounts, no clawback), gated on the compensation_intent fact. 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
3
|
"facts": {
|
|
4
4
|
"claim": "Guard address being claimed against (ctx.claim).",
|
|
5
5
|
"guard_add_count": "Number of entries in ctx.guard_add (undefined when absent).",
|
|
@@ -42,7 +42,9 @@
|
|
|
42
42
|
"expected_progress_state": "Progress state baked into the Guard table (ctx.guard_expected_progress_state).",
|
|
43
43
|
"praise_intent_wrong_node": "Intent matches a praise keyword, the Machine supports the wonder pattern, and the Guard checks a non-wonder node (keyword matching sunk into the extractor).",
|
|
44
44
|
"wonder_node_without_praise_intent": "Guard checks the wonder node but the intent text matches no praise keyword (keyword matching sunk into the extractor).",
|
|
45
|
+
"compensation_intent": "The intent text matches an experience-compensation keyword (late delivery / delay / goodwill / experience compensation …; keyword matching sunk into the extractor) — the gate for the R-R-8 disclosure layer (C-11: experience compensation rides the Reward object). Deliberately excludes the bare word 'compensation' (collides with the Service compensation_fund arbitration indemnity).",
|
|
45
46
|
"has_deposit": "The operation deposits (coin_add or receive present).",
|
|
47
|
+
"has_identifier_amount": "At least one guard_add entry carries a GuardU64Identifier (submission-computed) amount — positive fact for the R-R-8-04 amount-source-trust disclosure.",
|
|
46
48
|
"recovery_gap_present": "A deposit or guard_add is in play and no entry carries the owner recovery signature (Signer recipient + GuardU64Identifier amount) — detection sunk into the extractor.",
|
|
47
49
|
"always_true": "Extractor sentinel — unconditionally true; marks catalog stubs (via eq false) and documentation."
|
|
48
50
|
},
|
|
@@ -437,7 +439,7 @@
|
|
|
437
439
|
] },
|
|
438
440
|
"level": "medium",
|
|
439
441
|
"title": "No owner fund-recovery escape guard on this Reward",
|
|
440
|
-
"description": "claim() is the
|
|
442
|
+
"description": "claim() is the GUARD-FREE exit from the Reward's balance field, and none of the guards being configured is an owner escape hatch. withdraw (op 158) is the only OTHER exit — permission-gated and blocked while the no-guard window (guard_not_added_expiration_time) stands, and it routes the remainder to the pool owner as the commitment's disclosed reversal, not as a condition-gated escape guard; without either, any unclaimed remainder stays locked forever. Note: owner_receive (op 156) never touches balance — it only extracts objects the Reward RECEIVED via transfer (Receiving<CoinWrapper<K>> or NFT-like objects) to the Permission owner; receive (op 154) is what joins payments into balance. This is a configuration gap, not a contract defect.",
|
|
441
443
|
"scenario": "A marketing Reward is fully consumed by guards, the campaign ends with a residual balance, and the merchant has no guard that lets them reclaim it.",
|
|
442
444
|
"mitigation": "Add an escape guard alongside the other guards: (1) Guard: logic_and(logic_equal(query(1002 permission.owner [permission_address]), Signer), logic_greater_equal(Clock, <unlock_time>)) — verifies the tx sender is the live Permission owner, with the Clock comparison acting as the lock period (e.g. 30 days); (2) RewardGuard entry: recipient=Signer, amount=GuardU64Identifier(u8 submission mark), expiration_time=unlock_time + claim window (or None) — remember the contract asserts clock <= expiration_time, i.e. expiration is the last claimable moment, not the unlock moment; (3) after unlock the owner claims by submitting the full remaining balance to recover 100%.",
|
|
443
445
|
"evidence": "deposit=${has_deposit}, guard_add=${guard_add_count}, escape=false (no entry with Signer recipient + GuardU64Identifier amount)",
|
|
@@ -453,7 +455,7 @@
|
|
|
453
455
|
"when": { "field": "recovery_gap_present", "op": "eq", "value": true },
|
|
454
456
|
"level": "low",
|
|
455
457
|
"title": "No owner fund-recovery escape guard on this Reward",
|
|
456
|
-
"description": "claim() is the
|
|
458
|
+
"description": "claim() is the GUARD-FREE exit from the Reward's balance field, and none of the guards being configured is an owner escape hatch. withdraw (op 158) is the only OTHER exit — permission-gated and blocked while the no-guard window (guard_not_added_expiration_time) stands, and it routes the remainder to the pool owner as the commitment's disclosed reversal, not as a condition-gated escape guard; without either, any unclaimed remainder stays locked forever. Note: owner_receive (op 156) never touches balance — it only extracts objects the Reward RECEIVED via transfer (Receiving<CoinWrapper<K>> or NFT-like objects) to the Permission owner; receive (op 154) is what joins payments into balance. This is a configuration gap, not a contract defect.",
|
|
457
459
|
"scenario": "A marketing Reward is fully consumed by guards, the campaign ends with a residual balance, and the merchant has no guard that lets them reclaim it.",
|
|
458
460
|
"mitigation": "Add an escape guard alongside the other guards: (1) Guard: logic_and(logic_equal(query(1002 permission.owner [permission_address]), Signer), logic_greater_equal(Clock, <unlock_time>)) — verifies the tx sender is the live Permission owner, with the Clock comparison acting as the lock period (e.g. 30 days); (2) RewardGuard entry: recipient=Signer, amount=GuardU64Identifier(u8 submission mark), expiration_time=unlock_time + claim window (or None) — remember the contract asserts clock <= expiration_time, i.e. expiration is the last claimable moment, not the unlock moment; (3) after unlock the owner claims by submitting the full remaining balance to recover 100%.",
|
|
459
461
|
"evidence": "deposit=${has_deposit}, guard_add=${guard_add_count}, escape=false (no entry with Signer recipient + GuardU64Identifier amount)",
|
|
@@ -466,6 +468,119 @@
|
|
|
466
468
|
}
|
|
467
469
|
}
|
|
468
470
|
]
|
|
471
|
+
},
|
|
472
|
+
{
|
|
473
|
+
"rule_id": "R-R-8-01",
|
|
474
|
+
"dimension": "business_semantic",
|
|
475
|
+
"trigger": "experience-compensation intent with guards being configured — pool solvency disclosure (claims > balance abort, non-escrow, no per-claim isolation)",
|
|
476
|
+
"cases": [
|
|
477
|
+
{
|
|
478
|
+
"when": { "all": [
|
|
479
|
+
{ "field": "compensation_intent", "op": "eq", "value": true },
|
|
480
|
+
{ "field": "guard_add_count", "op": "truthy" }
|
|
481
|
+
] },
|
|
482
|
+
"level": "medium",
|
|
483
|
+
"title": "Compensation pool solvency: the pool is NOT per-order escrow — claims beyond the balance abort",
|
|
484
|
+
"description": "Experience compensation rides the Reward object (C-11): one pre-funded pool serves ALL buyers' claims, with no per-order isolation. A claim larger than the current balance aborts with E_INSUFFICIENT_BALANCE (6) — the buyer faces a failed claim, not a queued payout. Size coin_add to expected claims × worst tier and refill on schedule; the R-R-7-01 escape-guard advice keeps the residual recoverable.",
|
|
485
|
+
"scenario": "A late-delivery wave drains the compensation pool before the tail of the wave claims",
|
|
486
|
+
"mitigation": "1) Fund upfront for the worst-case claim wave (expected claims × worst tier), refill periodically. 2) Keep tiers so a single claim cannot exceed a bounded share of the pool. 3) Monitor the balance against the open claim window — an exhausted pool turns the compensation promise into an unfunded one (must be disclosed, never silently left to abort).",
|
|
487
|
+
"evidence": "compensation intent, guard_add=${guard_add_count}",
|
|
488
|
+
"stakeholders": ["owner", "service_provider", "claimer"],
|
|
489
|
+
"exposure": {
|
|
490
|
+
"loss_parties": [
|
|
491
|
+
{ "role": "buyer", "basis": "A claim beyond the pool balance aborts (E_INSUFFICIENT_BALANCE) — the buyer holds a compensation promise that does not pay." }
|
|
492
|
+
],
|
|
493
|
+
"gain_paths": []
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
]
|
|
497
|
+
},
|
|
498
|
+
{
|
|
499
|
+
"rule_id": "R-R-8-02",
|
|
500
|
+
"dimension": "business_semantic",
|
|
501
|
+
"trigger": "experience-compensation intent — the merchant's withdraw (158) right makes the funding commitment reversible",
|
|
502
|
+
"cases": [
|
|
503
|
+
{
|
|
504
|
+
"when": { "field": "compensation_intent", "op": "eq", "value": true },
|
|
505
|
+
"level": "medium",
|
|
506
|
+
"title": "Compensation funding is reversible — the owner can withdraw the unclaimed remainder (permission 158)",
|
|
507
|
+
"description": "withdraw (158) is the only non-claim exit from the Reward balance. It is blocked while the no-guard window (guard_not_added_expiration_time) stands — setting that window IS the public funding commitment — and unblocked once it lapses, letting the owner pull the unclaimed remainder inside a Payment receipt. A compensation promise is therefore time-bounded by construction; the withdrawal right and window MUST be disclosed (reversibility), never implied to be perpetual.",
|
|
508
|
+
"scenario": "A merchant withdraws the compensation pool right after the no-guard window lapses, before slow claimers act",
|
|
509
|
+
"mitigation": "1) Disclose the no-guard window and the post-window withdrawal right in the listing. 2) Size the window to cover realistic claim latency. 3) Buyers: treat an expired no-guard window as the pool's commitment horizon — claims after it may find an empty pool by design.",
|
|
510
|
+
"evidence": "compensation intent",
|
|
511
|
+
"stakeholders": ["owner", "claimer"],
|
|
512
|
+
"exposure": {
|
|
513
|
+
"loss_parties": [
|
|
514
|
+
{ "role": "buyer", "basis": "After the no-guard window lapses the owner can withdraw the unclaimed balance; a late claim can find an empty pool." }
|
|
515
|
+
],
|
|
516
|
+
"gain_paths": [
|
|
517
|
+
{
|
|
518
|
+
"role": "merchant",
|
|
519
|
+
"path": "The owner withdraws the unclaimed remainder once the declared no-guard window has elapsed.",
|
|
520
|
+
"viability": "viable",
|
|
521
|
+
"gate": "Legal by design (permission 158; E_GUARD_LOCKED_TIME only blocks while the window stands) — the commitment is reversible; disclosure is the obligation."
|
|
522
|
+
}
|
|
523
|
+
]
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
]
|
|
527
|
+
},
|
|
528
|
+
{
|
|
529
|
+
"rule_id": "R-R-8-03",
|
|
530
|
+
"dimension": "business_semantic",
|
|
531
|
+
"trigger": "experience-compensation intent — claims are user-initiated, so realized payouts undershoot the pool by design",
|
|
532
|
+
"cases": [
|
|
533
|
+
{
|
|
534
|
+
"when": { "field": "compensation_intent", "op": "eq", "value": true },
|
|
535
|
+
"level": "info",
|
|
536
|
+
"title": "Claim friction is a design property: the realized compensation rate is < 100% unless buyers claim",
|
|
537
|
+
"description": "Reward compensation pays ONLY on an explicit claim (passport-driven, no push path). A claim rate below 100% is the DESIGN EXPECTATION, not a defect — but the merchant must not present the pool as automatic indemnity, and the buyer must know the payout requires an active claim inside the window.",
|
|
538
|
+
"scenario": "A merchant advertises 'guaranteed late compensation' while the claim rail needs each buyer to transact",
|
|
539
|
+
"mitigation": "1) Phrase the promise as claimable, not automatic. 2) Publish the claim window and how to claim (guard + submission slots). 3) Do not book goodwill on the full pool — only claimed amounts leave it.",
|
|
540
|
+
"evidence": "compensation intent",
|
|
541
|
+
"stakeholders": ["owner", "claimer"]
|
|
542
|
+
}
|
|
543
|
+
]
|
|
544
|
+
},
|
|
545
|
+
{
|
|
546
|
+
"rule_id": "R-R-8-04",
|
|
547
|
+
"dimension": "business_semantic",
|
|
548
|
+
"trigger": "experience-compensation intent with a GuardU64Identifier amount — the claim amount is submission-computed, not on-chain clamped",
|
|
549
|
+
"cases": [
|
|
550
|
+
{
|
|
551
|
+
"when": { "all": [
|
|
552
|
+
{ "field": "compensation_intent", "op": "eq", "value": true },
|
|
553
|
+
{ "field": "has_identifier_amount", "op": "eq", "value": true }
|
|
554
|
+
] },
|
|
555
|
+
"level": "medium",
|
|
556
|
+
"title": "Dynamic compensation amount: the claim-time value is computed by the submitting party, not clamped on-chain",
|
|
557
|
+
"description": "Amount::GuardU64Identifier resolves the claim amount from the claimer's Passport submission slot at claim time. The chain only type-checks the slot (u64; E_AMOUNT_NOT_U64 (5) at construction) — the VALUE is whatever the submitting party computed from the tier rule. 'The later, the more' compensation expressed this way is data-driven trust: the tier computation rule MUST be disclosed, and the pool balance (R-R-8-01) remains the real ceiling.",
|
|
558
|
+
"scenario": "A tiered late-compensation guard whose submission amount is computed by the merchant's claim tooling",
|
|
559
|
+
"mitigation": "1) Disclose the exact tier formula in the listing (minutes late → amount). 2) Keep the computation deterministic and auditable (repository evidence rows help). 3) Prefer Fixed tiers where the rule is simple — the on-chain value is then the whole promise.",
|
|
560
|
+
"evidence": "compensation intent, dynamic amount present",
|
|
561
|
+
"stakeholders": ["owner", "claimer"]
|
|
562
|
+
}
|
|
563
|
+
]
|
|
564
|
+
},
|
|
565
|
+
{
|
|
566
|
+
"rule_id": "R-R-8-05",
|
|
567
|
+
"dimension": "business_semantic",
|
|
568
|
+
"trigger": "experience-compensation intent with a deposit — the pool outflow is one-way, claimed funds are never clawed back",
|
|
569
|
+
"cases": [
|
|
570
|
+
{
|
|
571
|
+
"when": { "all": [
|
|
572
|
+
{ "field": "compensation_intent", "op": "eq", "value": true },
|
|
573
|
+
{ "field": "has_deposit", "op": "eq", "value": true }
|
|
574
|
+
] },
|
|
575
|
+
"level": "low",
|
|
576
|
+
"title": "No clawback: compensation flows one way — out to claimers",
|
|
577
|
+
"description": "The Reward balance has no pull-back path: claim (guard-free) and withdraw (158) both move funds OUT; deposited compensation is recoverable only via the R-R-7-01 escape guard for the UNCLAIMED remainder. A paid claim is final even if the underlying incident is later reversed (e.g. the order is refunded after an overlapping-window compensation claim) — supplier recourse is a SEPARATE ledger (off-chain or a distinct on-chain arrangement), never a Reward-side reversal.",
|
|
578
|
+
"scenario": "A buyer claims late-compensation and then also wins a refund; the merchant wants the compensation back",
|
|
579
|
+
"mitigation": "1) Prevent overlap structurally: the compensation guard accepts completed/settled terminals only (tbs7 F-04 claim-and-return precedent). 2) Treat paid compensation as sunk; recover from the supplier through the separate recourse arrangement. 3) Use the escape guard (R-R-7-01) for the unclaimed tail only.",
|
|
580
|
+
"evidence": "compensation intent, deposit=${has_deposit}",
|
|
581
|
+
"stakeholders": ["owner", "service_provider"]
|
|
582
|
+
}
|
|
583
|
+
]
|
|
469
584
|
}
|
|
470
585
|
]
|
|
471
586
|
}
|