@tangle-network/agent-eval 0.183.0 → 0.185.0

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 (248) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/adapters/http.d.ts +2 -2
  3. package/dist/{agent-profile-cell-s__adRnK.d.ts → agent-profile-cell-BHcB-mZX.d.ts} +8 -9
  4. package/dist/{agent-profile-cell-s__adRnK.d.ts.map → agent-profile-cell-BHcB-mZX.d.ts.map} +1 -1
  5. package/dist/{agent-profile-cell-Cv6UA-W_.js → agent-profile-cell-DcFW4vOc.js} +16 -15
  6. package/dist/agent-profile-cell-DcFW4vOc.js.map +1 -0
  7. package/dist/{agent-profile-CivaSsSy.d.ts → agent-profile-uAIQK3Nr.d.ts} +3 -3
  8. package/dist/{agent-profile-CivaSsSy.d.ts.map → agent-profile-uAIQK3Nr.d.ts.map} +1 -1
  9. package/dist/analyst/index.d.ts +11 -336
  10. package/dist/analyst/index.d.ts.map +1 -1
  11. package/dist/analyst/index.js +10 -8
  12. package/dist/analyst/index.js.map +1 -1
  13. package/dist/analyze-runs-CrYhqXop.d.ts +75 -0
  14. package/dist/analyze-runs-CrYhqXop.d.ts.map +1 -0
  15. package/dist/{define-agent-eval-CneiWyuA.js → analyze-runs-sTygaDyD.js} +6 -813
  16. package/dist/analyze-runs-sTygaDyD.js.map +1 -0
  17. package/dist/{benchmark-DQKzykkO.js → benchmark-BeQJyrRC.js} +3 -3
  18. package/dist/{benchmark-DQKzykkO.js.map → benchmark-BeQJyrRC.js.map} +1 -1
  19. package/dist/{benchmark-command-NBrqNwgy.js → benchmark-command-kvq7yFY4.js} +17 -54
  20. package/dist/benchmark-command-kvq7yFY4.js.map +1 -0
  21. package/dist/benchmarks/index.d.ts +4 -4
  22. package/dist/benchmarks/index.js +3 -3
  23. package/dist/builder-eval/index.js +1 -1
  24. package/dist/campaign/index.d.ts +6 -5
  25. package/dist/campaign/index.js +10 -9
  26. package/dist/{campaign-BwcEBC91.js → campaign-eJgtRs-W.js} +16 -15
  27. package/dist/{campaign-BwcEBC91.js.map → campaign-eJgtRs-W.js.map} +1 -1
  28. package/dist/{campaign-evidence-PYPUftRy.js → campaign-evidence-BsrCmBSE.js} +7 -258
  29. package/dist/campaign-evidence-BsrCmBSE.js.map +1 -0
  30. package/dist/{canonical-DPyQ_rpt.js → canonical-BsZVgBhW.js} +2 -4
  31. package/dist/canonical-BsZVgBhW.js.map +1 -0
  32. package/dist/cli.js +2 -2
  33. package/dist/{client-kh2jOjTK.d.ts → client-Bc8LANCG.d.ts} +4 -4
  34. package/dist/{client-kh2jOjTK.d.ts.map → client-Bc8LANCG.d.ts.map} +1 -1
  35. package/dist/contract/index.d.ts +10 -10
  36. package/dist/contract/index.js +15 -284
  37. package/dist/contract/index.js.map +1 -1
  38. package/dist/{default-registry-BwDSWVzg.d.ts → default-registry-CXv9kHMt.d.ts} +6 -6
  39. package/dist/{default-registry-BwDSWVzg.d.ts.map → default-registry-CXv9kHMt.d.ts.map} +1 -1
  40. package/dist/{default-registry-C0-N4PkG.js → default-registry-xiHrldW8.js} +6 -4
  41. package/dist/{default-registry-C0-N4PkG.js.map → default-registry-xiHrldW8.js.map} +1 -1
  42. package/dist/define-agent-eval-D4uumjl3.js +813 -0
  43. package/dist/define-agent-eval-D4uumjl3.js.map +1 -0
  44. package/dist/{define-agent-eval-CwOWWQt_.d.ts → define-agent-eval-DE67ECH1.d.ts} +7 -7
  45. package/dist/{define-agent-eval-CwOWWQt_.d.ts.map → define-agent-eval-DE67ECH1.d.ts.map} +1 -1
  46. package/dist/diagnosis/index.d.ts +319 -0
  47. package/dist/diagnosis/index.d.ts.map +1 -0
  48. package/dist/diagnosis/index.js +1328 -0
  49. package/dist/diagnosis/index.js.map +1 -0
  50. package/dist/{dspy-rlm-engine-8pgBSiy7.js → dspy-rlm-engine-BE9lCzzL.js} +3 -3
  51. package/dist/{dspy-rlm-engine-8pgBSiy7.js.map → dspy-rlm-engine-BE9lCzzL.js.map} +1 -1
  52. package/dist/{engine-DS1cysJy.d.ts → engine-cXUK-WHS.d.ts} +5 -77
  53. package/dist/engine-cXUK-WHS.d.ts.map +1 -0
  54. package/dist/equal-terms-Blx9Zk5I.js +25 -0
  55. package/dist/equal-terms-Blx9Zk5I.js.map +1 -0
  56. package/dist/{eval-campaign-CCEkwzoH.js → eval-campaign-XFHEpN86.js} +4 -4
  57. package/dist/{eval-campaign-CCEkwzoH.js.map → eval-campaign-XFHEpN86.js.map} +1 -1
  58. package/dist/evaluation.d.ts +75 -0
  59. package/dist/evaluation.d.ts.map +1 -0
  60. package/dist/evaluation.js +137 -0
  61. package/dist/evaluation.js.map +1 -0
  62. package/dist/{exact-types-BZDe0W2D.d.ts → exact-types-BEHN7tnq.d.ts} +2 -2
  63. package/dist/{exact-types-BZDe0W2D.d.ts.map → exact-types-BEHN7tnq.d.ts.map} +1 -1
  64. package/dist/experiment/index.d.ts +2 -2
  65. package/dist/experiment/index.js +6 -5
  66. package/dist/experiment/index.js.map +1 -1
  67. package/dist/{experiment-tracker-C7PfnF4b.d.ts → experiment-tracker-URRGP9ek.d.ts} +2 -2
  68. package/dist/{experiment-tracker-C7PfnF4b.d.ts.map → experiment-tracker-URRGP9ek.d.ts.map} +1 -1
  69. package/dist/{external-optimizer-process-DIB4YWEe.js → external-optimizer-process-BbhvXTFx.js} +4 -4
  70. package/dist/{external-optimizer-process-DIB4YWEe.js.map → external-optimizer-process-BbhvXTFx.js.map} +1 -1
  71. package/dist/{external-optimizer-subprocess-CjguXN2e.js → external-optimizer-subprocess-DMgmqTB6.js} +3 -3
  72. package/dist/{external-optimizer-subprocess-CjguXN2e.js.map → external-optimizer-subprocess-DMgmqTB6.js.map} +1 -1
  73. package/dist/{feedback-trajectory-CXmtITBo.d.ts → feedback-trajectory-CytTR7u4.d.ts} +3 -3
  74. package/dist/{feedback-trajectory-CXmtITBo.d.ts.map → feedback-trajectory-CytTR7u4.d.ts.map} +1 -1
  75. package/dist/hosted/index.d.ts +2 -2
  76. package/dist/{index-DoykkxW0.d.ts → index-BQWfAFeH.d.ts} +11 -11
  77. package/dist/{index-DoykkxW0.d.ts.map → index-BQWfAFeH.d.ts.map} +1 -1
  78. package/dist/{index-DbG8QbH9.d.ts → index-C8_iU8KL.d.ts} +6 -6
  79. package/dist/{index-DbG8QbH9.d.ts.map → index-C8_iU8KL.d.ts.map} +1 -1
  80. package/dist/{index--_8_Nlpn.d.ts → index-CKZa_rnt.d.ts} +4 -121
  81. package/dist/index-CKZa_rnt.d.ts.map +1 -0
  82. package/dist/{index-Bp_6sj3x.d.ts → index-ww8736Am.d.ts} +20 -315
  83. package/dist/index-ww8736Am.d.ts.map +1 -0
  84. package/dist/index.d.ts +24 -22
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +25 -24
  87. package/dist/index.js.map +1 -1
  88. package/dist/{insight-report-D1qa0HWs.d.ts → insight-report-C3Bfl762.d.ts} +3 -3
  89. package/dist/{insight-report-D1qa0HWs.d.ts.map → insight-report-C3Bfl762.d.ts.map} +1 -1
  90. package/dist/jev-protocol.d.ts +74 -0
  91. package/dist/jev-protocol.d.ts.map +1 -0
  92. package/dist/jev-protocol.js +91 -0
  93. package/dist/jev-protocol.js.map +1 -0
  94. package/dist/jev.d.ts +131 -0
  95. package/dist/jev.d.ts.map +1 -0
  96. package/dist/jev.js +312 -0
  97. package/dist/jev.js.map +1 -0
  98. package/dist/{journal-Cs9f7385.js → journal-BuRLm6ho.js} +2 -2
  99. package/dist/{journal-Cs9f7385.js.map → journal-BuRLm6ho.js.map} +1 -1
  100. package/dist/{kind-factory-DxTzg32u.js → kind-factory-V79Hw0AU.js} +7 -84
  101. package/dist/kind-factory-V79Hw0AU.js.map +1 -0
  102. package/dist/ledger-core/index.js +2 -2
  103. package/dist/{llm-judge-FfaRgz9X.js → llm-judge-FWWhEb31.js} +11 -9
  104. package/dist/{llm-judge-FfaRgz9X.js.map → llm-judge-FWWhEb31.js.map} +1 -1
  105. package/dist/{matrix-CyhW-vgJ.d.ts → matrix-CPKsRY8Y.d.ts} +2 -2
  106. package/dist/{matrix-CyhW-vgJ.d.ts.map → matrix-CPKsRY8Y.d.ts.map} +1 -1
  107. package/dist/meta-eval/index.d.ts +54 -2
  108. package/dist/meta-eval/index.d.ts.map +1 -1
  109. package/dist/meta-eval/index.js +52 -3
  110. package/dist/meta-eval/index.js.map +1 -1
  111. package/dist/{mint-ySIIkKlV.js → mint-B4zgSAJW.js} +63 -14
  112. package/dist/mint-B4zgSAJW.js.map +1 -0
  113. package/dist/mint-BI14xehJ.d.ts +285 -0
  114. package/dist/mint-BI14xehJ.d.ts.map +1 -0
  115. package/dist/multishot/golden/index.d.ts +1 -1
  116. package/dist/multishot/index.d.ts +2 -2
  117. package/dist/openapi.json +1 -1
  118. package/dist/otel-spans-CQY1pNiN.js +275 -0
  119. package/dist/otel-spans-CQY1pNiN.js.map +1 -0
  120. package/dist/otlp-attributes-BpC_blLF.js +83 -0
  121. package/dist/otlp-attributes-BpC_blLF.js.map +1 -0
  122. package/dist/{run-record-DPa2PeHx.js → paired-promotion-decision-ClJh_9nK.js} +2 -215
  123. package/dist/paired-promotion-decision-ClJh_9nK.js.map +1 -0
  124. package/dist/pipelines/index.js +2 -2
  125. package/dist/prime-bridge-transport-Z3cpKGoV.js +43 -0
  126. package/dist/prime-bridge-transport-Z3cpKGoV.js.map +1 -0
  127. package/dist/prime-protocol-CDBcL9NM.d.ts +331 -0
  128. package/dist/prime-protocol-CDBcL9NM.d.ts.map +1 -0
  129. package/dist/{prime-protocol-6tZTVsWm.js → prime-protocol-DcAK9pC8.js} +2 -23
  130. package/dist/prime-protocol-DcAK9pC8.js.map +1 -0
  131. package/dist/{produced-state-CGoVInrl.js → produced-state-CmB02tr2.js} +23 -19
  132. package/dist/{produced-state-CGoVInrl.js.map → produced-state-CmB02tr2.js.map} +1 -1
  133. package/dist/profile-cell.d.ts +1 -1
  134. package/dist/profile-cell.js +1 -1
  135. package/dist/{promotion-policy-BKFrl7CC.js → promotion-policy-DdrYWHDh.js} +3 -3
  136. package/dist/{promotion-policy-BKFrl7CC.js.map → promotion-policy-DdrYWHDh.js.map} +1 -1
  137. package/dist/{query-D1nLIKt7.js → query-DlV0pdx4.js} +2 -2
  138. package/dist/{query-D1nLIKt7.js.map → query-DlV0pdx4.js.map} +1 -1
  139. package/dist/{registry-BRbB6Y0v.d.ts → registry-D5Ly3GRV.d.ts} +3 -3
  140. package/dist/{registry-BRbB6Y0v.d.ts.map → registry-D5Ly3GRV.d.ts.map} +1 -1
  141. package/dist/{release-confidence-BcqeQTHW.d.ts → release-confidence-DsETiO4f.d.ts} +3 -3
  142. package/dist/{release-confidence-BcqeQTHW.d.ts.map → release-confidence-DsETiO4f.d.ts.map} +1 -1
  143. package/dist/{release-confidence-DMg8n18l.js → release-confidence-RanRUXRW.js} +2 -2
  144. package/dist/{release-confidence-DMg8n18l.js.map → release-confidence-RanRUXRW.js.map} +1 -1
  145. package/dist/reporting.d.ts +3 -3
  146. package/dist/reporting.js +2 -2
  147. package/dist/{researcher-64T49THL.d.ts → researcher-CJkH-6Ty.d.ts} +4 -4
  148. package/dist/{researcher-64T49THL.d.ts.map → researcher-CJkH-6Ty.d.ts.map} +1 -1
  149. package/dist/{reward-hacking-uzO_ihep.d.ts → reward-hacking-BIQ2BWLG.d.ts} +2 -2
  150. package/dist/{reward-hacking-uzO_ihep.d.ts.map → reward-hacking-BIQ2BWLG.d.ts.map} +1 -1
  151. package/dist/rl.d.ts +10 -6
  152. package/dist/rl.d.ts.map +1 -1
  153. package/dist/rl.js +22 -7
  154. package/dist/rl.js.map +1 -1
  155. package/dist/rollout/index.d.ts +2 -2
  156. package/dist/rollout/index.js +2 -2
  157. package/dist/{rollout-D_54FZVu.js → rollout-C0Ifk3vK.js} +2 -2
  158. package/dist/{rollout-D_54FZVu.js.map → rollout-C0Ifk3vK.js.map} +1 -1
  159. package/dist/{rubric-predictive-validity-Bmj2_cll.d.ts → rubric-predictive-validity-CTU8y8Cv.d.ts} +2 -2
  160. package/dist/{rubric-predictive-validity-Bmj2_cll.d.ts.map → rubric-predictive-validity-CTU8y8Cv.d.ts.map} +1 -1
  161. package/dist/run-record-CNNzWGpB.js +216 -0
  162. package/dist/run-record-CNNzWGpB.js.map +1 -0
  163. package/dist/{run-record-BiTWauyO.d.ts → run-record-D9wS35fK.d.ts} +2 -2
  164. package/dist/{run-record-BiTWauyO.d.ts.map → run-record-D9wS35fK.d.ts.map} +1 -1
  165. package/dist/{run-record-DualPTn2.js → run-record-tg_5H2IK.js} +2 -2
  166. package/dist/{run-record-DualPTn2.js.map → run-record-tg_5H2IK.js.map} +1 -1
  167. package/dist/search-ledger-types-D7KDVg-o.d.ts +302 -0
  168. package/dist/search-ledger-types-D7KDVg-o.d.ts.map +1 -0
  169. package/dist/{semantic-concept-judge-_3Fp6Q_3.js → semantic-concept-judge-Cnt0TWp0.js} +4 -4
  170. package/dist/{semantic-concept-judge-_3Fp6Q_3.js.map → semantic-concept-judge-Cnt0TWp0.js.map} +1 -1
  171. package/dist/{sequential-D_xHrBZe.js → sequential-PgLEqcTJ.js} +3 -3
  172. package/dist/{sequential-D_xHrBZe.js.map → sequential-PgLEqcTJ.js.map} +1 -1
  173. package/dist/{server-BZQR1f0C.js → server-DmpcFiVK.js} +2 -2
  174. package/dist/{server-BZQR1f0C.js.map → server-DmpcFiVK.js.map} +1 -1
  175. package/dist/{skillopt-optimization-method-DY1aQ-aL.js → skillopt-optimization-method-FSk8b5FQ.js} +8 -7
  176. package/dist/{skillopt-optimization-method-DY1aQ-aL.js.map → skillopt-optimization-method-FSk8b5FQ.js.map} +1 -1
  177. package/dist/{statistical-heldout-CpVd6FmY.d.ts → statistical-heldout-Bu4oNOJh.d.ts} +3 -3
  178. package/dist/{statistical-heldout-CpVd6FmY.d.ts.map → statistical-heldout-Bu4oNOJh.d.ts.map} +1 -1
  179. package/dist/statistical-heldout-CeWT_W7y.js +256 -0
  180. package/dist/statistical-heldout-CeWT_W7y.js.map +1 -0
  181. package/dist/{store-otlp-DAaEbMLf.js → store-otlp-2gYCy-v0.js} +2 -2
  182. package/dist/{store-otlp-DAaEbMLf.js.map → store-otlp-2gYCy-v0.js.map} +1 -1
  183. package/dist/{store-tool-spans-BZ8MPKFe.js → store-tool-spans-B1e6Auc2.js} +69 -6
  184. package/dist/store-tool-spans-B1e6Auc2.js.map +1 -0
  185. package/dist/{store-tool-spans-Dt-YdAuE.d.ts → store-tool-spans-BrdfPaVh.d.ts} +54 -6
  186. package/dist/store-tool-spans-BrdfPaVh.d.ts.map +1 -0
  187. package/dist/{summary-report-IGAOtgPd.js → summary-report-BMvou2oZ.js} +2 -2
  188. package/dist/{summary-report-IGAOtgPd.js.map → summary-report-BMvou2oZ.js.map} +1 -1
  189. package/dist/{summary-report-D1h4dlrK.d.ts → summary-report-BzFS5UhZ.d.ts} +2 -2
  190. package/dist/{summary-report-D1h4dlrK.d.ts.map → summary-report-BzFS5UhZ.d.ts.map} +1 -1
  191. package/dist/{task-failure-attributes-B_JjrOVo.js → task-failure-attributes-B34TiMBe.js} +2 -2
  192. package/dist/{task-failure-attributes-B_JjrOVo.js.map → task-failure-attributes-B34TiMBe.js.map} +1 -1
  193. package/dist/{tool-groups-B2bSNaJB.d.ts → tool-groups-eOOgYGaM.d.ts} +3 -3
  194. package/dist/tool-groups-eOOgYGaM.d.ts.map +1 -0
  195. package/dist/{tool-waste-C7MU9u1e.js → tool-waste-nbHPAxei.js} +2 -2
  196. package/dist/{tool-waste-C7MU9u1e.js.map → tool-waste-nbHPAxei.js.map} +1 -1
  197. package/dist/trace-repair/index.d.ts +2 -2
  198. package/dist/trace-repair/index.js +5 -4
  199. package/dist/trace-repair/index.js.map +1 -1
  200. package/dist/traces.d.ts +5 -5
  201. package/dist/traces.js +8 -7
  202. package/dist/traces.js.map +1 -1
  203. package/dist/trajectory-replay/index.js +1 -1
  204. package/dist/{types-CS0qk_Yp.d.ts → types-BTRcIqFr.d.ts} +3 -3
  205. package/dist/{types-CS0qk_Yp.d.ts.map → types-BTRcIqFr.d.ts.map} +1 -1
  206. package/dist/{types-D7gEdPoQ.d.ts → types-BjB2wZM9.d.ts} +2 -2
  207. package/dist/{types-D7gEdPoQ.d.ts.map → types-BjB2wZM9.d.ts.map} +1 -1
  208. package/dist/types-C8VBbiw6.js +91 -0
  209. package/dist/types-C8VBbiw6.js.map +1 -0
  210. package/dist/{types-BvZoPTGa.d.ts → types-c3ZRTbw9.d.ts} +3 -3
  211. package/dist/{types-BvZoPTGa.d.ts.map → types-c3ZRTbw9.d.ts.map} +1 -1
  212. package/dist/{types-DQ0e2E7y.js → usage-receipt-Cx3xNeyB.js} +2 -89
  213. package/dist/usage-receipt-Cx3xNeyB.js.map +1 -0
  214. package/dist/{verdict-BQ3pCFf8.js → verdict-DhPoXApk.js} +2 -2
  215. package/dist/{verdict-BQ3pCFf8.js.map → verdict-DhPoXApk.js.map} +1 -1
  216. package/dist/{verdict-cache-B3eCVQtY.js → verdict-cache-BQEsVy9n.js} +2 -2
  217. package/dist/{verdict-cache-B3eCVQtY.js.map → verdict-cache-BQEsVy9n.js.map} +1 -1
  218. package/dist/wire/index.d.ts +1 -1
  219. package/dist/wire/index.js +1 -1
  220. package/docs/changes/evaluation-definition-identity.md +27 -0
  221. package/docs/changes/jev-evidence-review.md +18 -0
  222. package/docs/changes/jev-product-adoption.md +18 -0
  223. package/docs/changes/probability-policy-audit.md +81 -0
  224. package/docs/diagnosis.md +42 -0
  225. package/docs/jev-behavior-review.md +174 -0
  226. package/docs/jev-integrations.md +50 -0
  227. package/docs/jev.md +140 -0
  228. package/docs/produced-state.md +13 -0
  229. package/docs/profile-json-identity.md +33 -0
  230. package/package.json +22 -1
  231. package/dist/agent-profile-cell-Cv6UA-W_.js.map +0 -1
  232. package/dist/benchmark-command-NBrqNwgy.js.map +0 -1
  233. package/dist/campaign-evidence-PYPUftRy.js.map +0 -1
  234. package/dist/canonical-DPyQ_rpt.js.map +0 -1
  235. package/dist/define-agent-eval-CneiWyuA.js.map +0 -1
  236. package/dist/engine-DS1cysJy.d.ts.map +0 -1
  237. package/dist/exporters-D98GPi1n.d.ts +0 -161
  238. package/dist/exporters-D98GPi1n.d.ts.map +0 -1
  239. package/dist/index--_8_Nlpn.d.ts.map +0 -1
  240. package/dist/index-Bp_6sj3x.d.ts.map +0 -1
  241. package/dist/kind-factory-DxTzg32u.js.map +0 -1
  242. package/dist/mint-ySIIkKlV.js.map +0 -1
  243. package/dist/prime-protocol-6tZTVsWm.js.map +0 -1
  244. package/dist/run-record-DPa2PeHx.js.map +0 -1
  245. package/dist/store-tool-spans-BZ8MPKFe.js.map +0 -1
  246. package/dist/store-tool-spans-Dt-YdAuE.d.ts.map +0 -1
  247. package/dist/tool-groups-B2bSNaJB.d.ts.map +0 -1
  248. package/dist/types-DQ0e2E7y.js.map +0 -1
@@ -0,0 +1,813 @@
1
+ import { s as ValidationError } from "./errors-Dngq5h35.js";
2
+ import { t as analyzeRuns } from "./analyze-runs-sTygaDyD.js";
3
+ import { i as modelHasSnapshot } from "./run-record-tg_5H2IK.js";
4
+ import { C as assertSearchHistoryAdmissionOptions, G as assertIndependentEvaluationSplit, I as runFinalComparison, J as reserveFinalEvidence, K as captureFinalEvidencePolicy, L as openAutoPr, Q as resolveRunDir, R as captureJudge, Y as runEval, d as combineComparisonCosts, f as costFromLedgerSummary, h as runImprovementLoop, q as evaluationUnitMap, u as executeOptimizationMethod, z as defaultProductionGate } from "./llm-judge-FWWhEb31.js";
5
+ import { a as campaignCellToRunRecord, i as campaignCellTaskScore, n as campaignCellExecutionEvidence, r as campaignCellJudgeDimensions } from "./run-record-CNNzWGpB.js";
6
+ import { B as surfaceDispatchRef, N as defineEvaluationClaim, T as pairedCampaignComposites, V as surfaceHash, Z as campaignSplitDigest, f as campaignMeasurementDigest, h as loopProvenanceArgsFromResult, k as powerPreflight, m as emitLoopProvenance, p as canonicalDigest, t as createCampaignEvidenceReceipt, z as surfaceContentHash } from "./campaign-evidence-BsrCmBSE.js";
7
+ import { C as inMemoryCampaignStorage, S as fsCampaignStorage, x as createRunCostLedger } from "./external-optimizer-subprocess-DMgmqTB6.js";
8
+ import { t as createHostedClient } from "./client-CXE-U1SA.js";
9
+ //#region src/contract/self-improve-reporting.ts
10
+ function pairedCompositeSummary(baseline, winner, independentUnitByScenarioId) {
11
+ const scores = pairedCampaignComposites(baseline, winner, independentUnitByScenarioId);
12
+ const perScenario = (campaign) => Object.fromEntries(Object.entries(campaign.aggregates.byScenario).map(([id, aggregate]) => [id, aggregate.meanComposite]));
13
+ return {
14
+ baseline: {
15
+ compositeMean: scores.beforeMean,
16
+ perScenario: perScenario(baseline)
17
+ },
18
+ winner: {
19
+ compositeMean: scores.afterMean,
20
+ perScenario: perScenario(winner)
21
+ },
22
+ baselineComposites: scores.before,
23
+ observations: scores.observations
24
+ };
25
+ }
26
+ /** 32-bit FNV-1a over raw UTF-16 code units, rendered as hex for a cell key.
27
+ *
28
+ * Frozen: the key names a persisted cell, so a change orphans every cell
29
+ * already written. This is a cell-key function, not a general-purpose hash. */
30
+ function hashString(s) {
31
+ let h = 2166136261;
32
+ for (let i = 0; i < s.length; i++) {
33
+ h ^= s.charCodeAt(i);
34
+ h = Math.imul(h, 16777619) >>> 0;
35
+ }
36
+ return h.toString(16).padStart(8, "0");
37
+ }
38
+ /**
39
+ * Adapt campaign cells into the `RunRecord` shape `analyzeRuns()` consumes.
40
+ * Each cell becomes one run; `candidateId` is the caller-supplied label so
41
+ * baseline + winner pair cleanly on `(experimentId, scenarioId, seed)`.
42
+ *
43
+ * `promptHash` identifies the executed surface; `configHash` identifies the candidate label.
44
+ */
45
+ function cellsToRunRecords(cells, candidateId, runId, surface, splitTag, fallbackModel) {
46
+ const promptHash = surfaceContentHash(surface);
47
+ const configHash = surfaceContentHash(candidateId);
48
+ return cells.map((cell) => {
49
+ const receiptModels = cell.resolvedModels ?? (cell.resolvedModel ? [cell.resolvedModel] : []);
50
+ if (receiptModels.length > 1) throw new ValidationError(`selfImprove cell ${cell.cellId} used multiple agent models: ${receiptModels.join(", ")}`);
51
+ const model = receiptModels[0] ?? fallbackModel;
52
+ if (!model) throw new ValidationError(`selfImprove.model is required when cell ${cell.cellId} has no paid-call model receipt`);
53
+ if (!modelHasSnapshot(model)) throw new ValidationError(`selfImprove model "${model}" lacks a snapshot version for cell ${cell.cellId}`);
54
+ return campaignCellToRunRecord(cell, {
55
+ runId: `${runId}::${candidateId}::${cell.cellId}`,
56
+ experimentId: runId,
57
+ candidateId,
58
+ seed: cell.rep * 1e6 + hashString(cell.scenarioId).slice(0, 6).split("").reduce((a, c) => a * 31 + c.charCodeAt(0) >>> 0, 0),
59
+ model,
60
+ promptHash,
61
+ configHash,
62
+ commitSha: "cell",
63
+ splitTag
64
+ });
65
+ });
66
+ }
67
+ //#endregion
68
+ //#region src/contract/self-improve-method.ts
69
+ /** Complete methods own search and selection; this path only measures their final choice. */
70
+ async function runSelfImproveMethod(args) {
71
+ const { opts, train, selection, holdout, costLedger, storage, runDir, startedAt } = args;
72
+ const budget = opts.budget ?? {};
73
+ if (opts.autoOnPromote === "pr" && (!opts.ghOwner || !opts.ghRepo)) throw new Error("selfImprove: autoOnPromote='pr' requires ghOwner + ghRepo");
74
+ const evidenceContext = opts.evidence === void 0 ? void 0 : structuredClone(opts.evidence);
75
+ if (evidenceContext && budget.holdout === "deferred") throw new Error("selfImprove: evidence receipts require measured holdout");
76
+ const baselineSurface = structuredClone(opts.baselineSurface);
77
+ const judge = opts.judge;
78
+ const { selected, cost: methodCost, history } = await executeOptimizationMethod({
79
+ method: opts.method,
80
+ storage,
81
+ searchHistoryPolicy: opts.searchHistoryPolicy,
82
+ searchHistoryVerification: opts.searchHistoryVerification,
83
+ input: {
84
+ baselineSurface,
85
+ trainScenarios: train,
86
+ selectionScenarios: selection,
87
+ dispatchWithSurface: opts.agent,
88
+ judges: [judge],
89
+ runDir: `${runDir}/optimization/${opts.method.name.replace(/[^a-zA-Z0-9._-]/g, "_")}`,
90
+ seed: 42,
91
+ runOptions: {
92
+ storage,
93
+ maxConcurrency: budget.maxConcurrency ?? 2,
94
+ reps: budget.reps,
95
+ dispatchRef: opts.dispatchRef,
96
+ dispatchTimeoutMs: opts.dispatchTimeoutMs,
97
+ cellRetry: opts.cellRetry,
98
+ cellPlacement: opts.cellPlacement,
99
+ labeledStore: opts.labeledStore,
100
+ captureSource: opts.captureSource,
101
+ expectUsage: opts.expectUsage ?? "assert"
102
+ },
103
+ costLedger
104
+ }
105
+ });
106
+ const finalPhase = "selfImprove.method-final";
107
+ const finalCost = () => combineComparisonCosts([
108
+ "holdout.baseline",
109
+ "holdout.winner",
110
+ "holdout.neutralized",
111
+ "promotion.gate"
112
+ ].map((phase) => ({
113
+ label: phase,
114
+ cost: costFromLedgerSummary(costLedger.summary({ phase: `${finalPhase}.${phase}` }))
115
+ })));
116
+ const totalCost = () => combineComparisonCosts([{
117
+ label: opts.method.name,
118
+ cost: methodCost
119
+ }, {
120
+ label: "final comparison",
121
+ cost: finalCost()
122
+ }]);
123
+ const gate = opts.gate ?? defaultProductionGate({
124
+ holdoutScenarios: holdout,
125
+ deltaThreshold: opts.claim?.minimumEffect ?? .05,
126
+ independentUnitByScenarioId: opts.claim ? evaluationUnitMap(opts.claim, holdout) : void 0
127
+ });
128
+ const comparison = await runFinalComparison({
129
+ claim: opts.claim,
130
+ finalEvidence: opts.finalEvidence,
131
+ baselineSurface,
132
+ winnerSurface: selected.winnerSurface,
133
+ scenarios: holdout,
134
+ dispatchWithSurface: opts.agent,
135
+ dispatchRef: opts.dispatchRef,
136
+ judges: [judge],
137
+ holdout: budget.holdout,
138
+ neutralize: opts.neutralize,
139
+ gate: {
140
+ ...gate,
141
+ async decide(context) {
142
+ const cost = totalCost();
143
+ if (budget.dollars !== void 0 && (!cost.accountingComplete || cost.totalCostUsd > budget.dollars)) return {
144
+ decision: "hold",
145
+ reasons: ["complete method spend cannot satisfy the declared run budget"],
146
+ contributingGates: [{
147
+ name: "budget",
148
+ status: "fail",
149
+ detail: {
150
+ cost,
151
+ budgetUsd: budget.dollars
152
+ }
153
+ }]
154
+ };
155
+ return gate.decide(context);
156
+ }
157
+ },
158
+ runDir,
159
+ storage,
160
+ costLedger,
161
+ costPhase: finalPhase,
162
+ reps: budget.reps,
163
+ maxConcurrency: budget.maxConcurrency ?? 2,
164
+ dispatchTimeoutMs: opts.dispatchTimeoutMs,
165
+ cellRetry: opts.cellRetry,
166
+ cellPlacement: opts.cellPlacement,
167
+ expectUsage: opts.expectUsage ?? "assert",
168
+ label: "selfImprove"
169
+ });
170
+ const evidence = evidenceContext ? {
171
+ baseline: createCampaignEvidenceReceipt({
172
+ campaign: comparison.baselineOnHoldout,
173
+ surface: baselineSurface,
174
+ context: evidenceContext
175
+ }),
176
+ winner: createCampaignEvidenceReceipt({
177
+ campaign: comparison.winnerOnHoldout,
178
+ surface: selected.winnerSurface,
179
+ context: evidenceContext
180
+ })
181
+ } : void 0;
182
+ const deferred = comparison.holdout === "deferred";
183
+ const report = deferred ? null : pairedCompositeSummary(comparison.baselineOnHoldout, comparison.winnerOnHoldout, opts.claim ? evaluationUnitMap(opts.claim, holdout) : void 0);
184
+ const baseline = report?.baseline ?? null;
185
+ const winner = report?.winner ?? null;
186
+ const lift = baseline && winner ? winner.compositeMean - baseline.compositeMean : void 0;
187
+ const insight = deferred ? void 0 : await analyzeRuns({
188
+ runs: [...cellsToRunRecords(comparison.baselineOnHoldout.cells, "baseline", runDir, baselineSurface, "holdout", opts.model), ...comparison.winnerOnHoldout === comparison.baselineOnHoldout ? [] : cellsToRunRecords(comparison.winnerOnHoldout.cells, "winner", runDir, selected.winnerSurface, "holdout", opts.model)],
189
+ baselineCandidateId: "baseline",
190
+ independentUnitByScenarioId: opts.claim ? evaluationUnitMap(opts.claim, holdout) : void 0,
191
+ decisionThreshold: opts.claim?.minimumEffect ?? .05,
192
+ ...comparison.winnerOnHoldout === comparison.baselineOnHoldout ? {} : { candidateCandidateId: "winner" }
193
+ });
194
+ const cost = totalCost();
195
+ const optimization = {
196
+ name: opts.method.name,
197
+ cost: methodCost,
198
+ ...selected.durationMs === void 0 ? {} : { durationMs: selected.durationMs },
199
+ ...selected.provenance === void 0 ? {} : { provenance: selected.provenance }
200
+ };
201
+ const durationMs = Date.now() - startedAt;
202
+ const receipts = costLedger.list();
203
+ const record = {
204
+ schema: "tangle.method-improvement",
205
+ runId: `${runDir}#${startedAt}`,
206
+ runDir,
207
+ timestamp: new Date(startedAt).toISOString(),
208
+ baselineContentHash: surfaceContentHash(baselineSurface),
209
+ winnerContentHash: surfaceContentHash(selected.winnerSurface),
210
+ diff: comparison.promotedDiff,
211
+ optimizationMethod: optimization,
212
+ ...opts.claim ? { claim: opts.claim } : {},
213
+ evidence: {
214
+ trainSplitDigest: campaignSplitDigest(train, budget.reps ?? 1),
215
+ selectionSplitDigest: campaignSplitDigest(selection, budget.reps ?? 1),
216
+ holdoutSplitDigest: campaignSplitDigest(holdout, budget.reps ?? 1),
217
+ baselineCampaignDigest: campaignMeasurementDigest(comparison.baselineOnHoldout),
218
+ winnerCampaignDigest: campaignMeasurementDigest(comparison.winnerOnHoldout),
219
+ costReceiptsDigest: canonicalDigest(receipts),
220
+ ...report ? { holdoutObservations: report.observations } : {},
221
+ ...comparison.neutralizedOnHoldout ? { neutralizedCampaignDigest: campaignMeasurementDigest(comparison.neutralizedOnHoldout) } : {}
222
+ },
223
+ gate: comparison.gateResult,
224
+ ...deferred ? { holdout: "deferred" } : {},
225
+ ...baseline && winner ? {
226
+ baselineHoldoutComposite: baseline.compositeMean,
227
+ winnerHoldoutComposite: winner.compositeMean,
228
+ heldOutLift: lift
229
+ } : {},
230
+ cost,
231
+ totalCostUsd: cost.totalCostUsd,
232
+ totalDurationMs: durationMs
233
+ };
234
+ const serialized = JSON.parse(JSON.stringify(record));
235
+ const provenance = {
236
+ ...serialized,
237
+ recordDigest: canonicalDigest(serialized)
238
+ };
239
+ storage.ensureDir(runDir);
240
+ storage.write(`${runDir}/method-provenance.json`, JSON.stringify(provenance, null, 2));
241
+ opts.onProvenance?.(provenance);
242
+ opts.onProgress?.({
243
+ kind: "gate.decided",
244
+ decision: comparison.gateResult.decision,
245
+ ...lift === void 0 ? {} : { lift }
246
+ });
247
+ const prResult = opts.autoOnPromote === "pr" && comparison.gateResult.decision === "ship" ? openAutoPr({
248
+ result: comparison.winnerOnHoldout,
249
+ gate: comparison.gateResult,
250
+ promotedDiff: comparison.promotedDiff,
251
+ ghOwner: opts.ghOwner,
252
+ ghRepo: opts.ghRepo
253
+ }) : void 0;
254
+ const result = {
255
+ ...evidence ? { evidence } : {},
256
+ mode: "method",
257
+ ...opts.claim ? { claim: opts.claim } : {},
258
+ ...comparison.finalEvidence ? { finalEvidence: comparison.finalEvidence } : {},
259
+ searchHistoryCoverage: history,
260
+ baseline,
261
+ winner: {
262
+ surface: selected.winnerSurface,
263
+ compositeMean: winner?.compositeMean ?? null,
264
+ perScenario: winner?.perScenario ?? {},
265
+ label: opts.method.name
266
+ },
267
+ ...lift === void 0 ? {} : { lift },
268
+ diff: comparison.promotedDiff,
269
+ gateDecision: comparison.gateResult.decision,
270
+ provenance,
271
+ optimization,
272
+ cost,
273
+ ledgerCost: costLedger.summary(),
274
+ totalCostUsd: cost.totalCostUsd,
275
+ durationMs,
276
+ receipts,
277
+ ...insight ? { insight } : {},
278
+ ...selected.searchHistory ? { searchHistory: selected.searchHistory } : {},
279
+ raw: {
280
+ ...comparison,
281
+ kind: "method",
282
+ baselineSurface,
283
+ winnerSurface: selected.winnerSurface,
284
+ winnerSurfaceHash: surfaceHash(selected.winnerSurface),
285
+ method: selected,
286
+ cost,
287
+ ...prResult ? { prResult } : {}
288
+ }
289
+ };
290
+ if (opts.hostedTenant) {
291
+ const snapshot = (index, surface, campaign, compositeMean) => ({
292
+ index,
293
+ surfaceHash: surfaceHash(surface),
294
+ surface,
295
+ cells: campaign.cells.map((cell) => {
296
+ const execution = campaignCellExecutionEvidence(cell);
297
+ return {
298
+ scenarioId: cell.scenarioId,
299
+ rep: cell.rep,
300
+ compositeMean: campaignCellTaskScore(cell) ?? null,
301
+ dimensions: campaignCellJudgeDimensions(cell),
302
+ terminalOutcome: execution.terminalOutcome,
303
+ executionErrorCount: execution.executionErrorCount ?? null,
304
+ ...cell.error ? { errorMessage: cell.error } : {}
305
+ };
306
+ }),
307
+ compositeMean,
308
+ costUsd: campaign.aggregates.cost.totalCostUsd,
309
+ durationMs: campaign.durationMs
310
+ });
311
+ try {
312
+ await createHostedClient(opts.hostedTenant).ingestEvalRun({
313
+ runId: provenance.runId,
314
+ runDir,
315
+ timestamp: provenance.timestamp,
316
+ status: "finished",
317
+ labels: {
318
+ ...opts.hostedLabels,
319
+ mode: "method"
320
+ },
321
+ baseline: snapshot(0, baselineSurface, comparison.baselineOnHoldout, baseline?.compositeMean ?? null),
322
+ generations: [snapshot(1, selected.winnerSurface, comparison.winnerOnHoldout, winner?.compositeMean ?? null)],
323
+ gateDecision: result.gateDecision,
324
+ ...lift === void 0 ? {} : { holdoutLift: lift },
325
+ totalCostUsd: result.totalCostUsd,
326
+ totalDurationMs: durationMs,
327
+ ...insight ? { insightReport: insight } : {}
328
+ });
329
+ } catch (error) {
330
+ console.warn(`[agent-eval] hosted ingest failed (continuing): ${error instanceof Error ? error.message : String(error)}`);
331
+ }
332
+ }
333
+ return result;
334
+ }
335
+ //#endregion
336
+ //#region src/contract/self-improve.ts
337
+ /** Failed self-improvement run with an immutable receipt snapshot. */
338
+ var SelfImproveRunError = class extends Error {
339
+ cost;
340
+ receipts;
341
+ constructor(cause, ledger) {
342
+ const original = cause instanceof Error ? cause : new Error(String(cause));
343
+ super(original.message, { cause: original });
344
+ this.name = "SelfImproveRunError";
345
+ this.cost = ledger.summary();
346
+ this.receipts = ledger.list();
347
+ }
348
+ };
349
+ function assertSelfImproveSearchMode(opts) {
350
+ assertSearchHistoryAdmissionOptions(opts);
351
+ if (!opts.method && (opts.searchHistoryPolicy !== void 0 || opts.searchHistoryVerification !== void 0 || opts.evidence !== void 0)) throw new Error("selfImprove: search history admission requires method");
352
+ if (opts.method && opts.proposer) throw new Error("selfImprove: method and proposer are mutually exclusive");
353
+ if (!opts.method) {
354
+ if (opts.selectionScenarios !== void 0) throw new Error("selfImprove: selectionScenarios requires method");
355
+ return;
356
+ }
357
+ if (typeof opts.method.name !== "string" || !opts.method.name.trim() || opts.method.name.trim() !== opts.method.name || typeof opts.method.optimize !== "function") throw new Error("selfImprove: method must have a trimmed name and optimize(input)");
358
+ const budget = opts.budget;
359
+ if (budget?.generations !== void 0) throw new Error("selfImprove: method owns its rounds; budget.generations applies only to proposer mode");
360
+ if (budget?.populationSize !== void 0) throw new Error("selfImprove: method owns its candidates; budget.populationSize applies only to proposer mode");
361
+ if (budget?.candidateConcurrency !== void 0 || budget?.maxImprovementShots !== void 0 || opts.analyzeGeneration !== void 0 || opts.findings !== void 0 || opts.selectParent !== void 0 || opts.premeasuredBaseline !== void 0 || opts.selectionRankKey !== void 0 || opts.searchLedger !== void 0) throw new Error("selfImprove: candidateConcurrency, maxImprovementShots, analyzeGeneration, findings, selectParent, premeasuredBaseline, selectionRankKey, and searchLedger apply only to proposer mode");
362
+ }
363
+ function splitMethodPartitions(searchScenarios, explicitSelection, fraction, unitByScenario) {
364
+ if (!Number.isFinite(fraction) || fraction <= 0 || fraction >= 1) throw new Error("selfImprove: budget.selectionFraction must be in (0, 1)");
365
+ const byId = /* @__PURE__ */ new Map();
366
+ for (const scenario of searchScenarios) {
367
+ if (byId.has(scenario.id)) throw new Error(`selfImprove: duplicate scenario id '${scenario.id}'`);
368
+ byId.set(scenario.id, scenario);
369
+ }
370
+ if (explicitSelection) {
371
+ if (explicitSelection.length === 0) throw new Error("selfImprove: selectionScenarios must not be empty");
372
+ const selectionIds = /* @__PURE__ */ new Set();
373
+ for (const scenario of explicitSelection) {
374
+ if (!byId.has(scenario.id)) throw new Error(`selfImprove: selection scenario '${scenario.id}' is absent from the non-final cases`);
375
+ if (selectionIds.has(scenario.id)) throw new Error(`selfImprove: duplicate selection scenario id '${scenario.id}'`);
376
+ selectionIds.add(scenario.id);
377
+ }
378
+ const train = searchScenarios.filter((scenario) => !selectionIds.has(scenario.id));
379
+ if (train.length === 0) throw new Error("selfImprove: method train split is empty");
380
+ if (unitByScenario) {
381
+ const selectedUnits = new Set([...selectionIds].map((id) => unitByScenario.get(id)));
382
+ if (train.some((scenario) => selectedUnits.has(unitByScenario.get(scenario.id)))) throw new Error("selfImprove: training and selection share independent units");
383
+ }
384
+ return {
385
+ train,
386
+ selection: explicitSelection.map((scenario) => byId.get(scenario.id))
387
+ };
388
+ }
389
+ if (searchScenarios.length < 2) throw new Error("selfImprove: method requires at least two non-final scenarios");
390
+ if (unitByScenario) {
391
+ const split = splitTrainHoldout(searchScenarios, fraction, unitByScenario);
392
+ return {
393
+ train: split.train,
394
+ selection: split.holdout
395
+ };
396
+ }
397
+ const sorted = [...searchScenarios].sort((a, b) => stableScenarioHash(a.id) - stableScenarioHash(b.id));
398
+ const count = Math.max(1, Math.min(sorted.length - 1, Math.round(sorted.length * fraction)));
399
+ return {
400
+ selection: sorted.slice(0, count),
401
+ train: sorted.slice(count)
402
+ };
403
+ }
404
+ /** 32-bit FNV-1a over raw UTF-16 code units, read as an unsigned int and used
405
+ * only to order scenarios deterministically.
406
+ *
407
+ * Frozen: the order it produces assigns scenarios to partitions, so a change
408
+ * re-partitions decisions already recorded. It masks no byte, unlike
409
+ * `fnv1a32` in `src/partition-held-out.ts`, so the two disagree on any
410
+ * non-ASCII id and cannot be shared. */
411
+ function stableScenarioHash(value) {
412
+ let hash = 2166136261;
413
+ for (let index = 0; index < value.length; index++) {
414
+ hash ^= value.charCodeAt(index);
415
+ hash = Math.imul(hash, 16777619) >>> 0;
416
+ }
417
+ return hash;
418
+ }
419
+ /** Deterministic split by scenario identity, or by source identity for new-unit claims. */
420
+ function splitTrainHoldout(scenarios, fraction, unitByScenario) {
421
+ if (unitByScenario) {
422
+ const units = [...new Set(scenarios.map((scenario) => unitByScenario.get(scenario.id)))].sort((a, b) => stableScenarioHash(a) - stableScenarioHash(b) || (a < b ? -1 : a > b ? 1 : 0));
423
+ if (units.length < 2) throw new Error("selfImprove: splitting needs at least two independent units");
424
+ const count = Math.max(1, Math.min(units.length - 1, Math.round(units.length * fraction)));
425
+ const finalUnits = new Set(units.slice(0, count));
426
+ return {
427
+ holdout: scenarios.filter((scenario) => finalUnits.has(unitByScenario.get(scenario.id))),
428
+ train: scenarios.filter((scenario) => !finalUnits.has(unitByScenario.get(scenario.id)))
429
+ };
430
+ }
431
+ const sorted = [...scenarios].sort((a, b) => stableScenarioHash(a.id) - stableScenarioHash(b.id));
432
+ const nHoldout = Math.max(1, Math.min(sorted.length - 1, Math.round(sorted.length * fraction)));
433
+ return {
434
+ holdout: sorted.slice(0, nHoldout),
435
+ train: sorted.slice(nHoldout)
436
+ };
437
+ }
438
+ /**
439
+ * Latest search campaign measured for the winner surface; the baseline search
440
+ * campaign when the winner IS the baseline. Used by the deferred-holdout
441
+ * summary, where no holdout campaign exists to summarize.
442
+ */
443
+ function winnerSearchCampaign(result) {
444
+ for (let i = result.generations.length - 1; i >= 0; i--) {
445
+ const measured = result.generations[i]?.surfaces.find((s) => s.surfaceHash === result.winnerSurfaceHash);
446
+ if (measured) return measured.campaign;
447
+ }
448
+ return result.baselineCampaign;
449
+ }
450
+ async function selfImprove(opts) {
451
+ opts = {
452
+ ...opts,
453
+ judge: captureJudge(opts.judge),
454
+ ...opts.claim || opts.finalEvidence ? {
455
+ claim: opts.claim && defineEvaluationClaim(opts.claim),
456
+ finalEvidence: opts.finalEvidence && captureFinalEvidencePolicy(opts.finalEvidence),
457
+ scenarios: structuredClone(opts.scenarios),
458
+ selectionScenarios: opts.selectionScenarios && structuredClone(opts.selectionScenarios),
459
+ budget: opts.budget && structuredClone(opts.budget)
460
+ } : {}
461
+ };
462
+ const startedAt = Date.now();
463
+ const runDir = resolveRunDir(opts.runDir ?? (opts.method ? `.agent-eval/runs/self-improve-${startedAt}` : `mem://selfImprove-${startedAt}`));
464
+ const storage = opts.storage ?? (runDir.startsWith("mem://") ? inMemoryCampaignStorage() : fsCampaignStorage());
465
+ const costLedger = createRunCostLedger({
466
+ storage,
467
+ runDir,
468
+ costCeilingUsd: opts.budget?.dollars
469
+ });
470
+ try {
471
+ return await runSelfImprove(opts, costLedger, startedAt, runDir, storage);
472
+ } catch (error) {
473
+ throw new SelfImproveRunError(error, costLedger);
474
+ }
475
+ }
476
+ async function runSelfImprove(opts, costLedger, startedAt, runDir, storage) {
477
+ const budget = opts.budget ?? {};
478
+ assertSelfImproveSearchMode(opts);
479
+ const maxConcurrency = budget.maxConcurrency ?? 2;
480
+ const holdoutFraction = budget.holdoutFraction ?? .25;
481
+ const holdoutMode = budget.holdout ?? "measured";
482
+ const holdoutDeferred = holdoutMode === "deferred";
483
+ const expectUsage = opts.expectUsage ?? "assert";
484
+ const unitByScenario = opts.claim ? evaluationUnitMap(opts.claim, opts.scenarios) : void 0;
485
+ const splitUnitByScenario = opts.claim?.generalization === "new-units" ? unitByScenario : void 0;
486
+ const explicitHoldout = budget.holdoutScenarios;
487
+ const { train, holdout } = explicitHoldout ? {
488
+ train: opts.scenarios.filter((s) => !explicitHoldout.some((h) => h.id === s.id)),
489
+ holdout: explicitHoldout
490
+ } : holdoutDeferred ? {
491
+ train: opts.scenarios,
492
+ holdout: []
493
+ } : splitTrainHoldout(opts.scenarios, holdoutFraction, splitUnitByScenario);
494
+ if (train.length === 0) throw new Error("selfImprove: train split is empty. Reduce holdoutFraction or pass more scenarios.");
495
+ if (holdout.length === 0 && !holdoutDeferred) throw new Error("selfImprove: holdout split is empty. Pass more scenarios.");
496
+ if (opts.claim?.generalization === "new-units") assertIndependentEvaluationSplit(opts.claim, holdout, train);
497
+ if (opts.finalEvidence) {
498
+ if (holdoutDeferred) throw new Error("final evidence requires measured holdout");
499
+ if (opts.method) await reserveFinalEvidence(opts.finalEvidence, opts.claim, holdout, train);
500
+ }
501
+ if (opts.method) {
502
+ const partitions = splitMethodPartitions(train, opts.selectionScenarios, budget.selectionFraction ?? .25, splitUnitByScenario);
503
+ return runSelfImproveMethod({
504
+ opts: {
505
+ ...opts,
506
+ method: opts.method
507
+ },
508
+ train: partitions.train,
509
+ selection: partitions.selection,
510
+ holdout,
511
+ costLedger,
512
+ storage,
513
+ runDir,
514
+ startedAt
515
+ });
516
+ }
517
+ const generations = budget.generations ?? 3;
518
+ const populationSize = budget.populationSize ?? 2;
519
+ if (generations > 0 && !opts.proposer) throw new Error("selfImprove: method or proposer is required when budget.generations is greater than zero");
520
+ const proposer = opts.proposer ?? {
521
+ kind: "baseline-only",
522
+ propose: async () => []
523
+ };
524
+ const gate = opts.gate ?? defaultProductionGate({
525
+ holdoutScenarios: holdout,
526
+ deltaThreshold: opts.claim?.minimumEffect ?? .05,
527
+ independentUnitByScenarioId: opts.claim ? evaluationUnitMap(opts.claim, holdout) : void 0
528
+ });
529
+ if (opts.onProgress) opts.onProgress({
530
+ kind: "baseline.started",
531
+ scenarios: opts.scenarios.length
532
+ });
533
+ const result = await runImprovementLoop({
534
+ scenarios: train,
535
+ baselineSurface: opts.baselineSurface,
536
+ premeasuredBaseline: opts.premeasuredBaseline,
537
+ dispatchWithSurface: opts.agent,
538
+ dispatchRef: opts.dispatchRef,
539
+ proposer,
540
+ judges: [opts.judge],
541
+ populationSize,
542
+ maxGenerations: generations,
543
+ candidateConcurrency: budget.candidateConcurrency,
544
+ reps: budget.reps,
545
+ maxImprovementShots: budget.maxImprovementShots,
546
+ holdoutScenarios: holdout,
547
+ claim: opts.claim,
548
+ finalEvidence: opts.finalEvidence,
549
+ holdout: holdoutMode,
550
+ gate,
551
+ neutralize: opts.neutralize,
552
+ autoOnPromote: opts.autoOnPromote ?? "none",
553
+ ghOwner: opts.ghOwner,
554
+ ghRepo: opts.ghRepo,
555
+ storage,
556
+ runDir,
557
+ maxConcurrency,
558
+ cellPlacement: opts.cellPlacement,
559
+ dispatchTimeoutMs: opts.dispatchTimeoutMs,
560
+ cellRetry: opts.cellRetry,
561
+ costLedger,
562
+ expectUsage,
563
+ labeledStore: opts.labeledStore,
564
+ captureSource: opts.captureSource,
565
+ analyzeGeneration: opts.analyzeGeneration,
566
+ findings: opts.findings,
567
+ selectionRankKey: opts.selectionRankKey,
568
+ selectParent: opts.selectParent,
569
+ searchLedger: opts.searchLedger
570
+ });
571
+ const reportSplit = holdoutDeferred ? "search" : "holdout";
572
+ const reportBaselineCampaign = holdoutDeferred ? result.baselineCampaign : result.baselineOnHoldout;
573
+ const reportWinnerCampaign = holdoutDeferred ? winnerSearchCampaign(result) : result.winnerOnHoldout;
574
+ const reportUnitMap = opts.claim ? evaluationUnitMap(opts.claim, holdoutDeferred ? train : holdout) : void 0;
575
+ const report = pairedCompositeSummary(reportBaselineCampaign, reportWinnerCampaign, reportUnitMap);
576
+ const baseline = report.baseline;
577
+ const winnerStats = report.winner;
578
+ let power;
579
+ const baselineHoldoutComposites = holdoutDeferred ? [] : report.baselineComposites;
580
+ if (baselineHoldoutComposites.length >= 3) {
581
+ power = powerPreflight({
582
+ baselineComposites: baselineHoldoutComposites,
583
+ deltaThreshold: opts.claim?.minimumEffect ?? .05,
584
+ sharedScorerChannel: true
585
+ });
586
+ if (opts.onProgress) opts.onProgress({
587
+ kind: "power.estimated",
588
+ n: power.n,
589
+ sd: power.sd,
590
+ mde: power.mde,
591
+ underpowered: power.underpowered
592
+ });
593
+ if (power.underpowered && generations > 0) console.warn(`[selfImprove] ${power.recommendation}`);
594
+ }
595
+ if (opts.onProgress) {
596
+ opts.onProgress({
597
+ kind: "baseline.completed",
598
+ compositeMean: baseline.compositeMean,
599
+ durationMs: Date.now() - startedAt
600
+ });
601
+ opts.onProgress({
602
+ kind: "gate.decided",
603
+ decision: result.gateResult.decision,
604
+ ...holdoutDeferred ? {} : { lift: winnerStats.compositeMean - baseline.compositeMean }
605
+ });
606
+ }
607
+ const cost = result.cost;
608
+ const totalCost = cost.totalCostUsd;
609
+ const insight = await analyzeRuns({
610
+ runs: [...cellsToRunRecords(reportBaselineCampaign.cells, "baseline", runDir, opts.baselineSurface, reportSplit, opts.model), ...reportWinnerCampaign === reportBaselineCampaign ? [] : cellsToRunRecords(reportWinnerCampaign.cells, "winner", runDir, result.winnerSurface, reportSplit, opts.model)],
611
+ baselineCandidateId: "baseline",
612
+ independentUnitByScenarioId: reportUnitMap,
613
+ decisionThreshold: opts.claim?.minimumEffect ?? .05,
614
+ ...reportWinnerCampaign === reportBaselineCampaign ? {} : { candidateCandidateId: "winner" }
615
+ });
616
+ const durationMs = Date.now() - startedAt;
617
+ const { record: provenance } = await emitLoopProvenance({
618
+ ...loopProvenanceArgsFromResult({
619
+ runId: `${runDir}#${startedAt}`,
620
+ runDir,
621
+ timestamp: new Date(startedAt).toISOString(),
622
+ baselineSurface: opts.baselineSurface,
623
+ result,
624
+ costReceipts: costLedger.list(),
625
+ totalCostUsd: totalCost,
626
+ totalDurationMs: durationMs,
627
+ independentUnitByScenarioId: holdoutDeferred ? void 0 : reportUnitMap
628
+ }),
629
+ storage,
630
+ hostedClient: opts.hostedTenant ? createHostedClient(opts.hostedTenant) : void 0
631
+ });
632
+ if (opts.onProvenance) opts.onProvenance(provenance);
633
+ const summary = {
634
+ ...opts.claim ? { claim: opts.claim } : {},
635
+ ...result.finalEvidence ? { finalEvidence: result.finalEvidence } : {},
636
+ mode: "proposer",
637
+ baseline,
638
+ winner: {
639
+ ...winnerStats,
640
+ surface: result.winnerSurface,
641
+ ...result.winnerLabel ? { label: result.winnerLabel } : {},
642
+ ...result.winnerRationale ? { rationale: result.winnerRationale } : {}
643
+ },
644
+ ...holdoutDeferred ? {} : { lift: winnerStats.compositeMean - baseline.compositeMean },
645
+ diff: result.promotedDiff,
646
+ provenance,
647
+ gateDecision: result.gateResult.decision,
648
+ generationsExplored: result.generations.length,
649
+ durationMs,
650
+ totalCostUsd: totalCost,
651
+ cost,
652
+ receipts: costLedger.list(),
653
+ ...result.searchHistory ? { searchHistory: result.searchHistory } : {},
654
+ insight,
655
+ ...power ? { power } : {},
656
+ raw: result
657
+ };
658
+ if (opts.hostedTenant) try {
659
+ await shipEvalRunToHosted(opts.hostedTenant, opts, summary, result, runDir);
660
+ } catch (err) {
661
+ const msg = err instanceof Error ? err.message : String(err);
662
+ console.warn(`[agent-eval] hosted ingest failed (continuing): ${msg}`);
663
+ }
664
+ return summary;
665
+ }
666
+ async function shipEvalRunToHosted(tenant, opts, summary, raw, runDir) {
667
+ const client = createHostedClient(tenant);
668
+ function snapshotFromCampaign(index, surface, campaign, durationMs) {
669
+ const cells = campaign.cells.map((cell) => {
670
+ const execution = campaignCellExecutionEvidence(cell);
671
+ return {
672
+ scenarioId: cell.scenarioId,
673
+ rep: cell.rep,
674
+ compositeMean: campaignCellTaskScore(cell) ?? null,
675
+ dimensions: campaignCellJudgeDimensions(cell),
676
+ terminalOutcome: execution.terminalOutcome,
677
+ executionErrorCount: execution.executionErrorCount ?? null,
678
+ errorMessage: cell.error ?? void 0
679
+ };
680
+ });
681
+ const scoredCells = cells.flatMap((cell) => cell.compositeMean === null ? [] : [cell.compositeMean]);
682
+ const compositeMean = scoredCells.length === 0 ? null : scoredCells.reduce((sum, score) => sum + score, 0) / scoredCells.length;
683
+ return {
684
+ index,
685
+ surfaceHash: surfaceHash(surface),
686
+ surface,
687
+ cells,
688
+ compositeMean,
689
+ costUsd: campaign.aggregates.cost.totalCostUsd,
690
+ durationMs
691
+ };
692
+ }
693
+ const generations = [];
694
+ generations.push(snapshotFromCampaign(0, opts.baselineSurface, raw.baselineCampaign, 0));
695
+ for (const gen of raw.generations) {
696
+ const winner = gen.surfaces.reduce((best, s) => s.campaign.aggregates.cellsExecuted > 0 && (best === void 0 || averageComposite(s.campaign) > averageComposite(best.campaign)) ? s : best, gen.surfaces[0]);
697
+ if (!winner) continue;
698
+ generations.push(snapshotFromCampaign(gen.record.generationIndex + 1, winner.surface, winner.campaign, 0));
699
+ }
700
+ const event = {
701
+ runId: `${runDir}#${Date.now()}`,
702
+ runDir,
703
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
704
+ status: "finished",
705
+ labels: opts.hostedLabels ?? {},
706
+ baseline: generations[0],
707
+ generations,
708
+ gateDecision: summary.gateDecision,
709
+ holdoutLift: summary.lift,
710
+ totalCostUsd: summary.totalCostUsd,
711
+ totalDurationMs: summary.durationMs,
712
+ insightReport: summary.insight
713
+ };
714
+ await client.ingestEvalRun(event);
715
+ }
716
+ function averageComposite(campaign) {
717
+ const aggs = Object.values(campaign.aggregates.byScenario);
718
+ return aggs.length === 0 ? 0 : aggs.reduce((s, a) => s + a.meanComposite, 0) / aggs.length;
719
+ }
720
+ //#endregion
721
+ //#region src/contract/define-agent-eval.ts
722
+ /**
723
+ * Define an agent eval once, then either score a surface with `evaluate()` or
724
+ * run the closed loop with `improve()`.
725
+ *
726
+ * This is a DX wrapper only: it delegates to `runEval()` and `selfImprove()` and
727
+ * returns their native result shapes.
728
+ */
729
+ function defineAgentEval(defaults) {
730
+ const defaultEvaluateOptions = evaluateDefaults(defaults);
731
+ return {
732
+ scenarios: defaults.scenarios,
733
+ baselineSurface: defaults.baselineSurface,
734
+ async evaluate(opts = {}) {
735
+ const { agent, judge, judges, runDir, scenarios, surface, ...campaignOpts } = opts;
736
+ const selectedAgent = agent ?? defaults.agent;
737
+ const selectedSurface = surface ?? defaults.baselineSurface;
738
+ const selectedRunDir = runDir ?? defaults.runDir ?? `mem://defineAgentEval-${Date.now()}`;
739
+ const selectedStorage = campaignOpts.storage ?? defaultEvaluateOptions.storage ?? (selectedRunDir.startsWith("mem://") ? inMemoryCampaignStorage() : void 0);
740
+ const evalOptions = {
741
+ ...defaultEvaluateOptions,
742
+ ...campaignOpts,
743
+ ...selectedStorage ? { storage: selectedStorage } : {},
744
+ runDir: selectedRunDir,
745
+ scenarios: scenarios ?? defaults.scenarios,
746
+ dispatch: (scenario, ctx) => selectedAgent(selectedSurface, scenario, ctx),
747
+ dispatchRef: surfaceDispatchRef(selectedSurface, campaignOpts.dispatchRef ?? defaults.dispatchRef),
748
+ judges: evaluateJudges(judges, judge ?? defaults.judge)
749
+ };
750
+ if (evalOptions.reps !== void 0) evalOptions.reps = requirePositiveInteger(evalOptions.reps, "reps");
751
+ return runEval(evalOptions);
752
+ },
753
+ async improve(opts = {}) {
754
+ const { budget: budgetOverride, hostedTenant: hostedTenantOverride, ...topLevelOverrides } = opts;
755
+ const merged = mergeDefined(defaults, topLevelOverrides);
756
+ const budget = mergeBudget(defaults.budget, budgetOverride);
757
+ const hostedTenant = mergeHostedTenant(defaults.hostedTenant, hostedTenantOverride);
758
+ return selfImprove({
759
+ ...merged,
760
+ ...budget ? { budget } : {},
761
+ ...hostedTenant ? { hostedTenant } : {}
762
+ });
763
+ }
764
+ };
765
+ }
766
+ function evaluateDefaults(defaults) {
767
+ const out = {};
768
+ if (defaults.storage) out.storage = defaults.storage;
769
+ if (defaults.labeledStore) out.labeledStore = defaults.labeledStore;
770
+ if (defaults.captureSource) out.captureSource = defaults.captureSource;
771
+ if (defaults.cellPlacement) out.cellPlacement = defaults.cellPlacement;
772
+ if (defaults.expectUsage) out.expectUsage = defaults.expectUsage;
773
+ if (defaults.budget?.dollars !== void 0) out.costCeiling = defaults.budget.dollars;
774
+ if (defaults.budget?.maxConcurrency !== void 0) out.maxConcurrency = defaults.budget.maxConcurrency;
775
+ if (defaults.budget?.reps !== void 0) out.reps = requirePositiveInteger(defaults.budget.reps, "budget.reps");
776
+ return out;
777
+ }
778
+ function mergeBudget(defaults, overrides) {
779
+ const merged = mergeOptionalObject(defaults, overrides);
780
+ if (merged?.reps !== void 0) merged.reps = requirePositiveInteger(merged.reps, "budget.reps");
781
+ return merged;
782
+ }
783
+ function mergeHostedTenant(defaults, overrides) {
784
+ const merged = mergeOptionalObject(defaults, overrides);
785
+ if (!merged) return void 0;
786
+ if (!merged.endpoint?.trim() || !merged.apiKey?.trim() || !merged.tenantId?.trim()) throw new Error("defineAgentEval.improve: hostedTenant requires endpoint, apiKey, and tenantId after merging defaults and overrides");
787
+ return merged;
788
+ }
789
+ function mergeDefined(defaults, overrides) {
790
+ if (!overrides) return defaults;
791
+ const merged = { ...defaults };
792
+ for (const [key, value] of Object.entries(overrides)) if (value !== void 0) merged[key] = value;
793
+ return merged;
794
+ }
795
+ function mergeOptionalObject(defaults, overrides) {
796
+ if (!defaults && !overrides) return void 0;
797
+ return mergeDefined(defaults ?? {}, overrides);
798
+ }
799
+ function evaluateJudges(judges, defaultJudge) {
800
+ if (judges !== void 0) {
801
+ if (judges.length === 0) throw new Error("defineAgentEval.evaluate: judges must not be empty");
802
+ return judges;
803
+ }
804
+ return [defaultJudge];
805
+ }
806
+ function requirePositiveInteger(value, field) {
807
+ if (!Number.isInteger(value) || value < 1) throw new Error(`defineAgentEval: ${field} must be a positive integer`);
808
+ return value;
809
+ }
810
+ //#endregion
811
+ export { SelfImproveRunError as n, selfImprove as r, defineAgentEval as t };
812
+
813
+ //# sourceMappingURL=define-agent-eval-D4uumjl3.js.map