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.
Files changed (172) hide show
  1. package/README.md +15 -2
  2. package/package.json +2 -1
  3. package/scripts/pm-exploration-effect.mjs +188 -0
  4. package/src/assets/web-panel/assets/{AIOps-Vk4bgcvz.js → AIOps-CNaejClV.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-dm1pfXdM.js → ActionButton-CF_CVKT_.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-C9WdXlkB.js → Analytics-a3Z6J7gv.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-0f-jWk68.js → AppLayout-BFtWEnct.js} +5 -5
  8. package/src/assets/web-panel/assets/Artifacts-BQ8oeMvX.js +1 -0
  9. package/src/assets/web-panel/assets/{Audit-CymWJrNf.js → Audit-NOo9bmgk.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-9bWGX_cn.js → BackgroundAgents-QRc7F3Tp.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-DFBHB3_Y.js → Backup-UlVgLn2P.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-D9Lm9d3n.js → BaseInput-BER9LJAr.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-maC7odiU.js → Chat-Z8z2Fdfz.js} +5 -5
  14. package/src/assets/web-panel/assets/{ChatBubbleRenderer-Crsqn0B1.js → ChatBubbleRenderer-DdmuBrdQ.js} +1 -1
  15. package/src/assets/web-panel/assets/{Checkbox-BrZgAIL0.js → Checkbox-CXPgyB8L.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-ChqWBE8R.js → Codegen-D1vOsLJ7.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-C5TaXHn9.js → Col-ucLnUJC7.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-D8m4Egsw.js → Community-COsV9n9t.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-CMJmi_Bw.js → Compact-D0EkBEYh.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-CW7Bwy8s.js → Compliance-C8w9SUjt.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-DLhPTsU6.js → Cowork-CmVaKEJS.js} +3 -3
  22. package/src/assets/web-panel/assets/{Cron-DBrXtf_1.js → Cron-B_FiMMV2.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-CzLbJF3j.js → Crosschain-ByO3YL8N.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-DreItINq.js → DID-DwpsLM9r.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-B_gO9CjY.js → Dashboard-B_8IUvM_.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-DXpPiTH_.js → Dropdown-Bo6WQkuX.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-Cb1YonC_.js → EmailListRenderer-C9LiQesx.js} +1 -1
  28. package/src/assets/web-panel/assets/{EvolutionSettings-GQb6tV_E.js → EvolutionSettings-Pc1IpRfk.js} +1 -1
  29. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DUtpqpsn.js → FamilyGuardDashboard-Dst6VUnO.js} +1 -1
  30. package/src/assets/web-panel/assets/{Federation-CfZsj0gb.js → Federation-Ci7CoLkJ.js} +1 -1
  31. package/src/assets/web-panel/assets/{FormItemContext-Cdr40ozm.js → FormItemContext-bdDyUhUM.js} +1 -1
  32. package/src/assets/web-panel/assets/{GenericCardRenderer-BRaf18hh.js → GenericCardRenderer-CrRwOUVi.js} +1 -1
  33. package/src/assets/web-panel/assets/{Git-7SqGn3Zi.js → Git-Dis8h-Z-.js} +2 -2
  34. package/src/assets/web-panel/assets/{Governance-D1mfL8Fz.js → Governance-DX7OH5w2.js} +1 -1
  35. package/src/assets/web-panel/assets/{Inference-BXVyCWMd.js → Inference-Cavv_Q_Z.js} +1 -1
  36. package/src/assets/web-panel/assets/{KnowledgeGraph-C-wAA2Ub.js → KnowledgeGraph-Cck8tnZn.js} +1 -1
  37. package/src/assets/web-panel/assets/{Logs-DWxiJiFe.js → Logs-BQt3aGMu.js} +2 -2
  38. package/src/assets/web-panel/assets/MarkdownRenderer-BIUeeiVA.js +1 -0
  39. package/src/assets/web-panel/assets/{Marketplace-CmOVgbTO.js → Marketplace-CdmAKNSN.js} +1 -1
  40. package/src/assets/web-panel/assets/{McpTools-Cx4WyryN.js → McpTools-BUlJdyPY.js} +3 -3
  41. package/src/assets/web-panel/assets/{Memory-Di6wy0Ky.js → Memory-DQRTQDr-.js} +2 -2
  42. package/src/assets/web-panel/assets/{MobileBridge-DrR7I1A7.js → MobileBridge-C0dnxgsl.js} +1 -1
  43. package/src/assets/web-panel/assets/{MobileProjects-SnNFgay-.js → MobileProjects-DQ5Gy7fa.js} +1 -1
  44. package/src/assets/web-panel/assets/{Mtc-DPZpfO4G.js → Mtc-Xl7u2isS.js} +5 -5
  45. package/src/assets/web-panel/assets/{MtcAudit-CTT74J6Y.js → MtcAudit-C3KX0574.js} +2 -2
  46. package/src/assets/web-panel/assets/{Multisig-DoLT96hm.js → Multisig-CHEhfkn8.js} +3 -3
  47. package/src/assets/web-panel/assets/{NLProgramming-BY-9TS7_.js → NLProgramming-Ce38mH-8.js} +1 -1
  48. package/src/assets/web-panel/assets/{Notes-1_rKLQkS.js → Notes-C7nuTd7c.js} +4 -4
  49. package/src/assets/web-panel/assets/{NotificationSettings-D8N1NZ6Y.js → NotificationSettings-BcoEcyq8.js} +1 -1
  50. package/src/assets/web-panel/assets/{OrderTableRenderer-Ch-HjmbS.js → OrderTableRenderer-D-t5hKkx.js} +1 -1
  51. package/src/assets/web-panel/assets/{Organization-DKQtaPAc.js → Organization-C_BGi4xi.js} +4 -4
  52. package/src/assets/web-panel/assets/{Overflow-B3n9XpS2.js → Overflow-BodhraDq.js} +1 -1
  53. package/src/assets/web-panel/assets/{P2P-Fn8LWurl.js → P2P-BTa3sAIy.js} +2 -2
  54. package/src/assets/web-panel/assets/{PdhVaultBrowser-CsumgiUO.js → PdhVaultBrowser-BjZslP9T.js} +5 -5
  55. package/src/assets/web-panel/assets/{Permissions-CTCN6Rk6.js → Permissions-u3UDzGef.js} +3 -3
  56. package/src/assets/web-panel/assets/{PersonalDataHub-BwpvzXm7.js → PersonalDataHub-Cb7ybv65.js} +3 -3
  57. package/src/assets/web-panel/assets/{Pipeline-C1_hrCCQ.js → Pipeline-CS24k-P7.js} +1 -1
  58. package/src/assets/web-panel/assets/{Privacy-C-BmNft5.js → Privacy-Ddj6Kqs7.js} +1 -1
  59. package/src/assets/web-panel/assets/{ProjectInit-B9HYk17G.js → ProjectInit-Bg5uQIgg.js} +2 -2
  60. package/src/assets/web-panel/assets/{ProjectSettings-BFgA-an1.js → ProjectSettings-AmPR8T12.js} +2 -2
  61. package/src/assets/web-panel/assets/{Projects-Yofw9TrC.js → Projects-DGSbAyTK.js} +1 -1
  62. package/src/assets/web-panel/assets/{Providers-B83JppEP.js → Providers-Dc1C3lbB.js} +1 -1
  63. package/src/assets/web-panel/assets/{QrScannerModal-D5ZRpUGC.js → QrScannerModal-Cv3HXpce.js} +1 -1
  64. package/src/assets/web-panel/assets/{QuickAsk-B-mz9iY-.js → QuickAsk-3dpbXARb.js} +1 -1
  65. package/src/assets/web-panel/assets/{Recommend-DtjVu00v.js → Recommend-5aGRVnJK.js} +1 -1
  66. package/src/assets/web-panel/assets/{RemoteSession-Dk8IBiG3.js → RemoteSession-CTS2jx0p.js} +3 -3
  67. package/src/assets/web-panel/assets/{Reputation-DpTIK7Oe.js → Reputation-BxaKI0hY.js} +1 -1
  68. package/src/assets/web-panel/assets/{Row-DVYQoXil.js → Row-C23uQdwd.js} +1 -1
  69. package/src/assets/web-panel/assets/{RssFeed-ikMaTwEE.js → RssFeed-ssX9YOhm.js} +3 -3
  70. package/src/assets/web-panel/assets/{Search-CHVHCNdo.js → Search-C24GogII.js} +1 -1
  71. package/src/assets/web-panel/assets/{Security-MxjX-UDp.js → Security-DdAcGKkk.js} +2 -2
  72. package/src/assets/web-panel/assets/{Services-CmwTYlHk.js → Services-D0dCiEuq.js} +2 -2
  73. package/src/assets/web-panel/assets/{Skeleton-BQzBoW5V.js → Skeleton-DEY44o0v.js} +1 -1
  74. package/src/assets/web-panel/assets/Skills-CYt0Mu2W.js +1 -0
  75. package/src/assets/web-panel/assets/{Sla-DOQbR10a.js → Sla-B_bbo2vB.js} +1 -1
  76. package/src/assets/web-panel/assets/SpeechSettings-a2BBjtTL.js +1 -0
  77. package/src/assets/web-panel/assets/{SyncSettings-BPyc0P-r.js → SyncSettings-CpIXql0Z.js} +2 -2
  78. package/src/assets/web-panel/assets/Tasks-BYQKU-GL.js +1 -0
  79. package/src/assets/web-panel/assets/{Templates-BRpihbvV.js → Templates-C_44nVPq.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tenant-B1qu8vDX.js → Tenant-CyZ2ey2P.js} +1 -1
  81. package/src/assets/web-panel/assets/{Terminal-CEe3YAvM.js → Terminal-DwGNHWnp.js} +2 -2
  82. package/src/assets/web-panel/assets/{TimelineRenderer-Biz2ENj5.js → TimelineRenderer-BTAHNkqU.js} +1 -1
  83. package/src/assets/web-panel/assets/{Tokens-Bh-mJyas.js → Tokens-DCJWkUwc.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trigger-DaFKe1bY.js → Trigger-BCjDO9-E.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trust-DsJ7u_-G.js → Trust-_YS8WbRb.js} +1 -1
  86. package/src/assets/web-panel/assets/{UkeySign-9I90JZxO.js → UkeySign-m6R8xGq7.js} +1 -1
  87. package/src/assets/web-panel/assets/{VideoEditing-C96s3pW9.js → VideoEditing-xOfk29c4.js} +1 -1
  88. package/src/assets/web-panel/assets/{Wallet-DTMqIySe.js → Wallet-B1Gw0awc.js} +4 -4
  89. package/src/assets/web-panel/assets/{WebAuthn-C3rh3szY.js → WebAuthn-CHK5ft18.js} +5 -5
  90. package/src/assets/web-panel/assets/{WorkflowEditor-C3as7vBp.js → WorkflowEditor-DEp1ukQQ.js} +1 -1
  91. package/src/assets/web-panel/assets/{chat-zsGetwuT.js → chat-B2sFizun.js} +1 -1
  92. package/src/assets/web-panel/assets/{colors-Dt9qbWYV.js → colors-DJ17YV1E.js} +1 -1
  93. package/src/assets/web-panel/assets/{compact-item-BJWYHVIL.js → compact-item-CBhJJgEC.js} +1 -1
  94. package/src/assets/web-panel/assets/{createContext-pKrpnY7l.js → createContext-BZkpvNJy.js} +1 -1
  95. package/src/assets/web-panel/assets/devWarning-DZhu13vj.js +1 -0
  96. package/src/assets/web-panel/assets/{hasIn-sbUKl7Xu.js → hasIn-C0ZKo6Ei.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-BfQmb4PB.js → index-4oULtRqE.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DD_IBhgm.js → index-5K2z_tgO.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BWPF2Hth.js → index-8ueG48gl.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CRsSdHdW.js → index-BEnd5fiz.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BiZ6Lupa.js → index-BGIvhCPl.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BQtTUsCI.js → index-BMxOoITz.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-qE4san4o.js → index-BNp6HKFh.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-omZRNwB7.js → index-BOfPp5OV.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CnrxgbPB.js → index-Bc3vVG2X.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CR5WxgE-.js → index-BoDUYyuo.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BRpfrG-e.js → index-BpyrhOeh.js} +1 -1
  108. package/src/assets/web-panel/assets/index-C6iFyQYz.js +1 -0
  109. package/src/assets/web-panel/assets/{index-Dmp7IdrF.js → index-C7gv9dvb.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-5GohpTfK.js → index-C9gYiACH.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-D7tOZZAs.js → index-CCOr6Q27.js} +1 -1
  112. package/src/assets/web-panel/assets/{index--wWXhZQU.js → index-CW5o1Gar.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BFMPJahZ.js → index-CZW84cEf.js} +3 -3
  114. package/src/assets/web-panel/assets/{index-DRAzhNw6.js → index-CZlkPrxb.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-Bf8dv266.js → index-CdxJm-HB.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-sakhsZMa.js → index-Chct9tL8.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DFQTgkPD.js → index-Cn5UzvgR.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BR1gZBlK.js → index-Ctguam0K.js} +1 -1
  119. package/src/assets/web-panel/assets/index-CztThH9f.js +1 -0
  120. package/src/assets/web-panel/assets/{index-T8ASbPWt.js → index-DHtpMr1G.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-fQ-JtwM7.js → index-DJkoJzTU.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-Di-YcQHn.js → index-DLMr5KMd.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-oUag3zZf.js → index-DLo8Ls9u.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-BSXJ2PbY.js → index-DM0rWF6z.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-C_z7zLle.js → index-DOBXNMdh.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-0CK6iR4G.js → index-Dfgxe-fw.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-B53DhH1R.js → index-DjdSFO0d.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-vTPOhhfW.js → index-DrU5xVpF.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DJZq5jWm.js → index-DumLgj1t.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-BZmBSuN8.js → index-Dxe0YlZe.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DoMii5CD.js → index-DyiCbHeL.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-n8vVPeJ6.js → index-IHgzfc1u.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DIxu3nOh.js → index-KzNhWykP.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-DWBlZsqf.js → index-LPPe0val.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-B9DoXtNz.js → index-vFMwiAN4.js} +1 -1
  136. package/src/assets/web-panel/assets/{initDefaultProps-BVpFM2mv.js → initDefaultProps-Cqfoq0TJ.js} +1 -1
  137. package/src/assets/web-panel/assets/{motion-Mrl9_kZM.js → motion-CIiVJHNu.js} +1 -1
  138. package/src/assets/web-panel/assets/{move-CvRC7fRw.js → move-CFl1o_A8.js} +1 -1
  139. package/src/assets/web-panel/assets/{mtc-parser-C7PSeivU.js → mtc-parser-DYoCxcZ1.js} +1 -1
  140. package/src/assets/web-panel/assets/{omit-RI1cO_Ok.js → omit-C1P2q5TY.js} +1 -1
  141. package/src/assets/web-panel/assets/{pickAttrs-akwD3e22.js → pickAttrs-BtTRpJtC.js} +1 -1
  142. package/src/assets/web-panel/assets/{placementArrow-C4f-tfqj.js → placementArrow-Cst2PcNM.js} +1 -1
  143. package/src/assets/web-panel/assets/{responsiveObserve-hyHNGoSW.js → responsiveObserve-CF5kalV2.js} +1 -1
  144. package/src/assets/web-panel/assets/{slide-B6vlTDr6.js → slide-CtHGqpXN.js} +1 -1
  145. package/src/assets/web-panel/assets/{statusUtils-D8poWZW8.js → statusUtils-N__biHXf.js} +1 -1
  146. package/src/assets/web-panel/assets/{styleChecker-Bz1ZKvoD.js → styleChecker-DR8V_H-i.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFlexGapSupport-C-vv_T11.js → useFlexGapSupport-D274dqun.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFs-BubqlAej.js → useFs-BwHLYU5b.js} +1 -1
  149. package/src/assets/web-panel/assets/{usePersonalDataHub-CTNJrVC8.js → usePersonalDataHub-BiA-hVqt.js} +1 -1
  150. package/src/assets/web-panel/assets/{vnode-DbT41Wli.js → vnode-Bugl94dy.js} +1 -1
  151. package/src/assets/web-panel/assets/{zoom-R0Rxz73D.js → zoom-DEFl8GCu.js} +1 -1
  152. package/src/assets/web-panel/index.html +1 -1
  153. package/src/data/changelog.json +52 -0
  154. package/src/lib/evolution/evolution-eval-child-evidence-ledger-adapter.js +2 -0
  155. package/src/lib/evolution/evolution-eval-cohort-enrollment.js +770 -0
  156. package/src/lib/evolution/evolution-eval-contracts.js +86 -0
  157. package/src/lib/evolution/evolution-eval-gate.js +423 -115
  158. package/src/lib/evolution/evolution-eval-launch-admission.js +505 -0
  159. package/src/lib/evolution/pm-exploration-benchmark.js +2014 -49
  160. package/src/lib/evolution/skill-target-matrix-eval.js +84 -3
  161. package/src/lib/evolution/skill-writer-inventory-manifest.js +4 -1
  162. package/src/lib/task-progress-tracker.js +47 -4
  163. package/src/lib/with-file-lock.js +81 -16
  164. package/src/runtime/agent-core.js +18 -7
  165. package/src/assets/web-panel/assets/Artifacts-C7HWVeFu.js +0 -1
  166. package/src/assets/web-panel/assets/MarkdownRenderer-BJl3Hibe.js +0 -1
  167. package/src/assets/web-panel/assets/Skills-B-mPG69i.js +0 -1
  168. package/src/assets/web-panel/assets/SpeechSettings-wPQkSA9J.js +0 -1
  169. package/src/assets/web-panel/assets/Tasks-DbBA-eHJ.js +0 -1
  170. package/src/assets/web-panel/assets/devWarning-CAmY8PZd.js +0 -1
  171. package/src/assets/web-panel/assets/index-Dfsrnshy.js +0 -1
  172. 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
- export const EVOLUTION_EVAL_TASK_SCHEMA =
14
- "chainlesschain.evolution-eval-task/v1";
15
- export const EVOLUTION_EVAL_SUITE_SCHEMA =
16
- "chainlesschain.evolution-eval-suite/v1";
17
- export const EVOLUTION_EVAL_POLICY_SCHEMA =
18
- "chainlesschain.evolution-eval-policy/v2";
19
- export const EVOLUTION_EVAL_RECEIPT_SCHEMA =
20
- "chainlesschain.evolution-eval-receipt/v4";
21
- export const EVOLUTION_EVAL_SUITE_AUTHORITY_SCHEMA =
22
- "chainlesschain.evolution-eval-suite-authority-receipt/v1";
23
- export const EVOLUTION_EVAL_ENVIRONMENT_SCHEMA =
24
- "chainlesschain.evolution-eval-environment-receipt/v1";
25
- export const EVOLUTION_EVAL_ARTIFACT_SCHEMA =
26
- "chainlesschain.evolution-eval-artifact-resolution-receipt/v1";
27
- export const EVOLUTION_EVAL_PROVENANCE_SCHEMA =
28
- "chainlesschain.evolution-eval-provenance-binding-receipt/v1";
29
- export const EVOLUTION_EVAL_SUBJECT_SCHEMA =
30
- "chainlesschain.evolution-eval-subject-handle-receipt/v1";
31
- export const EVOLUTION_EVAL_REPLAY_SCHEMA =
32
- "chainlesschain.evolution-eval-handle-reservation-receipt/v1";
33
- export const EVOLUTION_EVAL_SUPERVISION_SCHEMA =
34
- "chainlesschain.evolution-eval-deadline-enforcement-receipt/v3";
35
- export const EVOLUTION_EVAL_ISOLATED_TARGET_SCHEMA =
36
- "chainlesschain.evolution-eval-isolated-target/v2";
37
- export const EVOLUTION_EVAL_AUTHORITY_DESCRIPTOR_SCHEMA =
38
- "chainlesschain.evolution-eval-authority-descriptor/v1";
39
- /**
40
- * Authority roots commit configuration supplied by a trusted composition
41
- * boundary. They are not local proofs that JavaScript callable bytes match a
42
- * declared handlerArtifactDigest. Production must use an attested loader that
43
- * binds each descriptor to the loaded callable; requests and plugins must not
44
- * construct Gate/Verifier authority ports.
45
- */
46
- export const EVOLUTION_EVAL_AUTHORITY_ROOT_SEMANTICS = Object.freeze({
47
- kind: "trusted-composition-configuration-commitment",
48
- callableBinding: "attested-loader-required",
49
- requestConstructedAuthorities: "forbidden",
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
- const evaluated = await this.#evaluateBlindedWorkPlan(
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
+ }