chainlesschain 0.166.90 → 0.166.92
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/README.md +15 -13
- package/package.json +4 -4
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-CZzXRe1-.js → AIOps-C74YzqwJ.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-_AZfbW1Q.js → ActionButton-TFef1hOE.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CzaUx_wv.js → Analytics-CYsWpkkU.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-xHEeeD-m.js → AppLayout-CFf9kjwu.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-DmTbtudE.js → Artifacts-TQqa94YO.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-Cn4ng4fo.js → Audit-B79ayqfS.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DLUY1VD2.js → BackgroundAgents-pjkHfLP9.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-B2v--wB6.js → Backup-CE6A-t_r.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Bgih7yAv.js → BaseInput-CwcgWMBY.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-1MiiA3yA.js → Chat-BIkDNesY.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CPLynmbb.js → ChatBubbleRenderer-DgaokYts.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-DsyBa_NO.js → Checkbox-MbypIy5V.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-B7WCFx9H.js → Codegen-DiFHWDnt.js} +1 -1
- package/src/assets/web-panel/assets/{Col-D2x4GBGm.js → Col-BNMlYMso.js} +1 -1
- package/src/assets/web-panel/assets/{Community-Rnwg9nea.js → Community-B3HVyHOX.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BPczlrRh.js → Compact-C7hlAubb.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-Br1L_wGU.js → Compliance-PaXZu6sE.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DlsWB_oS.js → Cowork-BGiojbm-.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-BWo_KGpG.js → Cron-Bmr-1QAx.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-Cug7N8ge.js → Crosschain-BwUvWCVd.js} +1 -1
- package/src/assets/web-panel/assets/{DID-CMbyOZJN.js → DID-k_4QZocW.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-C4dl_UaE.js → Dashboard-_ieRo2C5.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CBrC7M-9.js → Dropdown-DYHh6T27.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-DTq7tU4b.js → EmailListRenderer-BNlQcWQX.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-DWP3csxS.js → EvolutionSettings-DIkZ6U2D.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DZl7zuv_.js → FamilyGuardDashboard-Dq7qSr0P.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-W-GSlVK5.js → Federation-C64e3Cbx.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DMB7xYFV.js → FormItemContext-D-GE2vUa.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DNv8GEoq.js → GenericCardRenderer-DO3B2gis.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BZ0Bbzw6.js → Git-0ETirIQH.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BNEdcOM5.js → Governance-C9fnRygX.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-C8249gIz.js → Inference-CLJ9RTsK.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-ngzebU3e.js → KnowledgeGraph-D3C_GxrN.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CP15th-f.js → Logs-C5ctGbkN.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-Ce-eWK3j.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-CaH59OsY.js → Marketplace-GF_t6hJ_.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-C07vnJev.js → McpTools-BGsGzgQs.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-CqAOkVAS.js → Memory-CcrY2A0j.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-qp7mZimq.js → MobileBridge-Bi4T0RlS.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DKhbqvTw.js → MobileProjects-DvjEGyvf.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-CRYCnWXv.js → Mtc-DL77Vf-k.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-Z08IrKws.js → MtcAudit-CDy_Uswb.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-BWdatUnH.js → Multisig-DL0BAO_c.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-BKWiCZ_m.js → NLProgramming-B-woh5IR.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Bgpzk3sm.js → Notes-CEFVCxk7.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DvtZEktR.js → NotificationSettings-BqPPMuAP.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-CBcy0szc.js → OrderTableRenderer-GUKQ1xwp.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-DRRL6vW1.js → Organization-B1gX8jlr.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-COmfB8Ns.js → Overflow-CeMxuUZy.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BqMq_DSa.js → P2P-B5aIRWwJ.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-BX7iNvle.js → PdhVaultBrowser-6rYgejd4.js} +4 -4
- package/src/assets/web-panel/assets/{Permissions-DzYkjmV_.js → Permissions-CqCp2SIl.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BBTcxBbN.js → PersonalDataHub-BsA7DJWW.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-eRkYFSbO.js → Pipeline-CiW6HeZh.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-Ch7IFKBh.js → Privacy-DckUOLYq.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Ci8EcBYg.js → ProjectInit-CZppOOYR.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-B4lYHFbI.js → ProjectSettings-B9QPzhDU.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-zkE5cCo_.js → Projects-BErjjGha.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-BKDVD3_e.js → Providers-DehU6Qiz.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-BromrHlf.js → QrScannerModal-E1SUvv1m.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CCgoY1gR.js → QuickAsk-COWFxyH3.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DCPZvpq7.js → Recommend-D26pWKxX.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DPnFP8HU.js → RemoteSession-DCOIaId3.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-l6r8ytAs.js → Reputation-DT_AHGAR.js} +1 -1
- package/src/assets/web-panel/assets/{Row-ke9Mk1cx.js → Row-B50S-1nl.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DQOEzUEn.js → RssFeed-BaBnHg3Q.js} +2 -2
- package/src/assets/web-panel/assets/{Search-BqgA0aUz.js → Search-BVdnLuuS.js} +1 -1
- package/src/assets/web-panel/assets/{Security-FeGD_jqV.js → Security-BnacH74J.js} +3 -3
- package/src/assets/web-panel/assets/{Services-4kiYYAjZ.js → Services-CxM08Zch.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-BbU8Xegs.js → Skeleton-DE7CIc1N.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-Dl2bUMUL.js → Skills-CGI0SJmf.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-xRGALeaZ.js → Sla-DpEzPcqc.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DZfd4RDm.js → SpeechSettings-CTmnmMHn.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BRtCV9Ga.js → SyncSettings-Dxgrd9hd.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DVRQklfG.js → Tasks-CW4slS0A.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-BbhE5jt5.js → Templates-DxvGWDgB.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-qXPDNKbK.js → Tenant-_Q0o2tNK.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-CV48Ks7E.js → Terminal-BTZn8pow.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BLGfJIDr.js → TimelineRenderer-CauL0KFe.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-7G9H6Hrt.js → Tokens-CDoM2qeT.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger--F64N11F.js → Trigger-B-QYGEU7.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-Cq1r-D_y.js → Trust-BD6XJHT-.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-Dqyu4RVh.js → UkeySign-x4TFwCy0.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DuFmWH_B.js → VideoEditing-t3imBK_0.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-C3mg7EWP.js → Wallet-BCfkWwNC.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CDK-Aj_X.js → WebAuthn-WH314Mdm.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor--K7K-T1F.js → WorkflowEditor-jUlcjrUg.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BQDcS6VP.js → chat-Dg3VASTL.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BKxJL2-T.js → colors-BNvmBRKE.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CFjQAMbY.js → compact-item-BGOfoqf4.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DbgCsdQd.js → createContext-BNQeqKAs.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-B7_ypN1G.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BhkaOBNv.js → hasIn-Bg3AjCrq.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvWWFJHJ.js → index--I3UF5t1.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJ2OiRvh.js → index-2D04Zltx.js} +3 -3
- package/src/assets/web-panel/assets/{index-BuWPqSGT.js → index-60AnjUTX.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2Zb-Kd1.js → index-7QJUWemf.js} +1 -1
- package/src/assets/web-panel/assets/{index-C0DzhUOX.js → index-B--0QM0S.js} +1 -1
- package/src/assets/web-panel/assets/index-B-jSKJK6.js +1 -0
- package/src/assets/web-panel/assets/{index-COGy6wXn.js → index-B0mgngoB.js} +1 -1
- package/src/assets/web-panel/assets/{index-bMX8BBLE.js → index-BBCMulQ-.js} +1 -1
- package/src/assets/web-panel/assets/{index-CE506mgj.js → index-BSNhW95G.js} +1 -1
- package/src/assets/web-panel/assets/{index-CoOu7sdP.js → index-B_JmInC0.js} +1 -1
- package/src/assets/web-panel/assets/{index-B4LlAJqc.js → index-BaPvEvB4.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRtUDiXx.js → index-Bkz1tgFR.js} +1 -1
- package/src/assets/web-panel/assets/{index-Du_SxxBY.js → index-BmTacaQV.js} +1 -1
- package/src/assets/web-panel/assets/{index-CSUDlsIr.js → index-CCFZN66A.js} +1 -1
- package/src/assets/web-panel/assets/{index-3uR0ThJO.js → index-COol3xfA.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmYK9Tqt.js → index-CY8cRKHR.js} +1 -1
- package/src/assets/web-panel/assets/{index-T9ka3Xj3.js → index-Cbp-wp-U.js} +1 -1
- package/src/assets/web-panel/assets/{index-CB4oHynY.js → index-Co_LnCWD.js} +1 -1
- package/src/assets/web-panel/assets/{index-DEwHywz9.js → index-Cx2EXRfr.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUs7XpUO.js → index-D-mSvCQK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRqlCTrz.js → index-D072oLjp.js} +1 -1
- package/src/assets/web-panel/assets/{index-sKfUUldY.js → index-D6UqK83L.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dhfa_BIl.js → index-DF_FKSVH.js} +1 -1
- package/src/assets/web-panel/assets/{index-D9sVcw6v.js → index-DLwEXRrb.js} +1 -1
- package/src/assets/web-panel/assets/{index-3djsY75k.js → index-DO0VlNtc.js} +1 -1
- package/src/assets/web-panel/assets/{index-BfGGsAU7.js → index-DS04wRll.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dn2QSsuI.js → index-DYn5DnDk.js} +1 -1
- package/src/assets/web-panel/assets/{index-D-Yh3-1z.js → index-D_O2ZjPk.js} +1 -1
- package/src/assets/web-panel/assets/{index-BNjYPJNU.js → index-DcCnO0RU.js} +1 -1
- package/src/assets/web-panel/assets/{index-DP1NrM9J.js → index-Dkp-okWa.js} +1 -1
- package/src/assets/web-panel/assets/{index-DdcrixaQ.js → index-OUFoxUgH.js} +1 -1
- package/src/assets/web-panel/assets/index-P4FXZJqI.js +1 -0
- package/src/assets/web-panel/assets/{index-7BY44UEv.js → index-Wo0f2iqb.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjmVlpap.js → index-ZD5Kd8tx.js} +1 -1
- package/src/assets/web-panel/assets/{index-3YutaXnp.js → index-fOwii3LP.js} +1 -1
- package/src/assets/web-panel/assets/{index-aPdVzagA.js → index-hG7jXGEW.js} +1 -1
- package/src/assets/web-panel/assets/{index-De7daEnc.js → index-pVdQieac.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJoXgJ2N.js → index-uH2LnAs_.js} +1 -1
- package/src/assets/web-panel/assets/{index-DFt48Z-x.js → index-xzaUx19r.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-wrqabmui.js → initDefaultProps-B8PN9AxJ.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BoyB3ilP.js → motion-BHivfw5Q.js} +1 -1
- package/src/assets/web-panel/assets/{move-Cq31cSFE.js → move-B0QU5nDd.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BkxNt-8H.js → mtc-parser-DRwRM3PE.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DofGni53.js → omit-SHt2rV2p.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BnluLL16.js → pickAttrs-CcmDlEb2.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-C-yegJSP.js → placementArrow-DYatmXDS.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CD3ziNhu.js → responsiveObserve-B7qrsXq5.js} +1 -1
- package/src/assets/web-panel/assets/{slide-ToZO4gQ1.js → slide-BRGhlOWd.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DFVmDmVl.js → statusUtils-CT-7NXsQ.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-De0Y8g1O.js → styleChecker-rZdw_Yyp.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-wBKIYFKX.js → useFlexGapSupport-D8YNIP4P.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CP9nmUMJ.js → useFs-B8pt0Gu-.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-vFGrVDyp.js → usePersonalDataHub-VMmYM1tt.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BcBIjvjH.js → vnode-UNDuoPoq.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DnXDAQxA.js → zoom-dN-u667S.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/agent-process-ownership.js +121 -0
- package/src/commands/agent.js +2 -0
- package/src/commands/hub.js +86 -9
- package/src/data/changelog.json +54 -2
- package/src/lib/audit-logger.js +46 -20
- package/src/lib/checkpoint-restore-saga.js +11 -1
- package/src/lib/eval/verify01-host-evidence.js +36 -3
- package/src/lib/evolution/evolution-artifact-ports.js +26 -0
- package/src/lib/evolution/evolution-eval-cohort-enrollment.js +713 -47
- package/src/lib/evolution/evolution-eval-gate.js +146 -0
- package/src/lib/evolution/evolution-eval-launch-admission.js +168 -90
- package/src/lib/evolution/evolution-eval-ledger-capture.js +50 -0
- package/src/lib/evolution/evolution-eval-readonly-audit.js +106 -0
- package/src/lib/evolution/evolution-ledger-file-backend.js +20 -0
- package/src/lib/evolution/evolution-ledger-ports.js +59 -27
- package/src/lib/evolution/evolution-ledger-v2-journal.js +55 -18
- package/src/lib/evolution/evolution-workbench-file-resources.js +19 -1
- package/src/lib/evolution/rrsi-cohort-registration.js +275 -0
- package/src/lib/evolution/rrsi-contracts.js +742 -0
- package/src/lib/evolution/rrsi-data.js +196 -0
- package/src/lib/evolution/rrsi-evaluation-adapter.js +275 -0
- package/src/lib/evolution/rrsi-evaluation-variants.js +267 -0
- package/src/lib/evolution/rrsi-group-statistics.js +553 -0
- package/src/lib/evolution/rrsi-history-ledger-adapter.js +3261 -0
- package/src/lib/evolution/rrsi-native-batch-evidence.js +520 -0
- package/src/lib/evolution/rrsi-native-eval-row-collector.js +538 -0
- package/src/lib/evolution/rrsi-native-evaluation-batch.js +547 -0
- package/src/lib/evolution/rrsi-native-evaluation-plan.js +431 -0
- package/src/lib/evolution/rrsi-native-group-statistics-plan.js +121 -0
- package/src/lib/evolution/rrsi-native-group-statistics.js +482 -0
- package/src/lib/evolution/rrsi-native-quality-receipt-contracts.js +321 -0
- package/src/lib/evolution/rrsi-native-quality-receipt.js +256 -0
- package/src/lib/evolution/rrsi-native-statistics-protocol.js +330 -0
- package/src/lib/evolution/rrsi-parent-binding.js +290 -0
- package/src/lib/evolution/rrsi-pm-execution-bridge.js +500 -0
- package/src/lib/evolution/rrsi-pm-training-mapping.js +134 -0
- package/src/lib/evolution/rrsi-preparation-contracts.js +213 -0
- package/src/lib/evolution/rrsi-registry-history-binding.js +193 -0
- package/src/lib/evolution/rrsi-registry-store-policy.js +1191 -0
- package/src/lib/evolution/rrsi-runtime-composition.js +79 -0
- package/src/lib/evolution/rrsi-selector.js +434 -0
- package/src/lib/evolution/rrsi-statistics-simulation.js +354 -0
- package/src/lib/evolution/skill-candidate-registry.js +216 -29
- package/src/lib/evolution/skill-registry-maintenance.js +80 -0
- package/src/lib/evolution/skill-registry-writer-control.js +138 -0
- package/src/lib/evolution/skill-release-registry.js +399 -169
- package/src/lib/formal-quality-eval-runtime.js +2 -14
- package/src/lib/goal-store.js +225 -16
- package/src/lib/process-execution-broker/index.js +91 -1
- package/src/lib/process-execution-broker/platform-sandbox.js +42 -0
- package/src/lib/process-execution-broker/windows-native-evaluator-capabilities.js +757 -0
- package/src/lib/process-execution-broker/windows-native-evaluator.js +316 -0
- package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
- package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
- package/src/lib/process-execution-broker/windows-sandbox.cs +383 -11
- package/src/lib/record-replay/skill-recorder.js +38 -3
- package/src/lib/scheduler-kernel/authority-resolver.js +12 -163
- package/src/lib/scheduler-kernel/contract.js +27 -414
- package/src/lib/scheduler-kernel/runtime.js +21 -823
- package/src/lib/scheduler-kernel/service.js +11 -328
- package/src/lib/scheduler-kernel/source-locator-path.js +7 -142
- package/src/lib/scheduler-kernel/store.js +67 -5931
- package/src/lib/secure-fs.js +16 -1314
- package/src/lib/with-file-lock.js +122 -20
- package/src/assets/web-panel/assets/MarkdownRenderer-CW3B3JDq.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DlIv9Mbc.js +0 -1
- package/src/assets/web-panel/assets/index-BC972Grv.js +0 -1
- package/src/assets/web-panel/assets/index-CVifyQqL.js +0 -1
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
/** RRSI accounting around an existing PM host. No provider or signing factory. */
|
|
2
|
+
import { isProxy } from "node:util/types";
|
|
3
|
+
import { captureRrsiHistoryLedgerAdapter } from "./rrsi-history-ledger-adapter.js";
|
|
4
|
+
import {
|
|
5
|
+
recheckRrsiEffectiveParent,
|
|
6
|
+
assertRrsiEffectiveParentHistory,
|
|
7
|
+
RRSI_PARENT_BINDING_V2_SCHEMA,
|
|
8
|
+
} from "./rrsi-parent-binding.js";
|
|
9
|
+
import { verifyRrsiCampaign, RRSI_BUDGET_FIELDS } from "./rrsi-contracts.js";
|
|
10
|
+
import {
|
|
11
|
+
RRSI_PREPARATION_RESERVATION_SCHEMA_V2,
|
|
12
|
+
rrsiTrainingSourcesDigest,
|
|
13
|
+
} from "./rrsi-preparation-contracts.js";
|
|
14
|
+
import { verifyRrsiPmTrainingMapping } from "./rrsi-pm-training-mapping.js";
|
|
15
|
+
import {
|
|
16
|
+
inspectPmExplorationJournal,
|
|
17
|
+
verifyPmExplorationPlan,
|
|
18
|
+
} from "./pm-exploration-rounds.js";
|
|
19
|
+
import {
|
|
20
|
+
inspectPmExplorationExecutionHost,
|
|
21
|
+
verifyPmExplorationExecutionManifest,
|
|
22
|
+
executePmExplorationRound,
|
|
23
|
+
} from "./pm-exploration-execution-host.js";
|
|
24
|
+
import {
|
|
25
|
+
snapshotRrsiData,
|
|
26
|
+
rrsiExact,
|
|
27
|
+
rrsiId,
|
|
28
|
+
rrsiInteger,
|
|
29
|
+
rrsiCanonical,
|
|
30
|
+
rrsiHash,
|
|
31
|
+
rrsiEnvelope,
|
|
32
|
+
freezeRrsiData,
|
|
33
|
+
rrsiFail,
|
|
34
|
+
} from "./rrsi-data.js";
|
|
35
|
+
|
|
36
|
+
export const RRSI_PM_BRIDGE_SCHEMA =
|
|
37
|
+
"chainlesschain.rrsi-pm-execution-bridge/v1";
|
|
38
|
+
export const RRSI_PM_BRIDGE_RESULT_SCHEMA =
|
|
39
|
+
"chainlesschain.rrsi-pm-bridge-result/v1";
|
|
40
|
+
const BRIDGES = new WeakMap();
|
|
41
|
+
const HOST_OWNERS = new WeakMap();
|
|
42
|
+
const JOURNAL_OWNERS = new WeakMap();
|
|
43
|
+
const IN_FLIGHT = new WeakSet();
|
|
44
|
+
const PENDING = new WeakMap();
|
|
45
|
+
|
|
46
|
+
function composition(input) {
|
|
47
|
+
const keys = [
|
|
48
|
+
"history",
|
|
49
|
+
"host",
|
|
50
|
+
"campaign",
|
|
51
|
+
"suite",
|
|
52
|
+
"plan",
|
|
53
|
+
"manifest",
|
|
54
|
+
"mapping",
|
|
55
|
+
];
|
|
56
|
+
if (
|
|
57
|
+
!input ||
|
|
58
|
+
typeof input !== "object" ||
|
|
59
|
+
isProxy(input) ||
|
|
60
|
+
Object.getPrototypeOf(input) !== Object.prototype ||
|
|
61
|
+
Reflect.ownKeys(input).length !== keys.length
|
|
62
|
+
)
|
|
63
|
+
rrsiFail("PM bridge composition must be plain own fields");
|
|
64
|
+
return Object.fromEntries(
|
|
65
|
+
keys.map((key) => {
|
|
66
|
+
const field = Object.getOwnPropertyDescriptor(input, key);
|
|
67
|
+
if (!field?.enumerable || !("value" in field))
|
|
68
|
+
rrsiFail("PM bridge composition cannot use accessors");
|
|
69
|
+
return [key, field.value];
|
|
70
|
+
}),
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function stateFor(bridge) {
|
|
75
|
+
const state = BRIDGES.get(bridge);
|
|
76
|
+
if (!state) rrsiFail("a branded RRSI PM bridge is required");
|
|
77
|
+
return state;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** Root-owned composition, once per host. Direct bridge calls retain the binding. */
|
|
81
|
+
export function bindRrsiPmRuntime(bridge, parentBinding, mode) {
|
|
82
|
+
const state = stateFor(bridge);
|
|
83
|
+
if (!["off", "shadow"].includes(mode))
|
|
84
|
+
rrsiFail(
|
|
85
|
+
"enforced RRSI runtime requires complete production admission",
|
|
86
|
+
"CC_RRSI_COMPOSITION_UNAVAILABLE",
|
|
87
|
+
);
|
|
88
|
+
recheckRrsiEffectiveParent(parentBinding);
|
|
89
|
+
if (parentBinding.descriptor.campaignDigest !== state.campaign.campaignDigest)
|
|
90
|
+
rrsiFail("effective parent is bound to another campaign");
|
|
91
|
+
if (parentBinding.descriptor.schema === RRSI_PARENT_BINDING_V2_SCHEMA)
|
|
92
|
+
assertRrsiEffectiveParentHistory(parentBinding, state.history);
|
|
93
|
+
if (
|
|
94
|
+
state.runtimeBinding &&
|
|
95
|
+
(state.runtimeBinding.parentBinding !== parentBinding ||
|
|
96
|
+
state.runtimeBinding.mode !== mode)
|
|
97
|
+
)
|
|
98
|
+
rrsiFail("PM bridge runtime binding is immutable");
|
|
99
|
+
state.runtimeBinding ??= Object.freeze({ parentBinding, mode });
|
|
100
|
+
return Object.freeze({
|
|
101
|
+
descriptor: bridge.descriptor,
|
|
102
|
+
mode,
|
|
103
|
+
parentBindingDigest: parentBinding.descriptor.parentBindingDigest,
|
|
104
|
+
inspectHistory: state.history.inspect,
|
|
105
|
+
reserveBroadRound: (journal, input) =>
|
|
106
|
+
reserveRrsiPmBroadRound(bridge, journal, input),
|
|
107
|
+
executeBroadRound: (response) => executeRrsiPmBroadRound(bridge, response),
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function checkRuntime(state) {
|
|
112
|
+
const binding = state.runtimeBinding;
|
|
113
|
+
if (!binding) return; // Legacy local bridge has no production admission claims.
|
|
114
|
+
if (binding.mode === "off")
|
|
115
|
+
rrsiFail("RRSI runtime is off", "CC_RRSI_RUNTIME_OFF");
|
|
116
|
+
// Re-read the actual captured Registry; never accept a replayable JSON readback.
|
|
117
|
+
recheckRrsiEffectiveParent(binding.parentBinding);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function checkHistory(state) {
|
|
121
|
+
const status = state.history.inspect();
|
|
122
|
+
const registered = status.preparationPlan;
|
|
123
|
+
if (
|
|
124
|
+
!registered ||
|
|
125
|
+
registered.planDigest !== state.plan.planDigest ||
|
|
126
|
+
registered.manifestDigest !== state.manifest.manifestDigest ||
|
|
127
|
+
registered.trainingMappingDigest !== state.mapping.trainingMappingDigest ||
|
|
128
|
+
registered.pmTrainingPartitionDigest !==
|
|
129
|
+
state.mapping.pmTrainingPartitionDigest ||
|
|
130
|
+
registered.trainingPartitionDigest !==
|
|
131
|
+
state.mapping.rrsiTrainingPartitionDigest ||
|
|
132
|
+
registered.trainingSourcesDigest !==
|
|
133
|
+
rrsiTrainingSourcesDigest(state.campaign) ||
|
|
134
|
+
registered.executionDigest !==
|
|
135
|
+
rrsiHash(
|
|
136
|
+
"chainlesschain.rrsi-execution-bindings/v1",
|
|
137
|
+
state.campaign.execution,
|
|
138
|
+
)
|
|
139
|
+
)
|
|
140
|
+
rrsiFail(
|
|
141
|
+
"PM bridge differs from frozen preparation plan",
|
|
142
|
+
"CC_RRSI_HISTORY_HOLD",
|
|
143
|
+
);
|
|
144
|
+
return status;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export function createRrsiPmExplorationBridge(input) {
|
|
148
|
+
const options = composition(input);
|
|
149
|
+
const history = captureRrsiHistoryLedgerAdapter(options.history);
|
|
150
|
+
const hostProjection = inspectPmExplorationExecutionHost(options.host);
|
|
151
|
+
const campaign = verifyRrsiCampaign(options.campaign);
|
|
152
|
+
const plan = freezeRrsiData(snapshotRrsiData(options.plan));
|
|
153
|
+
const manifest = freezeRrsiData(snapshotRrsiData(options.manifest));
|
|
154
|
+
verifyPmExplorationPlan(plan);
|
|
155
|
+
verifyPmExplorationExecutionManifest(manifest);
|
|
156
|
+
if (Object.hasOwn(manifest, "curriculum"))
|
|
157
|
+
rrsiFail("RRSI bridge currently requires a host without curriculum");
|
|
158
|
+
if (
|
|
159
|
+
history.descriptor.tenantId !== campaign.tenantId ||
|
|
160
|
+
history.descriptor.goalId !== campaign.goalId
|
|
161
|
+
)
|
|
162
|
+
rrsiFail("PM bridge history scope differs from campaign");
|
|
163
|
+
if (
|
|
164
|
+
hostProjection.planDigest !== plan.planDigest ||
|
|
165
|
+
hostProjection.manifestDigest !== manifest.manifestDigest ||
|
|
166
|
+
hostProjection.environmentDigest !== campaign.execution.environmentDigest ||
|
|
167
|
+
manifest.planDigest !== plan.planDigest ||
|
|
168
|
+
manifest.environmentDigest !== plan.environmentDigest
|
|
169
|
+
)
|
|
170
|
+
rrsiFail("PM host differs from campaign, plan or manifest");
|
|
171
|
+
const mapping = verifyRrsiPmTrainingMapping(options.mapping, {
|
|
172
|
+
campaign,
|
|
173
|
+
suite: options.suite,
|
|
174
|
+
plan,
|
|
175
|
+
});
|
|
176
|
+
const state = {
|
|
177
|
+
history,
|
|
178
|
+
host: options.host,
|
|
179
|
+
campaign,
|
|
180
|
+
plan,
|
|
181
|
+
manifest,
|
|
182
|
+
mapping,
|
|
183
|
+
};
|
|
184
|
+
checkHistory(state);
|
|
185
|
+
const descriptor = rrsiEnvelope(RRSI_PM_BRIDGE_SCHEMA, "bridgeDigest", {
|
|
186
|
+
scopeId: history.descriptor.scopeId,
|
|
187
|
+
campaignDigest: campaign.campaignDigest,
|
|
188
|
+
planDigest: plan.planDigest,
|
|
189
|
+
manifestDigest: manifest.manifestDigest,
|
|
190
|
+
trainingMappingDigest: mapping.trainingMappingDigest,
|
|
191
|
+
parentReleaseDigest: campaign.parentReleaseDigest,
|
|
192
|
+
initialMemoryDigest: plan.initialMemoryDigest,
|
|
193
|
+
executionDigest: rrsiHash(
|
|
194
|
+
"chainlesschain.rrsi-execution-bindings/v1",
|
|
195
|
+
campaign.execution,
|
|
196
|
+
),
|
|
197
|
+
supportedOperation: "broad-round-without-curriculum",
|
|
198
|
+
plannedExecutionUnits: ["pm-runner", "pm-grader"],
|
|
199
|
+
pmEnforcedResourceFields: ["maxTokens", "maxToolCalls", "maxWallClockMs"],
|
|
200
|
+
monetaryBudgetEnforced: false,
|
|
201
|
+
executionCountBudgetEnforced: false,
|
|
202
|
+
mappingAuthenticated: false,
|
|
203
|
+
parentProvenanceVerified: false,
|
|
204
|
+
modelPricingAdmissionVerified: false,
|
|
205
|
+
productionIsolationVerified: false,
|
|
206
|
+
});
|
|
207
|
+
const owner = HOST_OWNERS.get(options.host);
|
|
208
|
+
if (owner) {
|
|
209
|
+
const previous = stateFor(owner);
|
|
210
|
+
if (
|
|
211
|
+
previous.history === history &&
|
|
212
|
+
owner.descriptor.bridgeDigest === descriptor.bridgeDigest
|
|
213
|
+
)
|
|
214
|
+
return owner;
|
|
215
|
+
rrsiFail("PM host is already bound to another RRSI bridge");
|
|
216
|
+
}
|
|
217
|
+
const bridge = Object.freeze({ descriptor });
|
|
218
|
+
BRIDGES.set(bridge, state);
|
|
219
|
+
HOST_OWNERS.set(options.host, bridge);
|
|
220
|
+
return bridge;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function assertJournal(bridge, state, journal, round) {
|
|
224
|
+
const projection = inspectPmExplorationJournal(journal);
|
|
225
|
+
const owner = JOURNAL_OWNERS.get(journal);
|
|
226
|
+
if (owner && owner !== bridge)
|
|
227
|
+
rrsiFail("PM journal belongs to another bridge");
|
|
228
|
+
if (projection.planDigest !== state.plan.planDigest)
|
|
229
|
+
rrsiFail("PM journal plan differs from bridge");
|
|
230
|
+
if (round.stage !== "broad")
|
|
231
|
+
rrsiFail("RRSI bridge currently supports broad rounds only");
|
|
232
|
+
if (
|
|
233
|
+
projection.stage !== "broad" ||
|
|
234
|
+
projection.stopReason !== null ||
|
|
235
|
+
projection.frozenMemoryDigest !== null ||
|
|
236
|
+
projection.activeRoundCount !== 0
|
|
237
|
+
)
|
|
238
|
+
rrsiFail(
|
|
239
|
+
"PM journal is stopped, frozen or already running",
|
|
240
|
+
"CC_RRSI_HISTORY_HOLD",
|
|
241
|
+
);
|
|
242
|
+
const head = projection.branchHeads.find(
|
|
243
|
+
(entry) => entry.branchId === round.branchId,
|
|
244
|
+
);
|
|
245
|
+
if (!head || head.memoryDigest !== round.inputMemoryDigest)
|
|
246
|
+
rrsiFail("PM input memory differs from current branch head");
|
|
247
|
+
if (!state.mapping.mappings.some((row) => row.pmTaskId === round.taskId))
|
|
248
|
+
rrsiFail("PM task is outside frozen training mapping");
|
|
249
|
+
return projection;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/** Reserve all host-accessible training sources and the complete PM plan caps. */
|
|
253
|
+
export function reserveRrsiPmBroadRound(bridge, journal, input) {
|
|
254
|
+
const state = stateFor(bridge);
|
|
255
|
+
checkRuntime(state);
|
|
256
|
+
const value = snapshotRrsiData(input);
|
|
257
|
+
rrsiExact(
|
|
258
|
+
value,
|
|
259
|
+
[
|
|
260
|
+
"roundId",
|
|
261
|
+
"stage",
|
|
262
|
+
"branchId",
|
|
263
|
+
"taskId",
|
|
264
|
+
"inputMemoryDigest",
|
|
265
|
+
"slotId",
|
|
266
|
+
"executionId",
|
|
267
|
+
"budget",
|
|
268
|
+
],
|
|
269
|
+
"RRSI PM round request",
|
|
270
|
+
);
|
|
271
|
+
for (const key of ["roundId", "branchId", "taskId", "slotId", "executionId"])
|
|
272
|
+
rrsiId(value[key], key);
|
|
273
|
+
if (IN_FLIGHT.has(state.host))
|
|
274
|
+
rrsiFail("PM host is already running", "CC_RRSI_HISTORY_HOLD");
|
|
275
|
+
checkHistory(state);
|
|
276
|
+
const round = freezeRrsiData(
|
|
277
|
+
Object.fromEntries(
|
|
278
|
+
["roundId", "stage", "branchId", "taskId", "inputMemoryDigest"].map(
|
|
279
|
+
(key) => [key, value[key]],
|
|
280
|
+
),
|
|
281
|
+
),
|
|
282
|
+
);
|
|
283
|
+
const before = assertJournal(bridge, state, journal, round);
|
|
284
|
+
rrsiExact(value.budget, RRSI_BUDGET_FIELDS, "PM preparation budget");
|
|
285
|
+
for (const field of RRSI_BUDGET_FIELDS)
|
|
286
|
+
rrsiInteger(value.budget[field], field);
|
|
287
|
+
for (const field of ["maxTokens", "maxToolCalls", "maxWallClockMs"])
|
|
288
|
+
if (value.budget[field] < state.plan[field])
|
|
289
|
+
rrsiFail("reservation must cover the complete PM plan resource caps");
|
|
290
|
+
if (value.budget.maxExecutions < 2)
|
|
291
|
+
rrsiFail("PM round requires runner and grader execution reservations");
|
|
292
|
+
const task = state.mapping.mappings.find(
|
|
293
|
+
(row) => row.pmTaskId === round.taskId,
|
|
294
|
+
);
|
|
295
|
+
checkRuntime(state);
|
|
296
|
+
const response = state.history.reservePreparation({
|
|
297
|
+
campaignDigest: state.campaign.campaignDigest,
|
|
298
|
+
phase: "exploration",
|
|
299
|
+
sourceTaskIds: state.mapping.mappings.map((row) => row.rrsiTaskId).sort(),
|
|
300
|
+
inputs: {
|
|
301
|
+
instructionDigest: rrsiHash(
|
|
302
|
+
"chainlesschain.rrsi-pm-broad-instruction/v1",
|
|
303
|
+
{
|
|
304
|
+
operation: "run-and-grade",
|
|
305
|
+
stage: "broad",
|
|
306
|
+
taskContentDigest: task.contentDigest,
|
|
307
|
+
planDigest: state.plan.planDigest,
|
|
308
|
+
manifestDigest: state.manifest.manifestDigest,
|
|
309
|
+
trainingMappingDigest: state.mapping.trainingMappingDigest,
|
|
310
|
+
},
|
|
311
|
+
),
|
|
312
|
+
memoryDigest: round.inputMemoryDigest,
|
|
313
|
+
artifactDigests: [
|
|
314
|
+
state.mapping.trainingMappingDigest,
|
|
315
|
+
state.plan.planDigest,
|
|
316
|
+
state.manifest.manifestDigest,
|
|
317
|
+
].sort(),
|
|
318
|
+
},
|
|
319
|
+
roundId: round.roundId,
|
|
320
|
+
branchId: round.branchId,
|
|
321
|
+
slotId: value.slotId,
|
|
322
|
+
executionId: value.executionId,
|
|
323
|
+
budget: value.budget,
|
|
324
|
+
plannedExecutions: 2,
|
|
325
|
+
});
|
|
326
|
+
JOURNAL_OWNERS.set(journal, bridge);
|
|
327
|
+
if (response.newlyCommitted)
|
|
328
|
+
PENDING.set(response, { bridge, journal, round, before });
|
|
329
|
+
return response;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
function journalDrift(before, after, round, result) {
|
|
333
|
+
const checkpoint = result.checkpoint;
|
|
334
|
+
if (
|
|
335
|
+
checkpoint.roundId !== round.roundId ||
|
|
336
|
+
checkpoint.stage !== round.stage ||
|
|
337
|
+
checkpoint.branchId !== round.branchId ||
|
|
338
|
+
checkpoint.taskId !== round.taskId ||
|
|
339
|
+
checkpoint.inputMemoryDigest !== round.inputMemoryDigest ||
|
|
340
|
+
after.planDigest !== before.planDigest ||
|
|
341
|
+
after.stage !== before.stage ||
|
|
342
|
+
after.activeRoundCount !== 0 ||
|
|
343
|
+
after.mergeDigest !== before.mergeDigest ||
|
|
344
|
+
after.deepHead !== before.deepHead ||
|
|
345
|
+
after.frozenMemoryDigest !== before.frozenMemoryDigest ||
|
|
346
|
+
rrsiCanonical(after.checkpointDigests) !==
|
|
347
|
+
rrsiCanonical([
|
|
348
|
+
...before.checkpointDigests,
|
|
349
|
+
checkpoint.checkpointDigest,
|
|
350
|
+
]) ||
|
|
351
|
+
rrsiCanonical(after.aggregateMetrics) !==
|
|
352
|
+
rrsiCanonical(checkpoint.aggregateMetrics)
|
|
353
|
+
)
|
|
354
|
+
return true;
|
|
355
|
+
const expectedHeads = before.branchHeads.map((head) =>
|
|
356
|
+
head.branchId === round.branchId
|
|
357
|
+
? {
|
|
358
|
+
branchId: head.branchId,
|
|
359
|
+
memoryDigest: checkpoint.effectiveMemoryDigest,
|
|
360
|
+
checkpointCount: head.checkpointCount + 1,
|
|
361
|
+
checkpointDigest: checkpoint.checkpointDigest,
|
|
362
|
+
}
|
|
363
|
+
: head,
|
|
364
|
+
);
|
|
365
|
+
return (
|
|
366
|
+
rrsiCanonical(after.branchHeads) !== rrsiCanonical(expectedHeads) ||
|
|
367
|
+
["tokens", "toolCalls", "wallClockMs"].some(
|
|
368
|
+
(key) =>
|
|
369
|
+
after.aggregateMetrics[key] !==
|
|
370
|
+
before.aggregateMetrics[key] + checkpoint.metrics[key],
|
|
371
|
+
)
|
|
372
|
+
);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/** Consume the fresh history/bridge capability synchronously before the await. */
|
|
376
|
+
export async function executeRrsiPmBroadRound(bridge, response) {
|
|
377
|
+
const state = stateFor(bridge);
|
|
378
|
+
const pending = PENDING.get(response);
|
|
379
|
+
if (!pending || pending.bridge !== bridge)
|
|
380
|
+
rrsiFail(
|
|
381
|
+
"PM dispatch requires this bridge's fresh round reservation",
|
|
382
|
+
"CC_RRSI_REPLAY_FORBIDDEN",
|
|
383
|
+
);
|
|
384
|
+
PENDING.delete(response);
|
|
385
|
+
if (IN_FLIGHT.has(state.host))
|
|
386
|
+
rrsiFail("PM host is already running", "CC_RRSI_HISTORY_HOLD");
|
|
387
|
+
IN_FLIGHT.add(state.host);
|
|
388
|
+
let dispatchPersistence = "not-attempted";
|
|
389
|
+
let hostInvoked = false;
|
|
390
|
+
let result = null;
|
|
391
|
+
let driftDetected = false;
|
|
392
|
+
let failureCode = null;
|
|
393
|
+
let observationPersistence = "not-recorded";
|
|
394
|
+
const binding = {
|
|
395
|
+
executionId: response.reservation.bindings.executionId,
|
|
396
|
+
reservationDigest: response.reservation.reservationDigest,
|
|
397
|
+
};
|
|
398
|
+
try {
|
|
399
|
+
try {
|
|
400
|
+
checkRuntime(state);
|
|
401
|
+
checkHistory(state);
|
|
402
|
+
const before = assertJournal(
|
|
403
|
+
bridge,
|
|
404
|
+
state,
|
|
405
|
+
pending.journal,
|
|
406
|
+
pending.round,
|
|
407
|
+
);
|
|
408
|
+
if (rrsiCanonical(before) !== rrsiCanonical(pending.before)) {
|
|
409
|
+
driftDetected = true;
|
|
410
|
+
rrsiFail(
|
|
411
|
+
"PM journal changed after reservation",
|
|
412
|
+
"CC_RRSI_HISTORY_HOLD",
|
|
413
|
+
);
|
|
414
|
+
}
|
|
415
|
+
if (
|
|
416
|
+
response.reservation.schema !==
|
|
417
|
+
RRSI_PREPARATION_RESERVATION_SCHEMA_V2 ||
|
|
418
|
+
response.reservation.plannedExecutions < 2
|
|
419
|
+
)
|
|
420
|
+
rrsiFail("PM execution requires a v2 runner and grader reservation");
|
|
421
|
+
dispatchPersistence = "unknown";
|
|
422
|
+
const dispatch = state.history.recordDispatch(response);
|
|
423
|
+
dispatchPersistence = "persisted";
|
|
424
|
+
if (!dispatch.newlyCommitted)
|
|
425
|
+
rrsiFail(
|
|
426
|
+
"PM dispatch was already recorded",
|
|
427
|
+
"CC_RRSI_REPLAY_FORBIDDEN",
|
|
428
|
+
);
|
|
429
|
+
// Ledger I/O can outlast the earlier parent read. Recheck after durable
|
|
430
|
+
// dispatch, before entering the host; failure retains unknown accounting.
|
|
431
|
+
checkRuntime(state);
|
|
432
|
+
hostInvoked = true;
|
|
433
|
+
result = await executePmExplorationRound(
|
|
434
|
+
state.host,
|
|
435
|
+
pending.journal,
|
|
436
|
+
pending.round,
|
|
437
|
+
);
|
|
438
|
+
driftDetected = journalDrift(
|
|
439
|
+
pending.before,
|
|
440
|
+
inspectPmExplorationJournal(pending.journal),
|
|
441
|
+
pending.round,
|
|
442
|
+
result,
|
|
443
|
+
);
|
|
444
|
+
if (driftDetected) failureCode = "rrsi-pm-journal-drift";
|
|
445
|
+
} catch (error) {
|
|
446
|
+
const known = [
|
|
447
|
+
"CC_RRSI_COMMIT_UNKNOWN",
|
|
448
|
+
"CC_RRSI_HISTORY_HOLD",
|
|
449
|
+
"CC_RRSI_BUDGET_EXCEEDED",
|
|
450
|
+
"CC_RRSI_REPLAY_FORBIDDEN",
|
|
451
|
+
"CC_RRSI_PARENT_DRIFT",
|
|
452
|
+
"CC_RRSI_RUNTIME_OFF",
|
|
453
|
+
];
|
|
454
|
+
failureCode = known.includes(error?.code)
|
|
455
|
+
? error.code.toLowerCase()
|
|
456
|
+
: "rrsi-pm-execution-unresolved";
|
|
457
|
+
}
|
|
458
|
+
try {
|
|
459
|
+
if (dispatchPersistence === "persisted") {
|
|
460
|
+
state.history.recordPreparationObservation({
|
|
461
|
+
...binding,
|
|
462
|
+
observation: { result, failureCode, driftDetected },
|
|
463
|
+
});
|
|
464
|
+
observationPersistence = "persisted";
|
|
465
|
+
} else if (dispatchPersistence === "not-attempted") {
|
|
466
|
+
state.history.markUnknown(binding);
|
|
467
|
+
}
|
|
468
|
+
} catch {
|
|
469
|
+
// The event may have committed. Keep the result; readback, never execute again.
|
|
470
|
+
observationPersistence = "unknown";
|
|
471
|
+
failureCode ??= "rrsi-pm-observation-unknown";
|
|
472
|
+
}
|
|
473
|
+
return rrsiEnvelope(RRSI_PM_BRIDGE_RESULT_SCHEMA, "resultDigest", {
|
|
474
|
+
bridgeDigest: bridge.descriptor.bridgeDigest,
|
|
475
|
+
reservationDigest: binding.reservationDigest,
|
|
476
|
+
dispatchCommitted:
|
|
477
|
+
dispatchPersistence === "unknown"
|
|
478
|
+
? null
|
|
479
|
+
: dispatchPersistence === "persisted",
|
|
480
|
+
dispatchPersistence,
|
|
481
|
+
hostInvoked,
|
|
482
|
+
pmResult: result,
|
|
483
|
+
pmReceiptsVerified: result?.receiptsAuthenticated === true,
|
|
484
|
+
journalDriftDetected: driftDetected,
|
|
485
|
+
failureCode,
|
|
486
|
+
observationPersistence,
|
|
487
|
+
readbackRequired:
|
|
488
|
+
observationPersistence === "unknown" ||
|
|
489
|
+
dispatchPersistence === "unknown",
|
|
490
|
+
independentSettlementRequired: true,
|
|
491
|
+
cleanupConfirmed: null,
|
|
492
|
+
monetaryBudgetEnforced: false,
|
|
493
|
+
executionEvidenceVerified: false,
|
|
494
|
+
costEvidenceVerified: false,
|
|
495
|
+
qualityVerdictVerified: false,
|
|
496
|
+
});
|
|
497
|
+
} finally {
|
|
498
|
+
IN_FLIGHT.delete(state.host);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/** Structural PM/RRSI correspondence, without dataset provenance authority. */
|
|
2
|
+
import { verifyEvolutionEvalSuite } from "./evolution-eval-gate.js";
|
|
3
|
+
import { projectPmExplorationTrainingView } from "./pm-exploration-benchmark.js";
|
|
4
|
+
import { verifyPmExplorationPlan } from "./pm-exploration-rounds.js";
|
|
5
|
+
import { verifyRrsiCampaign } from "./rrsi-contracts.js";
|
|
6
|
+
import { rrsiTrainingSourcesDigest } from "./rrsi-preparation-contracts.js";
|
|
7
|
+
import {
|
|
8
|
+
snapshotRrsiData,
|
|
9
|
+
rrsiExact,
|
|
10
|
+
rrsiCanonical,
|
|
11
|
+
rrsiHash,
|
|
12
|
+
rrsiEnvelope,
|
|
13
|
+
rrsiFail,
|
|
14
|
+
freezeRrsiData,
|
|
15
|
+
} from "./rrsi-data.js";
|
|
16
|
+
|
|
17
|
+
export const RRSI_PM_TRAINING_MAPPING_SCHEMA =
|
|
18
|
+
"chainlesschain.rrsi-pm-training-mapping/v1";
|
|
19
|
+
const DIMENSIONS = ["template", "project", "principal", "timeWindow"];
|
|
20
|
+
const PREFIXES = ["template", "project", "principal", "time-window"];
|
|
21
|
+
|
|
22
|
+
/** Operator-only hash references; never supply holdout references to the proposer. */
|
|
23
|
+
export function projectRrsiPmTaskReferences(input) {
|
|
24
|
+
const suite = verifyEvolutionEvalSuite(snapshotRrsiData(input));
|
|
25
|
+
const training = projectPmExplorationTrainingView(suite);
|
|
26
|
+
return freezeRrsiData({
|
|
27
|
+
suiteDigest: suite.suiteDigest,
|
|
28
|
+
pmTrainingPartitionDigest: training.trainingPartitionDigest,
|
|
29
|
+
provenanceAuthenticated: false,
|
|
30
|
+
tasks: suite.tasks
|
|
31
|
+
.map((task) => ({
|
|
32
|
+
pmTaskId: task.id,
|
|
33
|
+
split: task.split,
|
|
34
|
+
pmTaskDigest: task.taskDigest,
|
|
35
|
+
// Eval taskDigest includes IDs and split. This content identity does not.
|
|
36
|
+
contentDigest: rrsiHash("chainlesschain.rrsi-pm-task-content/v1", {
|
|
37
|
+
taskType: task.taskType,
|
|
38
|
+
publicInput: task.publicInput,
|
|
39
|
+
graderId: task.graderId,
|
|
40
|
+
privateExpected: task.privateExpected,
|
|
41
|
+
}),
|
|
42
|
+
groups: Object.fromEntries(
|
|
43
|
+
DIMENSIONS.map((dimension, index) => [
|
|
44
|
+
dimension,
|
|
45
|
+
`sha256:${task.groupKeys[index].slice(PREFIXES[index].length + 1)}`,
|
|
46
|
+
]),
|
|
47
|
+
),
|
|
48
|
+
}))
|
|
49
|
+
.sort((left, right) => (left.pmTaskId < right.pmTaskId ? -1 : 1)),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Preserve the original training-only envelope and digest semantics. */
|
|
54
|
+
export function projectRrsiPmTrainingReferences(input) {
|
|
55
|
+
const projected = projectRrsiPmTaskReferences(input);
|
|
56
|
+
return freezeRrsiData({
|
|
57
|
+
suiteDigest: projected.suiteDigest,
|
|
58
|
+
pmTrainingPartitionDigest: projected.pmTrainingPartitionDigest,
|
|
59
|
+
provenanceAuthenticated: false,
|
|
60
|
+
tasks: projected.tasks
|
|
61
|
+
.filter((task) => task.split === "training")
|
|
62
|
+
.map((task) => {
|
|
63
|
+
const reference = { ...task };
|
|
64
|
+
delete reference.split;
|
|
65
|
+
return reference;
|
|
66
|
+
}),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function buildRrsiPmTrainingMapping(input) {
|
|
71
|
+
const value = snapshotRrsiData(input);
|
|
72
|
+
rrsiExact(value, ["campaign", "suite", "plan"], "PM training mapping input");
|
|
73
|
+
const campaign = verifyRrsiCampaign(value.campaign);
|
|
74
|
+
verifyPmExplorationPlan(value.plan);
|
|
75
|
+
const plan = value.plan;
|
|
76
|
+
const projection = projectRrsiPmTrainingReferences(value.suite);
|
|
77
|
+
if (
|
|
78
|
+
plan.suiteDigest !== projection.suiteDigest ||
|
|
79
|
+
plan.trainingPartitionDigest !== projection.pmTrainingPartitionDigest
|
|
80
|
+
)
|
|
81
|
+
rrsiFail("PM plan differs from verified training suite");
|
|
82
|
+
if (plan.environmentDigest !== campaign.execution.environmentDigest)
|
|
83
|
+
rrsiFail("PM plan environment differs from campaign");
|
|
84
|
+
if (plan.trainingTaskIds.length > 256)
|
|
85
|
+
rrsiFail("PM accessible training set exceeds preparation source limit");
|
|
86
|
+
const pmTasks = new Map(
|
|
87
|
+
projection.tasks.map((task) => [task.pmTaskId, task]),
|
|
88
|
+
);
|
|
89
|
+
const rrsiTasks = new Map(
|
|
90
|
+
campaign.dataset.tasks
|
|
91
|
+
.filter((task) => task.partition === "train")
|
|
92
|
+
.map((task) => [task.contentDigest, task]),
|
|
93
|
+
);
|
|
94
|
+
const mappings = [...plan.trainingTaskIds].sort().map((id) => {
|
|
95
|
+
const task = pmTasks.get(id);
|
|
96
|
+
if (!task) rrsiFail("PM accessible task is outside verified training");
|
|
97
|
+
const source = rrsiTasks.get(task.contentDigest);
|
|
98
|
+
if (!source || rrsiCanonical(source.groups) !== rrsiCanonical(task.groups))
|
|
99
|
+
rrsiFail(
|
|
100
|
+
"PM training content or source groups do not match RRSI training",
|
|
101
|
+
);
|
|
102
|
+
return { ...task, rrsiTaskId: source.id };
|
|
103
|
+
});
|
|
104
|
+
if (new Set(mappings.map((row) => row.rrsiTaskId)).size !== mappings.length)
|
|
105
|
+
rrsiFail("PM training mapping is not one to one");
|
|
106
|
+
return rrsiEnvelope(
|
|
107
|
+
RRSI_PM_TRAINING_MAPPING_SCHEMA,
|
|
108
|
+
"trainingMappingDigest",
|
|
109
|
+
{
|
|
110
|
+
campaignDigest: campaign.campaignDigest,
|
|
111
|
+
suiteDigest: projection.suiteDigest,
|
|
112
|
+
planDigest: plan.planDigest,
|
|
113
|
+
rrsiTrainingPartitionDigest: campaign.dataset.pools.train.partitionDigest,
|
|
114
|
+
pmTrainingPartitionDigest: projection.pmTrainingPartitionDigest,
|
|
115
|
+
trainingSourceDigest: rrsiTrainingSourcesDigest(
|
|
116
|
+
campaign,
|
|
117
|
+
mappings.map((row) => row.rrsiTaskId),
|
|
118
|
+
),
|
|
119
|
+
parentReleaseDigest: campaign.parentReleaseDigest,
|
|
120
|
+
initialMemoryDigest: plan.initialMemoryDigest,
|
|
121
|
+
mappings,
|
|
122
|
+
correspondenceVerified: true,
|
|
123
|
+
mappingAuthenticated: false,
|
|
124
|
+
parentProvenanceVerified: false,
|
|
125
|
+
},
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export function verifyRrsiPmTrainingMapping(mapping, context) {
|
|
130
|
+
const normalized = buildRrsiPmTrainingMapping(context);
|
|
131
|
+
if (rrsiCanonical(snapshotRrsiData(mapping)) !== rrsiCanonical(normalized))
|
|
132
|
+
rrsiFail("PM training mapping or structural flags differ");
|
|
133
|
+
return normalized;
|
|
134
|
+
}
|