chainlesschain 0.166.22 → 0.166.25
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 +46 -3
- package/package.json +4 -3
- package/src/assets/web-panel/assets/{AIOps-oJ7USzMC.js → AIOps-RaxL_QQD.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BlgnZe_C.js → ActionButton-DD3ieFO-.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-D2rRbTLu.js → Analytics-CATDJukS.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-FwS3f0B2.js → AppLayout-BHGsnRDS.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-iF-_08Hi.js → Artifacts-BL6NunjN.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-D24p0zQw.js → Audit-D0nEWfbA.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-Cg3mRVi9.js → BackgroundAgents-BAP1MUol.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-EOqht3H-.js → Backup-R4y2OeSi.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-9XWYq2hj.js → BaseInput-ByQZ2z6S.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Dq5yardA.js → Chat-32uV--xF.js} +4 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-t1enanwz.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-CuyCBoBf.js → Checkbox-D1CB-7bq.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DjWtYHNe.js → Codegen-BPx3dQ2q.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CrVr_iuG.js → Col-DkPTQ2Gl.js} +1 -1
- package/src/assets/web-panel/assets/{Community-C6QxpfGc.js → Community-ZriaxRlr.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-B-v5r6Pa.js → Compact-C_qJ0P7F.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-zNiLiFgD.js → Compliance-Bgoy-saS.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-D9K7lMOu.js → Cowork-B5i9y6XK.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-DAjO36z4.js → Cron-D7vBJ5-J.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-Bxqn0aqB.js → Crosschain-D4kvoGI_.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DfRmLUe-.js → DID-BLOeBd-r.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-Cz8KF3fr.js → Dashboard-mecJaonC.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-C4oVfkP0.js → Dropdown-GPKwaFer.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-ivyZKN8k.js → EmailListRenderer-BML9m7Dd.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DoxY1CPW.js → FamilyGuardDashboard-DN5bAtJC.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-C93gZxnb.js → Federation-DmD6Gecd.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-D_lEjYJE.js → FormItemContext-6wwplN_K.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BNFN9YjN.js → GenericCardRenderer-DUhpLkDL.js} +1 -1
- package/src/assets/web-panel/assets/{Git-mUu2HcLI.js → Git-eJfyXkwf.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CNuosrge.js → Governance-swAUW59x.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DwY5pbCB.js → Inference-CbdwJPDJ.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-aRUxhACD.js → KnowledgeGraph-UuYpg1nm.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DFfsWYy_.js → Logs-CS0G057y.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BxIIB4k3.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-COI-ciM-.js → Marketplace-CZRjuvvI.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BJJwaIpe.js → McpTools-BOJ9A_Rf.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-CDO6SGDZ.js → Memory-BnkrR-Ok.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BlZ5tFf4.js → MobileBridge-Do4mPi13.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DuoxbgWz.js → MobileProjects-2JxWa6-p.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-6ec9j70b.js → Mtc-CS_mnpGd.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-BuL7HkC7.js → MtcAudit-DZ4J_351.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-CJxR85lk.js → Multisig-Jh74zKXu.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-B71O1S4l.js → NLProgramming-_4n2BfnS.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Bsw5zbpV.js → Notes-CtENcKHv.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BnAhXuK_.js → NotificationSettings-dgDCvpK9.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BJ0R5GGz.js → OrderTableRenderer-D5VxCrmG.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-B7wwNxoP.js → Organization-CpIF8Xkd.js} +2 -2
- package/src/assets/web-panel/assets/{Overflow-CfAGr0gM.js → Overflow-aHnBZaez.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-KhMg22Fz.js → P2P-8ppzog2V.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-NdAXI9ft.js → PdhVaultBrowser-D3p1BXkp.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CIYjqyT7.js → Permissions-D7vflD5q.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-D2ht3P_R.js → PersonalDataHub-D2hY-Ek2.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-i6flZW1m.js → Pipeline-qK2VqhJC.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DE0lhYVc.js → Privacy-DHJr4uu0.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BL3YbyxS.js → ProjectInit-DMBS6trm.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CEtdg7ni.js → ProjectSettings-D3Ng74BT.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-CvtU5peJ.js → Projects-BfJFZiIW.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DKt_Cg-j.js → Providers-DlNA95G0.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DA61jNSx.js → QrScannerModal-CMOIYxIm.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-fS9ryUmq.js → QuickAsk-D6MyGp5I.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CR9dZU5Y.js → Recommend-W6WcShtf.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BV0BR2Dz.js → RemoteSession-Dm_MjlV_.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-BIeGUvYD.js → Reputation-Ctvij6eX.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DHDT1aro.js → Row-DivbeDE-.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-Cq6YKb1h.js → RssFeed-D4famoAw.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DEF6vsy6.js → Search-6gOAh3zG.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CHtYiKY9.js → Security-DApb9kK8.js} +4 -4
- package/src/assets/web-panel/assets/{Services-u16lvBJN.js → Services-B8OomyE2.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CGbizyDj.js → Skeleton-BTJ2g2E3.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BZMQcAa7.js → Skills-NIRr4DD1.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Bm-CycVi.js → Sla-BQHP_6px.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BudpA5kr.js → SpeechSettings-BVQTDSVS.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-B8q1C1eC.js → SyncSettings-BOD4Mar6.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-SU1pBWc-.js → Tasks-Ciu7H2-y.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CyOfJzmt.js → Templates-CtlwavRU.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-xqWSm2GP.js → Tenant-QLWYJdL6.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-D1Ttgjsi.js → Terminal-B3q10mjm.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Da2lYs5D.js → TimelineRenderer-CqltBA_8.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-B34-SduO.js → Tokens-CJOKrj4y.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-C8zyYm4R.js → Trigger-CPMGgfdM.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-D1Pvqems.js → Trust-DiJms7Bl.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-Do3VVnAy.js → UkeySign-rakR8eel.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-Dz7egVIA.js → VideoEditing-DAWZUM5o.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Dcuw-OxR.js → Wallet-DqUPnl7K.js} +3 -3
- package/src/assets/web-panel/assets/{WebAuthn-DPlw-QsB.js → WebAuthn-BnVUwvMm.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-h4OsnU5q.js → WorkflowEditor-B1CAwxgs.js} +1 -1
- package/src/assets/web-panel/assets/{chat-eO9wEwrW.js → chat-k2-0Jzfy.js} +1 -1
- package/src/assets/web-panel/assets/{colors-34lSmOXw.js → colors-BAu8xBmW.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CK4kEWJ4.js → compact-item-DMlqcdfI.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-E0A57xed.js → createContext-BU9kfiSw.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DuGrUMAS.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BD9ZMGAl.js → hasIn-2vacgdcl.js} +1 -1
- package/src/assets/web-panel/assets/{index--N0u6kTG.js → index-B-C-Ruft.js} +1 -1
- package/src/assets/web-panel/assets/{index-DzXjP44T.js → index-B7wDjYUd.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZBaqe3d.js → index-BMq0frKK.js} +1 -1
- package/src/assets/web-panel/assets/{index-DrOalGut.js → index-BUX4W-2v.js} +1 -1
- package/src/assets/web-panel/assets/{index-CT1_eRL-.js → index-BZz2eB33.js} +1 -1
- package/src/assets/web-panel/assets/{index-DrsDA_md.js → index-BblNQlaA.js} +1 -1
- package/src/assets/web-panel/assets/{index-DP-UZAQN.js → index-BdfKoqsK.js} +1 -1
- package/src/assets/web-panel/assets/{index-DiT_REby.js → index-Bf8YofPE.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cx3Jn1r0.js → index-Bn8tARil.js} +1 -1
- package/src/assets/web-panel/assets/{index-B0rkHxKK.js → index-Bpe2CJd-.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_G_ElKO.js → index-BxctzdYQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-MIg5Z8qe.js → index-C24NoPpy.js} +1 -1
- package/src/assets/web-panel/assets/{index-BmNbU2Z6.js → index-C5C4kSi8.js} +1 -1
- package/src/assets/web-panel/assets/{index-BsGmo6v1.js → index-C6ICn9Y6.js} +1 -1
- package/src/assets/web-panel/assets/{index-CsrKJJcX.js → index-C8ldqZi6.js} +1 -1
- package/src/assets/web-panel/assets/{index-BbX_Dted.js → index-C9WsM29I.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ch175NUw.js → index-CONPVaxw.js} +1 -1
- package/src/assets/web-panel/assets/{index-DONOUtlz.js → index-CPyYXKFB.js} +1 -1
- package/src/assets/web-panel/assets/{index-DFLE2qO9.js → index-CSvSf9px.js} +1 -1
- package/src/assets/web-panel/assets/{index-o8pYehRq.js → index-CXmpR6N3.js} +3 -3
- package/src/assets/web-panel/assets/{index-Cz3unNfL.js → index-Chybe7Ge.js} +1 -1
- package/src/assets/web-panel/assets/{index-yAGBu2E0.js → index-CyXmP3PW.js} +1 -1
- package/src/assets/web-panel/assets/{index-CuSau5ya.js → index-DCusBOqR.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcE1BspQ.js → index-DH01oIaj.js} +1 -1
- package/src/assets/web-panel/assets/{index-DrSAAuJj.js → index-DHg3LMNP.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZkFMeWL.js → index-DWLTSIka.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvKcroix.js → index-DaUGdvtU.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bjs90Eh9.js → index-DcA-tEQd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGRxt5wj.js → index-DfWvcu4p.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCn-ECvK.js → index-DmZNnZz7.js} +1 -1
- package/src/assets/web-panel/assets/index-DvFfMAux.js +1 -0
- package/src/assets/web-panel/assets/{index-8qMA1DWQ.js → index-JsyGqKmD.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4bB_x_v.js → index-TtrpHmYx.js} +1 -1
- package/src/assets/web-panel/assets/{index-Brqc9Emx.js → index-Ygh0wmKz.js} +1 -1
- package/src/assets/web-panel/assets/{index-Da5fmOHB.js → index-dIYqw3f0.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpfisY1g.js → index-hDHHJYno.js} +1 -1
- package/src/assets/web-panel/assets/index-n6p-1A77.js +1 -0
- package/src/assets/web-panel/assets/{index-DeXNCyQJ.js → index-oElehY4F.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcbgVLOH.js → index-z4_YwZDW.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DMTkAomF.js → initDefaultProps-B9OXWu2e.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Cnti1F5g.js → motion-IQ47MCDQ.js} +1 -1
- package/src/assets/web-panel/assets/{move-CGxmHUga.js → move-CLCU4kjV.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-CuwwLoq7.js → mtc-parser-CXnVlSPq.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BpdlTkPM.js → omit-BJjLXB0f.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-D7nWrThp.js → pickAttrs-BHdtvdy6.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Bhx0TV8F.js → placementArrow-oq8X_Bwc.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CZ1KesZh.js → responsiveObserve-DTD02LAO.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CnldF8J6.js → slide-DbEeq8to.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CZfo_GOA.js → statusUtils-Do2fy1CJ.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-B2QCcAv5.js → styleChecker-CFWD63T-.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DzzjIS4J.js → useFlexGapSupport-BeozAWOo.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-B_atg9M0.js → useFs-0-rIgnBL.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DhZs3QYN.js → usePersonalDataHub-CeiNoI31.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DcePTYAm.js → vnode-Dj0ReRNg.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BYmlnjRk.js → zoom-DD7MC4Dy.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +3 -3
- package/src/commands/agent.js +18 -1
- package/src/commands/evolution-benchmark.js +72 -0
- package/src/commands/evolution-knowledge.js +40 -1
- package/src/commands/evolution.js +2 -0
- package/src/commands/governed-skill-marketplace.js +142 -0
- package/src/commands/marketplace.js +4 -1
- package/src/commands/serve.js +21 -0
- package/src/commands/skill.js +3 -0
- package/src/data/changelog.json +39 -0
- package/src/gateways/ws/ws-agent-handler.js +59 -2
- package/src/gateways/ws/ws-server.js +2 -0
- package/src/generated/cc-agent-protocol.schema.json +3 -1
- package/src/harness/golden-transcript.js +1 -0
- package/src/harness/prompt-compressor.js +51 -5
- package/src/harness/provider-backed-compaction.js +28 -1
- package/src/harness/remote-session-registry.js +15 -3
- package/src/index.js +20 -2
- package/src/lazy-dispatch.js +6 -0
- package/src/lib/advisor-runtime.js +55 -2
- package/src/lib/app-server/cli-agent-kernel-adapter.js +4 -0
- package/src/lib/app-server/graph-runtime.js +32 -0
- package/src/lib/app-server/server.js +94 -1
- package/src/lib/app-server/websocket-transport.js +15 -0
- package/src/lib/autonomous-agent.js +63 -13
- package/src/lib/cowork/ab-comparator-cli.js +4 -3
- package/src/lib/cowork/debate-review-cli.js +4 -3
- package/src/lib/cowork/decision-kb-cli.js +5 -0
- package/src/lib/cowork-adapter.js +38 -16
- package/src/lib/evolution/agent-evolution-ingress.js +95 -15
- package/src/lib/evolution/agent-evolution-runtime-composition.js +82 -0
- package/src/lib/evolution/agent-evolution-session-lifecycle.js +46 -0
- package/src/lib/evolution/agent-model-projection.js +437 -0
- package/src/lib/evolution/bounded-descriptor-read.js +29 -0
- package/src/lib/evolution/controlled-skill-pilot-ledger-adapter.js +551 -0
- package/src/lib/evolution/controlled-skill-production-pilot.js +308 -18
- package/src/lib/evolution/evidence-backed-wiki-maintainer.js +32 -10
- package/src/lib/evolution/evidence-json-text.js +236 -0
- package/src/lib/evolution/evolution-artifact-ports.js +196 -21
- package/src/lib/evolution/evolution-deployment-loader.js +240 -2
- package/src/lib/evolution/evolution-eval-child-evidence-ledger-adapter.js +373 -0
- package/src/lib/evolution/evolution-eval-gate.js +14 -1
- package/src/lib/evolution/evolution-eval-process-supervisor-worker.mjs +14 -0
- package/src/lib/evolution/evolution-eval-process-supervisor.js +607 -0
- package/src/lib/evolution/evolution-evidence-artifact-adapter.js +14 -1
- package/src/lib/evolution/evolution-evidence-projector.js +271 -37
- package/src/lib/evolution/evolution-file-witness.js +153 -30
- package/src/lib/evolution/evolution-ledger-ports.js +1219 -66
- package/src/lib/evolution/evolution-ledger.js +66 -2
- package/src/lib/evolution/evolution-raw-crypto-shred.js +29 -15
- package/src/lib/evolution/evolution-raw-deletion-ledger-adapter.js +865 -0
- package/src/lib/evolution/evolution-release-train-domain-stages.js +769 -0
- package/src/lib/evolution/evolution-release-train-stage-output-ledger-adapter.js +333 -0
- package/src/lib/evolution/evolution-release-train.js +54 -6
- package/src/lib/evolution/evolution-workbench-batch-executor.js +101 -144
- package/src/lib/evolution/evolution-workbench-control-ports.js +203 -0
- package/src/lib/evolution/evolution-workbench-file-resources.js +403 -0
- package/src/lib/evolution/evolution-workbench-projection.js +134 -26
- package/src/lib/evolution/evolution-workbench-registry-source.js +482 -0
- package/src/lib/evolution/evolution-workbench-review-ledger-adapter.js +823 -0
- package/src/lib/evolution/evolution-workbench-review-protocol.js +157 -0
- package/src/lib/evolution/evolution-workbench-rollback-authorization.js +57 -0
- package/src/lib/evolution/evolution-workbench-rollback-ledger-adapter.js +1016 -0
- package/src/lib/evolution/evolution-workbench-runtime.js +133 -0
- package/src/lib/evolution/evolution-workbench-version-control.js +70 -36
- package/src/lib/evolution/evolvable-artifact-ledger-adapter.js +48 -0
- package/src/lib/evolution/governed-knowledge-candidate-rejection.js +343 -0
- package/src/lib/evolution/governed-knowledge-dependency-authority.js +227 -44
- package/src/lib/evolution/governed-knowledge-dependency-inventory.js +392 -0
- package/src/lib/evolution/governed-knowledge-dependency-ledger-executor.js +217 -82
- package/src/lib/evolution/governed-knowledge-quarantine-release.js +1013 -0
- package/src/lib/evolution/governed-knowledge-record.js +148 -0
- package/src/lib/evolution/governed-knowledge-revocation-host.js +59 -0
- package/src/lib/evolution/governed-knowledge-revocation-record.js +135 -0
- package/src/lib/evolution/governed-knowledge-skill-rollback.js +510 -0
- package/src/lib/evolution/governed-knowledge-sync.js +181 -95
- package/src/lib/evolution/governed-knowledge-wiki-tombstone.js +516 -0
- package/src/lib/evolution/governed-skill-marketplace-badge.js +208 -0
- package/src/lib/evolution/governed-skill-marketplace-candidate.js +330 -0
- package/src/lib/evolution/governed-skill-marketplace-cli-host.js +308 -0
- package/src/lib/evolution/governed-skill-marketplace-ledger-adapter.js +420 -0
- package/src/lib/evolution/governed-skill-marketplace.js +288 -5
- package/src/lib/evolution/governed-wiki-pruning-journal.js +302 -0
- package/src/lib/evolution/governed-wiki-pruning-ledger-adapter.js +459 -0
- package/src/lib/evolution/governed-wiki-pruning-maintenance.js +576 -0
- package/src/lib/evolution/governed-wiki-pruning-plan-authority.js +169 -0
- package/src/lib/evolution/governed-wiki-pruning-raw-shred.js +207 -0
- package/src/lib/evolution/governed-wiki-pruning-retrieval.js +587 -0
- package/src/lib/evolution/governed-wiki-pruning-runtime.js +153 -0
- package/src/lib/evolution/governed-wiki-pruning-skill-rollback.js +360 -0
- package/src/lib/evolution/governed-wiki-pruning.js +322 -143
- package/src/lib/evolution/independent-skill-revocation-source.js +231 -0
- package/src/lib/evolution/knowledge-wiki-source-admission.js +283 -0
- package/src/lib/evolution/knowledge-wiki-source-provenance.js +360 -0
- package/src/lib/evolution/progressive-canary-external-watchdog.js +578 -0
- package/src/lib/evolution/progressive-canary-traffic-worker.js +628 -0
- package/src/lib/evolution/progressive-canary-watchdog-file-store.js +285 -0
- package/src/lib/evolution/progressive-canary-watchdog-node-pki.js +265 -0
- package/src/lib/evolution/skill-candidate-registry.js +43 -3
- package/src/lib/evolution/skill-promotion-controller.js +25 -0
- package/src/lib/evolution/skill-promotion-review-ledger-adapter.js +100 -0
- package/src/lib/evolution/skill-registry-transition-ledger-adapter.js +131 -2
- package/src/lib/evolution/skill-release-registry.js +168 -4
- package/src/lib/evolution/skill-retrieval-revocation-authority.js +361 -0
- package/src/lib/evolution/skill-retrieval-revocation-ledger-adapter.js +346 -0
- package/src/lib/evolution/skill-revocation-propagation.js +467 -0
- package/src/lib/evolution/skill-target-matrix-eval.js +162 -11
- package/src/lib/evolution/skill-wiki-reconciliation.js +985 -0
- package/src/lib/evolution/skill-writer-inventory-manifest.js +8 -6
- package/src/lib/evolution/statistical-progressive-canary.js +165 -3
- package/src/lib/evolution/structured-memory-agent-control-plane.js +120 -0
- package/src/lib/evolution/structured-memory-authority-ledger-adapter.js +5 -1
- package/src/lib/evolution/structured-memory-promotion-receipt-writer.js +126 -0
- package/src/lib/evolution/wiki-informed-skill-proposer.js +127 -21
- package/src/lib/evolution/wiki-maintainer-ledger-adapter.js +822 -101
- package/src/lib/evolution/wiki-revision-protocol.js +120 -0
- package/src/lib/evolution/wiki-skill-proposal-ledger-adapter.js +307 -0
- package/src/lib/evolution/wiki-target-tombstone-revision.js +109 -0
- package/src/lib/evolution/wikiskill-benchmark-cli-host.js +178 -0
- package/src/lib/evolution/wikiskill-benchmark-execution-host.js +702 -0
- package/src/lib/evolution/wikiskill-benchmark-ledger-adapter.js +613 -0
- package/src/lib/evolution/wikiskill-benchmark.js +80 -16
- package/src/lib/goal-assess.js +17 -10
- package/src/lib/interactive-planner.js +9 -1
- package/src/lib/iteration-budget.js +16 -2
- package/src/lib/micro-compact.js +4 -1
- package/src/lib/model-failure-policy.js +21 -0
- package/src/lib/process-execution-broker/index.js +1 -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 +33 -15
- package/src/lib/read-file-loop-guard.js +113 -0
- package/src/lib/read-file-page.js +191 -0
- package/src/lib/runnable-provider.js +2 -1
- package/src/lib/skill-retrieval-router.js +22 -1
- package/src/repl/agent-repl.js +133 -34
- package/src/runtime/agent-core.js +196 -74
- package/src/runtime/agent-runtime.js +43 -0
- package/src/runtime/coding-agent-contract-shared.cjs +7 -1
- package/src/runtime/fallback-model.js +143 -62
- package/src/runtime/headless-runner.js +54 -10
- package/src/runtime/headless-stream.js +50 -6
- package/src/runtime/runtime-factory.js +41 -2
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Ds3pA-ET.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-DqTx7_u1.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CF3xafX2.js +0 -1
- package/src/assets/web-panel/assets/index-C907rPwd.js +0 -1
- package/src/assets/web-panel/assets/index-wueRSK2d.js +0 -1
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { types as utilTypes } from "node:util";
|
|
3
3
|
|
|
4
|
+
import {
|
|
5
|
+
isProgressiveCanaryGateAuthority,
|
|
6
|
+
nextProgressiveCanaryStage,
|
|
7
|
+
verifyProgressiveCanaryPlan,
|
|
8
|
+
} from "./statistical-progressive-canary.js";
|
|
9
|
+
import {
|
|
10
|
+
SKILL_WIKI_PILOT_OUTCOME_SCHEMA,
|
|
11
|
+
createSkillWikiPilotReconciliationSource,
|
|
12
|
+
} from "./skill-wiki-reconciliation.js";
|
|
13
|
+
|
|
4
14
|
export const CONTROLLED_SKILL_PILOT_SCHEMA =
|
|
5
15
|
"chainlesschain.controlled-skill-production-pilot/v1";
|
|
6
16
|
export const CONTROLLED_SKILL_PILOT_STATE_SCHEMA =
|
|
7
17
|
"chainlesschain.controlled-skill-production-pilot-state/v1";
|
|
18
|
+
export const CONTROLLED_SKILL_PILOT_PROGRESSIVE_STATE_SCHEMA =
|
|
19
|
+
"chainlesschain.controlled-skill-production-pilot-state/v2";
|
|
8
20
|
export const CONTROLLED_SKILL_PILOT_EVENT_SCHEMA =
|
|
9
21
|
"chainlesschain.controlled-skill-production-pilot-event/v1";
|
|
10
22
|
|
|
@@ -12,6 +24,7 @@ export const CONTROLLED_SKILL_PILOT_STAGE = Object.freeze({
|
|
|
12
24
|
CANDIDATE: "candidate",
|
|
13
25
|
SHADOW: "shadow",
|
|
14
26
|
CANARY: "canary",
|
|
27
|
+
ACTIVE_PROBATION: "active-probation",
|
|
15
28
|
ACTIVE: "active",
|
|
16
29
|
ROLLED_BACK: "rolled-back",
|
|
17
30
|
});
|
|
@@ -50,6 +63,14 @@ function hash(value) {
|
|
|
50
63
|
return `sha256:${createHash("sha256").update(canonical(value)).digest("hex")}`;
|
|
51
64
|
}
|
|
52
65
|
|
|
66
|
+
export function digestControlledSkillPilotState(value) {
|
|
67
|
+
return hash(value);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function digestControlledSkillPilotEvent(value) {
|
|
71
|
+
return hash(value);
|
|
72
|
+
}
|
|
73
|
+
|
|
53
74
|
function clone(value) {
|
|
54
75
|
return value == null ? value : JSON.parse(JSON.stringify(value));
|
|
55
76
|
}
|
|
@@ -264,9 +285,15 @@ function normalizeDescriptor(input) {
|
|
|
264
285
|
return deepFreeze(normalized);
|
|
265
286
|
}
|
|
266
287
|
|
|
267
|
-
function
|
|
268
|
-
return
|
|
269
|
-
|
|
288
|
+
export function digestControlledSkillPilotDescriptor(input) {
|
|
289
|
+
return hash(normalizeDescriptor(input));
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
function emptyState(descriptorDigest, progressive = null) {
|
|
293
|
+
const state = {
|
|
294
|
+
schema: progressive
|
|
295
|
+
? CONTROLLED_SKILL_PILOT_PROGRESSIVE_STATE_SCHEMA
|
|
296
|
+
: CONTROLLED_SKILL_PILOT_STATE_SCHEMA,
|
|
270
297
|
descriptorDigest,
|
|
271
298
|
revision: 0,
|
|
272
299
|
stage: CONTROLLED_SKILL_PILOT_STAGE.CANDIDATE,
|
|
@@ -278,28 +305,86 @@ function emptyState(descriptorDigest) {
|
|
|
278
305
|
pendingTransition: null,
|
|
279
306
|
lastTransitionReceiptDigest: null,
|
|
280
307
|
};
|
|
308
|
+
if (progressive) {
|
|
309
|
+
state.progressivePlanDigest = progressive.plan.planDigest;
|
|
310
|
+
state.progressiveStepId = null;
|
|
311
|
+
state.progressiveGateReceiptDigests = [];
|
|
312
|
+
}
|
|
313
|
+
return state;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
function progressiveStateIsCoherent(state, progressive) {
|
|
317
|
+
if (!progressive) return true;
|
|
318
|
+
const digests = state.progressiveGateReceiptDigests;
|
|
319
|
+
if (
|
|
320
|
+
!Array.isArray(digests) ||
|
|
321
|
+
digests.length > progressive.plan.steps.length ||
|
|
322
|
+
new Set(digests).size !== digests.length
|
|
323
|
+
) {
|
|
324
|
+
return false;
|
|
325
|
+
}
|
|
326
|
+
const effectiveStage = state.pendingTransition?.request?.to ?? state.stage;
|
|
327
|
+
if (effectiveStage === CONTROLLED_SKILL_PILOT_STAGE.ROLLED_BACK) {
|
|
328
|
+
return (
|
|
329
|
+
state.progressiveStepId === null ||
|
|
330
|
+
progressive.plan.steps.some(
|
|
331
|
+
({ id: stepId }) => stepId === state.progressiveStepId,
|
|
332
|
+
)
|
|
333
|
+
);
|
|
334
|
+
}
|
|
335
|
+
if (effectiveStage === CONTROLLED_SKILL_PILOT_STAGE.CANDIDATE) {
|
|
336
|
+
return state.progressiveStepId === null && digests.length === 0;
|
|
337
|
+
}
|
|
338
|
+
if (effectiveStage === CONTROLLED_SKILL_PILOT_STAGE.ACTIVE) {
|
|
339
|
+
return (
|
|
340
|
+
state.progressiveStepId === null &&
|
|
341
|
+
digests.length === progressive.plan.steps.length
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
const index = progressive.plan.steps.findIndex(
|
|
345
|
+
({ id: stepId, stage }) =>
|
|
346
|
+
stepId === state.progressiveStepId && stage === effectiveStage,
|
|
347
|
+
);
|
|
348
|
+
return index >= 0 && digests.length === index;
|
|
281
349
|
}
|
|
282
350
|
|
|
283
|
-
function normalizeRestore(input, descriptorDigest) {
|
|
351
|
+
function normalizeRestore(input, descriptorDigest, progressive) {
|
|
284
352
|
plain(input, "pilot restore");
|
|
285
353
|
const state = plain(input.state, "pilot restore.state");
|
|
286
354
|
if (
|
|
287
355
|
input.authenticated !== true ||
|
|
288
356
|
input.durable !== true ||
|
|
289
357
|
input.descriptorDigest !== descriptorDigest ||
|
|
290
|
-
input.stateDigest !==
|
|
291
|
-
state.schema !==
|
|
358
|
+
input.stateDigest !== digestControlledSkillPilotState(state) ||
|
|
359
|
+
state.schema !==
|
|
360
|
+
(progressive
|
|
361
|
+
? CONTROLLED_SKILL_PILOT_PROGRESSIVE_STATE_SCHEMA
|
|
362
|
+
: CONTROLLED_SKILL_PILOT_STATE_SCHEMA) ||
|
|
292
363
|
state.descriptorDigest !== descriptorDigest ||
|
|
293
364
|
!STAGES.has(state.stage) ||
|
|
294
365
|
!Number.isSafeInteger(state.revision) ||
|
|
295
366
|
state.revision < 0 ||
|
|
296
367
|
!Array.isArray(state.observations) ||
|
|
368
|
+
(progressive === null
|
|
369
|
+
? state.progressivePlanDigest !== undefined ||
|
|
370
|
+
state.progressiveStepId !== undefined ||
|
|
371
|
+
state.progressiveGateReceiptDigests !== undefined
|
|
372
|
+
: state.progressivePlanDigest !== progressive.plan.planDigest ||
|
|
373
|
+
(state.progressiveStepId !== null &&
|
|
374
|
+
!progressive.plan.steps.some(
|
|
375
|
+
({ id: stepId }) => stepId === state.progressiveStepId,
|
|
376
|
+
)) ||
|
|
377
|
+
!Array.isArray(state.progressiveGateReceiptDigests) ||
|
|
378
|
+
state.progressiveGateReceiptDigests.some(
|
|
379
|
+
(value) => !DIGEST.test(value),
|
|
380
|
+
)) ||
|
|
297
381
|
(state.pendingTransition !== null &&
|
|
298
382
|
(!state.pendingTransition ||
|
|
299
383
|
typeof state.pendingTransition !== "object" ||
|
|
300
384
|
state.pendingTransition.requestDigest !==
|
|
301
385
|
hash(state.pendingTransition.request) ||
|
|
302
|
-
state.pendingTransition.request?.from !== state.stage))
|
|
386
|
+
state.pendingTransition.request?.from !== state.stage)) ||
|
|
387
|
+
!progressiveStateIsCoherent(state, progressive)
|
|
303
388
|
) {
|
|
304
389
|
fail(
|
|
305
390
|
CONTROLLED_SKILL_PILOT_ERROR.PERSISTENCE_FAILED,
|
|
@@ -309,6 +394,37 @@ function normalizeRestore(input, descriptorDigest) {
|
|
|
309
394
|
return clone(state);
|
|
310
395
|
}
|
|
311
396
|
|
|
397
|
+
function normalizeProgressiveCanary(input, descriptor) {
|
|
398
|
+
if (input == null) return null;
|
|
399
|
+
plain(input, "progressive Canary configuration");
|
|
400
|
+
if (
|
|
401
|
+
Reflect.ownKeys(input).length !== 2 ||
|
|
402
|
+
!Object.hasOwn(input, "plan") ||
|
|
403
|
+
!Object.hasOwn(input, "gateAuthority")
|
|
404
|
+
) {
|
|
405
|
+
throw new TypeError("progressive Canary configuration is not exact");
|
|
406
|
+
}
|
|
407
|
+
const plan = verifyProgressiveCanaryPlan(input.plan);
|
|
408
|
+
if (!isProgressiveCanaryGateAuthority(input.gateAuthority)) {
|
|
409
|
+
throw new TypeError(
|
|
410
|
+
"a branded progressive Canary gate authority is required",
|
|
411
|
+
);
|
|
412
|
+
}
|
|
413
|
+
if (
|
|
414
|
+
plan.tenantId !== descriptor.tenantId ||
|
|
415
|
+
plan.pilotId !== descriptor.pilotId ||
|
|
416
|
+
plan.skillName !== descriptor.skillName ||
|
|
417
|
+
plan.candidateDigest !== descriptor.candidateDigest ||
|
|
418
|
+
plan.baselineDigest !== descriptor.baselineDigest ||
|
|
419
|
+
input.gateAuthority.planDigest !== plan.planDigest ||
|
|
420
|
+
input.gateAuthority.tenantId !== plan.tenantId ||
|
|
421
|
+
input.gateAuthority.pilotId !== plan.pilotId
|
|
422
|
+
) {
|
|
423
|
+
throw new TypeError("progressive Canary plan is not bound to this pilot");
|
|
424
|
+
}
|
|
425
|
+
return Object.freeze({ plan, gateAuthority: input.gateAuthority });
|
|
426
|
+
}
|
|
427
|
+
|
|
312
428
|
function normalizeApproval(value, descriptor, descriptorDigest) {
|
|
313
429
|
plain(value, "review approval");
|
|
314
430
|
if (
|
|
@@ -447,9 +563,16 @@ export class ControlledSkillProductionPilot {
|
|
|
447
563
|
ports,
|
|
448
564
|
now = Date.now,
|
|
449
565
|
restore = null,
|
|
566
|
+
progressiveCanary = null,
|
|
450
567
|
} = {}) {
|
|
451
568
|
this.descriptor = normalizeDescriptor(input);
|
|
452
|
-
this.descriptorDigest =
|
|
569
|
+
this.descriptorDigest = digestControlledSkillPilotDescriptor(
|
|
570
|
+
this.descriptor,
|
|
571
|
+
);
|
|
572
|
+
this._progressiveCanary = normalizeProgressiveCanary(
|
|
573
|
+
progressiveCanary,
|
|
574
|
+
this.descriptor,
|
|
575
|
+
);
|
|
453
576
|
this._now = typeof now === "function" ? now : Date.now;
|
|
454
577
|
this._readActiveState = capture(ports, "readActiveState");
|
|
455
578
|
this._verifyApproval = capture(ports, "verifyApproval");
|
|
@@ -465,8 +588,9 @@ export class ControlledSkillProductionPilot {
|
|
|
465
588
|
descriptorDigest: this.descriptorDigest,
|
|
466
589
|
}),
|
|
467
590
|
this.descriptorDigest,
|
|
591
|
+
this._progressiveCanary,
|
|
468
592
|
)
|
|
469
|
-
: emptyState(this.descriptorDigest);
|
|
593
|
+
: emptyState(this.descriptorDigest, this._progressiveCanary);
|
|
470
594
|
}
|
|
471
595
|
|
|
472
596
|
async start({ optedIn, tenantId, cohortId } = {}) {
|
|
@@ -510,15 +634,35 @@ export class ControlledSkillProductionPilot {
|
|
|
510
634
|
await this._assertActiveUnchanged();
|
|
511
635
|
const next = clone(this._state);
|
|
512
636
|
next.reviewReceiptDigest = reviewReceiptDigest;
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
}
|
|
637
|
+
if (this._progressiveCanary) {
|
|
638
|
+
next.progressiveStepId = this._progressiveCanary.plan.steps[0].id;
|
|
639
|
+
}
|
|
640
|
+
await this._advance(
|
|
641
|
+
next,
|
|
642
|
+
CONTROLLED_SKILL_PILOT_STAGE.SHADOW,
|
|
643
|
+
{
|
|
644
|
+
reviewReceiptDigest,
|
|
645
|
+
...(this._progressiveCanary
|
|
646
|
+
? {
|
|
647
|
+
progressivePlanDigest: this._progressiveCanary.plan.planDigest,
|
|
648
|
+
progressiveStepId: next.progressiveStepId,
|
|
649
|
+
}
|
|
650
|
+
: {}),
|
|
651
|
+
},
|
|
652
|
+
{ progressive: this._progressiveCanary !== null },
|
|
653
|
+
);
|
|
516
654
|
return this.view();
|
|
517
655
|
}
|
|
518
656
|
|
|
519
657
|
async recordObservation(input) {
|
|
520
658
|
this._started();
|
|
521
659
|
this._noPending();
|
|
660
|
+
if (this._progressiveCanary) {
|
|
661
|
+
fail(
|
|
662
|
+
CONTROLLED_SKILL_PILOT_ERROR.INVALID,
|
|
663
|
+
"progressive Canary observations must enter the gate authority",
|
|
664
|
+
);
|
|
665
|
+
}
|
|
522
666
|
if (
|
|
523
667
|
![
|
|
524
668
|
CONTROLLED_SKILL_PILOT_STAGE.SHADOW,
|
|
@@ -627,9 +771,12 @@ export class ControlledSkillProductionPilot {
|
|
|
627
771
|
return this.view();
|
|
628
772
|
}
|
|
629
773
|
|
|
630
|
-
async advance() {
|
|
774
|
+
async advance(input = {}) {
|
|
631
775
|
this._started();
|
|
632
776
|
this._noPending();
|
|
777
|
+
if (this._progressiveCanary) {
|
|
778
|
+
return this._advanceProgressive(input);
|
|
779
|
+
}
|
|
633
780
|
const target = FORWARD.get(this._state.stage);
|
|
634
781
|
if (!target) {
|
|
635
782
|
fail(
|
|
@@ -693,7 +840,7 @@ export class ControlledSkillProductionPilot {
|
|
|
693
840
|
snapshot() {
|
|
694
841
|
return deepFreeze({
|
|
695
842
|
descriptorDigest: this.descriptorDigest,
|
|
696
|
-
stateDigest:
|
|
843
|
+
stateDigest: digestControlledSkillPilotState(this._state),
|
|
697
844
|
state: clone(this._state),
|
|
698
845
|
});
|
|
699
846
|
}
|
|
@@ -736,9 +883,135 @@ export class ControlledSkillProductionPilot {
|
|
|
736
883
|
cohort: clone(this.descriptor.cohort),
|
|
737
884
|
lastTransitionReceiptDigest: this._state.lastTransitionReceiptDigest,
|
|
738
885
|
reconciliationRequired: this._state.pendingTransition !== null,
|
|
886
|
+
progressiveCanary:
|
|
887
|
+
this._progressiveCanary === null
|
|
888
|
+
? null
|
|
889
|
+
: {
|
|
890
|
+
planDigest: this._state.progressivePlanDigest,
|
|
891
|
+
stepId: this._state.progressiveStepId,
|
|
892
|
+
gateReceiptDigests: clone(
|
|
893
|
+
this._state.progressiveGateReceiptDigests,
|
|
894
|
+
),
|
|
895
|
+
},
|
|
896
|
+
});
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
createWikiOutcomeSource() {
|
|
900
|
+
return createSkillWikiPilotReconciliationSource({
|
|
901
|
+
tenantId: this.descriptor.tenantId,
|
|
902
|
+
streamId: `${this.descriptor.pilotId}:wiki-outcomes`,
|
|
903
|
+
readPilotOutcomes: () => {
|
|
904
|
+
if (
|
|
905
|
+
this._state.pendingTransition !== null ||
|
|
906
|
+
this._state.lastTransitionReceiptDigest === null ||
|
|
907
|
+
this._state.activeStateDigest === null
|
|
908
|
+
) {
|
|
909
|
+
return [];
|
|
910
|
+
}
|
|
911
|
+
const stable =
|
|
912
|
+
this._progressiveCanary !== null &&
|
|
913
|
+
this._state.stage === CONTROLLED_SKILL_PILOT_STAGE.ACTIVE &&
|
|
914
|
+
this._state.progressiveStepId === null &&
|
|
915
|
+
this._state.progressiveGateReceiptDigests.length ===
|
|
916
|
+
this._progressiveCanary.plan.steps.length;
|
|
917
|
+
const rolledBack =
|
|
918
|
+
this._state.stage === CONTROLLED_SKILL_PILOT_STAGE.ROLLED_BACK;
|
|
919
|
+
if (!stable && !rolledBack) return [];
|
|
920
|
+
return [
|
|
921
|
+
{
|
|
922
|
+
schema: SKILL_WIKI_PILOT_OUTCOME_SCHEMA,
|
|
923
|
+
authenticated: true,
|
|
924
|
+
durable: true,
|
|
925
|
+
tenantId: this.descriptor.tenantId,
|
|
926
|
+
streamId: `${this.descriptor.pilotId}:wiki-outcomes`,
|
|
927
|
+
sequence: this._state.revision,
|
|
928
|
+
pilotId: this.descriptor.pilotId,
|
|
929
|
+
descriptorDigest: this.descriptorDigest,
|
|
930
|
+
candidateId: this.descriptor.candidateDigest,
|
|
931
|
+
skillName: this.descriptor.skillName,
|
|
932
|
+
outcome: stable ? "stable" : "rollback",
|
|
933
|
+
reason: stable
|
|
934
|
+
? "The statistical progressive Canary reached stable."
|
|
935
|
+
: "The production Pilot rolled back the candidate.",
|
|
936
|
+
occurredAt: new Date(this._state.stageStartedAt).toISOString(),
|
|
937
|
+
activeStateDigest: this._state.activeStateDigest,
|
|
938
|
+
evidenceReceiptDigests: [
|
|
939
|
+
...(this._state.reviewReceiptDigest === null
|
|
940
|
+
? []
|
|
941
|
+
: [this._state.reviewReceiptDigest]),
|
|
942
|
+
...(this._state.progressiveGateReceiptDigests ?? []),
|
|
943
|
+
],
|
|
944
|
+
sourceReceiptDigest: this._state.lastTransitionReceiptDigest,
|
|
945
|
+
},
|
|
946
|
+
];
|
|
947
|
+
},
|
|
739
948
|
});
|
|
740
949
|
}
|
|
741
950
|
|
|
951
|
+
async _advanceProgressive({ gateReceipt } = {}) {
|
|
952
|
+
if (this._state.stage === CONTROLLED_SKILL_PILOT_STAGE.CANDIDATE) {
|
|
953
|
+
fail(
|
|
954
|
+
CONTROLLED_SKILL_PILOT_ERROR.REVIEW_REQUIRED,
|
|
955
|
+
"shadow requires explicit durable human approval",
|
|
956
|
+
);
|
|
957
|
+
}
|
|
958
|
+
if (this._state.killSwitch) {
|
|
959
|
+
fail(
|
|
960
|
+
CONTROLLED_SKILL_PILOT_ERROR.KILL_SWITCH,
|
|
961
|
+
"pilot kill switch is set",
|
|
962
|
+
);
|
|
963
|
+
}
|
|
964
|
+
const currentStepId = this._state.progressiveStepId;
|
|
965
|
+
if (typeof currentStepId !== "string") {
|
|
966
|
+
fail(
|
|
967
|
+
CONTROLLED_SKILL_PILOT_ERROR.INVALID,
|
|
968
|
+
"progressive Canary step is unavailable",
|
|
969
|
+
);
|
|
970
|
+
}
|
|
971
|
+
let receipt;
|
|
972
|
+
let nextStep;
|
|
973
|
+
try {
|
|
974
|
+
receipt = await this._progressiveCanary.gateAuthority.verify(
|
|
975
|
+
gateReceipt,
|
|
976
|
+
{
|
|
977
|
+
stepId: currentStepId,
|
|
978
|
+
},
|
|
979
|
+
);
|
|
980
|
+
nextStep = nextProgressiveCanaryStage({
|
|
981
|
+
plan: this._progressiveCanary.plan,
|
|
982
|
+
currentStepId,
|
|
983
|
+
gateReport: receipt.report,
|
|
984
|
+
});
|
|
985
|
+
} catch (error) {
|
|
986
|
+
const failure = new Error(
|
|
987
|
+
`pilot progressive gate failed: ${error.message}`,
|
|
988
|
+
);
|
|
989
|
+
failure.code = CONTROLLED_SKILL_PILOT_ERROR.GATE_FAILED;
|
|
990
|
+
throw failure;
|
|
991
|
+
}
|
|
992
|
+
const target =
|
|
993
|
+
nextStep.stage === "stable"
|
|
994
|
+
? CONTROLLED_SKILL_PILOT_STAGE.ACTIVE
|
|
995
|
+
: nextStep.stage;
|
|
996
|
+
await this._assertActiveUnchanged();
|
|
997
|
+
const next = clone(this._state);
|
|
998
|
+
next.progressiveStepId = nextStep.stepId;
|
|
999
|
+
next.progressiveGateReceiptDigests.push(receipt.receiptDigest);
|
|
1000
|
+
await this._advance(
|
|
1001
|
+
next,
|
|
1002
|
+
target,
|
|
1003
|
+
{
|
|
1004
|
+
progressivePlanDigest: this._progressiveCanary.plan.planDigest,
|
|
1005
|
+
gateReportDigest: receipt.reportDigest,
|
|
1006
|
+
gateReceiptDigest: receipt.receiptDigest,
|
|
1007
|
+
fromStepId: currentStepId,
|
|
1008
|
+
toStepId: nextStep.stepId,
|
|
1009
|
+
},
|
|
1010
|
+
{ progressive: true },
|
|
1011
|
+
);
|
|
1012
|
+
return this.view();
|
|
1013
|
+
}
|
|
1014
|
+
|
|
742
1015
|
_started() {
|
|
743
1016
|
if (this._state.activeStateDigest === null) {
|
|
744
1017
|
fail(CONTROLLED_SKILL_PILOT_ERROR.INVALID, "pilot has not started");
|
|
@@ -777,9 +1050,26 @@ export class ControlledSkillProductionPilot {
|
|
|
777
1050
|
}
|
|
778
1051
|
}
|
|
779
1052
|
|
|
780
|
-
async _advance(next, target, evidence) {
|
|
1053
|
+
async _advance(next, target, evidence, { progressive = false } = {}) {
|
|
781
1054
|
const from = this._state.stage;
|
|
782
|
-
|
|
1055
|
+
const progressiveTransition =
|
|
1056
|
+
progressive &&
|
|
1057
|
+
((from === CONTROLLED_SKILL_PILOT_STAGE.CANDIDATE &&
|
|
1058
|
+
target === CONTROLLED_SKILL_PILOT_STAGE.SHADOW) ||
|
|
1059
|
+
(from === CONTROLLED_SKILL_PILOT_STAGE.SHADOW &&
|
|
1060
|
+
target === CONTROLLED_SKILL_PILOT_STAGE.CANARY) ||
|
|
1061
|
+
(from === CONTROLLED_SKILL_PILOT_STAGE.CANARY &&
|
|
1062
|
+
[
|
|
1063
|
+
CONTROLLED_SKILL_PILOT_STAGE.CANARY,
|
|
1064
|
+
CONTROLLED_SKILL_PILOT_STAGE.ACTIVE_PROBATION,
|
|
1065
|
+
].includes(target)) ||
|
|
1066
|
+
(from === CONTROLLED_SKILL_PILOT_STAGE.ACTIVE_PROBATION &&
|
|
1067
|
+
target === CONTROLLED_SKILL_PILOT_STAGE.ACTIVE));
|
|
1068
|
+
if (
|
|
1069
|
+
target !== CONTROLLED_PILOT_ROLLBACK &&
|
|
1070
|
+
!progressiveTransition &&
|
|
1071
|
+
FORWARD.get(from) !== target
|
|
1072
|
+
) {
|
|
783
1073
|
fail(
|
|
784
1074
|
CONTROLLED_SKILL_PILOT_ERROR.INVALID,
|
|
785
1075
|
"non-canonical pilot transition",
|
|
@@ -869,7 +1159,7 @@ export class ControlledSkillProductionPilot {
|
|
|
869
1159
|
async _commit(next, type, evidence) {
|
|
870
1160
|
const expectedRevision = this._state.revision;
|
|
871
1161
|
next.revision = expectedRevision + 1;
|
|
872
|
-
const stateDigest =
|
|
1162
|
+
const stateDigest = digestControlledSkillPilotState(next);
|
|
873
1163
|
const event = deepFreeze({
|
|
874
1164
|
schema: CONTROLLED_SKILL_PILOT_EVENT_SCHEMA,
|
|
875
1165
|
descriptorDigest: this.descriptorDigest,
|
|
@@ -882,7 +1172,7 @@ export class ControlledSkillProductionPilot {
|
|
|
882
1172
|
evidence: clone(evidence),
|
|
883
1173
|
committedAt: this._timestamp(),
|
|
884
1174
|
});
|
|
885
|
-
const eventDigest =
|
|
1175
|
+
const eventDigest = digestControlledSkillPilotEvent(event);
|
|
886
1176
|
const acknowledgement = await this._commitState({
|
|
887
1177
|
expectedRevision,
|
|
888
1178
|
state: deepFreeze(clone(next)),
|
|
@@ -11,6 +11,7 @@ export const WIKI_PATTERN_STATUS = Object.freeze({
|
|
|
11
11
|
CORROBORATED: "corroborated",
|
|
12
12
|
CONTRADICTED: "contradicted",
|
|
13
13
|
STALE: "stale",
|
|
14
|
+
QUARANTINED: "quarantined",
|
|
14
15
|
REVOKED: "revoked",
|
|
15
16
|
TOMBSTONED: "tombstoned",
|
|
16
17
|
});
|
|
@@ -47,6 +48,7 @@ const EVIDENCE_FIELDS = new Set([
|
|
|
47
48
|
const OPERATIONS = new Set([
|
|
48
49
|
"upsert",
|
|
49
50
|
"merge",
|
|
51
|
+
"quarantine",
|
|
50
52
|
"revoke",
|
|
51
53
|
"tombstone",
|
|
52
54
|
"proposal-impact",
|
|
@@ -309,9 +311,11 @@ function rebuildDerivedState(state, effectiveAt, descriptor) {
|
|
|
309
311
|
(dependents[ref] ??= []).push(pattern.patternId);
|
|
310
312
|
}
|
|
311
313
|
if (
|
|
312
|
-
[
|
|
313
|
-
|
|
314
|
-
|
|
314
|
+
[
|
|
315
|
+
WIKI_PATTERN_STATUS.QUARANTINED,
|
|
316
|
+
WIKI_PATTERN_STATUS.REVOKED,
|
|
317
|
+
WIKI_PATTERN_STATUS.TOMBSTONED,
|
|
318
|
+
].includes(pattern.status)
|
|
315
319
|
)
|
|
316
320
|
continue;
|
|
317
321
|
const positive = pattern.positiveEvidence
|
|
@@ -340,6 +344,7 @@ function rebuildDerivedState(state, effectiveAt, descriptor) {
|
|
|
340
344
|
).toFixed(6),
|
|
341
345
|
);
|
|
342
346
|
if (
|
|
347
|
+
(pattern.rollbackCount ?? 0) > 0 ||
|
|
343
348
|
positive.length === 0 ||
|
|
344
349
|
expired ||
|
|
345
350
|
pattern.operationalConfidence < descriptor.staleConfidenceFloor
|
|
@@ -372,6 +377,7 @@ function rebuildDerivedState(state, effectiveAt, descriptor) {
|
|
|
372
377
|
![
|
|
373
378
|
WIKI_PATTERN_STATUS.REVOKED,
|
|
374
379
|
WIKI_PATTERN_STATUS.TOMBSTONED,
|
|
380
|
+
WIKI_PATTERN_STATUS.QUARANTINED,
|
|
375
381
|
WIKI_PATTERN_STATUS.STALE,
|
|
376
382
|
].includes(pattern.status),
|
|
377
383
|
)
|
|
@@ -402,6 +408,9 @@ function applyUpsert(state, operation, evidenceByRef, effectiveAt) {
|
|
|
402
408
|
fingerprint(item) === fingerprint(proposed),
|
|
403
409
|
);
|
|
404
410
|
const existing = duplicate ?? state.patterns[proposed.patternId];
|
|
411
|
+
if (existing?.status === WIKI_PATTERN_STATUS.QUARANTINED) {
|
|
412
|
+
throw new Error("cannot rewrite a quarantined pattern");
|
|
413
|
+
}
|
|
405
414
|
const patternId = existing?.patternId ?? proposed.patternId;
|
|
406
415
|
state.patterns[patternId] = {
|
|
407
416
|
...proposed,
|
|
@@ -425,6 +434,7 @@ function applyUpsert(state, operation, evidenceByRef, effectiveAt) {
|
|
|
425
434
|
...new Set([...(existing?.supersedes ?? []), ...proposed.supersedes]),
|
|
426
435
|
].sort(),
|
|
427
436
|
rejectionCount: existing?.rejectionCount ?? 0,
|
|
437
|
+
rollbackCount: existing?.rollbackCount ?? 0,
|
|
428
438
|
status: WIKI_PATTERN_STATUS.HYPOTHESIS,
|
|
429
439
|
actionable: false,
|
|
430
440
|
evidenceCounts: { positive: 0, negative: 0, trustDomains: 0 },
|
|
@@ -489,14 +499,19 @@ function applyOperation(state, operation, evidenceByRef, effectiveAt) {
|
|
|
489
499
|
});
|
|
490
500
|
return;
|
|
491
501
|
}
|
|
492
|
-
if (
|
|
502
|
+
if (
|
|
503
|
+
operation.type === "quarantine" ||
|
|
504
|
+
operation.type === "revoke" ||
|
|
505
|
+
operation.type === "tombstone"
|
|
506
|
+
) {
|
|
493
507
|
const pattern =
|
|
494
508
|
state.patterns[requiredString(operation.patternId, "patternId")];
|
|
495
|
-
if (!pattern) throw new Error("cannot
|
|
496
|
-
pattern.status =
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
509
|
+
if (!pattern) throw new Error("cannot disposition an unknown pattern");
|
|
510
|
+
pattern.status = {
|
|
511
|
+
quarantine: WIKI_PATTERN_STATUS.QUARANTINED,
|
|
512
|
+
revoke: WIKI_PATTERN_STATUS.REVOKED,
|
|
513
|
+
tombstone: WIKI_PATTERN_STATUS.TOMBSTONED,
|
|
514
|
+
}[operation.type];
|
|
500
515
|
pattern.revocationReason = requiredString(operation.reason, "reason");
|
|
501
516
|
pattern.actionable = false;
|
|
502
517
|
appendLog(
|
|
@@ -549,8 +564,15 @@ function applyOperation(state, operation, evidenceByRef, effectiveAt) {
|
|
|
549
564
|
throw new Error(
|
|
550
565
|
`proposal decision references unknown pattern: ${patternId}`,
|
|
551
566
|
);
|
|
552
|
-
if (decision.outcome === "rejected")
|
|
567
|
+
if (decision.outcome === "rejected") {
|
|
553
568
|
pattern.rejectionCount = (pattern.rejectionCount ?? 0) + 1;
|
|
569
|
+
if (
|
|
570
|
+
evidence.data?.pilotOutcome === "rollback" ||
|
|
571
|
+
evidence.data?.revocationOutcome === "revoke"
|
|
572
|
+
) {
|
|
573
|
+
pattern.rollbackCount = (pattern.rollbackCount ?? 0) + 1;
|
|
574
|
+
}
|
|
575
|
+
}
|
|
554
576
|
}
|
|
555
577
|
appendLog(
|
|
556
578
|
state,
|