@wowok/agent-mcp 3.3.8 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chain-semantics/field-capability.js +1 -1
- package/dist/chain-semantics/freeze-map.js +1 -1
- package/dist/chain-semantics/fund-flow.js +1 -1
- package/dist/chain-semantics/guard-verbs.js +1 -1
- package/dist/chain-semantics/object-graph.js +1 -1
- package/dist/composition/audit.js +1 -1
- package/dist/composition/compile.d.ts +3 -2
- package/dist/composition/compile.js +1 -1
- package/dist/composition/inflight.d.ts +6 -0
- package/dist/composition/inflight.js +1 -1
- package/dist/composition/materialize.d.ts +4 -0
- package/dist/composition/materialize.js +1 -1
- package/dist/composition/param-disclosure.d.ts +61 -0
- package/dist/composition/param-disclosure.js +1 -0
- package/dist/composition/plan.d.ts +11 -1
- package/dist/composition/plan.js +1 -1
- package/dist/customer/account-events.js +1 -1
- package/dist/data/api/api.spec.js +1 -1
- package/dist/data/api/cli.js +1 -1
- package/dist/data/api/server.d.ts +1 -0
- package/dist/data/api/server.js +1 -1
- package/dist/data/projection/store.d.ts +2 -1
- package/dist/data/projection/store.js +1 -1
- package/dist/data/projection/types.d.ts +10 -0
- package/dist/data/sync/cdc.js +1 -1
- package/dist/data/sync/cdc.spec.js +1 -1
- package/dist/data/sync/store.d.ts +5 -0
- package/dist/data/sync/store.js +1 -1
- package/dist/data/sync/types.d.ts +2 -0
- package/dist/evaluation/builtins/graph-service.spec.js +1 -1
- package/dist/evaluation/engine.js +1 -1
- package/dist/evaluation/guard-scan.js +1 -1
- package/dist/experience/realtime-feedback.js +1 -1
- package/dist/extensions/business-modules.js +1 -1
- package/dist/extensions/industry-pack.js +1 -1
- package/dist/extensions/modes.js +1 -1
- package/dist/graph/onchain/expand.js +1 -1
- package/dist/graph/onchain/exposure.js +1 -1
- package/dist/harness/recover.js +1 -1
- package/dist/index.js +1 -1
- package/dist/knowledge/allocation-risk.js +1 -1
- package/dist/knowledge/allocation-templates.js +1 -1
- package/dist/knowledge/allocator-rail-verifier.js +1 -1
- package/dist/knowledge/arb-fund-facts.d.ts +1 -0
- package/dist/knowledge/arb-fund-facts.js +1 -1
- package/dist/knowledge/arbitration-ledger.js +1 -1
- package/dist/knowledge/arbitration-risk.d.ts +1 -0
- package/dist/knowledge/arbitration-risk.js +1 -1
- package/dist/knowledge/audit-rules.js +1 -1
- package/dist/knowledge/baselines/rules/allocation.json +6 -6
- package/dist/knowledge/baselines/rules/arb.json +2 -2
- package/dist/knowledge/baselines/rules/guard.json +11 -11
- package/dist/knowledge/baselines/rules/order.json +1 -1
- package/dist/knowledge/baselines/rules/plan.json +1 -1
- package/dist/knowledge/baselines/semantic-facts.js +1 -1
- package/dist/knowledge/builtin-templates.d.ts +14 -1
- package/dist/knowledge/builtin-templates.js +1 -1
- package/dist/knowledge/catalog-facts.d.ts +4 -0
- package/dist/knowledge/catalog-facts.js +1 -0
- package/dist/knowledge/commission-landing.js +1 -1
- package/dist/knowledge/component-schema.d.ts +64 -0
- package/dist/knowledge/component-schema.js +1 -0
- package/dist/knowledge/entity-recipient-guard.js +1 -1
- package/dist/knowledge/event-semantics.js +1 -1
- package/dist/knowledge/fee-param-bindings.d.ts +26 -0
- package/dist/knowledge/fee-param-bindings.js +1 -0
- package/dist/knowledge/fund-layer.js +1 -1
- package/dist/knowledge/getting-started.d.ts +2 -2
- package/dist/knowledge/getting-started.js +1 -1
- package/dist/knowledge/guard-anchor-reach.js +1 -1
- package/dist/knowledge/guard-design-patterns.js +1 -1
- package/dist/knowledge/guard-ledger.js +1 -1
- package/dist/knowledge/guard-lint.d.ts +1 -0
- package/dist/knowledge/guard-lint.js +1 -1
- package/dist/knowledge/guard-puzzle.js +1 -1
- package/dist/knowledge/guard-risk.js +1 -1
- package/dist/knowledge/guard-templates.d.ts +1 -1
- package/dist/knowledge/guard-templates.js +1 -1
- package/dist/knowledge/guard-translation.js +1 -1
- package/dist/knowledge/index.js +1 -1
- package/dist/knowledge/industry-registry.js +1 -1
- package/dist/knowledge/industry-strategy.js +1 -1
- package/dist/knowledge/jsonrpc-enum.d.ts +14 -3
- package/dist/knowledge/jsonrpc-enum.js +1 -1
- package/dist/knowledge/knob-docs.d.ts +5 -0
- package/dist/knowledge/knob-docs.js +1 -0
- package/dist/knowledge/machine-templates.js +1 -1
- package/dist/knowledge/machine-topology.js +1 -1
- package/dist/knowledge/machine-translation.js +1 -1
- package/dist/knowledge/onchain-constants.d.ts +2 -0
- package/dist/knowledge/onchain-constants.js +1 -1
- package/dist/knowledge/order-ledger.js +1 -1
- package/dist/knowledge/param-schema.d.ts +70 -0
- package/dist/knowledge/param-schema.js +1 -0
- package/dist/knowledge/param-tiers.d.ts +25 -0
- package/dist/knowledge/param-tiers.js +1 -0
- package/dist/knowledge/passport-ledger.d.ts +1 -1
- package/dist/knowledge/passport-ledger.js +1 -1
- package/dist/knowledge/pattern-resolutions.d.ts +106 -0
- package/dist/knowledge/pattern-resolutions.js +1 -0
- package/dist/knowledge/projection.spec.js +1 -1
- package/dist/knowledge/safety-rules.js +1 -1
- package/dist/knowledge/scenario-modes.d.ts +1 -0
- package/dist/knowledge/scenario-modes.js +1 -1
- package/dist/knowledge/scenario-topology.js +1 -1
- package/dist/knowledge/service-allocation-semantics.js +1 -1
- package/dist/knowledge/service-ledger.js +1 -1
- package/dist/knowledge/service-templates.js +1 -1
- package/dist/knowledge/strategy-manuals.d.ts +1 -1
- package/dist/knowledge/strategy-manuals.js +1 -1
- package/dist/knowledge/template-loader.d.ts +101 -1
- package/dist/knowledge/template-loader.js +1 -1
- package/dist/knowledge/template-nav.d.ts +7 -0
- package/dist/knowledge/template-nav.js +1 -0
- package/dist/knowledge/template-registry.js +1 -1
- package/dist/knowledge/template-scanner.d.ts +33 -0
- package/dist/knowledge/template-scanner.js +1 -1
- package/dist/knowledge/template-test-profiles.d.ts +17 -0
- package/dist/knowledge/template-test-profiles.js +1 -0
- package/dist/knowledge/template-validation.d.ts +1 -0
- package/dist/knowledge/template-validation.js +1 -1
- package/dist/knowledge/tools-reference.js +1 -1
- package/dist/knowledge/treasury-templates.js +1 -1
- package/dist/knowledge/workflow-guidance.js +1 -1
- package/dist/monitor/MonitorLoop.js +1 -1
- package/dist/participation/time-window.d.ts +37 -0
- package/dist/participation/time-window.js +1 -0
- package/dist/playbooks/service-build/business-puzzle.js +1 -1
- package/dist/playbooks/service-build/machine-panorama.d.ts +1 -0
- package/dist/playbooks/service-build/machine-panorama.js +1 -1
- package/dist/playbooks/service-build/merchant-guide.d.ts +4 -1
- package/dist/playbooks/service-build/merchant-guide.js +1 -1
- package/dist/playbooks/service-build/migration-planner.js +1 -1
- package/dist/playbooks/service-build/object-panorama.js +1 -1
- package/dist/playbooks/service-build/participation-radar.d.ts +1 -0
- package/dist/playbooks/service-build/participation-radar.js +1 -1
- package/dist/playbooks/service-build/relationship-profile.js +1 -1
- package/dist/playbooks/service-build/service-panorama.d.ts +1 -0
- package/dist/playbooks/service-build/service-panorama.js +1 -1
- package/dist/playbooks/service-build/service-quote.js +1 -1
- package/dist/playbooks/service-build/service-quote.spec.js +1 -1
- package/dist/playbooks/service-build/workflow-design-assessment.js +1 -1
- package/dist/relationship/registry.js +1 -1
- package/dist/review/index.js +1 -1
- package/dist/runtime/instance-registry.d.ts +7 -1
- package/dist/runtime/instance-registry.js +1 -1
- package/dist/safety/confirm-gate.js +1 -1
- package/dist/schema/benchmark-migration/index.d.ts +2 -0
- package/dist/schema/benchmark-migration/index.js +1 -1
- package/dist/schema/call/allocation.js +1 -1
- package/dist/schema/call/arbitration.js +1 -1
- package/dist/schema/call/base.d.ts +8 -0
- package/dist/schema/call/base.js +1 -1
- package/dist/schema/call/bridge.d.ts +2 -0
- package/dist/schema/call/error-codes.d.ts +1 -1
- package/dist/schema/call/error-codes.js +1 -1
- package/dist/schema/call/guard.js +1 -1
- package/dist/schema/call/handler.js +1 -1
- package/dist/schema/call/machine.js +1 -1
- package/dist/schema/call/semantic.js +1 -1
- package/dist/schema/call/service.d.ts +3 -3
- package/dist/schema/call/service.js +1 -1
- package/dist/schema/common/index.js +1 -1
- package/dist/schema/evaluation/index.d.ts +8 -0
- package/dist/schema/evaluation/index.js +1 -1
- package/dist/schema/goal/planning.d.ts +1 -0
- package/dist/schema/goal/planning.js +1 -1
- package/dist/schema/industry-pack/index.d.ts +29 -0
- package/dist/schema/industry-pack/index.js +1 -1
- package/dist/schema/local/index.d.ts +20 -0
- package/dist/schema/local/index.js +1 -1
- package/dist/schema/messenger/index.d.ts +2 -0
- package/dist/schema/messenger/index.js +1 -1
- package/dist/schema/operations.d.ts +1 -1
- package/dist/schema/operations.js +1 -1
- package/dist/schema/query/bi.d.ts +106 -0
- package/dist/schema/query/bi.js +1 -1
- package/dist/schema/query/index.d.ts +5 -5
- package/dist/schema/query/index.js +1 -1
- package/dist/schema/schema-version.js +1 -1
- package/dist/schema/watch/index.js +1 -1
- package/dist/schema-query-impl/index.js +1 -1
- package/dist/schemas/account_operation.output.json +4 -2
- package/dist/schemas/benchmark_migration_operation.output.json +3 -3
- package/dist/schemas/benchmark_migration_operation.schema.json +16 -2
- package/dist/schemas/bridge_operation.output.json +4 -2
- package/dist/schemas/bridge_operation.schema.json +5 -5
- package/dist/schemas/evaluation_operation.output.json +16 -0
- package/dist/schemas/guard2file.schema.json +1 -1
- package/dist/schemas/index.json +1 -1
- package/dist/schemas/industry_pack_operation.output.json +150 -1
- package/dist/schemas/industry_pack_operation.schema.json +9 -3
- package/dist/schemas/keeper_operation.output.json +2 -2
- package/dist/schemas/local_cache_operation.output.json +4 -2
- package/dist/schemas/local_history_operation.output.json +4 -2
- package/dist/schemas/local_info_operation.output.json +4 -2
- package/dist/schemas/local_mark_operation.output.json +4 -2
- package/dist/schemas/machineNode2file.schema.json +1 -1
- package/dist/schemas/messenger_operation.output.json +13 -2
- package/dist/schemas/messenger_operation.schema.json +41 -34
- package/dist/schemas/monitor_events.output.json +2 -2
- package/dist/schemas/monitor_subscription.output.json +2 -2
- package/dist/schemas/onchain_events.output.json +14 -14
- package/dist/schemas/onchain_operations.output.json +13 -10
- package/dist/schemas/onchain_operations.schema.json +124 -99
- package/dist/schemas/onchain_operations_allocation.schema.json +7 -6
- package/dist/schemas/onchain_operations_arbitration.schema.json +7 -6
- package/dist/schemas/onchain_operations_contact.schema.json +4 -3
- package/dist/schemas/onchain_operations_demand.schema.json +4 -3
- package/dist/schemas/onchain_operations_gen_passport.schema.json +4 -3
- package/dist/schemas/onchain_operations_gen_proof.schema.json +1 -1
- package/dist/schemas/onchain_operations_guard.schema.json +7 -6
- package/dist/schemas/onchain_operations_machine.schema.json +9 -7
- package/dist/schemas/onchain_operations_order.schema.json +6 -4
- package/dist/schemas/onchain_operations_payment.schema.json +2 -2
- package/dist/schemas/onchain_operations_permission.schema.json +19 -15
- package/dist/schemas/onchain_operations_personal.schema.json +17 -14
- package/dist/schemas/onchain_operations_progress.schema.json +6 -4
- package/dist/schemas/onchain_operations_proof.schema.json +4 -3
- package/dist/schemas/onchain_operations_repository.schema.json +9 -7
- package/dist/schemas/onchain_operations_reward.schema.json +5 -4
- package/dist/schemas/onchain_operations_service.schema.json +15 -12
- package/dist/schemas/onchain_operations_treasury.schema.json +4 -3
- package/dist/schemas/onchain_table_data.output.json +18 -13
- package/dist/schemas/onchain_table_data.schema.json +13 -13
- package/dist/schemas/query_toolkit.output.json +301 -33
- package/dist/schemas/query_toolkit.schema.json +6 -6
- package/dist/schemas/watch_operation.output.json +3 -3
- package/dist/schemas/workflow_operation.schema.json +3 -2
- package/dist/schemas/wowok_buildin_info.schema.json +1 -1
- package/dist/task/playbook.js +1 -1
- package/dist/tools/handlers/benchmark-migration.d.ts +1 -0
- package/dist/tools/handlers/benchmark-migration.js +1 -1
- package/dist/tools/handlers/config.js +1 -1
- package/dist/tools/handlers/evaluation.js +1 -1
- package/dist/tools/handlers/evaluation.spec.js +1 -1
- package/dist/tools/handlers/industry-pack.js +1 -1
- package/dist/tools/handlers/messenger.js +1 -1
- package/dist/tools/handlers/onchain.d.ts +4 -0
- package/dist/tools/handlers/onchain.js +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/registry/business.js +1 -1
- package/dist/tools/registry/onchain.js +1 -1
- package/dist/tools/registry/query.js +1 -1
- package/dist/tools/sanitize-output.js +1 -1
- package/dist/tools/sanitize-output.spec.js +1 -1
- package/dist/tools/types.d.ts +1 -0
- package/dist/tools/upgrade-check.d.ts +22 -0
- package/dist/tools/upgrade-check.js +1 -1
- package/dist/tools/wrap.d.ts +1 -1
- package/dist/tools/wrap.js +1 -1
- package/package.json +7 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createQueryCoverage,discoveryDataSource,extractGenericTypeArg,query_arbs,query_demands,query_events,query_services,RemoteIndexClient,RemoteIndexError,remoteIndexUrl}from'@wowok/wowok';import{resolveChainIdentity}from'@wowok/wowok/w/local/chain-scope';import{batchQueryObjectsByIds as a252a}from'../graph/onchain/sdk-batch.js';import{projectionUpsert,projectionServe}from'./projection.js';function toStr(a){if(typeof a==='string')return a;if(typeof a==='number'||typeof a==='bigint')return String(a);return undefined;}async function withRemoteIndex(a,b){const c=discoveryDataSource(),d=remoteIndexUrl();if(c==='legacy'||c==='auto'&&!d)return b();if(!d)throw new Error('INDEX_NOT_CONFIGURED:\x20WOWOK_INDEX_URL\x20is\x20required');try{return await a(d);}catch(e){if(c==='remote')throw e;const f=await b(),g=e?.['code'],h=typeof g==='string'&&/^INDEX_[A-Z_]+$/['test'](g)?g:'INDEX_UNAVAILABLE';return f['coverage']=createQueryCoverage({'mode':f['coverage']['mode'],'totalEnumerated':f['coverage']['total_enumerated'],'truncated':f['coverage']['truncated'],'chainId':f['coverage']['chain_id'],'degradedReasons':[...f['coverage']['degraded_reasons'],'REMOTE_INDEX_FALLBACK',h]}),f;}}async function collectObjectIdsByEvent(a,b,c,d,e){const f=new Set();let g=null,h=![];while(f['size']<d){const i=await query_events({'type':a,'cursor':g,'limit':0x32,'order':'descending','no_cache':e,'network':c}),j=i?.['data']??[];if(j['length']===0x0)break;for(const k of j){const l=b(k);if(l)f['add'](l);}h=!!(i?.['hasNextPage']&&i?.['nextCursor']);if(!h)break;g=i?.['nextCursor']??null;}return{'ids':Array['from'](f)['slice'](0x0,d),'hasMore':h};}async function projectionChainId(a){try{return await resolveChainIdentity(a)??undefined;}catch{return undefined;}}function projectionCoverage(a,b,c){return createQueryCoverage({'mode':'event_window','totalEnumerated':b,'truncated':![],'chainId':a,'degradedReasons':['EVENT_BACKED_ENUMERATION','PROJECTION_CACHED','PROJECTION_REFRESHED_AT='+c]});}function weiString(a){return typeof a==='string'&&/^\d+$/['test'](a)?a:undefined;}function serviceProjectionRows(a){return a['map'](b=>{const c=b['json']??{},d=Array['isArray'](c['sales'])?c['sales']:[],e=d['map'](h=>weiString(h['price']))['filter'](h=>!!h)['sort'](),f=Array['isArray'](c['arbitrations'])?c['arbitrations']:[],g=weiString(c['compensation_fund']);return{'object_id':b['object'],'owner':typeof c['owner']==='string'?c['owner']:undefined,'type_raw':b['type_raw'],'name':b['name'],'location':b['location'],'description':typeof c['description']==='string'?c['description']:undefined,'coin_type':b['type_raw']?extractGenericTypeArg(b['type_raw']):undefined,'published':c['bPublished']===!![]?0x1:0x0,'paused':c['bPaused']===!![]?0x1:0x0,'price_min_wei':e[0x0],'price_max_wei':e['length']>0x0?e[e['length']-0x1]:undefined,'cap_arbitration':f['length']>0x0?0x1:0x0,'cap_compensation':g!==undefined&&g!=='0'?0x1:0x0,'cap_machine':c['machine']!=null?0x1:0x0,'cap_messenger':c['um']!=null?0x1:0x0,'cap_buy_guard':c['buy_guard']!=null?0x1:0x0,'cap_wip':d['some'](h=>typeof h['wip_hash']==='string'&&h['wip_hash']['length']>0x0)?0x1:0x0,'payload':JSON['stringify'](b)};});}function objectProjectionRows(a){return a['filter'](b=>typeof b?.['object']==='string')['map'](b=>({'object_id':String(b['object']),'owner':typeof b['owner']==='string'?b['owner']:undefined,'location':typeof b['location']==='string'?b['location']:undefined,'description':typeof b['description']==='string'?b['description']:undefined,'payload':JSON['stringify'](b)}));}async function projectionRecord(a,b,c,d,e){try{const f=await projectionChainId(b);if(f)projectionUpsert(f,a,c,{'hasMore':d,'maxObjects':e});}catch{}}async function serveFromProjectionServices(a,b){try{const c=await projectionChainId(a);if(!c)return undefined;const d=projectionServe(c,'Service',{'location_any':b['location_any'],'name_contains':b['name_contains'],'coin_type':b['coin_type']},b['max_objects']??0xc8);if(!d)return undefined;return{'services':d['items'],'total_enumerated':d['meta']['total_rows'],'has_more':![],'coverage':projectionCoverage(c,d['meta']['total_rows'],d['meta']['watermark']['refreshed_at'])};}catch{return undefined;}}async function enumerateServicesByEvent(a,b={}){const c=b['max_objects']??0xc8,{ids:d,hasMore:e}=await collectObjectIdsByEvent('ServiceEvent',l=>typeof l?.['object']==='string'?l['object']:undefined,a,c,b['no_cache']),f=await a252a(d,a,b['no_cache']),g=(b['location_any']??[])['map'](l=>l['toLowerCase']()),h=b['name_contains']?.['toLowerCase'](),i=f['filter'](l=>(l?.['type']??'')==='Service'),j=i['map'](l=>({'object':String(l['object']),'type_raw':typeof l['type_raw']==='string'?l['type_raw']:undefined,'name':typeof l['name']==='string'?l['name']:undefined,'location':typeof l['location']==='string'?l['location']:'','json':{...l,'compensation_fund':toStr(l['compensation_fund']),'sales':Array['isArray'](l['sales'])?l['sales']['map'](m=>({...m,'price':toStr(m['price'])})):[]}}));await projectionRecord('Service',a,serviceProjectionRows(j),e,c);const k=j['filter'](l=>{if(b['coin_type']&&extractGenericTypeArg(l['type_raw']??'')!==b['coin_type'])return![];if(h&&!(typeof l['name']==='string'&&l['name']['toLowerCase']()['includes'](h)))return![];if(g['length']===0x0)return!![];const m=typeof l['location']==='string'?l['location']['toLowerCase']():'';return g['some'](n=>m['includes'](n));});return{'services':k,'total_enumerated':i['length'],'has_more':e,'coverage':createQueryCoverage({'mode':'event_window','totalEnumerated':i['length'],'truncated':e,'degradedReasons':['EVENT_BACKED_ENUMERATION']})};}async function enumerateDemandsByEvent(a,b={}){const c=b['max_objects']??0xc8,{ids:d,hasMore:e}=await collectObjectIdsByEvent('DemandChangedEvent',h=>typeof h?.['object']==='string'?h['object']:undefined,a,c,b['no_cache']),f=await a252a(d,a,b['no_cache']),g=f['filter'](h=>(h?.['type']??'')==='Demand')['map'](h=>h);return await projectionRecord('Demand',a,objectProjectionRows(g),e,c),{'demands':g,'total_enumerated':g['length'],'has_more':e,'coverage':createQueryCoverage({'mode':'event_window','totalEnumerated':g['length'],'truncated':e,'degradedReasons':['EVENT_BACKED_ENUMERATION']})};}async function enumerateArbsByEvent(a,b={}){const c=b['max_objects']??0xc8,{ids:d,hasMore:e}=await collectObjectIdsByEvent('ArbEvent',j=>typeof j?.['arb']==='string'?j['arb']:undefined,a,c,b['no_cache']),f=await a252a(d,a,b['no_cache']),g=b['status']===undefined?undefined:Array['isArray'](b['status'])?b['status']:[b['status']],h=f['filter'](j=>(j?.['type']??'')==='Arb')['map'](j=>j),i=h['filter'](j=>b['arbitration']?j['arbitration']===b['arbitration']:!![])['filter'](j=>b['order']?j['order']===b['order']:!![])['filter'](j=>g?g['includes'](Number(j['status'])):!![]);return await projectionRecord('Arb',a,objectProjectionRows(h),e,c),{'arbs':i,'total_enumerated':h['length'],'has_more':e,'coverage':createQueryCoverage({'mode':'event_window','totalEnumerated':h['length'],'truncated':e,'degradedReasons':['EVENT_BACKED_ENUMERATION']})};}export async function enumerateServices(a,b={}){return withRemoteIndex(c=>query_services({...b,'network':a,'data_source':'remote','index_url':c}),async()=>{if(!b['no_cache']){const d=await serveFromProjectionServices(a,b);if(d)return d;}const c=await enumerateServicesByEvent(a,b);return c;});}export async function enumerateDemands(a,b={}){return withRemoteIndex(c=>query_demands({...b,'network':a,'data_source':'remote','index_url':c}),async()=>{if(!b['no_cache'])try{const c=await projectionChainId(a),d=c?projectionServe(c,'Demand',{},b['max_objects']??0xc8):undefined;if(d)return{'demands':d['items'],'total_enumerated':d['meta']['total_rows'],'has_more':![],'coverage':projectionCoverage(c,d['meta']['total_rows'],d['meta']['watermark']['refreshed_at'])};}catch{}return enumerateDemandsByEvent(a,b);});}export async function enumerateArbs(a,b={}){const c=b['status']===undefined?undefined:Array['isArray'](b['status'])?b['status']['map'](Number):Number(b['status']);return withRemoteIndex(d=>query_arbs({...b,'status':c,'network':a,'data_source':'remote','index_url':d}),async()=>{if(!b['no_cache'])try{const d=await projectionChainId(a),e=d?projectionServe(d,'Arb',{'arbitration':b['arbitration'],'order':b['order'],'status':b['status']===undefined?undefined:Array['isArray'](b['status'])?b['status']['map'](Number):[Number(b['status'])]},b['max_objects']??0xc8):undefined;if(e)return{'arbs':e['items'],'total_enumerated':e['meta']['total_rows'],'has_more':![],'coverage':projectionCoverage(d,e['meta']['total_rows'],e['meta']['watermark']['refreshed_at'])};}catch{}return enumerateArbsByEvent(a,b);});}export function weiToWowDecimal(a){if(!/^\d+$/['test'](a))throw new Error('Not\x20a\x20wei\x20decimal\x20string:\x20'+a);const b=a['padStart'](0xa,'0'),c=b['slice'](0x0,-0x9)['replace'](/^0+(?=\d)/,''),d=b['slice'](-0x9)['replace'](/0+$/,'');return d?c+'.'+d:c;}export async function matchServicesViaIndex(a,b={}){const c=remoteIndexUrl(b['indexUrl']);if(!c)throw new RemoteIndexError('INDEX_NOT_CONFIGURED','WOWOK_INDEX_URL\x20or\x20index_url\x20is\x20required');const d=await resolveChainIdentity(a);if(!d)throw new RemoteIndexError('INDEX_CHAIN_IDENTITY_UNAVAILABLE','JSON-RPC\x20chain\x20identity\x20is\x20required\x20before\x20reading\x20a\x20remote\x20index');const e=new RemoteIndexClient(c);return e['match']({'kind':'Service','expectedChainId':d,'q':b['q'],'location':b['location'],'budget':b['budgetWei']!==undefined?weiToWowDecimal(b['budgetWei']):undefined,'capabilities':b['capabilities'],'limit':b['limit'],'recallLimit':b['recallLimit'],'includePayload':!![]});}
|
|
1
|
+
import{createQueryCoverage,data2object,discoveryDataSource,ENTRYPOINT,extractGenericTypeArg,PackageAddress,query_arbs,query_demands,query_events,query_services,RemoteIndexClient,RemoteIndexError,remoteIndexUrl}from'@wowok/wowok';import{resolveChainIdentity}from'@wowok/wowok/w/local/chain-scope';import{batchQueryObjectsByIds as a256a}from'../graph/onchain/sdk-batch.js';import{projectionUpsert,projectionServe}from'./projection.js';function toStr(a){if(typeof a==='string')return a;if(typeof a==='number'||typeof a==='bigint')return String(a);return undefined;}const BUILTIN_INDEX_URL={[ENTRYPOINT['Testnet']]:'https://indexer.testnet.wowok.net'};export function indexUrlFor(a,b){return remoteIndexUrl(b)??BUILTIN_INDEX_URL[a];}const freshnessVerdicts=new Map(),FRESHNESS_TTL_MS=0xea60,FRESHNESS_FAIL_TTL_MS=0x3a98;async function indexReportsStale(a){const b=Date['now'](),c=freshnessVerdicts['get'](a);if(c&&c['expiresAt']>b)return c['stale'];try{const d=await fetch(new URL('/v1/status',a),{'method':'GET','headers':{'accept':'application/json'},'signal':AbortSignal['timeout'](0x1388)});if(!d['ok'])throw new Error('HTTP\x20'+d['status']);const e=await d['json'](),f=e?.['freshness']?.['stale']===!![];return freshnessVerdicts['set'](a,{'expiresAt':b+FRESHNESS_TTL_MS,'stale':f}),f;}catch{return freshnessVerdicts['set'](a,{'expiresAt':b+FRESHNESS_FAIL_TTL_MS,'stale':![]}),![];}}export function __resetIndexFreshnessCache(){freshnessVerdicts['clear']();}export function withDegradedReasons(a,b){return a['coverage']=createQueryCoverage({'mode':a['coverage']['mode'],'totalEnumerated':a['coverage']['total_enumerated'],'truncated':a['coverage']['truncated'],'chainId':a['coverage']['chain_id'],'degradedReasons':[...a['coverage']['degraded_reasons'],...b]}),a;}export function indexErrorCode(a){const b=a?.['code'];return typeof b==='string'&&/^INDEX_[A-Z_]+$/['test'](b)?b:'INDEX_UNAVAILABLE';}async function withRemoteIndex(a,b,c){const d=discoveryDataSource(),e=indexUrlFor(a);if(d==='legacy'||d==='auto'&&!e)return c();if(!e)throw new Error('INDEX_NOT_CONFIGURED:\x20WOWOK_INDEX_URL\x20is\x20required');if(d==='auto'&&await indexReportsStale(e))return withDegradedReasons(await c(),['REMOTE_INDEX_FALLBACK','INDEX_STALE_PROJECTION']);try{const f=await b(e);if(d==='auto'&&f['total_enumerated']===0x0)return withDegradedReasons(await c(),['REMOTE_INDEX_FALLBACK','INDEX_KIND_EMPTY']);return f;}catch(g){if(d==='remote')throw g;return withDegradedReasons(await c(),['REMOTE_INDEX_FALLBACK',indexErrorCode(g)]);}}async function collectObjectIdsByEvent(a,b,c,d,e){const f=new Set();let g=null,h=![];while(f['size']<d){const i=await query_events({'type':a,'cursor':g,'limit':0x32,'order':'descending','no_cache':e,'network':c}),j=i?.['data']??[];if(j['length']===0x0)break;for(const k of j){const l=b(k);if(l)f['add'](l);}h=!!(i?.['hasNextPage']&&i?.['nextCursor']);if(!h)break;g=i?.['nextCursor']??null;}return{'ids':Array['from'](f)['slice'](0x0,d),'hasMore':h};}async function projectionChainId(a){try{return await resolveChainIdentity(a)??undefined;}catch{return undefined;}}function projectionCoverage(a,b,c){return createQueryCoverage({'mode':'event_window','totalEnumerated':b,'truncated':![],'chainId':a,'degradedReasons':['EVENT_BACKED_ENUMERATION','PROJECTION_CACHED','PROJECTION_REFRESHED_AT='+c]});}function weiString(a){return typeof a==='string'&&/^\d+$/['test'](a)?a:undefined;}function serviceProjectionRows(a){return a['map'](b=>{const c=b['json']??{},d=Array['isArray'](c['sales'])?c['sales']:[],e=d['map'](h=>weiString(h['price']))['filter'](h=>!!h)['sort'](),f=Array['isArray'](c['arbitrations'])?c['arbitrations']:[],g=weiString(c['compensation_fund']);return{'object_id':b['object'],'owner':typeof c['owner']==='string'?c['owner']:undefined,'type_raw':b['type_raw'],'name':b['name'],'location':b['location'],'description':typeof c['description']==='string'?c['description']:undefined,'coin_type':b['type_raw']?extractGenericTypeArg(b['type_raw']):undefined,'published':c['bPublished']===!![]?0x1:0x0,'paused':c['bPaused']===!![]?0x1:0x0,'price_min_wei':e[0x0],'price_max_wei':e['length']>0x0?e[e['length']-0x1]:undefined,'cap_arbitration':f['length']>0x0?0x1:0x0,'cap_compensation':g!==undefined&&g!=='0'?0x1:0x0,'cap_machine':c['machine']!=null?0x1:0x0,'cap_messenger':c['um']!=null?0x1:0x0,'cap_buy_guard':c['buy_guard']!=null?0x1:0x0,'cap_wip':d['some'](h=>typeof h['wip_hash']==='string'&&h['wip_hash']['length']>0x0)?0x1:0x0,'payload':JSON['stringify'](b)};});}function objectProjectionRows(a){return a['filter'](b=>typeof b?.['object']==='string')['map'](b=>({'object_id':String(b['object']),'owner':typeof b['owner']==='string'?b['owner']:undefined,'location':typeof b['location']==='string'?b['location']:undefined,'description':typeof b['description']==='string'?b['description']:undefined,'payload':JSON['stringify'](b)}));}async function projectionRecord(a,b,c,d,e){try{const f=await projectionChainId(b);if(f)projectionUpsert(f,a,c,{'hasMore':d,'maxObjects':e});}catch{}}async function serveFromProjectionServices(a,b){try{const c=await projectionChainId(a);if(!c)return undefined;const d=projectionServe(c,'Service',{'location_any':b['location_any'],'name_contains':b['name_contains'],'coin_type':b['coin_type']},b['max_objects']??0xc8);if(!d)return undefined;return{'services':d['items'],'total_enumerated':d['meta']['total_rows'],'has_more':![],'coverage':projectionCoverage(c,d['meta']['total_rows'],d['meta']['watermark']['refreshed_at'])};}catch{return undefined;}}async function enumerateServicesByEvent(a,b={}){const c=b['max_objects']??0xc8,{ids:d,hasMore:e}=await collectObjectIdsByEvent('ServiceEvent',l=>typeof l?.['object']==='string'?l['object']:undefined,a,c,b['no_cache']),f=await a256a(d,a,b['no_cache']),g=(b['location_any']??[])['map'](l=>l['toLowerCase']()),h=b['name_contains']?.['toLowerCase'](),i=f['filter'](l=>(l?.['type']??'')==='Service'),j=i['map'](l=>({'object':String(l['object']),'type_raw':typeof l['type_raw']==='string'?l['type_raw']:undefined,'name':typeof l['name']==='string'?l['name']:undefined,'location':typeof l['location']==='string'?l['location']:'','json':{...l,'compensation_fund':toStr(l['compensation_fund']),'sales':Array['isArray'](l['sales'])?l['sales']['map'](m=>({...m,'price':toStr(m['price'])})):[]}}));await projectionRecord('Service',a,serviceProjectionRows(j),e,c);const k=j['filter'](l=>{if(b['coin_type']&&extractGenericTypeArg(l['type_raw']??'')!==b['coin_type'])return![];if(h&&!(typeof l['name']==='string'&&l['name']['toLowerCase']()['includes'](h)))return![];if(g['length']===0x0)return!![];const m=typeof l['location']==='string'?l['location']['toLowerCase']():'';return g['some'](n=>m['includes'](n));});return{'services':k,'total_enumerated':i['length'],'has_more':e,'coverage':createQueryCoverage({'mode':'event_window','totalEnumerated':i['length'],'truncated':e,'degradedReasons':['EVENT_BACKED_ENUMERATION']})};}async function enumerateDemandsByEvent(a,b={}){const c=b['max_objects']??0xc8,{ids:d,hasMore:e}=await collectObjectIdsByEvent('DemandChangedEvent',h=>typeof h?.['object']==='string'?h['object']:undefined,a,c,b['no_cache']),f=await a256a(d,a,b['no_cache']),g=f['filter'](h=>(h?.['type']??'')==='Demand')['map'](h=>h);return await projectionRecord('Demand',a,objectProjectionRows(g),e,c),{'demands':g,'total_enumerated':g['length'],'has_more':e,'coverage':createQueryCoverage({'mode':'event_window','totalEnumerated':g['length'],'truncated':e,'degradedReasons':['EVENT_BACKED_ENUMERATION']})};}async function enumerateArbsByEvent(a,b={}){const c=b['max_objects']??0xc8,{ids:d,hasMore:e}=await collectObjectIdsByEvent('ArbEvent',j=>typeof j?.['arb']==='string'?j['arb']:undefined,a,c,b['no_cache']),f=await a256a(d,a,b['no_cache']),g=b['status']===undefined?undefined:Array['isArray'](b['status'])?b['status']:[b['status']],h=f['filter'](j=>(j?.['type']??'')==='Arb')['map'](j=>j),i=h['filter'](j=>b['arbitration']?j['arbitration']===b['arbitration']:!![])['filter'](j=>b['order']?j['order']===b['order']:!![])['filter'](j=>g?g['includes'](Number(j['status'])):!![]);return await projectionRecord('Arb',a,objectProjectionRows(h),e,c),{'arbs':i,'total_enumerated':h['length'],'has_more':e,'coverage':createQueryCoverage({'mode':'event_window','totalEnumerated':h['length'],'truncated':e,'degradedReasons':['EVENT_BACKED_ENUMERATION']})};}export async function enumerateServices(a,b={}){return withRemoteIndex(a,c=>query_services({...b,'network':a,'data_source':'remote','index_url':c}),async()=>{if(!b['no_cache']){const d=await serveFromProjectionServices(a,b);if(d)return d;}const c=await enumerateServicesByEvent(a,b);return c;});}export async function enumerateDemands(a,b={}){return withRemoteIndex(a,c=>query_demands({...b,'network':a,'data_source':'remote','index_url':c}),async()=>{if(!b['no_cache'])try{const c=await projectionChainId(a),d=c?projectionServe(c,'Demand',{},b['max_objects']??0xc8):undefined;if(d)return{'demands':d['items'],'total_enumerated':d['meta']['total_rows'],'has_more':![],'coverage':projectionCoverage(c,d['meta']['total_rows'],d['meta']['watermark']['refreshed_at'])};}catch{}return enumerateDemandsByEvent(a,b);});}export async function enumerateArbs(a,b={}){const c=b['status']===undefined?undefined:Array['isArray'](b['status'])?b['status']['map'](Number):Number(b['status']);return withRemoteIndex(a,d=>query_arbs({...b,'status':c,'network':a,'data_source':'remote','index_url':d}),async()=>{if(!b['no_cache'])try{const d=await projectionChainId(a),e=d?projectionServe(d,'Arb',{'arbitration':b['arbitration'],'order':b['order'],'status':b['status']===undefined?undefined:Array['isArray'](b['status'])?b['status']['map'](Number):[Number(b['status'])]},b['max_objects']??0xc8):undefined;if(e)return{'arbs':e['items'],'total_enumerated':e['meta']['total_rows'],'has_more':![],'coverage':projectionCoverage(d,e['meta']['total_rows'],e['meta']['watermark']['refreshed_at'])};}catch{}return enumerateArbsByEvent(a,b);});}export function weiToWowDecimal(a){if(!/^\d+$/['test'](a))throw new Error('Not\x20a\x20wei\x20decimal\x20string:\x20'+a);const b=a['padStart'](0xa,'0'),c=b['slice'](0x0,-0x9)['replace'](/^0+(?=\d)/,''),d=b['slice'](-0x9)['replace'](/0+$/,'');return d?c+'.'+d:c;}async function matchViaIndex(a,b,c){const d=indexUrlFor(a,c['indexUrl']);if(!d)throw new RemoteIndexError('INDEX_NOT_CONFIGURED','WOWOK_INDEX_URL\x20or\x20index_url\x20is\x20required');if(discoveryDataSource()==='auto'&&await indexReportsStale(d))throw new RemoteIndexError('INDEX_STALE_PROJECTION','Remote\x20index\x20projection\x20is\x20behind\x20the\x20chain\x20head');const e=await resolveChainIdentity(a);if(!e)throw new RemoteIndexError('INDEX_CHAIN_IDENTITY_UNAVAILABLE','JSON-RPC\x20chain\x20identity\x20is\x20required\x20before\x20reading\x20a\x20remote\x20index');const f=new RemoteIndexClient(d);return f['match']({'kind':b,'expectedChainId':e,'q':c['q'],'location':c['location'],'budget':c['budgetWei']!==undefined?weiToWowDecimal(c['budgetWei']):undefined,'industry':c['industry'],'capabilities':c['capabilities'],'limit':c['limit'],'recallLimit':c['recallLimit'],'includePayload':!![]});}export async function matchServicesViaIndex(a,b={}){return matchViaIndex(a,'Service',b);}export async function matchDemandsViaIndex(a,b={}){const d=await matchViaIndex(a,'Demand',b),e=[];let f=0x0;for(const h of d['candidates']){if(!h['payloadJson']||h['verifiedKind']!=='Demand'){f+=0x1;continue;}try{const i=data2object({'objectId':h['objectId'],'version':h['objectVersion'],'type':PackageAddress+'::demand::Demand','content':{'fields':h['payloadJson']}});if(i['type']!=='Demand'){f+=0x1;continue;}typeof i['presenters_count']==='string'&&/^\d+$/['test'](i['presenters_count'])&&(i['presenters_count']=Number(i['presenters_count'])),e['push'](i);}catch{f+=0x1;}}const g=f>0x0?createQueryCoverage({'mode':d['coverage']['mode'],'totalEnumerated':d['coverage']['total_enumerated'],'truncated':d['coverage']['truncated'],'chainId':d['coverage']['chain_id'],'degradedReasons':[...d['coverage']['degraded_reasons'],'MATCH_PAYLOAD_MISSING='+f+'\x20of\x20'+d['candidates']['length']+'\x20candidates']}):d['coverage'];return{'demands':e,'total_enumerated':d['recall']['liveSet']??d['recall']['gated'],'has_more':d['truncated'],'coverage':g};}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const KNOB_UNIT_HINTS=[{'suffix':'_bps','doc':'basis\x20points\x20(1/10000\x20=\x200.01%)\x20of\x20the\x20amount\x20the\x20rate\x20applies\x20to'},{'suffix':'_days','doc':'days\x20—\x20relative\x20window/duration\x20measured\x20from\x20this\x20template\x27s\x20anchor\x20(see\x20the\x20notes\x20below)'},{'suffix':'_hours','doc':'hours\x20—\x20relative\x20window/duration'},{'suffix':'_months','doc':'months'},{'suffix':'_ms','doc':'epoch\x20milliseconds\x20—\x20ABSOLUTE\x20instant\x20(ms\x20since\x201970\x20UTC),\x20NOT\x20a\x20duration;\x20override\x20per\x20build'},{'suffix':'_usd','doc':'USD\x20figure\x20—\x20off-chain\x20reference/benchmark'}];const MERGED_LOCK_DOC='days\x20—\x20relative\x20window;\x20if\x20listed\x20in\x20this\x20template\x27s\x20settlement_window_merge,\x20it\x20folds\x20into\x20the\x20ONE\x20'+'settlement\x20time-lock\x20(the\x20compiled\x20release\x20instant\x20is\x20the\x20SUM\x20of\x20the\x20merged\x20windows\x20—\x20compile\x20refuses\x20'+'a\x20disagreeing\x20literal)',KNOB_DOCS={'review_reward_pool':'RAW\x20on-chain\x20smallest\x20units\x20(u64),\x20NOT\x20human\x20units\x20—\x20e.g.\x20a\x200.5\x20WOW\x20pool\x20is\x20500000000.\x20Pool\x20plan\x20'+'benchmark\x20(expected\x20claims\x20x\x20review_reward_per_claim);\x20funded\x20at\x20build\x20time\x20via\x20the\x20reward_funding\x20input','review_reward_per_claim':'RAW\x20on-chain\x20smallest\x20units\x20per\x20claim\x20—\x20the\x20pool\x20plan\x20=\x20expected\x20claims\x20x\x20this\x20value\x20'+'(e.g.\x200.02\x20WOW\x20=\x2020\x20claims\x20at\x200.001\x20WOW/claim)','courier_fee':'RAW\x20on-chain\x20smallest\x20units\x20per\x20order\x20(e.g.\x205\x20WOW\x20=\x20500000000)\x20—\x20a\x20disclosure-only\x20pricing\x20input\x20on\x20'+'this\x20template\x20(TPL-04)','min_sku_price':'floor-price\x20constraint\x20—\x20the\x20fixed\x20fulfillment\x20fee\x20must\x20stay\x20BELOW\x20the\x20cheapest\x20listed\x20SKU:\x20a\x20'+'sub-fee\x20order\x20deadlocks\x20(EINSUFFICIENT_BALANCE:\x20balance\x20>=\x20fix)','commission_rate_bps':'basis\x20points\x20of\x20the\x20order\x20total\x20(10000\x20=\x20100%);\x20whether\x20a\x20settlement\x20row\x20actually\x20reads\x20it\x20is\x20'+'template-specific\x20—\x20see\x20the\x20User\x20inputs\x20notes\x20below','platform_commission_bps':'basis\x20points\x20of\x20the\x20order\x20total\x20(10000\x20=\x20100%);\x20whether\x20a\x20platform\x20settlement\x20row\x20actually\x20reads\x20it\x20'+'is\x20template-specific\x20—\x20see\x20the\x20User\x20inputs\x20notes\x20below','merchant_service_fee_bps':'basis\x20points\x20of\x20the\x20order\x20total\x20(10000\x20=\x20100%)\x20—\x20the\x20merchant\x27s\x20own\x20fee;\x20its\x20recipient\x20Entity\x20must\x20'+'be\x20explicit\x20and\x20non-empty\x20(an\x20empty\x20Entity\x20recipient\x20burns\x20the\x20share\x20permanently)','settlement_days':MERGED_LOCK_DOC,'reserve_days':MERGED_LOCK_DOC,'return_window_days':MERGED_LOCK_DOC,'claim_window_days':'days\x20—\x20the\x20dispute-FILING\x20window:\x20filing\x20closes\x20at\x20window\x20entry\x20+\x20this\x20value;\x20the\x20merged\x20settlement\x20'+'duration\x20must\x20stay\x20>=\x20this\x20value\x20so\x20filing\x20always\x20shuts\x20before\x20the\x20release\x20opens','dispute_window_days':'days\x20—\x20post-settlement\x20arbitration\x20claim\x20window','auto_confirm_days':'days\x20after\x20shipment\x20—\x20buyer\x20silence\x20auto-confirms\x20delivery\x20(keeper\x20AutoConfirmDelivery);\x20a\x20silent\x20'+'buyer\x20can\x20never\x20strand\x20the\x20escrow','review_window_days':'days\x20after\x20delivery\x20—\x20reviews\x20are\x20accepted\x20only\x20WITHIN\x20this\x20window','reward_claim_closes_after_days':'days\x20after\x20the\x20review\x20node\x20entry\x20—\x20the\x20reward\x20claim\x20window\x20closes\x20then\x20(the\x20window\x20is\x20'+'opens_after_days\x20+\x20closes_after_days\x20where\x20both\x20are\x20declared)','processing_time_days':'days\x20from\x20order\x20entry\x20—\x20the\x20ship\x20deadline;\x20lapsing\x20unshipped\x20=\x20keeper\x20force-cancel\x20with\x20a\x20full\x20'+'buyer\x20refund\x20(permission\x201002)','settlement_delay_days':'days\x20after\x20delivery\x20confirmation\x20—\x20the\x20fast\x20settlement\x20release\x20delay\x20(the\x200-3\x20day\x20lever\x20vs\x20the\x20'+'marketplace-length\x20cycle)','free_cancel_hours':'hours\x20from\x20order\x20entry\x20—\x20free\x20cancellation\x20closes\x20after\x20this\x20(benchmark:\x20processing_time_days\x20x\x2024,\x20'+'the\x20same\x20ship\x20deadline)','campaign_deadline_ms':'ABSOLUTE\x20epoch\x20milliseconds\x20(ms\x20since\x201970\x20UTC),\x20NOT\x20a\x20duration\x20—\x20ONE\x20shared\x20deadline\x20for\x20every\x20'+'order\x20of\x20the\x20round;\x20ALWAYS\x20override\x20per\x20build\x20(0\x20=\x20UNSET\x20where\x20allowed);\x20bind\x20'+'pattern.time_source_repository_oracle\x20for\x20a\x20real-world\x20calendar\x20date','service_start_ms':'ABSOLUTE\x20epoch\x20milliseconds\x20(ms\x20since\x201970\x20UTC),\x20NOT\x20a\x20duration\x20—\x20override\x20per\x20build','required_info_enforcement':'selector:\x20\x22off\x22\x20keeps\x20the\x20tracking-only\x20ship\x20gate;\x20\x22on\x22\x20mounts\x20the\x20composite\x20ship_enforced\x20'+'design\x20(required\x20buyer\x20info\x20demanded\x20before\x20shipping)','storefront_mode':'selector\x20for\x20the\x20storefront\x20shape;\x20the\x20declared\x20default\x20is\x20the\x20DROPPED\x20side\x20of\x20the\x20gated\x20variant\x20—\x20'+'a\x20caller\x20who\x20never\x20answers\x20the\x20wizard\x20question\x20gets\x20the\x20public\x20shape\x20(no\x20buy\x20gate)','deposit_exit_policy':'selector\x20for\x20what\x20happens\x20to\x20the\x20deposit\x20on\x20exit:\x20the\x20benchmark\x20default\x20is\x20\x22kill_fee\x22\x20and\x20it\x20'+'REMAINS\x20user-overridable\x20at\x20build\x20time\x20(a\x20MUST-ASK\x20input)\x20—\x20a\x20buyer-friendly\x20store\x20passes\x20'+'\x22refund\x22;\x20a\x20full\x20forfeit\x20(10000/0)\x20is\x20expressible\x20but\x20never\x20shipped\x20by\x20default','restock_on_refund':'declares\x20the\x20refund→replenish\x20policy:\x20whether/when\x20the\x20keeper\x20may\x20trigger\x20the\x20refund-driven\x20'+'restock.\x20The\x20chain\x20does\x20NOT\x20state-gate\x20restock\x20—\x20this\x20declaration\x20is\x20the\x20build-time\x20record','cancellation_policy':'string\x20enum\x20read\x20by\x20the\x20conditional_guards\x20family;\x20\x221\x22\x20=\x20flexible\x20(full\x20refund\x20until\x2024h\x20before\x20'+'check-in)\x20is\x20the\x20benchmark\x20default\x20the\x20wizard\x20ships\x20when\x20the\x20host\x20never\x20answers','errand_line':'selector\x20for\x20the\x20errand\x20evidence\x20line:\x20\x22carry\x22\x20(custody\x20evidence)\x20is\x20the\x20strongest\x20and\x20most\x20'+'common\x20line;\x20override\x20per\x20build\x20via\x20inputs.errand_line','point_type':'selector\x20for\x20the\x20community\x20point\x20shape:\x20\x22shelve_by_point\x22\x20(staffed\x20shelf)\x20is\x20the\x20benchmark\x20'+'community\x20design;\x20override\x20per\x20build\x20via\x20inputs.point_type','unclaimed_exit':'the\x20never-collected\x20terminal:\x20DEFAULT\x20\x22refund_buyer\x22\x20—\x20the\x20principal\x20returns\x20to\x20the\x20buyer;\x20'+'\x22settle_merchant\x22\x20is\x20the\x20explicit\x20opt-in\x20and\x20hard-carries\x20the\x20unclaimed_late_appeal\x20keeper\x20leg','arb_payout_pairing':'pairs\x20the\x20dispute\x20remedy\x20with\x20the\x20payout\x20rail:\x20default\x20\x22either\x22;\x20\x22stacked\x22\x20(refund\x20+\x20compensation)\x20'+'is\x20declared\x20but\x20its\x20money\x20rail\x20is\x20pending\x20protocol\x20approval\x20—\x20selecting\x20it\x20still\x20settles\x20under\x20'+'\x22either\x22,\x20with\x20the\x20intent\x20disclosed\x20on\x20the\x20quote/plan\x20faces','deposit_amount':'RAW\x20on-chain\x20smallest\x20units\x20—\x20the\x20per-unit\x20DEPOSIT\x20captured\x20at\x20buy\x20(injected\x20at\x20build\x20time)','full_price':'RAW\x20on-chain\x20smallest\x20units\x20—\x20the\x20TOTAL\x20order\x20price,\x20declared\x20separately\x20from\x20the\x20deposit','balance_amount':'RAW\x20on-chain\x20smallest\x20units\x20—\x20the\x20BALANCE\x20captured\x20at\x20the\x20balance_due→balance_paid\x20step','min_balance':'template\x20directive\x20\x22${full_price}\x22\x20—\x20lands\x20the\x20real\x20number\x20with\x20the\x20input;\x20with\x20NO\x20input\x20the\x20'+'directive\x20string\x20reaches\x20the\x20kernel\x20and\x20is\x20rejected\x20at\x20deploy\x20(fail-loud\x20—\x20never\x20a\x20silently\x20'+'open\x20fund\x20gate)','min_monthly_rent_usd':'DESPITE\x20the\x20_usd\x20suffix\x20this\x20is\x20a\x20directive\x20string,\x20NOT\x20a\x20USD\x20figure\x20—\x20a\x20hard\x20invariant:\x20the\x20'+'order\x20price\x20must\x20be\x20exactly\x20lease_months\x20×\x20monthly_rent_amount\x20+\x20deposit_amount\x20so\x20every\x20pinned\x20'+'Amount\x20leg\x20is\x20covered\x20by\x20construction','min_term_price_usd':'DESPITE\x20the\x20_usd\x20suffix\x20this\x20is\x20a\x20directive\x20string,\x20NOT\x20a\x20USD\x20figure\x20—\x20a\x20hard\x20invariant:\x20the\x20'+'price\x20must\x20cover\x20the\x20per-term\x20Amount\x20leg\x20(a\x20hard\x20subtraction\x20with\x20no\x20on-chain\x20floor)','min_booking_amount':'a\x20hard\x20invariant,\x20NOT\x20a\x20benchmark\x20value:\x20must\x20exceed\x20the\x20sum\x20of\x20the\x20per-segment\x20fixed\x20Amounts\x20—\x20'+'the\x20layer-2\x20per-segment\x20legs\x20must\x20fit\x20inside\x20the\x20escrowed\x20order\x20total','allocator_threshold':'the\x20POOL-GLOBAL\x20payout\x20threshold,\x20MUST\x20be\x20<=\x20deposit_amount\x20(the\x20minimum\x20payout\x20unit):\x20it\x20gates\x20'+'EVERY\x20alloc,\x20so\x20a\x20threshold\x20above\x20the\x20deposit\x20would\x20block\x20the\x20deposit-exit\x20refund\x20(stranding)','min_order_price':'RAW\x20smallest\x20units\x20(~a\x20floor\x20above\x20any\x20fixed\x20leg)\x20—\x20the\x20floor\x20sits\x20STRICTLY\x20ABOVE\x20any\x20fixed\x20'+'Amount\x20leg\x20a\x20builder\x20adds:\x20a\x20sub-fee\x20order\x20can\x20neither\x20settle\x20nor\x20refund\x20(alloc\x20asserts\x20'+'balance\x20>=\x20fix)','min_term_price':'hard\x20floor,\x20NOT\x20a\x20benchmark:\x20the\x20per-session\x20Amount\x20leg\x20fires\x20session_count\x20times,\x20so\x20the\x20pool\x20'+'must\x20cover\x20session_count\x20×\x20per_session_release\x20(shipped\x20pricing\x20has\x20zero\x20headroom)','membership_price':'RAW\x20base\x20units\x20(9-decimal)\x20—\x20the\x20membership\x20gate\x20amount;\x20a\x20template\x20knob\x20so\x20a\x20zero-input\x20catalog\x20'+'build\x20carries\x20a\x20REAL\x20amount\x20(override\x20per\x20build\x20via\x20the\x20membership_price\x20input)','session_count':'count\x20—\x20the\x20number\x20of\x20sessions;\x20the\x20per-session\x20Amount\x20leg\x20fires\x20this\x20many\x20times','per_session_release':'RAW\x20smallest\x20units\x20—\x20the\x20amount\x20released\x20per\x20session;\x20the\x20pool\x20must\x20cover\x20'+'session_count\x20×\x20per_session_release','term_price':'RAW\x20smallest\x20units\x20—\x20the\x20per-term\x20price\x20benchmark\x20(pinned\x20per-term\x20Amount\x20legs)','monthly_rent_amount':'RAW\x20on-chain\x20smallest\x20units\x20—\x20the\x20monthly\x20rent;\x20the\x20order\x20price\x20locks\x20to\x20lease_months\x20×\x20this\x20+\x20'+'deposit_amount','damage_max_amount':'RAW\x20on-chain\x20smallest\x20units\x20—\x20the\x20damage-charge\x20cap\x20of\x20the\x20lease','early_exit_penalty_amount':'RAW\x20on-chain\x20smallest\x20units\x20—\x20the\x20early-termination\x20penalty\x20(benchmark:\x20one\x20month\x27s\x20rent)','max_discount_bps':'basis\x20points\x20—\x20the\x20maximum\x20discount\x20ceiling:\x20(min_term_price\x20−\x20session_count\x20×\x20per_session_release)\x20'+'/\x20min_term_price\x20×\x2010000;\x20above\x20it\x20a\x20mid-sequence\x20release\x20is\x20a\x20proven\x20EINSUFFICIENT_BALANCE\x20abort','digital_product_fee_bps':'basis\x20points\x20of\x20the\x20sale\x20—\x20the\x20digital-product\x20fee\x20share\x20(benchmark\x205%\x20=\x20500,\x20bounded\x20by\x20the\x20'+'min/max\x20tier\x20knobs;\x20natively\x20expressible)','contract_fee_small_usd':'USD\x20—\x20the\x20small-tier\x20contract\x20fee\x20(settle-tier\x20gate\x20pairing)','contract_fee_large_usd':'USD\x20—\x20the\x20large-tier\x20contract\x20fee;\x20the\x20tier\x20boundary\x20is\x20its\x20own\x20knob','contract_fee_tier_boundary_usd':'USD\x20—\x20orders\x20at/above\x20this\x20boundary\x20use\x20the\x20large-tier\x20fee','kill_fee_bps':'basis\x20points\x20of\x20the\x20at-stake\x20amount\x20kept\x20as\x20the\x20kill\x20fee\x20on\x20early\x20exit\x20(benchmark\x2030%;\x20a\x20full\x20'+'forfeit\x20is\x20expressible\x20but\x20never\x20shipped\x20by\x20default\x20—\x20forfeits\x20above\x20the\x20benchmark\x20are\x20'+'negotiated\x20via\x20the\x20quote\x20flow,\x20never\x20silently\x20executed)','kill_fee_buyer_bps':'basis\x20points\x20of\x20the\x20at-stake\x20amount\x20returned\x20to\x20the\x20buyer\x20on\x20exit\x20(complement\x20of\x20kill_fee_bps;\x20'+'the\x20pair\x20must\x20sum\x2010000)','arb_indemnity_floor_bps':'basis\x20points\x20—\x20the\x20ADVISORY\x20indemnity\x20floor\x20disclosed\x20at\x20build;\x20the\x20chain\x20pays\x20what\x20the\x20'+'arbitrator\x20ruled,\x20the\x20leg\x20only\x20re-gates\x20the\x20refund\x20edge','platform_rate_cap_bps':'basis\x20points\x20—\x20the\x20MCP-side\x20ADVISORY\x20ceiling\x20for\x20settlement\x20Rate\x20legs\x20a\x20builder\x20adds\x20(cap\x20'+'jurisdictions;\x20benchmark\x201500:\x20delivery-related\x20fees\x20<=\x2015%)','incumbent_take_bps':'basis\x20points\x20—\x20the\x20INCUMBENT\x20marketplace\x27s\x20take,\x20benchmark\x20DISCLOSURE\x20ONLY;\x20no\x20allocator\x20row\x20'+'reads\x20it\x20(this\x20template\x27s\x20own\x20take\x20is\x20its\x20platform\x20knobs)','courier_tip_bps':'basis\x20points\x20—\x20the\x20optional\x20courier\x20tip\x20leg\x20(expressible\x20on\x20the\x20payout\x20path);\x20domestic\x20default\x200,\x20'+'overseas\x20benchmark\x201500-2000\x20(15-20%)','host_rate_bps':'basis\x20points\x20—\x20the\x20host\x27s\x20share\x20of\x20the\x20booking\x20(complement\x20is\x20the\x20platform\x20rate;\x2010000\x20=\x20host\x20'+'keeps\x20everything)','institution_share_bps':'basis\x20points\x20—\x20the\x20institution\x20vs\x20platform\x20split\x20of\x20tuition\x20(the\x20pair\x20must\x20sum\x2010000)','creator_settlement_retain_bps':'basis\x20points\x20—\x20the\x20share\x20the\x20platform\x20RETAINS\x20from\x20creator\x20settlement;\x200\x20=\x20full\x20payout\x20to\x20the\x20creator','producer_bps':'basis\x20points\x20—\x20the\x20producer\x20vs\x20publisher\x20split\x20(the\x20pair\x20must\x20sum\x2010000;\x20a\x20sole\x20producer\x20sets\x2010000/0)','publisher_bps':'basis\x20points\x20—\x20the\x20publisher\x20side\x20of\x20the\x20producer/publisher\x20split\x20(the\x20pair\x20must\x20sum\x2010000)','primary_holder_bps':'basis\x20points\x20—\x20the\x20primary\x20holder\x27s\x20share\x20of\x20the\x20payout\x20(the\x20holder\x20pair\x20must\x20sum\x2010000)','co_holder_bps':'basis\x20points\x20—\x20the\x20co-holder\x27s\x20share\x20of\x20the\x20payout\x20(the\x20holder\x20pair\x20must\x20sum\x2010000)','partner_share_bps':'basis\x20points\x20—\x20the\x20partner\x27s\x20share\x20(the\x20complement\x20stays\x20with\x20the\x20house)','bounty_high_hunter_bps':'basis\x20points\x20of\x20the\x20bounty\x20pool\x20paid\x20for\x20the\x20top\x20severity\x20tier;\x20the\x20tiers\x20partition\x20the\x20pool\x20—\x20'+'a\x20partial\x20top\x20tier\x20would\x20need\x20a\x20remainder\x20leg\x20the\x20shipped\x20rows\x20do\x20not\x20declare','bounty_medium_hunter_bps':'basis\x20points\x20of\x20the\x20bounty\x20pool\x20paid\x20for\x20the\x20medium\x20severity\x20tier','bounty_low_hunter_bps':'basis\x20points\x20of\x20the\x20bounty\x20pool\x20paid\x20for\x20the\x20low\x20severity\x20tier','production_lead_days':'days\x20—\x20the\x20production\x20lead\x20time\x20before\x20the\x20ship\x20deadline','balance_window_days':'days\x20—\x20the\x20balance-due\x20payment\x20window\x20after\x20the\x20deposit\x20(deposit_balance\x20plans)','restock_confirm_days':'days\x20—\x20the\x20keeper\x27s\x20restock\x20confirmation\x20window\x20after\x20a\x20refund','escrow_release_days':'days\x20—\x20the\x20escrow\x20release\x20window:\x20settlement\x20fires\x20this\x20many\x20days\x20after\x20the\x20template\x27s\x20acceptance\x20anchor','dispute_timeout_days':'days\x20—\x20the\x20dispute-response\x20timeout\x20window','instant_cancel_hours':'hours\x20from\x20order\x20entry\x20—\x20the\x20instant-cancel\x20window\x20(full\x20refund);\x20after\x20it,\x20a\x20mid-work\x20exit\x20'+'rides\x20the\x20response_timeout\x20keeper\x20path','requirements_timeout_hours':'hours\x20—\x20the\x20buyer-requirements\x20submission\x20timeout','response_timeout_hours':'hours\x20—\x20the\x20keeper\x20resolves\x20the\x20request\x20in\x20the\x20buyer\x27s\x20favour\x20once\x20it\x20lapses:\x20the\x20buyer\x27s\x20'+'worst-case\x20wait\x20for\x20a\x20mid-work\x20exit\x20after\x20the\x20instant-cancel\x20window','defect_report_window_hours':'hours\x20from\x20the\x20LAST\x20delivery\x20entry\x20—\x20revising\x20entry\x20is\x20allowed\x20only\x20within\x20this\x20window;\x20a\x20'+'re-delivery\x20appends\x20a\x20fresh\x20entry\x20and\x20resets\x20it','acceptance_timeout_hours':'hours\x20—\x20the\x20acceptance\x20timeout\x20on\x20delivered\x20work','evaluation_window_days':'days\x20—\x20the\x20keeper\x20releases\x20escrow\x20to\x20the\x20provider\x20on\x20lapse\x20(agent-native\x20tasks\x20are\x20short-horizon,\x20'+'so\x20tighter\x20than\x20a\x20human\x20freelance\x20contract\x27s\x2014\x20days)','triage_window_days':'days\x20—\x20the\x20window\x20in\x20which\x20the\x20hunter\x20may\x20escalate\x20to\x20arbitration\x20(benchmarked\x20to\x20the\x20~5-workday\x20'+'mediation\x20incumbent;\x20a\x20keeper/dispute\x20anchor,\x20NOT\x20an\x20auto-pay\x20timer)','submission_window_days':'days\x20—\x20how\x20long\x20entries\x20are\x20accepted\x20before\x20the\x20judge\x20closes\x20submissions\x20(the\x20gate\x20on\x20'+'funded→judging)','appeal_window_days':'days\x20—\x20how\x20long\x20a\x20losing\x20entrant\x20may\x20contest\x20the\x20provisional\x20placement\x20(the\x20gate\x20on\x20'+'placement_provisional→placement_final)','delivery_window_days':'days\x20—\x20the\x20auto-accept\x20window\x20on\x20delivered\x20work:\x20silence\x20past\x20this\x20window\x20takes\x20the\x20designed\x20'+'default\x20path,\x20so\x20a\x20guaranteed\x20release\x20can\x20never\x20be\x20withheld\x20by\x20receiver\x20silence','stay_nights':'count\x20—\x20the\x20stay\x20length;\x20the\x20leg\x20measures\x20order\x20time\x20+\x20stay_nights\x20days\x20(the\x20booking-time\x20'+'approximation\x20of\x20the\x20missing\x20on-chain\x20departure\x20date)','segment_count':'count\x20—\x20the\x20number\x20of\x20itinerary\x20segments;\x20the\x20per-segment\x20fixed\x20Amount\x20legs\x20multiply\x20by\x20this','revision_rounds_max':'count\x20—\x20the\x20revision\x20rounds\x20included\x20before\x20extra\x20charges\x20(the\x20revision\x20loop\x20bound)','return_notice_days':'days\x20—\x20the\x20return\x20notice\x20window;\x20the\x20wizard\x20computes\x20the\x20window\x20from\x20this\x20knob\x20so\x20the\x20purpose\x20'+'prose\x20cannot\x20drift\x20(mainnet\x20lesson)','no_fault_exit_days':'days\x20—\x20the\x20no-fault\x20exit\x20notice\x20window','lease_months':'months\x20—\x20the\x20lease\x20term\x20length;\x20the\x20order\x20price\x20locks\x20to\x20lease_months\x20×\x20monthly_rent_amount\x20+\x20'+'deposit_amount','monthly_allocators':'count\x20—\x20the\x20monthly\x20payout\x20rows\x20of\x20the\x20lease\x20(12\x20=\x20one\x20per\x20lease\x20month)','early_exit_penalty_months':'months\x20of\x20rent\x20owed\x20as\x20the\x20early-exit\x20penalty','term_count':'count\x20—\x20the\x20number\x20of\x20tuition\x20terms\x20(the\x20pinned\x20per-term\x20Amount\x20legs\x20multiply)','period_days':'days\x20—\x20the\x20subscription\x20period\x20length:\x20the\x20expire\x20leg\x20measures\x20delivered\x20entry\x20+\x20period_days\x20+\x20grace_days','grace_days':'days\x20—\x20the\x20grace\x20period\x20added\x20after\x20period_days\x20before\x20the\x20expire\x20leg\x20fires','renewal_reminder_days':'days\x20before\x20period\x20end\x20—\x20the\x20renewal\x20reminder\x20anchor\x20(keeper\x20duty)','month_release_day':'day\x20of\x20month\x20(1-31)\x20—\x20the\x20monthly\x20release\x20anchor\x20for\x20the\x20subscription\x20payout','refund_window_days':'days\x20—\x20the\x20refund\x20window\x20on\x20the\x20course\x20purchase','confirm_window_hours':'hours\x20—\x20the\x20booking\x20confirmation\x20window','inspection_deadline_hours':'hours\x20—\x20the\x20move-in\x20inspection\x20deadline','objection_window_hours':'hours\x20—\x20the\x20objection\x20window\x20on\x20the\x20lease\x20outcome','inspection_window_days':'days\x20—\x20the\x20inspection\x20window\x20on\x20delivered\x20goods','confirm_timeout_hours':'hours\x20—\x20the\x20confirmation\x20timeout\x20before\x20the\x20designed\x20default\x20path\x20takes\x20over','campaign_duration_days':'days\x20—\x20the\x20campaign\x20duration\x20benchmark;\x20the\x20shared\x20cutoff\x20itself\x20is\x20campaign_deadline_ms\x20(absolute)','reward_claim_opens_after_days':'days\x20after\x20the\x20relevant\x20entry\x20—\x20an\x20explicit\x20bounty-opens\x20pin:\x20keeps\x20the\x20reward\x20claimable\x20from\x20day\x20'+'14\x20despite\x20a\x20longer\x20review\x20window\x20feeding\x20the\x20after-sales\x20derivation','auto_confirm_hours':'hours\x20after\x20shipment\x20—\x20the\x20perishable-goods\x20variant\x20of\x20buyer-silence\x20auto-confirm\x20(the\x20hours\x20'+'domain:\x20a\x2014-day\x20retail\x20window\x20on\x20a\x20meal\x20is\x20absurd)','claim_window_hours':'hours\x20—\x20the\x20dispute-filing\x20window\x20(hours\x20domain)','settle_hours':'hours\x20—\x20the\x20settlement\x20release\x20delay\x20(hours\x20domain)','pickup_window_hours':'hours\x20—\x20the\x20pickup\x20collection\x20window\x20at\x20the\x20point'};export function knobDocLines(a){const b=KNOB_DOCS[a]??KNOB_UNIT_HINTS['find'](c=>a['endsWith'](c['suffix']))?.['doc'];return b?['#\x20'+b]:[];}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{findScene,inferSceneFromFlow}from'./machine-ledger.js';export const MACHINE_TEMPLATES=[{'id':'tpl_machine_ecommerce_standard','scene_id':'ecommerce_standard','name':'Standard\x20E-commerce\x20Flow','description':'Linear\x20e-commerce\x20workflow:\x20Paid\x20(entry)\x20->\x20Ship\x20->\x20Receive\x20->\x20Complete.\x20'+'Payment\x20is\x20handled\x20by\x20the\x20Service\x20buy\x20flow\x20(direct\x20or\x20Passport-gated\x20purchase)\x20atomically;\x20Machine\x20starts\x20at\x20post-payment\x20state.\x20'+'Reaching\x20Complete\x20does\x20NOT\x20move\x20funds\x20—\x20allocation\x20is\x20a\x20separate\x20submitted\x20call\x20and\x20allocation.move\x20has\x20no\x20timer,\x20'+'so\x20a\x20keeper\x20(merchant\x20or\x20buyer-side\x20trigger)\x20must\x20fire\x20it\x20or\x20the\x20order\x20stays\x20settled-but-unpaid.\x20Recommended\x20baseline\x20for\x20new\x20merchants.','recommended_patterns':['P-M-SEQ'],'recommended_topology':['P-M-LINEAR'],'parameters':[{'name':'merchant_permission','type':'permission_ref','required':!![],'description':'Merchant\x20Permission\x20object\x20address\x20or\x20name\x20(must\x20have\x20custom\x20indices\x20defined)','constraint':'Permission\x20must\x20already\x20be\x20created;\x20index\x202\x20(merchant)\x20and\x20index\x203\x20(admin)\x20recommended'},{'name':'ship_forward_name','type':'string','required':!![],'default':'Ship','description':'Forward\x20name\x20for\x20shipping\x20step','constraint':'Must\x20be\x20<64\x20BCS\x20bytes;\x20only\x20letters/digits/underscore'},{'name':'receive_forward_name','type':'string','required':!![],'default':'Receive','description':'Forward\x20name\x20for\x20customer\x20receipt\x20confirmation'},{'name':'complete_node_name','type':'string','required':!![],'default':'Complete','description':'Terminal\x20node\x20name\x20triggering\x20fund\x20allocation'}],'example_nodes':[{'name':'Paid','description':'Entry:\x20order\x20created\x20and\x20paid\x20via\x20Service.buy();\x20Machine\x20starts\x20here'},{'name':'Shipped','description':'Goods\x20dispatched'},{'name':'Received','description':'Customer\x20confirmed\x20receipt'},{'name':'${complete_node_name}','description':'Terminal:\x20triggers\x20allocation'}],'example_pairs':[{'prev_node':'','next_node':'Paid','threshold':0x1,'forwards':[{'name':'Enter','weight':0x1,'named_operator':'','permission_index':0x0}]},{'prev_node':'Paid','next_node':'Shipped','threshold':0x1,'forwards':[{'name':'${ship_forward_name}','weight':0x1,'permission_index':0x2,'named_operator':''}]},{'prev_node':'Shipped','next_node':'Received','threshold':0x1,'forwards':[{'name':'${receive_forward_name}','weight':0x1,'named_operator':'','permission_index':0x0}]},{'prev_node':'Received','next_node':'${complete_node_name}','threshold':0x1,'forwards':[{'name':'Finish','weight':0x1,'permission_index':0x2,'named_operator':''}]}],'required_guards':[],'required_permissions':[{'index':0x2,'name':'merchant','description':'Merchant\x20role\x20for\x20Ship\x20+\x20Finish'},{'index':0x3,'name':'admin','description':'Admin\x20override\x20(optional)'}],'required_allocators':[{'name':'MerchantAllocation','trigger_node':'${complete_node_name}','description':'100%\x20to\x20merchant\x20Treasury\x20or\x20personal\x20address'}],'forkable_fields':['node_names','forward_names','thresholds','additional_branches'],'applicable_industries':['ecommerce','retail'],'relevant_risks':['R-M1-01','R-M1-02','R-M1-08','R-M2-01','R-M3-02','R-M4-01'],'creation_notes':['Build\x20order:\x20Permission\x20->\x20Machine\x20(unpublished)\x20->\x20Guards\x20->\x20Bind\x20guards\x20->\x20Publish\x20->\x20Bind\x20to\x20Service','First\x20node\x20\x27Paid\x27\x20represents\x20post-payment\x20state\x20—\x20Service.buy()\x20completes\x20payment\x20atomically\x20before\x20Progress\x20is\x20created','No\x20separate\x20\x27Order\x27\x20or\x20\x27Pay\x27\x20nodes\x20needed\x20—\x20payment\x20is\x20handled\x20by\x20Service.buy(),\x20not\x20Machine','Entry\x20point:\x20prev_node=\x27\x27\x20(empty\x20string)\x20targets\x20\x27Paid\x27\x20—\x20at\x20least\x20one\x20Pair\x20must\x20exist\x20with\x20empty\x20prev_node','If\x20using\x20P16\x20circular\x20reference\x20for\x20Service,\x20use\x20name\x20not\x20address\x20(Service\x20not\x20yet\x20published)'],'example_use_case':'Small\x20e-commerce\x20shop\x20selling\x20camera\x20accessories.\x20Linear\x20flow\x20with\x20no\x20exceptions.\x20'+'Funds\x20allocated\x20to\x20merchant\x20personal\x20address\x20on\x20Complete.','publish_checklist':['All\x204\x20nodes\x20have\x20at\x20least\x20one\x20outgoing\x20Forward\x20(except\x20terminal)','Entry\x20Pair\x20exists\x20(prev_node=\x27\x27\x20targets\x20\x27Paid\x27)','permissionIndex\x20values\x20match\x20Permission\x20object\x20indices','Test\x20Progress\x20run\x20on\x20testnet','machineNode2file\x20export\x20as\x20backup']},{'id':'tpl_machine_ecommerce_exceptions','scene_id':'ecommerce_with_exceptions','name':'E-commerce\x20Flow\x20with\x20Exception\x20Branches','description':'Multi-path\x20workflow:\x20Paid\x20(entry)\x20->\x20Ship\x20->\x20Receive/Lost/Return.\x20Lost\x20uses\x20dual-sig\x20(threshold=2).\x20'+'Payment\x20is\x20handled\x20by\x20Service.buy()\x20atomically;\x20Machine\x20starts\x20at\x20post-payment\x20state.\x20'+'Return\x20path\x20opens\x20Refund\x20->\x20Complete.\x20Competing\x20pairs\x20first-wins.','recommended_patterns':['P-M-SEQ','P-M-COMPETING'],'recommended_topology':['P-M-LINEAR','P-M-COMPETING'],'parameters':[{'name':'merchant_permission','type':'permission_ref','required':!![],'description':'Merchant\x20Permission\x20object'},{'name':'lost_threshold','type':'number','required':!![],'default':'2','description':'Threshold\x20for\x20dual-sig\x20on\x20Lost\x20node','constraint':'Must\x20be\x202\x20(customer\x20+\x20merchant)'},{'name':'arbitration_ref','type':'arbitration_ref','required':![],'description':'Arbitration\x20object\x20if\x20Lost\x20escalates\x20to\x20arbitration'},{'name':'time_guard_days','type':'number','required':!![],'default':'10','description':'Days\x20before\x20auto-complete\x20trigger\x20(time\x20guard)','constraint':'Must\x20be\x20>\x200;\x20reasonable\x20range\x207-30'},{'name':'return_node_name','type':'string','required':!![],'default':'Return','description':'Name\x20of\x20the\x20return/refund\x20node\x20in\x20the\x20exception\x20branch'}],'example_nodes':[{'name':'Paid','description':'Entry:\x20order\x20created\x20and\x20paid\x20via\x20Service.buy();\x20Machine\x20starts\x20here'},{'name':'Shipped'},{'name':'Received'},{'name':'Lost'},{'name':'Return'},{'name':'Refund'},{'name':'Complete'}],'example_pairs':[{'prev_node':'','next_node':'Paid','threshold':0x1,'forwards':[{'name':'Enter','weight':0x1,'named_operator':''}]},{'prev_node':'Paid','next_node':'Shipped','threshold':0x1,'forwards':[{'name':'Ship','weight':0x1,'permission_index':0x2}]},{'prev_node':'Shipped','next_node':'Received','threshold':0x1,'forwards':[{'name':'ConfirmReceive','weight':0x1,'named_operator':''}]},{'prev_node':'Shipped','next_node':'Lost','threshold':'${lost_threshold}','forwards':[{'name':'CustomerReport','weight':0x1,'named_operator':''},{'name':'MerchantConfirm','weight':0x1,'permission_index':0x2}]},{'prev_node':'Shipped','next_node':'Return','threshold':0x1,'forwards':[{'name':'RequestReturn','weight':0x1,'named_operator':''}]},{'prev_node':'Received','next_node':'Complete','threshold':0x1,'forwards':[{'name':'TimeGuard','weight':0x1,'permission_index':0x3,'guard':'time_guard_${time_guard_days}_days'},{'name':'MerchantFinish','weight':0x1,'permission_index':0x2}]},{'prev_node':'Return','next_node':'Refund','threshold':0x1,'forwards':[{'name':'IssueRefund','weight':0x1,'permission_index':0x2}]},{'prev_node':'Refund','next_node':'Complete','threshold':0x1,'forwards':[{'name':'CloseReturn','weight':0x1,'permission_index':0x2}]}],'required_guards':[{'guard_template_id':'tpl_forward_node_check','bound_to_forward':'MerchantConfirm','purpose':'Dual-sig\x20on\x20Lost\x20node'},{'guard_template_id':'tpl_forward_node_check','bound_to_forward':'TimeGuard','purpose':'Time\x20lock\x20${time_guard_days}\x20days'}],'required_permissions':[{'index':0x2,'name':'merchant','description':'Merchant\x20role'},{'index':0x3,'name':'admin','description':'Admin\x20/\x20time-guard\x20trigger'}],'required_allocators':[{'name':'CompleteAllocation','trigger_node':'Complete','description':'Full\x20allocation\x20to\x20merchant\x20on\x20normal\x20completion'},{'name':'RefundAllocation','trigger_node':'Refund','description':'Full\x20refund\x20to\x20customer\x20on\x20return'},{'name':'LostAllocation','trigger_node':'Lost','description':'Optional:\x20partial\x20refund\x20or\x20escrow\x20(depends\x20on\x20policy)'}],'forkable_fields':['node_names','branch_conditions','time_guard_days','lost_threshold'],'applicable_industries':['ecommerce','logistics'],'relevant_risks':['R-M1-01','R-M1-03','R-M1-08','R-M2-01','R-M2-05','R-M3-02','R-M3-04','R-M3-05','R-M4-01','R-M5-03'],'creation_notes':['First\x20node\x20\x27Paid\x27\x20represents\x20post-payment\x20state\x20—\x20Service.buy()\x20completes\x20payment\x20atomically\x20before\x20Progress\x20is\x20created','No\x20separate\x20\x27Order\x27\x20or\x20\x27Pay\x27\x20nodes\x20needed\x20—\x20payment\x20is\x20handled\x20by\x20Service.buy(),\x20not\x20Machine','Competing\x20Pairs\x20(Shipped\x20->\x20Received/Lost/Return)\x20are\x20mutually\x20exclusive\x20—\x20first\x20threshold\x20met\x20wins','Lost\x20node\x20threshold=2\x20means\x20BOTH\x20customer\x20and\x20merchant\x20Forwards\x20must\x20execute','TimeGuard\x20must\x20use\x20context(Clock)\x20>=\x20progress.current_time\x20+\x20duration\x20(progress.move\x20exposes\x20current_time,\x20refreshed\x20on\x20every\x20node\x20transition\x20—\x20there\x20is\x20no\x20entry_time\x20field)','If\x20Lost\x20escalates\x20to\x20arbitration,\x20bind\x20arbitration_usage_guard\x20on\x20Lost\x20forward','Refund\x20Allocation\x20must\x20use\x20sharing.who=OrderHolder\x20(refund\x20to\x20customer,\x20NOT\x20merchant)'],'example_use_case':'Mid-size\x20e-commerce\x20with\x207-day\x20return\x20policy\x20and\x20dispute\x20handling.\x20'+'Lost\x20claims\x20require\x20customer+merchant\x20dual\x20confirmation.','publish_checklist':['All\x20competing\x20Pairs\x20tested:\x20verify\x20first-wins\x20semantics\x20on\x20testnet','Lost\x20dual-sig\x20tested:\x20incomplete\x20signatures\x20do\x20not\x20advance','TimeGuard\x20Clock\x20query\x20verified\x20(testnet)','All\x20three\x20Allocators\x20tested\x20with\x20correct\x20sharing.who','Arbitration\x20binding\x20(if\x20any)\x20verified\x20via\x20gen_passport']},{'id':'tpl_machine_rental','scene_id':'rental_standard','name':'Equipment\x20Rental\x20Flow','description':'Rental\x20flow:\x20DepositPaid\x20(entry)\x20->\x20Pickup\x20->\x20In\x20Use\x20->\x20Return\x20->\x20Refund\x20Deposit.\x20'+'Payment\x20is\x20handled\x20by\x20Service.buy()\x20atomically;\x20Machine\x20starts\x20at\x20post-deposit\x20state.\x20'+'Separates\x20deposit\x20from\x20rental\x20fee\x20(two\x20Allocators).\x20Damage\x20report\x20via\x20retained_submission.','recommended_patterns':['P-M-SEQ'],'recommended_topology':['P-M-LINEAR'],'parameters':[{'name':'merchant_permission','type':'permission_ref','required':!![],'description':'Merchant\x20Permission\x20object'},{'name':'deposit_amount','type':'number','required':!![],'description':'Deposit\x20amount\x20in\x20smallest\x20WOW\x20unit','constraint':'Must\x20equal\x20order.amount\x20field;\x20verify\x20via\x20Guard\x20query'},{'name':'damage_inspection_node','type':'string','required':!![],'default':'DamageCheck','description':'Name\x20of\x20the\x20node\x20where\x20damage\x20inspection\x20occurs'},{'name':'return_node_name','type':'string','required':!![],'default':'Return','description':'Name\x20of\x20the\x20return\x20node\x20after\x20damage\x20check\x20fails'}],'example_nodes':[{'name':'DepositPaid','description':'Entry:\x20deposit\x20paid\x20via\x20Service.buy();\x20Machine\x20starts\x20here'},{'name':'PickedUp'},{'name':'InUse'},{'name':'Return'},{'name':'DamageCheck'},{'name':'DepositRefund'},{'name':'Complete'}],'example_pairs':[{'prev_node':'','next_node':'DepositPaid','threshold':0x1,'forwards':[{'name':'Enter','weight':0x1,'named_operator':''}]},{'prev_node':'DepositPaid','next_node':'PickedUp','threshold':0x1,'forwards':[{'name':'Pickup','weight':0x1,'named_operator':'','permission_index':0x2}]},{'prev_node':'PickedUp','next_node':'InUse','threshold':0x1,'forwards':[{'name':'StartUse','weight':0x1,'named_operator':''}]},{'prev_node':'InUse','next_node':'Return','threshold':0x1,'forwards':[{'name':'ReturnItem','weight':0x1,'named_operator':''}]},{'prev_node':'Return','next_node':'DamageCheck','threshold':0x1,'forwards':[{'name':'Inspect','weight':0x1,'permission_index':0x2,'retained_submission':'damage_report'}]},{'prev_node':'Return','next_node':'Complete','threshold':0x1,'forwards':[{'name':'CleanReturn','weight':0x1,'permission_index':0x2}]},{'prev_node':'DamageCheck','next_node':'DepositRefund','threshold':0x1,'forwards':[{'name':'DeductDamage','weight':0x1,'permission_index':0x2}]},{'prev_node':'DepositRefund','next_node':'Complete','threshold':0x1,'forwards':[{'name':'Close','weight':0x1,'permission_index':0x2}]}],'required_guards':[{'guard_template_id':'tpl_forward_privacy_delivery_proof','bound_to_forward':'Inspect','purpose':'Optional:\x20damage\x20evidence\x20proof\x20(photo,\x20video)'}],'required_permissions':[{'index':0x2,'name':'merchant','description':'Rental\x20provider'}],'required_allocators':[{'name':'RentalFeeAllocation','trigger_node':'Complete','description':'Rental\x20fee\x20to\x20merchant'},{'name':'DepositRefundAllocation','trigger_node':'DepositRefund','description':'Remaining\x20deposit\x20to\x20customer\x20(OrderHolder\x20sharing.who)'},{'name':'DamageDeductionAllocation','trigger_node':'DamageCheck','description':'Damage\x20deduction\x20to\x20merchant'}],'forkable_fields':['deposit_amount','damage_node_logic','additional_inspection_steps'],'applicable_industries':['rental','equipment','vehicle'],'relevant_risks':['R-M1-01','R-M1-08','R-M2-01','R-M2-04','R-M3-02','R-M4-01','R-M5-02'],'creation_notes':['First\x20node\x20\x27DepositPaid\x27\x20represents\x20post-payment\x20state\x20—\x20Service.buy()\x20completes\x20deposit\x20payment\x20atomically\x20before\x20Progress\x20is\x20created','No\x20separate\x20\x27Reserve\x27\x20or\x20\x27PayDeposit\x27\x20nodes\x20needed\x20—\x20reservation\x20and\x20payment\x20are\x20handled\x20by\x20Service.buy(),\x20not\x20Machine','Damage\x20report\x20uses\x20retained_submission\x20—\x20values\x20stored\x20uniquely\x20by\x20(current_node,\x20next_node,\x20forward_name)','Two\x20competing\x20Pairs\x20at\x20Return\x20node:\x20DamageCheck\x20vs\x20Complete\x20(clean\x20return)','DamageDeduction\x20Allocation\x20uses\x20sharing.who=Entity\x20(merchant),\x20not\x20OrderHolder'],'example_use_case':'Camera\x20equipment\x20rental:\x20customer\x20pays\x201000\x20WOW\x20deposit,\x20returns\x20equipment,\x20'+'merchant\x20inspects.\x20If\x20damaged,\x20200\x20WOW\x20deducted;\x20otherwise\x20full\x20refund.','publish_checklist':['Deposit\x20Guard\x20tested\x20(testnet)\x20with\x20valid/invalid\x20amounts','Damage\x20report\x20retained_submission\x20stored\x20correctly\x20(query\x20progress_history)','Both\x20Return\x20branches\x20tested\x20(DamageCheck\x20+\x20CleanReturn)','All\x20three\x20Allocators\x20verified\x20with\x20correct\x20sharing.who']},{'id':'tpl_machine_dual_signature','scene_id':'dual_signature','name':'Dual-Signature\x20Consensus\x20Flow','description':'Critical\x20node\x20requires\x20both\x20customer\x20+\x20merchant\x20confirmation.\x20threshold=2\x20with\x20two\x20Forwards\x20(weight=1\x20each).\x20'+'Customer\x20uses\x20namedOperator=\x27\x27\x20(OrderHolder);\x20merchant\x20uses\x20permissionIndex=2.','recommended_patterns':['P-M-AND'],'recommended_topology':['P-M-LINEAR'],'parameters':[{'name':'merchant_permission','type':'permission_ref','required':!![],'description':'Merchant\x20Permission\x20object'},{'name':'critical_node_name','type':'string','required':!![],'default':'Approve','description':'Node\x20requiring\x20dual-sig'},{'name':'next_node_after_approval','type':'string','required':!![],'default':'Execute','description':'Name\x20of\x20the\x20node\x20that\x20follows\x20after\x20dual-signature\x20approval'}],'example_nodes':[{'name':'Initiated'},{'name':'${critical_node_name}','description':'Dual-sig\x20required\x20here'},{'name':'${next_node_after_approval}'},{'name':'Complete'}],'example_pairs':[{'prev_node':'','next_node':'Initiated','threshold':0x1,'forwards':[{'name':'Initiate','weight':0x1,'named_operator':''}]},{'prev_node':'Initiated','next_node':'${critical_node_name}','threshold':0x1,'forwards':[{'name':'Submit','weight':0x1,'named_operator':''}]},{'prev_node':'${critical_node_name}','next_node':'${next_node_after_approval}','threshold':0x2,'forwards':[{'name':'CustomerApprove','weight':0x1,'named_operator':'','guard':'customer_identity_guard'},{'name':'MerchantApprove','weight':0x1,'permission_index':0x2,'guard':'merchant_identity_guard'}]},{'prev_node':'${next_node_after_approval}','next_node':'Complete','threshold':0x1,'forwards':[{'name':'Finish','weight':0x1,'permission_index':0x2}]}],'required_guards':[{'guard_template_id':'tpl_forward_node_check','bound_to_forward':'CustomerApprove','purpose':'Verify\x20customer\x20identity\x20(order.owner)'},{'guard_template_id':'tpl_forward_node_check','bound_to_forward':'MerchantApprove','purpose':'Verify\x20merchant\x20identity\x20(permission\x20holder)'}],'required_permissions':[{'index':0x2,'name':'merchant','description':'Merchant\x20approval'}],'required_allocators':[{'name':'CompleteAllocation','trigger_node':'Complete','description':'Allocation\x20on\x20dual-sig\x20completion'}],'forkable_fields':['critical_node_name','additional_approvers','guard_logic'],'applicable_industries':['ecommerce','service','logistics','escrow'],'relevant_risks':['R-M1-08','R-M2-01','R-M3-02','R-M3-04'],'creation_notes':['threshold=2\x20means\x20BOTH\x20Forwards\x20must\x20execute\x20to\x20advance\x20(AND\x20semantics)','Customer\x20Forward\x20uses\x20namedOperator=\x27\x27\x20(OrderHolder)','Merchant\x20Forward\x20uses\x20permissionIndex=2','If\x20either\x20party\x20fails\x20to\x20sign,\x20workflow\x20stalls\x20—\x20consider\x20adding\x20timeout\x20Guard'],'example_use_case':'High-value\x20order\x20(e.g.\x20real\x20estate\x20transaction)\x20requiring\x20both\x20buyer\x20and\x20seller\x20confirmation.','publish_checklist':['Both\x20Forward\x20identities\x20tested\x20on\x20testnet','Verify\x20partial\x20signature\x20does\x20NOT\x20advance\x20(threshold=2)','Guards\x20correctly\x20distinguish\x20customer\x20vs\x20merchant\x20identity']},{'id':'tpl_machine_weighted_voting','scene_id':'weighted_voting','name':'Weighted\x20Voting\x20Flow','description':'Multi-party\x20voting\x20with\x20unequal\x20weights.\x20threshold=100,\x20chief\x20weight=60,\x20members\x20weight=40\x20total.\x20'+'Each\x20member\x27s\x20weight\x20extracted\x20via\x20Guard\x20query\x20from\x20Arbitration\x20object.','recommended_patterns':['P-M-VOTE'],'recommended_topology':['P-M-LINEAR'],'parameters':[{'name':'arbitration_ref','type':'arbitration_ref','required':!![],'description':'Arbitration\x20object\x20storing\x20voter\x20weights'},{'name':'threshold_total','type':'number','required':!![],'default':'100','description':'Total\x20weight\x20threshold\x20for\x20decision'},{'name':'chief_weight','type':'number','required':!![],'default':'60','description':'Weight\x20assigned\x20to\x20the\x20chief\x20voter\x20(out\x20of\x20100)'},{'name':'member_count','type':'number','required':!![],'default':'5','description':'Number\x20of\x20voting\x20members\x20(excluding\x20chief)'}],'example_nodes':[{'name':'VoteOpened'},{'name':'Voting'},{'name':'Approved'},{'name':'Rejected'}],'example_pairs':[{'prev_node':'','next_node':'VoteOpened','threshold':0x1,'forwards':[{'name':'OpenVote','weight':0x1,'permission_index':0x3}]},{'prev_node':'VoteOpened','next_node':'Voting','threshold':0x1,'forwards':[{'name':'StartVoting','weight':0x1,'permission_index':0x3}]},{'prev_node':'Voting','next_node':'Approved','threshold':'${threshold_total}','forwards':[{'name':'ChiefVote','weight':'${chief_weight}','permission_index':0x2,'guard':'arb_voting_guard','retained_submission':'chief_vote_record'},{'name':'MemberVote','weight':0x8,'named_operator':'member','guard':'arb_voting_guard','retained_submission':'member_vote_record'}]},{'prev_node':'Voting','next_node':'Rejected','threshold':0x1,'forwards':[{'name':'TimeoutReject','weight':0x1,'permission_index':0x3,'guard':'voting_timeout_guard'}]}],'required_guards':[{'guard_template_id':'tpl_voting_guard_numeric_weight','bound_to_forward':'ChiefVote','purpose':'Verify\x20voting\x20eligibility\x20+\x20extract\x20weight\x20from\x20Arbitration'},{'guard_template_id':'tpl_voting_guard_numeric_weight','bound_to_forward':'MemberVote','purpose':'Verify\x20voting\x20eligibility\x20+\x20prevent\x20double-vote'}],'required_permissions':[{'index':0x2,'name':'chief','description':'Chief\x20voter\x20(high\x20weight)'},{'index':0x3,'name':'admin','description':'Vote\x20opener\x20/\x20timeout\x20trigger'}],'required_allocators':[{'name':'ApprovedAllocation','trigger_node':'Approved','description':'Allocation\x20on\x20approval'}],'forkable_fields':['weights','voter_count','timeout_days'],'applicable_industries':['governance','arbitration','dao'],'relevant_risks':['R-M1-08','R-M2-05','R-M3-04','R-M5-04','R-X1-14'],'creation_notes':['Member\x20weight\x20must\x20be\x20extracted\x20dynamically\x20via\x20Guard\x20query\x20(not\x20hardcoded\x20in\x20Forward)','Guard\x20MUST\x20check\x20arb.voted\x20has\x20[Signer]\x20to\x20prevent\x20double-voting\x20(R-X1-14\x20CRITICAL)','Competing\x20Pair:\x20Approved\x20vs\x20Rejected\x20(timeout)\x20—\x20first-wins','Voting\x20weight\x20is\x20query-derived;\x20Forward\x20weight\x20field\x20is\x20just\x20session\x20counter'],'example_use_case':'Arbitration\x20panel:\x201\x20chief\x20(weight\x2060)\x20+\x205\x20members\x20(weight\x208\x20each\x20=\x2040).\x20'+'Need\x20total\x20>=\x20100\x20to\x20approve.\x20Reject\x20after\x2072h\x20timeout.','publish_checklist':['Arbitration\x20object\x20created\x20and\x20tested','Double-vote\x20prevention\x20verified\x20(try\x20voting\x20twice\x20—\x20should\x20fail)','Weight\x20extraction\x20tested\x20with\x20different\x20voter\x20configurations','Timeout\x20Guard\x20(Clock)\x20verified\x20on\x20testnet']},{'id':'tpl_machine_cross_machine','scene_id':'cross_machine_supply_chain','name':'Cross-Machine\x20Supply\x20Chain','description':'Decomposed\x20supply\x20chain\x20across\x20multiple\x20Machines.\x20Machine\x20B\x27s\x20Forward\x20Guard\x20queries\x20Machine\x20A\x27s\x20Progress\x20'+'via\x20convert_witness=100\x20to\x20verify\x20upstream\x20completion\x20before\x20advancing.','recommended_patterns':['P-M-CROSS-MACHINE'],'recommended_topology':['P-M-LINEAR'],'parameters':[{'name':'machine_a_id','type':'machine_ref','required':!![],'description':'Upstream\x20Machine\x20(must\x20already\x20be\x20published)','constraint':'Machine\x20A\x20must\x20be\x20published\x20BEFORE\x20Machine\x20B\x27s\x20Guard\x20can\x20reference\x20its\x20Progress\x20'+'(Progress\x20creation\x20verifies\x20the\x20bound\x20Machine\x20is\x20published\x20—\x20see\x2006\x20§14.6)'},{'name':'machine_a_complete_node','type':'string','required':!![],'default':'Complete','description':'Target\x20node\x20name\x20in\x20Machine\x20A\x20to\x20verify'},{'name':'machine_b_permission','type':'permission_ref','required':!![],'description':'Machine\x20B\x27s\x20Permission\x20object'}],'example_nodes':[{'name':'UpstreamVerified'},{'name':'Production'},{'name':'Complete'}],'example_pairs':[{'prev_node':'','next_node':'UpstreamVerified','threshold':0x1,'forwards':[{'name':'VerifyUpstream','weight':0x1,'permission_index':0x2,'guard':'upstream_progress_guard','retained_submission':'upstream_progress_id'}]},{'prev_node':'UpstreamVerified','next_node':'Production','threshold':0x1,'forwards':[{'name':'StartProduction','weight':0x1,'permission_index':0x2}]},{'prev_node':'Production','next_node':'Complete','threshold':0x1,'forwards':[{'name':'Finish','weight':0x1,'permission_index':0x2}]}],'required_guards':[{'guard_template_id':'tpl_forward_node_check','bound_to_forward':'VerifyUpstream','purpose':'Query\x20Machine\x20A\x27s\x20Progress:\x20verify\x20it\x20reached\x20${machine_a_complete_node}'}],'required_permissions':[{'index':0x2,'name':'manufacturer','description':'Machine\x20B\x20operator'}],'required_allocators':[{'name':'CompleteAllocation','trigger_node':'Complete','description':'Allocation\x20to\x20Machine\x20B\x27s\x20merchant'}],'forkable_fields':['upstream_machine_ref','verification_node_name'],'applicable_industries':['manufacturing','logistics','retail','supply_chain'],'relevant_risks':['R-M1-01','R-M1-08','R-M2-01','R-M2-04','R-M3-04','R-M5-04','R-M5-05','R-M5-06'],'creation_notes':['Machine\x20A\x20MUST\x20be\x20published\x20before\x20Machine\x20B\x20(dependency\x20order)','Guard\x20uses\x20convert_witness=100\x20to\x20convert\x20submitted\x20Order/Progress\x20ID\x20into\x20queryable\x20Progress\x20object','Cross-Machine\x20dependency\x20is\x20one-way\x20(no\x20cycles)','retained_submission\x20stores\x20upstream\x20Progress\x20ID\x20for\x20later\x20audit','Multi-party\x20chain:\x20extend\x20pattern\x20with\x20Machine\x20C,\x20D,\x20...\x20(each\x20independently\x20published)','Dependency\x20verification:\x20enforced\x20when\x20the\x20Progress\x20object\x20is\x20created\x20(creation\x20checks\x20the\x20bound\x20Machine\x20is\x20published\x20—\x20see\x2006\x20§14.6)'],'example_use_case':'Supplier\x20(Machine\x20A)\x20->\x20Manufacturer\x20(Machine\x20B)\x20->\x20Retailer\x20(Machine\x20C).\x20'+'Manufacturer\x20cannot\x20start\x20production\x20until\x20supplier\x27s\x20Progress\x20reaches\x20\x27Complete\x27.','publish_checklist':['Machine\x20A\x20already\x20published\x20on-chain\x20(verify\x20via\x20onchain_objects)','Cross-Machine\x20Guard\x20tested\x20with\x20valid/invalid\x20upstream\x20Progress\x20IDs','retained_submission\x20verified\x20(query\x20progress_history\x20for\x20upstream_progress_id)','Independent\x20testing:\x20run\x20Machine\x20A\x20to\x20Complete,\x20then\x20attempt\x20Machine\x20B\x27s\x20VerifyUpstream']},{'id':'tpl_machine_privacy_delivery','scene_id':'privacy_delivery','name':'Privacy-Preserving\x20Delivery\x20Flow','description':'Customer\x20submits\x20privacy\x20data\x20via\x20Messenger\x20(encrypted,\x20off-chain).\x20Chain\x20stores\x20only\x20Merkle\x20Root\x20Proof.\x20'+'Guard\x20verifies\x20Proof\x20signature\x20+\x20timestamp\x20+\x20service\x20binding.\x20Uses\x20tpl_forward_privacy_delivery_proof\x20(strict\x20mode).','recommended_patterns':['P-M-SEQ'],'recommended_topology':['P-M-LINEAR'],'parameters':[{'name':'merchant_permission','type':'permission_ref','required':!![],'description':'Merchant\x20Permission\x20object'},{'name':'proof_node_name','type':'string','required':!![],'default':'ProofSubmitted','description':'Name\x20of\x20the\x20node\x20where\x20delivery\x20proof\x20is\x20submitted'},{'name':'delivery_node_name','type':'string','required':!![],'default':'DeliveryConfirmed','description':'Name\x20of\x20the\x20node\x20where\x20delivery\x20confirmation\x20occurs'}],'example_nodes':[{'name':'Paid','description':'Entry:\x20order\x20created\x20and\x20paid\x20via\x20Service.buy();\x20Machine\x20starts\x20here'},{'name':'${proof_node_name}','description':'Customer\x20submits\x20Proof\x20via\x20Messenger'},{'name':'${delivery_node_name}'},{'name':'Complete'}],'example_pairs':[{'prev_node':'','next_node':'Paid','threshold':0x1,'forwards':[{'name':'Enter','weight':0x1,'named_operator':''}]},{'prev_node':'Paid','next_node':'${proof_node_name}','threshold':0x1,'forwards':[{'name':'SubmitProof','weight':0x1,'named_operator':'','guard':'tpl_forward_privacy_delivery_proof','retained_submission':'proof_address'}]},{'prev_node':'${proof_node_name}','next_node':'${delivery_node_name}','threshold':0x1,'forwards':[{'name':'ConfirmDelivery','weight':0x1,'permission_index':0x2}]},{'prev_node':'${delivery_node_name}','next_node':'Complete','threshold':0x1,'forwards':[{'name':'Finish','weight':0x1,'permission_index':0x2}]}],'required_guards':[{'guard_template_id':'tpl_forward_privacy_delivery_proof','bound_to_forward':'SubmitProof','purpose':'Verify\x20Proof:\x20signer=proof.signer\x20∧\x20proof.time>order.time\x20∧\x20order.service=service'}],'required_permissions':[{'index':0x2,'name':'merchant','description':'Merchant\x20confirms\x20delivery'}],'required_allocators':[{'name':'CompleteAllocation','trigger_node':'Complete','description':'Allocation\x20to\x20merchant\x20after\x20delivery\x20confirmation'}],'forkable_fields':['proof_node_name','delivery_node_name','additional_evidence_steps'],'applicable_industries':['ecommerce','logistics','privacy_service'],'relevant_risks':['R-M1-01','R-M1-08','R-M2-01','R-M2-04','R-M3-02','R-M5-03'],'creation_notes':['Use\x20strict\x20mode\x20tpl_forward_privacy_delivery_proof\x20(3\x20conditions:\x20Signer\x20+\x20time\x20+\x20service\x20binding)','submitChainProof\x20about_address\x20=\x20peerAddress\x20(NOT\x20sessionId)\x20—\x20about\x20records\x20ONLY\x20the\x20contact;\x20it\x20has\x20no\x20on-chain\x20meaning\x20and\x20must\x20NEVER\x20be\x20a\x20guard\x20decision\x20condition','PRIVACY:\x20never\x20pass\x20order_id\x20or\x20any\x20order\x20reference\x20via\x20the\x20description\x20field\x20(that\x20would\x20publicly\x20link\x20Proof\x20to\x20Order\x20on\x20chain)\x20—\x20all\x20order/business\x20linkage\x20stays\x20inside\x20the\x20Messenger\x20conversation;\x20acceptance\x20of\x20delivered\x20info\x20is\x20the\x20merchant\x27s\x20confirming\x20forward,\x20not\x20the\x20proof\x27s\x20recorded\x20address','Guard\x20table\x20item\x20name\x20MUST\x20be\x20<64\x20BCS\x20bytes\x20(MAX_NAME_LENGTH=64)','retained_submission\x20stores\x20Proof\x20address\x20for\x20arbitration\x20query','Proof\x20MUST\x20be\x20generated\x20by\x20messenger.submitChainProof\x20(not\x20manual)'],'example_use_case':'Customer\x20sends\x20delivery\x20address\x20via\x20Messenger\x20(encrypted).\x20Chain\x20stores\x20only\x20Proof.\x20'+'Merchant\x20verifies\x20Proof,\x20then\x20confirms\x20delivery.','publish_checklist':['Strict\x20mode\x20Guard\x20tested:\x203\x20conditions\x20verified\x20individually','Messenger\x20integration\x20tested\x20end-to-end\x20(submit\x20+\x20verify)','retained_submission\x20stored\x20Proof\x20address\x20queryable\x20from\x20progress_history','Guard\x20table\x20item\x20name\x20length\x20validated\x20(<64\x20BCS\x20bytes)']},{'id':'tpl_machine_reward','scene_id':'reward_incentive','name':'Reward\x20Incentive\x20Flow','description':'Customer\x20triggers\x20Reward\x20claim\x20at\x20specific\x20node.\x20Guard\x20prevents\x20double-claim\x20via\x20query_reward_record_count==0.\x20'+'Reward\x20object\x20independent\x20of\x20Allocator.','recommended_patterns':['P-M-SEQ'],'recommended_topology':['P-M-LINEAR'],'parameters':[{'name':'reward_ref','type':'reward_ref','required':!![],'description':'Reward\x20object\x20address\x20(must\x20be\x20already\x20created)'},{'name':'claim_node_name','type':'string','required':!![],'default':'ClaimReward','description':'Name\x20of\x20the\x20node\x20where\x20reward\x20claims\x20are\x20triggered'}],'example_nodes':[{'name':'Eligible'},{'name':'${claim_node_name}'},{'name':'Rewarded'},{'name':'Complete'}],'example_pairs':[{'prev_node':'','next_node':'Eligible','threshold':0x1,'forwards':[{'name':'Enter','weight':0x1,'named_operator':''}]},{'prev_node':'Eligible','next_node':'${claim_node_name}','threshold':0x1,'forwards':[{'name':'TriggerClaim','weight':0x1,'named_operator':'','guard':'reward_anti_double_guard','retained_submission':'claim_record'}]},{'prev_node':'${claim_node_name}','next_node':'Rewarded','threshold':0x1,'forwards':[{'name':'IssueReward','weight':0x1,'permission_index':0x3}]},{'prev_node':'Rewarded','next_node':'Complete','threshold':0x1,'forwards':[{'name':'Finish','weight':0x1,'permission_index':0x2}]}],'required_guards':[{'guard_template_id':'tpl_reward_one_time_claim','bound_to_forward':'TriggerClaim','purpose':'Verify\x20query_reward_record_count==0\x20to\x20prevent\x20double-claim'}],'required_permissions':[{'index':0x2,'name':'merchant','description':'Completes\x20flow'},{'index':0x3,'name':'reward_admin','description':'Issues\x20reward\x20tokens'}],'required_allocators':[{'name':'CompleteAllocation','trigger_node':'Complete','description':'Standard\x20allocation\x20(separate\x20from\x20Reward)'}],'forkable_fields':['claim_node_name','additional_reward_conditions'],'applicable_industries':['ecommerce','subscription','education','loyalty'],'relevant_risks':['R-M1-08','R-M2-05','R-M3-04','R-X1-14'],'creation_notes':['Reward\x20Guard\x20MUST\x20check\x20query_reward_record_count\x20==\x200\x20(R-X1-14\x20CRITICAL)','Reward\x20is\x20INDEPENDENT\x20of\x20Allocator\x20—\x20both\x20can\x20fire\x20on\x20different\x20nodes','Reward\x20object\x20must\x20be\x20created\x20BEFORE\x20publishing\x20this\x20Machine','retained_submission\x20stores\x20claim\x20record\x20for\x20audit'],'example_use_case':'Loyalty\x20program:\x20after\x20customer\x20completes\x205\x20orders,\x20eligible\x20to\x20claim\x20reward\x20token.\x20'+'Anti-double-claim\x20Guard\x20ensures\x20one\x20claim\x20per\x20customer.','publish_checklist':['Reward\x20object\x20already\x20created\x20and\x20tested','Anti-double-claim\x20Guard\x20tested:\x20claim\x20twice\x20should\x20fail\x20on\x20second\x20attempt','retained_submission\x20verified\x20(claim_record\x20queryable)']},{'id':'tpl_machine_wonder_feedback','scene_id':'wonder_feedback','name':'Wonder\x20Feedback\x20Flow\x20(Post-Completion\x20Rating)','description':'Post-completion\x20rating\x20flow:\x20Paid\x20(entry)\x20→\x20Shipped\x20→\x20Received\x20→\x20Completed\x20→\x20{Wonder\x20|\x20NoWonder}.\x20'+'After\x20the\x20order\x20reaches\x20\x27Completed\x27\x20(terminal\x20business\x20state,\x20funds\x20already\x20allocated\x20to\x20merchant),\x20'+'the\x20OrderHolder\x20(namedOperator=\x27\x27)\x20can\x20advance\x20Progress\x20to\x20\x27wonder\x27\x20(positive\x20review)\x20or\x20\x27no_wonder\x27\x20'+'(negative\x20review).\x20A\x20bound\x20Reward\x20object\x27s\x20claim_guard\x20verifies\x20Progress.current\x20==\x20\x27wonder\x27\x20before\x20'+'paying\x20out\x20—\x20reward\x20claim\x20needs\x20NO\x20Permission.\x20Dispute\x20is\x20NEVER\x20modeled\x20here:\x20it\x20flows\x20through\x20'+'the\x20Order\x27s\x20dispute\x20flow\x20→\x20Arb\x20case\x20→\x20arbiter\x20ruling\x20→\x20fee\x20withdrawal,\x20fully\x20off-Machine.','recommended_patterns':['P-M-SEQ','P-M-COMPETING'],'recommended_topology':['P-M-LINEAR','P-M-COMPETING'],'parameters':[{'name':'merchant_permission','type':'permission_ref','required':!![],'description':'Merchant\x20Permission\x20object\x20(index\x202\x20=\x20merchant,\x20index\x203\x20=\x20admin)'},{'name':'wonder_node_name','type':'string','required':!![],'default':'wonder','description':'Node\x20name\x20for\x20positive\x20feedback\x20(praise)\x20terminal','constraint':'Must\x20match\x20/^(wonder|praise|thumbs_up)$/i\x20OR\x20be\x20a\x20custom\x20name;\x20must\x20NOT\x20match\x20dispute\x20anti-pattern\x20regex'},{'name':'no_wonder_node_name','type':'string','required':!![],'default':'no_wonder','description':'Node\x20name\x20for\x20negative\x20feedback\x20(complaint)\x20terminal','constraint':'Must\x20match\x20/^(no_wonder|complain|thumbs_down)$/i\x20OR\x20be\x20a\x20custom\x20name;\x20must\x20NOT\x20match\x20dispute\x20anti-pattern\x20regex'},{'name':'reward_ref','type':'reward_ref','required':![],'description':'Reward\x20object\x20address\x20(optional).\x20If\x20bound,\x20its\x20claim_guard\x20should\x20verify\x20Progress.current\x20==\x20wonder_node_name\x20AND\x20order.owner\x20==\x20signer.\x20Use\x20wonder_praise\x20or\x20wonder_feedback\x20reward\x20template.'},{'name':'rating_time_limit_days','type':'number','required':![],'default':'30','description':'Days\x20after\x20completion\x20during\x20which\x20the\x20customer\x20can\x20rate\x20(enforced\x20by\x20Guard\x20on\x20Praise/Complain\x20forwards\x20via\x20context(Clock))','constraint':'Must\x20be\x20>\x200;\x20reasonable\x20range\x207-90'}],'example_nodes':[{'name':'Paid','description':'Entry:\x20order\x20created\x20and\x20paid\x20via\x20Service.buy();\x20Machine\x20starts\x20here'},{'name':'Shipped','description':'Merchant\x20dispatched\x20goods/service'},{'name':'Received','description':'Customer\x20confirmed\x20receipt'},{'name':'Completed','description':'Terminal\x20business\x20state\x20—\x20triggers\x20merchant\x20Allocation.\x20Funds\x20settled.'},{'name':'${wonder_node_name}','description':'Positive\x20feedback\x20terminal\x20(praise).\x20OrderHolder-only.\x20Reward-eligible.'},{'name':'${no_wonder_node_name}','description':'Negative\x20feedback\x20terminal\x20(complaint).\x20OrderHolder-only.\x20Optional\x20Repository\x20write\x20for\x20analytics.'}],'example_pairs':[{'prev_node':'','next_node':'Paid','threshold':0x1,'forwards':[{'name':'Enter','weight':0x1,'named_operator':''}]},{'prev_node':'Paid','next_node':'Shipped','threshold':0x1,'forwards':[{'name':'Ship','weight':0x1,'permission_index':0x2,'named_operator':''}]},{'prev_node':'Shipped','next_node':'Received','threshold':0x1,'forwards':[{'name':'ConfirmReceive','weight':0x1,'named_operator':''}]},{'prev_node':'Received','next_node':'Completed','threshold':0x1,'forwards':[{'name':'Finish','weight':0x1,'permission_index':0x2,'named_operator':''}]},{'prev_node':'Completed','next_node':'${wonder_node_name}','threshold':0x1,'forwards':[{'name':'Praise','weight':0x1,'named_operator':'','guard':'rating_window_guard','retained_submission':'rating_record'}]},{'prev_node':'Completed','next_node':'${no_wonder_node_name}','threshold':0x1,'forwards':[{'name':'Complain','weight':0x1,'named_operator':'','guard':'rating_window_guard','retained_submission':'rating_record'}]}],'required_guards':[{'guard_template_id':'tpl_forward_node_check','bound_to_forward':'Praise','purpose':'Verify\x20Progress.current\x20==\x20\x27Completed\x27\x20(rating\x20only\x20allowed\x20after\x20completion)\x20AND\x20context(Clock)\x20<=\x20progress.current_time\x20+\x20rating_time_limit_days'},{'guard_template_id':'tpl_forward_node_check','bound_to_forward':'Complain','purpose':'Verify\x20Progress.current\x20==\x20\x27Completed\x27\x20(rating\x20only\x20allowed\x20after\x20completion)\x20AND\x20context(Clock)\x20<=\x20progress.current_time\x20+\x20rating_time_limit_days'}],'required_permissions':[{'index':0x2,'name':'merchant','description':'Merchant\x20role\x20for\x20Ship\x20+\x20Finish\x20(NOT\x20for\x20rating\x20—\x20rating\x20is\x20OrderHolder-only\x20via\x20named_operator=\x27\x27)'},{'index':0x3,'name':'admin','description':'Admin\x20override\x20(optional)'}],'required_allocators':[{'name':'MerchantAllocation','trigger_node':'Completed','description':'100%\x20to\x20merchant\x20Treasury\x20or\x20personal\x20address.\x20Fires\x20at\x20Completion\x20—\x20NOT\x20at\x20Wonder/NoWonder\x20(those\x20are\x20reputation-only\x20terminals\x20with\x20no\x20fund\x20flow).'}],'forkable_fields':['wonder_node_name','no_wonder_node_name','rating_time_limit_days','additional_rating_nodes'],'applicable_industries':['ecommerce','service','rental','subscription','education'],'relevant_risks':['R-M1-01','R-M1-02','R-M1-08','R-M1-11','R-M2-01','R-M2-05','R-M3-02','R-M3-04','R-M4-01','R-M5-03'],'creation_notes':['DISPUTE\x20INDEPENDENCE:\x20This\x20Machine\x20MUST\x20NOT\x20contain\x20\x27disputed\x27,\x20\x27refunded\x27,\x20\x27arb\x27,\x20\x27arbitration\x27\x20nodes\x20(R-M1-11\x20critical).\x20Disputes\x20are\x20filed\x20off-Machine\x20—\x20through\x20the\x20Arbitration\x20dispute\x20flow\x20on\x20the\x20order\x20and\x20arbitration\x20objects.','Build\x20order:\x20Permission\x20→\x20Machine\x20(unpublished)\x20→\x20Guards\x20→\x20Bind\x20guards\x20→\x20Publish\x20→\x20Bind\x20to\x20Service\x20→\x20Bind\x20Reward\x20(optional)','First\x20node\x20\x27Paid\x27\x20represents\x20post-payment\x20state\x20—\x20Service.buy()\x20completes\x20payment\x20atomically\x20before\x20Progress\x20is\x20created','No\x20separate\x20\x27Order\x27\x20or\x20\x27Pay\x27\x20nodes\x20needed\x20—\x20payment\x20is\x20handled\x20by\x20Service.buy(),\x20not\x20Machine','Wonder/NoWonder\x20forwards\x20have\x20named_operator=\x27\x27\x20(empty)\x20—\x20this\x20delegates\x20to\x20the\x20OrderHolder\x20(customer).\x20No\x20Permission\x20index\x20needed\x20for\x20rating.','Completed\x20node\x20triggers\x20MerchantAllocation\x20—\x20funds\x20are\x20settled\x20BEFORE\x20the\x20rating\x20window\x20opens.\x20Rating\x20does\x20NOT\x20affect\x20fund\x20flow.','Competing\x20Pair:\x20Praise\x20vs\x20Complain\x20(first-wins)\x20—\x20one\x20rating\x20per\x20order,\x20enforced\x20by\x20Guard\x20+\x20retained_submission\x20audit\x20trail.','Reward\x20object\x20(if\x20bound)\x20is\x20INDEPENDENT\x20of\x20Allocator:\x20Reward.claim()\x20requires\x20Guard+passport,\x20not\x20Permission.\x20Guard\x20checks\x20Progress.current\x20==\x20\x27wonder\x27\x20AND\x20order.owner\x20==\x20signer.','rating_window_guard\x20enforces\x20time\x20limit:\x20context(Clock)\x20<=\x20progress.current_time\x20+\x20rating_time_limit_days.\x20After\x20window\x20closes,\x20no\x20rating\x20possible\x20(Completed\x20becomes\x20true\x20terminal).','Optional:\x20bind\x20a\x20Repository\x20to\x20record\x20feedback\x20node\x20for\x20analytics.\x20Repository\x20write\x20happens\x20via\x20Guard\x27s\x20data\x20extraction\x20(NOT\x20auto-passed\x20—\x20see\x2006\x20§14.4).'],'example_use_case':'Photography\x20service:\x20Paid\x20→\x20Shipped\x20(booking\x20confirmed)\x20→\x20Received\x20(session\x20delivered)\x20→\x20Completed\x20'+'(photos\x20delivered,\x20funds\x20released\x20to\x20photographer)\x20→\x20customer\x20advances\x20to\x20\x27wonder\x27\x20(loved\x20the\x20work)\x20'+'or\x20\x27no_wonder\x27\x20(didn\x27t\x20love\x20it).\x20Bound\x20Reward\x20pays\x201\x20WOW\x20to\x20customers\x20who\x20advance\x20to\x20\x27wonder\x27.\x20'+'Merchant\x27s\x20wonder/no_wonder\x20ratio\x20becomes\x20an\x20on-chain\x20reputation\x20signal.\x20Disputes\x20(if\x20any)\x20are\x20'+'filed\x20separately\x20via\x20Arbitration\x20object\x20—\x20never\x20enter\x20this\x20Machine.','publish_checklist':['All\x206\x20nodes\x20verified:\x20no\x20\x27disputed\x27/\x27refunded\x27/\x27arb\x27/\x27arbitration\x27\x20names\x20(R-M1-11\x20PASS)','Entry\x20Pair\x20exists\x20(prev_node=\x27\x27\x20targets\x20\x27Paid\x27)','Competing\x20Pair\x20tested:\x20Praise\x20vs\x20Complain\x20—\x20first-wins\x20semantics\x20verified\x20on\x20testnet','rating_window_guard\x20tested:\x20rating\x20blocked\x20after\x20time\x20limit\x20expires','MerchantAllocation\x20fires\x20ONLY\x20at\x20Completed\x20(NOT\x20at\x20Wonder/NoWonder)','Reward\x20object\x20(if\x20bound):\x20claim_guard\x20tested\x20—\x20Progress.current\x20==\x20\x27wonder\x27\x20required,\x20claim\x20fails\x20at\x20\x27no_wonder\x27\x20or\x20\x27Completed\x27','named_operator=\x27\x27\x20on\x20Praise/Complain\x20forwards\x20verified\x20(OrderHolder-only\x20operation)','machineNode2file\x20export\x20as\x20backup']},{'id':'tpl_machine_subscription','scene_id':'subscription','name':'Subscription\x20/\x20Membership\x20Flow','description':'Subscribe\x20->\x20Pay\x20->\x20Activate\x20->\x20[Renew\x20|\x20Expire]\x20->\x20Cancel/End.\x20Time-lock\x20on\x20Renew.\x20'+'Competing\x20Pair:\x20Renew\x20vs\x20Expire\x20(first-wins).\x20Repository\x20stores\x20subscription\x20status.','recommended_patterns':['P-M-SEQ','P-M-COMPETING'],'recommended_topology':['P-M-LINEAR','P-M-COMPETING'],'parameters':[{'name':'merchant_permission','type':'permission_ref','required':!![],'description':'Provider\x20Permission\x20object'},{'name':'subscription_duration_days','type':'number','required':!![],'default':'30','description':'Days\x20between\x20Renew\x20and\x20Expire\x20eligibility'},{'name':'repository_ref','type':'address','required':!![],'description':'Repository\x20object\x20storing\x20subscription\x20status\x20(note:\x20not\x20consensus_repositories,\x20which\x20is\x20declarative-only\x20—\x20see\x2006\x20§14.4)'}],'example_nodes':[{'name':'Paid','description':'Entry:\x20subscription\x20created\x20and\x20paid\x20via\x20Service.buy();\x20Machine\x20starts\x20here'},{'name':'Active'},{'name':'RenewEligible'},{'name':'Renewed'},{'name':'Expired'},{'name':'Cancelled'},{'name':'Ended'}],'example_pairs':[{'prev_node':'','next_node':'Paid','threshold':0x1,'forwards':[{'name':'Enter','weight':0x1,'named_operator':''}]},{'prev_node':'Paid','next_node':'Active','threshold':0x1,'forwards':[{'name':'Activate','weight':0x1,'permission_index':0x2,'guard':'repository_write_guard'}]},{'prev_node':'Active','next_node':'RenewEligible','threshold':0x1,'forwards':[{'name':'TimeUnlock','weight':0x1,'permission_index':0x3,'guard':'time_lock_guard_${subscription_duration_days}_days'}]},{'prev_node':'RenewEligible','next_node':'Renewed','threshold':0x1,'forwards':[{'name':'Renew','weight':0x1,'named_operator':''}]},{'prev_node':'RenewEligible','next_node':'Expired','threshold':0x1,'forwards':[{'name':'AutoExpire','weight':0x1,'permission_index':0x3,'guard':'expire_time_guard'}]},{'prev_node':'RenewEligible','next_node':'Cancelled','threshold':0x1,'forwards':[{'name':'Cancel','weight':0x1,'named_operator':''}]},{'prev_node':'Renewed','next_node':'Active','threshold':0x1,'forwards':[{'name':'Reactivate','weight':0x1,'permission_index':0x2}]},{'prev_node':'Expired','next_node':'Ended','threshold':0x1,'forwards':[{'name':'CloseExpired','weight':0x1,'permission_index':0x3}]},{'prev_node':'Cancelled','next_node':'Ended','threshold':0x1,'forwards':[{'name':'CloseCancelled','weight':0x1,'permission_index':0x2}]}],'required_guards':[{'guard_template_id':'tpl_forward_node_check','bound_to_forward':'TimeUnlock','purpose':'Time\x20lock:\x20context(Clock)\x20>=\x20progress.current_time\x20+\x20${subscription_duration_days}\x20days'},{'guard_template_id':'tpl_write_guard_type_check','bound_to_forward':'Activate','purpose':'Write\x20subscription\x20status\x20to\x20Repository'},{'guard_template_id':'tpl_forward_node_check','bound_to_forward':'AutoExpire','purpose':'Hard\x20expire:\x20context(Clock)\x20>=\x20progress.current_time\x20+\x202x\x20duration'}],'required_permissions':[{'index':0x2,'name':'provider','description':'Provider\x20activates/reactivates'},{'index':0x3,'name':'admin','description':'Time-lock\x20triggers'}],'required_allocators':[{'name':'RenewAllocation','trigger_node':'Renewed','description':'Charge\x20renewal\x20fee\x20on\x20Renew'}],'forkable_fields':['duration_days','grace_period','additional_tiers'],'applicable_industries':['subscription','saas','membership','service'],'relevant_risks':['R-M1-01','R-M1-08','R-M2-01','R-M2-05','R-M3-02','R-M3-04','R-M4-01','R-M5-04'],'creation_notes':['First\x20node\x20\x27Paid\x27\x20represents\x20post-payment\x20state\x20—\x20Service.buy()\x20completes\x20subscription\x20payment\x20atomically\x20before\x20Progress\x20is\x20created','No\x20separate\x20\x27Subscribe\x27\x20or\x20\x27Pay\x27\x20nodes\x20needed\x20—\x20subscription\x20and\x20payment\x20are\x20handled\x20by\x20Service.buy(),\x20not\x20Machine','Time-lock\x20uses\x20context(Clock)\x20—\x20verify\x20Clock\x20address\x20in\x20Guard\x20table','Competing\x20Pair:\x20Renew\x20vs\x20Expire\x20vs\x20Cancel\x20—\x20first-wins','Renewed\x20node\x20loops\x20back\x20to\x20Active\x20(recurring\x20subscription)','Repository\x20records\x20subscription\x20status\x20for\x20cross-Machine\x20verification','Renewal\x20Allocation\x20triggers\x20on\x20Renewed\x20node\x20(not\x20Active\x20—\x20avoids\x20double-charge)','Note:\x20consensus_repositories\x20is\x20declarative-only\x20(NOT\x20auto-passed\x20to\x20Progress);\x20use\x20repository_ref\x20parameter\x20for\x20actual\x20Repository\x20object\x20—\x20see\x2006\x20§14.4','VARIANT\x20—\x20Content\x20subscription\x20(Substack-style):\x20replace\x20time-lock\x20Renew/Expire\x20with\x20content-delivery\x20flow:','\x20\x206-node\x20variant:\x20Paid\x20(entry)\x20→\x20ContentPublished\x20→\x20Completed\x20(terminal-success)','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Paid\x20→\x20Cancelled\x20(terminal-cancel)\x20|\x20Paid\x20→\x20Disputed\x20→\x20Refunded\x20(terminal-dispute)','\x20\x20Permission:\x20author=index\x201000\x20(publish\x20+\x20cancel),\x20arbitrator=index\x201500\x20(resolve\x20dispute),\x20reader=namedOperator=\x27\x27\x20(open\x20role,\x20no\x20specific\x20operator)','\x20\x20Guards:\x20deliver_guard\x20(verify\x20author\x20permission\x20+\x20content\x20hash),\x20cancel_guard\x20(verify\x20subscriber\x20request),\x20refund_guard\x20(verify\x20arbitration\x20outcome)','\x20\x20Allocators:\x20deliver=100%\x20to\x20author,\x20cancel=100%\x20refund\x20to\x20subscriber,\x20dispute=100%\x20refund\x20to\x20subscriber\x20(Guard-first-wins\x20pattern)','\x20\x20First-Forward-wins:\x20when\x20Paid\x20has\x20competing\x20forwards\x20(Deliver|Cancel|Dispute),\x20the\x20first\x20triggered\x20forward\x20wins;\x20subscribers\x20cannot\x20double-claim','CRITICAL\x20—\x20v1→v2\x20lesson:\x20arbitrations\x20MUST\x20be\x20added\x20BEFORE\x20Service.publish\x20(post-publish,\x20arbitrations\x20become\x20immutable\x20and\x20cannot\x20be\x20added\x20—\x20F-S-21)','\x20\x20If\x20you\x20accidentally\x20published\x20without\x20arbitrations,\x20you\x20MUST\x20create\x20a\x20new\x20Service\x20v2\x20with\x20arbitrations\x20bound\x20before\x20publishing\x20(the\x20v1\x20Service\x20must\x20be\x20paused/abandoned)','\x20\x20ConfirmGate\x20(C-S-19,\x20QS11)\x20will\x20warn\x20before\x20publish\x20without\x20arbitrations\x20—\x20do\x20not\x20bypass\x20this\x20warning\x20unless\x20explicitly\x20intending\x20no-arbitration\x20operation','Build\x20order\x20(content\x20variant):\x20Permission\x20→\x20Machine\x20(unpublished,\x20with\x20initial\x20forward)\x20→\x203\x20Guards\x20→\x203\x20Allocators\x20(template\x20on\x20Service)\x20→\x20Service\x20(unpublished,\x20bind\x20machine+buy_guard+order_allocators+arbitrations)\x20→\x20Publish\x20Service\x20→\x20Test\x20order\x20(3\x20paths:\x20normal/cancel/dispute)'],'example_use_case':'Monthly\x20SaaS\x20subscription:\x20$10/month.\x20Customer\x20can\x20renew\x20anytime\x20after\x20day\x2025.\x20'+'Auto-expire\x20on\x20day\x2035\x20if\x20not\x20renewed.\x20Cancel\x20anytime.\x0a\x0a'+'VARIANT\x20—\x20Content\x20subscription\x20(Substack-style):\x20$5/month\x20newsletter.\x20Author\x20publishes\x20content\x20→\x20'+'subscriber\x20reads.\x20Subscriber\x20can\x20cancel\x20anytime\x20for\x20full\x20refund.\x20Disputes\x20resolved\x20by\x20arbitrator\x20'+'(100%\x20refund\x20to\x20subscriber\x20if\x20dispute\x20upheld).\x206-node\x20Machine,\x203\x20Guards,\x203\x20Allocators.\x20'+'Tested\x20on\x20testnet\x20with\x203\x20order\x20paths:\x20normal\x20delivery,\x20cancel,\x20dispute.','publish_checklist':['Time-lock\x20Guards\x20tested\x20on\x20testnet\x20(both\x20TimeUnlock\x20+\x20AutoExpire)','Competing\x20Pair\x20semantics\x20verified\x20(Renew\x20vs\x20Expire\x20vs\x20Cancel)','Repository\x20write\x20tested\x20(subscription\x20status\x20queryable)','Renewal\x20loop\x20tested:\x20Paid\x20->\x20Active\x20->\x20RenewEligible\x20->\x20Renewed\x20->\x20Active','Content\x20variant:\x20initial\x20node\x20(prev_node=\x27\x27)\x20MUST\x20have\x20at\x20least\x20one\x20forward\x20(FIX-002)\x20—\x20empty\x20forwards=[]\x20causes\x20Progress\x20to\x20be\x20permanently\x20stuck','Content\x20variant:\x20arbitrations\x20added\x20BEFORE\x20publish\x20(cannot\x20add\x20post-publish\x20per\x20F-S-21)','Content\x20variant:\x203\x20order\x20paths\x20tested\x20on\x20testnet\x20—\x20normal\x20delivery,\x20cancel-within-grace,\x20dispute-resolution','Content\x20variant:\x20machineNode2file\x20export\x20as\x20backup\x20(covers\x20all\x206\x20nodes)']}];export const MACHINE_TEMPLATES_VERSION='1.0.0';export const MACHINE_TEMPLATES_COUNT=MACHINE_TEMPLATES['length'];export function getAllTemplates(){return MACHINE_TEMPLATES;}export function getTemplateById(a){return MACHINE_TEMPLATES['find'](b=>b['id']===a);}export function getTemplatesByScene(a){return MACHINE_TEMPLATES['filter'](b=>b['scene_id']===a);}export function getTemplatesByIndustry(a){return MACHINE_TEMPLATES['filter'](b=>b['applicable_industries']['includes'](a));}export function getTemplatesByPattern(a){return MACHINE_TEMPLATES['filter'](b=>b['recommended_patterns']['includes'](a));}export function suggestTemplateForIntent(a){const b=inferSceneFromFlow(a);if(!b)return undefined;const c=getTemplatesByScene(b['id']);return c[0x0];}export function getTemplateParameters(a){const b=getTemplateById(a);return b?b['parameters']:[];}export function getRequiredParameters(a){return getTemplateParameters(a)['filter'](b=>b['required']);}export function getOptionalParameters(a){return getTemplateParameters(a)['filter'](b=>!b['required']);}function validateParamType(a,b){switch(b){case'address':case'string':case'permission_ref':case'guard_ref':case'machine_ref':case'service_ref':case'arbitration_ref':case'reward_ref':return typeof a==='string';case'number':return typeof a==='number'||typeof a==='string'&&/^\d+$/['test'](a);case'boolean':return typeof a==='boolean';case'vec_address':case'vec_string':case'node_name_list':return Array['isArray'](a)&&a['every'](c=>typeof c==='string');default:return![];}}function deepSubstitute(a,b){if(typeof a==='string')return a['replace'](/\$\{(\w+)\}/g,(c,d)=>d in b?String(b[d]):'${'+d+'}');if(Array['isArray'](a))return a['map'](c=>deepSubstitute(c,b));if(a&&typeof a==='object'){const c={};for(const [d,e]of Object['entries'](a)){c[d]=deepSubstitute(e,b);}return c;}return a;}export function fillTemplate(a,b){const c=getTemplateById(a);if(!c)return{'success':![],'validation_errors':['Template\x20not\x20found:\x20'+a]};const d=c['parameters']['filter'](h=>h['required']&&!(h['name']in b))['map'](h=>h['name']);if(d['length']>0x0)return{'success':![],'missing_params':d,'validation_errors':['Missing\x20required\x20parameters:\x20'+d['join'](',\x20')]};const e=[];for(const h of c['parameters']){if(h['name']in b){const i=b[h['name']];!validateParamType(i,h['type'])&&e['push']('Parameter\x20\x22'+h['name']+'\x22\x20type\x20mismatch:\x20expected\x20'+h['type']+',\x20got\x20'+typeof i);}}if(e['length']>0x0)return{'success':![],'validation_errors':e};const f=deepSubstitute(c['example_nodes'],b),g=deepSubstitute(c['example_pairs'],b);return{'success':!![],'filled_nodes':f,'filled_pairs':g};}export function forkTemplate(a){const b=getTemplateById(a);if(!b)return undefined;const c={};for(const d of b['forkable_fields']){c[d]='see\x20example_nodes/example_pairs';}return{'template_id':a,'forkable_fields':b['forkable_fields'],'current_values':c,'instructions':['Modify\x20fields\x20below\x20to\x20customize\x20the\x20workflow','Keep\x20template\x20structure\x20intact\x20unless\x20explicitly\x20noted','Run\x20risk\x20assessment\x20after\x20modification\x20(machine-risk.ts)','User\x20MUST\x20confirm\x20final\x20JSON\x20before\x20publish\x20(ConfirmGate)']};}export const DECISION_TREE={'Q1':{'question':'Does\x20the\x20workflow\x20involve\x20multiple\x20independent\x20services/parties?','no_next':'Q3'},'Q2':{'question':'Are\x20these\x20services\x20already\x20published\x20as\x20separate\x20Machines?','yes_template':'tpl_machine_cross_machine','no_next':'DECOMPOSE'},'Q3':{'question':'Does\x20any\x20node\x20require\x20multiple\x20parties\x27\x20confirmation\x20to\x20advance?','no_next':'Q5'},'Q4':{'question':'Do\x20all\x20parties\x20have\x20EQUAL\x20weight?','yes_template':'tpl_machine_dual_signature','no_next':'tpl_machine_weighted_voting'},'Q5':{'question':'Does\x20the\x20workflow\x20need\x20exception\x20branches\x20(lost,\x20return,\x20dispute)?','yes_template':'tpl_machine_ecommerce_exceptions','no_next':'Q6'},'Q6':{'question':'Does\x20it\x20involve\x20recurring\x20payments\x20or\x20time-based\x20state\x20changes?','yes_template':'tpl_machine_subscription','no_next':'Q7'},'Q7':{'question':'Does\x20it\x20need\x20privacy-preserving\x20data\x20delivery\x20(Messenger)?','yes_template':'tpl_machine_privacy_delivery','no_next':'Q8'},'Q8':{'question':'Does\x20it\x20involve\x20deposit/refund\x20separation?','yes_template':'tpl_machine_rental','no_next':'Q9'},'Q9':{'question':'Does\x20it\x20need\x20reward/incentive\x20distribution\x20at\x20a\x20specific\x20node?','yes_template':'tpl_machine_reward','no_next':'tpl_machine_ecommerce_standard'}};export function walkDecisionTree(a){let b='Q1';while(b){const c=DECISION_TREE[b];if(!c)return'UNKNOWN';const d=a[b];if(d===undefined)return b;if(d){if(c['yes_template'])return c['yes_template'];if(b==='Q1'){b='Q2';continue;}if(b==='Q3'){b='Q4';continue;}return'UNKNOWN';}else{if(c['no_next']){if(c['no_next']==='DECOMPOSE')return'DECOMPOSE_INTO_MULTIPLE_MACHINES';if(c['no_next']['startsWith']('tpl_'))return c['no_next'];b=c['no_next'];continue;}return'UNKNOWN';}}return'UNKNOWN';}export function verifyTemplateSceneReferences(){const a=[];for(const b of MACHINE_TEMPLATES){!findScene(b['scene_id'])&&a['push']({'template_id':b['id'],'invalid_scene_id':b['scene_id']});}return a;}export function getReferencedGuardTemplateIds(){const a=new Set();for(const b of MACHINE_TEMPLATES){for(const c of b['required_guards']){a['add'](c['guard_template_id']);}}return a;}export function getReferencedRiskIds(){const a=new Set();for(const b of MACHINE_TEMPLATES){for(const c of b['relevant_risks']){a['add'](c);}}return a;}export function listTemplates(){return MACHINE_TEMPLATES['map'](a=>({'id':a['id'],'name':a['name'],'scene_id':a['scene_id'],'patterns':a['recommended_patterns'],'industries':a['applicable_industries']}));}
|
|
1
|
+
import{findScene,inferSceneFromFlow}from'./machine-ledger.js';export const MACHINE_TEMPLATES=[{'id':'tpl_machine_ecommerce_standard','scene_id':'ecommerce_standard','name':'Standard\x20E-commerce\x20Flow','description':'Linear\x20e-commerce\x20workflow:\x20Paid\x20(entry)\x20->\x20Ship\x20->\x20Receive\x20->\x20Complete.\x20'+'Payment\x20is\x20handled\x20by\x20the\x20Service\x20buy\x20flow\x20(direct\x20or\x20Passport-gated\x20purchase)\x20atomically;\x20Machine\x20starts\x20at\x20post-payment\x20state.\x20'+'Reaching\x20Complete\x20does\x20NOT\x20move\x20funds\x20—\x20allocation\x20is\x20a\x20separate\x20submitted\x20call\x20and\x20the\x20on-chain\x20allocation\x20has\x20no\x20timer,\x20'+'so\x20a\x20keeper\x20(merchant\x20or\x20buyer-side\x20trigger)\x20must\x20fire\x20it\x20or\x20the\x20order\x20stays\x20settled-but-unpaid.\x20Recommended\x20baseline\x20for\x20new\x20merchants.','recommended_patterns':['P-M-SEQ'],'recommended_topology':['P-M-LINEAR'],'parameters':[{'name':'merchant_permission','type':'permission_ref','required':!![],'description':'Merchant\x20Permission\x20object\x20address\x20or\x20name\x20(must\x20have\x20custom\x20indices\x20defined)','constraint':'Permission\x20must\x20already\x20be\x20created;\x20index\x202\x20(merchant)\x20and\x20index\x203\x20(admin)\x20recommended'},{'name':'ship_forward_name','type':'string','required':!![],'default':'Ship','description':'Forward\x20name\x20for\x20shipping\x20step','constraint':'Must\x20be\x20<64\x20BCS\x20bytes;\x20only\x20letters/digits/underscore'},{'name':'receive_forward_name','type':'string','required':!![],'default':'Receive','description':'Forward\x20name\x20for\x20customer\x20receipt\x20confirmation'},{'name':'complete_node_name','type':'string','required':!![],'default':'Complete','description':'Terminal\x20node\x20name\x20triggering\x20fund\x20allocation'}],'example_nodes':[{'name':'Paid','description':'Entry:\x20order\x20created\x20and\x20paid\x20via\x20Service.buy();\x20Machine\x20starts\x20here'},{'name':'Shipped','description':'Goods\x20dispatched'},{'name':'Received','description':'Customer\x20confirmed\x20receipt'},{'name':'${complete_node_name}','description':'Terminal:\x20triggers\x20allocation'}],'example_pairs':[{'prev_node':'','next_node':'Paid','threshold':0x1,'forwards':[{'name':'Enter','weight':0x1,'named_operator':'','permission_index':0x0}]},{'prev_node':'Paid','next_node':'Shipped','threshold':0x1,'forwards':[{'name':'${ship_forward_name}','weight':0x1,'permission_index':0x2,'named_operator':''}]},{'prev_node':'Shipped','next_node':'Received','threshold':0x1,'forwards':[{'name':'${receive_forward_name}','weight':0x1,'named_operator':'','permission_index':0x0}]},{'prev_node':'Received','next_node':'${complete_node_name}','threshold':0x1,'forwards':[{'name':'Finish','weight':0x1,'permission_index':0x2,'named_operator':''}]}],'required_guards':[],'required_permissions':[{'index':0x2,'name':'merchant','description':'Merchant\x20role\x20for\x20Ship\x20+\x20Finish'},{'index':0x3,'name':'admin','description':'Admin\x20override\x20(optional)'}],'required_allocators':[{'name':'MerchantAllocation','trigger_node':'${complete_node_name}','description':'100%\x20to\x20merchant\x20Treasury\x20or\x20personal\x20address'}],'forkable_fields':['node_names','forward_names','thresholds','additional_branches'],'applicable_industries':['ecommerce','retail'],'relevant_risks':['R-M1-01','R-M1-02','R-M1-08','R-M2-01','R-M3-02','R-M4-01'],'creation_notes':['Build\x20order:\x20Permission\x20->\x20Machine\x20(unpublished)\x20->\x20Guards\x20->\x20Bind\x20guards\x20->\x20Publish\x20->\x20Bind\x20to\x20Service','First\x20node\x20\x27Paid\x27\x20represents\x20post-payment\x20state\x20—\x20Service.buy()\x20completes\x20payment\x20atomically\x20before\x20Progress\x20is\x20created','No\x20separate\x20\x27Order\x27\x20or\x20\x27Pay\x27\x20nodes\x20needed\x20—\x20payment\x20is\x20handled\x20by\x20Service.buy(),\x20not\x20Machine','Entry\x20point:\x20prev_node=\x27\x27\x20(empty\x20string)\x20targets\x20\x27Paid\x27\x20—\x20at\x20least\x20one\x20Pair\x20must\x20exist\x20with\x20empty\x20prev_node','If\x20using\x20P16\x20circular\x20reference\x20for\x20Service,\x20use\x20name\x20not\x20address\x20(Service\x20not\x20yet\x20published)'],'example_use_case':'Small\x20e-commerce\x20shop\x20selling\x20camera\x20accessories.\x20Linear\x20flow\x20with\x20no\x20exceptions.\x20'+'Funds\x20allocated\x20to\x20merchant\x20personal\x20address\x20on\x20Complete.','publish_checklist':['All\x204\x20nodes\x20have\x20at\x20least\x20one\x20outgoing\x20Forward\x20(except\x20terminal)','Entry\x20Pair\x20exists\x20(prev_node=\x27\x27\x20targets\x20\x27Paid\x27)','permissionIndex\x20values\x20match\x20Permission\x20object\x20indices','Test\x20Progress\x20run\x20on\x20testnet','machineNode2file\x20export\x20as\x20backup']},{'id':'tpl_machine_ecommerce_exceptions','scene_id':'ecommerce_with_exceptions','name':'E-commerce\x20Flow\x20with\x20Exception\x20Branches','description':'Multi-path\x20workflow:\x20Paid\x20(entry)\x20->\x20Ship\x20->\x20Receive/Lost/Return.\x20Lost\x20uses\x20dual-sig\x20(threshold=2).\x20'+'Payment\x20is\x20handled\x20by\x20Service.buy()\x20atomically;\x20Machine\x20starts\x20at\x20post-payment\x20state.\x20'+'Return\x20path\x20opens\x20Refund\x20->\x20Complete.\x20Competing\x20pairs\x20first-wins.','recommended_patterns':['P-M-SEQ','P-M-COMPETING'],'recommended_topology':['P-M-LINEAR','P-M-COMPETING'],'parameters':[{'name':'merchant_permission','type':'permission_ref','required':!![],'description':'Merchant\x20Permission\x20object'},{'name':'lost_threshold','type':'number','required':!![],'default':'2','description':'Threshold\x20for\x20dual-sig\x20on\x20Lost\x20node','constraint':'Must\x20be\x202\x20(customer\x20+\x20merchant)'},{'name':'arbitration_ref','type':'arbitration_ref','required':![],'description':'Arbitration\x20object\x20if\x20Lost\x20escalates\x20to\x20arbitration'},{'name':'time_guard_days','type':'number','required':!![],'default':'10','description':'Days\x20before\x20auto-complete\x20trigger\x20(time\x20guard)','constraint':'Must\x20be\x20>\x200;\x20reasonable\x20range\x207-30'},{'name':'return_node_name','type':'string','required':!![],'default':'Return','description':'Name\x20of\x20the\x20return/refund\x20node\x20in\x20the\x20exception\x20branch'}],'example_nodes':[{'name':'Paid','description':'Entry:\x20order\x20created\x20and\x20paid\x20via\x20Service.buy();\x20Machine\x20starts\x20here'},{'name':'Shipped'},{'name':'Received'},{'name':'Lost'},{'name':'Return'},{'name':'Refund'},{'name':'Complete'}],'example_pairs':[{'prev_node':'','next_node':'Paid','threshold':0x1,'forwards':[{'name':'Enter','weight':0x1,'named_operator':''}]},{'prev_node':'Paid','next_node':'Shipped','threshold':0x1,'forwards':[{'name':'Ship','weight':0x1,'permission_index':0x2}]},{'prev_node':'Shipped','next_node':'Received','threshold':0x1,'forwards':[{'name':'ConfirmReceive','weight':0x1,'named_operator':''}]},{'prev_node':'Shipped','next_node':'Lost','threshold':'${lost_threshold}','forwards':[{'name':'CustomerReport','weight':0x1,'named_operator':''},{'name':'MerchantConfirm','weight':0x1,'permission_index':0x2}]},{'prev_node':'Shipped','next_node':'Return','threshold':0x1,'forwards':[{'name':'RequestReturn','weight':0x1,'named_operator':''}]},{'prev_node':'Received','next_node':'Complete','threshold':0x1,'forwards':[{'name':'TimeGuard','weight':0x1,'permission_index':0x3,'guard':'time_guard_${time_guard_days}_days'},{'name':'MerchantFinish','weight':0x1,'permission_index':0x2}]},{'prev_node':'Return','next_node':'Refund','threshold':0x1,'forwards':[{'name':'IssueRefund','weight':0x1,'permission_index':0x2}]},{'prev_node':'Refund','next_node':'Complete','threshold':0x1,'forwards':[{'name':'CloseReturn','weight':0x1,'permission_index':0x2}]}],'required_guards':[{'guard_template_id':'tpl_forward_node_check','bound_to_forward':'MerchantConfirm','purpose':'Dual-sig\x20on\x20Lost\x20node'},{'guard_template_id':'tpl_forward_node_check','bound_to_forward':'TimeGuard','purpose':'Time\x20lock\x20${time_guard_days}\x20days'}],'required_permissions':[{'index':0x2,'name':'merchant','description':'Merchant\x20role'},{'index':0x3,'name':'admin','description':'Admin\x20/\x20time-guard\x20trigger'}],'required_allocators':[{'name':'CompleteAllocation','trigger_node':'Complete','description':'Full\x20allocation\x20to\x20merchant\x20on\x20normal\x20completion'},{'name':'RefundAllocation','trigger_node':'Refund','description':'Full\x20refund\x20to\x20customer\x20on\x20return'},{'name':'LostAllocation','trigger_node':'Lost','description':'Optional:\x20partial\x20refund\x20or\x20escrow\x20(depends\x20on\x20policy)'}],'forkable_fields':['node_names','branch_conditions','time_guard_days','lost_threshold'],'applicable_industries':['ecommerce','logistics'],'relevant_risks':['R-M1-01','R-M1-03','R-M1-08','R-M2-01','R-M2-05','R-M3-02','R-M3-04','R-M3-05','R-M4-01','R-M5-03'],'creation_notes':['First\x20node\x20\x27Paid\x27\x20represents\x20post-payment\x20state\x20—\x20Service.buy()\x20completes\x20payment\x20atomically\x20before\x20Progress\x20is\x20created','No\x20separate\x20\x27Order\x27\x20or\x20\x27Pay\x27\x20nodes\x20needed\x20—\x20payment\x20is\x20handled\x20by\x20Service.buy(),\x20not\x20Machine','Competing\x20Pairs\x20(Shipped\x20->\x20Received/Lost/Return)\x20are\x20mutually\x20exclusive\x20—\x20first\x20threshold\x20met\x20wins','Lost\x20node\x20threshold=2\x20means\x20BOTH\x20customer\x20and\x20merchant\x20Forwards\x20must\x20execute','TimeGuard\x20must\x20use\x20context(Clock)\x20>=\x20progress.current_time\x20+\x20duration\x20(the\x20on-chain\x20Progress\x20exposes\x20current_time,\x20refreshed\x20on\x20every\x20node\x20transition\x20—\x20there\x20is\x20no\x20entry_time\x20field)','If\x20Lost\x20escalates\x20to\x20arbitration,\x20bind\x20arbitration_usage_guard\x20on\x20Lost\x20forward','Refund\x20Allocation\x20must\x20use\x20sharing.who=OrderHolder\x20(refund\x20to\x20customer,\x20NOT\x20merchant)'],'example_use_case':'Mid-size\x20e-commerce\x20with\x207-day\x20return\x20policy\x20and\x20dispute\x20handling.\x20'+'Lost\x20claims\x20require\x20customer+merchant\x20dual\x20confirmation.','publish_checklist':['All\x20competing\x20Pairs\x20tested:\x20verify\x20first-wins\x20semantics\x20on\x20testnet','Lost\x20dual-sig\x20tested:\x20incomplete\x20signatures\x20do\x20not\x20advance','TimeGuard\x20Clock\x20query\x20verified\x20(testnet)','All\x20three\x20Allocators\x20tested\x20with\x20correct\x20sharing.who','Arbitration\x20binding\x20(if\x20any)\x20verified\x20via\x20gen_passport']},{'id':'tpl_machine_rental','scene_id':'rental_standard','name':'Equipment\x20Rental\x20Flow','description':'Rental\x20flow:\x20DepositPaid\x20(entry)\x20->\x20Pickup\x20->\x20In\x20Use\x20->\x20Return\x20->\x20Refund\x20Deposit.\x20'+'Payment\x20is\x20handled\x20by\x20Service.buy()\x20atomically;\x20Machine\x20starts\x20at\x20post-deposit\x20state.\x20'+'Separates\x20deposit\x20from\x20rental\x20fee\x20(two\x20Allocators).\x20Damage\x20report\x20via\x20retained_submission.','recommended_patterns':['P-M-SEQ'],'recommended_topology':['P-M-LINEAR'],'parameters':[{'name':'merchant_permission','type':'permission_ref','required':!![],'description':'Merchant\x20Permission\x20object'},{'name':'deposit_amount','type':'number','required':!![],'description':'Deposit\x20amount\x20in\x20smallest\x20WOW\x20unit','constraint':'Must\x20equal\x20order.amount\x20field;\x20verify\x20via\x20Guard\x20query'},{'name':'damage_inspection_node','type':'string','required':!![],'default':'DamageCheck','description':'Name\x20of\x20the\x20node\x20where\x20damage\x20inspection\x20occurs'},{'name':'return_node_name','type':'string','required':!![],'default':'Return','description':'Name\x20of\x20the\x20return\x20node\x20after\x20damage\x20check\x20fails'}],'example_nodes':[{'name':'DepositPaid','description':'Entry:\x20deposit\x20paid\x20via\x20Service.buy();\x20Machine\x20starts\x20here'},{'name':'PickedUp'},{'name':'InUse'},{'name':'Return'},{'name':'DamageCheck'},{'name':'DepositRefund'},{'name':'Complete'}],'example_pairs':[{'prev_node':'','next_node':'DepositPaid','threshold':0x1,'forwards':[{'name':'Enter','weight':0x1,'named_operator':''}]},{'prev_node':'DepositPaid','next_node':'PickedUp','threshold':0x1,'forwards':[{'name':'Pickup','weight':0x1,'named_operator':'','permission_index':0x2}]},{'prev_node':'PickedUp','next_node':'InUse','threshold':0x1,'forwards':[{'name':'StartUse','weight':0x1,'named_operator':''}]},{'prev_node':'InUse','next_node':'Return','threshold':0x1,'forwards':[{'name':'ReturnItem','weight':0x1,'named_operator':''}]},{'prev_node':'Return','next_node':'DamageCheck','threshold':0x1,'forwards':[{'name':'Inspect','weight':0x1,'permission_index':0x2,'retained_submission':'damage_report'}]},{'prev_node':'Return','next_node':'Complete','threshold':0x1,'forwards':[{'name':'CleanReturn','weight':0x1,'permission_index':0x2}]},{'prev_node':'DamageCheck','next_node':'DepositRefund','threshold':0x1,'forwards':[{'name':'DeductDamage','weight':0x1,'permission_index':0x2}]},{'prev_node':'DepositRefund','next_node':'Complete','threshold':0x1,'forwards':[{'name':'Close','weight':0x1,'permission_index':0x2}]}],'required_guards':[{'guard_template_id':'tpl_forward_privacy_delivery_proof','bound_to_forward':'Inspect','purpose':'Optional:\x20damage\x20evidence\x20proof\x20(photo,\x20video)'}],'required_permissions':[{'index':0x2,'name':'merchant','description':'Rental\x20provider'}],'required_allocators':[{'name':'RentalFeeAllocation','trigger_node':'Complete','description':'Rental\x20fee\x20to\x20merchant'},{'name':'DepositRefundAllocation','trigger_node':'DepositRefund','description':'Remaining\x20deposit\x20to\x20customer\x20(OrderHolder\x20sharing.who)'},{'name':'DamageDeductionAllocation','trigger_node':'DamageCheck','description':'Damage\x20deduction\x20to\x20merchant'}],'forkable_fields':['deposit_amount','damage_node_logic','additional_inspection_steps'],'applicable_industries':['rental','equipment','vehicle'],'relevant_risks':['R-M1-01','R-M1-08','R-M2-01','R-M2-04','R-M3-02','R-M4-01','R-M5-02'],'creation_notes':['First\x20node\x20\x27DepositPaid\x27\x20represents\x20post-payment\x20state\x20—\x20Service.buy()\x20completes\x20deposit\x20payment\x20atomically\x20before\x20Progress\x20is\x20created','No\x20separate\x20\x27Reserve\x27\x20or\x20\x27PayDeposit\x27\x20nodes\x20needed\x20—\x20reservation\x20and\x20payment\x20are\x20handled\x20by\x20Service.buy(),\x20not\x20Machine','Damage\x20report\x20uses\x20retained_submission\x20—\x20values\x20stored\x20uniquely\x20by\x20(current_node,\x20next_node,\x20forward_name)','Two\x20competing\x20Pairs\x20at\x20Return\x20node:\x20DamageCheck\x20vs\x20Complete\x20(clean\x20return)','DamageDeduction\x20Allocation\x20uses\x20sharing.who=Entity\x20(merchant),\x20not\x20OrderHolder'],'example_use_case':'Camera\x20equipment\x20rental:\x20customer\x20pays\x201000\x20WOW\x20deposit,\x20returns\x20equipment,\x20'+'merchant\x20inspects.\x20If\x20damaged,\x20200\x20WOW\x20deducted;\x20otherwise\x20full\x20refund.','publish_checklist':['Deposit\x20Guard\x20tested\x20(testnet)\x20with\x20valid/invalid\x20amounts','Damage\x20report\x20retained_submission\x20stored\x20correctly\x20(query\x20progress_history)','Both\x20Return\x20branches\x20tested\x20(DamageCheck\x20+\x20CleanReturn)','All\x20three\x20Allocators\x20verified\x20with\x20correct\x20sharing.who']},{'id':'tpl_machine_dual_signature','scene_id':'dual_signature','name':'Dual-Signature\x20Consensus\x20Flow','description':'Critical\x20node\x20requires\x20both\x20customer\x20+\x20merchant\x20confirmation.\x20threshold=2\x20with\x20two\x20Forwards\x20(weight=1\x20each).\x20'+'Customer\x20uses\x20namedOperator=\x27\x27\x20(OrderHolder);\x20merchant\x20uses\x20permissionIndex=2.','recommended_patterns':['P-M-AND'],'recommended_topology':['P-M-LINEAR'],'parameters':[{'name':'merchant_permission','type':'permission_ref','required':!![],'description':'Merchant\x20Permission\x20object'},{'name':'critical_node_name','type':'string','required':!![],'default':'Approve','description':'Node\x20requiring\x20dual-sig'},{'name':'next_node_after_approval','type':'string','required':!![],'default':'Execute','description':'Name\x20of\x20the\x20node\x20that\x20follows\x20after\x20dual-signature\x20approval'}],'example_nodes':[{'name':'Initiated'},{'name':'${critical_node_name}','description':'Dual-sig\x20required\x20here'},{'name':'${next_node_after_approval}'},{'name':'Complete'}],'example_pairs':[{'prev_node':'','next_node':'Initiated','threshold':0x1,'forwards':[{'name':'Initiate','weight':0x1,'named_operator':''}]},{'prev_node':'Initiated','next_node':'${critical_node_name}','threshold':0x1,'forwards':[{'name':'Submit','weight':0x1,'named_operator':''}]},{'prev_node':'${critical_node_name}','next_node':'${next_node_after_approval}','threshold':0x2,'forwards':[{'name':'CustomerApprove','weight':0x1,'named_operator':'','guard':'customer_identity_guard'},{'name':'MerchantApprove','weight':0x1,'permission_index':0x2,'guard':'merchant_identity_guard'}]},{'prev_node':'${next_node_after_approval}','next_node':'Complete','threshold':0x1,'forwards':[{'name':'Finish','weight':0x1,'permission_index':0x2}]}],'required_guards':[{'guard_template_id':'tpl_forward_node_check','bound_to_forward':'CustomerApprove','purpose':'Verify\x20customer\x20identity\x20(order.owner)'},{'guard_template_id':'tpl_forward_node_check','bound_to_forward':'MerchantApprove','purpose':'Verify\x20merchant\x20identity\x20(permission\x20holder)'}],'required_permissions':[{'index':0x2,'name':'merchant','description':'Merchant\x20approval'}],'required_allocators':[{'name':'CompleteAllocation','trigger_node':'Complete','description':'Allocation\x20on\x20dual-sig\x20completion'}],'forkable_fields':['critical_node_name','additional_approvers','guard_logic'],'applicable_industries':['ecommerce','service','logistics','escrow'],'relevant_risks':['R-M1-08','R-M2-01','R-M3-02','R-M3-04'],'creation_notes':['threshold=2\x20means\x20BOTH\x20Forwards\x20must\x20execute\x20to\x20advance\x20(AND\x20semantics)','Customer\x20Forward\x20uses\x20namedOperator=\x27\x27\x20(OrderHolder)','Merchant\x20Forward\x20uses\x20permissionIndex=2','If\x20either\x20party\x20fails\x20to\x20sign,\x20workflow\x20stalls\x20—\x20consider\x20adding\x20timeout\x20Guard'],'example_use_case':'High-value\x20order\x20(e.g.\x20real\x20estate\x20transaction)\x20requiring\x20both\x20buyer\x20and\x20seller\x20confirmation.','publish_checklist':['Both\x20Forward\x20identities\x20tested\x20on\x20testnet','Verify\x20partial\x20signature\x20does\x20NOT\x20advance\x20(threshold=2)','Guards\x20correctly\x20distinguish\x20customer\x20vs\x20merchant\x20identity']},{'id':'tpl_machine_weighted_voting','scene_id':'weighted_voting','name':'Weighted\x20Voting\x20Flow','description':'Multi-party\x20voting\x20with\x20unequal\x20weights.\x20threshold=100,\x20chief\x20weight=60,\x20members\x20weight=40\x20total.\x20'+'Each\x20member\x27s\x20weight\x20extracted\x20via\x20Guard\x20query\x20from\x20Arbitration\x20object.','recommended_patterns':['P-M-VOTE'],'recommended_topology':['P-M-LINEAR'],'parameters':[{'name':'arbitration_ref','type':'arbitration_ref','required':!![],'description':'Arbitration\x20object\x20storing\x20voter\x20weights'},{'name':'threshold_total','type':'number','required':!![],'default':'100','description':'Total\x20weight\x20threshold\x20for\x20decision'},{'name':'chief_weight','type':'number','required':!![],'default':'60','description':'Weight\x20assigned\x20to\x20the\x20chief\x20voter\x20(out\x20of\x20100)'},{'name':'member_count','type':'number','required':!![],'default':'5','description':'Number\x20of\x20voting\x20members\x20(excluding\x20chief)'}],'example_nodes':[{'name':'VoteOpened'},{'name':'Voting'},{'name':'Approved'},{'name':'Rejected'}],'example_pairs':[{'prev_node':'','next_node':'VoteOpened','threshold':0x1,'forwards':[{'name':'OpenVote','weight':0x1,'permission_index':0x3}]},{'prev_node':'VoteOpened','next_node':'Voting','threshold':0x1,'forwards':[{'name':'StartVoting','weight':0x1,'permission_index':0x3}]},{'prev_node':'Voting','next_node':'Approved','threshold':'${threshold_total}','forwards':[{'name':'ChiefVote','weight':'${chief_weight}','permission_index':0x2,'guard':'arb_voting_guard','retained_submission':'chief_vote_record'},{'name':'MemberVote','weight':0x8,'named_operator':'member','guard':'arb_voting_guard','retained_submission':'member_vote_record'}]},{'prev_node':'Voting','next_node':'Rejected','threshold':0x1,'forwards':[{'name':'TimeoutReject','weight':0x1,'permission_index':0x3,'guard':'voting_timeout_guard'}]}],'required_guards':[{'guard_template_id':'tpl_voting_guard_numeric_weight','bound_to_forward':'ChiefVote','purpose':'Verify\x20voting\x20eligibility\x20+\x20extract\x20weight\x20from\x20Arbitration'},{'guard_template_id':'tpl_voting_guard_numeric_weight','bound_to_forward':'MemberVote','purpose':'Verify\x20voting\x20eligibility\x20+\x20prevent\x20double-vote'}],'required_permissions':[{'index':0x2,'name':'chief','description':'Chief\x20voter\x20(high\x20weight)'},{'index':0x3,'name':'admin','description':'Vote\x20opener\x20/\x20timeout\x20trigger'}],'required_allocators':[{'name':'ApprovedAllocation','trigger_node':'Approved','description':'Allocation\x20on\x20approval'}],'forkable_fields':['weights','voter_count','timeout_days'],'applicable_industries':['governance','arbitration','dao'],'relevant_risks':['R-M1-08','R-M2-05','R-M3-04','R-M5-04','R-X1-14'],'creation_notes':['Member\x20weight\x20must\x20be\x20extracted\x20dynamically\x20via\x20Guard\x20query\x20(not\x20hardcoded\x20in\x20Forward)','Guard\x20MUST\x20check\x20arb.voted\x20has\x20[Signer]\x20to\x20prevent\x20double-voting\x20(R-X1-14\x20CRITICAL)','Competing\x20Pair:\x20Approved\x20vs\x20Rejected\x20(timeout)\x20—\x20first-wins','Voting\x20weight\x20is\x20query-derived;\x20Forward\x20weight\x20field\x20is\x20just\x20session\x20counter'],'example_use_case':'Arbitration\x20panel:\x201\x20chief\x20(weight\x2060)\x20+\x205\x20members\x20(weight\x208\x20each\x20=\x2040).\x20'+'Need\x20total\x20>=\x20100\x20to\x20approve.\x20Reject\x20after\x2072h\x20timeout.','publish_checklist':['Arbitration\x20object\x20created\x20and\x20tested','Double-vote\x20prevention\x20verified\x20(try\x20voting\x20twice\x20—\x20should\x20fail)','Weight\x20extraction\x20tested\x20with\x20different\x20voter\x20configurations','Timeout\x20Guard\x20(Clock)\x20verified\x20on\x20testnet']},{'id':'tpl_machine_cross_machine','scene_id':'cross_machine_supply_chain','name':'Cross-Machine\x20Supply\x20Chain','description':'Decomposed\x20supply\x20chain\x20across\x20multiple\x20Machines.\x20Machine\x20B\x27s\x20Forward\x20Guard\x20queries\x20Machine\x20A\x27s\x20Progress\x20'+'via\x20convert_witness=100\x20to\x20verify\x20upstream\x20completion\x20before\x20advancing.','recommended_patterns':['P-M-CROSS-MACHINE'],'recommended_topology':['P-M-LINEAR'],'parameters':[{'name':'machine_a_id','type':'machine_ref','required':!![],'description':'Upstream\x20Machine\x20(must\x20already\x20be\x20published)','constraint':'Machine\x20A\x20must\x20be\x20published\x20BEFORE\x20Machine\x20B\x27s\x20Guard\x20can\x20reference\x20its\x20Progress\x20'+'(Progress\x20creation\x20verifies\x20the\x20bound\x20Machine\x20is\x20published\x20—\x20see\x2006\x20§14.6)'},{'name':'machine_a_complete_node','type':'string','required':!![],'default':'Complete','description':'Target\x20node\x20name\x20in\x20Machine\x20A\x20to\x20verify'},{'name':'machine_b_permission','type':'permission_ref','required':!![],'description':'Machine\x20B\x27s\x20Permission\x20object'}],'example_nodes':[{'name':'UpstreamVerified'},{'name':'Production'},{'name':'Complete'}],'example_pairs':[{'prev_node':'','next_node':'UpstreamVerified','threshold':0x1,'forwards':[{'name':'VerifyUpstream','weight':0x1,'permission_index':0x2,'guard':'upstream_progress_guard','retained_submission':'upstream_progress_id'}]},{'prev_node':'UpstreamVerified','next_node':'Production','threshold':0x1,'forwards':[{'name':'StartProduction','weight':0x1,'permission_index':0x2}]},{'prev_node':'Production','next_node':'Complete','threshold':0x1,'forwards':[{'name':'Finish','weight':0x1,'permission_index':0x2}]}],'required_guards':[{'guard_template_id':'tpl_forward_node_check','bound_to_forward':'VerifyUpstream','purpose':'Query\x20Machine\x20A\x27s\x20Progress:\x20verify\x20it\x20reached\x20${machine_a_complete_node}'}],'required_permissions':[{'index':0x2,'name':'manufacturer','description':'Machine\x20B\x20operator'}],'required_allocators':[{'name':'CompleteAllocation','trigger_node':'Complete','description':'Allocation\x20to\x20Machine\x20B\x27s\x20merchant'}],'forkable_fields':['upstream_machine_ref','verification_node_name'],'applicable_industries':['manufacturing','logistics','retail','supply_chain'],'relevant_risks':['R-M1-01','R-M1-08','R-M2-01','R-M2-04','R-M3-04','R-M5-04','R-M5-05','R-M5-06'],'creation_notes':['Machine\x20A\x20MUST\x20be\x20published\x20before\x20Machine\x20B\x20(dependency\x20order)','Guard\x20uses\x20convert_witness=100\x20to\x20convert\x20submitted\x20Order/Progress\x20ID\x20into\x20queryable\x20Progress\x20object','Cross-Machine\x20dependency\x20is\x20one-way\x20(no\x20cycles)','retained_submission\x20stores\x20upstream\x20Progress\x20ID\x20for\x20later\x20audit','Multi-party\x20chain:\x20extend\x20pattern\x20with\x20Machine\x20C,\x20D,\x20...\x20(each\x20independently\x20published)','Dependency\x20verification:\x20enforced\x20when\x20the\x20Progress\x20object\x20is\x20created\x20(creation\x20checks\x20the\x20bound\x20Machine\x20is\x20published\x20—\x20see\x2006\x20§14.6)'],'example_use_case':'Supplier\x20(Machine\x20A)\x20->\x20Manufacturer\x20(Machine\x20B)\x20->\x20Retailer\x20(Machine\x20C).\x20'+'Manufacturer\x20cannot\x20start\x20production\x20until\x20supplier\x27s\x20Progress\x20reaches\x20\x27Complete\x27.','publish_checklist':['Machine\x20A\x20already\x20published\x20on-chain\x20(verify\x20via\x20onchain_objects)','Cross-Machine\x20Guard\x20tested\x20with\x20valid/invalid\x20upstream\x20Progress\x20IDs','retained_submission\x20verified\x20(query\x20progress_history\x20for\x20upstream_progress_id)','Independent\x20testing:\x20run\x20Machine\x20A\x20to\x20Complete,\x20then\x20attempt\x20Machine\x20B\x27s\x20VerifyUpstream']},{'id':'tpl_machine_privacy_delivery','scene_id':'privacy_delivery','name':'Privacy-Preserving\x20Delivery\x20Flow','description':'Customer\x20submits\x20privacy\x20data\x20via\x20Messenger\x20(encrypted,\x20off-chain).\x20Chain\x20stores\x20only\x20Merkle\x20Root\x20Proof.\x20'+'Guard\x20verifies\x20Proof\x20signature\x20+\x20timestamp\x20+\x20service\x20binding.\x20Uses\x20tpl_forward_privacy_delivery_proof\x20(strict\x20mode).','recommended_patterns':['P-M-SEQ'],'recommended_topology':['P-M-LINEAR'],'parameters':[{'name':'merchant_permission','type':'permission_ref','required':!![],'description':'Merchant\x20Permission\x20object'},{'name':'proof_node_name','type':'string','required':!![],'default':'ProofSubmitted','description':'Name\x20of\x20the\x20node\x20where\x20delivery\x20proof\x20is\x20submitted'},{'name':'delivery_node_name','type':'string','required':!![],'default':'DeliveryConfirmed','description':'Name\x20of\x20the\x20node\x20where\x20delivery\x20confirmation\x20occurs'}],'example_nodes':[{'name':'Paid','description':'Entry:\x20order\x20created\x20and\x20paid\x20via\x20Service.buy();\x20Machine\x20starts\x20here'},{'name':'${proof_node_name}','description':'Customer\x20submits\x20Proof\x20via\x20Messenger'},{'name':'${delivery_node_name}'},{'name':'Complete'}],'example_pairs':[{'prev_node':'','next_node':'Paid','threshold':0x1,'forwards':[{'name':'Enter','weight':0x1,'named_operator':''}]},{'prev_node':'Paid','next_node':'${proof_node_name}','threshold':0x1,'forwards':[{'name':'SubmitProof','weight':0x1,'named_operator':'','guard':'tpl_forward_privacy_delivery_proof','retained_submission':'proof_address'}]},{'prev_node':'${proof_node_name}','next_node':'${delivery_node_name}','threshold':0x1,'forwards':[{'name':'ConfirmDelivery','weight':0x1,'permission_index':0x2}]},{'prev_node':'${delivery_node_name}','next_node':'Complete','threshold':0x1,'forwards':[{'name':'Finish','weight':0x1,'permission_index':0x2}]}],'required_guards':[{'guard_template_id':'tpl_forward_privacy_delivery_proof','bound_to_forward':'SubmitProof','purpose':'Verify\x20Proof:\x20signer=proof.signer\x20∧\x20proof.time>order.time\x20∧\x20order.service=service'}],'required_permissions':[{'index':0x2,'name':'merchant','description':'Merchant\x20confirms\x20delivery'}],'required_allocators':[{'name':'CompleteAllocation','trigger_node':'Complete','description':'Allocation\x20to\x20merchant\x20after\x20delivery\x20confirmation'}],'forkable_fields':['proof_node_name','delivery_node_name','additional_evidence_steps'],'applicable_industries':['ecommerce','logistics','privacy_service'],'relevant_risks':['R-M1-01','R-M1-08','R-M2-01','R-M2-04','R-M3-02','R-M5-03'],'creation_notes':['Use\x20strict\x20mode\x20tpl_forward_privacy_delivery_proof\x20(3\x20conditions:\x20Signer\x20+\x20time\x20+\x20service\x20binding)','submitChainProof\x20about_address\x20=\x20peerAddress\x20(NOT\x20sessionId)\x20—\x20about\x20records\x20ONLY\x20the\x20contact;\x20it\x20has\x20no\x20on-chain\x20meaning\x20and\x20must\x20NEVER\x20be\x20a\x20guard\x20decision\x20condition','PRIVACY:\x20never\x20pass\x20order_id\x20or\x20any\x20order\x20reference\x20via\x20the\x20description\x20field\x20(that\x20would\x20publicly\x20link\x20Proof\x20to\x20Order\x20on\x20chain)\x20—\x20all\x20order/business\x20linkage\x20stays\x20inside\x20the\x20Messenger\x20conversation;\x20acceptance\x20of\x20delivered\x20info\x20is\x20the\x20merchant\x27s\x20confirming\x20forward,\x20not\x20the\x20proof\x27s\x20recorded\x20address','Guard\x20table\x20item\x20name\x20MUST\x20be\x20<64\x20BCS\x20bytes\x20(MAX_NAME_LENGTH=64)','retained_submission\x20stores\x20Proof\x20address\x20for\x20arbitration\x20query','Proof\x20MUST\x20be\x20generated\x20by\x20messenger.submitChainProof\x20(not\x20manual)'],'example_use_case':'Customer\x20sends\x20delivery\x20address\x20via\x20Messenger\x20(encrypted).\x20Chain\x20stores\x20only\x20Proof.\x20'+'Merchant\x20verifies\x20Proof,\x20then\x20confirms\x20delivery.','publish_checklist':['Strict\x20mode\x20Guard\x20tested:\x203\x20conditions\x20verified\x20individually','Messenger\x20integration\x20tested\x20end-to-end\x20(submit\x20+\x20verify)','retained_submission\x20stored\x20Proof\x20address\x20queryable\x20from\x20progress_history','Guard\x20table\x20item\x20name\x20length\x20validated\x20(<64\x20BCS\x20bytes)']},{'id':'tpl_machine_reward','scene_id':'reward_incentive','name':'Reward\x20Incentive\x20Flow','description':'Customer\x20triggers\x20Reward\x20claim\x20at\x20specific\x20node.\x20Guard\x20prevents\x20double-claim\x20via\x20query_reward_record_count==0.\x20'+'Reward\x20object\x20independent\x20of\x20Allocator.','recommended_patterns':['P-M-SEQ'],'recommended_topology':['P-M-LINEAR'],'parameters':[{'name':'reward_ref','type':'reward_ref','required':!![],'description':'Reward\x20object\x20address\x20(must\x20be\x20already\x20created)'},{'name':'claim_node_name','type':'string','required':!![],'default':'ClaimReward','description':'Name\x20of\x20the\x20node\x20where\x20reward\x20claims\x20are\x20triggered'}],'example_nodes':[{'name':'Eligible'},{'name':'${claim_node_name}'},{'name':'Rewarded'},{'name':'Complete'}],'example_pairs':[{'prev_node':'','next_node':'Eligible','threshold':0x1,'forwards':[{'name':'Enter','weight':0x1,'named_operator':''}]},{'prev_node':'Eligible','next_node':'${claim_node_name}','threshold':0x1,'forwards':[{'name':'TriggerClaim','weight':0x1,'named_operator':'','guard':'reward_anti_double_guard','retained_submission':'claim_record'}]},{'prev_node':'${claim_node_name}','next_node':'Rewarded','threshold':0x1,'forwards':[{'name':'IssueReward','weight':0x1,'permission_index':0x3}]},{'prev_node':'Rewarded','next_node':'Complete','threshold':0x1,'forwards':[{'name':'Finish','weight':0x1,'permission_index':0x2}]}],'required_guards':[{'guard_template_id':'tpl_reward_one_time_claim','bound_to_forward':'TriggerClaim','purpose':'Verify\x20query_reward_record_count==0\x20to\x20prevent\x20double-claim'}],'required_permissions':[{'index':0x2,'name':'merchant','description':'Completes\x20flow'},{'index':0x3,'name':'reward_admin','description':'Issues\x20reward\x20tokens'}],'required_allocators':[{'name':'CompleteAllocation','trigger_node':'Complete','description':'Standard\x20allocation\x20(separate\x20from\x20Reward)'}],'forkable_fields':['claim_node_name','additional_reward_conditions'],'applicable_industries':['ecommerce','subscription','education','loyalty'],'relevant_risks':['R-M1-08','R-M2-05','R-M3-04','R-X1-14'],'creation_notes':['Reward\x20Guard\x20MUST\x20check\x20query_reward_record_count\x20==\x200\x20(R-X1-14\x20CRITICAL)','Reward\x20is\x20INDEPENDENT\x20of\x20Allocator\x20—\x20both\x20can\x20fire\x20on\x20different\x20nodes','Reward\x20object\x20must\x20be\x20created\x20BEFORE\x20publishing\x20this\x20Machine','retained_submission\x20stores\x20claim\x20record\x20for\x20audit'],'example_use_case':'Loyalty\x20program:\x20after\x20customer\x20completes\x205\x20orders,\x20eligible\x20to\x20claim\x20reward\x20token.\x20'+'Anti-double-claim\x20Guard\x20ensures\x20one\x20claim\x20per\x20customer.','publish_checklist':['Reward\x20object\x20already\x20created\x20and\x20tested','Anti-double-claim\x20Guard\x20tested:\x20claim\x20twice\x20should\x20fail\x20on\x20second\x20attempt','retained_submission\x20verified\x20(claim_record\x20queryable)']},{'id':'tpl_machine_wonder_feedback','scene_id':'wonder_feedback','name':'Wonder\x20Feedback\x20Flow\x20(Post-Completion\x20Rating)','description':'Post-completion\x20rating\x20flow:\x20Paid\x20(entry)\x20→\x20Shipped\x20→\x20Received\x20→\x20Completed\x20→\x20{Wonder\x20|\x20NoWonder}.\x20'+'After\x20the\x20order\x20reaches\x20\x27Completed\x27\x20(terminal\x20business\x20state,\x20funds\x20already\x20allocated\x20to\x20merchant),\x20'+'the\x20OrderHolder\x20(namedOperator=\x27\x27)\x20can\x20advance\x20Progress\x20to\x20\x27wonder\x27\x20(positive\x20review)\x20or\x20\x27no_wonder\x27\x20'+'(negative\x20review).\x20A\x20bound\x20Reward\x20object\x27s\x20claim_guard\x20verifies\x20Progress.current\x20==\x20\x27wonder\x27\x20before\x20'+'paying\x20out\x20—\x20reward\x20claim\x20needs\x20NO\x20Permission.\x20Dispute\x20is\x20NEVER\x20modeled\x20here:\x20it\x20flows\x20through\x20'+'the\x20Order\x27s\x20dispute\x20flow\x20→\x20Arb\x20case\x20→\x20arbiter\x20ruling\x20→\x20fee\x20withdrawal,\x20fully\x20off-Machine.','recommended_patterns':['P-M-SEQ','P-M-COMPETING'],'recommended_topology':['P-M-LINEAR','P-M-COMPETING'],'parameters':[{'name':'merchant_permission','type':'permission_ref','required':!![],'description':'Merchant\x20Permission\x20object\x20(index\x202\x20=\x20merchant,\x20index\x203\x20=\x20admin)'},{'name':'wonder_node_name','type':'string','required':!![],'default':'wonder','description':'Node\x20name\x20for\x20positive\x20feedback\x20(praise)\x20terminal','constraint':'Must\x20match\x20/^(wonder|praise|thumbs_up)$/i\x20OR\x20be\x20a\x20custom\x20name;\x20must\x20NOT\x20match\x20dispute\x20anti-pattern\x20regex'},{'name':'no_wonder_node_name','type':'string','required':!![],'default':'no_wonder','description':'Node\x20name\x20for\x20negative\x20feedback\x20(complaint)\x20terminal','constraint':'Must\x20match\x20/^(no_wonder|complain|thumbs_down)$/i\x20OR\x20be\x20a\x20custom\x20name;\x20must\x20NOT\x20match\x20dispute\x20anti-pattern\x20regex'},{'name':'reward_ref','type':'reward_ref','required':![],'description':'Reward\x20object\x20address\x20(optional).\x20If\x20bound,\x20its\x20claim_guard\x20should\x20verify\x20Progress.current\x20==\x20wonder_node_name\x20AND\x20order.owner\x20==\x20signer.\x20Use\x20wonder_praise\x20or\x20wonder_feedback\x20reward\x20template.'},{'name':'rating_time_limit_days','type':'number','required':![],'default':'30','description':'Days\x20after\x20completion\x20during\x20which\x20the\x20customer\x20can\x20rate\x20(enforced\x20by\x20Guard\x20on\x20Praise/Complain\x20forwards\x20via\x20context(Clock))','constraint':'Must\x20be\x20>\x200;\x20reasonable\x20range\x207-90'}],'example_nodes':[{'name':'Paid','description':'Entry:\x20order\x20created\x20and\x20paid\x20via\x20Service.buy();\x20Machine\x20starts\x20here'},{'name':'Shipped','description':'Merchant\x20dispatched\x20goods/service'},{'name':'Received','description':'Customer\x20confirmed\x20receipt'},{'name':'Completed','description':'Terminal\x20business\x20state\x20—\x20triggers\x20merchant\x20Allocation.\x20Funds\x20settled.'},{'name':'${wonder_node_name}','description':'Positive\x20feedback\x20terminal\x20(praise).\x20OrderHolder-only.\x20Reward-eligible.'},{'name':'${no_wonder_node_name}','description':'Negative\x20feedback\x20terminal\x20(complaint).\x20OrderHolder-only.\x20Optional\x20Repository\x20write\x20for\x20analytics.'}],'example_pairs':[{'prev_node':'','next_node':'Paid','threshold':0x1,'forwards':[{'name':'Enter','weight':0x1,'named_operator':''}]},{'prev_node':'Paid','next_node':'Shipped','threshold':0x1,'forwards':[{'name':'Ship','weight':0x1,'permission_index':0x2,'named_operator':''}]},{'prev_node':'Shipped','next_node':'Received','threshold':0x1,'forwards':[{'name':'ConfirmReceive','weight':0x1,'named_operator':''}]},{'prev_node':'Received','next_node':'Completed','threshold':0x1,'forwards':[{'name':'Finish','weight':0x1,'permission_index':0x2,'named_operator':''}]},{'prev_node':'Completed','next_node':'${wonder_node_name}','threshold':0x1,'forwards':[{'name':'Praise','weight':0x1,'named_operator':'','guard':'rating_window_guard','retained_submission':'rating_record'}]},{'prev_node':'Completed','next_node':'${no_wonder_node_name}','threshold':0x1,'forwards':[{'name':'Complain','weight':0x1,'named_operator':'','guard':'rating_window_guard','retained_submission':'rating_record'}]}],'required_guards':[{'guard_template_id':'tpl_forward_node_check','bound_to_forward':'Praise','purpose':'Verify\x20Progress.current\x20==\x20\x27Completed\x27\x20(rating\x20only\x20allowed\x20after\x20completion)\x20AND\x20context(Clock)\x20<=\x20progress.current_time\x20+\x20rating_time_limit_days'},{'guard_template_id':'tpl_forward_node_check','bound_to_forward':'Complain','purpose':'Verify\x20Progress.current\x20==\x20\x27Completed\x27\x20(rating\x20only\x20allowed\x20after\x20completion)\x20AND\x20context(Clock)\x20<=\x20progress.current_time\x20+\x20rating_time_limit_days'}],'required_permissions':[{'index':0x2,'name':'merchant','description':'Merchant\x20role\x20for\x20Ship\x20+\x20Finish\x20(NOT\x20for\x20rating\x20—\x20rating\x20is\x20OrderHolder-only\x20via\x20named_operator=\x27\x27)'},{'index':0x3,'name':'admin','description':'Admin\x20override\x20(optional)'}],'required_allocators':[{'name':'MerchantAllocation','trigger_node':'Completed','description':'100%\x20to\x20merchant\x20Treasury\x20or\x20personal\x20address.\x20Fires\x20at\x20Completion\x20—\x20NOT\x20at\x20Wonder/NoWonder\x20(those\x20are\x20reputation-only\x20terminals\x20with\x20no\x20fund\x20flow).'}],'forkable_fields':['wonder_node_name','no_wonder_node_name','rating_time_limit_days','additional_rating_nodes'],'applicable_industries':['ecommerce','service','rental','subscription','education'],'relevant_risks':['R-M1-01','R-M1-02','R-M1-08','R-M1-11','R-M2-01','R-M2-05','R-M3-02','R-M3-04','R-M4-01','R-M5-03'],'creation_notes':['DISPUTE\x20INDEPENDENCE:\x20This\x20Machine\x20MUST\x20NOT\x20contain\x20\x27disputed\x27,\x20\x27refunded\x27,\x20\x27arb\x27,\x20\x27arbitration\x27\x20nodes\x20(R-M1-11\x20critical).\x20Disputes\x20are\x20filed\x20off-Machine\x20—\x20through\x20the\x20Arbitration\x20dispute\x20flow\x20on\x20the\x20order\x20and\x20arbitration\x20objects.','Build\x20order:\x20Permission\x20→\x20Machine\x20(unpublished)\x20→\x20Guards\x20→\x20Bind\x20guards\x20→\x20Publish\x20→\x20Bind\x20to\x20Service\x20→\x20Bind\x20Reward\x20(optional)','First\x20node\x20\x27Paid\x27\x20represents\x20post-payment\x20state\x20—\x20Service.buy()\x20completes\x20payment\x20atomically\x20before\x20Progress\x20is\x20created','No\x20separate\x20\x27Order\x27\x20or\x20\x27Pay\x27\x20nodes\x20needed\x20—\x20payment\x20is\x20handled\x20by\x20Service.buy(),\x20not\x20Machine','Wonder/NoWonder\x20forwards\x20have\x20named_operator=\x27\x27\x20(empty)\x20—\x20this\x20delegates\x20to\x20the\x20OrderHolder\x20(customer).\x20No\x20Permission\x20index\x20needed\x20for\x20rating.','Completed\x20node\x20triggers\x20MerchantAllocation\x20—\x20funds\x20are\x20settled\x20BEFORE\x20the\x20rating\x20window\x20opens.\x20Rating\x20does\x20NOT\x20affect\x20fund\x20flow.','Competing\x20Pair:\x20Praise\x20vs\x20Complain\x20(first-wins)\x20—\x20one\x20rating\x20per\x20order,\x20enforced\x20by\x20Guard\x20+\x20retained_submission\x20audit\x20trail.','Reward\x20object\x20(if\x20bound)\x20is\x20INDEPENDENT\x20of\x20Allocator:\x20Reward.claim()\x20requires\x20Guard+passport,\x20not\x20Permission.\x20Guard\x20checks\x20Progress.current\x20==\x20\x27wonder\x27\x20AND\x20order.owner\x20==\x20signer.','rating_window_guard\x20enforces\x20time\x20limit:\x20context(Clock)\x20<=\x20progress.current_time\x20+\x20rating_time_limit_days.\x20After\x20window\x20closes,\x20no\x20rating\x20possible\x20(Completed\x20becomes\x20true\x20terminal).','Optional:\x20bind\x20a\x20Repository\x20to\x20record\x20feedback\x20node\x20for\x20analytics.\x20Repository\x20write\x20happens\x20via\x20Guard\x27s\x20data\x20extraction\x20(NOT\x20auto-passed\x20—\x20see\x2006\x20§14.4).'],'example_use_case':'Photography\x20service:\x20Paid\x20→\x20Shipped\x20(booking\x20confirmed)\x20→\x20Received\x20(session\x20delivered)\x20→\x20Completed\x20'+'(photos\x20delivered,\x20funds\x20released\x20to\x20photographer)\x20→\x20customer\x20advances\x20to\x20\x27wonder\x27\x20(loved\x20the\x20work)\x20'+'or\x20\x27no_wonder\x27\x20(didn\x27t\x20love\x20it).\x20Bound\x20Reward\x20pays\x201\x20WOW\x20to\x20customers\x20who\x20advance\x20to\x20\x27wonder\x27.\x20'+'Merchant\x27s\x20wonder/no_wonder\x20ratio\x20becomes\x20an\x20on-chain\x20reputation\x20signal.\x20Disputes\x20(if\x20any)\x20are\x20'+'filed\x20separately\x20via\x20Arbitration\x20object\x20—\x20never\x20enter\x20this\x20Machine.','publish_checklist':['All\x206\x20nodes\x20verified:\x20no\x20\x27disputed\x27/\x27refunded\x27/\x27arb\x27/\x27arbitration\x27\x20names\x20(R-M1-11\x20PASS)','Entry\x20Pair\x20exists\x20(prev_node=\x27\x27\x20targets\x20\x27Paid\x27)','Competing\x20Pair\x20tested:\x20Praise\x20vs\x20Complain\x20—\x20first-wins\x20semantics\x20verified\x20on\x20testnet','rating_window_guard\x20tested:\x20rating\x20blocked\x20after\x20time\x20limit\x20expires','MerchantAllocation\x20fires\x20ONLY\x20at\x20Completed\x20(NOT\x20at\x20Wonder/NoWonder)','Reward\x20object\x20(if\x20bound):\x20claim_guard\x20tested\x20—\x20Progress.current\x20==\x20\x27wonder\x27\x20required,\x20claim\x20fails\x20at\x20\x27no_wonder\x27\x20or\x20\x27Completed\x27','named_operator=\x27\x27\x20on\x20Praise/Complain\x20forwards\x20verified\x20(OrderHolder-only\x20operation)','machineNode2file\x20export\x20as\x20backup']},{'id':'tpl_machine_subscription','scene_id':'subscription','name':'Subscription\x20/\x20Membership\x20Flow','description':'Subscribe\x20->\x20Pay\x20->\x20Activate\x20->\x20[Renew\x20|\x20Expire]\x20->\x20Cancel/End.\x20Time-lock\x20on\x20Renew.\x20'+'Competing\x20Pair:\x20Renew\x20vs\x20Expire\x20(first-wins).\x20Repository\x20stores\x20subscription\x20status.','recommended_patterns':['P-M-SEQ','P-M-COMPETING'],'recommended_topology':['P-M-LINEAR','P-M-COMPETING'],'parameters':[{'name':'merchant_permission','type':'permission_ref','required':!![],'description':'Provider\x20Permission\x20object'},{'name':'subscription_duration_days','type':'number','required':!![],'default':'30','description':'Days\x20between\x20Renew\x20and\x20Expire\x20eligibility'},{'name':'repository_ref','type':'address','required':!![],'description':'Repository\x20object\x20storing\x20subscription\x20status\x20(note:\x20not\x20consensus_repositories,\x20which\x20is\x20declarative-only\x20—\x20see\x2006\x20§14.4)'}],'example_nodes':[{'name':'Paid','description':'Entry:\x20subscription\x20created\x20and\x20paid\x20via\x20Service.buy();\x20Machine\x20starts\x20here'},{'name':'Active'},{'name':'RenewEligible'},{'name':'Renewed'},{'name':'Expired'},{'name':'Cancelled'},{'name':'Ended'}],'example_pairs':[{'prev_node':'','next_node':'Paid','threshold':0x1,'forwards':[{'name':'Enter','weight':0x1,'named_operator':''}]},{'prev_node':'Paid','next_node':'Active','threshold':0x1,'forwards':[{'name':'Activate','weight':0x1,'permission_index':0x2,'guard':'repository_write_guard'}]},{'prev_node':'Active','next_node':'RenewEligible','threshold':0x1,'forwards':[{'name':'TimeUnlock','weight':0x1,'permission_index':0x3,'guard':'time_lock_guard_${subscription_duration_days}_days'}]},{'prev_node':'RenewEligible','next_node':'Renewed','threshold':0x1,'forwards':[{'name':'Renew','weight':0x1,'named_operator':''}]},{'prev_node':'RenewEligible','next_node':'Expired','threshold':0x1,'forwards':[{'name':'AutoExpire','weight':0x1,'permission_index':0x3,'guard':'expire_time_guard'}]},{'prev_node':'RenewEligible','next_node':'Cancelled','threshold':0x1,'forwards':[{'name':'Cancel','weight':0x1,'named_operator':''}]},{'prev_node':'Renewed','next_node':'Active','threshold':0x1,'forwards':[{'name':'Reactivate','weight':0x1,'permission_index':0x2}]},{'prev_node':'Expired','next_node':'Ended','threshold':0x1,'forwards':[{'name':'CloseExpired','weight':0x1,'permission_index':0x3}]},{'prev_node':'Cancelled','next_node':'Ended','threshold':0x1,'forwards':[{'name':'CloseCancelled','weight':0x1,'permission_index':0x2}]}],'required_guards':[{'guard_template_id':'tpl_forward_node_check','bound_to_forward':'TimeUnlock','purpose':'Time\x20lock:\x20context(Clock)\x20>=\x20progress.current_time\x20+\x20${subscription_duration_days}\x20days'},{'guard_template_id':'tpl_write_guard_type_check','bound_to_forward':'Activate','purpose':'Write\x20subscription\x20status\x20to\x20Repository'},{'guard_template_id':'tpl_forward_node_check','bound_to_forward':'AutoExpire','purpose':'Hard\x20expire:\x20context(Clock)\x20>=\x20progress.current_time\x20+\x202x\x20duration'}],'required_permissions':[{'index':0x2,'name':'provider','description':'Provider\x20activates/reactivates'},{'index':0x3,'name':'admin','description':'Time-lock\x20triggers'}],'required_allocators':[{'name':'RenewAllocation','trigger_node':'Renewed','description':'Charge\x20renewal\x20fee\x20on\x20Renew'}],'forkable_fields':['duration_days','grace_period','additional_tiers'],'applicable_industries':['subscription','saas','membership','service'],'relevant_risks':['R-M1-01','R-M1-08','R-M2-01','R-M2-05','R-M3-02','R-M3-04','R-M4-01','R-M5-04'],'creation_notes':['First\x20node\x20\x27Paid\x27\x20represents\x20post-payment\x20state\x20—\x20Service.buy()\x20completes\x20subscription\x20payment\x20atomically\x20before\x20Progress\x20is\x20created','No\x20separate\x20\x27Subscribe\x27\x20or\x20\x27Pay\x27\x20nodes\x20needed\x20—\x20subscription\x20and\x20payment\x20are\x20handled\x20by\x20Service.buy(),\x20not\x20Machine','Time-lock\x20uses\x20context(Clock)\x20—\x20verify\x20Clock\x20address\x20in\x20Guard\x20table','Competing\x20Pair:\x20Renew\x20vs\x20Expire\x20vs\x20Cancel\x20—\x20first-wins','Renewed\x20node\x20loops\x20back\x20to\x20Active\x20(recurring\x20subscription)','Repository\x20records\x20subscription\x20status\x20for\x20cross-Machine\x20verification','Renewal\x20Allocation\x20triggers\x20on\x20Renewed\x20node\x20(not\x20Active\x20—\x20avoids\x20double-charge)','Note:\x20consensus_repositories\x20is\x20declarative-only\x20(NOT\x20auto-passed\x20to\x20Progress);\x20use\x20repository_ref\x20parameter\x20for\x20actual\x20Repository\x20object\x20—\x20see\x2006\x20§14.4','VARIANT\x20—\x20Content\x20subscription\x20(Substack-style):\x20replace\x20time-lock\x20Renew/Expire\x20with\x20content-delivery\x20flow:','\x20\x206-node\x20variant:\x20Paid\x20(entry)\x20→\x20ContentPublished\x20→\x20Completed\x20(terminal-success)','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Paid\x20→\x20Cancelled\x20(terminal-cancel)\x20|\x20Paid\x20→\x20Disputed\x20→\x20Refunded\x20(terminal-dispute)','\x20\x20Permission:\x20author=index\x201000\x20(publish\x20+\x20cancel),\x20arbitrator=index\x201500\x20(resolve\x20dispute),\x20reader=namedOperator=\x27\x27\x20(open\x20role,\x20no\x20specific\x20operator)','\x20\x20Guards:\x20deliver_guard\x20(verify\x20author\x20permission\x20+\x20content\x20hash),\x20cancel_guard\x20(verify\x20subscriber\x20request),\x20refund_guard\x20(verify\x20arbitration\x20outcome)','\x20\x20Allocators:\x20deliver=100%\x20to\x20author,\x20cancel=100%\x20refund\x20to\x20subscriber,\x20dispute=100%\x20refund\x20to\x20subscriber\x20(Guard-first-wins\x20pattern)','\x20\x20First-Forward-wins:\x20when\x20Paid\x20has\x20competing\x20forwards\x20(Deliver|Cancel|Dispute),\x20the\x20first\x20triggered\x20forward\x20wins;\x20subscribers\x20cannot\x20double-claim','CRITICAL\x20—\x20v1→v2\x20lesson:\x20arbitrations\x20MUST\x20be\x20added\x20BEFORE\x20Service.publish\x20(post-publish,\x20arbitrations\x20become\x20immutable\x20and\x20cannot\x20be\x20added\x20—\x20F-S-21)','\x20\x20If\x20you\x20accidentally\x20published\x20without\x20arbitrations,\x20you\x20MUST\x20create\x20a\x20new\x20Service\x20v2\x20with\x20arbitrations\x20bound\x20before\x20publishing\x20(the\x20v1\x20Service\x20must\x20be\x20paused/abandoned)','\x20\x20ConfirmGate\x20(C-S-19,\x20QS11)\x20will\x20warn\x20before\x20publish\x20without\x20arbitrations\x20—\x20do\x20not\x20bypass\x20this\x20warning\x20unless\x20explicitly\x20intending\x20no-arbitration\x20operation','Build\x20order\x20(content\x20variant):\x20Permission\x20→\x20Machine\x20(unpublished,\x20with\x20initial\x20forward)\x20→\x203\x20Guards\x20→\x203\x20Allocators\x20(template\x20on\x20Service)\x20→\x20Service\x20(unpublished,\x20bind\x20machine+buy_guard+order_allocators+arbitrations)\x20→\x20Publish\x20Service\x20→\x20Test\x20order\x20(3\x20paths:\x20normal/cancel/dispute)'],'example_use_case':'Monthly\x20SaaS\x20subscription:\x20$10/month.\x20Customer\x20can\x20renew\x20anytime\x20after\x20day\x2025.\x20'+'Auto-expire\x20on\x20day\x2035\x20if\x20not\x20renewed.\x20Cancel\x20anytime.\x0a\x0a'+'VARIANT\x20—\x20Content\x20subscription\x20(Substack-style):\x20$5/month\x20newsletter.\x20Author\x20publishes\x20content\x20→\x20'+'subscriber\x20reads.\x20Subscriber\x20can\x20cancel\x20anytime\x20for\x20full\x20refund.\x20Disputes\x20resolved\x20by\x20arbitrator\x20'+'(100%\x20refund\x20to\x20subscriber\x20if\x20dispute\x20upheld).\x206-node\x20Machine,\x203\x20Guards,\x203\x20Allocators.\x20'+'Tested\x20on\x20testnet\x20with\x203\x20order\x20paths:\x20normal\x20delivery,\x20cancel,\x20dispute.','publish_checklist':['Time-lock\x20Guards\x20tested\x20on\x20testnet\x20(both\x20TimeUnlock\x20+\x20AutoExpire)','Competing\x20Pair\x20semantics\x20verified\x20(Renew\x20vs\x20Expire\x20vs\x20Cancel)','Repository\x20write\x20tested\x20(subscription\x20status\x20queryable)','Renewal\x20loop\x20tested:\x20Paid\x20->\x20Active\x20->\x20RenewEligible\x20->\x20Renewed\x20->\x20Active','Content\x20variant:\x20initial\x20node\x20(prev_node=\x27\x27)\x20MUST\x20have\x20at\x20least\x20one\x20forward\x20(FIX-002)\x20—\x20empty\x20forwards=[]\x20causes\x20Progress\x20to\x20be\x20permanently\x20stuck','Content\x20variant:\x20arbitrations\x20added\x20BEFORE\x20publish\x20(cannot\x20add\x20post-publish\x20per\x20F-S-21)','Content\x20variant:\x203\x20order\x20paths\x20tested\x20on\x20testnet\x20—\x20normal\x20delivery,\x20cancel-within-grace,\x20dispute-resolution','Content\x20variant:\x20machineNode2file\x20export\x20as\x20backup\x20(covers\x20all\x206\x20nodes)']}];export const MACHINE_TEMPLATES_VERSION='1.0.0';export const MACHINE_TEMPLATES_COUNT=MACHINE_TEMPLATES['length'];export function getAllTemplates(){return MACHINE_TEMPLATES;}export function getTemplateById(a){return MACHINE_TEMPLATES['find'](b=>b['id']===a);}export function getTemplatesByScene(a){return MACHINE_TEMPLATES['filter'](b=>b['scene_id']===a);}export function getTemplatesByIndustry(a){return MACHINE_TEMPLATES['filter'](b=>b['applicable_industries']['includes'](a));}export function getTemplatesByPattern(a){return MACHINE_TEMPLATES['filter'](b=>b['recommended_patterns']['includes'](a));}export function suggestTemplateForIntent(a){const b=inferSceneFromFlow(a);if(!b)return undefined;const c=getTemplatesByScene(b['id']);return c[0x0];}export function getTemplateParameters(a){const b=getTemplateById(a);return b?b['parameters']:[];}export function getRequiredParameters(a){return getTemplateParameters(a)['filter'](b=>b['required']);}export function getOptionalParameters(a){return getTemplateParameters(a)['filter'](b=>!b['required']);}function validateParamType(a,b){switch(b){case'address':case'string':case'permission_ref':case'guard_ref':case'machine_ref':case'service_ref':case'arbitration_ref':case'reward_ref':return typeof a==='string';case'number':return typeof a==='number'||typeof a==='string'&&/^\d+$/['test'](a);case'boolean':return typeof a==='boolean';case'vec_address':case'vec_string':case'node_name_list':return Array['isArray'](a)&&a['every'](c=>typeof c==='string');default:return![];}}function deepSubstitute(a,b){if(typeof a==='string')return a['replace'](/\$\{(\w+)\}/g,(c,d)=>d in b?String(b[d]):'${'+d+'}');if(Array['isArray'](a))return a['map'](c=>deepSubstitute(c,b));if(a&&typeof a==='object'){const c={};for(const [d,e]of Object['entries'](a)){c[d]=deepSubstitute(e,b);}return c;}return a;}export function fillTemplate(a,b){const c=getTemplateById(a);if(!c)return{'success':![],'validation_errors':['Template\x20not\x20found:\x20'+a]};const d=c['parameters']['filter'](h=>h['required']&&!(h['name']in b))['map'](h=>h['name']);if(d['length']>0x0)return{'success':![],'missing_params':d,'validation_errors':['Missing\x20required\x20parameters:\x20'+d['join'](',\x20')]};const e=[];for(const h of c['parameters']){if(h['name']in b){const i=b[h['name']];!validateParamType(i,h['type'])&&e['push']('Parameter\x20\x22'+h['name']+'\x22\x20type\x20mismatch:\x20expected\x20'+h['type']+',\x20got\x20'+typeof i);}}if(e['length']>0x0)return{'success':![],'validation_errors':e};const f=deepSubstitute(c['example_nodes'],b),g=deepSubstitute(c['example_pairs'],b);return{'success':!![],'filled_nodes':f,'filled_pairs':g};}export function forkTemplate(a){const b=getTemplateById(a);if(!b)return undefined;const c={};for(const d of b['forkable_fields']){c[d]='see\x20example_nodes/example_pairs';}return{'template_id':a,'forkable_fields':b['forkable_fields'],'current_values':c,'instructions':['Modify\x20fields\x20below\x20to\x20customize\x20the\x20workflow','Keep\x20template\x20structure\x20intact\x20unless\x20explicitly\x20noted','Run\x20risk\x20assessment\x20after\x20modification\x20(the\x20machine\x20risk\x20assessment)','User\x20MUST\x20confirm\x20final\x20JSON\x20before\x20publish\x20(ConfirmGate)']};}export const DECISION_TREE={'Q1':{'question':'Does\x20the\x20workflow\x20involve\x20multiple\x20independent\x20services/parties?','no_next':'Q3'},'Q2':{'question':'Are\x20these\x20services\x20already\x20published\x20as\x20separate\x20Machines?','yes_template':'tpl_machine_cross_machine','no_next':'DECOMPOSE'},'Q3':{'question':'Does\x20any\x20node\x20require\x20multiple\x20parties\x27\x20confirmation\x20to\x20advance?','no_next':'Q5'},'Q4':{'question':'Do\x20all\x20parties\x20have\x20EQUAL\x20weight?','yes_template':'tpl_machine_dual_signature','no_next':'tpl_machine_weighted_voting'},'Q5':{'question':'Does\x20the\x20workflow\x20need\x20exception\x20branches\x20(lost,\x20return,\x20dispute)?','yes_template':'tpl_machine_ecommerce_exceptions','no_next':'Q6'},'Q6':{'question':'Does\x20it\x20involve\x20recurring\x20payments\x20or\x20time-based\x20state\x20changes?','yes_template':'tpl_machine_subscription','no_next':'Q7'},'Q7':{'question':'Does\x20it\x20need\x20privacy-preserving\x20data\x20delivery\x20(Messenger)?','yes_template':'tpl_machine_privacy_delivery','no_next':'Q8'},'Q8':{'question':'Does\x20it\x20involve\x20deposit/refund\x20separation?','yes_template':'tpl_machine_rental','no_next':'Q9'},'Q9':{'question':'Does\x20it\x20need\x20reward/incentive\x20distribution\x20at\x20a\x20specific\x20node?','yes_template':'tpl_machine_reward','no_next':'tpl_machine_ecommerce_standard'}};export function walkDecisionTree(a){let b='Q1';while(b){const c=DECISION_TREE[b];if(!c)return'UNKNOWN';const d=a[b];if(d===undefined)return b;if(d){if(c['yes_template'])return c['yes_template'];if(b==='Q1'){b='Q2';continue;}if(b==='Q3'){b='Q4';continue;}return'UNKNOWN';}else{if(c['no_next']){if(c['no_next']==='DECOMPOSE')return'DECOMPOSE_INTO_MULTIPLE_MACHINES';if(c['no_next']['startsWith']('tpl_'))return c['no_next'];b=c['no_next'];continue;}return'UNKNOWN';}}return'UNKNOWN';}export function verifyTemplateSceneReferences(){const a=[];for(const b of MACHINE_TEMPLATES){!findScene(b['scene_id'])&&a['push']({'template_id':b['id'],'invalid_scene_id':b['scene_id']});}return a;}export function getReferencedGuardTemplateIds(){const a=new Set();for(const b of MACHINE_TEMPLATES){for(const c of b['required_guards']){a['add'](c['guard_template_id']);}}return a;}export function getReferencedRiskIds(){const a=new Set();for(const b of MACHINE_TEMPLATES){for(const c of b['relevant_risks']){a['add'](c);}}return a;}export function listTemplates(){return MACHINE_TEMPLATES['map'](a=>({'id':a['id'],'name':a['name'],'scene_id':a['scene_id'],'patterns':a['recommended_patterns'],'industries':a['applicable_industries']}));}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MAX_NODE_COUNT,MAX_NODE_PAIR_COUNT,MAX_FORWARD_COUNT,MAX_FORWARD_ORDER_COUNT}from'./onchain-constants.js';export{MAX_NODE_COUNT,MAX_NODE_PAIR_COUNT,MAX_FORWARD_COUNT,MAX_FORWARD_ORDER_COUNT};export function analyzeTopology(a,b){const c=a['map'](w=>w['name']),d=new Set(c),e=new Map(),f=new Map();for(const w of c){e['set'](w,[]),f['set'](w,[]);}for(const x of b){!e['has'](x['prev_node'])&&x['prev_node']!==''&&e['set'](x['prev_node'],[]),!f['has'](x['next_node'])&&f['set'](x['next_node'],[]),x['prev_node']!==''&&e['get'](x['prev_node'])['push'](x['next_node']),f['get'](x['next_node'])['push'](x['prev_node']);}const g=b['filter'](y=>y['prev_node']==='')['map'](y=>y['next_node'])['filter'](y=>d['has'](y)),h=c['filter'](y=>(e['get'](y)||[])['length']===0x0),i=c['filter'](y=>!g['includes'](y)&&(f['get'](y)||[])['length']===0x0),j=c['filter'](y=>(e['get'](y)||[])['length']===0x0&&!h['includes'](y)),{has_cycles:k,cycle_nodes:l}=detectCycles(c,b),m=new Map();for(const y of c)m['set'](y,[]);for(const z of b){z['prev_node']!==''&&z['forwards']['length']>0x0&&d['has'](z['next_node'])&&m['get'](z['prev_node'])['push'](z['next_node']);}const n=findTrappedNodes(c,m,g),o=l['filter'](A=>A['some'](B=>n['trap_nodes']['includes'](B))),p=analyzeDeadBranches(b),q=findUnachievableThresholds(b),r=computeReachability(c,b),s=b['reduce']((A,B)=>A+B['forwards']['length'],0x0),t=Math['max'](0x0,...b['map'](A=>A['forwards']['length'])),u=Math['max'](0x0,...b['flatMap'](A=>A['forwards']['map'](B=>countRetainedSubmissions(B['retained_submission'])))),v={'max_node_count':a['length']<=MAX_NODE_COUNT,'max_node_pair_count':b['length']<=MAX_NODE_PAIR_COUNT,'max_forward_count':t<=MAX_FORWARD_COUNT,'max_forward_order_count':u<=MAX_FORWARD_ORDER_COUNT,'threshold_achievable':q['length']===0x0};return{'entry_nodes':g,'terminal_nodes':h,'orphaned_nodes':i,'dead_end_nodes':j,'dead_branches':p,'unachievable_thresholds':q,'has_cycles':k,'cycle_nodes':l,'has_traps':n['trap_nodes']['length']>0x0,'trap_nodes':n['trap_nodes'],'trap_cycles':o,'reachability':r,'node_count':a['length'],'pair_count':b['length'],'forward_count':s,'within_limits':v};}export function findUnachievableThresholds(a){const b=[];for(const c of a){const d=c['forwards']['length'],e=c['forwards']['reduce']((g,h)=>g+Number(h['weight']||0x0),0x0);if(e<c['threshold']){const f=c['threshold']>0x1&&d<c['threshold'];b['push']({'prev_node':c['prev_node'],'next_node':c['next_node'],'threshold':c['threshold'],'max_achievable':e,'distinct_forwards':d,'reason':f?'Threshold\x20'+c['threshold']+'\x20needs\x20'+c['threshold']+'\x20distinct\x20forwards\x20(each\x20forward\x20is\x20single-operator-locked\x20and\x20contributes\x20its\x20weight\x20at\x20most\x20once);\x20this\x20Pair\x20has\x20'+d+'\x20forward(s)\x20summing\x20to\x20'+e+'.\x20Add\x20more\x20parallel\x20forwards\x20or\x20lower\x20the\x20threshold.':'Threshold\x20'+c['threshold']+'\x20exceeds\x20max\x20achievable\x20weight\x20'+e+'\x20(sum\x20of\x20distinct\x20forward\x20weights).\x20The\x20transition\x20can\x20never\x20migrate.'});}}return b;}function countRetainedSubmissions(a){if(a===undefined||a===null)return 0x0;if(Array['isArray'](a))return a['length'];if(typeof a==='string')return a['length']>0x0?0x1:0x0;return 0x0;}export function detectCycle(a,b){const c=a['map'](d=>d['name']);return detectCycles(c,b);}function detectCycles(a,b){const c=new Map();for(const k of a)c['set'](k,[]);for(const l of b){l['prev_node']!==''&&c['has'](l['prev_node'])&&c['get'](l['prev_node'])['push'](l['next_node']);}const d=0x0,e=0x1,f=0x2,g=new Map();for(const m of a)g['set'](m,d);const h=[],i=[];function j(n){g['set'](n,e),i['push'](n);for(const o of c['get'](n)||[]){if(g['get'](o)===e){const p=i['indexOf'](o);return h['push'](i['slice'](p)),!![];}if(g['get'](o)===d){if(j(o))return!![];}}return i['pop'](),g['set'](n,f),![];}for(const n of a){g['get'](n)===d&&j(n);}return{'has_cycles':h['length']>0x0,'cycle_nodes':h};}export function findTrappedNodes(a,b,c){const d=new Set(),f=[];for(const l of c){!d['has'](l)&&(d['add'](l),f['push'](l));}while(f['length']>0x0){const m=f['shift']();for(const n of b['get'](m)||[]){!d['has'](n)&&(d['add'](n),f['push'](n));}}const g=a['filter'](o=>(b['get'](o)||[])['length']===0x0),h=new Map();for(const o of a)h['set'](o,[]);for(const [q,r]of b){for(const s of r){if(h['has'](s))h['get'](s)['push'](q);}}const i=new Set(),j=[];for(const w of g){i['add'](w),j['push'](w);}while(j['length']>0x0){const x=j['shift']();for(const y of h['get'](x)||[]){!i['has'](y)&&(i['add'](y),j['push'](y));}}const k=[...d]['filter'](z=>!i['has'](z))['sort']();return{'trap_nodes':k,'entry_reachable':d,'exit_reaching':i};}function analyzeDeadBranches(a){const b=[],c=new Map();for(const d of a){if(!c['has'](d['prev_node']))c['set'](d['prev_node'],[]);c['get'](d['prev_node'])['push'](d);}for(const [e,f]of c){if(f['length']<=0x1)continue;const g=Math['min'](...f['map'](h=>h['threshold']));for(const h of f){h['threshold']>g*0x2&&b['push']({'pair':{'prev_node':h['prev_node'],'next_node':h['next_node']},'reason':'Threshold\x20'+h['threshold']+'\x20is\x20much\x20higher\x20than\x20competing\x20minimum\x20'+g+'.\x20Likely\x20always\x20loses.','competing_with':f['filter'](i=>i!==h)['map'](i=>i['next_node'])});}}return b;}function computeReachability(a,b){const c=new Map();for(const e of a)c['set'](e,[]);for(const f of b){if(f['prev_node']!==''){if(!c['has'](f['prev_node']))c['set'](f['prev_node'],[]);c['get'](f['prev_node'])['push'](f['next_node']);}}const d=new Map();for(const g of a){const h=new Set(),i=[g];while(i['length']>0x0){const j=i['shift']();for(const k of c['get'](j)||[]){!h['has'](k)&&(h['add'](k),i['push'](k));}}d['set'](g,h);}return d;}export function isReachableFromEntry(a,b){for(const c of b['entry_nodes']){if(c===a)return!![];if(b['reachability']['get'](c)?.['has'](a))return!![];}return![];}export function getNodesReachingTerminals(a){const b=new Set();for(const [c,d]of a['reachability']){for(const e of a['terminal_nodes']){if(d['has'](e)){b['add'](c);break;}}}return b;}export function formatTopologySummary(a){const b=['Nodes:\x20'+a['node_count']+'\x20(max\x20100)','Pairs:\x20'+a['pair_count']+'\x20(max\x2040)','Forwards:\x20'+a['forward_count']+'\x20(max\x2020\x20per\x20Pair)','','Entry\x20nodes:\x20'+(a['entry_nodes']['join'](',\x20')||'(none)'),'Terminal\x20nodes:\x20'+(a['terminal_nodes']['join'](',\x20')||'(none)'),'Orphaned\x20nodes:\x20'+(a['orphaned_nodes']['join'](',\x20')||'(none)'),'Dead\x20branches:\x20'+a['dead_branches']['length'],'Unachievable\x20thresholds:\x20'+a['unachievable_thresholds']['length'],a['has_traps']?'TRAP\x20(entry-reachable,\x20no\x20exit\x20path):\x20YES\x20—\x20['+a['trap_nodes']['join'](',\x20')+']\x20❌\x20an\x20order\x20entering\x20these\x20nodes\x20can\x20never\x20reach\x20a\x20terminal':'Trap\x20(entry-reachable,\x20no\x20exit\x20path):\x20NO\x20✓\x20every\x20reachable\x20node\x20can\x20reach\x20a\x20terminal','Cycles:\x20'+(a['has_cycles']?a['cycle_nodes']['length']+'\x20found\x20(informational\x20—\x20allowed\x20on-chain;'+(a['has_traps']?'\x20a\x20trapped\x20loop\x20needs\x20a\x20cycle-breaking\x20exit':'\x20exit\x20reachability\x20verified')+')':'none'),'','Within\x20on-chain\x20limits:\x20'+(a['within_limits']['max_node_count']&&a['within_limits']['max_node_pair_count']&&a['within_limits']['max_forward_count']&&a['within_limits']['max_forward_order_count']&&a['within_limits']['threshold_achievable']?'YES\x20✓':'NO\x20❌')];return b['join']('\x0a');}export function identifyTopologyPattern(a){const b=new Map(),c=new Map();for(const d of a){if(!b['has'](d['prev_node']))b['set'](d['prev_node'],[]);b['get'](d['prev_node'])['push'](d['next_node']);if(!c['has'](d['next_node']))c['set'](d['next_node'],[]);c['get'](d['next_node'])['push'](d['prev_node']);}for(const [e,f]of b){if(f['length']>0x1&&e!=='')return'P-M-COMPETING';}for(const [g,h]of c){if(h['length']>0x1)return'P-M-FORKMERGE';}return'P-M-LINEAR';}const FUND_REVERSING_NODE_RE=/(^|_)(cancel(led)?|refund(ed)?|return(ed|_approved)?|expired)(_|$)/i;export function flattenMachineNodeEdges(a){const b=[];for(const c of Array['isArray'](a)?a:[]){const d=c,e=typeof d?.['name']==='string'?d['name']:'';for(const g of Array['isArray'](d?.['pairs'])?d['pairs']:[]){const h=typeof g?.['prev_node']==='string'?g['prev_node']:'',i=typeof g?.['next_node']==='string'&&g['next_node']?g['next_node']:e,j=typeof g?.['threshold']==='number'?g['threshold']:undefined;for(const k of Array['isArray'](g?.['forwards'])?g['forwards']:[]){const l=k,m=typeof l?.['name']==='string'?l['name']:'';if(!m||!i)continue;const n=l?.['namedOperator']??l?.['named_operator'],o=l?.['permissionIndex']??l?.['permission_index'];b['push']({'prev_node':h,'next_node':i,'forward':m,'weight':typeof l?.['weight']==='number'?l['weight']:undefined,'threshold':j,'guard':typeof l?.['guard']==='string'?l['guard']:null,'operator':typeof n==='string'?n:null,'permission_index':typeof o==='number'?o:null});}}}return b;}function bindingKey(a){return(a['threshold']??0x0)+'|'+(a['weight']??0x0)+'|'+(a['guard']??'')+'|'+(a['operator']??'')+'|'+(a['permission_index']??'');}export function findForwardAmbiguities(a){const b=new Map();for(const d of a){const f=d['prev_node']+'\x00'+d['forward'],h=b['get'](f);if(h)h['push'](d);else b['set'](f,[d]);}const c=[];for(const [,i]of b){const j=[...new Set(i['map'](p=>p['next_node']))];if(j['length']<0x2)continue;const k=j['filter'](p=>FUND_REVERSING_NODE_RE['test'](p)),l=k['length']>0x0&&k['length']<j['length'],m=new Set(i['map'](bindingKey)),n=m['size']>0x1,o=j['filter'](p=>!FUND_REVERSING_NODE_RE['test'](p));c['push']({'prev_node':i[0x0]['prev_node'],'forward':i[0x0]['forward'],'destinations':j['sort'](),'fund_conflict':l,'binding_differs':n,'severity':l?'critical':'warning','reason':l?'Forward\x20\x22'+i[0x0]['forward']+'\x22\x20from\x20\x22'+i[0x0]['prev_node']+'\x22\x20resolves\x20to\x20both\x20refund\x20node(s)\x20['+k['join'](',\x20')+']\x20and\x20continue\x20node(s)\x20['+o['join'](',\x20')+'].\x20The\x20destination\x20is\x20a\x20CALLER\x20argument\x20(progress.move:540),\x20so\x20the\x20wrong\x20pick\x20puts\x20the\x20order\x20in\x20a\x20node\x20whose\x20Allocator\x20never\x20fires\x20—\x20the\x20escrow\x20strands.':'Forward\x20\x22'+i[0x0]['forward']+'\x22\x20from\x20\x22'+i[0x0]['prev_node']+'\x22\x20resolves\x20to\x20'+j['length']+'\x20destinations\x20['+j['join'](',\x20')+'];\x20the\x20caller\x20picks\x20which,\x20so\x20the\x20workflow\x20outcome\x20depends\x20on\x20an\x20argument\x20the\x20Machine\x20does\x20not\x20constrain'+(n?'\x20—\x20and\x20the\x20candidate\x20edges\x20carry\x20DIFFERENT\x20guard/operator/weight\x20bindings':'')+'.'});}return c['sort']((p,q)=>p['severity']===q['severity']?0x0:p['severity']==='critical'?-0x1:0x1);}export function findShadowedForwards(a){const b=new Set(),c=[];for(const d of a){const f=d['prev_node']+'\x00'+d['next_node']+'\x00'+d['forward'];b['has'](f)?c['push']({'prev_node':d['prev_node'],'next_node':d['next_node'],'forward':d['forward']}):b['add'](f);}return c;}export function lintForwardAmbiguity(b,c='machine'){const d=flattenMachineNodeEdges(b),e=findForwardAmbiguities(d),f=findShadowedForwards(d),g=[],h=[];for(const i of e){const j=c+':\x20P0-6\x20forward\x20ambiguity\x20—\x20'+i['reason'];i['severity']==='critical'?g['push'](j+'\x20Fix:\x20give\x20each\x20destination\x20its\x20own\x20forward\x20name\x20(e.g.\x20free_cancel\x20→\x20closed_cancel,\x20supplier_confirm\x20→\x20confirmed)\x20so\x20the\x20name\x20determines\x20the\x20node.'):h['push'](j+'\x20Recommended:\x20give\x20the\x20forward\x20a\x20destination-unique\x20name\x20unless\x20this\x20fork\x20is\x20intentional\x20and\x20the\x20caller\x20is\x20told\x20to\x20choose.');}for(const k of f){h['push'](c+':\x20duplicate\x20forward\x20\x22'+k['forward']+'\x22\x20in\x20the\x20'+(k['prev_node']||'(entry)')+'→'+k['next_node']+'\x20Pair\x20—\x20'+'the\x20destination\x20node\x27s\x20edge\x20lookup\x20(machine.move:284-296)\x20scans\x20forwards\x20in\x20order\x20and\x20returns\x20the\x20FIRST\x20match,\x20so\x20every\x20later\x20entry\x20with\x20that\x20name\x20is\x20unreachable\x20(dead\x20weight).\x20Rename\x20or\x20drop\x20it.');}return{'ambiguities':e,'shadowed':f,'critical':g,'warnings':h};}export function findLoopCycles(a){const b=0x0,c=0x1,d=0x2,e=new Map(),f=[],g=[],h=i=>{e['set'](i,c),f['push'](i);for(const j of a['get'](i)??[]){const k=e['get'](j)??b;if(k===c){const l=f['indexOf'](j);if(l>=0x0)g['push']({'from':i,'to':j,'cycle':f['slice'](l)});}else k===b&&h(j);}f['pop'](),e['set'](i,d);};for(const i of a['keys']()){if((e['get'](i)??b)===b)h(i);}return g;}export const MACHINE_TOPOLOGY_VERSION='1.0.0';
|
|
1
|
+
import{MAX_NODE_COUNT,MAX_NODE_PAIR_COUNT,MAX_FORWARD_COUNT,MAX_FORWARD_ORDER_COUNT}from'./onchain-constants.js';export{MAX_NODE_COUNT,MAX_NODE_PAIR_COUNT,MAX_FORWARD_COUNT,MAX_FORWARD_ORDER_COUNT};export function analyzeTopology(a,b){const c=a['map'](w=>w['name']),d=new Set(c),e=new Map(),f=new Map();for(const w of c){e['set'](w,[]),f['set'](w,[]);}for(const x of b){!e['has'](x['prev_node'])&&x['prev_node']!==''&&e['set'](x['prev_node'],[]),!f['has'](x['next_node'])&&f['set'](x['next_node'],[]),x['prev_node']!==''&&e['get'](x['prev_node'])['push'](x['next_node']),f['get'](x['next_node'])['push'](x['prev_node']);}const g=b['filter'](y=>y['prev_node']==='')['map'](y=>y['next_node'])['filter'](y=>d['has'](y)),h=c['filter'](y=>(e['get'](y)||[])['length']===0x0),i=c['filter'](y=>!g['includes'](y)&&(f['get'](y)||[])['length']===0x0),j=c['filter'](y=>(e['get'](y)||[])['length']===0x0&&!h['includes'](y)),{has_cycles:k,cycle_nodes:l}=detectCycles(c,b),m=new Map();for(const y of c)m['set'](y,[]);for(const z of b){z['prev_node']!==''&&z['forwards']['length']>0x0&&d['has'](z['next_node'])&&m['get'](z['prev_node'])['push'](z['next_node']);}const n=findTrappedNodes(c,m,g),o=l['filter'](A=>A['some'](B=>n['trap_nodes']['includes'](B))),p=analyzeDeadBranches(b),q=findUnachievableThresholds(b),r=computeReachability(c,b),s=b['reduce']((A,B)=>A+B['forwards']['length'],0x0),t=Math['max'](0x0,...b['map'](A=>A['forwards']['length'])),u=Math['max'](0x0,...b['flatMap'](A=>A['forwards']['map'](B=>countRetainedSubmissions(B['retained_submission'])))),v={'max_node_count':a['length']<=MAX_NODE_COUNT,'max_node_pair_count':b['length']<=MAX_NODE_PAIR_COUNT,'max_forward_count':t<=MAX_FORWARD_COUNT,'max_forward_order_count':u<=MAX_FORWARD_ORDER_COUNT,'threshold_achievable':q['length']===0x0};return{'entry_nodes':g,'terminal_nodes':h,'orphaned_nodes':i,'dead_end_nodes':j,'dead_branches':p,'unachievable_thresholds':q,'has_cycles':k,'cycle_nodes':l,'has_traps':n['trap_nodes']['length']>0x0,'trap_nodes':n['trap_nodes'],'trap_cycles':o,'reachability':r,'node_count':a['length'],'pair_count':b['length'],'forward_count':s,'within_limits':v};}export function findUnachievableThresholds(a){const b=[];for(const c of a){const d=c['forwards']['length'],e=c['forwards']['reduce']((g,h)=>g+Number(h['weight']||0x0),0x0);if(e<c['threshold']){const f=c['threshold']>0x1&&d<c['threshold'];b['push']({'prev_node':c['prev_node'],'next_node':c['next_node'],'threshold':c['threshold'],'max_achievable':e,'distinct_forwards':d,'reason':f?'Threshold\x20'+c['threshold']+'\x20needs\x20'+c['threshold']+'\x20distinct\x20forwards\x20(each\x20forward\x20is\x20single-operator-locked\x20and\x20contributes\x20its\x20weight\x20at\x20most\x20once);\x20this\x20Pair\x20has\x20'+d+'\x20forward(s)\x20summing\x20to\x20'+e+'.\x20Add\x20more\x20parallel\x20forwards\x20or\x20lower\x20the\x20threshold.':'Threshold\x20'+c['threshold']+'\x20exceeds\x20max\x20achievable\x20weight\x20'+e+'\x20(sum\x20of\x20distinct\x20forward\x20weights).\x20The\x20transition\x20can\x20never\x20migrate.'});}}return b;}function countRetainedSubmissions(a){if(a===undefined||a===null)return 0x0;if(Array['isArray'](a))return a['length'];if(typeof a==='string')return a['length']>0x0?0x1:0x0;return 0x0;}export function detectCycle(a,b){const c=a['map'](d=>d['name']);return detectCycles(c,b);}function detectCycles(a,b){const c=new Map();for(const k of a)c['set'](k,[]);for(const l of b){l['prev_node']!==''&&c['has'](l['prev_node'])&&c['get'](l['prev_node'])['push'](l['next_node']);}const d=0x0,e=0x1,f=0x2,g=new Map();for(const m of a)g['set'](m,d);const h=[],i=[];function j(n){g['set'](n,e),i['push'](n);for(const o of c['get'](n)||[]){if(g['get'](o)===e){const p=i['indexOf'](o);return h['push'](i['slice'](p)),!![];}if(g['get'](o)===d){if(j(o))return!![];}}return i['pop'](),g['set'](n,f),![];}for(const n of a){g['get'](n)===d&&j(n);}return{'has_cycles':h['length']>0x0,'cycle_nodes':h};}export function findTrappedNodes(a,b,c){const d=new Set(),f=[];for(const l of c){!d['has'](l)&&(d['add'](l),f['push'](l));}while(f['length']>0x0){const m=f['shift']();for(const n of b['get'](m)||[]){!d['has'](n)&&(d['add'](n),f['push'](n));}}const g=a['filter'](o=>(b['get'](o)||[])['length']===0x0),h=new Map();for(const o of a)h['set'](o,[]);for(const [q,r]of b){for(const s of r){if(h['has'](s))h['get'](s)['push'](q);}}const i=new Set(),j=[];for(const w of g){i['add'](w),j['push'](w);}while(j['length']>0x0){const x=j['shift']();for(const y of h['get'](x)||[]){!i['has'](y)&&(i['add'](y),j['push'](y));}}const k=[...d]['filter'](z=>!i['has'](z))['sort']();return{'trap_nodes':k,'entry_reachable':d,'exit_reaching':i};}function analyzeDeadBranches(a){const b=[],c=new Map();for(const d of a){if(!c['has'](d['prev_node']))c['set'](d['prev_node'],[]);c['get'](d['prev_node'])['push'](d);}for(const [e,f]of c){if(f['length']<=0x1)continue;const g=Math['min'](...f['map'](h=>h['threshold']));for(const h of f){h['threshold']>g*0x2&&b['push']({'pair':{'prev_node':h['prev_node'],'next_node':h['next_node']},'reason':'Threshold\x20'+h['threshold']+'\x20is\x20much\x20higher\x20than\x20competing\x20minimum\x20'+g+'.\x20Likely\x20always\x20loses.','competing_with':f['filter'](i=>i!==h)['map'](i=>i['next_node'])});}}return b;}function computeReachability(a,b){const c=new Map();for(const e of a)c['set'](e,[]);for(const f of b){if(f['prev_node']!==''){if(!c['has'](f['prev_node']))c['set'](f['prev_node'],[]);c['get'](f['prev_node'])['push'](f['next_node']);}}const d=new Map();for(const g of a){const h=new Set(),i=[g];while(i['length']>0x0){const j=i['shift']();for(const k of c['get'](j)||[]){!h['has'](k)&&(h['add'](k),i['push'](k));}}d['set'](g,h);}return d;}export function isReachableFromEntry(a,b){for(const c of b['entry_nodes']){if(c===a)return!![];if(b['reachability']['get'](c)?.['has'](a))return!![];}return![];}export function getNodesReachingTerminals(a){const b=new Set();for(const [c,d]of a['reachability']){for(const e of a['terminal_nodes']){if(d['has'](e)){b['add'](c);break;}}}return b;}export function formatTopologySummary(a){const b=['Nodes:\x20'+a['node_count']+'\x20(max\x20100)','Pairs:\x20'+a['pair_count']+'\x20(max\x2040)','Forwards:\x20'+a['forward_count']+'\x20(max\x2020\x20per\x20Pair)','','Entry\x20nodes:\x20'+(a['entry_nodes']['join'](',\x20')||'(none)'),'Terminal\x20nodes:\x20'+(a['terminal_nodes']['join'](',\x20')||'(none)'),'Orphaned\x20nodes:\x20'+(a['orphaned_nodes']['join'](',\x20')||'(none)'),'Dead\x20branches:\x20'+a['dead_branches']['length'],'Unachievable\x20thresholds:\x20'+a['unachievable_thresholds']['length'],a['has_traps']?'TRAP\x20(entry-reachable,\x20no\x20exit\x20path):\x20YES\x20—\x20['+a['trap_nodes']['join'](',\x20')+']\x20❌\x20an\x20order\x20entering\x20these\x20nodes\x20can\x20never\x20reach\x20a\x20terminal':'Trap\x20(entry-reachable,\x20no\x20exit\x20path):\x20NO\x20✓\x20every\x20reachable\x20node\x20can\x20reach\x20a\x20terminal','Cycles:\x20'+(a['has_cycles']?a['cycle_nodes']['length']+'\x20found\x20(informational\x20—\x20allowed\x20on-chain;'+(a['has_traps']?'\x20a\x20trapped\x20loop\x20needs\x20a\x20cycle-breaking\x20exit':'\x20exit\x20reachability\x20verified')+')':'none'),'','Within\x20on-chain\x20limits:\x20'+(a['within_limits']['max_node_count']&&a['within_limits']['max_node_pair_count']&&a['within_limits']['max_forward_count']&&a['within_limits']['max_forward_order_count']&&a['within_limits']['threshold_achievable']?'YES\x20✓':'NO\x20❌')];return b['join']('\x0a');}export function identifyTopologyPattern(a){const b=new Map(),c=new Map();for(const d of a){if(!b['has'](d['prev_node']))b['set'](d['prev_node'],[]);b['get'](d['prev_node'])['push'](d['next_node']);if(!c['has'](d['next_node']))c['set'](d['next_node'],[]);c['get'](d['next_node'])['push'](d['prev_node']);}for(const [e,f]of b){if(f['length']>0x1&&e!=='')return'P-M-COMPETING';}for(const [g,h]of c){if(h['length']>0x1)return'P-M-FORKMERGE';}return'P-M-LINEAR';}const FUND_REVERSING_NODE_RE=/(^|_)(cancel(led)?|refund(ed)?|return(ed|_approved)?|expired)(_|$)/i;export function flattenMachineNodeEdges(a){const b=[];for(const c of Array['isArray'](a)?a:[]){const d=c,e=typeof d?.['name']==='string'?d['name']:'';for(const g of Array['isArray'](d?.['pairs'])?d['pairs']:[]){const h=typeof g?.['prev_node']==='string'?g['prev_node']:'',i=typeof g?.['next_node']==='string'&&g['next_node']?g['next_node']:e,j=typeof g?.['threshold']==='number'?g['threshold']:undefined;for(const k of Array['isArray'](g?.['forwards'])?g['forwards']:[]){const l=k,m=typeof l?.['name']==='string'?l['name']:'';if(!m||!i)continue;const n=l?.['namedOperator']??l?.['named_operator'],o=l?.['permissionIndex']??l?.['permission_index'];b['push']({'prev_node':h,'next_node':i,'forward':m,'weight':typeof l?.['weight']==='number'?l['weight']:undefined,'threshold':j,'guard':typeof l?.['guard']==='string'?l['guard']:null,'operator':typeof n==='string'?n:null,'permission_index':typeof o==='number'?o:null});}}}return b;}function bindingKey(a){return(a['threshold']??0x0)+'|'+(a['weight']??0x0)+'|'+(a['guard']??'')+'|'+(a['operator']??'')+'|'+(a['permission_index']??'');}export function findForwardAmbiguities(a){const b=new Map();for(const d of a){const f=d['prev_node']+'\x00'+d['forward'],h=b['get'](f);if(h)h['push'](d);else b['set'](f,[d]);}const c=[];for(const [,i]of b){const j=[...new Set(i['map'](p=>p['next_node']))];if(j['length']<0x2)continue;const k=j['filter'](p=>FUND_REVERSING_NODE_RE['test'](p)),l=k['length']>0x0&&k['length']<j['length'],m=new Set(i['map'](bindingKey)),n=m['size']>0x1,o=j['filter'](p=>!FUND_REVERSING_NODE_RE['test'](p));c['push']({'prev_node':i[0x0]['prev_node'],'forward':i[0x0]['forward'],'destinations':j['sort'](),'fund_conflict':l,'binding_differs':n,'severity':l?'critical':'warning','reason':l?'Forward\x20\x22'+i[0x0]['forward']+'\x22\x20from\x20\x22'+i[0x0]['prev_node']+'\x22\x20resolves\x20to\x20both\x20refund\x20node(s)\x20['+k['join'](',\x20')+']\x20and\x20continue\x20node(s)\x20['+o['join'](',\x20')+'].\x20The\x20destination\x20is\x20a\x20CALLER\x20argument,\x20so\x20the\x20wrong\x20pick\x20puts\x20the\x20order\x20in\x20a\x20node\x20whose\x20Allocator\x20never\x20fires\x20—\x20the\x20escrow\x20strands.':'Forward\x20\x22'+i[0x0]['forward']+'\x22\x20from\x20\x22'+i[0x0]['prev_node']+'\x22\x20resolves\x20to\x20'+j['length']+'\x20destinations\x20['+j['join'](',\x20')+'];\x20the\x20caller\x20picks\x20which,\x20so\x20the\x20workflow\x20outcome\x20depends\x20on\x20an\x20argument\x20the\x20Machine\x20does\x20not\x20constrain'+(n?'\x20—\x20and\x20the\x20candidate\x20edges\x20carry\x20DIFFERENT\x20guard/operator/weight\x20bindings':'')+'.'});}return c['sort']((p,q)=>p['severity']===q['severity']?0x0:p['severity']==='critical'?-0x1:0x1);}export function findShadowedForwards(a){const b=new Set(),c=[];for(const d of a){const f=d['prev_node']+'\x00'+d['next_node']+'\x00'+d['forward'];b['has'](f)?c['push']({'prev_node':d['prev_node'],'next_node':d['next_node'],'forward':d['forward']}):b['add'](f);}return c;}export function lintForwardAmbiguity(b,c='machine'){const d=flattenMachineNodeEdges(b),e=findForwardAmbiguities(d),f=findShadowedForwards(d),g=[],h=[];for(const i of e){const j=c+':\x20P0-6\x20forward\x20ambiguity\x20—\x20'+i['reason'];i['severity']==='critical'?g['push'](j+'\x20Fix:\x20give\x20each\x20destination\x20its\x20own\x20forward\x20name\x20(e.g.\x20free_cancel\x20→\x20closed_cancel,\x20supplier_confirm\x20→\x20confirmed)\x20so\x20the\x20name\x20determines\x20the\x20node.'):h['push'](j+'\x20Recommended:\x20give\x20the\x20forward\x20a\x20destination-unique\x20name\x20unless\x20this\x20fork\x20is\x20intentional\x20and\x20the\x20caller\x20is\x20told\x20to\x20choose.');}for(const k of f){h['push'](c+':\x20duplicate\x20forward\x20\x22'+k['forward']+'\x22\x20in\x20the\x20'+(k['prev_node']||'(entry)')+'→'+k['next_node']+'\x20Pair\x20—\x20'+'the\x20destination\x20node\x27s\x20edge\x20lookup\x20scans\x20forwards\x20in\x20order\x20and\x20returns\x20the\x20FIRST\x20match,\x20so\x20every\x20later\x20entry\x20with\x20that\x20name\x20is\x20unreachable\x20(dead\x20weight).\x20Rename\x20or\x20drop\x20it.');}return{'ambiguities':e,'shadowed':f,'critical':g,'warnings':h};}export function findLoopCycles(a){const b=0x0,c=0x1,d=0x2,e=new Map(),f=[],g=[],h=i=>{e['set'](i,c),f['push'](i);for(const j of a['get'](i)??[]){const k=e['get'](j)??b;if(k===c){const l=f['indexOf'](j);if(l>=0x0)g['push']({'from':i,'to':j,'cycle':f['slice'](l)});}else k===b&&h(j);}f['pop'](),e['set'](i,d);};for(const i of a['keys']()){if((e['get'](i)??b)===b)h(i);}return g;}export const MACHINE_TOPOLOGY_VERSION='1.0.0';
|