chainlesschain 0.166.72 → 0.166.74
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-BlIvP3k1.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-dm1pfXdM.js → ActionButton-DYF7atSV.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-C9WdXlkB.js → Analytics-LZYaYek6.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-0f-jWk68.js → AppLayout-BJxrjNbj.js} +5 -5
- package/src/assets/web-panel/assets/Artifacts-gEDhxhmE.js +1 -0
- package/src/assets/web-panel/assets/{Audit-CymWJrNf.js → Audit-B0MR950Q.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-9bWGX_cn.js → BackgroundAgents-3e6Os_Kl.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DFBHB3_Y.js → Backup-DB_X8KUg.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-D9Lm9d3n.js → BaseInput-DTNcvNeG.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-maC7odiU.js → Chat-SnqdA62j.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-Crsqn0B1.js → ChatBubbleRenderer-BaiWNH_V.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-BrZgAIL0.js → Checkbox-Dj0O4dyP.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-ChqWBE8R.js → Codegen-BeelW3dx.js} +1 -1
- package/src/assets/web-panel/assets/{Col-C5TaXHn9.js → Col-BmstiyBM.js} +1 -1
- package/src/assets/web-panel/assets/{Community-D8m4Egsw.js → Community-CrbmFk3f.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CMJmi_Bw.js → Compact-DCg5ZPIw.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CW7Bwy8s.js → Compliance-B3sajhq7.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DLhPTsU6.js → Cowork-DWcdvrDK.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-DBrXtf_1.js → Cron-Bjwp_NDf.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CzLbJF3j.js → Crosschain-BXTLC9o8.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DreItINq.js → DID-Di62M46b.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-B_gO9CjY.js → Dashboard-BQED8Rkt.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DXpPiTH_.js → Dropdown-DEf9VYaj.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-Cb1YonC_.js → EmailListRenderer-DhFpPMAM.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-GQb6tV_E.js → EvolutionSettings-BOqmzkpS.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DUtpqpsn.js → FamilyGuardDashboard-BxBnJ4fe.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-CfZsj0gb.js → Federation-BN9Q8nsZ.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Cdr40ozm.js → FormItemContext-CGeqFEd-.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BRaf18hh.js → GenericCardRenderer-DElmWQTc.js} +1 -1
- package/src/assets/web-panel/assets/{Git-7SqGn3Zi.js → Git-BHBSgKck.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-D1mfL8Fz.js → Governance-Breo3NTU.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BXVyCWMd.js → Inference-CCABy4E0.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-C-wAA2Ub.js → KnowledgeGraph-B6_ryn-X.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DWxiJiFe.js → Logs-CkmJjJok.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-DQEQBaRu.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-CmOVgbTO.js → Marketplace-iip65jxv.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Cx4WyryN.js → McpTools-DDwp_QLb.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-Di6wy0Ky.js → Memory-2ZmNDRkC.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DrR7I1A7.js → MobileBridge-C6HilwZl.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-SnNFgay-.js → MobileProjects-BeMtYRhx.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-DPZpfO4G.js → Mtc-Bp-FEcoo.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-CTT74J6Y.js → MtcAudit-DNdkTCe5.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-DoLT96hm.js → Multisig-PnKg2_Eo.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-BY-9TS7_.js → NLProgramming-DDp4lZeG.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-1_rKLQkS.js → Notes-DEjFktcO.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-D8N1NZ6Y.js → NotificationSettings-FR8fJDAn.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-Cyc-XI0L.js +1 -0
- package/src/assets/web-panel/assets/{Organization-DKQtaPAc.js → Organization-DNW2E_JU.js} +3 -3
- package/src/assets/web-panel/assets/{Overflow-B3n9XpS2.js → Overflow-BHfd6wk6.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Fn8LWurl.js → P2P-COIkaXH4.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-DuRP0UeX.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-CTCN6Rk6.js → Permissions-BfVRGMy8.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BwpvzXm7.js → PersonalDataHub-BWYjO6Aa.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-C1_hrCCQ.js → Pipeline-C0e0fPBW.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-C-BmNft5.js → Privacy-CnId4Jv-.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-B9HYk17G.js → ProjectInit-CYf1grXg.js} +2 -2
- package/src/assets/web-panel/assets/ProjectSettings-HsXgJdiH.js +2 -0
- package/src/assets/web-panel/assets/{Projects-Yofw9TrC.js → Projects-Bi0r9QcC.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-B83JppEP.js → Providers-B-Tu_-_4.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-D5ZRpUGC.js → QrScannerModal-CPDqYT2F.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-B-mz9iY-.js → QuickAsk-Df6qcjXy.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DtjVu00v.js → Recommend-dP6sfGSY.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-Dk8IBiG3.js → RemoteSession-VAt9-tM3.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-DpTIK7Oe.js → Reputation-DtRVRiLI.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DVYQoXil.js → Row-B6Ukqvli.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-ikMaTwEE.js → RssFeed-DfVRQMrZ.js} +3 -3
- package/src/assets/web-panel/assets/{Search-CHVHCNdo.js → Search-CyncAiqQ.js} +1 -1
- package/src/assets/web-panel/assets/{Security-MxjX-UDp.js → Security-DEO7nrkb.js} +4 -4
- package/src/assets/web-panel/assets/{Services-CmwTYlHk.js → Services-CkusQEhN.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-BQzBoW5V.js → Skeleton-CbGtO3kc.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-B-mPG69i.js → Skills-diOh0gAr.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DOQbR10a.js → Sla-CIu9Ahak.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-wPQkSA9J.js → SpeechSettings-_Nzyi4K9.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BPyc0P-r.js → SyncSettings-BAOLFlRq.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DbBA-eHJ.js → Tasks-BpmvL1Eq.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-BRpihbvV.js → Templates-Dkr_vRdJ.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-B1qu8vDX.js → Tenant-kM7lHUFR.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-CEe3YAvM.js → Terminal-9zfc41aU.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Biz2ENj5.js → TimelineRenderer-Cg_7j6cj.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-Bh-mJyas.js → Tokens-Cs1aikaM.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DaFKe1bY.js → Trigger-DKYPJ9gl.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DsJ7u_-G.js → Trust-BFy1Sm8B.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-9I90JZxO.js → UkeySign-B31L9NBH.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-C96s3pW9.js → VideoEditing-OMmUYdIC.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DTMqIySe.js → Wallet-y3aE7oru.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-C3rh3szY.js → WebAuthn-C0ICKvpu.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-C3as7vBp.js → WorkflowEditor-Cq5UYbr5.js} +1 -1
- package/src/assets/web-panel/assets/{chat-zsGetwuT.js → chat-B1ijaKFv.js} +1 -1
- package/src/assets/web-panel/assets/{colors-Dt9qbWYV.js → colors-CHkI8PDg.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BJWYHVIL.js → compact-item-1BYvgWEs.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-pKrpnY7l.js → createContext-BGti56u4.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-Isft1nEX.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-sbUKl7Xu.js → hasIn-Cr87Fph1.js} +1 -1
- package/src/assets/web-panel/assets/{index-oUag3zZf.js → index-1WxCzqYq.js} +1 -1
- package/src/assets/web-panel/assets/{index--wWXhZQU.js → index-6Ta8Pg47.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dmp7IdrF.js → index-B1yur8MU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSXJ2PbY.js → index-B4BSM3BK.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9DoXtNz.js → index-B8Jb_cGt.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRpfrG-e.js → index-BA0FMuDX.js} +1 -1
- package/src/assets/web-panel/assets/{index-n8vVPeJ6.js → index-BKb16YKp.js} +1 -1
- package/src/assets/web-panel/assets/{index-BFMPJahZ.js → index-BOjTRSHE.js} +3 -3
- package/src/assets/web-panel/assets/{index-BR1gZBlK.js → index-BYpqBWlt.js} +1 -1
- package/src/assets/web-panel/assets/index-B_T9NUk7.js +1 -0
- package/src/assets/web-panel/assets/{index-sakhsZMa.js → index-Bdkrut2A.js} +1 -1
- package/src/assets/web-panel/assets/{index-Di-YcQHn.js → index-BjgtiMdY.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bf8dv266.js → index-BkFXPrdx.js} +1 -1
- package/src/assets/web-panel/assets/{index-CR5WxgE-.js → index-Bni5GodE.js} +1 -1
- package/src/assets/web-panel/assets/{index-0CK6iR4G.js → index-CDTNnQDz.js} +1 -1
- package/src/assets/web-panel/assets/{index-DIxu3nOh.js → index-CQWMHlY7.js} +1 -1
- package/src/assets/web-panel/assets/{index-5GohpTfK.js → index-CS0MIE2C.js} +1 -1
- package/src/assets/web-panel/assets/{index-qE4san4o.js → index-C_lEztok.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWBlZsqf.js → index-CbkGda_k.js} +1 -1
- package/src/assets/web-panel/assets/{index-DoMii5CD.js → index-CevUJTXd.js} +1 -1
- package/src/assets/web-panel/assets/{index-omZRNwB7.js → index-CjBkVrq9.js} +1 -1
- package/src/assets/web-panel/assets/{index-BfQmb4PB.js → index-CkcWhgLB.js} +1 -1
- package/src/assets/web-panel/assets/{index-fQ-JtwM7.js → index-CmmSJBNi.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRAzhNw6.js → index-CvcpesEZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-vTPOhhfW.js → index-Cvu95WPI.js} +1 -1
- package/src/assets/web-panel/assets/{index-BWPF2Hth.js → index-D6g4jxdE.js} +1 -1
- package/src/assets/web-panel/assets/index-DBqUxaat.js +1 -0
- package/src/assets/web-panel/assets/{index-BZmBSuN8.js → index-DCkvhzaY.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7tOZZAs.js → index-DHJtAEx8.js} +1 -1
- package/src/assets/web-panel/assets/{index-C_z7zLle.js → index-DJjnXDAD.js} +1 -1
- package/src/assets/web-panel/assets/{index-BiZ6Lupa.js → index-Dam-LB_J.js} +1 -1
- package/src/assets/web-panel/assets/{index-B53DhH1R.js → index-DcoI3ENn.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRsSdHdW.js → index-Dnp-4yPc.js} +1 -1
- package/src/assets/web-panel/assets/{index-DD_IBhgm.js → index-Duv0TfJa.js} +1 -1
- package/src/assets/web-panel/assets/{index-CnrxgbPB.js → index-DzevrmLK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQtTUsCI.js → index-fhpMyq0u.js} +1 -1
- package/src/assets/web-panel/assets/{index-DFQTgkPD.js → index-rO6VKJv5.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJZq5jWm.js → index-rVnXNFST.js} +1 -1
- package/src/assets/web-panel/assets/{index-T8ASbPWt.js → index-tY479EoQ.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BVpFM2mv.js → initDefaultProps-DAGtnwoX.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Mrl9_kZM.js → motion-02FXBi5C.js} +1 -1
- package/src/assets/web-panel/assets/{move-CvRC7fRw.js → move-BLf7rhzJ.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-C7PSeivU.js → mtc-parser-Ct6i1vqQ.js} +1 -1
- package/src/assets/web-panel/assets/{omit-RI1cO_Ok.js → omit-DKvTU8IT.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-akwD3e22.js → pickAttrs-DqDsKoMe.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-C4f-tfqj.js → placementArrow-kae6Cnwx.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-hyHNGoSW.js → responsiveObserve-DzFM_TQf.js} +1 -1
- package/src/assets/web-panel/assets/{slide-B6vlTDr6.js → slide-qDjNFPuM.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-D8poWZW8.js → statusUtils-BihSr7G3.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Bz1ZKvoD.js → styleChecker-BzoT0TfJ.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-C-vv_T11.js → useFlexGapSupport-CjXXcU1j.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BubqlAej.js → useFs-DrWcbDJ1.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CTNJrVC8.js → usePersonalDataHub-DO1oBNTE.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DbT41Wli.js → vnode-BR6crWko.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-R0Rxz73D.js → zoom-DmKLfw6W.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/data/changelog.json +26 -0
- package/src/lib/evolution/evolution-eval-gate.js +289 -32
- package/src/lib/evolution/pm-exploration-benchmark.js +2014 -49
- package/src/lib/evolution/skill-writer-inventory-manifest.js +4 -1
- package/src/lib/task-progress-tracker.js +47 -4
- 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/OrderTableRenderer-Ch-HjmbS.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-CsumgiUO.js +0 -7
- package/src/assets/web-panel/assets/ProjectSettings-BFgA-an1.js +0 -2
- 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
|
@@ -18,6 +18,8 @@ export const EVOLUTION_EVAL_POLICY_SCHEMA =
|
|
|
18
18
|
"chainlesschain.evolution-eval-policy/v2";
|
|
19
19
|
export const EVOLUTION_EVAL_RECEIPT_SCHEMA =
|
|
20
20
|
"chainlesschain.evolution-eval-receipt/v4";
|
|
21
|
+
export const EVOLUTION_EVAL_RESULT_EVIDENCE_SCHEMA =
|
|
22
|
+
"chainlesschain.evolution-eval-result-evidence/v1";
|
|
21
23
|
export const EVOLUTION_EVAL_SUITE_AUTHORITY_SCHEMA =
|
|
22
24
|
"chainlesschain.evolution-eval-suite-authority-receipt/v1";
|
|
23
25
|
export const EVOLUTION_EVAL_ENVIRONMENT_SCHEMA =
|
|
@@ -2647,6 +2649,27 @@ function comparisonSummary(results, confidenceZ, seedCount) {
|
|
|
2647
2649
|
});
|
|
2648
2650
|
}
|
|
2649
2651
|
|
|
2652
|
+
function resultEvidenceCore(receipt, results) {
|
|
2653
|
+
return {
|
|
2654
|
+
schema: EVOLUTION_EVAL_RESULT_EVIDENCE_SCHEMA,
|
|
2655
|
+
receiptDigest: receipt.receiptDigest,
|
|
2656
|
+
validation: results.validation,
|
|
2657
|
+
test: results.test,
|
|
2658
|
+
qualifiesForPromotion: false,
|
|
2659
|
+
};
|
|
2660
|
+
}
|
|
2661
|
+
|
|
2662
|
+
function buildResultEvidence(receipt, results) {
|
|
2663
|
+
const core = resultEvidenceCore(receipt, results);
|
|
2664
|
+
const evidence = {
|
|
2665
|
+
...core,
|
|
2666
|
+
evidenceDigest: digest(core, EVOLUTION_EVAL_RESULT_EVIDENCE_SCHEMA),
|
|
2667
|
+
};
|
|
2668
|
+
// Include the digest envelope in the same bound used by the readback path.
|
|
2669
|
+
canonicalJson(evidence);
|
|
2670
|
+
return deepFreeze(evidence);
|
|
2671
|
+
}
|
|
2672
|
+
|
|
2650
2673
|
function decideSplit(summary, policy) {
|
|
2651
2674
|
const { baseline, candidate } = summary;
|
|
2652
2675
|
if (candidate.securityViolations > 0 || candidate.permissionViolations > 0) {
|
|
@@ -5149,6 +5172,7 @@ export class EvolutionEvalGate {
|
|
|
5149
5172
|
this.#policy.confidenceZ,
|
|
5150
5173
|
this.#policy.seeds.length,
|
|
5151
5174
|
),
|
|
5175
|
+
...(run.includeResultEvidence ? { results } : {}),
|
|
5152
5176
|
});
|
|
5153
5177
|
}
|
|
5154
5178
|
|
|
@@ -5271,10 +5295,46 @@ export class EvolutionEvalGate {
|
|
|
5271
5295
|
signedReceipt.receiptDigest,
|
|
5272
5296
|
"receiptDigest",
|
|
5273
5297
|
);
|
|
5298
|
+
if (run.includeResultEvidence) {
|
|
5299
|
+
// Export only completed validation + test sets, after the final receipt
|
|
5300
|
+
// was independently signed and verified. No observer runs during grading.
|
|
5301
|
+
const resultEvidence = run.results
|
|
5302
|
+
? buildResultEvidence(signedReceipt, run.results)
|
|
5303
|
+
: null;
|
|
5304
|
+
const exportedAt = readClock(this.#clock).milliseconds;
|
|
5305
|
+
if (
|
|
5306
|
+
exportedAt >= run.deadlineMs ||
|
|
5307
|
+
NATIVE_MONOTONIC_NOW() >= run.runLocalDeadlineMs ||
|
|
5308
|
+
Date.parse(signedReceipt.expiresAt) <= exportedAt ||
|
|
5309
|
+
run.portExpiries.some(
|
|
5310
|
+
(expiresAt) => Date.parse(expiresAt) <= exportedAt,
|
|
5311
|
+
)
|
|
5312
|
+
) {
|
|
5313
|
+
throw evalError(
|
|
5314
|
+
EVOLUTION_EVAL_EXECUTION_FAILED_CODE,
|
|
5315
|
+
"evaluation evidence export crossed the evaluation deadline",
|
|
5316
|
+
);
|
|
5317
|
+
}
|
|
5318
|
+
return deepFreeze({ receipt: signedReceipt, resultEvidence });
|
|
5319
|
+
}
|
|
5274
5320
|
return signedReceipt;
|
|
5275
5321
|
}
|
|
5276
5322
|
|
|
5277
5323
|
async run(request) {
|
|
5324
|
+
return this.#run(request, false);
|
|
5325
|
+
}
|
|
5326
|
+
|
|
5327
|
+
/** Trusted evaluator host only. Never expose hidden-test rows to the Actor. */
|
|
5328
|
+
async runWithEvidence(request) {
|
|
5329
|
+
return this.#run(request, true);
|
|
5330
|
+
}
|
|
5331
|
+
|
|
5332
|
+
/** Trusted host opt-in: best-effort signed rejection after measured execution. */
|
|
5333
|
+
async runWithFailureEvidence(request) {
|
|
5334
|
+
return this.#run(request, true, true);
|
|
5335
|
+
}
|
|
5336
|
+
|
|
5337
|
+
async #run(request, includeResultEvidence, signRuntimeFailures = false) {
|
|
5278
5338
|
const runLocalDeadlineMs =
|
|
5279
5339
|
NATIVE_MONOTONIC_NOW() + this.#policy.maxWallClockMs;
|
|
5280
5340
|
assertExactRecord(request, RUN_REQUEST_KEYS, "evaluation run request");
|
|
@@ -5628,6 +5688,7 @@ export class EvolutionEvalGate {
|
|
|
5628
5688
|
const run = {
|
|
5629
5689
|
runId,
|
|
5630
5690
|
runNonce,
|
|
5691
|
+
includeResultEvidence,
|
|
5631
5692
|
deadlineAt,
|
|
5632
5693
|
deadlineMs,
|
|
5633
5694
|
runLocalDeadlineMs,
|
|
@@ -5713,43 +5774,13 @@ export class EvolutionEvalGate {
|
|
|
5713
5774
|
}
|
|
5714
5775
|
|
|
5715
5776
|
const sandboxInstances = new Set();
|
|
5777
|
+
let evaluated;
|
|
5716
5778
|
try {
|
|
5717
|
-
|
|
5779
|
+
evaluated = await this.#evaluateBlindedWorkPlan(
|
|
5718
5780
|
run,
|
|
5719
5781
|
usage,
|
|
5720
5782
|
sandboxInstances,
|
|
5721
5783
|
);
|
|
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
5784
|
} catch (cause) {
|
|
5754
5785
|
if (cause instanceof EvaluationBudgetExceeded) {
|
|
5755
5786
|
return this.#buildReceipt(run, {
|
|
@@ -5760,8 +5791,65 @@ export class EvolutionEvalGate {
|
|
|
5760
5791
|
usage: cause.usage,
|
|
5761
5792
|
});
|
|
5762
5793
|
}
|
|
5794
|
+
const failureReason =
|
|
5795
|
+
cause instanceof EvolutionEvalGateError
|
|
5796
|
+
? new Map([
|
|
5797
|
+
[
|
|
5798
|
+
EVOLUTION_EVAL_EXECUTION_FAILED_CODE,
|
|
5799
|
+
"runtime-execution-failed",
|
|
5800
|
+
],
|
|
5801
|
+
[EVOLUTION_EVAL_GRADER_FAILED_CODE, "runtime-grader-failed"],
|
|
5802
|
+
[EVOLUTION_EVAL_SAFETY_FAILED_CODE, "runtime-safety-failed"],
|
|
5803
|
+
]).get(cause.code)
|
|
5804
|
+
: undefined;
|
|
5805
|
+
if (signRuntimeFailures && failureReason && usage.executionCount > 0) {
|
|
5806
|
+
try {
|
|
5807
|
+
return await this.#buildReceipt(run, {
|
|
5808
|
+
decision: "rejected",
|
|
5809
|
+
reasonCodes: [failureReason],
|
|
5810
|
+
validation: null,
|
|
5811
|
+
test: null,
|
|
5812
|
+
usage,
|
|
5813
|
+
});
|
|
5814
|
+
} catch {
|
|
5815
|
+
// A deadline, expired authority, or signer failure cannot be
|
|
5816
|
+
// represented as authenticated outcome evidence.
|
|
5817
|
+
}
|
|
5818
|
+
}
|
|
5763
5819
|
throw cause;
|
|
5764
5820
|
}
|
|
5821
|
+
const { validation, test } = evaluated;
|
|
5822
|
+
if (includeResultEvidence) run.results = evaluated.results;
|
|
5823
|
+
const validationDecision = decideSplit(validation, this.#policy);
|
|
5824
|
+
if (!validationDecision.accepted) {
|
|
5825
|
+
return this.#buildReceipt(run, {
|
|
5826
|
+
decision: "rejected",
|
|
5827
|
+
reasonCodes: [`validation-${validationDecision.reason}`],
|
|
5828
|
+
validation,
|
|
5829
|
+
test,
|
|
5830
|
+
usage,
|
|
5831
|
+
});
|
|
5832
|
+
}
|
|
5833
|
+
const testDecision = decideSplit(test, this.#policy);
|
|
5834
|
+
if (!testDecision.accepted) {
|
|
5835
|
+
return this.#buildReceipt(run, {
|
|
5836
|
+
decision: "rejected",
|
|
5837
|
+
reasonCodes: [`test-${testDecision.reason}`],
|
|
5838
|
+
validation,
|
|
5839
|
+
test,
|
|
5840
|
+
usage,
|
|
5841
|
+
});
|
|
5842
|
+
}
|
|
5843
|
+
return this.#buildReceipt(run, {
|
|
5844
|
+
decision: "accepted",
|
|
5845
|
+
reasonCodes: [
|
|
5846
|
+
`validation-${validationDecision.reason}`,
|
|
5847
|
+
`test-${testDecision.reason}`,
|
|
5848
|
+
],
|
|
5849
|
+
validation,
|
|
5850
|
+
test,
|
|
5851
|
+
usage,
|
|
5852
|
+
});
|
|
5765
5853
|
}
|
|
5766
5854
|
}
|
|
5767
5855
|
|
|
@@ -6461,6 +6549,28 @@ export async function runEvolutionEvalGate(gate, request) {
|
|
|
6461
6549
|
return EvolutionEvalGate.prototype.run.call(gate, request);
|
|
6462
6550
|
}
|
|
6463
6551
|
|
|
6552
|
+
/** Opt-in export for the trusted evaluation host, after the whole run settles. */
|
|
6553
|
+
export async function runEvolutionEvalGateWithEvidence(gate, request) {
|
|
6554
|
+
if (!GATE_INSTANCES.has(gate)) {
|
|
6555
|
+
throw evalError(
|
|
6556
|
+
EVOLUTION_EVAL_INVALID_CODE,
|
|
6557
|
+
"result evidence export requires a trusted EvolutionEvalGate instance",
|
|
6558
|
+
);
|
|
6559
|
+
}
|
|
6560
|
+
return EvolutionEvalGate.prototype.runWithEvidence.call(gate, request);
|
|
6561
|
+
}
|
|
6562
|
+
|
|
6563
|
+
/** Opt-in for trusted hosts; an unsigned failure still rejects the promise. */
|
|
6564
|
+
export async function runEvolutionEvalGateWithFailureEvidence(gate, request) {
|
|
6565
|
+
if (!GATE_INSTANCES.has(gate)) {
|
|
6566
|
+
throw evalError(
|
|
6567
|
+
EVOLUTION_EVAL_INVALID_CODE,
|
|
6568
|
+
"failure evidence export requires a trusted EvolutionEvalGate instance",
|
|
6569
|
+
);
|
|
6570
|
+
}
|
|
6571
|
+
return EvolutionEvalGate.prototype.runWithFailureEvidence.call(gate, request);
|
|
6572
|
+
}
|
|
6573
|
+
|
|
6464
6574
|
export async function verifyEvolutionEvalReceipt(verifier, value, expected) {
|
|
6465
6575
|
if (!RECEIPT_VERIFIER_INSTANCES.has(verifier)) {
|
|
6466
6576
|
throw evalError(
|
|
@@ -6474,3 +6584,150 @@ export async function verifyEvolutionEvalReceipt(verifier, value, expected) {
|
|
|
6474
6584
|
expected,
|
|
6475
6585
|
);
|
|
6476
6586
|
}
|
|
6587
|
+
|
|
6588
|
+
const RESULT_ROW_KEYS = new Set([
|
|
6589
|
+
"taskDigest",
|
|
6590
|
+
"seed",
|
|
6591
|
+
"pass",
|
|
6592
|
+
"qualityScore",
|
|
6593
|
+
"securityViolations",
|
|
6594
|
+
"permissionViolations",
|
|
6595
|
+
"outputArtifactDigest",
|
|
6596
|
+
"subjectBindingDigest",
|
|
6597
|
+
"subjectReservationDigest",
|
|
6598
|
+
"executionDigest",
|
|
6599
|
+
"gradeDigest",
|
|
6600
|
+
"safetyDigest",
|
|
6601
|
+
"metrics",
|
|
6602
|
+
]);
|
|
6603
|
+
|
|
6604
|
+
function verifyResultRows(rows, tasks, seeds) {
|
|
6605
|
+
if (!Array.isArray(rows) || rows.length !== tasks.size * seeds.size) {
|
|
6606
|
+
throw evalError(
|
|
6607
|
+
EVOLUTION_EVAL_INVALID_CODE,
|
|
6608
|
+
"result evidence must cover every task and seed in each arm",
|
|
6609
|
+
);
|
|
6610
|
+
}
|
|
6611
|
+
const seen = new Set();
|
|
6612
|
+
for (const row of rows) {
|
|
6613
|
+
assertExactRecord(row, RESULT_ROW_KEYS, "evaluation result row");
|
|
6614
|
+
for (const field of RESULT_ROW_KEYS) {
|
|
6615
|
+
if (field.endsWith("Digest")) normalizeDigest(row[field], field);
|
|
6616
|
+
}
|
|
6617
|
+
normalizeInteger(row.seed, "result seed", { maximum: 0x7fffffff });
|
|
6618
|
+
const pair = `${row.taskDigest}\0${row.seed}`;
|
|
6619
|
+
if (!tasks.has(row.taskDigest) || !seeds.has(row.seed) || seen.has(pair)) {
|
|
6620
|
+
throw evalError(
|
|
6621
|
+
EVOLUTION_EVAL_INVALID_CODE,
|
|
6622
|
+
"result evidence contains a foreign or duplicate task/seed pair",
|
|
6623
|
+
);
|
|
6624
|
+
}
|
|
6625
|
+
seen.add(pair);
|
|
6626
|
+
if (typeof row.pass !== "boolean") {
|
|
6627
|
+
throw evalError(
|
|
6628
|
+
EVOLUTION_EVAL_INVALID_CODE,
|
|
6629
|
+
"result pass must be boolean",
|
|
6630
|
+
);
|
|
6631
|
+
}
|
|
6632
|
+
normalizeRatio(row.qualityScore, "result qualityScore");
|
|
6633
|
+
normalizeInteger(row.securityViolations, "result securityViolations");
|
|
6634
|
+
normalizeInteger(row.permissionViolations, "result permissionViolations");
|
|
6635
|
+
normalizeMetrics(row.metrics);
|
|
6636
|
+
}
|
|
6637
|
+
}
|
|
6638
|
+
|
|
6639
|
+
/**
|
|
6640
|
+
* Authenticate raw rows through the existing final receipt's signed result
|
|
6641
|
+
* digests. This does not fetch/reverify the underlying execution/grader/safety
|
|
6642
|
+
* receipts, attest preparation costs, or turn the rows into promotion approval.
|
|
6643
|
+
* `expected` must come from the trusted host's registered run context.
|
|
6644
|
+
*/
|
|
6645
|
+
export async function verifyEvolutionEvalResultEvidence(
|
|
6646
|
+
verifier,
|
|
6647
|
+
input,
|
|
6648
|
+
expected,
|
|
6649
|
+
) {
|
|
6650
|
+
assertExactRecord(
|
|
6651
|
+
input,
|
|
6652
|
+
new Set(["receipt", "resultEvidence", "suite", "policy"]),
|
|
6653
|
+
"evaluation result evidence input",
|
|
6654
|
+
);
|
|
6655
|
+
// Capture every graph before invoking any asynchronous authority, using the
|
|
6656
|
+
// existing independent bounds for each canonical document.
|
|
6657
|
+
const receipt = deepFreeze(cloneCanonical(input.receipt));
|
|
6658
|
+
const evidence = deepFreeze(cloneCanonical(input.resultEvidence));
|
|
6659
|
+
const suite = verifyEvolutionEvalSuite(input.suite);
|
|
6660
|
+
const policy = verifyEvolutionEvalPolicy(input.policy);
|
|
6661
|
+
const expectedSnapshot = deepFreeze(cloneCanonical(expected));
|
|
6662
|
+
assertExactRecord(
|
|
6663
|
+
evidence,
|
|
6664
|
+
new Set([
|
|
6665
|
+
"schema",
|
|
6666
|
+
"receiptDigest",
|
|
6667
|
+
"validation",
|
|
6668
|
+
"test",
|
|
6669
|
+
"qualifiesForPromotion",
|
|
6670
|
+
"evidenceDigest",
|
|
6671
|
+
]),
|
|
6672
|
+
"evaluation result evidence",
|
|
6673
|
+
);
|
|
6674
|
+
if (
|
|
6675
|
+
evidence.schema !== EVOLUTION_EVAL_RESULT_EVIDENCE_SCHEMA ||
|
|
6676
|
+
evidence.qualifiesForPromotion !== false ||
|
|
6677
|
+
evidence.receiptDigest !== receipt.receiptDigest ||
|
|
6678
|
+
receipt.suiteDigest !== suite.suiteDigest ||
|
|
6679
|
+
receipt.policyDigest !== policy.policyDigest ||
|
|
6680
|
+
receipt.confidenceZ !== policy.confidenceZ ||
|
|
6681
|
+
!receipt.validation ||
|
|
6682
|
+
!receipt.test ||
|
|
6683
|
+
digest(receipt.splitCounts, "split-counts") !==
|
|
6684
|
+
digest(countSplits(suite.tasks), "split-counts")
|
|
6685
|
+
) {
|
|
6686
|
+
throw evalError(
|
|
6687
|
+
EVOLUTION_EVAL_INVALID_CODE,
|
|
6688
|
+
"result evidence differs from its receipt, suite, or policy",
|
|
6689
|
+
);
|
|
6690
|
+
}
|
|
6691
|
+
const seeds = new Set(policy.seeds);
|
|
6692
|
+
for (const split of ["validation", "test"]) {
|
|
6693
|
+
const results = evidence[split];
|
|
6694
|
+
assertExactRecord(
|
|
6695
|
+
results,
|
|
6696
|
+
new Set(["baseline", "candidate"]),
|
|
6697
|
+
"split results",
|
|
6698
|
+
);
|
|
6699
|
+
const tasks = new Set(
|
|
6700
|
+
suite.tasks
|
|
6701
|
+
.filter((task) => task.split === split)
|
|
6702
|
+
.map((task) => task.taskDigest),
|
|
6703
|
+
);
|
|
6704
|
+
for (const arm of ["baseline", "candidate"]) {
|
|
6705
|
+
verifyResultRows(results[arm], tasks, seeds);
|
|
6706
|
+
}
|
|
6707
|
+
const recomputed = comparisonSummary(
|
|
6708
|
+
results,
|
|
6709
|
+
policy.confidenceZ,
|
|
6710
|
+
seeds.size,
|
|
6711
|
+
);
|
|
6712
|
+
if (
|
|
6713
|
+
digest(recomputed, "chainlesschain.evolution-eval-comparison/v2") !==
|
|
6714
|
+
digest(receipt[split], "chainlesschain.evolution-eval-comparison/v2")
|
|
6715
|
+
) {
|
|
6716
|
+
throw evalError(
|
|
6717
|
+
EVOLUTION_EVAL_INVALID_CODE,
|
|
6718
|
+
"result rows do not reproduce the signed comparison",
|
|
6719
|
+
);
|
|
6720
|
+
}
|
|
6721
|
+
}
|
|
6722
|
+
const rebuilt = buildResultEvidence(receipt, evidence);
|
|
6723
|
+
if (rebuilt.evidenceDigest !== evidence.evidenceDigest) {
|
|
6724
|
+
throw evalError(
|
|
6725
|
+
EVOLUTION_EVAL_INVALID_CODE,
|
|
6726
|
+
"result evidence digest mismatch",
|
|
6727
|
+
);
|
|
6728
|
+
}
|
|
6729
|
+
// Verify freshness last so a receipt that expires during recomputation cannot
|
|
6730
|
+
// be returned as verified. The same check authenticates signature and context.
|
|
6731
|
+
await verifyEvolutionEvalReceipt(verifier, receipt, expectedSnapshot);
|
|
6732
|
+
return evidence;
|
|
6733
|
+
}
|