chainlesschain 0.166.72 → 0.166.76
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -2
- package/package.json +2 -1
- package/scripts/pm-exploration-effect.mjs +188 -0
- package/src/assets/web-panel/assets/{AIOps-Vk4bgcvz.js → AIOps-CNaejClV.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-dm1pfXdM.js → ActionButton-CF_CVKT_.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-C9WdXlkB.js → Analytics-a3Z6J7gv.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-0f-jWk68.js → AppLayout-BFtWEnct.js} +5 -5
- package/src/assets/web-panel/assets/Artifacts-BQ8oeMvX.js +1 -0
- package/src/assets/web-panel/assets/{Audit-CymWJrNf.js → Audit-NOo9bmgk.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-9bWGX_cn.js → BackgroundAgents-QRc7F3Tp.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DFBHB3_Y.js → Backup-UlVgLn2P.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-D9Lm9d3n.js → BaseInput-BER9LJAr.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-maC7odiU.js → Chat-Z8z2Fdfz.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-Crsqn0B1.js → ChatBubbleRenderer-DdmuBrdQ.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-BrZgAIL0.js → Checkbox-CXPgyB8L.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-ChqWBE8R.js → Codegen-D1vOsLJ7.js} +1 -1
- package/src/assets/web-panel/assets/{Col-C5TaXHn9.js → Col-ucLnUJC7.js} +1 -1
- package/src/assets/web-panel/assets/{Community-D8m4Egsw.js → Community-COsV9n9t.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CMJmi_Bw.js → Compact-D0EkBEYh.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CW7Bwy8s.js → Compliance-C8w9SUjt.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DLhPTsU6.js → Cowork-CmVaKEJS.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-DBrXtf_1.js → Cron-B_FiMMV2.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CzLbJF3j.js → Crosschain-ByO3YL8N.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DreItINq.js → DID-DwpsLM9r.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-B_gO9CjY.js → Dashboard-B_8IUvM_.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DXpPiTH_.js → Dropdown-Bo6WQkuX.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-Cb1YonC_.js → EmailListRenderer-C9LiQesx.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-GQb6tV_E.js → EvolutionSettings-Pc1IpRfk.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DUtpqpsn.js → FamilyGuardDashboard-Dst6VUnO.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-CfZsj0gb.js → Federation-Ci7CoLkJ.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Cdr40ozm.js → FormItemContext-bdDyUhUM.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BRaf18hh.js → GenericCardRenderer-CrRwOUVi.js} +1 -1
- package/src/assets/web-panel/assets/{Git-7SqGn3Zi.js → Git-Dis8h-Z-.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-D1mfL8Fz.js → Governance-DX7OH5w2.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BXVyCWMd.js → Inference-Cavv_Q_Z.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-C-wAA2Ub.js → KnowledgeGraph-Cck8tnZn.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DWxiJiFe.js → Logs-BQt3aGMu.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BIUeeiVA.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-CmOVgbTO.js → Marketplace-CdmAKNSN.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Cx4WyryN.js → McpTools-BUlJdyPY.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-Di6wy0Ky.js → Memory-DQRTQDr-.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DrR7I1A7.js → MobileBridge-C0dnxgsl.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-SnNFgay-.js → MobileProjects-DQ5Gy7fa.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-DPZpfO4G.js → Mtc-Xl7u2isS.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-CTT74J6Y.js → MtcAudit-C3KX0574.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-DoLT96hm.js → Multisig-CHEhfkn8.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-BY-9TS7_.js → NLProgramming-Ce38mH-8.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-1_rKLQkS.js → Notes-C7nuTd7c.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-D8N1NZ6Y.js → NotificationSettings-BcoEcyq8.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-Ch-HjmbS.js → OrderTableRenderer-D-t5hKkx.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-DKQtaPAc.js → Organization-C_BGi4xi.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-B3n9XpS2.js → Overflow-BodhraDq.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Fn8LWurl.js → P2P-BTa3sAIy.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CsumgiUO.js → PdhVaultBrowser-BjZslP9T.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-CTCN6Rk6.js → Permissions-u3UDzGef.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-BwpvzXm7.js → PersonalDataHub-Cb7ybv65.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-C1_hrCCQ.js → Pipeline-CS24k-P7.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-C-BmNft5.js → Privacy-Ddj6Kqs7.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-B9HYk17G.js → ProjectInit-Bg5uQIgg.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BFgA-an1.js → ProjectSettings-AmPR8T12.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-Yofw9TrC.js → Projects-DGSbAyTK.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-B83JppEP.js → Providers-Dc1C3lbB.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-D5ZRpUGC.js → QrScannerModal-Cv3HXpce.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-B-mz9iY-.js → QuickAsk-3dpbXARb.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DtjVu00v.js → Recommend-5aGRVnJK.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-Dk8IBiG3.js → RemoteSession-CTS2jx0p.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-DpTIK7Oe.js → Reputation-BxaKI0hY.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DVYQoXil.js → Row-C23uQdwd.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-ikMaTwEE.js → RssFeed-ssX9YOhm.js} +3 -3
- package/src/assets/web-panel/assets/{Search-CHVHCNdo.js → Search-C24GogII.js} +1 -1
- package/src/assets/web-panel/assets/{Security-MxjX-UDp.js → Security-DdAcGKkk.js} +2 -2
- package/src/assets/web-panel/assets/{Services-CmwTYlHk.js → Services-D0dCiEuq.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-BQzBoW5V.js → Skeleton-DEY44o0v.js} +1 -1
- package/src/assets/web-panel/assets/Skills-CYt0Mu2W.js +1 -0
- package/src/assets/web-panel/assets/{Sla-DOQbR10a.js → Sla-B_bbo2vB.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-a2BBjtTL.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-BPyc0P-r.js → SyncSettings-CpIXql0Z.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-BYQKU-GL.js +1 -0
- package/src/assets/web-panel/assets/{Templates-BRpihbvV.js → Templates-C_44nVPq.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-B1qu8vDX.js → Tenant-CyZ2ey2P.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-CEe3YAvM.js → Terminal-DwGNHWnp.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Biz2ENj5.js → TimelineRenderer-BTAHNkqU.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-Bh-mJyas.js → Tokens-DCJWkUwc.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DaFKe1bY.js → Trigger-BCjDO9-E.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DsJ7u_-G.js → Trust-_YS8WbRb.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-9I90JZxO.js → UkeySign-m6R8xGq7.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-C96s3pW9.js → VideoEditing-xOfk29c4.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DTMqIySe.js → Wallet-B1Gw0awc.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-C3rh3szY.js → WebAuthn-CHK5ft18.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-C3as7vBp.js → WorkflowEditor-DEp1ukQQ.js} +1 -1
- package/src/assets/web-panel/assets/{chat-zsGetwuT.js → chat-B2sFizun.js} +1 -1
- package/src/assets/web-panel/assets/{colors-Dt9qbWYV.js → colors-DJ17YV1E.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BJWYHVIL.js → compact-item-CBhJJgEC.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-pKrpnY7l.js → createContext-BZkpvNJy.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DZhu13vj.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-sbUKl7Xu.js → hasIn-C0ZKo6Ei.js} +1 -1
- package/src/assets/web-panel/assets/{index-BfQmb4PB.js → index-4oULtRqE.js} +1 -1
- package/src/assets/web-panel/assets/{index-DD_IBhgm.js → index-5K2z_tgO.js} +1 -1
- package/src/assets/web-panel/assets/{index-BWPF2Hth.js → index-8ueG48gl.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRsSdHdW.js → index-BEnd5fiz.js} +1 -1
- package/src/assets/web-panel/assets/{index-BiZ6Lupa.js → index-BGIvhCPl.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQtTUsCI.js → index-BMxOoITz.js} +1 -1
- package/src/assets/web-panel/assets/{index-qE4san4o.js → index-BNp6HKFh.js} +1 -1
- package/src/assets/web-panel/assets/{index-omZRNwB7.js → index-BOfPp5OV.js} +1 -1
- package/src/assets/web-panel/assets/{index-CnrxgbPB.js → index-Bc3vVG2X.js} +1 -1
- package/src/assets/web-panel/assets/{index-CR5WxgE-.js → index-BoDUYyuo.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRpfrG-e.js → index-BpyrhOeh.js} +1 -1
- package/src/assets/web-panel/assets/index-C6iFyQYz.js +1 -0
- package/src/assets/web-panel/assets/{index-Dmp7IdrF.js → index-C7gv9dvb.js} +1 -1
- package/src/assets/web-panel/assets/{index-5GohpTfK.js → index-C9gYiACH.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7tOZZAs.js → index-CCOr6Q27.js} +1 -1
- package/src/assets/web-panel/assets/{index--wWXhZQU.js → index-CW5o1Gar.js} +1 -1
- package/src/assets/web-panel/assets/{index-BFMPJahZ.js → index-CZW84cEf.js} +3 -3
- package/src/assets/web-panel/assets/{index-DRAzhNw6.js → index-CZlkPrxb.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bf8dv266.js → index-CdxJm-HB.js} +1 -1
- package/src/assets/web-panel/assets/{index-sakhsZMa.js → index-Chct9tL8.js} +1 -1
- package/src/assets/web-panel/assets/{index-DFQTgkPD.js → index-Cn5UzvgR.js} +1 -1
- package/src/assets/web-panel/assets/{index-BR1gZBlK.js → index-Ctguam0K.js} +1 -1
- package/src/assets/web-panel/assets/index-CztThH9f.js +1 -0
- package/src/assets/web-panel/assets/{index-T8ASbPWt.js → index-DHtpMr1G.js} +1 -1
- package/src/assets/web-panel/assets/{index-fQ-JtwM7.js → index-DJkoJzTU.js} +1 -1
- package/src/assets/web-panel/assets/{index-Di-YcQHn.js → index-DLMr5KMd.js} +1 -1
- package/src/assets/web-panel/assets/{index-oUag3zZf.js → index-DLo8Ls9u.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSXJ2PbY.js → index-DM0rWF6z.js} +1 -1
- package/src/assets/web-panel/assets/{index-C_z7zLle.js → index-DOBXNMdh.js} +1 -1
- package/src/assets/web-panel/assets/{index-0CK6iR4G.js → index-Dfgxe-fw.js} +1 -1
- package/src/assets/web-panel/assets/{index-B53DhH1R.js → index-DjdSFO0d.js} +1 -1
- package/src/assets/web-panel/assets/{index-vTPOhhfW.js → index-DrU5xVpF.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJZq5jWm.js → index-DumLgj1t.js} +1 -1
- package/src/assets/web-panel/assets/{index-BZmBSuN8.js → index-Dxe0YlZe.js} +1 -1
- package/src/assets/web-panel/assets/{index-DoMii5CD.js → index-DyiCbHeL.js} +1 -1
- package/src/assets/web-panel/assets/{index-n8vVPeJ6.js → index-IHgzfc1u.js} +1 -1
- package/src/assets/web-panel/assets/{index-DIxu3nOh.js → index-KzNhWykP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWBlZsqf.js → index-LPPe0val.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9DoXtNz.js → index-vFMwiAN4.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BVpFM2mv.js → initDefaultProps-Cqfoq0TJ.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Mrl9_kZM.js → motion-CIiVJHNu.js} +1 -1
- package/src/assets/web-panel/assets/{move-CvRC7fRw.js → move-CFl1o_A8.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-C7PSeivU.js → mtc-parser-DYoCxcZ1.js} +1 -1
- package/src/assets/web-panel/assets/{omit-RI1cO_Ok.js → omit-C1P2q5TY.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-akwD3e22.js → pickAttrs-BtTRpJtC.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-C4f-tfqj.js → placementArrow-Cst2PcNM.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-hyHNGoSW.js → responsiveObserve-CF5kalV2.js} +1 -1
- package/src/assets/web-panel/assets/{slide-B6vlTDr6.js → slide-CtHGqpXN.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-D8poWZW8.js → statusUtils-N__biHXf.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Bz1ZKvoD.js → styleChecker-DR8V_H-i.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-C-vv_T11.js → useFlexGapSupport-D274dqun.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BubqlAej.js → useFs-BwHLYU5b.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CTNJrVC8.js → usePersonalDataHub-BiA-hVqt.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DbT41Wli.js → vnode-Bugl94dy.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-R0Rxz73D.js → zoom-DEFl8GCu.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/data/changelog.json +52 -0
- package/src/lib/evolution/evolution-eval-child-evidence-ledger-adapter.js +2 -0
- package/src/lib/evolution/evolution-eval-cohort-enrollment.js +770 -0
- package/src/lib/evolution/evolution-eval-contracts.js +86 -0
- package/src/lib/evolution/evolution-eval-gate.js +423 -115
- package/src/lib/evolution/evolution-eval-launch-admission.js +505 -0
- package/src/lib/evolution/pm-exploration-benchmark.js +2014 -49
- package/src/lib/evolution/skill-target-matrix-eval.js +84 -3
- package/src/lib/evolution/skill-writer-inventory-manifest.js +4 -1
- package/src/lib/task-progress-tracker.js +47 -4
- package/src/lib/with-file-lock.js +81 -16
- package/src/runtime/agent-core.js +18 -7
- package/src/assets/web-panel/assets/Artifacts-C7HWVeFu.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-BJl3Hibe.js +0 -1
- package/src/assets/web-panel/assets/Skills-B-mPG69i.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-wPQkSA9J.js +0 -1
- package/src/assets/web-panel/assets/Tasks-DbBA-eHJ.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CAmY8PZd.js +0 -1
- package/src/assets/web-panel/assets/index-Dfsrnshy.js +0 -1
- package/src/assets/web-panel/assets/index-tlLfPT5e.js +0 -1
|
@@ -9,89 +9,44 @@
|
|
|
9
9
|
|
|
10
10
|
import { createHash, randomBytes } from "node:crypto";
|
|
11
11
|
import { isProxy } from "node:util/types";
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
});
|
|
51
|
-
export const EVOLUTION_EVAL_TARGET_INVOCATION_SCHEMA =
|
|
52
|
-
"chainlesschain.evolution-eval-target-invocation/v2";
|
|
53
|
-
export const EVOLUTION_EVAL_TARGET_REVOCATION_SCHEMA =
|
|
54
|
-
"chainlesschain.evolution-eval-target-revocation/v2";
|
|
55
|
-
export const EVOLUTION_EVAL_EXECUTION_SCHEMA =
|
|
56
|
-
"chainlesschain.evolution-eval-execution-receipt/v1";
|
|
57
|
-
export const EVOLUTION_EVAL_GRADE_SCHEMA =
|
|
58
|
-
"chainlesschain.evolution-eval-grade-receipt/v1";
|
|
59
|
-
export const EVOLUTION_EVAL_SAFETY_SCHEMA =
|
|
60
|
-
"chainlesschain.evolution-eval-safety-receipt/v1";
|
|
61
|
-
|
|
62
|
-
export const EVOLUTION_EVAL_INVALID_CODE = "CC_EVOLUTION_EVAL_INVALID";
|
|
63
|
-
export const EVOLUTION_EVAL_LEAKAGE_CODE = "CC_EVOLUTION_EVAL_LEAKAGE";
|
|
64
|
-
export const EVOLUTION_EVAL_AUTHORITY_FAILED_CODE =
|
|
65
|
-
"CC_EVOLUTION_EVAL_AUTHORITY_FAILED";
|
|
66
|
-
export const EVOLUTION_EVAL_EXECUTION_FAILED_CODE =
|
|
67
|
-
"CC_EVOLUTION_EVAL_EXECUTION_FAILED";
|
|
68
|
-
export const EVOLUTION_EVAL_GRADER_FAILED_CODE =
|
|
69
|
-
"CC_EVOLUTION_EVAL_GRADER_FAILED";
|
|
70
|
-
export const EVOLUTION_EVAL_SAFETY_FAILED_CODE =
|
|
71
|
-
"CC_EVOLUTION_EVAL_SAFETY_FAILED";
|
|
72
|
-
export const EVOLUTION_EVAL_SUPERVISOR_UNRESPONSIVE_CODE =
|
|
73
|
-
"CC_EVOLUTION_EVAL_SUPERVISOR_UNRESPONSIVE";
|
|
74
|
-
export const EVOLUTION_EVAL_TARGET_SETTLEMENT_UNCONFIRMED_CODE =
|
|
75
|
-
"CC_EVOLUTION_EVAL_TARGET_SETTLEMENT_UNCONFIRMED";
|
|
76
|
-
|
|
77
|
-
export const EVOLUTION_EVAL_ATTESTATION_PURPOSES = Object.freeze({
|
|
78
|
-
suite: "chainlesschain.evolution-eval.suite-authority/v1",
|
|
79
|
-
environment: "chainlesschain.evolution-eval.environment/v1",
|
|
80
|
-
artifact: "chainlesschain.evolution-eval.artifact/v1",
|
|
81
|
-
provenance: "chainlesschain.evolution-eval.provenance/v1",
|
|
82
|
-
subject: "chainlesschain.evolution-eval.subject/v1",
|
|
83
|
-
replay: "chainlesschain.evolution-eval.handle-replay/v1",
|
|
84
|
-
supervisor: "chainlesschain.evolution-eval.deadline-supervisor/v3",
|
|
85
|
-
targetInvocation:
|
|
86
|
-
"chainlesschain.evolution-eval.target-invocation-evidence/v1",
|
|
87
|
-
targetRevocation:
|
|
88
|
-
"chainlesschain.evolution-eval.target-revocation-evidence/v1",
|
|
89
|
-
execution: "chainlesschain.evolution-eval.execution/v1",
|
|
90
|
-
grade: "chainlesschain.evolution-eval.grade/v1",
|
|
91
|
-
safety: "chainlesschain.evolution-eval.safety/v1",
|
|
92
|
-
receipt: "chainlesschain.evolution-eval.receipt/v3",
|
|
93
|
-
clock: "chainlesschain.evolution-eval.trusted-clock/v1",
|
|
94
|
-
});
|
|
12
|
+
import {
|
|
13
|
+
admitEvolutionEvalLaunch,
|
|
14
|
+
captureEvolutionEvalLaunchAdmissionBinding,
|
|
15
|
+
isEvolutionEvalLaunchAdmissionAuthority,
|
|
16
|
+
} from "./evolution-eval-launch-admission.js";
|
|
17
|
+
|
|
18
|
+
import {
|
|
19
|
+
EVOLUTION_EVAL_TASK_SCHEMA,
|
|
20
|
+
EVOLUTION_EVAL_SUITE_SCHEMA,
|
|
21
|
+
EVOLUTION_EVAL_POLICY_SCHEMA,
|
|
22
|
+
EVOLUTION_EVAL_RECEIPT_SCHEMA,
|
|
23
|
+
EVOLUTION_EVAL_RESULT_EVIDENCE_SCHEMA,
|
|
24
|
+
EVOLUTION_EVAL_SUITE_AUTHORITY_SCHEMA,
|
|
25
|
+
EVOLUTION_EVAL_ENVIRONMENT_SCHEMA,
|
|
26
|
+
EVOLUTION_EVAL_ARTIFACT_SCHEMA,
|
|
27
|
+
EVOLUTION_EVAL_PROVENANCE_SCHEMA,
|
|
28
|
+
EVOLUTION_EVAL_SUBJECT_SCHEMA,
|
|
29
|
+
EVOLUTION_EVAL_REPLAY_SCHEMA,
|
|
30
|
+
EVOLUTION_EVAL_SUPERVISION_SCHEMA,
|
|
31
|
+
EVOLUTION_EVAL_ISOLATED_TARGET_SCHEMA,
|
|
32
|
+
EVOLUTION_EVAL_AUTHORITY_DESCRIPTOR_SCHEMA,
|
|
33
|
+
EVOLUTION_EVAL_AUTHORITY_ROOT_SEMANTICS,
|
|
34
|
+
EVOLUTION_EVAL_TARGET_INVOCATION_SCHEMA,
|
|
35
|
+
EVOLUTION_EVAL_TARGET_REVOCATION_SCHEMA,
|
|
36
|
+
EVOLUTION_EVAL_EXECUTION_SCHEMA,
|
|
37
|
+
EVOLUTION_EVAL_GRADE_SCHEMA,
|
|
38
|
+
EVOLUTION_EVAL_SAFETY_SCHEMA,
|
|
39
|
+
EVOLUTION_EVAL_INVALID_CODE,
|
|
40
|
+
EVOLUTION_EVAL_LEAKAGE_CODE,
|
|
41
|
+
EVOLUTION_EVAL_AUTHORITY_FAILED_CODE,
|
|
42
|
+
EVOLUTION_EVAL_EXECUTION_FAILED_CODE,
|
|
43
|
+
EVOLUTION_EVAL_GRADER_FAILED_CODE,
|
|
44
|
+
EVOLUTION_EVAL_SAFETY_FAILED_CODE,
|
|
45
|
+
EVOLUTION_EVAL_SUPERVISOR_UNRESPONSIVE_CODE,
|
|
46
|
+
EVOLUTION_EVAL_TARGET_SETTLEMENT_UNCONFIRMED_CODE,
|
|
47
|
+
EVOLUTION_EVAL_ATTESTATION_PURPOSES,
|
|
48
|
+
} from "./evolution-eval-contracts.js";
|
|
49
|
+
export * from "./evolution-eval-contracts.js";
|
|
95
50
|
|
|
96
51
|
const DIGEST_PATTERN = /^sha256:[a-f0-9]{64}$/u;
|
|
97
52
|
const TASK_BINDING_NONCE_PATTERN = /^task-binding-[a-f0-9]{48,128}$/u;
|
|
@@ -711,6 +666,7 @@ const RECEIPT_KEYS = new Set([
|
|
|
711
666
|
const SPLIT_COUNT_KEYS = new Set(SPLITS);
|
|
712
667
|
|
|
713
668
|
const GATE_INSTANCES = new WeakSet();
|
|
669
|
+
const GATE_LAUNCH_BINDINGS = new WeakMap();
|
|
714
670
|
const RECEIPT_VERIFIER_INSTANCES = new WeakSet();
|
|
715
671
|
const IMMUTABLE_ISOLATED_TARGET_BINDINGS = new WeakMap();
|
|
716
672
|
|
|
@@ -1811,6 +1767,26 @@ function normalizeRunEvaluationContext(value) {
|
|
|
1811
1767
|
});
|
|
1812
1768
|
}
|
|
1813
1769
|
|
|
1770
|
+
/** Freeze the exact caller-controlled part of a launch before a run ID exists. */
|
|
1771
|
+
export function computeEvolutionEvalLaunchRequestDigest(input) {
|
|
1772
|
+
preflightCanonicalStructure(input);
|
|
1773
|
+
assertExactRecord(input, RUN_REQUEST_KEYS, "evaluation launch request");
|
|
1774
|
+
return digest(
|
|
1775
|
+
{
|
|
1776
|
+
suiteRef: normalizeId(input.suiteRef, "suiteRef", 256),
|
|
1777
|
+
candidateId: normalizeDigest(input.candidateId, "candidateId"),
|
|
1778
|
+
baselineId: normalizeDigest(input.baselineId, "baselineId"),
|
|
1779
|
+
targetEnvironmentRef: normalizeId(
|
|
1780
|
+
input.targetEnvironmentRef,
|
|
1781
|
+
"targetEnvironmentRef",
|
|
1782
|
+
256,
|
|
1783
|
+
),
|
|
1784
|
+
evaluationContext: normalizeRunEvaluationContext(input.evaluationContext),
|
|
1785
|
+
},
|
|
1786
|
+
"chainlesschain.evolution-eval-launch-request/v1",
|
|
1787
|
+
);
|
|
1788
|
+
}
|
|
1789
|
+
|
|
1814
1790
|
function normalizeEvaluationContext(value) {
|
|
1815
1791
|
preflightCanonicalStructure(value);
|
|
1816
1792
|
assertExactRecord(value, EVALUATION_CONTEXT_KEYS, "evaluation context");
|
|
@@ -2647,6 +2623,27 @@ function comparisonSummary(results, confidenceZ, seedCount) {
|
|
|
2647
2623
|
});
|
|
2648
2624
|
}
|
|
2649
2625
|
|
|
2626
|
+
function resultEvidenceCore(receipt, results) {
|
|
2627
|
+
return {
|
|
2628
|
+
schema: EVOLUTION_EVAL_RESULT_EVIDENCE_SCHEMA,
|
|
2629
|
+
receiptDigest: receipt.receiptDigest,
|
|
2630
|
+
validation: results.validation,
|
|
2631
|
+
test: results.test,
|
|
2632
|
+
qualifiesForPromotion: false,
|
|
2633
|
+
};
|
|
2634
|
+
}
|
|
2635
|
+
|
|
2636
|
+
function buildResultEvidence(receipt, results) {
|
|
2637
|
+
const core = resultEvidenceCore(receipt, results);
|
|
2638
|
+
const evidence = {
|
|
2639
|
+
...core,
|
|
2640
|
+
evidenceDigest: digest(core, EVOLUTION_EVAL_RESULT_EVIDENCE_SCHEMA),
|
|
2641
|
+
};
|
|
2642
|
+
// Include the digest envelope in the same bound used by the readback path.
|
|
2643
|
+
canonicalJson(evidence);
|
|
2644
|
+
return deepFreeze(evidence);
|
|
2645
|
+
}
|
|
2646
|
+
|
|
2650
2647
|
function decideSplit(summary, policy) {
|
|
2651
2648
|
const { baseline, candidate } = summary;
|
|
2652
2649
|
if (candidate.securityViolations > 0 || candidate.permissionViolations > 0) {
|
|
@@ -3608,6 +3605,7 @@ export class EvolutionEvalGate {
|
|
|
3608
3605
|
#authorityPolicies;
|
|
3609
3606
|
#supervision;
|
|
3610
3607
|
#clock;
|
|
3608
|
+
#launchAdmission;
|
|
3611
3609
|
|
|
3612
3610
|
constructor({
|
|
3613
3611
|
policy,
|
|
@@ -3632,7 +3630,24 @@ export class EvolutionEvalGate {
|
|
|
3632
3630
|
invocationEvidenceVerifier,
|
|
3633
3631
|
revocationEvidenceVerifier,
|
|
3634
3632
|
clock,
|
|
3633
|
+
launchAdmission,
|
|
3635
3634
|
}) {
|
|
3635
|
+
if (
|
|
3636
|
+
launchAdmission !== undefined &&
|
|
3637
|
+
!isEvolutionEvalLaunchAdmissionAuthority(launchAdmission)
|
|
3638
|
+
) {
|
|
3639
|
+
throw evalError(
|
|
3640
|
+
EVOLUTION_EVAL_INVALID_CODE,
|
|
3641
|
+
"launchAdmission must be a trusted admission authority",
|
|
3642
|
+
);
|
|
3643
|
+
}
|
|
3644
|
+
this.#launchAdmission = launchAdmission;
|
|
3645
|
+
GATE_LAUNCH_BINDINGS.set(
|
|
3646
|
+
this,
|
|
3647
|
+
launchAdmission === undefined
|
|
3648
|
+
? null
|
|
3649
|
+
: captureEvolutionEvalLaunchAdmissionBinding(launchAdmission),
|
|
3650
|
+
);
|
|
3636
3651
|
this.#policy = verifyEvolutionEvalPolicy(policy);
|
|
3637
3652
|
this.#authorityPolicies = normalizeAuthorityPolicies(authorityPolicies);
|
|
3638
3653
|
const supervisorPolicy = this.#authorityPolicies.supervisor;
|
|
@@ -5149,6 +5164,7 @@ export class EvolutionEvalGate {
|
|
|
5149
5164
|
this.#policy.confidenceZ,
|
|
5150
5165
|
this.#policy.seeds.length,
|
|
5151
5166
|
),
|
|
5167
|
+
...(run.includeResultEvidence ? { results } : {}),
|
|
5152
5168
|
});
|
|
5153
5169
|
}
|
|
5154
5170
|
|
|
@@ -5271,10 +5287,46 @@ export class EvolutionEvalGate {
|
|
|
5271
5287
|
signedReceipt.receiptDigest,
|
|
5272
5288
|
"receiptDigest",
|
|
5273
5289
|
);
|
|
5290
|
+
if (run.includeResultEvidence) {
|
|
5291
|
+
// Export only completed validation + test sets, after the final receipt
|
|
5292
|
+
// was independently signed and verified. No observer runs during grading.
|
|
5293
|
+
const resultEvidence = run.results
|
|
5294
|
+
? buildResultEvidence(signedReceipt, run.results)
|
|
5295
|
+
: null;
|
|
5296
|
+
const exportedAt = readClock(this.#clock).milliseconds;
|
|
5297
|
+
if (
|
|
5298
|
+
exportedAt >= run.deadlineMs ||
|
|
5299
|
+
NATIVE_MONOTONIC_NOW() >= run.runLocalDeadlineMs ||
|
|
5300
|
+
Date.parse(signedReceipt.expiresAt) <= exportedAt ||
|
|
5301
|
+
run.portExpiries.some(
|
|
5302
|
+
(expiresAt) => Date.parse(expiresAt) <= exportedAt,
|
|
5303
|
+
)
|
|
5304
|
+
) {
|
|
5305
|
+
throw evalError(
|
|
5306
|
+
EVOLUTION_EVAL_EXECUTION_FAILED_CODE,
|
|
5307
|
+
"evaluation evidence export crossed the evaluation deadline",
|
|
5308
|
+
);
|
|
5309
|
+
}
|
|
5310
|
+
return deepFreeze({ receipt: signedReceipt, resultEvidence });
|
|
5311
|
+
}
|
|
5274
5312
|
return signedReceipt;
|
|
5275
5313
|
}
|
|
5276
5314
|
|
|
5277
5315
|
async run(request) {
|
|
5316
|
+
return this.#run(request, false);
|
|
5317
|
+
}
|
|
5318
|
+
|
|
5319
|
+
/** Trusted evaluator host only. Never expose hidden-test rows to the Actor. */
|
|
5320
|
+
async runWithEvidence(request) {
|
|
5321
|
+
return this.#run(request, true);
|
|
5322
|
+
}
|
|
5323
|
+
|
|
5324
|
+
/** Trusted host opt-in: best-effort signed rejection after measured execution. */
|
|
5325
|
+
async runWithFailureEvidence(request) {
|
|
5326
|
+
return this.#run(request, true, true);
|
|
5327
|
+
}
|
|
5328
|
+
|
|
5329
|
+
async #run(request, includeResultEvidence, signRuntimeFailures = false) {
|
|
5278
5330
|
const runLocalDeadlineMs =
|
|
5279
5331
|
NATIVE_MONOTONIC_NOW() + this.#policy.maxWallClockMs;
|
|
5280
5332
|
assertExactRecord(request, RUN_REQUEST_KEYS, "evaluation run request");
|
|
@@ -5380,6 +5432,54 @@ export class EvolutionEvalGate {
|
|
|
5380
5432
|
const deadlineMs = started.milliseconds + this.#policy.maxWallClockMs;
|
|
5381
5433
|
const deadlineAt = new Date(deadlineMs).toISOString();
|
|
5382
5434
|
|
|
5435
|
+
if (this.#launchAdmission) {
|
|
5436
|
+
const binding = GATE_LAUNCH_BINDINGS.get(this);
|
|
5437
|
+
const requestDigest = computeEvolutionEvalLaunchRequestDigest({
|
|
5438
|
+
suiteRef,
|
|
5439
|
+
candidateId,
|
|
5440
|
+
baselineId,
|
|
5441
|
+
targetEnvironmentRef,
|
|
5442
|
+
evaluationContext,
|
|
5443
|
+
});
|
|
5444
|
+
if (binding.descriptor.planDigest !== evaluationContext.planDigest) {
|
|
5445
|
+
throw evalError(
|
|
5446
|
+
EVOLUTION_EVAL_INVALID_CODE,
|
|
5447
|
+
"launch admission plan differs from the evaluation run context",
|
|
5448
|
+
);
|
|
5449
|
+
}
|
|
5450
|
+
if (
|
|
5451
|
+
binding.expectedRequest &&
|
|
5452
|
+
(binding.expectedRequest.requestDigest !== requestDigest ||
|
|
5453
|
+
binding.expectedRequest.policyDigest !== this.#policy.policyDigest ||
|
|
5454
|
+
binding.expectedRequest.evaluationAuthorityRoot !==
|
|
5455
|
+
this.#evaluationAuthorityRoot)
|
|
5456
|
+
) {
|
|
5457
|
+
throw evalError(
|
|
5458
|
+
EVOLUTION_EVAL_INVALID_CODE,
|
|
5459
|
+
"evaluation run differs from its enrolled launch request",
|
|
5460
|
+
);
|
|
5461
|
+
}
|
|
5462
|
+
await admitEvolutionEvalLaunch(this.#launchAdmission, {
|
|
5463
|
+
runId,
|
|
5464
|
+
runNonce,
|
|
5465
|
+
requestDigest,
|
|
5466
|
+
policyDigest: this.#policy.policyDigest,
|
|
5467
|
+
evaluationAuthorityRoot: this.#evaluationAuthorityRoot,
|
|
5468
|
+
tenantId: this.#tenantId,
|
|
5469
|
+
admittedAt: started.timestamp,
|
|
5470
|
+
deadlineAt,
|
|
5471
|
+
});
|
|
5472
|
+
if (
|
|
5473
|
+
NATIVE_MONOTONIC_NOW() >= runLocalDeadlineMs ||
|
|
5474
|
+
readClock(this.#clock).milliseconds >= deadlineMs
|
|
5475
|
+
) {
|
|
5476
|
+
throw evalError(
|
|
5477
|
+
EVOLUTION_EVAL_AUTHORITY_FAILED_CODE,
|
|
5478
|
+
"launch admission crossed the evaluation deadline",
|
|
5479
|
+
);
|
|
5480
|
+
}
|
|
5481
|
+
}
|
|
5482
|
+
|
|
5383
5483
|
const suiteRequest = deepFreeze({
|
|
5384
5484
|
runId,
|
|
5385
5485
|
runNonce,
|
|
@@ -5628,6 +5728,7 @@ export class EvolutionEvalGate {
|
|
|
5628
5728
|
const run = {
|
|
5629
5729
|
runId,
|
|
5630
5730
|
runNonce,
|
|
5731
|
+
includeResultEvidence,
|
|
5631
5732
|
deadlineAt,
|
|
5632
5733
|
deadlineMs,
|
|
5633
5734
|
runLocalDeadlineMs,
|
|
@@ -5713,43 +5814,13 @@ export class EvolutionEvalGate {
|
|
|
5713
5814
|
}
|
|
5714
5815
|
|
|
5715
5816
|
const sandboxInstances = new Set();
|
|
5817
|
+
let evaluated;
|
|
5716
5818
|
try {
|
|
5717
|
-
|
|
5819
|
+
evaluated = await this.#evaluateBlindedWorkPlan(
|
|
5718
5820
|
run,
|
|
5719
5821
|
usage,
|
|
5720
5822
|
sandboxInstances,
|
|
5721
5823
|
);
|
|
5722
|
-
const { validation, test } = evaluated;
|
|
5723
|
-
const validationDecision = decideSplit(validation, this.#policy);
|
|
5724
|
-
if (!validationDecision.accepted) {
|
|
5725
|
-
return this.#buildReceipt(run, {
|
|
5726
|
-
decision: "rejected",
|
|
5727
|
-
reasonCodes: [`validation-${validationDecision.reason}`],
|
|
5728
|
-
validation,
|
|
5729
|
-
test,
|
|
5730
|
-
usage,
|
|
5731
|
-
});
|
|
5732
|
-
}
|
|
5733
|
-
const testDecision = decideSplit(test, this.#policy);
|
|
5734
|
-
if (!testDecision.accepted) {
|
|
5735
|
-
return this.#buildReceipt(run, {
|
|
5736
|
-
decision: "rejected",
|
|
5737
|
-
reasonCodes: [`test-${testDecision.reason}`],
|
|
5738
|
-
validation,
|
|
5739
|
-
test,
|
|
5740
|
-
usage,
|
|
5741
|
-
});
|
|
5742
|
-
}
|
|
5743
|
-
return this.#buildReceipt(run, {
|
|
5744
|
-
decision: "accepted",
|
|
5745
|
-
reasonCodes: [
|
|
5746
|
-
`validation-${validationDecision.reason}`,
|
|
5747
|
-
`test-${testDecision.reason}`,
|
|
5748
|
-
],
|
|
5749
|
-
validation,
|
|
5750
|
-
test,
|
|
5751
|
-
usage,
|
|
5752
|
-
});
|
|
5753
5824
|
} catch (cause) {
|
|
5754
5825
|
if (cause instanceof EvaluationBudgetExceeded) {
|
|
5755
5826
|
return this.#buildReceipt(run, {
|
|
@@ -5760,8 +5831,65 @@ export class EvolutionEvalGate {
|
|
|
5760
5831
|
usage: cause.usage,
|
|
5761
5832
|
});
|
|
5762
5833
|
}
|
|
5834
|
+
const failureReason =
|
|
5835
|
+
cause instanceof EvolutionEvalGateError
|
|
5836
|
+
? new Map([
|
|
5837
|
+
[
|
|
5838
|
+
EVOLUTION_EVAL_EXECUTION_FAILED_CODE,
|
|
5839
|
+
"runtime-execution-failed",
|
|
5840
|
+
],
|
|
5841
|
+
[EVOLUTION_EVAL_GRADER_FAILED_CODE, "runtime-grader-failed"],
|
|
5842
|
+
[EVOLUTION_EVAL_SAFETY_FAILED_CODE, "runtime-safety-failed"],
|
|
5843
|
+
]).get(cause.code)
|
|
5844
|
+
: undefined;
|
|
5845
|
+
if (signRuntimeFailures && failureReason && usage.executionCount > 0) {
|
|
5846
|
+
try {
|
|
5847
|
+
return await this.#buildReceipt(run, {
|
|
5848
|
+
decision: "rejected",
|
|
5849
|
+
reasonCodes: [failureReason],
|
|
5850
|
+
validation: null,
|
|
5851
|
+
test: null,
|
|
5852
|
+
usage,
|
|
5853
|
+
});
|
|
5854
|
+
} catch {
|
|
5855
|
+
// A deadline, expired authority, or signer failure cannot be
|
|
5856
|
+
// represented as authenticated outcome evidence.
|
|
5857
|
+
}
|
|
5858
|
+
}
|
|
5763
5859
|
throw cause;
|
|
5764
5860
|
}
|
|
5861
|
+
const { validation, test } = evaluated;
|
|
5862
|
+
if (includeResultEvidence) run.results = evaluated.results;
|
|
5863
|
+
const validationDecision = decideSplit(validation, this.#policy);
|
|
5864
|
+
if (!validationDecision.accepted) {
|
|
5865
|
+
return this.#buildReceipt(run, {
|
|
5866
|
+
decision: "rejected",
|
|
5867
|
+
reasonCodes: [`validation-${validationDecision.reason}`],
|
|
5868
|
+
validation,
|
|
5869
|
+
test,
|
|
5870
|
+
usage,
|
|
5871
|
+
});
|
|
5872
|
+
}
|
|
5873
|
+
const testDecision = decideSplit(test, this.#policy);
|
|
5874
|
+
if (!testDecision.accepted) {
|
|
5875
|
+
return this.#buildReceipt(run, {
|
|
5876
|
+
decision: "rejected",
|
|
5877
|
+
reasonCodes: [`test-${testDecision.reason}`],
|
|
5878
|
+
validation,
|
|
5879
|
+
test,
|
|
5880
|
+
usage,
|
|
5881
|
+
});
|
|
5882
|
+
}
|
|
5883
|
+
return this.#buildReceipt(run, {
|
|
5884
|
+
decision: "accepted",
|
|
5885
|
+
reasonCodes: [
|
|
5886
|
+
`validation-${validationDecision.reason}`,
|
|
5887
|
+
`test-${testDecision.reason}`,
|
|
5888
|
+
],
|
|
5889
|
+
validation,
|
|
5890
|
+
test,
|
|
5891
|
+
usage,
|
|
5892
|
+
});
|
|
5765
5893
|
}
|
|
5766
5894
|
}
|
|
5767
5895
|
|
|
@@ -6447,6 +6575,17 @@ export function isEvolutionEvalGate(value) {
|
|
|
6447
6575
|
return GATE_INSTANCES.has(value);
|
|
6448
6576
|
}
|
|
6449
6577
|
|
|
6578
|
+
/** Read-only composition check; the authority capability itself stays private. */
|
|
6579
|
+
export function captureEvolutionEvalGateLaunchAdmissionBinding(gate) {
|
|
6580
|
+
if (!GATE_INSTANCES.has(gate)) {
|
|
6581
|
+
throw evalError(
|
|
6582
|
+
EVOLUTION_EVAL_INVALID_CODE,
|
|
6583
|
+
"a branded EvolutionEvalGate is required",
|
|
6584
|
+
);
|
|
6585
|
+
}
|
|
6586
|
+
return GATE_LAUNCH_BINDINGS.get(gate);
|
|
6587
|
+
}
|
|
6588
|
+
|
|
6450
6589
|
export function isEvolutionEvalReceiptVerifier(value) {
|
|
6451
6590
|
return RECEIPT_VERIFIER_INSTANCES.has(value);
|
|
6452
6591
|
}
|
|
@@ -6461,6 +6600,28 @@ export async function runEvolutionEvalGate(gate, request) {
|
|
|
6461
6600
|
return EvolutionEvalGate.prototype.run.call(gate, request);
|
|
6462
6601
|
}
|
|
6463
6602
|
|
|
6603
|
+
/** Opt-in export for the trusted evaluation host, after the whole run settles. */
|
|
6604
|
+
export async function runEvolutionEvalGateWithEvidence(gate, request) {
|
|
6605
|
+
if (!GATE_INSTANCES.has(gate)) {
|
|
6606
|
+
throw evalError(
|
|
6607
|
+
EVOLUTION_EVAL_INVALID_CODE,
|
|
6608
|
+
"result evidence export requires a trusted EvolutionEvalGate instance",
|
|
6609
|
+
);
|
|
6610
|
+
}
|
|
6611
|
+
return EvolutionEvalGate.prototype.runWithEvidence.call(gate, request);
|
|
6612
|
+
}
|
|
6613
|
+
|
|
6614
|
+
/** Opt-in for trusted hosts; an unsigned failure still rejects the promise. */
|
|
6615
|
+
export async function runEvolutionEvalGateWithFailureEvidence(gate, request) {
|
|
6616
|
+
if (!GATE_INSTANCES.has(gate)) {
|
|
6617
|
+
throw evalError(
|
|
6618
|
+
EVOLUTION_EVAL_INVALID_CODE,
|
|
6619
|
+
"failure evidence export requires a trusted EvolutionEvalGate instance",
|
|
6620
|
+
);
|
|
6621
|
+
}
|
|
6622
|
+
return EvolutionEvalGate.prototype.runWithFailureEvidence.call(gate, request);
|
|
6623
|
+
}
|
|
6624
|
+
|
|
6464
6625
|
export async function verifyEvolutionEvalReceipt(verifier, value, expected) {
|
|
6465
6626
|
if (!RECEIPT_VERIFIER_INSTANCES.has(verifier)) {
|
|
6466
6627
|
throw evalError(
|
|
@@ -6474,3 +6635,150 @@ export async function verifyEvolutionEvalReceipt(verifier, value, expected) {
|
|
|
6474
6635
|
expected,
|
|
6475
6636
|
);
|
|
6476
6637
|
}
|
|
6638
|
+
|
|
6639
|
+
const RESULT_ROW_KEYS = new Set([
|
|
6640
|
+
"taskDigest",
|
|
6641
|
+
"seed",
|
|
6642
|
+
"pass",
|
|
6643
|
+
"qualityScore",
|
|
6644
|
+
"securityViolations",
|
|
6645
|
+
"permissionViolations",
|
|
6646
|
+
"outputArtifactDigest",
|
|
6647
|
+
"subjectBindingDigest",
|
|
6648
|
+
"subjectReservationDigest",
|
|
6649
|
+
"executionDigest",
|
|
6650
|
+
"gradeDigest",
|
|
6651
|
+
"safetyDigest",
|
|
6652
|
+
"metrics",
|
|
6653
|
+
]);
|
|
6654
|
+
|
|
6655
|
+
function verifyResultRows(rows, tasks, seeds) {
|
|
6656
|
+
if (!Array.isArray(rows) || rows.length !== tasks.size * seeds.size) {
|
|
6657
|
+
throw evalError(
|
|
6658
|
+
EVOLUTION_EVAL_INVALID_CODE,
|
|
6659
|
+
"result evidence must cover every task and seed in each arm",
|
|
6660
|
+
);
|
|
6661
|
+
}
|
|
6662
|
+
const seen = new Set();
|
|
6663
|
+
for (const row of rows) {
|
|
6664
|
+
assertExactRecord(row, RESULT_ROW_KEYS, "evaluation result row");
|
|
6665
|
+
for (const field of RESULT_ROW_KEYS) {
|
|
6666
|
+
if (field.endsWith("Digest")) normalizeDigest(row[field], field);
|
|
6667
|
+
}
|
|
6668
|
+
normalizeInteger(row.seed, "result seed", { maximum: 0x7fffffff });
|
|
6669
|
+
const pair = `${row.taskDigest}\0${row.seed}`;
|
|
6670
|
+
if (!tasks.has(row.taskDigest) || !seeds.has(row.seed) || seen.has(pair)) {
|
|
6671
|
+
throw evalError(
|
|
6672
|
+
EVOLUTION_EVAL_INVALID_CODE,
|
|
6673
|
+
"result evidence contains a foreign or duplicate task/seed pair",
|
|
6674
|
+
);
|
|
6675
|
+
}
|
|
6676
|
+
seen.add(pair);
|
|
6677
|
+
if (typeof row.pass !== "boolean") {
|
|
6678
|
+
throw evalError(
|
|
6679
|
+
EVOLUTION_EVAL_INVALID_CODE,
|
|
6680
|
+
"result pass must be boolean",
|
|
6681
|
+
);
|
|
6682
|
+
}
|
|
6683
|
+
normalizeRatio(row.qualityScore, "result qualityScore");
|
|
6684
|
+
normalizeInteger(row.securityViolations, "result securityViolations");
|
|
6685
|
+
normalizeInteger(row.permissionViolations, "result permissionViolations");
|
|
6686
|
+
normalizeMetrics(row.metrics);
|
|
6687
|
+
}
|
|
6688
|
+
}
|
|
6689
|
+
|
|
6690
|
+
/**
|
|
6691
|
+
* Authenticate raw rows through the existing final receipt's signed result
|
|
6692
|
+
* digests. This does not fetch/reverify the underlying execution/grader/safety
|
|
6693
|
+
* receipts, attest preparation costs, or turn the rows into promotion approval.
|
|
6694
|
+
* `expected` must come from the trusted host's registered run context.
|
|
6695
|
+
*/
|
|
6696
|
+
export async function verifyEvolutionEvalResultEvidence(
|
|
6697
|
+
verifier,
|
|
6698
|
+
input,
|
|
6699
|
+
expected,
|
|
6700
|
+
) {
|
|
6701
|
+
assertExactRecord(
|
|
6702
|
+
input,
|
|
6703
|
+
new Set(["receipt", "resultEvidence", "suite", "policy"]),
|
|
6704
|
+
"evaluation result evidence input",
|
|
6705
|
+
);
|
|
6706
|
+
// Capture every graph before invoking any asynchronous authority, using the
|
|
6707
|
+
// existing independent bounds for each canonical document.
|
|
6708
|
+
const receipt = deepFreeze(cloneCanonical(input.receipt));
|
|
6709
|
+
const evidence = deepFreeze(cloneCanonical(input.resultEvidence));
|
|
6710
|
+
const suite = verifyEvolutionEvalSuite(input.suite);
|
|
6711
|
+
const policy = verifyEvolutionEvalPolicy(input.policy);
|
|
6712
|
+
const expectedSnapshot = deepFreeze(cloneCanonical(expected));
|
|
6713
|
+
assertExactRecord(
|
|
6714
|
+
evidence,
|
|
6715
|
+
new Set([
|
|
6716
|
+
"schema",
|
|
6717
|
+
"receiptDigest",
|
|
6718
|
+
"validation",
|
|
6719
|
+
"test",
|
|
6720
|
+
"qualifiesForPromotion",
|
|
6721
|
+
"evidenceDigest",
|
|
6722
|
+
]),
|
|
6723
|
+
"evaluation result evidence",
|
|
6724
|
+
);
|
|
6725
|
+
if (
|
|
6726
|
+
evidence.schema !== EVOLUTION_EVAL_RESULT_EVIDENCE_SCHEMA ||
|
|
6727
|
+
evidence.qualifiesForPromotion !== false ||
|
|
6728
|
+
evidence.receiptDigest !== receipt.receiptDigest ||
|
|
6729
|
+
receipt.suiteDigest !== suite.suiteDigest ||
|
|
6730
|
+
receipt.policyDigest !== policy.policyDigest ||
|
|
6731
|
+
receipt.confidenceZ !== policy.confidenceZ ||
|
|
6732
|
+
!receipt.validation ||
|
|
6733
|
+
!receipt.test ||
|
|
6734
|
+
digest(receipt.splitCounts, "split-counts") !==
|
|
6735
|
+
digest(countSplits(suite.tasks), "split-counts")
|
|
6736
|
+
) {
|
|
6737
|
+
throw evalError(
|
|
6738
|
+
EVOLUTION_EVAL_INVALID_CODE,
|
|
6739
|
+
"result evidence differs from its receipt, suite, or policy",
|
|
6740
|
+
);
|
|
6741
|
+
}
|
|
6742
|
+
const seeds = new Set(policy.seeds);
|
|
6743
|
+
for (const split of ["validation", "test"]) {
|
|
6744
|
+
const results = evidence[split];
|
|
6745
|
+
assertExactRecord(
|
|
6746
|
+
results,
|
|
6747
|
+
new Set(["baseline", "candidate"]),
|
|
6748
|
+
"split results",
|
|
6749
|
+
);
|
|
6750
|
+
const tasks = new Set(
|
|
6751
|
+
suite.tasks
|
|
6752
|
+
.filter((task) => task.split === split)
|
|
6753
|
+
.map((task) => task.taskDigest),
|
|
6754
|
+
);
|
|
6755
|
+
for (const arm of ["baseline", "candidate"]) {
|
|
6756
|
+
verifyResultRows(results[arm], tasks, seeds);
|
|
6757
|
+
}
|
|
6758
|
+
const recomputed = comparisonSummary(
|
|
6759
|
+
results,
|
|
6760
|
+
policy.confidenceZ,
|
|
6761
|
+
seeds.size,
|
|
6762
|
+
);
|
|
6763
|
+
if (
|
|
6764
|
+
digest(recomputed, "chainlesschain.evolution-eval-comparison/v2") !==
|
|
6765
|
+
digest(receipt[split], "chainlesschain.evolution-eval-comparison/v2")
|
|
6766
|
+
) {
|
|
6767
|
+
throw evalError(
|
|
6768
|
+
EVOLUTION_EVAL_INVALID_CODE,
|
|
6769
|
+
"result rows do not reproduce the signed comparison",
|
|
6770
|
+
);
|
|
6771
|
+
}
|
|
6772
|
+
}
|
|
6773
|
+
const rebuilt = buildResultEvidence(receipt, evidence);
|
|
6774
|
+
if (rebuilt.evidenceDigest !== evidence.evidenceDigest) {
|
|
6775
|
+
throw evalError(
|
|
6776
|
+
EVOLUTION_EVAL_INVALID_CODE,
|
|
6777
|
+
"result evidence digest mismatch",
|
|
6778
|
+
);
|
|
6779
|
+
}
|
|
6780
|
+
// Verify freshness last so a receipt that expires during recomputation cannot
|
|
6781
|
+
// be returned as verified. The same check authenticates signature and context.
|
|
6782
|
+
await verifyEvolutionEvalReceipt(verifier, receipt, expectedSnapshot);
|
|
6783
|
+
return evidence;
|
|
6784
|
+
}
|