chainlesschain 0.166.38 → 0.166.40
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/package.json +6 -1
- package/scripts/governed-learning-local-attestor-service.mjs +222 -0
- package/scripts/governed-learning-local-attestor-trust-approval-service.mjs +338 -0
- package/scripts/governed-learning-local-attestor-trust-operations-service.mjs +575 -0
- package/scripts/governed-learning-windows-secure-pipe-broker.ps1 +375 -0
- package/src/assets/web-panel/assets/{AIOps-DBbcVPqB.js → AIOps-BK9J9OWp.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-D5vETPOk.js → ActionButton-LPNZQqBA.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-WVhas3Fw.js → Analytics-Bc4GSjWD.js} +2 -2
- package/src/assets/web-panel/assets/{AppLayout-CSTRI93Q.js → AppLayout-DvOI0V4E.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-BZT8FOoE.js → Artifacts-Dk84hXbN.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CT2-Tsby.js → Audit-q1LFnus7.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BWA5LNBe.js → BackgroundAgents-CwalUYLs.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-B-zEbldA.js → Backup-DklgvW1G.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BAEwtdNT.js → BaseInput-BUwoeDOX.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BT1-y6t1.js → Chat-DbHcDB_8.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-BVijMHeO.js → ChatBubbleRenderer-vEtAN7ar.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-B8IJYZsD.js → Checkbox-BhshLHuh.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DEt453nL.js → Codegen-CrqH-uBK.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DWuVSmZv.js → Col-CTHhv3KN.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CcoNuU33.js → Community-BXTvtMJe.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BKtuIYWA.js → Compact-BpvJtxF1.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-bHzxGq3P.js → Compliance-CpMouPia.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BY2Kb15t.js → Cowork-C7yp3_hW.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-DC-j0jvp.js → Cron-C-XxPYai.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CzEuAHQz.js → Crosschain-CMdyqfrL.js} +1 -1
- package/src/assets/web-panel/assets/{DID-7QUNq6Fz.js → DID-kuaHK2dq.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CT6RiEFl.js → Dashboard-DH2-ms5o.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CW8IPY7r.js → Dropdown-DXLZ0jjH.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-Zt8WOLuN.js → EmailListRenderer-DK86nfd5.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-B6aymxi7.js → FamilyGuardDashboard-CRKmGOug.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BiuFrRq0.js → Federation-DKK3wIGA.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DaiOAkHa.js → FormItemContext-CUGNKN_D.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-D1KbDpXs.js → GenericCardRenderer-CA0GwYSK.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BILl0huA.js → Git-CFm46B43.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CLyhrPrh.js → Governance-CfOa3K-_.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DyNhiIpK.js → Inference-C4C6jHDC.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-Bor_ye4m.js → KnowledgeGraph-D5IhrCDs.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-ZDqbu8kg.js → Logs-BNeyeUIr.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-XsLyxgz8.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-DbDi29dH.js → Marketplace-0pLshxdU.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DfU8dWbV.js → McpTools-DK4FG-4k.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-DeAz-2-6.js → Memory-CQfkhP-b.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-ws3TJXal.js → MobileBridge-pbinAwCm.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CGwVfeTv.js → MobileProjects-CWqK_5p8.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BtJjJJpl.js → Mtc-B-OQ9yid.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-BNZwipXs.js → MtcAudit-Cp6iZgrT.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-9mSOrKWA.js → Multisig-D9cQONHI.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-gz1lEDED.js → NLProgramming-BUY0rZvc.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BeufuOVX.js → Notes-CsXIIMCf.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-CbFyi9jZ.js → NotificationSettings-C6qIk1ej.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-Cz3qay2q.js +1 -0
- package/src/assets/web-panel/assets/{Organization-DKBKNViH.js → Organization-Cs0gsc4U.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CvPfKE1x.js → Overflow-C3ZfbqPx.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DjL2q8og.js → P2P-D1lxB22Z.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Cv9PLMWJ.js → PdhVaultBrowser-SNHvZvv_.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-BUoNho3w.js → Permissions-CFSk6KJV.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-C4Iu2Pic.js → PersonalDataHub-puvpUUGe.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-BiDrIlwr.js → Pipeline-BMqYweJm.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-BnvU6vGp.js → Privacy-C0sXA71u.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DDzoyhnH.js → ProjectInit-ClaKClvs.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CV6b43H0.js → ProjectSettings-CtHJp6_9.js} +2 -2
- package/src/assets/web-panel/assets/Projects-HuPL4QZa.js +1 -0
- package/src/assets/web-panel/assets/{Providers-DaeuFo-x.js → Providers-crByRu10.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-C03Bll1h.js → QrScannerModal-BKO9i7Sy.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Cn9nLaen.js → QuickAsk-1IdXt4pm.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BXfkC8Ts.js → Recommend-DiQwZD6r.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DNj6D_LI.js → RemoteSession-DesjH6lx.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-DDDIwiUI.js → Reputation-b-nY3pul.js} +1 -1
- package/src/assets/web-panel/assets/{Row-JukNm-id.js → Row-Bt7nCF5s.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-B1AhzL2z.js → RssFeed-CcTg4JEQ.js} +2 -2
- package/src/assets/web-panel/assets/{Search-B5y6_DVm.js → Search-C2uI3GFe.js} +1 -1
- package/src/assets/web-panel/assets/{Security-C2pvv32x.js → Security-3NrvV4g1.js} +3 -3
- package/src/assets/web-panel/assets/{Services-DBka7ppY.js → Services-B1cKHgYr.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DfPwNTSh.js → Skeleton-BTZdEKX3.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-Cs4ntp-l.js → Skills-Bi_Zy8Ru.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CrUJ0guM.js → Sla-CR2gW1OA.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BFbokLV1.js → SpeechSettings-Bphe-fh1.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CSnh1o3D.js → SyncSettings-C64DsCjZ.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-CQZppIPo.js → Tasks-D18Px4aF.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-BqLeHq7Z.js → Templates-DGfS0ZAF.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CkzPA-ri.js → Tenant-D6ank4rT.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-D5IRhnu6.js → Terminal-MBMZ_5Gz.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-ICdiYzgz.js → TimelineRenderer-C_u6JjZi.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-89CaZBwe.js → Tokens-CqmhScSK.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-Di251qR1.js → Trigger-D1B9cX1b.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-M4sC3Mv6.js → Trust-D_P3Mfbl.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-BL7EUWxj.js → UkeySign-CUASyjWb.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BV5Se5il.js → VideoEditing-eGLhjeJX.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-IoY13rov.js → Wallet-Dba_6QCL.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DKFPq0uV.js → WebAuthn-CiAEtYZZ.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-oizkYeQD.js → WorkflowEditor-D-zW3rph.js} +1 -1
- package/src/assets/web-panel/assets/{chat-Du6ZthE5.js → chat-DEzJInHX.js} +1 -1
- package/src/assets/web-panel/assets/{colors-I2ie73HS.js → colors-DM6Ke3hD.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-C-02XOOx.js → compact-item-CAMIx_cM.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DgP09zg2.js → createContext-BrbtMPOW.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DQGZAYxC.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-kWDasRib.js → hasIn-tnV_CKFU.js} +1 -1
- package/src/assets/web-panel/assets/{index-M9mzJo6V.js → index-9o6JlqCH.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cx5dAdFu.js → index-A3azg5vi.js} +1 -1
- package/src/assets/web-panel/assets/{index-AtAiEmjM.js → index-B5glieXV.js} +1 -1
- package/src/assets/web-panel/assets/{index-H_31JkaZ.js → index-B6KWb2WQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSlTGxUJ.js → index-BIkQL-F7.js} +1 -1
- package/src/assets/web-panel/assets/{index-OYyn8GoU.js → index-BJ8Yd5W8.js} +1 -1
- package/src/assets/web-panel/assets/{index-5Ll5Fdqb.js → index-BZVDnMvs.js} +1 -1
- package/src/assets/web-panel/assets/{index-mF8UmKqp.js → index-B_aGo7Y_.js} +1 -1
- package/src/assets/web-panel/assets/{index-BUvpjPMv.js → index-BbdSgz4e.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkP2DW3a.js → index-BeC4Jmxn.js} +1 -1
- package/src/assets/web-panel/assets/{index-CbHEQTU6.js → index-BfGYDWyS.js} +1 -1
- package/src/assets/web-panel/assets/{index-DKJ-d5F1.js → index-Br1t2LsA.js} +1 -1
- package/src/assets/web-panel/assets/{index-CHSghc3j.js → index-BuSXesCq.js} +1 -1
- package/src/assets/web-panel/assets/{index-CjuJ1FYZ.js → index-BzuFmNOf.js} +1 -1
- package/src/assets/web-panel/assets/index-C9a56Oco.js +1 -0
- package/src/assets/web-panel/assets/index-CU5eDYYp.js +1 -0
- package/src/assets/web-panel/assets/{index-CtbMRqD-.js → index-CVJ67rg0.js} +1 -1
- package/src/assets/web-panel/assets/{index-BZ6bWk4x.js → index-CVij36sN.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ryflob2W.js → index-CaCQEvVe.js} +1 -1
- package/src/assets/web-panel/assets/{index-BYxia8nl.js → index-Cx3S7Z4l.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpOQeTac.js → index-D1SsqpBQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Na5QA1LE.js → index-D2X5hC5X.js} +1 -1
- package/src/assets/web-panel/assets/{index-D5LV04FO.js → index-D4-jekkQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-D9HwtJX5.js → index-D57Rt85L.js} +1 -1
- package/src/assets/web-panel/assets/{index-LLQQqj9B.js → index-DBYM7wpW.js} +1 -1
- package/src/assets/web-panel/assets/{index-D0EQSoEb.js → index-DH6MvJcX.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3D5NSjS.js → index-DI1yJrlv.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgogPjKJ.js → index-DJPjCj-L.js} +1 -1
- package/src/assets/web-panel/assets/{index-I4A_y2Ee.js → index-MxrGcqPa.js} +1 -1
- package/src/assets/web-panel/assets/{index-RwcHDSqP.js → index-Oi0LTcjV.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cokjvq67.js → index-QhkpDqBl.js} +1 -1
- package/src/assets/web-panel/assets/{index-CDM6OO4D.js → index-TiClDP9o.js} +1 -1
- package/src/assets/web-panel/assets/{index-BZcdP3id.js → index-cJQlyKYg.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcVj7YJB.js → index-gOfw5W--.js} +1 -1
- package/src/assets/web-panel/assets/{index-HH3Zccc0.js → index-mtzwU2IE.js} +1 -1
- package/src/assets/web-panel/assets/{index-BkcCllZ7.js → index-mxqufmW1.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bpz5RnQy.js → index-nDxVFSLd.js} +3 -3
- package/src/assets/web-panel/assets/{index-CQCdk4dn.js → index-xqyMxX6r.js} +1 -1
- package/src/assets/web-panel/assets/{index-uHI8QHu4.js → index-yi_liTJn.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BPHGo-UX.js → initDefaultProps-CVHDph1O.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BBr8JvWc.js → motion-CElqp9xA.js} +1 -1
- package/src/assets/web-panel/assets/{move-CdKWToz7.js → move-XZw1bQmy.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-B8tkkKBs.js → mtc-parser-SGviFxRK.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DN4aP33H.js → omit-BGKRrIHI.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CoHRkRJq.js → pickAttrs-BuJYHAWJ.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DpGGGAPa.js → placementArrow-TVa4r_EM.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BabRsZo5.js → responsiveObserve-DVPWQMuO.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DJjyrwqK.js → slide-BeOL-UpA.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BaRVkO5S.js → statusUtils-DNYqZCQQ.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-HcMYUjTR.js → styleChecker-DRx9GRig.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-c3IBzp2l.js → useFlexGapSupport-Daqz3PDA.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DD7igwyF.js → useFs-C6A7nr7V.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-GEF0hhnd.js → usePersonalDataHub-D5hwRSvC.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-D51u7zqF.js → vnode-CHXMdIU3.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-tXG23Lc9.js → zoom-sl0JxyZz.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/evolution-attestor-trust.js +113 -0
- package/src/commands/evolution.js +2 -0
- package/src/commands/learning.js +34 -5
- package/src/data/changelog.json +26 -0
- package/src/lib/evolution/evolution-artifact-ports.js +21 -0
- package/src/lib/evolution/evolution-deployment-loader.js +56 -0
- package/src/lib/evolution/evolution-immutable-ledger-segment-store.js +812 -0
- package/src/lib/evolution/evolution-ledger-file-manifest-catalog.js +218 -0
- package/src/lib/evolution/evolution-ledger-manifest-catalog.js +472 -0
- package/src/lib/evolution/evolution-ledger-manifest-chain.js +997 -0
- package/src/lib/evolution/evolution-ledger-manifest-head-store.js +408 -0
- package/src/lib/evolution/evolution-ledger-manifest-witness-adapter.js +554 -0
- package/src/lib/evolution/evolution-ledger-v2-manifest-backend.js +460 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-ipc-endpoint.js +94 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-trust-approval-client.js +485 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-trust-ipc-capability.js +200 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-trust-ledger.js +1222 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operations-cli-host.js +802 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operations-client.js +445 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operations.js +1082 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operator-registry.js +1453 -0
- package/src/lib/evolution/governed-skill-synthesis-candidate-evaluator.js +147 -0
- package/src/lib/evolution/governed-skill-synthesis-cli-host.js +115 -0
- package/src/lib/evolution/governed-skill-synthesis-evaluation-ledger-adapter.js +715 -0
- package/src/lib/evolution/governed-skill-synthesis-external-attestor.js +499 -0
- package/src/lib/evolution/governed-skill-synthesis-model-evaluator.js +514 -0
- package/src/lib/evolution/governed-skill-synthesis-process-attestor-worker.mjs +208 -0
- package/src/lib/evolution/governed-skill-synthesis-process-attestor.js +557 -0
- package/src/lib/evolution/governed-skill-synthesis-process-grader-worker.mjs +143 -0
- package/src/lib/evolution/governed-skill-synthesis-process-grader.js +444 -0
- package/src/lib/evolution/governed-skill-synthesis-provider-chat.js +220 -0
- package/src/lib/evolution/governed-skill-synthesis-windows-secure-pipe-host.js +236 -0
- package/src/lib/hook-audit-store.js +68 -2
- package/src/lib/hooks-v2-runtime.js +52 -26
- package/src/lib/learning/skill-synthesizer.js +66 -5
- package/src/lib/remote-read-loop-guard.js +232 -37
- package/src/lib/task-progress-tracker.js +7 -4
- package/src/runtime/agent-core.js +16 -5
- package/src/runtime/coding-agent-shell-policy.cjs +10 -17
- package/src/assets/web-panel/assets/MarkdownRenderer-DnSfkf98.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-CFbhBT44.js +0 -1
- package/src/assets/web-panel/assets/Projects-B0k1907g.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CxKkOIjh.js +0 -1
- package/src/assets/web-panel/assets/index-b5a6l3Uu.js +0 -1
- package/src/assets/web-panel/assets/index-xt-BOyp_.js +0 -1
|
@@ -0,0 +1,715 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { types as utilTypes } from "node:util";
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA,
|
|
6
|
+
isEvolutionLedgerArtifactResolver,
|
|
7
|
+
} from "./evolution-artifact-ports.js";
|
|
8
|
+
import {
|
|
9
|
+
EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA,
|
|
10
|
+
EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA,
|
|
11
|
+
} from "./evolution-ledger.js";
|
|
12
|
+
import { isGovernedSkillSynthesisAttestorTrustVerifier } from "./governed-skill-synthesis-attestor-trust-ledger.js";
|
|
13
|
+
import { isGovernedSkillSynthesisExternalAttestationAuthority } from "./governed-skill-synthesis-external-attestor.js";
|
|
14
|
+
import { isGovernedSkillSynthesisProcessAttestationAuthority } from "./governed-skill-synthesis-process-attestor.js";
|
|
15
|
+
|
|
16
|
+
export const GOVERNED_SKILL_SYNTHESIS_EVALUATION_RECEIPT_SCHEMA =
|
|
17
|
+
"chainlesschain.governed-skill-synthesis-evaluation-receipt/v3";
|
|
18
|
+
const LEGACY_PROCESS_STDIN_RECEIPT_SCHEMA =
|
|
19
|
+
"chainlesschain.governed-skill-synthesis-evaluation-receipt/v2";
|
|
20
|
+
export const GOVERNED_SKILL_SYNTHESIS_EVALUATION_PERSISTENCE_SCHEMA =
|
|
21
|
+
"chainlesschain.governed-skill-synthesis-evaluation-persistence/v1";
|
|
22
|
+
export const GOVERNED_SKILL_SYNTHESIS_EVALUATION_LEDGER_EVENT =
|
|
23
|
+
"learning.skill-synthesis-evaluation.persisted";
|
|
24
|
+
export const GOVERNED_SKILL_SYNTHESIS_EVALUATION_CORRUPT_CODE =
|
|
25
|
+
"CC_LEARNING_SYNTHESIS_EVALUATION_CORRUPT";
|
|
26
|
+
|
|
27
|
+
const ARTIFACT_TYPE = "governed-skill-synthesis-evaluation";
|
|
28
|
+
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
29
|
+
const SKILL_NAME = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/u;
|
|
30
|
+
const ALLOWED_REASONS = new Set([
|
|
31
|
+
"ambiguous-procedure",
|
|
32
|
+
"clear-procedure",
|
|
33
|
+
"grounded-tools",
|
|
34
|
+
"insufficient-verification",
|
|
35
|
+
"safe-instructions",
|
|
36
|
+
"unsafe-instruction",
|
|
37
|
+
"unsupported-capability",
|
|
38
|
+
"ungrounded-tool",
|
|
39
|
+
"verifiable-outcome",
|
|
40
|
+
]);
|
|
41
|
+
const DENY_REASONS = new Set([
|
|
42
|
+
"ambiguous-procedure",
|
|
43
|
+
"insufficient-verification",
|
|
44
|
+
"unsafe-instruction",
|
|
45
|
+
"unsupported-capability",
|
|
46
|
+
"ungrounded-tool",
|
|
47
|
+
]);
|
|
48
|
+
const RECEIPT_KEYS = new Set([
|
|
49
|
+
"accepted",
|
|
50
|
+
"attempts",
|
|
51
|
+
"attestation",
|
|
52
|
+
"authenticated",
|
|
53
|
+
"authorityId",
|
|
54
|
+
"candidateDigest",
|
|
55
|
+
"deterministicPrecheck",
|
|
56
|
+
"durable",
|
|
57
|
+
"handlerArtifactDigest",
|
|
58
|
+
"graderCredentialDelivery",
|
|
59
|
+
"graderCredentialMaxUses",
|
|
60
|
+
"graderCredentialResolverArtifactDigest",
|
|
61
|
+
"graderCredentialTargetHost",
|
|
62
|
+
"graderCredentialTtlMs",
|
|
63
|
+
"graderHardDeadlineEnforced",
|
|
64
|
+
"graderInheritedEnvironment",
|
|
65
|
+
"graderIsolation",
|
|
66
|
+
"graderModel",
|
|
67
|
+
"graderPersistentProcessAuditRequired",
|
|
68
|
+
"graderProvider",
|
|
69
|
+
"graderRequiredSandboxBoundaries",
|
|
70
|
+
"graderSandboxProfile",
|
|
71
|
+
"graderWorkerArtifactDigest",
|
|
72
|
+
"minScore",
|
|
73
|
+
"modelScore",
|
|
74
|
+
"reasons",
|
|
75
|
+
"receiptDigest",
|
|
76
|
+
"revision",
|
|
77
|
+
"schema",
|
|
78
|
+
"skillName",
|
|
79
|
+
"trajectoryId",
|
|
80
|
+
]);
|
|
81
|
+
const LEGACY_PROCESS_STDIN_RECEIPT_KEYS = new Set(
|
|
82
|
+
[...RECEIPT_KEYS].filter(
|
|
83
|
+
(key) =>
|
|
84
|
+
![
|
|
85
|
+
"graderCredentialMaxUses",
|
|
86
|
+
"graderCredentialResolverArtifactDigest",
|
|
87
|
+
"graderCredentialTargetHost",
|
|
88
|
+
"graderCredentialTtlMs",
|
|
89
|
+
].includes(key),
|
|
90
|
+
),
|
|
91
|
+
);
|
|
92
|
+
const PERSISTENCE_PORTS = new WeakSet();
|
|
93
|
+
const PERSISTENCE_RECEIPTS = new WeakSet();
|
|
94
|
+
|
|
95
|
+
function canonical(value) {
|
|
96
|
+
if (value === null || typeof value !== "object") return JSON.stringify(value);
|
|
97
|
+
if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
|
|
98
|
+
return `{${Object.keys(value)
|
|
99
|
+
.sort()
|
|
100
|
+
.map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
|
|
101
|
+
.join(",")}}`;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function hash(domain, value) {
|
|
105
|
+
return `sha256:${createHash("sha256")
|
|
106
|
+
.update(domain)
|
|
107
|
+
.update("\0")
|
|
108
|
+
.update(canonical(value))
|
|
109
|
+
.digest("hex")}`;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function boundedString(value, label, maximum = 256) {
|
|
113
|
+
if (
|
|
114
|
+
typeof value !== "string" ||
|
|
115
|
+
value.length === 0 ||
|
|
116
|
+
value.length > maximum ||
|
|
117
|
+
value.trim() !== value ||
|
|
118
|
+
value.includes("\0")
|
|
119
|
+
) {
|
|
120
|
+
throw new TypeError(`${label} must be a non-empty bounded string`);
|
|
121
|
+
}
|
|
122
|
+
return value;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function digest(value, label) {
|
|
126
|
+
if (!DIGEST.test(value ?? "")) throw new TypeError(`${label} is invalid`);
|
|
127
|
+
return value;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function exactRecord(value, keys, label) {
|
|
131
|
+
if (
|
|
132
|
+
!value ||
|
|
133
|
+
typeof value !== "object" ||
|
|
134
|
+
Array.isArray(value) ||
|
|
135
|
+
utilTypes.isProxy(value) ||
|
|
136
|
+
(Object.getPrototypeOf(value) !== Object.prototype &&
|
|
137
|
+
Object.getPrototypeOf(value) !== null)
|
|
138
|
+
) {
|
|
139
|
+
throw new TypeError(`${label} must be an object`);
|
|
140
|
+
}
|
|
141
|
+
const ownKeys = Reflect.ownKeys(value);
|
|
142
|
+
if (
|
|
143
|
+
ownKeys.length !== keys.size ||
|
|
144
|
+
ownKeys.some((key) => {
|
|
145
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
146
|
+
return (
|
|
147
|
+
typeof key !== "string" ||
|
|
148
|
+
!keys.has(key) ||
|
|
149
|
+
!descriptor ||
|
|
150
|
+
!("value" in descriptor) ||
|
|
151
|
+
!descriptor.enumerable
|
|
152
|
+
);
|
|
153
|
+
})
|
|
154
|
+
) {
|
|
155
|
+
throw new TypeError(`${label} has unexpected or missing fields`);
|
|
156
|
+
}
|
|
157
|
+
return value;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function fail(message) {
|
|
161
|
+
const error = new Error(message);
|
|
162
|
+
error.code = GOVERNED_SKILL_SYNTHESIS_EVALUATION_CORRUPT_CODE;
|
|
163
|
+
throw error;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function safeJson(value, depth = 0, counter = { nodes: 0 }) {
|
|
167
|
+
counter.nodes += 1;
|
|
168
|
+
if (counter.nodes > 10_000 || depth > 32) {
|
|
169
|
+
fail("learning synthesis evaluation attestation is too complex");
|
|
170
|
+
}
|
|
171
|
+
if (
|
|
172
|
+
value === null ||
|
|
173
|
+
typeof value === "string" ||
|
|
174
|
+
typeof value === "boolean" ||
|
|
175
|
+
(typeof value === "number" && Number.isFinite(value))
|
|
176
|
+
) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
if (!value || typeof value !== "object" || utilTypes.isProxy(value)) {
|
|
180
|
+
fail("learning synthesis evaluation attestation is not canonical JSON");
|
|
181
|
+
}
|
|
182
|
+
if (Array.isArray(value)) {
|
|
183
|
+
if (Reflect.ownKeys(value).length !== value.length + 1) {
|
|
184
|
+
fail("learning synthesis evaluation attestation is not canonical JSON");
|
|
185
|
+
}
|
|
186
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
187
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
|
|
188
|
+
if (!descriptor || !("value" in descriptor) || !descriptor.enumerable) {
|
|
189
|
+
fail("learning synthesis evaluation attestation is not canonical JSON");
|
|
190
|
+
}
|
|
191
|
+
safeJson(descriptor.value, depth + 1, counter);
|
|
192
|
+
}
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const prototype = Object.getPrototypeOf(value);
|
|
196
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
197
|
+
fail("learning synthesis evaluation attestation is not canonical JSON");
|
|
198
|
+
}
|
|
199
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
200
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
201
|
+
if (
|
|
202
|
+
typeof key !== "string" ||
|
|
203
|
+
!descriptor ||
|
|
204
|
+
!("value" in descriptor) ||
|
|
205
|
+
!descriptor.enumerable
|
|
206
|
+
) {
|
|
207
|
+
fail("learning synthesis evaluation attestation is not canonical JSON");
|
|
208
|
+
}
|
|
209
|
+
safeJson(descriptor.value, depth + 1, counter);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function capture(owner, method, label) {
|
|
214
|
+
if (typeof owner?.[method] !== "function") {
|
|
215
|
+
throw new TypeError(`${label}.${method}() is required`);
|
|
216
|
+
}
|
|
217
|
+
return (...args) => Reflect.apply(owner[method], owner, args);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function normalizeDescriptor(value) {
|
|
221
|
+
exactRecord(
|
|
222
|
+
value,
|
|
223
|
+
new Set([
|
|
224
|
+
"artifactTenantId",
|
|
225
|
+
"audience",
|
|
226
|
+
"authorityId",
|
|
227
|
+
"handlerArtifactDigest",
|
|
228
|
+
"purpose",
|
|
229
|
+
"revision",
|
|
230
|
+
"streamId",
|
|
231
|
+
"tenantId",
|
|
232
|
+
]),
|
|
233
|
+
"learning synthesis evaluation ledger descriptor",
|
|
234
|
+
);
|
|
235
|
+
if (!Number.isSafeInteger(value.revision) || value.revision < 1) {
|
|
236
|
+
throw new TypeError("learning synthesis evaluator revision is invalid");
|
|
237
|
+
}
|
|
238
|
+
if (value.purpose !== "evolution-ledger") {
|
|
239
|
+
throw new TypeError(
|
|
240
|
+
"learning synthesis evaluation purpose must be evolution-ledger",
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
return Object.freeze({
|
|
244
|
+
tenantId: boundedString(value.tenantId, "tenantId"),
|
|
245
|
+
artifactTenantId: boundedString(value.artifactTenantId, "artifactTenantId"),
|
|
246
|
+
streamId: boundedString(value.streamId, "streamId"),
|
|
247
|
+
audience: boundedString(value.audience, "audience"),
|
|
248
|
+
purpose: value.purpose,
|
|
249
|
+
authorityId: boundedString(value.authorityId, "authorityId"),
|
|
250
|
+
revision: value.revision,
|
|
251
|
+
handlerArtifactDigest: digest(
|
|
252
|
+
value.handlerArtifactDigest,
|
|
253
|
+
"handlerArtifactDigest",
|
|
254
|
+
),
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
function receiptCore(receipt) {
|
|
259
|
+
return {
|
|
260
|
+
schema: receipt.schema,
|
|
261
|
+
authorityId: receipt.authorityId,
|
|
262
|
+
revision: receipt.revision,
|
|
263
|
+
handlerArtifactDigest: receipt.handlerArtifactDigest,
|
|
264
|
+
graderIsolation: receipt.graderIsolation,
|
|
265
|
+
graderProvider: receipt.graderProvider,
|
|
266
|
+
graderModel: receipt.graderModel,
|
|
267
|
+
graderWorkerArtifactDigest: receipt.graderWorkerArtifactDigest,
|
|
268
|
+
...(receipt.schema === GOVERNED_SKILL_SYNTHESIS_EVALUATION_RECEIPT_SCHEMA
|
|
269
|
+
? {
|
|
270
|
+
graderCredentialResolverArtifactDigest:
|
|
271
|
+
receipt.graderCredentialResolverArtifactDigest,
|
|
272
|
+
graderCredentialTargetHost: receipt.graderCredentialTargetHost,
|
|
273
|
+
graderCredentialMaxUses: receipt.graderCredentialMaxUses,
|
|
274
|
+
graderCredentialTtlMs: receipt.graderCredentialTtlMs,
|
|
275
|
+
}
|
|
276
|
+
: {}),
|
|
277
|
+
graderInheritedEnvironment: receipt.graderInheritedEnvironment,
|
|
278
|
+
graderCredentialDelivery: receipt.graderCredentialDelivery,
|
|
279
|
+
graderHardDeadlineEnforced: receipt.graderHardDeadlineEnforced,
|
|
280
|
+
graderSandboxProfile: receipt.graderSandboxProfile,
|
|
281
|
+
graderRequiredSandboxBoundaries: receipt.graderRequiredSandboxBoundaries,
|
|
282
|
+
graderPersistentProcessAuditRequired:
|
|
283
|
+
receipt.graderPersistentProcessAuditRequired,
|
|
284
|
+
candidateDigest: receipt.candidateDigest,
|
|
285
|
+
skillName: receipt.skillName,
|
|
286
|
+
trajectoryId: receipt.trajectoryId,
|
|
287
|
+
deterministicPrecheck: receipt.deterministicPrecheck,
|
|
288
|
+
modelScore: receipt.modelScore,
|
|
289
|
+
minScore: receipt.minScore,
|
|
290
|
+
attempts: receipt.attempts,
|
|
291
|
+
reasons: receipt.reasons,
|
|
292
|
+
accepted: receipt.accepted,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
function validateReceipt(receipt, descriptor) {
|
|
297
|
+
const schemaDescriptor =
|
|
298
|
+
receipt &&
|
|
299
|
+
typeof receipt === "object" &&
|
|
300
|
+
!Array.isArray(receipt) &&
|
|
301
|
+
!utilTypes.isProxy(receipt)
|
|
302
|
+
? Object.getOwnPropertyDescriptor(receipt, "schema")
|
|
303
|
+
: null;
|
|
304
|
+
const legacyProcessStdin =
|
|
305
|
+
schemaDescriptor?.enumerable === true &&
|
|
306
|
+
Object.prototype.hasOwnProperty.call(schemaDescriptor, "value") &&
|
|
307
|
+
schemaDescriptor.value === LEGACY_PROCESS_STDIN_RECEIPT_SCHEMA;
|
|
308
|
+
exactRecord(
|
|
309
|
+
receipt,
|
|
310
|
+
legacyProcessStdin ? LEGACY_PROCESS_STDIN_RECEIPT_KEYS : RECEIPT_KEYS,
|
|
311
|
+
"learning synthesis evaluation receipt",
|
|
312
|
+
);
|
|
313
|
+
if (
|
|
314
|
+
(!legacyProcessStdin &&
|
|
315
|
+
receipt.schema !== GOVERNED_SKILL_SYNTHESIS_EVALUATION_RECEIPT_SCHEMA) ||
|
|
316
|
+
receipt.authorityId !== descriptor.authorityId ||
|
|
317
|
+
receipt.revision !== descriptor.revision ||
|
|
318
|
+
receipt.handlerArtifactDigest !== descriptor.handlerArtifactDigest ||
|
|
319
|
+
!["process", "same-process"].includes(receipt.graderIsolation) ||
|
|
320
|
+
(receipt.graderIsolation === "process" &&
|
|
321
|
+
(!DIGEST.test(receipt.graderWorkerArtifactDigest ?? "") ||
|
|
322
|
+
(!legacyProcessStdin &&
|
|
323
|
+
!DIGEST.test(receipt.graderCredentialResolverArtifactDigest ?? "")) ||
|
|
324
|
+
(!legacyProcessStdin &&
|
|
325
|
+
receipt.graderCredentialTargetHost !== "ark.cn-beijing.volces.com") ||
|
|
326
|
+
(!legacyProcessStdin && receipt.graderCredentialMaxUses !== 1) ||
|
|
327
|
+
(!legacyProcessStdin &&
|
|
328
|
+
(!Number.isSafeInteger(receipt.graderCredentialTtlMs) ||
|
|
329
|
+
receipt.graderCredentialTtlMs < 6_000 ||
|
|
330
|
+
receipt.graderCredentialTtlMs > 125_000)) ||
|
|
331
|
+
typeof receipt.graderProvider !== "string" ||
|
|
332
|
+
receipt.graderProvider.length === 0 ||
|
|
333
|
+
typeof receipt.graderModel !== "string" ||
|
|
334
|
+
receipt.graderModel.length === 0 ||
|
|
335
|
+
receipt.graderInheritedEnvironment !== false ||
|
|
336
|
+
receipt.graderCredentialDelivery !==
|
|
337
|
+
(legacyProcessStdin
|
|
338
|
+
? "bounded-stdin"
|
|
339
|
+
: "single-use-broker-reference") ||
|
|
340
|
+
receipt.graderHardDeadlineEnforced !== true ||
|
|
341
|
+
receipt.graderSandboxProfile !== "network-only" ||
|
|
342
|
+
!Array.isArray(receipt.graderRequiredSandboxBoundaries) ||
|
|
343
|
+
utilTypes.isProxy(receipt.graderRequiredSandboxBoundaries) ||
|
|
344
|
+
canonical(receipt.graderRequiredSandboxBoundaries) !==
|
|
345
|
+
canonical([
|
|
346
|
+
"privilege-reduction",
|
|
347
|
+
"process-tree",
|
|
348
|
+
"resource-limits",
|
|
349
|
+
]) ||
|
|
350
|
+
receipt.graderPersistentProcessAuditRequired !== true)) ||
|
|
351
|
+
(receipt.graderIsolation === "same-process" &&
|
|
352
|
+
(receipt.graderWorkerArtifactDigest !== null ||
|
|
353
|
+
(!legacyProcessStdin &&
|
|
354
|
+
receipt.graderCredentialResolverArtifactDigest !== null) ||
|
|
355
|
+
(!legacyProcessStdin && receipt.graderCredentialTargetHost !== null) ||
|
|
356
|
+
(!legacyProcessStdin && receipt.graderCredentialMaxUses !== null) ||
|
|
357
|
+
(!legacyProcessStdin && receipt.graderCredentialTtlMs !== null) ||
|
|
358
|
+
receipt.graderProvider !== null ||
|
|
359
|
+
receipt.graderModel !== null ||
|
|
360
|
+
receipt.graderInheritedEnvironment !== null ||
|
|
361
|
+
receipt.graderCredentialDelivery !== "closure" ||
|
|
362
|
+
receipt.graderHardDeadlineEnforced !== false ||
|
|
363
|
+
receipt.graderSandboxProfile !== null ||
|
|
364
|
+
!Array.isArray(receipt.graderRequiredSandboxBoundaries) ||
|
|
365
|
+
receipt.graderRequiredSandboxBoundaries.length !== 0 ||
|
|
366
|
+
receipt.graderPersistentProcessAuditRequired !== false)) ||
|
|
367
|
+
receipt.authenticated !== true ||
|
|
368
|
+
receipt.durable !== false ||
|
|
369
|
+
receipt.deterministicPrecheck !== "passed" ||
|
|
370
|
+
typeof receipt.accepted !== "boolean" ||
|
|
371
|
+
!DIGEST.test(receipt.candidateDigest ?? "") ||
|
|
372
|
+
!SKILL_NAME.test(receipt.skillName ?? "") ||
|
|
373
|
+
typeof receipt.trajectoryId !== "string" ||
|
|
374
|
+
receipt.trajectoryId.length === 0 ||
|
|
375
|
+
receipt.trajectoryId.length > 256 ||
|
|
376
|
+
!Number.isFinite(receipt.modelScore) ||
|
|
377
|
+
receipt.modelScore < 0 ||
|
|
378
|
+
receipt.modelScore > 1 ||
|
|
379
|
+
!Number.isFinite(receipt.minScore) ||
|
|
380
|
+
receipt.minScore < 0 ||
|
|
381
|
+
receipt.minScore > 1 ||
|
|
382
|
+
!Number.isSafeInteger(receipt.attempts) ||
|
|
383
|
+
receipt.attempts < 1 ||
|
|
384
|
+
receipt.attempts > 3 ||
|
|
385
|
+
!Array.isArray(receipt.reasons) ||
|
|
386
|
+
utilTypes.isProxy(receipt.reasons) ||
|
|
387
|
+
receipt.reasons.length === 0 ||
|
|
388
|
+
receipt.reasons.length > 8 ||
|
|
389
|
+
receipt.reasons.some((reason) => !ALLOWED_REASONS.has(reason)) ||
|
|
390
|
+
new Set(receipt.reasons).size !== receipt.reasons.length ||
|
|
391
|
+
canonical([...receipt.reasons].sort()) !== canonical(receipt.reasons) ||
|
|
392
|
+
receipt.accepted !==
|
|
393
|
+
(receipt.modelScore >= receipt.minScore &&
|
|
394
|
+
receipt.reasons.every((reason) => !DENY_REASONS.has(reason))) ||
|
|
395
|
+
!DIGEST.test(receipt.receiptDigest ?? "") ||
|
|
396
|
+
receipt.receiptDigest !== hash(receipt.schema, receiptCore(receipt))
|
|
397
|
+
) {
|
|
398
|
+
fail("learning synthesis evaluation receipt binding is invalid");
|
|
399
|
+
}
|
|
400
|
+
let encoded;
|
|
401
|
+
try {
|
|
402
|
+
safeJson(receipt.attestation);
|
|
403
|
+
encoded = JSON.stringify(receipt.attestation);
|
|
404
|
+
} catch {
|
|
405
|
+
fail("learning synthesis evaluation receipt attestation is invalid");
|
|
406
|
+
}
|
|
407
|
+
if (!encoded || Buffer.byteLength(encoded, "utf8") > 16 * 1024) {
|
|
408
|
+
fail("learning synthesis evaluation receipt attestation is invalid");
|
|
409
|
+
}
|
|
410
|
+
return receipt;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
function parseResolution(resolution, event, descriptor) {
|
|
414
|
+
if (
|
|
415
|
+
resolution?.schema !== EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA ||
|
|
416
|
+
resolution.authenticated !== true ||
|
|
417
|
+
resolution.found !== true ||
|
|
418
|
+
resolution.ref !== event.subjectRef.ref ||
|
|
419
|
+
resolution.digest !== event.subjectRef.digest ||
|
|
420
|
+
!Buffer.isBuffer(resolution.bytes)
|
|
421
|
+
) {
|
|
422
|
+
fail("learning synthesis evaluation artifact resolution is invalid");
|
|
423
|
+
}
|
|
424
|
+
let durable;
|
|
425
|
+
try {
|
|
426
|
+
durable = JSON.parse(resolution.bytes.toString("utf8"));
|
|
427
|
+
} catch {
|
|
428
|
+
fail("learning synthesis evaluation artifact is not canonical JSON");
|
|
429
|
+
}
|
|
430
|
+
if (
|
|
431
|
+
durable?.schema !== EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA ||
|
|
432
|
+
durable.tenantId !== descriptor.artifactTenantId ||
|
|
433
|
+
durable.audience !== descriptor.audience ||
|
|
434
|
+
durable.purpose !== descriptor.purpose ||
|
|
435
|
+
durable.retention !== "ledger" ||
|
|
436
|
+
durable.type !== ARTIFACT_TYPE
|
|
437
|
+
) {
|
|
438
|
+
fail("learning synthesis evaluation durable artifact binding is invalid");
|
|
439
|
+
}
|
|
440
|
+
return validateReceipt(durable.value, descriptor);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
function persistenceReceipt(receipt, event, recovered) {
|
|
444
|
+
const core = {
|
|
445
|
+
schema: GOVERNED_SKILL_SYNTHESIS_EVALUATION_PERSISTENCE_SCHEMA,
|
|
446
|
+
authenticated: true,
|
|
447
|
+
durable: true,
|
|
448
|
+
persisted: true,
|
|
449
|
+
recovered,
|
|
450
|
+
receiptDigest: receipt.receiptDigest,
|
|
451
|
+
candidateDigest: receipt.candidateDigest,
|
|
452
|
+
ledgerEventDigest: event.eventDigest,
|
|
453
|
+
subjectRef: Object.freeze(structuredClone(event.subjectRef)),
|
|
454
|
+
};
|
|
455
|
+
const result = Object.freeze({
|
|
456
|
+
...core,
|
|
457
|
+
persistenceDigest: hash(
|
|
458
|
+
GOVERNED_SKILL_SYNTHESIS_EVALUATION_PERSISTENCE_SCHEMA,
|
|
459
|
+
core,
|
|
460
|
+
),
|
|
461
|
+
});
|
|
462
|
+
PERSISTENCE_RECEIPTS.add(result);
|
|
463
|
+
return result;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
export class GovernedSkillSynthesisEvaluationLedgerAdapter {
|
|
467
|
+
constructor({
|
|
468
|
+
descriptor: input,
|
|
469
|
+
artifactPorts,
|
|
470
|
+
ledger,
|
|
471
|
+
ledgerArtifactResolver,
|
|
472
|
+
verifyAttestation,
|
|
473
|
+
attestationAuthority,
|
|
474
|
+
allowSameProcessAttestationVerifier = false,
|
|
475
|
+
} = {}) {
|
|
476
|
+
this.descriptor = normalizeDescriptor(input);
|
|
477
|
+
this._put = capture(artifactPorts, "putCanonical", "artifactPorts");
|
|
478
|
+
this._read = capture(ledger, "read", "ledger");
|
|
479
|
+
this._verifyLedger = capture(ledger, "verify", "ledger");
|
|
480
|
+
this._append = capture(ledger, "appendDomainEvent", "ledger");
|
|
481
|
+
const governedAuthority =
|
|
482
|
+
isGovernedSkillSynthesisProcessAttestationAuthority(
|
|
483
|
+
attestationAuthority,
|
|
484
|
+
) ||
|
|
485
|
+
isGovernedSkillSynthesisExternalAttestationAuthority(
|
|
486
|
+
attestationAuthority,
|
|
487
|
+
) ||
|
|
488
|
+
isGovernedSkillSynthesisAttestorTrustVerifier(attestationAuthority)
|
|
489
|
+
? attestationAuthority
|
|
490
|
+
: null;
|
|
491
|
+
if (attestationAuthority !== undefined && !governedAuthority) {
|
|
492
|
+
throw new TypeError(
|
|
493
|
+
"a governed isolated attestation authority is required",
|
|
494
|
+
);
|
|
495
|
+
}
|
|
496
|
+
if (governedAuthority && verifyAttestation !== undefined) {
|
|
497
|
+
throw new TypeError(
|
|
498
|
+
"governed attestation authority cannot be combined with a direct verifier",
|
|
499
|
+
);
|
|
500
|
+
}
|
|
501
|
+
if (!governedAuthority && allowSameProcessAttestationVerifier !== true) {
|
|
502
|
+
throw new TypeError("an isolated attestation verifier is required");
|
|
503
|
+
}
|
|
504
|
+
this._verifyAttestation =
|
|
505
|
+
governedAuthority?.verifyAttestation ??
|
|
506
|
+
(typeof verifyAttestation === "function"
|
|
507
|
+
? verifyAttestation
|
|
508
|
+
: (() => {
|
|
509
|
+
throw new TypeError("verifyAttestation() is required");
|
|
510
|
+
})());
|
|
511
|
+
this._attestationLedgerBound =
|
|
512
|
+
isGovernedSkillSynthesisAttestorTrustVerifier(governedAuthority);
|
|
513
|
+
if (!isEvolutionLedgerArtifactResolver(ledgerArtifactResolver)) {
|
|
514
|
+
throw new TypeError(
|
|
515
|
+
"a branded EvolutionArtifactPorts ledger resolver is required",
|
|
516
|
+
);
|
|
517
|
+
}
|
|
518
|
+
this._resolve = ledgerArtifactResolver;
|
|
519
|
+
Object.freeze(this);
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
_events(receiptDigest) {
|
|
523
|
+
digest(receiptDigest, "receiptDigest");
|
|
524
|
+
const events = this._read();
|
|
525
|
+
if (!Array.isArray(events)) {
|
|
526
|
+
fail("learning synthesis evaluation ledger read is invalid");
|
|
527
|
+
}
|
|
528
|
+
return events.filter(
|
|
529
|
+
(event) =>
|
|
530
|
+
event.schema === EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA &&
|
|
531
|
+
event.type === GOVERNED_SKILL_SYNTHESIS_EVALUATION_LEDGER_EVENT &&
|
|
532
|
+
event.tenantId === this.descriptor.tenantId &&
|
|
533
|
+
event.correlationId === this.descriptor.streamId &&
|
|
534
|
+
event.eventId ===
|
|
535
|
+
`${GOVERNED_SKILL_SYNTHESIS_EVALUATION_LEDGER_EVENT}.${receiptDigest.slice(7)}`,
|
|
536
|
+
);
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
_resolveEvent(event) {
|
|
540
|
+
const authority = this._verifyLedger();
|
|
541
|
+
let resolution;
|
|
542
|
+
try {
|
|
543
|
+
resolution = this._resolve({
|
|
544
|
+
epoch: authority.epoch,
|
|
545
|
+
ledgerId: authority.ledgerId,
|
|
546
|
+
ref: event.subjectRef,
|
|
547
|
+
tenantId: this.descriptor.artifactTenantId,
|
|
548
|
+
});
|
|
549
|
+
} catch (cause) {
|
|
550
|
+
const error = new Error(
|
|
551
|
+
"learning synthesis evaluation artifact resolution failed",
|
|
552
|
+
{ cause },
|
|
553
|
+
);
|
|
554
|
+
error.code = GOVERNED_SKILL_SYNTHESIS_EVALUATION_CORRUPT_CODE;
|
|
555
|
+
throw error;
|
|
556
|
+
}
|
|
557
|
+
const receipt = parseResolution(resolution, event, this.descriptor);
|
|
558
|
+
if (
|
|
559
|
+
event.artifactTenantId !== this.descriptor.artifactTenantId ||
|
|
560
|
+
event.skillName !== receipt.skillName ||
|
|
561
|
+
event.decision !== (receipt.accepted ? "accepted" : "rejected") ||
|
|
562
|
+
!Array.isArray(event.sourceRefs) ||
|
|
563
|
+
event.sourceRefs.length !== 0
|
|
564
|
+
) {
|
|
565
|
+
fail("learning synthesis evaluation ledger event binding is invalid");
|
|
566
|
+
}
|
|
567
|
+
return receipt;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
async load(receiptDigest) {
|
|
571
|
+
const events = this._events(receiptDigest);
|
|
572
|
+
if (events.length > 1) {
|
|
573
|
+
fail("learning synthesis evaluation has duplicate ledger events");
|
|
574
|
+
}
|
|
575
|
+
if (events.length === 0) return null;
|
|
576
|
+
const receipt = this._resolveEvent(events[0]);
|
|
577
|
+
if (receipt.receiptDigest !== receiptDigest) {
|
|
578
|
+
fail("learning synthesis evaluation ledger subject was substituted");
|
|
579
|
+
}
|
|
580
|
+
const authority = this._verifyLedger();
|
|
581
|
+
if (
|
|
582
|
+
(await this._verifyAttestation({
|
|
583
|
+
receiptDigest: receipt.receiptDigest,
|
|
584
|
+
candidateDigest: receipt.candidateDigest,
|
|
585
|
+
descriptor: Object.freeze({
|
|
586
|
+
authorityId: this.descriptor.authorityId,
|
|
587
|
+
revision: this.descriptor.revision,
|
|
588
|
+
handlerArtifactDigest: this.descriptor.handlerArtifactDigest,
|
|
589
|
+
}),
|
|
590
|
+
attestation: receipt.attestation,
|
|
591
|
+
...(this._attestationLedgerBound
|
|
592
|
+
? {
|
|
593
|
+
ledgerContext: Object.freeze({
|
|
594
|
+
epoch: authority.epoch,
|
|
595
|
+
ledgerId: authority.ledgerId,
|
|
596
|
+
sequence: events[0].sequence,
|
|
597
|
+
}),
|
|
598
|
+
}
|
|
599
|
+
: {}),
|
|
600
|
+
})) !== true
|
|
601
|
+
) {
|
|
602
|
+
fail("learning synthesis evaluation attestation was rejected on read");
|
|
603
|
+
}
|
|
604
|
+
return Object.freeze({
|
|
605
|
+
receipt: Object.freeze(structuredClone(receipt)),
|
|
606
|
+
persistence: persistenceReceipt(receipt, events[0], true),
|
|
607
|
+
});
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
async commit(receipt) {
|
|
611
|
+
validateReceipt(receipt, this.descriptor);
|
|
612
|
+
const existing = await this.load(receipt.receiptDigest);
|
|
613
|
+
if (existing) {
|
|
614
|
+
if (canonical(existing.receipt) !== canonical(receipt)) {
|
|
615
|
+
fail("learning synthesis evaluation retry substituted its receipt");
|
|
616
|
+
}
|
|
617
|
+
return existing.persistence;
|
|
618
|
+
}
|
|
619
|
+
const head = this._verifyLedger();
|
|
620
|
+
if (
|
|
621
|
+
(await this._verifyAttestation({
|
|
622
|
+
receiptDigest: receipt.receiptDigest,
|
|
623
|
+
candidateDigest: receipt.candidateDigest,
|
|
624
|
+
descriptor: Object.freeze({
|
|
625
|
+
authorityId: this.descriptor.authorityId,
|
|
626
|
+
revision: this.descriptor.revision,
|
|
627
|
+
handlerArtifactDigest: this.descriptor.handlerArtifactDigest,
|
|
628
|
+
}),
|
|
629
|
+
attestation: receipt.attestation,
|
|
630
|
+
...(this._attestationLedgerBound
|
|
631
|
+
? {
|
|
632
|
+
ledgerContext: Object.freeze({
|
|
633
|
+
epoch: head.epoch,
|
|
634
|
+
ledgerId: head.ledgerId,
|
|
635
|
+
sequence: head.sequence + 1,
|
|
636
|
+
}),
|
|
637
|
+
}
|
|
638
|
+
: {}),
|
|
639
|
+
})) !== true
|
|
640
|
+
) {
|
|
641
|
+
fail(
|
|
642
|
+
"learning synthesis evaluation attestation was rejected before write",
|
|
643
|
+
);
|
|
644
|
+
}
|
|
645
|
+
const published = this._put(ARTIFACT_TYPE, receipt, {
|
|
646
|
+
audience: this.descriptor.audience,
|
|
647
|
+
purpose: this.descriptor.purpose,
|
|
648
|
+
retention: "ledger",
|
|
649
|
+
});
|
|
650
|
+
if (
|
|
651
|
+
!published?.ref ||
|
|
652
|
+
published.receipt?.persisted !== true ||
|
|
653
|
+
published.receipt.readbackVerified !== true ||
|
|
654
|
+
published.receipt.integrityVerified !== true ||
|
|
655
|
+
published.receipt.retention !== "ledger"
|
|
656
|
+
) {
|
|
657
|
+
fail("learning synthesis evaluation artifact was not durably read back");
|
|
658
|
+
}
|
|
659
|
+
const eventId = `${GOVERNED_SKILL_SYNTHESIS_EVALUATION_LEDGER_EVENT}.${receipt.receiptDigest.slice(7)}`;
|
|
660
|
+
const ledgerReceipt = this._append(
|
|
661
|
+
{
|
|
662
|
+
artifactTenantId: this.descriptor.artifactTenantId,
|
|
663
|
+
correlationId: this.descriptor.streamId,
|
|
664
|
+
decision: receipt.accepted ? "accepted" : "rejected",
|
|
665
|
+
eventId,
|
|
666
|
+
reason: receipt.accepted
|
|
667
|
+
? "governed Skill synthesis evaluation accepted"
|
|
668
|
+
: "governed Skill synthesis evaluation rejected",
|
|
669
|
+
skillName: receipt.skillName,
|
|
670
|
+
sourceRefs: [],
|
|
671
|
+
subjectRef: published.ref,
|
|
672
|
+
tenantId: this.descriptor.tenantId,
|
|
673
|
+
timestamp: new Date().toISOString(),
|
|
674
|
+
type: GOVERNED_SKILL_SYNTHESIS_EVALUATION_LEDGER_EVENT,
|
|
675
|
+
},
|
|
676
|
+
{ expectedHeadDigest: head.headDigest, expectedSequence: head.sequence },
|
|
677
|
+
);
|
|
678
|
+
if (
|
|
679
|
+
ledgerReceipt?.authenticated !== true ||
|
|
680
|
+
ledgerReceipt.committed !== true ||
|
|
681
|
+
ledgerReceipt.durable !== true ||
|
|
682
|
+
ledgerReceipt.eventId !== eventId ||
|
|
683
|
+
!DIGEST.test(ledgerReceipt.receiptDigest ?? "")
|
|
684
|
+
) {
|
|
685
|
+
fail("learning synthesis evaluation ledger append was not durable");
|
|
686
|
+
}
|
|
687
|
+
const events = this._events(receipt.receiptDigest);
|
|
688
|
+
if (events.length !== 1) {
|
|
689
|
+
fail("learning synthesis evaluation ledger readback is missing");
|
|
690
|
+
}
|
|
691
|
+
const stored = this._resolveEvent(events[0]);
|
|
692
|
+
if (canonical(stored) !== canonical(receipt)) {
|
|
693
|
+
fail("learning synthesis evaluation ledger readback was substituted");
|
|
694
|
+
}
|
|
695
|
+
return persistenceReceipt(receipt, events[0], false);
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
createReceiptPersistencePort() {
|
|
699
|
+
const persist = Object.freeze(async (receipt) => this.commit(receipt));
|
|
700
|
+
PERSISTENCE_PORTS.add(persist);
|
|
701
|
+
return persist;
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
export function createGovernedSkillSynthesisEvaluationLedgerAdapter(options) {
|
|
706
|
+
return new GovernedSkillSynthesisEvaluationLedgerAdapter(options);
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
export function isGovernedSkillSynthesisEvaluationPersistencePort(value) {
|
|
710
|
+
return PERSISTENCE_PORTS.has(value);
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
export function isGovernedSkillSynthesisEvaluationPersistenceReceipt(value) {
|
|
714
|
+
return PERSISTENCE_RECEIPTS.has(value);
|
|
715
|
+
}
|