@tangle-network/agent-eval 0.216.0 → 0.217.1

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 (553) hide show
  1. package/CHANGELOG.md +141 -57
  2. package/README.md +2 -2
  3. package/dist/adapters/http.d.ts +3 -3
  4. package/dist/{agent-profile-CIA2Atnt.d.ts → agent-profile-DTt8uGP9.d.ts} +5 -18
  5. package/dist/agent-profile-DTt8uGP9.d.ts.map +1 -0
  6. package/dist/{agent-profile-cell-BYc0bxsL.js → agent-profile-cell-B1V1gUZs.js} +4 -53
  7. package/dist/agent-profile-cell-B1V1gUZs.js.map +1 -0
  8. package/dist/{agent-profile-cell-BNp-Js9F.d.ts → agent-profile-cell-BcpFbNd5.d.ts} +2 -22
  9. package/dist/agent-profile-cell-BcpFbNd5.d.ts.map +1 -0
  10. package/dist/{agreement-irr-DsTURxdr.js → agreement-irr-BhAqjluA.js} +5 -5
  11. package/dist/agreement-irr-BhAqjluA.js.map +1 -0
  12. package/dist/analyst/index.d.ts +37 -170
  13. package/dist/analyst/index.d.ts.map +1 -1
  14. package/dist/analyst/index.js +17 -192
  15. package/dist/analyst/index.js.map +1 -1
  16. package/dist/{analyze-runs-3xpby3p2.js → analyze-runs-DqPJaJ4X.js} +763 -555
  17. package/dist/analyze-runs-DqPJaJ4X.js.map +1 -0
  18. package/dist/{analyze-runs-CSDAh8A7.d.ts → analyze-runs-DyeNcenW.d.ts} +18 -16
  19. package/dist/analyze-runs-DyeNcenW.d.ts.map +1 -0
  20. package/dist/authenticity/index.d.ts +0 -23
  21. package/dist/authenticity/index.d.ts.map +1 -1
  22. package/dist/authenticity/index.js +1 -34
  23. package/dist/authenticity/index.js.map +1 -1
  24. package/dist/{benchmark-command-CByl9dxG.js → benchmark-command-xQK8nOI6.js} +591 -109
  25. package/dist/benchmark-command-xQK8nOI6.js.map +1 -0
  26. package/dist/benchmarks/index.d.ts +5 -6
  27. package/dist/benchmarks/index.d.ts.map +1 -1
  28. package/dist/benchmarks/index.js +4 -4
  29. package/dist/benchmarks/index.js.map +1 -1
  30. package/dist/builder-eval/index.d.ts +3 -3
  31. package/dist/builder-eval/index.js +2 -2
  32. package/dist/builder-eval/index.js.map +1 -1
  33. package/dist/campaign/index.d.ts +8 -8
  34. package/dist/campaign/index.js +15 -15
  35. package/dist/{campaign-BQ-Jujuj.js → campaign-CJGkxAQ6.js} +256 -765
  36. package/dist/campaign-CJGkxAQ6.js.map +1 -0
  37. package/dist/{campaign-evidence-OcUciD-N.js → campaign-evidence-CQYw8_0H.js} +10 -18
  38. package/dist/{campaign-evidence-OcUciD-N.js.map → campaign-evidence-CQYw8_0H.js.map} +1 -1
  39. package/dist/{canonical-BsZVgBhW.js → canonical-Dq2hOQ8L.js} +2 -2
  40. package/dist/{canonical-BsZVgBhW.js.map → canonical-Dq2hOQ8L.js.map} +1 -1
  41. package/dist/cell-spend-DEWR3nj-.js +90 -0
  42. package/dist/cell-spend-DEWR3nj-.js.map +1 -0
  43. package/dist/{chat-client-DthPOYGd.js → chat-client-ldqxYYTN.js} +2 -2
  44. package/dist/{chat-client-DthPOYGd.js.map → chat-client-ldqxYYTN.js.map} +1 -1
  45. package/dist/{chat-json-call-BrKsyspg.js → chat-json-call-DavzexSp.js} +3 -2
  46. package/dist/chat-json-call-DavzexSp.js.map +1 -0
  47. package/dist/{claim-BXcZw-jo.js → claim-BPVuyHuy.js} +4 -4
  48. package/dist/claim-BPVuyHuy.js.map +1 -0
  49. package/dist/cli.js +113 -12
  50. package/dist/cli.js.map +1 -1
  51. package/dist/{client-BzL9niqi.d.ts → client-hwo3cJjR.d.ts} +3 -16
  52. package/dist/client-hwo3cJjR.d.ts.map +1 -0
  53. package/dist/{cluster-bootstrap-B3JywQQn.js → cluster-bootstrap-DEwwhl0C.js} +3 -3
  54. package/dist/{cluster-bootstrap-B3JywQQn.js.map → cluster-bootstrap-DEwwhl0C.js.map} +1 -1
  55. package/dist/{produced-state-ZCtDBxAE.js → completion-verifier-B_jw6C9p.js} +9 -64
  56. package/dist/completion-verifier-B_jw6C9p.js.map +1 -0
  57. package/dist/contract/index.d.ts +13 -13
  58. package/dist/contract/index.js +1041 -1473
  59. package/dist/contract/index.js.map +1 -1
  60. package/dist/{cost-ledger-D2FnJPBF.js → cost-ledger-D0352Z4d.js} +832 -817
  61. package/dist/cost-ledger-D0352Z4d.js.map +1 -0
  62. package/dist/{cost-ledger-CO7UyEcQ.d.ts → cost-ledger-Jk62OBfF.d.ts} +12 -47
  63. package/dist/cost-ledger-Jk62OBfF.d.ts.map +1 -0
  64. package/dist/dataset-DQqhOCPt.d.ts.map +1 -1
  65. package/dist/{default-registry-Cn1LQ2Ve.js → default-registry-ClYjq3QE.js} +8 -11
  66. package/dist/default-registry-ClYjq3QE.js.map +1 -0
  67. package/dist/{default-registry-BrWh62zf.d.ts → default-registry-DXgLmoDI.d.ts} +7 -50
  68. package/dist/default-registry-DXgLmoDI.d.ts.map +1 -0
  69. package/dist/{define-agent-eval-Ch3MWX6k.js → define-agent-eval-BDxNlP3D.js} +10 -10
  70. package/dist/define-agent-eval-BDxNlP3D.js.map +1 -0
  71. package/dist/{define-agent-eval-CEWkX5wZ.d.ts → define-agent-eval-BIkH_gAR.d.ts} +9 -9
  72. package/dist/define-agent-eval-BIkH_gAR.d.ts.map +1 -0
  73. package/dist/{descriptive-CnU8Yq29.js → descriptive-CVNy48rR.js} +2 -2
  74. package/dist/{descriptive-CnU8Yq29.js.map → descriptive-CVNy48rR.js.map} +1 -1
  75. package/dist/diagnosis/index.d.ts +4 -14
  76. package/dist/diagnosis/index.d.ts.map +1 -1
  77. package/dist/diagnosis/index.js +67 -28
  78. package/dist/diagnosis/index.js.map +1 -1
  79. package/dist/{dspy-rlm-engine-D-KX_e64.js → dspy-rlm-engine-DhdCr1Dc.js} +5 -10
  80. package/dist/dspy-rlm-engine-DhdCr1Dc.js.map +1 -0
  81. package/dist/{emitter-HcCmFQl_.d.ts → emitter-DABYYTcH.d.ts} +5 -5
  82. package/dist/emitter-DABYYTcH.d.ts.map +1 -0
  83. package/dist/emitter-DbMXUIVP.js.map +1 -1
  84. package/dist/{engine-C_zNWfM8.d.ts → engine-BvZ0R-36.d.ts} +18 -22
  85. package/dist/engine-BvZ0R-36.d.ts.map +1 -0
  86. package/dist/{equal-terms-Blx9Zk5I.js → equal-terms-DbPGcVtI.js} +2 -2
  87. package/dist/equal-terms-DbPGcVtI.js.map +1 -0
  88. package/dist/{errors-Dngq5h35.js → errors-BcOs5MKW.js} +6 -8
  89. package/dist/{errors-Dngq5h35.js.map → errors-BcOs5MKW.js.map} +1 -1
  90. package/dist/{eval-campaign-4byTtqrf.js → eval-campaign-BLEfBGbA.js} +6 -6
  91. package/dist/{eval-campaign-4byTtqrf.js.map → eval-campaign-BLEfBGbA.js.map} +1 -1
  92. package/dist/{evaluation-Cn2dRZIz.d.ts → evaluation-jTjC_QQD.d.ts} +8 -8
  93. package/dist/evaluation-jTjC_QQD.d.ts.map +1 -0
  94. package/dist/evaluation.d.ts +2 -2
  95. package/dist/evaluation.js +1 -1
  96. package/dist/evaluation.js.map +1 -1
  97. package/dist/{exact-types-CD0lf5Qd.d.ts → exact-types-CflbJ9f3.d.ts} +2 -2
  98. package/dist/{exact-types-CD0lf5Qd.d.ts.map → exact-types-CflbJ9f3.d.ts.map} +1 -1
  99. package/dist/{exec-ChJ6d5if.js → exec-CpbtOXVt.js} +2 -24
  100. package/dist/{exec-ChJ6d5if.js.map → exec-CpbtOXVt.js.map} +1 -1
  101. package/dist/execution-tracks-CpgFPpS5.js.map +1 -1
  102. package/dist/experiment/index.d.ts +331 -33
  103. package/dist/experiment/index.d.ts.map +1 -1
  104. package/dist/experiment/index.js +303 -101
  105. package/dist/experiment/index.js.map +1 -1
  106. package/dist/{exporters-X4xwla8A.js → exporters-Cl6IeNAu.js} +3 -3
  107. package/dist/exporters-Cl6IeNAu.js.map +1 -0
  108. package/dist/{exporters-ChTnR90l.d.ts → exporters-Dk3oEbK_.d.ts} +2 -4
  109. package/dist/{exporters-ChTnR90l.d.ts.map → exporters-Dk3oEbK_.d.ts.map} +1 -1
  110. package/dist/{external-optimizer-process-nnsY5D_4.js → external-optimizer-process-KVFGvYX1.js} +4 -3
  111. package/dist/external-optimizer-process-KVFGvYX1.js.map +1 -0
  112. package/dist/{external-optimizer-subprocess-DcerlZSG.js → external-optimizer-subprocess-XIHBOSKt.js} +551 -553
  113. package/dist/external-optimizer-subprocess-XIHBOSKt.js.map +1 -0
  114. package/dist/{extract-usage-BrnzRJ6H.js → extract-usage-BZLU01kR.js} +2 -23
  115. package/dist/{extract-usage-BrnzRJ6H.js.map → extract-usage-BZLU01kR.js.map} +1 -1
  116. package/dist/{failure-cluster-CbgEDcFJ.d.ts → failure-cluster-DN0t63Z0.d.ts} +4 -43
  117. package/dist/failure-cluster-DN0t63Z0.d.ts.map +1 -0
  118. package/dist/{failure-taxonomy-CjabTATj.js → failure-taxonomy-Bx5oWqaW.js} +2 -19
  119. package/dist/{failure-taxonomy-CjabTATj.js.map → failure-taxonomy-Bx5oWqaW.js.map} +1 -1
  120. package/dist/{feedback-trajectory-DkaDj0dj.d.ts → feedback-trajectory-BWmhRBGu.d.ts} +8 -13
  121. package/dist/feedback-trajectory-BWmhRBGu.d.ts.map +1 -0
  122. package/dist/{semantic-concept-judge-zQBG9hHU.js → findings-store-BMVQtEsm.js} +13 -255
  123. package/dist/findings-store-BMVQtEsm.js.map +1 -0
  124. package/dist/fuzz.d.ts +20 -63
  125. package/dist/fuzz.d.ts.map +1 -1
  126. package/dist/fuzz.js +62 -108
  127. package/dist/fuzz.js.map +1 -1
  128. package/dist/{hf-dataset-BR2yhuNn.js → hf-dataset-D9f7-oX7.js} +4 -24
  129. package/dist/hf-dataset-D9f7-oX7.js.map +1 -0
  130. package/dist/hosted/index.d.ts +2 -2
  131. package/dist/hosted/index.js +2 -2
  132. package/dist/{index-DHKEAv3s.d.ts → index-9jJ2fKSX.d.ts} +2 -64
  133. package/dist/index-9jJ2fKSX.d.ts.map +1 -0
  134. package/dist/{index-oQ4aHziK.d.ts → index-BLGqZ81N.d.ts} +11 -16
  135. package/dist/{index-oQ4aHziK.d.ts.map → index-BLGqZ81N.d.ts.map} +1 -1
  136. package/dist/{index-DlH0Y9gI.d.ts → index-BiT6RtNH.d.ts} +31 -43
  137. package/dist/index-BiT6RtNH.d.ts.map +1 -0
  138. package/dist/{index-Ch9VxCpK.d.ts → index-CX-GAUpw.d.ts} +4 -8
  139. package/dist/index-CX-GAUpw.d.ts.map +1 -0
  140. package/dist/{index-CPJJr98o.d.ts → index-CiRwLv2R.d.ts} +5 -68
  141. package/dist/index-CiRwLv2R.d.ts.map +1 -0
  142. package/dist/{index-NvGBiO8H.d.ts → index-ZuWx52WG.d.ts} +266 -495
  143. package/dist/index-ZuWx52WG.d.ts.map +1 -0
  144. package/dist/index.d.ts +2256 -2165
  145. package/dist/index.d.ts.map +1 -1
  146. package/dist/index.js +514 -1192
  147. package/dist/index.js.map +1 -1
  148. package/dist/{integrity-BV1ZDf42.js → integrity-DOd9Q86O.js} +7 -12
  149. package/dist/integrity-DOd9Q86O.js.map +1 -0
  150. package/dist/{integrity-BvnVARVl.js → integrity-W4CADcFc.js} +3 -7
  151. package/dist/{integrity-BvnVARVl.js.map → integrity-W4CADcFc.js.map} +1 -1
  152. package/dist/{integrity-CCAxGVK6.d.ts → integrity-_qgZLA5p.d.ts} +4 -6
  153. package/dist/{integrity-CCAxGVK6.d.ts.map → integrity-_qgZLA5p.d.ts.map} +1 -1
  154. package/dist/{internal-CRHwS9iz.js → internal-BTK91Bqt.js} +3 -3
  155. package/dist/{internal-CRHwS9iz.js.map → internal-BTK91Bqt.js.map} +1 -1
  156. package/dist/interval-Dq9gt7jx.js +219 -0
  157. package/dist/interval-Dq9gt7jx.js.map +1 -0
  158. package/dist/interval-ohuOJurX.d.ts +47 -0
  159. package/dist/interval-ohuOJurX.d.ts.map +1 -0
  160. package/dist/{journal-DvKCvjty.js → journal-CR4QikYp.js} +110 -110
  161. package/dist/journal-CR4QikYp.js.map +1 -0
  162. package/dist/json-BhdsJaOQ.js +111 -0
  163. package/dist/json-BhdsJaOQ.js.map +1 -0
  164. package/dist/{judge-calibration-N44V04Se.js → judge-calibration-BkXMIWA4.js} +3 -3
  165. package/dist/{judge-calibration-N44V04Se.js.map → judge-calibration-BkXMIWA4.js.map} +1 -1
  166. package/dist/{judge-gate-B1qYnkpi.js → judge-gate-Co5tuh57.js} +4 -27
  167. package/dist/judge-gate-Co5tuh57.js.map +1 -0
  168. package/dist/{judge-gate-DNcUrRFA.d.ts → judge-gate-DsL0yFcb.d.ts} +9 -10
  169. package/dist/judge-gate-DsL0yFcb.d.ts.map +1 -0
  170. package/dist/{kind-factory-CbZ-6tvu.js → kind-factory-Gy4fXixd.js} +88 -17
  171. package/dist/kind-factory-Gy4fXixd.js.map +1 -0
  172. package/dist/ledger-core/index.d.ts +2 -2
  173. package/dist/ledger-core/index.js +4 -4
  174. package/dist/{ledger-core-B2hahzrt.js → ledger-core-DrJhbms9.js} +5 -84
  175. package/dist/ledger-core-DrJhbms9.js.map +1 -0
  176. package/dist/{llm-client-DQveoxSM.js → llm-client-BshCREn6.js} +90 -219
  177. package/dist/llm-client-BshCREn6.js.map +1 -0
  178. package/dist/{llm-judge-PXV7Xljl.js → llm-judge-C8jMTNNG.js} +501 -931
  179. package/dist/llm-judge-C8jMTNNG.js.map +1 -0
  180. package/dist/matrix/index.d.ts +4 -4
  181. package/dist/matrix/index.js +3 -2
  182. package/dist/{matrix-_BV9-Lk5.js → matrix-B8l-Nsxd.js} +7 -96
  183. package/dist/matrix-B8l-Nsxd.js.map +1 -0
  184. package/dist/{matrix-CHMiebFx.d.ts → matrix-DHe-dwVJ.d.ts} +10 -19
  185. package/dist/matrix-DHe-dwVJ.d.ts.map +1 -0
  186. package/dist/{paired-tests-jbwPdSz5.js → mean-BbA_JCzW.js} +45 -5
  187. package/dist/mean-BbA_JCzW.js.map +1 -0
  188. package/dist/meta-eval/index.d.ts +6 -6
  189. package/dist/meta-eval/index.js +10 -10
  190. package/dist/meta-eval/index.js.map +1 -1
  191. package/dist/metrics-BKaPBtIG.js.map +1 -1
  192. package/dist/mint-BRZXuwRi.d.ts +81 -0
  193. package/dist/mint-BRZXuwRi.d.ts.map +1 -0
  194. package/dist/{mint-Csor1BLJ.js → mint-zszyYlpA.js} +4 -4
  195. package/dist/{mint-Csor1BLJ.js.map → mint-zszyYlpA.js.map} +1 -1
  196. package/dist/{multi-layer-verifier-BUaQ4C17.d.ts → multi-layer-verifier-DEgMUk6v.d.ts} +2 -2
  197. package/dist/{multi-layer-verifier-BUaQ4C17.d.ts.map → multi-layer-verifier-DEgMUk6v.d.ts.map} +1 -1
  198. package/dist/{multiplicity-D9cjmStq.js → multiplicity-Sg0U7h8j.js} +2 -2
  199. package/dist/{multiplicity-D9cjmStq.js.map → multiplicity-Sg0U7h8j.js.map} +1 -1
  200. package/dist/multishot/golden/index.d.ts +1 -23
  201. package/dist/multishot/golden/index.d.ts.map +1 -1
  202. package/dist/multishot/golden/index.js +5 -8
  203. package/dist/multishot/golden/index.js.map +1 -1
  204. package/dist/multishot/index.d.ts +3 -12
  205. package/dist/multishot/index.d.ts.map +1 -1
  206. package/dist/multishot/index.js +4 -3
  207. package/dist/multishot/index.js.map +1 -1
  208. package/dist/nonnegative-number-DvdMxg_f.js +9 -0
  209. package/dist/nonnegative-number-DvdMxg_f.js.map +1 -0
  210. package/dist/openapi.json +114 -10
  211. package/dist/{otel-spans-C8YIJWy1.js → otel-spans-CdN909k1.js} +3 -3
  212. package/dist/{otel-spans-C8YIJWy1.js.map → otel-spans-CdN909k1.js.map} +1 -1
  213. package/dist/{paired-arms-DzKn0TfY.js → paired-arms-Ct4LTKc1.js} +32 -9
  214. package/dist/paired-arms-Ct4LTKc1.js.map +1 -0
  215. package/dist/{paired-binary-Q36bhn2R.js → paired-binary-B_nejA44.js} +3 -36
  216. package/dist/paired-binary-B_nejA44.js.map +1 -0
  217. package/dist/{paired-promotion-decision-DPKz8ZnF.d.ts → paired-promotion-decision-CQMJ5xGN.d.ts} +2 -34
  218. package/dist/paired-promotion-decision-CQMJ5xGN.d.ts.map +1 -0
  219. package/dist/{paired-promotion-decision-BN6IQTiu.js → paired-promotion-decision-D0SHb-ZL.js} +3 -3
  220. package/dist/{paired-promotion-decision-BN6IQTiu.js.map → paired-promotion-decision-D0SHb-ZL.js.map} +1 -1
  221. package/dist/{search-kernel-BztlERLv.js → pareto-BzsxidFD.js} +883 -861
  222. package/dist/pareto-BzsxidFD.js.map +1 -0
  223. package/dist/pipelines/index.d.ts +16 -19
  224. package/dist/pipelines/index.d.ts.map +1 -1
  225. package/dist/pipelines/index.js +4 -68
  226. package/dist/pipelines/index.js.map +1 -1
  227. package/dist/{power-and-mde-fK5Qocwo.js → power-and-mde-N5nU4_Ly.js} +3 -3
  228. package/dist/{power-and-mde-fK5Qocwo.js.map → power-and-mde-N5nU4_Ly.js.map} +1 -1
  229. package/dist/predicate-FdKmElA_.js +38 -0
  230. package/dist/predicate-FdKmElA_.js.map +1 -0
  231. package/dist/{prime-protocol-DcAK9pC8.js → prime-protocol-BFgGrEMP.js} +3 -3
  232. package/dist/prime-protocol-BFgGrEMP.js.map +1 -0
  233. package/dist/{prime-protocol-CEE4BR9N.d.ts → prime-protocol-BWG2DQIk.d.ts} +4 -22
  234. package/dist/prime-protocol-BWG2DQIk.d.ts.map +1 -0
  235. package/dist/profile-cell.d.ts +2 -2
  236. package/dist/profile-cell.js +2 -2
  237. package/dist/{release-confidence-BK2QCB5M.d.ts → promotion-gate-DaY95yU6.d.ts} +105 -106
  238. package/dist/promotion-gate-DaY95yU6.d.ts.map +1 -0
  239. package/dist/{promotion-policy-CWW35UWq.js → promotion-policy-6A8osGr_.js} +4 -4
  240. package/dist/{promotion-policy-CWW35UWq.js.map → promotion-policy-6A8osGr_.js.map} +1 -1
  241. package/dist/{proposal-findings-BZiMTzAF.js → proposal-findings-BbWidvUk.js} +3 -3
  242. package/dist/proposal-findings-BbWidvUk.js.map +1 -0
  243. package/dist/{query-B1D1qp2Z.js → query-B_RZ36an.js} +5 -5
  244. package/dist/query-B_RZ36an.js.map +1 -0
  245. package/dist/{query-DK1nWcmp.d.ts → query-Cmv_U8vf.d.ts} +4 -24
  246. package/dist/{query-DK1nWcmp.d.ts.map → query-Cmv_U8vf.d.ts.map} +1 -1
  247. package/dist/{random-Dn5fPWkt.js → random-DDDcC7YU.js} +2 -2
  248. package/dist/{random-Dn5fPWkt.js.map → random-DDDcC7YU.js.map} +1 -1
  249. package/dist/{raw-provider-sink-rB2DYxr6.js → raw-provider-sink-75w4FWBj.js} +2 -2
  250. package/dist/{raw-provider-sink-rB2DYxr6.js.map → raw-provider-sink-75w4FWBj.js.map} +1 -1
  251. package/dist/{redact-Cveoq6fJ.d.ts → redact-DXdlFb_U.d.ts} +4 -21
  252. package/dist/redact-DXdlFb_U.d.ts.map +1 -0
  253. package/dist/{redact-Dk1ZdJEm.js → redact-mtkTiJVk.js} +92 -98
  254. package/dist/redact-mtkTiJVk.js.map +1 -0
  255. package/dist/{registry-JYfPxcVz.d.ts → registry-ssNoHzwD.d.ts} +5 -5
  256. package/dist/{registry-JYfPxcVz.d.ts.map → registry-ssNoHzwD.d.ts.map} +1 -1
  257. package/dist/{release-confidence-Dbe9AS_X.js → release-confidence-CYIFH-fp.js} +6 -11
  258. package/dist/release-confidence-CYIFH-fp.js.map +1 -0
  259. package/dist/{report-command-y8H6RSX8.js → render-C-w2EZ6p.js} +331 -554
  260. package/dist/render-C-w2EZ6p.js.map +1 -0
  261. package/dist/reporting-html-Kvlc8oMt.js +100 -0
  262. package/dist/reporting-html-Kvlc8oMt.js.map +1 -0
  263. package/dist/reporting.d.ts +6 -6
  264. package/dist/reporting.js +8 -8
  265. package/dist/{researcher-f6mZhh58.d.ts → researcher-0ABVIdGa.d.ts} +9 -9
  266. package/dist/{researcher-f6mZhh58.d.ts.map → researcher-0ABVIdGa.d.ts.map} +1 -1
  267. package/dist/reward-DrZ71vnf.d.ts +55 -0
  268. package/dist/reward-DrZ71vnf.d.ts.map +1 -0
  269. package/dist/{reward-hacking-BFcQgkux.js → reward-hacking-ByuETaIb.js} +3 -3
  270. package/dist/{reward-hacking-BFcQgkux.js.map → reward-hacking-ByuETaIb.js.map} +1 -1
  271. package/dist/{reward-hacking-DHA7c1l8.d.ts → reward-hacking-E52wq86n.d.ts} +5 -18
  272. package/dist/reward-hacking-E52wq86n.d.ts.map +1 -0
  273. package/dist/reward-nw2xZGZG.js.map +1 -1
  274. package/dist/rl.d.ts +117 -295
  275. package/dist/rl.d.ts.map +1 -1
  276. package/dist/rl.js +27 -747
  277. package/dist/rl.js.map +1 -1
  278. package/dist/rollout/index.d.ts +5 -4
  279. package/dist/rollout/index.js +7 -8
  280. package/dist/{rollout-D9bKKBnZ.js → rollout-D6C50mfA.js} +88 -13
  281. package/dist/rollout-D6C50mfA.js.map +1 -0
  282. package/dist/round-decimal-COrKglMh.js +10 -0
  283. package/dist/round-decimal-COrKglMh.js.map +1 -0
  284. package/dist/{rubric-predictive-validity-BsgkBfT0.js → rubric-predictive-validity-D3_oI72N.js} +3 -3
  285. package/dist/{rubric-predictive-validity-BsgkBfT0.js.map → rubric-predictive-validity-D3_oI72N.js.map} +1 -1
  286. package/dist/{rubric-predictive-validity-2SgHxoa5.d.ts → rubric-predictive-validity-DiwT8PbL.d.ts} +2 -2
  287. package/dist/{rubric-predictive-validity-2SgHxoa5.d.ts.map → rubric-predictive-validity-DiwT8PbL.d.ts.map} +1 -1
  288. package/dist/{run-record-D1Hw-Jml.d.ts → run-record-CaxbLq6Y.d.ts} +5 -11
  289. package/dist/run-record-CaxbLq6Y.d.ts.map +1 -0
  290. package/dist/{run-record-ES07wfz9.js → run-record-CysKLB93.js} +3 -5
  291. package/dist/run-record-CysKLB93.js.map +1 -0
  292. package/dist/{run-record-DlTZ_lqe.js → run-record-DhEJgoPz.js} +4 -4
  293. package/dist/{run-record-DlTZ_lqe.js.map → run-record-DhEJgoPz.js.map} +1 -1
  294. package/dist/sandbox-harness-BlSOu4LX.d.ts.map +1 -1
  295. package/dist/{schema-CSf6qWgZ.js → schema-Bt2vLFm3.js} +2 -14
  296. package/dist/schema-Bt2vLFm3.js.map +1 -0
  297. package/dist/schema-C-ziyJD7.d.ts.map +1 -1
  298. package/dist/{schema-2g7trUwH.d.ts → schema-D6EVKzTB.d.ts} +4 -5
  299. package/dist/schema-D6EVKzTB.d.ts.map +1 -0
  300. package/dist/{schema-BuiujZ-g.js → schema-DxcKTzbi.js} +2 -2
  301. package/dist/schema-DxcKTzbi.js.map +1 -0
  302. package/dist/search/index.d.ts +39 -53
  303. package/dist/search/index.d.ts.map +1 -1
  304. package/dist/search/index.js +4 -4
  305. package/dist/{search-kernel-CpcKH5Ih.d.ts → search-kernel-DxqjBxA-.d.ts} +18 -31
  306. package/dist/search-kernel-DxqjBxA-.d.ts.map +1 -0
  307. package/dist/{search-ledger-d7V8o9Lk.js → search-ledger-TUvB5gWH.js} +189 -199
  308. package/dist/search-ledger-TUvB5gWH.js.map +1 -0
  309. package/dist/{search-ledger-file-BqOo-bVo.js → search-ledger-file-UKCO2r8a.js} +4 -4
  310. package/dist/search-ledger-file-UKCO2r8a.js.map +1 -0
  311. package/dist/search-ledger-types-p2xKfiDJ.d.ts.map +1 -1
  312. package/dist/{search-shipper-er4pK5_Y.js → search-shipper-Cw2z3-td.js} +4 -4
  313. package/dist/search-shipper-Cw2z3-td.js.map +1 -0
  314. package/dist/{search-summary-CBvz3u_S.js → search-summary-DQIvJsSB.js} +5 -5
  315. package/dist/{search-summary-CBvz3u_S.js.map → search-summary-DQIvJsSB.js.map} +1 -1
  316. package/dist/{sequential-CzK5DarL.js → sequential-BVv1sjsw.js} +2 -32
  317. package/dist/{sequential-CzK5DarL.js.map → sequential-BVv1sjsw.js.map} +1 -1
  318. package/dist/{sequential-D-1PPCmM.js → sequential-CimQrbjv.js} +5 -5
  319. package/dist/sequential-CimQrbjv.js.map +1 -0
  320. package/dist/{sequential-BhsrMupG.d.ts → sequential-KwGspfeR.d.ts} +2 -9
  321. package/dist/{sequential-BhsrMupG.d.ts.map → sequential-KwGspfeR.d.ts.map} +1 -1
  322. package/dist/{sequential-eprocess-D1jKoihe.js → sequential-eprocess-DodI6RoF.js} +2 -2
  323. package/dist/{sequential-eprocess-D1jKoihe.js.map → sequential-eprocess-DodI6RoF.js.map} +1 -1
  324. package/dist/{server-DbcC7xMl.js → server-DoVbqqtJ.js} +101 -101
  325. package/dist/server-DoVbqqtJ.js.map +1 -0
  326. package/dist/{single-run-lock-fVu3MZWH.js → single-run-lock-U58yf8N6.js} +2 -2
  327. package/dist/{single-run-lock-fVu3MZWH.js.map → single-run-lock-U58yf8N6.js.map} +1 -1
  328. package/dist/{skillopt-optimization-method-CCtzralq.js → skillopt-optimization-method-kyL94-ri.js} +428 -91
  329. package/dist/skillopt-optimization-method-kyL94-ri.js.map +1 -0
  330. package/dist/{spans-D9_ehFuk.d.ts → spans-CVngGij3.d.ts} +2 -2
  331. package/dist/{spans-D9_ehFuk.d.ts.map → spans-CVngGij3.d.ts.map} +1 -1
  332. package/dist/{statistical-heldout-1Gbmex7v.js → statistical-heldout-Bksv92Th.js} +3 -3
  333. package/dist/statistical-heldout-Bksv92Th.js.map +1 -0
  334. package/dist/{statistical-heldout-BeR4bOdg.d.ts → statistical-heldout-C9AbgREN.d.ts} +8 -67
  335. package/dist/statistical-heldout-C9AbgREN.d.ts.map +1 -0
  336. package/dist/{steps-Bg5-KVx1.d.ts → steps-DlepJPwD.d.ts} +2 -56
  337. package/dist/steps-DlepJPwD.d.ts.map +1 -0
  338. package/dist/{store-C4avFjIi.d.ts → store-B3nWRy3B.d.ts} +2 -2
  339. package/dist/{store-C4avFjIi.d.ts.map → store-B3nWRy3B.d.ts.map} +1 -1
  340. package/dist/{store-otlp-DtB4Slsr.js → store-otlp-BteDAbHK.js} +135 -132
  341. package/dist/store-otlp-BteDAbHK.js.map +1 -0
  342. package/dist/{store-tool-spans-fZIigrpP.js → store-tool-spans-D5l_OfTJ.js} +9 -9
  343. package/dist/store-tool-spans-D5l_OfTJ.js.map +1 -0
  344. package/dist/{store-tool-spans-DR1SrCLK.d.ts → store-tool-spans-DZS0HWVf.d.ts} +157 -165
  345. package/dist/store-tool-spans-DZS0HWVf.d.ts.map +1 -0
  346. package/dist/storyboard/index.d.ts +4 -11
  347. package/dist/storyboard/index.d.ts.map +1 -1
  348. package/dist/storyboard/index.js +21 -19
  349. package/dist/storyboard/index.js.map +1 -1
  350. package/dist/{summary-report-DtdRucM0.js → summary-report-BsXJoYX5.js} +588 -598
  351. package/dist/summary-report-BsXJoYX5.js.map +1 -0
  352. package/dist/{summary-report-C-CtItCN.d.ts → summary-report-DM7tlml1.d.ts} +16 -20
  353. package/dist/summary-report-DM7tlml1.d.ts.map +1 -0
  354. package/dist/supervisor-run/index.d.ts +189 -153
  355. package/dist/supervisor-run/index.d.ts.map +1 -1
  356. package/dist/supervisor-run/index.js +58 -450
  357. package/dist/supervisor-run/index.js.map +1 -1
  358. package/dist/{systemone-CpTLAlqb.d.ts → systemone-Bp_Ac0p1.d.ts} +6 -6
  359. package/dist/{systemone-CpTLAlqb.d.ts.map → systemone-Bp_Ac0p1.d.ts.map} +1 -1
  360. package/dist/systemone-protocol.js +1 -1
  361. package/dist/{systemone-review-B_yo1xsd.d.ts → systemone-review-CwE6JGIp.d.ts} +2 -2
  362. package/dist/{systemone-review-B_yo1xsd.d.ts.map → systemone-review-CwE6JGIp.d.ts.map} +1 -1
  363. package/dist/{systemone-review-BZWfrtq1.js → systemone-review-DzdOJ8I6.js} +3 -3
  364. package/dist/{systemone-review-BZWfrtq1.js.map → systemone-review-DzdOJ8I6.js.map} +1 -1
  365. package/dist/systemone.d.ts +5 -5
  366. package/dist/systemone.js +5 -5
  367. package/dist/systemone.js.map +1 -1
  368. package/dist/{task-failure-attributes-DngaLdE4.js → task-failure-attributes-BMsblaDh.js} +3 -3
  369. package/dist/task-failure-attributes-BMsblaDh.js.map +1 -0
  370. package/dist/{terminal-record-BHocwFw1.js → terminal-record-78g6E4vh.js} +17 -13
  371. package/dist/terminal-record-78g6E4vh.js.map +1 -0
  372. package/dist/{tool-groups-mcxOXVlb.d.ts → tool-groups-DyNz2JZ_.d.ts} +3 -3
  373. package/dist/tool-groups-DyNz2JZ_.d.ts.map +1 -0
  374. package/dist/{tool-waste-Wi4g6Ekb.d.ts → tool-waste-CkjzWmeY.d.ts} +53 -56
  375. package/dist/tool-waste-CkjzWmeY.d.ts.map +1 -0
  376. package/dist/{tool-waste-D52PqU9Q.js → tool-waste-DLsjS_p-.js} +5 -5
  377. package/dist/{tool-waste-D52PqU9Q.js.map → tool-waste-DLsjS_p-.js.map} +1 -1
  378. package/dist/{trace-questions-DG7nqLQ7.d.ts → trace-questions-xxwgsuMi.d.ts} +5 -10
  379. package/dist/{trace-questions-DG7nqLQ7.d.ts.map → trace-questions-xxwgsuMi.d.ts.map} +1 -1
  380. package/dist/trace-repair/index.d.ts +15 -212
  381. package/dist/trace-repair/index.d.ts.map +1 -1
  382. package/dist/trace-repair/index.js +865 -987
  383. package/dist/trace-repair/index.js.map +1 -1
  384. package/dist/traces.d.ts +76 -86
  385. package/dist/traces.d.ts.map +1 -1
  386. package/dist/traces.js +13 -13
  387. package/dist/traces.js.map +1 -1
  388. package/dist/trajectory-replay/index.d.ts +3 -117
  389. package/dist/trajectory-replay/index.d.ts.map +1 -1
  390. package/dist/trajectory-replay/index.js +98 -56
  391. package/dist/trajectory-replay/index.js.map +1 -1
  392. package/dist/{tree-rXLW3M_4.js → tree-BGRglkKd.js} +2355 -2414
  393. package/dist/tree-BGRglkKd.js.map +1 -0
  394. package/dist/{types-B3jzCp0p.js → types-BXgASBCL.js} +2 -2
  395. package/dist/{types-B3jzCp0p.js.map → types-BXgASBCL.js.map} +1 -1
  396. package/dist/{types-oKRhQAde.d.ts → types-CW8ewATZ.d.ts} +5 -114
  397. package/dist/types-CW8ewATZ.d.ts.map +1 -0
  398. package/dist/{types-BqkVmHfv.d.ts → types-CmXY0PQf.d.ts} +2 -4
  399. package/dist/types-CmXY0PQf.d.ts.map +1 -0
  400. package/dist/{types-DBZ7keha.d.ts → types-D-mgRzlh.d.ts} +9 -72
  401. package/dist/types-D-mgRzlh.d.ts.map +1 -0
  402. package/dist/{types-B4C5nFw6.d.ts → types-D8GhJoHk.d.ts} +79 -75
  403. package/dist/types-D8GhJoHk.d.ts.map +1 -0
  404. package/dist/{types-IXD2HJzu.js → types-DqFMNTgK.js} +2 -4
  405. package/dist/types-DqFMNTgK.js.map +1 -0
  406. package/dist/{types-CfZMIzB_.d.ts → types-DtMbFw6U.d.ts} +3 -3
  407. package/dist/{types-CfZMIzB_.d.ts.map → types-DtMbFw6U.d.ts.map} +1 -1
  408. package/dist/{verdict-DhPoXApk.js → verdict-BGQmxQ8A.js} +3 -3
  409. package/dist/verdict-BGQmxQ8A.js.map +1 -0
  410. package/dist/{verdict-E4eRNf7-.d.ts → verdict-C24NELtN.d.ts} +2 -15
  411. package/dist/{verdict-E4eRNf7-.d.ts.map → verdict-C24NELtN.d.ts.map} +1 -1
  412. package/dist/{verdict-cache-BQEsVy9n.js → verdict-cache-CL_7tePD.js} +2 -2
  413. package/dist/verdict-cache-CL_7tePD.js.map +1 -0
  414. package/dist/wire/index.d.ts +32 -411
  415. package/dist/wire/index.d.ts.map +1 -1
  416. package/dist/wire/index.js +2 -2
  417. package/docs/changes/jev-evidence-review.md +1 -1
  418. package/docs/changes/jev-product-adoption.md +1 -1
  419. package/docs/changes/jev-recorded-evidence.md +1 -1
  420. package/docs/design/mlbenchmarks-book-review.md +1 -1
  421. package/docs/design/mlbenchmarks-review/probes.mts +23 -31
  422. package/docs/design/statistics-decisions.md +17 -17
  423. package/docs/design.md +1 -1
  424. package/docs/evaluation-integrity.md +1 -1
  425. package/docs/experiment.md +1 -1
  426. package/docs/proofs/campaign-attempt-retention-20261001/README.md +2 -2
  427. package/docs/public-api.md +138 -529
  428. package/docs/rollout.md +1 -1
  429. package/docs/trace-repair-admission.md +1 -1
  430. package/docs/wire-protocol.md +1 -1
  431. package/package.json +1 -1
  432. package/dist/active-curriculum-B_Lc9kfO.js +0 -61
  433. package/dist/active-curriculum-B_Lc9kfO.js.map +0 -1
  434. package/dist/agent-profile-CIA2Atnt.d.ts.map +0 -1
  435. package/dist/agent-profile-cell-BNp-Js9F.d.ts.map +0 -1
  436. package/dist/agent-profile-cell-BYc0bxsL.js.map +0 -1
  437. package/dist/agreement-irr-DsTURxdr.js.map +0 -1
  438. package/dist/analyze-runs-3xpby3p2.js.map +0 -1
  439. package/dist/analyze-runs-CSDAh8A7.d.ts.map +0 -1
  440. package/dist/ast-DJ6Bc7ab.js +0 -558
  441. package/dist/ast-DJ6Bc7ab.js.map +0 -1
  442. package/dist/ast-hI-vjW6J.d.ts +0 -457
  443. package/dist/ast-hI-vjW6J.d.ts.map +0 -1
  444. package/dist/baseline-Dm8966du.js +0 -259
  445. package/dist/baseline-Dm8966du.js.map +0 -1
  446. package/dist/benchmark-BywPeAUo.js +0 -562
  447. package/dist/benchmark-BywPeAUo.js.map +0 -1
  448. package/dist/benchmark-command-CByl9dxG.js.map +0 -1
  449. package/dist/campaign-BQ-Jujuj.js.map +0 -1
  450. package/dist/chat-json-call-BrKsyspg.js.map +0 -1
  451. package/dist/claim-BXcZw-jo.js.map +0 -1
  452. package/dist/claude-jsonl-dZir12m6.js +0 -86
  453. package/dist/claude-jsonl-dZir12m6.js.map +0 -1
  454. package/dist/client-BzL9niqi.d.ts.map +0 -1
  455. package/dist/cost-ledger-CO7UyEcQ.d.ts.map +0 -1
  456. package/dist/cost-ledger-D2FnJPBF.js.map +0 -1
  457. package/dist/counterfactual-CPaWN99-.d.ts +0 -60
  458. package/dist/counterfactual-CPaWN99-.d.ts.map +0 -1
  459. package/dist/counterfactual-DtMWvn7D.js +0 -98
  460. package/dist/counterfactual-DtMWvn7D.js.map +0 -1
  461. package/dist/default-registry-BrWh62zf.d.ts.map +0 -1
  462. package/dist/default-registry-Cn1LQ2Ve.js.map +0 -1
  463. package/dist/define-agent-eval-CEWkX5wZ.d.ts.map +0 -1
  464. package/dist/define-agent-eval-Ch3MWX6k.js.map +0 -1
  465. package/dist/dspy-rlm-engine-D-KX_e64.js.map +0 -1
  466. package/dist/effect-sizes-DiH8MGOH.js +0 -82
  467. package/dist/effect-sizes-DiH8MGOH.js.map +0 -1
  468. package/dist/emitter-HcCmFQl_.d.ts.map +0 -1
  469. package/dist/engine-C_zNWfM8.d.ts.map +0 -1
  470. package/dist/equal-terms-Blx9Zk5I.js.map +0 -1
  471. package/dist/evaluation-Cn2dRZIz.d.ts.map +0 -1
  472. package/dist/exporters-X4xwla8A.js.map +0 -1
  473. package/dist/external-optimizer-process-nnsY5D_4.js.map +0 -1
  474. package/dist/external-optimizer-subprocess-DcerlZSG.js.map +0 -1
  475. package/dist/failure-cluster-CbgEDcFJ.d.ts.map +0 -1
  476. package/dist/feedback-trajectory-DkaDj0dj.d.ts.map +0 -1
  477. package/dist/hf-dataset-BR2yhuNn.js.map +0 -1
  478. package/dist/index-CPJJr98o.d.ts.map +0 -1
  479. package/dist/index-Ch9VxCpK.d.ts.map +0 -1
  480. package/dist/index-DHKEAv3s.d.ts.map +0 -1
  481. package/dist/index-DlH0Y9gI.d.ts.map +0 -1
  482. package/dist/index-NvGBiO8H.d.ts.map +0 -1
  483. package/dist/integrity-BV1ZDf42.js.map +0 -1
  484. package/dist/journal-DvKCvjty.js.map +0 -1
  485. package/dist/judge-gate-B1qYnkpi.js.map +0 -1
  486. package/dist/judge-gate-DNcUrRFA.d.ts.map +0 -1
  487. package/dist/kind-factory-CbZ-6tvu.js.map +0 -1
  488. package/dist/ledger-core-B2hahzrt.js.map +0 -1
  489. package/dist/llm-client-DQveoxSM.js.map +0 -1
  490. package/dist/llm-judge-PXV7Xljl.js.map +0 -1
  491. package/dist/matrix-CHMiebFx.d.ts.map +0 -1
  492. package/dist/matrix-_BV9-Lk5.js.map +0 -1
  493. package/dist/mint-DCGoBYhB.d.ts +0 -155
  494. package/dist/mint-DCGoBYhB.d.ts.map +0 -1
  495. package/dist/normal-DsJZtrJc.js +0 -25
  496. package/dist/normal-DsJZtrJc.js.map +0 -1
  497. package/dist/paired-arms-DzKn0TfY.js.map +0 -1
  498. package/dist/paired-binary-Q36bhn2R.js.map +0 -1
  499. package/dist/paired-promotion-decision-DPKz8ZnF.d.ts.map +0 -1
  500. package/dist/paired-tests-jbwPdSz5.js.map +0 -1
  501. package/dist/prime-protocol-CEE4BR9N.d.ts.map +0 -1
  502. package/dist/prime-protocol-DcAK9pC8.js.map +0 -1
  503. package/dist/produced-state-ZCtDBxAE.js.map +0 -1
  504. package/dist/proposal-findings-BZiMTzAF.js.map +0 -1
  505. package/dist/query-B1D1qp2Z.js.map +0 -1
  506. package/dist/redact-Cveoq6fJ.d.ts.map +0 -1
  507. package/dist/redact-Dk1ZdJEm.js.map +0 -1
  508. package/dist/release-confidence-BK2QCB5M.d.ts.map +0 -1
  509. package/dist/release-confidence-Dbe9AS_X.js.map +0 -1
  510. package/dist/report-command-y8H6RSX8.js.map +0 -1
  511. package/dist/reward-hacking-DHA7c1l8.d.ts.map +0 -1
  512. package/dist/rollout-D9bKKBnZ.js.map +0 -1
  513. package/dist/run-record-D1Hw-Jml.d.ts.map +0 -1
  514. package/dist/run-record-ES07wfz9.js.map +0 -1
  515. package/dist/schema-2g7trUwH.d.ts.map +0 -1
  516. package/dist/schema-BuiujZ-g.js.map +0 -1
  517. package/dist/schema-CSf6qWgZ.js.map +0 -1
  518. package/dist/search-kernel-BztlERLv.js.map +0 -1
  519. package/dist/search-kernel-CpcKH5Ih.d.ts.map +0 -1
  520. package/dist/search-ledger-d7V8o9Lk.js.map +0 -1
  521. package/dist/search-ledger-file-BqOo-bVo.js.map +0 -1
  522. package/dist/search-shipper-er4pK5_Y.js.map +0 -1
  523. package/dist/semantic-concept-judge-zQBG9hHU.js.map +0 -1
  524. package/dist/sequential-D-1PPCmM.js.map +0 -1
  525. package/dist/server-DbcC7xMl.js.map +0 -1
  526. package/dist/skillopt-optimization-method-CCtzralq.js.map +0 -1
  527. package/dist/statistical-heldout-1Gbmex7v.js.map +0 -1
  528. package/dist/statistical-heldout-BeR4bOdg.d.ts.map +0 -1
  529. package/dist/steps-Bg5-KVx1.d.ts.map +0 -1
  530. package/dist/store-otlp-DtB4Slsr.js.map +0 -1
  531. package/dist/store-tool-spans-DR1SrCLK.d.ts.map +0 -1
  532. package/dist/store-tool-spans-fZIigrpP.js.map +0 -1
  533. package/dist/student-t-BQeKJx2N.js +0 -39
  534. package/dist/student-t-BQeKJx2N.js.map +0 -1
  535. package/dist/summary-report-C-CtItCN.d.ts.map +0 -1
  536. package/dist/summary-report-DtdRucM0.js.map +0 -1
  537. package/dist/task-failure-attributes-DngaLdE4.js.map +0 -1
  538. package/dist/terminal-record-BHocwFw1.js.map +0 -1
  539. package/dist/tool-groups-mcxOXVlb.d.ts.map +0 -1
  540. package/dist/tool-waste-Wi4g6Ekb.d.ts.map +0 -1
  541. package/dist/trajectory-Y1fmdlw7.d.ts +0 -24
  542. package/dist/trajectory-Y1fmdlw7.d.ts.map +0 -1
  543. package/dist/tree-rXLW3M_4.js.map +0 -1
  544. package/dist/types-B4C5nFw6.d.ts.map +0 -1
  545. package/dist/types-BqkVmHfv.d.ts.map +0 -1
  546. package/dist/types-DBZ7keha.d.ts.map +0 -1
  547. package/dist/types-IXD2HJzu.js.map +0 -1
  548. package/dist/types-oKRhQAde.d.ts.map +0 -1
  549. package/dist/usage-receipt-Cx3xNeyB.js +0 -76
  550. package/dist/usage-receipt-Cx3xNeyB.js.map +0 -1
  551. package/dist/verdict-DhPoXApk.js.map +0 -1
  552. package/dist/verdict-cache-BQEsVy9n.js.map +0 -1
  553. package/docs/design/self-improvement-evidence-audit.md +0 -263
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-ledger-TUvB5gWH.js","names":["round"],"sources":["../src/campaign/search-ledger-constraints.ts","../src/campaign/search-state-identity.ts","../src/campaign/search-ledger-ordering.ts","../src/campaign/search-state-view.ts","../src/campaign/search-state-projection.ts","../src/campaign/search-ledger-types.ts","../src/campaign/search-ledger.ts"],"sourcesContent":["/** Shared ledger limits and structural event constraints for writers and replay. */\n\nimport { SearchLedgerIntegrityError } from './search-ledger-errors'\nimport type { SearchCellStage, SearchSplit } from './search-ledger-types'\n\nexport const MAX_LABEL_CHARS = 200\nexport const USD_TOLERANCE = 1e-9\n/** A claim tests at most this many finalists against the root. */\nexport const SEARCH_CLAIM_MAX_FINALISTS = 3\n\nexport function assertStageSplit(\n cellId: string,\n stage: SearchCellStage,\n split: SearchSplit,\n isRoot: boolean,\n): void {\n const allowed: Record<SearchCellStage, readonly SearchSplit[]> = {\n root: ['train', 'selection'],\n train: ['train'],\n screen: ['selection'],\n rung: ['selection'],\n claim: ['test'],\n external: ['train', 'selection'],\n }\n if (!allowed[stage].includes(split)) {\n throw integrity(`cell ${cellId}: a ${stage} cell cannot run on the ${split} split`)\n }\n if (stage === 'root' && !isRoot) {\n throw integrity(`cell ${cellId}: only the root node runs root cells`)\n }\n}\n\nexport function assertUnique(values: readonly string[], label: string, eventId: string): void {\n if (new Set(values).size !== values.length) {\n throw integrity(`event ${eventId} contains duplicate ${label} values`)\n }\n}\nexport function integrity(message: string): SearchLedgerIntegrityError {\n return new SearchLedgerIntegrityError(message)\n}\n","/** Canonical identities for search nodes, cells, and split task sets. */\n\nimport { createHash } from 'node:crypto'\nimport { canonicalString, compareCodeUnits, hashCanonical } from '../ledger-core/canonical'\nimport type { SearchLedgerHash, SearchSplit, SearchTask } from './search-ledger-types'\n\n/** Deterministic node id: identical content in one search is one node. */\nexport function searchNodeId(searchId: string, artifactDigest: string): string {\n return `node_${shortDigest([searchId, artifactDigest])}`\n}\n\n/** Deterministic cell id: one node on one task in one split at one repeat. */\nexport function searchCellId(\n searchId: string,\n nodeId: string,\n taskId: string,\n split: SearchSplit,\n rep: number,\n): string {\n return `cell_${shortDigest([searchId, nodeId, taskId, split, rep])}`\n}\n\n/** Digest a split's task list in taskId order. */\nexport function searchTaskSetDigest(tasks: readonly SearchTask[]): SearchLedgerHash {\n return hashCanonical(\n [...tasks].sort((left, right) => compareCodeUnits(left.taskId, right.taskId)),\n )\n}\n\n/** 128 bits of SHA-256 over the canonical encoding: collision-safe and short\n * enough for directory names. */\nfunction shortDigest(value: unknown): string {\n return createHash('sha256').update(canonicalString(value)).digest('hex').slice(0, 32)\n}\n","import { canonicalString } from '../ledger-core'\nimport type { SearchArtifactRef } from './search-ledger-types'\n\nexport function artifactKey(artifact: SearchArtifactRef): string {\n return canonicalString(artifact)\n}\n\nexport function compareStrings(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0\n}\n","/** Position-bound search snapshots and deterministic scored-unit reads. */\n\nimport { compareCodeUnits } from '../ledger-core/canonical'\nimport type { RolloutSearchLineage } from '../rollout/mint'\nimport { type RunSearchCoordinates, searchCellRunId } from '../run-record'\nimport { SearchLedgerError } from './search-ledger-errors'\nimport type {\n SearchAudit,\n SearchClosedEvent,\n SearchEdgeRecordedEvent,\n SearchLedgerHash,\n SearchOpenedEvent,\n SearchSplit,\n} from './search-ledger-types'\nimport type { SearchState } from './search-state-projection'\nimport type {\n NodeRecord,\n SearchCell,\n SearchCompletion,\n SearchNode,\n SearchOperation,\n SearchScoredCell,\n SearchUnitScore,\n} from './search-state-types'\n\n/**\n * Per-unit means of scored cells, in unitId order. Each unit sums its cells in\n * cellId order, so the result depends on the set of cells alone, never on the\n * order they settled in: a verifier that reads the same cells from a database\n * gets the same bits.\n */\nexport function searchUnitScores(cells: readonly SearchScoredCell[]): SearchUnitScore[] {\n const byUnit = new Map<string, SearchScoredCell[]>()\n for (const cell of cells) {\n const unit = byUnit.get(cell.unitId)\n if (unit) unit.push(cell)\n else byUnit.set(cell.unitId, [cell])\n }\n return [...byUnit.entries()]\n .sort(([left], [right]) => compareCodeUnits(left, right))\n .map(([unitId, unitCells]) => {\n let sum = 0\n for (const cell of unitCells.sort((left, right) =>\n compareCodeUnits(left.cellId, right.cellId),\n )) {\n sum += cell.score\n }\n return { unitId, sum, count: unitCells.length, mean: sum / unitCells.length }\n })\n}\n\n/**\n * A read of `SearchState` at one ledger position. Header, head, audit and\n * claim are values. Node, edge, cell and score reads go to the live indexes and\n * throw once the state has applied a later entry.\n */\nexport class SearchStateView {\n readonly searchId: string\n readonly header: SearchOpenedEvent | null\n readonly closed: SearchClosedEvent | null\n readonly head: { sequence: number; entryHash: SearchLedgerHash } | null\n /** `occurredAt` of the head entry; a writer stamps later events at or after it. */\n readonly lastOccurredAt: string | null\n readonly audit: SearchAudit\n readonly completion: SearchCompletion\n /**\n * The admission rule's room: `headroomUsd` is the largest reservation a new\n * non-claim cell or operation may hold (committed spend, open holds and the\n * unspent claim reserve all count against the cap), or null when the search\n * declares no cap. `claimReserveUsd` is what claim cells may still draw.\n */\n readonly budget: { headroomUsd: number | null; claimReserveUsd: number }\n private readonly state: SearchState\n private readonly version: number\n\n constructor(state: SearchState, version: number) {\n this.state = state\n this.version = version\n this.searchId = state.searchId\n this.header = state.readHeader()\n this.closed = state.readClosed()\n this.head = state.readHead()\n this.lastOccurredAt = state.readLastOccurredAt()\n this.audit = state.readAudit()\n this.budget = state.readBudget()\n const reasons = state.incompleteReasons()\n if (!this.closed) reasons.unshift('search is open')\n this.completion = { complete: this.closed !== null, reasons }\n }\n\n /** The node the search started from: the first registered. */\n get rootNodeId(): string | null {\n return this.live().readNodeIds()[0] ?? null\n }\n\n node(nodeId: string): SearchNode | undefined {\n return this.live().readNode(nodeId)\n }\n\n hasNode(nodeId: string): boolean {\n return this.live().readHasNode(nodeId)\n }\n\n /** Node ids in registration order. */\n nodeIds(): string[] {\n return [...this.live().readNodeIds()]\n }\n\n /** Nodes in registration order. */\n nodes(): SearchNode[] {\n const state = this.live()\n return state.readNodeIds().map((nodeId) => state.readNode(nodeId)!)\n }\n\n nodeIdForDigest(artifactDigest: string): string | undefined {\n return this.live().readNodeIdForDigest(artifactDigest)\n }\n\n edge(edgeId: string): SearchEdgeRecordedEvent | undefined {\n return this.live().readEdge(edgeId)\n }\n\n /** Edges in ledger order. */\n edges(): SearchEdgeRecordedEvent[] {\n const state = this.live()\n return state.readEdgeIds().map((edgeId) => state.readEdge(edgeId)!)\n }\n\n cell(cellId: string): SearchCell | undefined {\n return this.live().readCell(cellId)\n }\n\n /** Cells in allocation order, optionally of one node. */\n cells(filter: { nodeId?: string } = {}): SearchCell[] {\n const state = this.live()\n return state.readCellIds(filter.nodeId).map((cellId) => state.readCell(cellId)!)\n }\n\n operation(operationId: string): SearchOperation | undefined {\n return this.live().readOperation(operationId)\n }\n\n /** A node's scored cells on one split, in allocation order. Unscored cells\n * (errored, cancelled or in flight) are absent, never zero. */\n scoredCells(nodeId: string, split: SearchSplit): SearchScoredCell[] {\n return this.live().readScoredCells(nodeId, split)\n }\n\n /** Per-unit score means of a node on one split, in unitId order. */\n unitScores(nodeId: string, split: SearchSplit): SearchUnitScore[] {\n return searchUnitScores(this.scoredCells(nodeId, split))\n }\n\n /** The lineage a RunRecord mint needs for one cell attempt. */\n lineage(coordinates: RunSearchCoordinates): RolloutSearchLineage {\n const state = this.live()\n if (coordinates.searchId !== this.searchId) {\n throw new SearchLedgerError(\n `coordinates name search ${coordinates.searchId}, not ${this.searchId}`,\n )\n }\n const cell = state.readCell(coordinates.cellId)\n if (!cell || cell.nodeId !== coordinates.nodeId) {\n throw new SearchLedgerError(\n `cell ${coordinates.cellId} of node ${coordinates.nodeId} is not in search ${this.searchId}`,\n )\n }\n if (coordinates.attempt < 1 || coordinates.attempt > cell.attempts) {\n throw new SearchLedgerError(\n `cell ${coordinates.cellId} has ${cell.attempts} settled attempt(s), not attempt ${coordinates.attempt}`,\n )\n }\n const node = state.readNode(cell.nodeId)!\n if (node.depth === null) {\n throw new SearchLedgerError(\n `node ${node.nodeId} has unknown lineage, so its depth is unknown`,\n )\n }\n const containment = this.header?.containment ?? null\n return {\n depth: node.depth,\n ordinal: node.ordinal,\n rep: cell.rep,\n containingRunId: containment\n ? searchCellRunId({ cellId: containment.cellId, attempt: containment.attempt })\n : null,\n }\n }\n\n private live(): SearchState {\n if (!this.state.isAt(this.version)) {\n throw new SearchLedgerError(\n `this SearchStateView is from sequence ${this.head?.sequence ?? -1}, and the ledger has moved on; read the ledger's state again`,\n )\n }\n return this.state\n }\n}\n\nexport function nodeView(record: NodeRecord): SearchNode {\n const latest = record.decisions.at(-1)?.decision ?? null\n return {\n nodeId: record.event.nodeId,\n ordinal: record.ordinal,\n artifactDigest: record.event.artifactDigest,\n artifact: record.event.artifact,\n surfaces: record.event.surfaces,\n primaryParentId: record.primaryParentId,\n depth: record.depth,\n parents: [...record.parents],\n children: [...record.children],\n edgeIds: [...record.edgeIds],\n status: latest?.status ?? null,\n rung: latest?.status === 'advanced' ? latest.rung : null,\n finalist: record.finalist,\n decisions: [...record.decisions],\n cellCount: record.cellIds.length,\n spend: { ...record.spend },\n registeredSequence: record.registeredSequence,\n updatedSequence: record.updatedSequence,\n }\n}\n","import type { LedgerProjector } from '../ledger-core'\nimport { canonicalString } from '../ledger-core/canonical'\nimport { roundDecimal as round } from '../math/round-decimal'\nimport { searchCellRunId } from '../run-record'\nimport {\n assertStageSplit,\n assertUnique,\n integrity,\n MAX_LABEL_CHARS,\n SEARCH_CLAIM_MAX_FINALISTS,\n USD_TOLERANCE,\n} from './search-ledger-constraints'\nimport { artifactKey } from './search-ledger-ordering'\nimport type {\n SearchAttemptAccounting,\n SearchAudit,\n SearchCellAllocatedEvent,\n SearchCellCancelledEvent,\n SearchCellSettledEvent,\n SearchClaim,\n SearchClosedEvent,\n SearchEdgeRecordedEvent,\n SearchLedgerEntry,\n SearchLedgerEvent,\n SearchLedgerHash,\n SearchNodeDecidedEvent,\n SearchNodeRegisteredEvent,\n SearchOpenedEvent,\n SearchOperationRecordedEvent,\n SearchOperationStartedEvent,\n SearchReservation,\n SearchSplit,\n} from './search-ledger-types'\nimport { searchCellId, searchNodeId, searchTaskSetDigest } from './search-state-identity'\nimport type {\n CellRecord,\n NodeRecord,\n OperationRecord,\n SearchCell,\n SearchNode,\n SearchOperation,\n SearchScoredCell,\n} from './search-state-types'\nimport { nodeView, SearchStateView } from './search-state-view'\n\nconst SPLITS: readonly SearchSplit[] = ['train', 'selection', 'test']\n\n/**\n * The pure, incremental projection of one search ledger. `apply` refuses any\n * entry that breaks an invariant; the journal then discards this instance and\n * replays into a new one, so a refused entry leaves no partial state behind.\n */\nexport class SearchState implements LedgerProjector<SearchLedgerEntry, SearchStateView> {\n readonly searchId: string\n private version = 0\n private header: SearchOpenedEvent | null = null\n private closed: SearchClosedEvent | null = null\n private head: { sequence: number; entryHash: SearchLedgerHash } | null = null\n private lastOccurredAt = Number.NEGATIVE_INFINITY\n private lastOccurredAtText: string | null = null\n private readonly tasks = new Map<string, { split: SearchSplit; unitId: string }>()\n private readonly nodes = new Map<string, NodeRecord>()\n private readonly nodeOrder: string[] = []\n private readonly nodeByDigest = new Map<string, string>()\n private readonly edges = new Map<string, SearchEdgeRecordedEvent>()\n private readonly edgeOrder: string[] = []\n private readonly cells = new Map<string, CellRecord>()\n private readonly operations = new Map<string, OperationRecord>()\n private selectedNodeId: string | null = null\n private claimUsedUsd = 0\n /** Nodes ever decided `finalist`. */\n private readonly finalists = new Set<string>()\n /** Claim cells allocated. Once one exists, the finalists are fixed. */\n private claimCells = 0\n private readonly audit: SearchAudit\n\n constructor(searchId: string) {\n this.searchId = searchId\n this.audit = {\n searchId,\n eventCount: 0,\n headHash: null,\n status: 'open',\n closeReason: null,\n nodes: 0,\n nodesWithoutEdge: 0,\n undecidedNodes: 0,\n selectedNodeId: null,\n edges: { explicit: 0, correlated: 0, unknown: 0, reproposals: 0 },\n cells: { allocated: 0, settled: 0, cancelled: 0, open: 0 },\n attempts: 0,\n outcomes: { passed: 0, failed: 0, errored: 0 },\n operations: { started: 0, recorded: 0, open: 0 },\n spend: {\n knownUsd: 0,\n floorUsd: 0,\n unknownCostCells: 0,\n unknownCostOperations: 0,\n committedUsd: 0,\n openReservationUsd: 0,\n overspendUsd: 0,\n unreservedCells: 0,\n boxMinutes: 0,\n },\n tokens: { inputTokens: 0, outputTokens: 0, cachedTokens: 0, unknownTokenAttempts: 0 },\n }\n }\n\n apply(entry: SearchLedgerEntry, index: number): void {\n const event = entry.event\n if (this.closed) {\n throw integrity(`event ${event.eventId} follows search-closed ${this.closed.eventId}`)\n }\n const occurredAt = Date.parse(event.occurredAt)\n if (occurredAt < this.lastOccurredAt) {\n throw integrity(`event ${event.eventId} occurred before the preceding event`)\n }\n assertUnique(event.artifacts.map(artifactKey), 'artifact receipt', event.eventId)\n if (event.kind === 'search-opened') {\n if (index !== 0 || this.header) {\n throw integrity('search-opened must be the first and only opening event')\n }\n this.open(event)\n } else {\n if (!this.header) {\n throw integrity(`event ${event.eventId} appears before search-opened`)\n }\n this.applyEvent(event, index)\n }\n this.lastOccurredAt = occurredAt\n this.lastOccurredAtText = event.occurredAt\n this.head = { sequence: index, entryHash: entry.entryHash }\n this.audit.eventCount = index + 1\n this.audit.headHash = entry.entryHash\n this.version += 1\n }\n\n snapshot(): SearchStateView {\n return new SearchStateView(this, this.version)\n }\n\n /** @internal Views check this before every read of the live indexes. */\n isAt(version: number): boolean {\n return this.version === version\n }\n\n private applyEvent(event: Exclude<SearchLedgerEvent, SearchOpenedEvent>, index: number): void {\n switch (event.kind) {\n case 'operation-started':\n this.startOperation(event)\n return\n case 'operation-recorded':\n this.recordOperation(event)\n return\n case 'node-registered':\n this.registerNode(event, index)\n return\n case 'edge-recorded':\n this.recordEdge(event, index)\n return\n case 'cell-allocated':\n this.allocateCell(event, index)\n return\n case 'cell-settled':\n this.settleCell(event, index)\n return\n case 'cell-cancelled':\n this.cancelCell(event, index)\n return\n case 'node-decided':\n this.decideNode(event, index)\n return\n case 'search-closed':\n this.close(event)\n return\n }\n }\n\n private open(event: SearchOpenedEvent): void {\n if (event.containment?.searchId === this.searchId) {\n throw integrity('a search cannot contain itself')\n }\n if (event.derivedFrom?.searchId === this.searchId) {\n throw integrity('a search cannot derive from itself')\n }\n const units: Record<SearchSplit, Set<string>> = {\n train: new Set(),\n selection: new Set(),\n test: new Set(),\n }\n for (const split of SPLITS) {\n const { tasks, taskSetDigest } = event.splits[split]\n if (searchTaskSetDigest(tasks) !== taskSetDigest) {\n throw integrity(`the ${split} split's taskSetDigest does not match its tasks`)\n }\n for (const task of tasks) {\n const owner = this.tasks.get(task.taskId)\n if (owner) {\n throw integrity(`task ${task.taskId} is in both the ${owner.split} and ${split} splits`)\n }\n this.tasks.set(task.taskId, { split, unitId: task.unitId })\n units[split].add(task.unitId)\n }\n }\n if (event.splits.heldOutUnits) {\n const seen = [...units.test].filter(\n (unit) => units.train.has(unit) || units.selection.has(unit),\n )\n if (seen.length > 0) {\n throw integrity(\n `test units ${seen.join(', ')} also appear in train or selection, but the splits declare heldOutUnits`,\n )\n }\n }\n const { budget } = event\n if (budget.maxUsd !== null && budget.reservedClaimUsd > budget.maxUsd + USD_TOLERANCE) {\n throw integrity(\n `the claim reserve $${budget.reservedClaimUsd} exceeds the search cap $${budget.maxUsd}`,\n )\n }\n this.header = event\n }\n\n private startOperation(event: SearchOperationStartedEvent): void {\n if (this.operations.has(event.operationId)) {\n throw integrity(`operation ${event.operationId} was started twice`)\n }\n this.assertSearching(`operation ${event.operationId}`)\n this.admit(event.reservation, false, `operation ${event.operationId}`)\n this.operations.set(event.operationId, {\n operationId: event.operationId,\n operationKind: event.operationKind,\n reservation: event.reservation,\n recorded: false,\n outcome: null,\n execution: null,\n artifacts: event.artifacts,\n spentUsd: 0,\n costKnown: false,\n })\n this.audit.operations.started += 1\n this.audit.operations.open += 1\n this.audit.spend.openReservationUsd += event.reservation?.usd ?? 0\n }\n\n private recordOperation(event: SearchOperationRecordedEvent): void {\n const operation = this.operations.get(event.operationId)\n if (!operation) {\n throw integrity(`operation ${event.operationId} was recorded before it started`)\n }\n if (operation.recorded) {\n throw integrity(`operation ${event.operationId} was recorded twice`)\n }\n if (operation.operationKind !== event.operationKind) {\n throw integrity(\n `operation ${event.operationId} started as ${operation.operationKind} but recorded as ${event.operationKind}`,\n )\n }\n const cost = this.book(event.accounting)\n if (cost.unknown) this.audit.spend.unknownCostOperations += 1\n const reserved = operation.reservation?.usd ?? 0\n this.audit.spend.openReservationUsd -= reserved\n if (operation.reservation) {\n this.audit.spend.overspendUsd += Math.max(0, cost.usd - reserved)\n }\n operation.recorded = true\n operation.outcome = event.outcome.status\n operation.execution = event.execution\n operation.artifacts = [...operation.artifacts, ...event.artifacts]\n operation.spentUsd = cost.usd\n operation.costKnown = !cost.unknown\n this.audit.operations.recorded += 1\n this.audit.operations.open -= 1\n }\n\n private registerNode(event: SearchNodeRegisteredEvent, index: number): void {\n const expected = searchNodeId(this.searchId, event.artifactDigest)\n if (event.nodeId !== expected) {\n throw integrity(\n `node ${event.nodeId} does not match its artifact digest (expected ${expected})`,\n )\n }\n if (this.nodes.has(event.nodeId)) {\n throw integrity(\n `node ${event.nodeId} was registered twice; a re-proposal is a second edge into it`,\n )\n }\n this.assertSearching(`node ${event.nodeId}`)\n assertUnique(\n event.surfaces.map((surface) => surface.surfaceId),\n 'surfaceId',\n event.eventId,\n )\n const maxNodes = this.header!.budget.maxNodes\n if (maxNodes !== null && this.nodes.size + 1 > maxNodes) {\n throw integrity(`node ${event.nodeId} exceeds the search's maxNodes ${maxNodes}`)\n }\n this.nodes.set(event.nodeId, {\n event,\n ordinal: this.nodeOrder.length,\n registeredSequence: index,\n updatedSequence: index,\n edgeIds: [],\n parents: [],\n parentKeys: new Set(),\n primaryParentId: null,\n depth: null,\n children: [],\n decisions: [],\n finalist: false,\n cellIds: [],\n scoredCells: 0,\n spend: { knownUsd: 0, floorUsd: 0, unknownCostCells: 0, boxMinutes: 0 },\n })\n this.nodeOrder.push(event.nodeId)\n this.nodeByDigest.set(event.artifactDigest, event.nodeId)\n this.audit.nodes += 1\n this.audit.nodesWithoutEdge += 1\n this.audit.undecidedNodes += 1\n }\n\n private recordEdge(event: SearchEdgeRecordedEvent, index: number): void {\n if (this.edges.has(event.edgeId)) {\n throw integrity(`edge ${event.edgeId} was recorded twice`)\n }\n const child = this.nodes.get(event.childNodeId)\n if (!child) {\n throw integrity(`edge ${event.edgeId} names unregistered child ${event.childNodeId}`)\n }\n this.assertSearching(`edge ${event.edgeId}`)\n if (event.label.length > MAX_LABEL_CHARS) {\n throw integrity(`edge ${event.edgeId} label exceeds ${MAX_LABEL_CHARS} characters`)\n }\n if (event.diffs.length !== event.parents.length) {\n throw integrity(`edge ${event.edgeId} needs one diff per parent`)\n }\n assertUnique(\n event.parents.map((parent) => canonicalString(parent)),\n 'parent',\n event.eventId,\n )\n const { operator, attribution, parents } = event\n if ((operator === 'seed') !== (event.proposer === null)) {\n throw integrity(`edge ${event.edgeId}: exactly the seed edge has no proposer`)\n }\n if (operator === 'seed' && (parents.length > 0 || attribution === 'unknown')) {\n throw integrity(`seed edge ${event.edgeId} must have no parents and a known attribution`)\n }\n if (attribution === 'unknown' && parents.length > 0) {\n throw integrity(`edge ${event.edgeId} has unknown attribution but names parents`)\n }\n if (operator !== 'seed' && attribution !== 'unknown' && parents.length === 0) {\n throw integrity(`${operator} edge ${event.edgeId} names no parent`)\n }\n if (operator === 'merge' && attribution !== 'unknown' && parents.length < 2) {\n throw integrity(`merge edge ${event.edgeId} needs at least two parents`)\n }\n const operationId = event.proposer?.operationId ?? null\n if (operationId !== null && !this.operations.has(operationId)) {\n throw integrity(`edge ${event.edgeId} names operation ${operationId}, which never started`)\n }\n // A node's first edge fixes its lineage, so its parents were registered\n // before it and the lineage is acyclic. A later edge is a re-proposal:\n // the proposer produced the node's artifact again. Proposers return their\n // parent unchanged and revert edits, so a re-proposal may come from any\n // node the search holds, the node itself included; a parent registered at\n // or after the node is counted but never becomes lineage.\n const reproposal = child.edgeIds.length > 0\n const inSearch: NodeRecord[] = []\n const later = new Set<string>()\n for (const parent of parents) {\n if (parent.searchId !== this.searchId) {\n const from = this.header!.derivedFrom\n if (\n operator !== 'derive' ||\n parents.length !== 1 ||\n !from ||\n from.searchId !== parent.searchId ||\n from.nodeId !== parent.nodeId\n ) {\n throw integrity(\n `edge ${event.edgeId} names a parent in search ${parent.searchId}; only a derive edge matching derivedFrom may`,\n )\n }\n continue\n }\n if (operator === 'derive') {\n throw integrity(`derive edge ${event.edgeId} must name the parent in derivedFrom`)\n }\n const record = this.nodes.get(parent.nodeId)\n if (!record) {\n throw integrity(`edge ${event.edgeId} names unregistered parent ${parent.nodeId}`)\n }\n if (record.ordinal >= child.ordinal && !reproposal) {\n throw integrity(\n `edge ${event.edgeId}: parent ${parent.nodeId} registered after child ${child.event.nodeId}`,\n )\n }\n if (record.edgeIds.length === 0) {\n throw integrity(`edge ${event.edgeId}: parent ${parent.nodeId} has no edge of its own yet`)\n }\n if (record.decisions.at(-1)?.decision.status === 'invalid') {\n throw integrity(\n `edge ${event.edgeId}: parent ${parent.nodeId} was decided invalid, and an invalid node never becomes a parent`,\n )\n }\n if (record.ordinal >= child.ordinal) later.add(parent.nodeId)\n else inSearch.push(record)\n }\n\n if (!reproposal) {\n const primary = inSearch[0]\n child.primaryParentId = primary?.event.nodeId ?? null\n child.depth =\n operator === 'seed' || operator === 'derive'\n ? 0\n : primary && primary.depth !== null\n ? primary.depth + 1\n : null\n this.audit.nodesWithoutEdge -= 1\n } else {\n this.audit.edges.reproposals += 1\n }\n child.edgeIds.push(event.edgeId)\n for (const parent of parents) {\n const key = canonicalString(parent)\n if (later.has(parent.nodeId) || child.parentKeys.has(key)) continue\n child.parentKeys.add(key)\n child.parents.push(parent)\n }\n for (const parent of inSearch) {\n if (!parent.children.includes(child.event.nodeId)) parent.children.push(child.event.nodeId)\n }\n child.updatedSequence = index\n this.edges.set(event.edgeId, event)\n this.edgeOrder.push(event.edgeId)\n this.audit.edges[attribution] += 1\n }\n\n private allocateCell(event: SearchCellAllocatedEvent, index: number): void {\n const expected = searchCellId(this.searchId, event.nodeId, event.taskId, event.split, event.rep)\n if (event.cellId !== expected) {\n throw integrity(`cell ${event.cellId} does not match its coordinates (expected ${expected})`)\n }\n if (this.cells.has(event.cellId)) {\n throw integrity(`cell ${event.cellId} was allocated twice`)\n }\n const node = this.nodes.get(event.nodeId)\n if (!node) throw integrity(`cell ${event.cellId} names unregistered node ${event.nodeId}`)\n if (node.edgeIds.length === 0) {\n throw integrity(`cell ${event.cellId}: node ${event.nodeId} has no edge yet`)\n }\n const task = this.tasks.get(event.taskId)\n if (!task || task.split !== event.split) {\n throw integrity(\n `cell ${event.cellId}: task ${event.taskId} is not in the ${event.split} split`,\n )\n }\n if (task.unitId !== event.unitId) {\n throw integrity(`cell ${event.cellId}: task ${event.taskId} samples unit ${task.unitId}`)\n }\n assertStageSplit(event.cellId, event.stage, event.split, node.ordinal === 0)\n if (event.split === 'test' && node.ordinal !== 0 && !node.finalist) {\n throw integrity(\n `cell ${event.cellId}: the test split is sealed; only the root and finalists run on it`,\n )\n }\n if (event.stage !== 'claim') this.assertSearching(`cell ${event.cellId}`)\n const maxCells = this.header!.budget.maxCells\n if (maxCells !== null && this.audit.cells.allocated + 1 > maxCells) {\n throw integrity(`cell ${event.cellId} exceeds the search's maxCells ${maxCells}`)\n }\n this.admit(event.reservation, event.stage === 'claim', `cell ${event.cellId}`)\n this.cells.set(event.cellId, {\n cellId: event.cellId,\n nodeId: event.nodeId,\n taskId: event.taskId,\n unitId: event.unitId,\n split: event.split,\n rep: event.rep,\n stage: event.stage,\n lane: event.lane,\n reservation: event.reservation,\n attempts: 0,\n lastRunId: null,\n outcome: null,\n score: null,\n final: false,\n cancelled: null,\n spentUsd: 0,\n costKnown: true,\n traceId: null,\n allocatedSequence: index,\n updatedSequence: index,\n })\n node.cellIds.push(event.cellId)\n node.updatedSequence = index\n this.audit.cells.allocated += 1\n this.audit.cells.open += 1\n this.audit.spend.openReservationUsd += event.reservation?.usd ?? 0\n if (event.stage === 'claim') {\n this.claimUsedUsd += event.reservation?.usd ?? 0\n this.claimCells += 1\n }\n }\n\n private settleCell(event: SearchCellSettledEvent, index: number): void {\n const cell = this.cells.get(event.cellId)\n if (!cell) throw integrity(`attempt ${event.eventId} names unallocated cell ${event.cellId}`)\n if (cell.cancelled) throw integrity(`cell ${event.cellId} was settled after it was cancelled`)\n if (cell.final) {\n throw integrity(\n `cell ${event.cellId} was attempted again after a final ${cell.outcome} outcome; only a retryable error admits another attempt`,\n )\n }\n if (event.attempt !== cell.attempts + 1) {\n throw integrity(\n `cell ${event.cellId} attempt ${event.attempt} is not contiguous (expected ${cell.attempts + 1})`,\n )\n }\n const runId = searchCellRunId({ cellId: event.cellId, attempt: event.attempt })\n if (event.runId !== runId) {\n throw integrity(`cell ${event.cellId} attempt ${event.attempt} must have runId ${runId}`)\n }\n const node = this.nodes.get(cell.nodeId)!\n const declared = new Set(node.event.surfaces.map((surface) => surface.surfaceId))\n assertUnique(\n event.surfaceEvidence.map((evidence) => evidence.surfaceId),\n 'surface evidence',\n event.eventId,\n )\n for (const evidence of event.surfaceEvidence) {\n if (!declared.has(evidence.surfaceId)) {\n throw integrity(\n `attempt ${event.eventId} reports surface ${evidence.surfaceId}, which node ${cell.nodeId} does not declare`,\n )\n }\n }\n if (event.artifacts.filter((artifact) => artifact.role === 'run-record').length > 1) {\n throw integrity(`attempt ${event.eventId} binds more than one RunRecord`)\n }\n\n const before = this.reservationParts(cell)\n const cost = this.book(event.accounting)\n if (cell.attempts === 0) {\n this.audit.cells.settled += 1\n this.audit.cells.open -= 1\n if (cell.reservation === null) this.audit.spend.unreservedCells += 1\n }\n if (cost.unknown && cell.costKnown) {\n cell.costKnown = false\n this.audit.spend.unknownCostCells += 1\n node.spend.unknownCostCells += 1\n }\n cell.attempts = event.attempt\n cell.lastRunId = runId\n cell.outcome = event.outcome.status\n cell.spentUsd += cost.usd\n cell.updatedSequence = index\n if ('traceId' in event.traceRef) cell.traceId = event.traceRef.traceId\n if (event.outcome.status === 'errored') {\n cell.final = !event.outcome.error.retryable\n } else {\n cell.final = true\n cell.score = event.outcome.score\n node.scoredCells += 1\n }\n const after = this.reservationParts(cell)\n this.audit.spend.openReservationUsd += after.open - before.open\n this.audit.spend.overspendUsd += after.over - before.over\n if (cell.stage === 'claim') this.claimUsedUsd += after.used - before.used\n\n if (cost.unknown) node.spend.floorUsd += cost.usd\n else node.spend.knownUsd += cost.usd\n const boxMinutes = event.boxMinutes ?? 0\n node.spend.boxMinutes += boxMinutes\n this.audit.spend.boxMinutes += boxMinutes\n node.updatedSequence = index\n this.audit.attempts += 1\n this.audit.outcomes[event.outcome.status] += 1\n }\n\n private cancelCell(event: SearchCellCancelledEvent, index: number): void {\n const cell = this.cells.get(event.cellId)\n if (!cell)\n throw integrity(`cancellation ${event.eventId} names unallocated cell ${event.cellId}`)\n if (cell.cancelled) throw integrity(`cell ${event.cellId} was cancelled twice`)\n if (cell.final) throw integrity(`cell ${event.cellId} was cancelled after a final outcome`)\n const before = this.reservationParts(cell)\n cell.cancelled = event.reason\n cell.updatedSequence = index\n const after = this.reservationParts(cell)\n this.audit.spend.openReservationUsd += after.open - before.open\n this.audit.spend.overspendUsd += after.over - before.over\n if (cell.stage === 'claim') this.claimUsedUsd += after.used - before.used\n if (cell.attempts === 0) {\n this.audit.cells.cancelled += 1\n this.audit.cells.open -= 1\n }\n this.nodes.get(cell.nodeId)!.updatedSequence = index\n }\n\n private decideNode(event: SearchNodeDecidedEvent, index: number): void {\n const node = this.nodes.get(event.nodeId)\n if (!node) throw integrity(`decision ${event.eventId} names unregistered node ${event.nodeId}`)\n if (node.edgeIds.length === 0) {\n throw integrity(`decision ${event.eventId}: node ${event.nodeId} has no edge yet`)\n }\n const status = event.decision.status\n if (status === 'finalist' && !this.finalists.has(event.nodeId)) {\n if (node.ordinal === 0) {\n throw integrity(`the root ${event.nodeId} is the claim's control and cannot be a finalist`)\n }\n if (this.claimCells > 0) {\n throw integrity(\n `node ${event.nodeId} was decided finalist after a claim cell ran; the finalists are fixed before the test`,\n )\n }\n if (this.finalists.size >= SEARCH_CLAIM_MAX_FINALISTS) {\n throw integrity(\n `node ${event.nodeId} would be finalist ${this.finalists.size + 1}; at most ${SEARCH_CLAIM_MAX_FINALISTS} are allowed`,\n )\n }\n this.finalists.add(event.nodeId)\n }\n if (status === 'selected') {\n if (this.selectedNodeId !== null && this.selectedNodeId !== event.nodeId) {\n throw integrity(\n `node ${event.nodeId} was selected while ${this.selectedNodeId} is still selected`,\n )\n }\n if (node.scoredCells === 0) {\n throw integrity(`node ${event.nodeId} cannot be selected without a scored cell`)\n }\n }\n const previous = node.decisions.at(-1)?.decision.status ?? null\n const wasUndecided = previous === null || previous === 'advanced'\n const isUndecided = status === 'advanced'\n this.audit.undecidedNodes += (isUndecided ? 1 : 0) - (wasUndecided ? 1 : 0)\n if (previous === 'selected' && status !== 'selected') this.selectedNodeId = null\n if (status === 'selected') this.selectedNodeId = event.nodeId\n if (status === 'finalist') node.finalist = true\n node.decisions.push({\n sequence: index,\n decision: event.decision,\n basis: event.basis,\n rule: event.rule,\n reason: event.reason,\n })\n node.updatedSequence = index\n this.audit.selectedNodeId = this.selectedNodeId\n }\n\n private close(event: SearchClosedEvent): void {\n const reasons = this.incompleteReasons()\n if (reasons.length > 0) {\n throw integrity(`search-closed while incomplete: ${reasons.join('; ')}`)\n }\n if (event.claim) this.checkClaim(event.claim)\n this.closed = event\n this.audit.status = 'closed'\n this.audit.closeReason = event.reason\n // Nothing runs after the close, so every hold is released.\n this.audit.spend.openReservationUsd = 0\n }\n\n private checkClaim(claim: SearchClaim): void {\n const named = claim.finalists.map((finalist) => finalist.nodeId)\n assertUnique(named, 'claim finalist', 'search-closed')\n for (const nodeId of named) {\n if (!this.finalists.has(nodeId)) {\n throw integrity(`claim finalist ${nodeId} was never decided finalist`)\n }\n }\n // Every finalist stays in the family the confidence is divided among, so\n // a finalist that lost cannot be dropped to relax the correction.\n for (const nodeId of this.finalists) {\n if (!named.includes(nodeId)) {\n throw integrity(`finalist ${nodeId} is missing from the claim`)\n }\n }\n const root = this.nodeOrder[0] ?? null\n const perFinalist = 1 - (1 - claim.confidence) / Math.max(1, named.length)\n for (const finalist of claim.finalists) {\n const { estimate, test } = finalist\n if (estimate && (estimate.against !== root || estimate.split !== 'test')) {\n throw integrity(\n `claim finalist ${finalist.nodeId} is estimated against something other than the root on test`,\n )\n }\n if (test && Math.abs(test.confidence - perFinalist) > 1e-12) {\n throw integrity(\n `claim finalist ${finalist.nodeId} is tested at confidence ${test.confidence}; ${named.length} finalists at family-wise ${claim.confidence} need ${perFinalist}`,\n )\n }\n if (finalist.promote && test === null) {\n throw integrity(`claim finalist ${finalist.nodeId} is promoted without a test`)\n }\n }\n if (claim.selected !== this.selectedNodeId) {\n throw integrity(\n `the claim selects ${claim.selected ?? 'nothing'} but the selected node is ${this.selectedNodeId ?? 'none'}`,\n )\n }\n if (claim.decision === 'ship') {\n const shipped = claim.finalists.find((finalist) => finalist.nodeId === claim.selected)\n if (claim.selected === null || claim.selected === root || !shipped?.promote) {\n throw integrity('a ship claim must select a finalist that the paired test promoted')\n }\n if (!this.header!.splits.heldOutUnits) {\n throw integrity('a ship claim needs test units held out from train and selection')\n }\n if ('unknown' in this.header!.objective.judge) {\n throw integrity(\n \"a ship claim needs a pinned judge; with an unknown judge a resumed search could mix two judges' verdicts\",\n )\n }\n const testUnits = new Set(this.header!.splits.test.tasks.map((task) => task.unitId))\n for (const nodeId of [root!, claim.selected]) {\n const scored = new Set(this.readScoredCells(nodeId, 'test').map((cell) => cell.unitId))\n const missing = [...testUnits].filter((unit) => !scored.has(unit))\n if (missing.length > 0) {\n throw integrity(\n `a ship claim needs every test unit scored by the root and the finalist; ${nodeId} has none on ${missing.join(', ')}`,\n )\n }\n }\n } else if (claim.selected !== null && claim.selected !== root) {\n throw integrity(`a ${claim.decision} claim keeps the root; it cannot select another node`)\n }\n if (claim.decision === 'test-cannot-resolve') {\n for (const cell of this.cells.values()) {\n if (cell.split === 'test' && cell.attempts > 0) {\n throw integrity('a test-cannot-resolve claim spends nothing on test cells')\n }\n }\n }\n }\n\n /** Once the first finalist is decided, the search only runs its claim:\n * nothing new is proposed, registered or allocated outside the test. */\n private assertSearching(subject: string): void {\n if (this.finalists.size > 0 || this.claimCells > 0) {\n throw integrity(\n `${subject} follows the start of the claim; the search stopped when its finalists were decided`,\n )\n }\n }\n\n /** @internal */\n incompleteReasons(): string[] {\n const reasons: string[] = []\n if (!this.header) reasons.push('search-opened is missing')\n if (this.audit.cells.open > 0)\n reasons.push(count(this.audit.cells.open, 'cell', 'has no outcome'))\n if (this.audit.operations.open > 0) {\n reasons.push(count(this.audit.operations.open, 'operation', 'is unrecorded'))\n }\n if (this.audit.nodesWithoutEdge > 0) {\n reasons.push(count(this.audit.nodesWithoutEdge, 'node', 'has no edge'))\n }\n if (this.audit.undecidedNodes > 0) {\n reasons.push(count(this.audit.undecidedNodes, 'node', 'has no terminal decision'))\n }\n return reasons\n }\n\n /** Book an attempt's or operation's accounting into the running totals. An\n * unknown cost counts as its proven floor. */\n private book(accounting: SearchAttemptAccounting): { usd: number; unknown: boolean } {\n const { tokens, cost } = accounting\n if (tokens.status === 'known') {\n this.audit.tokens.inputTokens += tokens.inputTokens\n this.audit.tokens.outputTokens += tokens.outputTokens\n this.audit.tokens.cachedTokens += tokens.cachedTokens\n } else {\n this.audit.tokens.unknownTokenAttempts += 1\n }\n const usd = cost.status === 'known' ? cost.usd : cost.knownLowerBoundUsd\n if (cost.status === 'known') this.audit.spend.knownUsd += usd\n else this.audit.spend.floorUsd += usd\n this.audit.spend.committedUsd += usd\n return { usd, unknown: cost.status === 'unknown' }\n }\n\n /** A cell's share of the open reservations, its overspend, and what it draws\n * from the claim reserve: the larger of its hold and its spend. */\n private reservationParts(cell: CellRecord): { open: number; over: number; used: number } {\n const reserved = cell.reservation?.usd ?? 0\n const holding = !cell.final && cell.cancelled === null\n return {\n open: holding ? Math.max(0, reserved - cell.spentUsd) : 0,\n over: cell.reservation ? Math.max(0, cell.spentUsd - reserved) : 0,\n used: holding ? Math.max(reserved, cell.spentUsd) : cell.spentUsd,\n }\n }\n\n /** The admission rule: committed spend, open holds, the unspent claim\n * reserve and the new hold stay within the cap. A claim cell draws on the\n * claim reserve instead of adding to it.\n *\n * The rule admits holds, not records. Spend above a hold is legal\n * overspend, so committed spend can pass the cap; an event that holds\n * nothing (the claim operation, a cell an external optimizer already ran)\n * and a claim cell the unspent reserve covers are then still admitted. The\n * reserve was set aside at the start and overspend elsewhere cannot take it\n * back; refusing them would leave a search that can never close. */\n private admit(reservation: SearchReservation | null, claim: boolean, subject: string): void {\n const { maxUsd, reservedClaimUsd } = this.header!.budget\n const hold = reservation?.usd ?? 0\n if (maxUsd === null || hold === 0) return\n const remainingClaim = Math.max(0, reservedClaimUsd - this.claimUsedUsd)\n if (claim && hold <= remainingClaim + USD_TOLERANCE) return\n const total =\n this.audit.spend.committedUsd +\n this.audit.spend.openReservationUsd +\n (claim ? 0 : remainingClaim) +\n hold\n if (total > maxUsd + USD_TOLERANCE) {\n throw integrity(\n `${subject} is not admissible: committed $${round(this.audit.spend.committedUsd, 6)} + open $${round(this.audit.spend.openReservationUsd, 6)} + claim reserve $${round(remainingClaim, 6)} + hold $${round(hold, 6)} exceeds the cap $${maxUsd}`,\n )\n }\n }\n\n // ── Reads, for SearchStateView ─────────────────────────────────────────\n\n /** @internal The largest hold a new non-claim cell or operation may take,\n * and the claim reserve still unspent. */\n readBudget(): { headroomUsd: number | null; claimReserveUsd: number } {\n const { maxUsd, reservedClaimUsd } = this.header?.budget ?? {\n maxUsd: null,\n reservedClaimUsd: 0,\n }\n const claimReserveUsd = Math.max(0, reservedClaimUsd - this.claimUsedUsd)\n if (maxUsd === null) return { headroomUsd: null, claimReserveUsd }\n const used =\n this.audit.spend.committedUsd + this.audit.spend.openReservationUsd + claimReserveUsd\n return { headroomUsd: Math.max(0, maxUsd - used), claimReserveUsd }\n }\n\n /** @internal */\n readHeader(): SearchOpenedEvent | null {\n return this.header\n }\n\n /** @internal */\n readClosed(): SearchClosedEvent | null {\n return this.closed\n }\n\n /** @internal */\n readHead(): { sequence: number; entryHash: SearchLedgerHash } | null {\n return this.head\n }\n\n /** @internal */\n readLastOccurredAt(): string | null {\n return this.lastOccurredAtText\n }\n\n /** @internal */\n readAudit(): SearchAudit {\n const audit = this.audit\n return {\n ...audit,\n edges: { ...audit.edges },\n cells: { ...audit.cells },\n outcomes: { ...audit.outcomes },\n operations: { ...audit.operations },\n spend: { ...audit.spend },\n tokens: { ...audit.tokens },\n }\n }\n\n /** @internal */\n readNode(nodeId: string): SearchNode | undefined {\n const record = this.nodes.get(nodeId)\n return record ? nodeView(record) : undefined\n }\n\n /** @internal */\n readNodeIds(): readonly string[] {\n return this.nodeOrder\n }\n\n /** @internal */\n readHasNode(nodeId: string): boolean {\n return this.nodes.has(nodeId)\n }\n\n /** @internal */\n readNodeIdForDigest(artifactDigest: string): string | undefined {\n return this.nodeByDigest.get(artifactDigest)\n }\n\n /** @internal */\n readEdge(edgeId: string): SearchEdgeRecordedEvent | undefined {\n return this.edges.get(edgeId)\n }\n\n /** @internal */\n readEdgeIds(): readonly string[] {\n return this.edgeOrder\n }\n\n /** @internal */\n readCell(cellId: string): SearchCell | undefined {\n const cell = this.cells.get(cellId)\n return cell ? { ...cell } : undefined\n }\n\n /** @internal */\n readCellIds(nodeId?: string): readonly string[] {\n if (nodeId === undefined) return [...this.cells.keys()]\n return this.nodes.get(nodeId)?.cellIds ?? []\n }\n\n /** @internal */\n readOperation(operationId: string): SearchOperation | undefined {\n const operation = this.operations.get(operationId)\n return operation ? { ...operation } : undefined\n }\n\n /** @internal */\n readScoredCells(nodeId: string, split: SearchSplit): SearchScoredCell[] {\n const scored: SearchScoredCell[] = []\n for (const cellId of this.nodes.get(nodeId)?.cellIds ?? []) {\n const cell = this.cells.get(cellId)!\n if (cell.split === split && cell.score !== null) {\n scored.push({ cellId, unitId: cell.unitId, attempt: cell.attempts, score: cell.score })\n }\n }\n return scored\n }\n}\n\nfunction count(value: number, noun: string, predicate: string): string {\n const verb = predicate.replace(/^(has|is) /, (word) =>\n value === 1 ? word : word === 'has ' ? 'have ' : 'are ',\n )\n return `${value} ${value === 1 ? noun : `${noun}s`} ${verb}`\n}\n","import type { AgentProfileDiff } from '@tangle-network/agent-interface'\nimport type { EvaluationClaim } from '../experiment/claim'\nimport type { LedgerHash } from '../ledger-core'\n\n/**\n * Schema tag every search-ledger entry carries. A ledger written under another\n * tag, such as the retired `tangle.search-ledger.v1` candidate-slot format, is\n * refused with its tag named; it is never translated.\n */\nexport const SEARCH_LEDGER_SCHEMA = 'tangle.search-ledger.2026-09' as const\n\nexport type SearchLedgerHash = LedgerHash\n\nexport type SearchSurfaceKind =\n | 'prompt'\n | 'tool-contract'\n | 'runtime-config'\n | 'memory'\n | 'knowledge'\n | 'agent-profile'\n | 'code'\n | 'deployment'\n\n/** What a search's nodes are: a mutable agent surface, or an output artifact. */\nexport type SearchArtifactKind = SearchSurfaceKind | 'output'\n\n/** Content-addressed artifact or receipt. Mutable paths are locators only; the\n * digest and byte length bind the exact bytes. */\nexport interface SearchArtifactRef {\n role: string\n uri: string\n sha256: SearchLedgerHash\n byteLength: number\n}\n\n/** Repository, dataset, or package source pinned to an immutable commit or\n * content digest. Branches, tags, and bare package versions are rejected. */\nexport interface SearchSourceRef {\n uri: string\n revision: string\n}\n\n/** A fact the producer does not have, with the reason. Unknown is never 0. */\nexport interface SearchUnknown {\n unknown: string\n}\n\n/** The model an attempt ran: an immutable snapshot, or a moving alias whose\n * served snapshot the producer could not observe. */\nexport type SearchModelIdentity =\n | { provider: string; snapshot: string }\n | { provider: string; alias: string; unknown: string }\n\nexport interface SearchCandidateSurface {\n surfaceId: string\n kind: SearchSurfaceKind\n artifact: SearchArtifactRef\n}\n\nexport type SearchOperationKind =\n | 'candidate-generation'\n | 'analysis'\n | 'selection'\n | 'judge'\n | 'other'\n\n/** train is the proposer's feedback, selection is private to the policy and\n * allocator, and test is sealed for the claim. */\nexport type SearchSplit = 'train' | 'selection' | 'test'\n\nexport interface SearchTask {\n taskId: string\n /** The claim's independent unit this task samples. Repeats and sibling\n * tasks of one unit average inside it before any statistic. */\n unitId: string\n source: SearchSourceRef\n}\n\nexport interface SearchSplitTasks {\n /** `hashCanonical` of `tasks` in taskId order. */\n taskSetDigest: SearchLedgerHash\n tasks: SearchTask[]\n}\n\nexport interface SearchSplits {\n train: SearchSplitTasks\n selection: SearchSplitTasks\n test: SearchSplitTasks\n /**\n * True when no test unit is a train or selection unit. A search that ran\n * with shared units records false, and then its claim cannot ship: a test\n * run of a seen unit measures a fresh run of a seen task, not an\n * improvement on unseen ones.\n */\n heldOutUnits: boolean\n}\n\nexport interface SearchBudget {\n /** Hard dollar cap on committed spend plus open reservations; null = none declared. */\n maxUsd: number | null\n maxCells: number | null\n maxNodes: number | null\n /** ISO time after which the policy stops expanding. */\n deadline: string | null\n maxConcurrency: number | null\n /** Held back at start for the root's and finalists' test cells. */\n reservedClaimUsd: number\n}\n\n/** Where a cell ran relative to the search's decisions. */\nexport type SearchCellStage = 'root' | 'train' | 'screen' | 'rung' | 'claim' | 'external'\n\nexport type SearchEdgeOperator = 'seed' | 'draft' | 'improve' | 'debug' | 'merge' | 'derive'\n\n/**\n * How an edge's parents are known. `explicit`: the proposer that created the\n * child emitted the edge. `correlated`: an importer joined an optimizer's own\n * parent record by content digest. `unknown`: no parent record exists, and the\n * edge has no parents. Nothing is inferred from timing or order.\n */\nexport type SearchEdgeAttribution = 'explicit' | 'correlated' | 'unknown'\n\nexport type SearchProposerKind = NonNullable<AgentProfileDiff['source']>['kind']\n\nexport interface SearchProposer {\n kind: SearchProposerKind\n name: string\n /** The candidate-generation operation that produced the child, when one was recorded. */\n operationId: string | null\n source: SearchSourceRef\n}\n\nexport interface SearchNodeRef {\n searchId: string\n nodeId: string\n}\n\n/** Dollars held for a cell or operation before it runs. `hard`: the lane\n * enforces the maximum. `estimate`: the lane cannot, and overshoot is recorded. */\nexport interface SearchReservation {\n kind: 'hard' | 'estimate'\n usd: number\n}\n\nexport type SearchTokenAccounting =\n | {\n status: 'known'\n inputTokens: number\n outputTokens: number\n cachedTokens: number\n }\n | {\n status: 'unknown'\n reason: string\n }\n\nexport type SearchCostAccounting =\n | {\n status: 'known'\n usd: number\n source: 'provider' | 'pricing-table' | 'free'\n }\n | {\n status: 'unknown'\n /** Proven part of the spend; the total may be higher. */\n knownLowerBoundUsd: number\n reason: string\n }\n\nexport interface SearchAttemptAccounting {\n tokens: SearchTokenAccounting\n cost: SearchCostAccounting\n}\n\nexport interface SearchFailureReason {\n code: string\n message: string\n}\n\n/** `failed` is the agent's defect and carries a score; `errored` is the\n * environment's fault, carries none, and may be retried. */\nexport type SearchTaskOutcome =\n | {\n status: 'passed'\n score: number\n metrics: Record<string, number>\n }\n | {\n status: 'failed'\n score: number\n metrics: Record<string, number>\n failure: SearchFailureReason\n }\n | {\n status: 'errored'\n metrics: Record<string, number>\n error: SearchFailureReason & { retryable: boolean }\n }\n\nexport type SearchSurfaceEffect =\n | {\n status: 'measured'\n metric: string\n baselineValue: number\n candidateValue: number\n delta: number\n }\n | {\n status: 'not-measured'\n reason: string\n }\n\n/** Per-attempt proof that a declared node surface did or did not fire. A\n * surface without evidence is unobserved, not fired. */\nexport interface SearchSurfaceEvidence {\n surfaceId: string\n fired: boolean\n firingCount: number\n effect: SearchSurfaceEffect\n evidence: SearchArtifactRef[]\n}\n\nexport type SearchTraceRef =\n | {\n traceId: string\n execRunId: string | null\n spansWritten: number | null\n spansDropped: number | null\n }\n | SearchUnknown\n\nexport interface SearchExecutionIdentity {\n model: SearchModelIdentity\n agent: SearchSourceRef\n benchmark: SearchSourceRef\n}\n\nexport type SearchEstimateMethod = 'none' | 'insufficient' | 'descriptive' | 'bootstrap'\n\n/**\n * A paired contrast of one node against another on shared units. `none` below\n * 2 pairs, `insufficient` below 6, `descriptive` below 20, `bootstrap` from 20.\n * `estimateNode` computes it; the ledger records the estimate a decision used.\n */\nexport interface NodeEstimate {\n against: string\n split: SearchSplit\n /** Units the node scored on the split. */\n units: number\n /** Units both nodes scored: the paired sample. */\n pairs: number\n /** Mean per-unit difference, node minus `against`, in the metric's units.\n * Null for `none`. */\n delta: number | null\n /** Bootstrap interval on `delta`: spread for `descriptive`, decision grade\n * for `bootstrap`. Null for `none`, `insufficient` and an indeterminate sample. */\n interval: [number, number] | null\n method: SearchEstimateMethod\n /** Exact one-sided sign-test p toward improvement; `descriptive` only. */\n exactSignP: number | null\n /** Every paired delta is equal, so an interval would have zero width and\n * carries no evidence either way. */\n indeterminate: boolean\n /** Digest of the cells read, which also seeds the bootstrap. */\n cellSetDigest: SearchLedgerHash\n estimator: SearchSourceRef\n}\n\nexport type SearchNodeDecision =\n | { status: 'advanced'; rung: number }\n | { status: 'pruned' }\n | { status: 'invalid' }\n | { status: 'finalist' }\n | { status: 'selected' }\n | { status: 'rejected' }\n\nexport type SearchNodeStatus = SearchNodeDecision['status']\n\nexport type SearchCloseReason =\n | 'budget'\n | 'deadline'\n | 'max-nodes'\n | 'patience'\n | 'converged'\n | 'aborted'\n\nexport type SearchCancelReason = 'pruned' | 'budget' | 'deadline' | 'aborted'\n\n/** How the claim's paired decision reads per-unit test means, fixed before any\n * test cell runs. `binary`: every unit mean is 0 or `scale` (a pass rate).\n * `continuous`: any other score. */\nexport type SearchClaimEstimator = { kind: 'continuous' } | { kind: 'binary'; scale: number }\n\n/**\n * Whether the test split can resolve the claim's minimum effect, checked on\n * selection data before any test cell runs. The power is the claim decision's\n * own promotion rate, simulated at a true improvement of `minimumEffect` with\n * the search's pooled between-unit variance.\n */\nexport type SearchClaimPower =\n | {\n adequate: boolean\n /** The improvement the test must resolve, in the metric's units. */\n minimumEffect: number\n powerAtMinimumEffect: number\n targetPower: number\n /** Independent test units. */\n units: number\n /** Finalists the family-wise confidence is divided among. */\n finalists: number\n /** Between-unit variance of selection improvements over the root, pooled\n * across every node with 2 or more shared units. */\n pooledVariance: number\n estimator: SearchClaimEstimator\n }\n | SearchUnknown\n\n/** A finalist's paired test against the root at its Bonferroni confidence. */\nexport interface SearchClaimTest {\n /** Test units the finalist and the root both scored. */\n pairs: number\n /** `1 - (1 - claim.confidence) / finalists`. */\n confidence: number\n method: 'score-interval' | 'bootstrap-ci' | 'exact-sign'\n /** Node minus root in the metric's units, like `NodeEstimate.delta`; a\n * `minimize` improvement is negative. */\n delta: number\n interval: [number, number]\n}\n\nexport interface SearchClaimFinalist {\n nodeId: string\n /** The node's test estimate against the root, as every view computes it.\n * Null when no test cell ran. */\n estimate: NodeEstimate | null\n /** The deciding test. Null when no test cell ran. */\n test: SearchClaimTest | null\n promote: boolean\n}\n\n/**\n * The claim made once, on the sealed test split. `selected` names the node the\n * search keeps: the shipped finalist on `ship`, the root otherwise (null when\n * the root has no scored cell).\n */\nexport interface SearchClaim {\n /** The claim procedure; its revision digests every rule and parameter. */\n rule: SearchSourceRef\n /** Family-wise confidence across the finalists. */\n confidence: number\n power: SearchClaimPower\n finalists: SearchClaimFinalist[]\n selected: string | null\n decision: 'ship' | 'hold' | 'test-cannot-resolve'\n /** Why the claim reached its decision. */\n reason: string\n}\n\ninterface SearchLedgerEventBase {\n eventId: string\n occurredAt: string\n artifacts: SearchArtifactRef[]\n}\n\n/** First event, once: what is searched, against what, on which tasks, under which budget. */\nexport interface SearchOpenedEvent extends SearchLedgerEventBase {\n kind: 'search-opened'\n /** What the search improves, for example `vb/coder`. */\n subject: string\n process: { name: string; executionRef: SearchSourceRef }\n artifactKind: SearchArtifactKind\n objective: {\n metric: string\n direction: 'maximize' | 'minimize'\n judge: SearchSourceRef | SearchUnknown\n claim: EvaluationClaim\n }\n splits: SearchSplits\n policy: { expansion: string; allocation: string; seed: number }\n budget: SearchBudget\n /** The cell attempt of another search whose execution runs this one. */\n containment: { searchId: string; cellId: string; attempt: number } | null\n /** The node of another search this one starts from. */\n derivedFrom: { searchId: string; nodeId: string; headHash: SearchLedgerHash } | null\n identity: SearchExecutionIdentity\n}\n\nexport interface SearchOperationStartedEvent extends SearchLedgerEventBase {\n kind: 'operation-started'\n operationId: string\n operationKind: SearchOperationKind\n reservation: SearchReservation | null\n}\n\nexport interface SearchOperationRecordedEvent extends SearchLedgerEventBase {\n kind: 'operation-recorded'\n operationId: string\n operationKind: SearchOperationKind\n execution:\n | {\n kind: 'model'\n model: SearchModelIdentity\n source: SearchSourceRef\n }\n | {\n kind: 'deterministic'\n source: SearchSourceRef\n }\n outcome:\n | { status: 'completed' }\n | { status: 'partial'; failure: SearchFailureReason }\n | { status: 'failed'; failure: SearchFailureReason }\n accounting: SearchAttemptAccounting\n}\n\n/** A content-addressed artifact enters the search. `nodeId` is\n * `searchNodeId(searchId, artifactDigest)`, so a re-proposal of identical\n * content is a second edge into this node, never a second node. */\nexport interface SearchNodeRegisteredEvent extends SearchLedgerEventBase {\n kind: 'node-registered'\n nodeId: string\n artifactDigest: SearchLedgerHash\n artifact: SearchArtifactRef\n surfaces: SearchCandidateSurface[]\n}\n\n/** The proposal that derived a node from its parents. */\nexport interface SearchEdgeRecordedEvent extends SearchLedgerEventBase {\n kind: 'edge-recorded'\n edgeId: string\n childNodeId: string\n /** Primary parent first. Empty for `seed` and for `unknown` attribution; a\n * parent in another search appears only on a `derive` edge. On a node's\n * first edge every parent was registered before the child. A later edge is a\n * re-proposal and may name the child itself or a node registered after it\n * (a proposal that changed nothing, or a revert); such a parent is not\n * lineage, so follow an edge for ancestry only through earlier parents. */\n parents: SearchNodeRef[]\n operator: SearchEdgeOperator\n attribution: SearchEdgeAttribution\n /** Null only on a `seed` edge: the search's starting artifact was not proposed. */\n proposer: SearchProposer | null\n /** Why the policy chose these parents. */\n selection: { rule: string; evidence: Record<string, number> } | null\n /** The proposer's redacted rationale. */\n rationale: SearchArtifactRef | SearchUnknown\n /** One diff per parent, parent to child. */\n diffs: Array<SearchArtifactRef | SearchUnknown>\n /** At most 200 characters, redacted. */\n label: string\n}\n\n/** One node on one task in one split at one repeat is planned. `cellId` is\n * `searchCellId(searchId, nodeId, taskId, split, rep)`. */\nexport interface SearchCellAllocatedEvent extends SearchLedgerEventBase {\n kind: 'cell-allocated'\n cellId: string\n nodeId: string\n taskId: string\n unitId: string\n split: SearchSplit\n rep: number\n stage: SearchCellStage\n lane: string | null\n /** Null when no reservation was made: an external optimizer dispatched the cell. */\n reservation: SearchReservation | null\n}\n\n/** One attempt at a cell finished. Its RunRecord, when the producer minted one,\n * is an artifact with role `run-record`. */\nexport interface SearchCellSettledEvent extends SearchLedgerEventBase {\n kind: 'cell-settled'\n cellId: string\n /** Counted from 1 without gaps. */\n attempt: number\n /** `searchCellRunId({ cellId, attempt })`. */\n runId: string\n outcome: SearchTaskOutcome\n accounting: SearchAttemptAccounting\n boxMinutes: number | null\n wallMs: number | null\n queueMs: number | null\n placement: { lane: string; boxId: string | null } | null\n identity: SearchExecutionIdentity\n surfaceEvidence: SearchSurfaceEvidence[]\n traceRef: SearchTraceRef\n}\n\nexport interface SearchCellCancelledEvent extends SearchLedgerEventBase {\n kind: 'cell-cancelled'\n cellId: string\n reason: SearchCancelReason\n}\n\n/** A policy, allocator or claim decision about a node. May repeat; the latest wins. */\nexport interface SearchNodeDecidedEvent extends SearchLedgerEventBase {\n kind: 'node-decided'\n nodeId: string\n decision: SearchNodeDecision\n basis: NodeEstimate | null\n rule: string\n reason: string\n}\n\n/** Last event, once. More work on a closed search is a derived search. */\nexport interface SearchClosedEvent extends SearchLedgerEventBase {\n kind: 'search-closed'\n reason: SearchCloseReason\n claim: SearchClaim | null\n}\n\nexport type SearchLedgerEvent =\n | SearchOpenedEvent\n | SearchOperationStartedEvent\n | SearchOperationRecordedEvent\n | SearchNodeRegisteredEvent\n | SearchEdgeRecordedEvent\n | SearchCellAllocatedEvent\n | SearchCellSettledEvent\n | SearchCellCancelledEvent\n | SearchNodeDecidedEvent\n | SearchClosedEvent\n\nexport interface SearchLedgerEntry {\n schema: typeof SEARCH_LEDGER_SCHEMA\n searchId: string\n sequence: number\n previousHash: SearchLedgerHash | null\n event: SearchLedgerEvent\n entryHash: SearchLedgerHash\n}\n\n/** Counts and sums over the whole search. Every field is a number or a short\n * scalar, so reading the audit costs the same at any search size. */\nexport interface SearchAudit {\n searchId: string\n eventCount: number\n headHash: SearchLedgerHash | null\n status: 'open' | 'closed'\n closeReason: SearchCloseReason | null\n nodes: number\n /** Nodes with no edge yet: not placed in the tree. */\n nodesWithoutEdge: number\n /** Nodes whose latest decision is missing or `advanced`. */\n undecidedNodes: number\n selectedNodeId: string | null\n edges: { explicit: number; correlated: number; unknown: number; reproposals: number }\n cells: { allocated: number; settled: number; cancelled: number; open: number }\n attempts: number\n outcomes: { passed: number; failed: number; errored: number }\n operations: { started: number; recorded: number; open: number }\n spend: {\n /** Sum of known cell and operation costs. */\n knownUsd: number\n /** Sum of the proven lower bounds of unknown costs. */\n floorUsd: number\n unknownCostCells: number\n unknownCostOperations: number\n /** knownUsd + floorUsd. */\n committedUsd: number\n /** Reservations of unsettled cells and unrecorded operations, net of their spend so far. */\n openReservationUsd: number\n /** Spend above reservations. */\n overspendUsd: number\n /** Settled cells that ran without a reservation. */\n unreservedCells: number\n boxMinutes: number\n }\n tokens: {\n inputTokens: number\n outputTokens: number\n cachedTokens: number\n unknownTokenAttempts: number\n }\n}\n","/**\n * Durable, append-only event log of one search: nodes (content-addressed\n * artifacts), edges (the proposals that derived them), cells (one run of one\n * node on one task), operations, decisions, and the claim.\n *\n * The ledger is the search's only lineage record and its only resume\n * checkpoint. A RunRecord owns one measured run and `CostLedger` owns per-call\n * accounting; this ledger binds them by digest instead of copying them.\n *\n * The file format is canonical JSONL with a SHA-256 hash chain. Every append is\n * serialized across processes, fsynced before acknowledgement, and idempotent\n * by `eventId`. A malformed, non-canonical, truncated, reordered, or conflicting\n * log fails loudly; a bad row is never skipped. A ledger written under another\n * schema tag is refused with that tag named, never translated.\n *\n * The journal machinery is the generic `ledger-core` journal. This module is\n * the search codec: event schemas and canonical ordering. `SearchState` is the\n * state machine and read model.\n */\n\nimport { z } from 'zod'\nimport { evaluationClaimSchema } from '../experiment/claim'\nimport {\n canonicalString,\n FileLedgerJournal,\n hashCanonical,\n type LedgerJournalCodec,\n type LedgerLineContext,\n type LedgerTextStore,\n type LedgerTrustedHead,\n type LedgerTrustedHeadRemoval,\n} from '../ledger-core'\nimport { MemoryLedgerJournal, replayLedgerText } from '../ledger-core/journal'\nimport { modelHasSnapshot } from '../run-record'\nimport {\n SearchLedgerConflictError,\n SearchLedgerError,\n SearchLedgerIntegrityError,\n} from './search-ledger-errors'\nimport { SEARCH_LEDGER_FILE_CONTEXT } from './search-ledger-file'\nimport { artifactKey, compareStrings } from './search-ledger-ordering'\nimport {\n SEARCH_LEDGER_SCHEMA,\n type SearchArtifactRef,\n type SearchLedgerEntry,\n type SearchLedgerEvent,\n type SearchTask,\n} from './search-ledger-types'\nimport { SearchState, type SearchStateView } from './search-state'\n\nexport { SearchLedgerConflictError, SearchLedgerError, SearchLedgerIntegrityError }\n\nconst NON_EMPTY = z\n .string()\n .min(1)\n .refine((value) => value.trim() === value, 'must not contain surrounding whitespace')\n\nconst HASH = z.string().regex(/^sha256:[a-f0-9]{64}$/)\n\nconst IMMUTABLE_REVISION = z\n .string()\n .regex(/^(?:[a-f0-9]{40}|[a-f0-9]{64}|sha256:[a-f0-9]{64}|sha512:[A-Za-z0-9+/=]+)$/)\n\nconst ISO_TIMESTAMP = z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$/)\n .refine((value) => Number.isFinite(Date.parse(value)), 'invalid timestamp')\n\nconst NON_NEGATIVE_INT = z.number().int().nonnegative().safe()\nconst POSITIVE_INT = z.number().int().positive().safe()\nconst FINITE_NUMBER = z.number().finite()\nconst USD = z.number().finite().nonnegative()\n\nconst NODE_ID = z.string().regex(/^node_[a-f0-9]{32}$/)\nconst CELL_ID = z.string().regex(/^cell_[a-f0-9]{32}$/)\n\nconst ArtifactRefSchema = z\n .object({ role: NON_EMPTY, uri: NON_EMPTY, sha256: HASH, byteLength: NON_NEGATIVE_INT })\n .strict()\n\nconst SourceRefSchema = z.object({ uri: NON_EMPTY, revision: IMMUTABLE_REVISION }).strict()\n\nconst UnknownRefSchema = z.object({ unknown: NON_EMPTY }).strict()\n\nconst FailureReasonSchema = z.object({ code: NON_EMPTY, message: NON_EMPTY }).strict()\n\nconst ModelIdentitySchema = z.union([\n z\n .object({\n provider: NON_EMPTY,\n snapshot: NON_EMPTY.refine(modelHasSnapshot, 'model must include an immutable snapshot'),\n })\n .strict(),\n z.object({ provider: NON_EMPTY, alias: NON_EMPTY, unknown: NON_EMPTY }).strict(),\n])\n\nconst ExecutionIdentitySchema = z\n .object({ model: ModelIdentitySchema, agent: SourceRefSchema, benchmark: SourceRefSchema })\n .strict()\n\nconst SURFACE_KINDS = [\n 'prompt',\n 'tool-contract',\n 'runtime-config',\n 'memory',\n 'knowledge',\n 'agent-profile',\n 'code',\n 'deployment',\n] as const\n\nconst SPLIT = z.enum(['train', 'selection', 'test'])\n\nconst ReservationSchema = z.object({ kind: z.enum(['hard', 'estimate']), usd: USD }).strict()\n\nconst EventBaseShape = {\n eventId: NON_EMPTY,\n occurredAt: ISO_TIMESTAMP,\n artifacts: z.array(ArtifactRefSchema),\n}\n\nconst OperationKindSchema = z.enum([\n 'candidate-generation',\n 'analysis',\n 'selection',\n 'judge',\n 'other',\n])\n\nconst KnownTokensSchema = z\n .object({\n status: z.literal('known'),\n inputTokens: NON_NEGATIVE_INT,\n outputTokens: NON_NEGATIVE_INT,\n cachedTokens: NON_NEGATIVE_INT,\n })\n .strict()\n\nconst UnknownTokensSchema = z.object({ status: z.literal('unknown'), reason: NON_EMPTY }).strict()\n\nconst KnownCostSchema = z\n .object({\n status: z.literal('known'),\n usd: USD,\n source: z.enum(['provider', 'pricing-table', 'free']),\n })\n .strict()\n .superRefine((cost, ctx) => {\n if (cost.source === 'free' && cost.usd !== 0) {\n ctx.addIssue({ code: 'custom', message: 'free cost source must have usd 0' })\n }\n })\n\nconst UnknownCostSchema = z\n .object({ status: z.literal('unknown'), knownLowerBoundUsd: USD, reason: NON_EMPTY })\n .strict()\n\nconst AccountingSchema = z\n .object({\n tokens: z.discriminatedUnion('status', [KnownTokensSchema, UnknownTokensSchema]),\n cost: z.discriminatedUnion('status', [KnownCostSchema, UnknownCostSchema]),\n })\n .strict()\n\nconst MetricsSchema = z.record(NON_EMPTY, FINITE_NUMBER).superRefine((metrics, ctx) => {\n for (const key of Object.keys(metrics)) {\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n ctx.addIssue({ code: 'custom', message: `unsafe metric key ${key}` })\n }\n }\n})\n\nconst OutcomeSchema = z.discriminatedUnion('status', [\n z.object({ status: z.literal('passed'), score: FINITE_NUMBER, metrics: MetricsSchema }).strict(),\n z\n .object({\n status: z.literal('failed'),\n score: FINITE_NUMBER,\n metrics: MetricsSchema,\n failure: FailureReasonSchema,\n })\n .strict(),\n z\n .object({\n status: z.literal('errored'),\n metrics: MetricsSchema,\n error: FailureReasonSchema.extend({ retryable: z.boolean() }).strict(),\n })\n .strict(),\n])\n\nconst EffectSchema = z.discriminatedUnion('status', [\n z\n .object({\n status: z.literal('measured'),\n metric: NON_EMPTY,\n baselineValue: FINITE_NUMBER,\n candidateValue: FINITE_NUMBER,\n delta: FINITE_NUMBER,\n })\n .strict()\n .superRefine((effect, ctx) => {\n const expected = effect.candidateValue - effect.baselineValue\n const tolerance = Number.EPSILON * Math.max(1, Math.abs(expected), Math.abs(effect.delta)) * 8\n if (Math.abs(effect.delta - expected) > tolerance) {\n ctx.addIssue({ code: 'custom', message: 'delta must equal candidateValue - baselineValue' })\n }\n }),\n z.object({ status: z.literal('not-measured'), reason: NON_EMPTY }).strict(),\n])\n\nconst SurfaceEvidenceSchema = z\n .object({\n surfaceId: NON_EMPTY,\n fired: z.boolean(),\n firingCount: NON_NEGATIVE_INT,\n effect: EffectSchema,\n evidence: z.array(ArtifactRefSchema).min(1),\n })\n .strict()\n .superRefine((evidence, ctx) => {\n if (evidence.fired !== evidence.firingCount > 0) {\n ctx.addIssue({ code: 'custom', message: 'fired must equal firingCount > 0' })\n }\n if (!evidence.fired && evidence.effect.status === 'measured' && evidence.effect.delta !== 0) {\n ctx.addIssue({ code: 'custom', message: 'a surface that did not fire has no effect' })\n }\n })\n\nconst TaskSchema = z\n .object({ taskId: NON_EMPTY, unitId: NON_EMPTY, source: SourceRefSchema })\n .strict()\n\nconst SplitTasksSchema = z.object({ taskSetDigest: HASH, tasks: z.array(TaskSchema) }).strict()\n\nconst SearchOpenedSchema = z\n .object({\n ...EventBaseShape,\n kind: z.literal('search-opened'),\n subject: NON_EMPTY,\n process: z.object({ name: NON_EMPTY, executionRef: SourceRefSchema }).strict(),\n artifactKind: z.enum([...SURFACE_KINDS, 'output']),\n objective: z\n .object({\n metric: NON_EMPTY,\n direction: z.enum(['maximize', 'minimize']),\n judge: z.union([SourceRefSchema, UnknownRefSchema]),\n claim: evaluationClaimSchema,\n })\n .strict(),\n splits: z\n .object({\n train: SplitTasksSchema,\n selection: SplitTasksSchema,\n test: SplitTasksSchema,\n heldOutUnits: z.boolean(),\n })\n .strict(),\n policy: z\n .object({ expansion: NON_EMPTY, allocation: NON_EMPTY, seed: z.number().int().safe() })\n .strict(),\n budget: z\n .object({\n maxUsd: USD.nullable(),\n maxCells: POSITIVE_INT.nullable(),\n maxNodes: POSITIVE_INT.nullable(),\n deadline: ISO_TIMESTAMP.nullable(),\n maxConcurrency: POSITIVE_INT.nullable(),\n reservedClaimUsd: USD,\n })\n .strict(),\n containment: z\n .object({ searchId: NON_EMPTY, cellId: CELL_ID, attempt: POSITIVE_INT })\n .strict()\n .nullable(),\n derivedFrom: z\n .object({ searchId: NON_EMPTY, nodeId: NODE_ID, headHash: HASH })\n .strict()\n .nullable(),\n identity: ExecutionIdentitySchema,\n })\n .strict()\n\nconst OperationStartedSchema = z\n .object({\n ...EventBaseShape,\n kind: z.literal('operation-started'),\n operationId: NON_EMPTY,\n operationKind: OperationKindSchema,\n reservation: ReservationSchema.nullable(),\n })\n .strict()\n\nconst OperationRecordedSchema = z\n .object({\n ...EventBaseShape,\n kind: z.literal('operation-recorded'),\n operationId: NON_EMPTY,\n operationKind: OperationKindSchema,\n execution: z.discriminatedUnion('kind', [\n z\n .object({ kind: z.literal('model'), model: ModelIdentitySchema, source: SourceRefSchema })\n .strict(),\n z.object({ kind: z.literal('deterministic'), source: SourceRefSchema }).strict(),\n ]),\n outcome: z.discriminatedUnion('status', [\n z.object({ status: z.literal('completed') }).strict(),\n z.object({ status: z.literal('partial'), failure: FailureReasonSchema }).strict(),\n z.object({ status: z.literal('failed'), failure: FailureReasonSchema }).strict(),\n ]),\n accounting: AccountingSchema,\n })\n .strict()\n\nconst NodeRegisteredSchema = z\n .object({\n ...EventBaseShape,\n kind: z.literal('node-registered'),\n nodeId: NODE_ID,\n artifactDigest: HASH,\n artifact: ArtifactRefSchema,\n surfaces: z.array(\n z\n .object({ surfaceId: NON_EMPTY, kind: z.enum(SURFACE_KINDS), artifact: ArtifactRefSchema })\n .strict(),\n ),\n })\n .strict()\n\nconst NodeRefSchema = z.object({ searchId: NON_EMPTY, nodeId: NODE_ID }).strict()\n\nconst ArtifactOrUnknownSchema = z.union([ArtifactRefSchema, UnknownRefSchema])\n\nconst EdgeRecordedSchema = z\n .object({\n ...EventBaseShape,\n kind: z.literal('edge-recorded'),\n edgeId: z.string().regex(/^edge_[a-f0-9]{32}$/),\n childNodeId: NODE_ID,\n parents: z.array(NodeRefSchema),\n operator: z.enum(['seed', 'draft', 'improve', 'debug', 'merge', 'derive']),\n attribution: z.enum(['explicit', 'correlated', 'unknown']),\n proposer: z\n .object({\n kind: z.enum(['trace', 'frontier-author', 'human', 'optimizer', 'compound']),\n name: NON_EMPTY,\n operationId: NON_EMPTY.nullable(),\n source: SourceRefSchema,\n })\n .strict()\n .nullable(),\n selection: z\n .object({ rule: NON_EMPTY, evidence: z.record(NON_EMPTY, FINITE_NUMBER) })\n .strict()\n .nullable(),\n rationale: ArtifactOrUnknownSchema,\n diffs: z.array(ArtifactOrUnknownSchema),\n label: z.string(),\n })\n .strict()\n\nconst CellAllocatedSchema = z\n .object({\n ...EventBaseShape,\n kind: z.literal('cell-allocated'),\n cellId: CELL_ID,\n nodeId: NODE_ID,\n taskId: NON_EMPTY,\n unitId: NON_EMPTY,\n split: SPLIT,\n rep: NON_NEGATIVE_INT,\n stage: z.enum(['root', 'train', 'screen', 'rung', 'claim', 'external']),\n lane: NON_EMPTY.nullable(),\n reservation: ReservationSchema.nullable(),\n })\n .strict()\n\nconst TraceRefSchema = z.union([\n z\n .object({\n traceId: NON_EMPTY,\n execRunId: NON_EMPTY.nullable(),\n spansWritten: NON_NEGATIVE_INT.nullable(),\n spansDropped: NON_NEGATIVE_INT.nullable(),\n })\n .strict(),\n UnknownRefSchema,\n])\n\nconst NON_NEGATIVE = z.number().finite().nonnegative()\n\nconst CellSettledSchema = z\n .object({\n ...EventBaseShape,\n kind: z.literal('cell-settled'),\n cellId: CELL_ID,\n attempt: POSITIVE_INT,\n runId: NON_EMPTY,\n outcome: OutcomeSchema,\n accounting: AccountingSchema,\n boxMinutes: NON_NEGATIVE.nullable(),\n wallMs: NON_NEGATIVE.nullable(),\n queueMs: NON_NEGATIVE.nullable(),\n placement: z.object({ lane: NON_EMPTY, boxId: NON_EMPTY.nullable() }).strict().nullable(),\n identity: ExecutionIdentitySchema,\n surfaceEvidence: z.array(SurfaceEvidenceSchema),\n traceRef: TraceRefSchema,\n })\n .strict()\n\nconst CellCancelledSchema = z\n .object({\n ...EventBaseShape,\n kind: z.literal('cell-cancelled'),\n cellId: CELL_ID,\n reason: z.enum(['pruned', 'budget', 'deadline', 'aborted']),\n })\n .strict()\n\nconst NodeEstimateSchema = z\n .object({\n against: NODE_ID,\n split: SPLIT,\n units: NON_NEGATIVE_INT,\n pairs: NON_NEGATIVE_INT,\n delta: FINITE_NUMBER.nullable(),\n interval: z.tuple([FINITE_NUMBER, FINITE_NUMBER]).nullable(),\n method: z.enum(['none', 'insufficient', 'descriptive', 'bootstrap']),\n exactSignP: z.number().min(0).max(1).nullable(),\n indeterminate: z.boolean(),\n cellSetDigest: HASH,\n estimator: SourceRefSchema,\n })\n .strict()\n\nconst NodeDecidedSchema = z\n .object({\n ...EventBaseShape,\n kind: z.literal('node-decided'),\n nodeId: NODE_ID,\n decision: z.discriminatedUnion('status', [\n z.object({ status: z.literal('advanced'), rung: NON_NEGATIVE_INT }).strict(),\n z.object({ status: z.literal('pruned') }).strict(),\n z.object({ status: z.literal('invalid') }).strict(),\n z.object({ status: z.literal('finalist') }).strict(),\n z.object({ status: z.literal('selected') }).strict(),\n z.object({ status: z.literal('rejected') }).strict(),\n ]),\n basis: NodeEstimateSchema.nullable(),\n rule: NON_EMPTY,\n reason: NON_EMPTY,\n })\n .strict()\n\nconst CONFIDENCE = z.number().gt(0).lt(1)\n\nconst ClaimEstimatorSchema = z.discriminatedUnion('kind', [\n z.object({ kind: z.literal('continuous') }).strict(),\n z.object({ kind: z.literal('binary'), scale: z.number().finite().positive() }).strict(),\n])\n\nconst ClaimSchema = z\n .object({\n rule: SourceRefSchema,\n confidence: CONFIDENCE,\n power: z.union([\n z\n .object({\n adequate: z.boolean(),\n minimumEffect: z.number().finite().positive(),\n powerAtMinimumEffect: z.number().min(0).max(1),\n targetPower: z.number().gt(0).max(1),\n units: NON_NEGATIVE_INT,\n finalists: POSITIVE_INT,\n pooledVariance: z.number().finite().nonnegative(),\n estimator: ClaimEstimatorSchema,\n })\n .strict(),\n UnknownRefSchema,\n ]),\n finalists: z.array(\n z\n .object({\n nodeId: NODE_ID,\n estimate: NodeEstimateSchema.nullable(),\n test: z\n .object({\n pairs: NON_NEGATIVE_INT,\n confidence: CONFIDENCE,\n method: z.enum(['score-interval', 'bootstrap-ci', 'exact-sign']),\n delta: FINITE_NUMBER,\n interval: z.tuple([FINITE_NUMBER, FINITE_NUMBER]),\n })\n .strict()\n .nullable(),\n promote: z.boolean(),\n })\n .strict(),\n ),\n selected: NODE_ID.nullable(),\n decision: z.enum(['ship', 'hold', 'test-cannot-resolve']),\n reason: NON_EMPTY,\n })\n .strict()\n\nconst SearchClosedSchema = z\n .object({\n ...EventBaseShape,\n kind: z.literal('search-closed'),\n reason: z.enum(['budget', 'deadline', 'max-nodes', 'patience', 'converged', 'aborted']),\n claim: ClaimSchema.nullable(),\n })\n .strict()\n\nconst EventSchema = z.discriminatedUnion('kind', [\n SearchOpenedSchema,\n OperationStartedSchema,\n OperationRecordedSchema,\n NodeRegisteredSchema,\n EdgeRecordedSchema,\n CellAllocatedSchema,\n CellSettledSchema,\n CellCancelledSchema,\n NodeDecidedSchema,\n SearchClosedSchema,\n])\n\nconst EntrySchema = z\n .object({\n schema: z.literal(SEARCH_LEDGER_SCHEMA),\n searchId: NON_EMPTY,\n sequence: NON_NEGATIVE_INT,\n previousHash: z.union([HASH, z.null()]),\n event: EventSchema,\n entryHash: HASH,\n })\n .strict()\n\n/** Validate and return a canonical copy. Arrays whose order carries no meaning\n * are sorted, so retries from different processes produce identical bytes. */\nexport function validateSearchLedgerEvent(input: unknown): SearchLedgerEvent {\n const parsed = EventSchema.safeParse(input)\n if (!parsed.success) {\n throw new SearchLedgerError(`invalid search ledger event: ${formatZodError(parsed.error)}`)\n }\n return normalizeEvent(parsed.data as SearchLedgerEvent)\n}\n\n/**\n * How this ledger uses its trusted head — the `(sequence, entryHash)` pin kept\n * in the sibling `<path>.head` file that a hash chain needs to prove entries\n * were not deleted from the end. `ledger-core/trusted-head.ts` holds the threat\n * model.\n *\n * - `pin` (default): every append records the new head, and a pin that is\n * present is verified on every read.\n * - `require`: additionally refuses to read a non-empty ledger whose pin is\n * gone, so deleting the sibling file cannot downgrade the guarantee.\n * - `off`: chain verification only. Truncation to a valid shorter prefix is\n * undetectable.\n */\nexport type SearchLedgerTrustedHeadMode = 'pin' | 'require' | 'off'\n\nexport interface OpenSearchLedgerOptions {\n path: string\n searchId: string\n trustedHead?: SearchLedgerTrustedHeadMode\n /**\n * Keep the ledger's text in this in-process store instead of a file, for a\n * run without a filesystem (an in-memory `CampaignStorage`, keyed by `path`).\n * The chain, parse and state rules are the file ledger's; there is no lock,\n * fsync or trusted head, and the ledger lives as long as the store.\n */\n store?: LedgerTextStore\n}\n\nexport interface SearchLedgerAppendResult {\n entry: SearchLedgerEntry\n /** False when the exact event was already durably present. */\n appended: boolean\n state: SearchStateView\n}\n\nexport interface SearchLedger {\n readonly path: string\n readonly searchId: string\n /** Sibling file holding this ledger's trusted head. */\n readonly trustedHeadPath: string\n append(event: SearchLedgerEvent): Promise<SearchLedgerAppendResult>\n /** The verified state at the file's current head. */\n state(): Promise<SearchStateView>\n /** The pinned head, or null when this ledger has never been pinned. */\n trustedHead(): Promise<LedgerTrustedHead | null>\n /** Pin the current verified head without rewriting a byte. */\n pinTrustedHead(): Promise<LedgerTrustedHead>\n /** Discard this ledger's pin, reporting what was discarded. It gives up the\n * deletion guarantee for every entry the pin covered. */\n clearTrustedHead(): Promise<LedgerTrustedHeadRemoval>\n}\n\n/** Open a durable filesystem search ledger. Construction performs no I/O; the\n * first `append` or `state` verifies the whole existing file. */\nexport function openSearchLedger(options: OpenSearchLedgerOptions): SearchLedger {\n if (options.store) return new MemorySearchLedger(options.path, options.searchId, options.store)\n return new FileSearchLedger(options.path, options.searchId, options.trustedHead)\n}\n\n/** Verify and project immutable search-ledger JSONL through the same codec as\n * `FileSearchLedger`. */\nexport function replaySearchLedgerText(\n text: string,\n searchId: string,\n source: string,\n): SearchStateView {\n return replayLedgerText(text, source, searchLedgerCodec(searchId))\n}\n\n/**\n * Verify one stored ledger line in isolation: the schema tag, the entry and\n * event schemas, canonical bytes, the entry's own hash, and its search. The\n * chain (sequence and previous hash) and the state machine are the caller's,\n * because they need the lines before this one. An ingest server runs this on\n * every received line, so it hashes exactly the bytes the producer hashed.\n */\nexport function parseSearchLedgerLine(\n line: string,\n searchId: string,\n context: LedgerLineContext,\n): SearchLedgerEntry {\n let raw: unknown\n try {\n raw = JSON.parse(line)\n } catch (error) {\n throw new SearchLedgerIntegrityError(\n `search ledger ${context.path} has invalid JSON at line ${context.line}`,\n { cause: error },\n )\n }\n const entry = parseSearchLedgerEntry(raw, context)\n if (entry.searchId !== searchId) {\n throw new SearchLedgerIntegrityError(\n `search ledger ${context.path} line ${context.line} belongs to search ${entry.searchId}, expected ${searchId}`,\n )\n }\n if (canonicalString(entry) !== line) {\n throw new SearchLedgerIntegrityError(\n `search ledger ${context.path} has non-canonical bytes at line ${context.line}`,\n )\n }\n const { entryHash, ...material } = entry\n const expected = hashCanonical(material)\n if (entryHash !== expected) {\n throw new SearchLedgerIntegrityError(\n `search ledger ${context.path} line ${context.line} hash mismatch: expected ${expected}, got ${entryHash}`,\n )\n }\n return entry\n}\n\ninterface SearchLedgerHeader {\n schema: typeof SEARCH_LEDGER_SCHEMA\n searchId: string\n}\n\nfunction searchLedgerCodec(\n searchId: string,\n): LedgerJournalCodec<SearchLedgerHeader, SearchLedgerEvent, SearchStateView> {\n return {\n ...SEARCH_LEDGER_FILE_CONTEXT,\n header: { schema: SEARCH_LEDGER_SCHEMA, searchId },\n conflictError: (message) => new SearchLedgerConflictError(message),\n parseEntry: parseSearchLedgerEntry,\n checkEntryHeader: (entry, index) => {\n if (entry.searchId !== searchId) {\n throw new SearchLedgerIntegrityError(\n `entry ${index} belongs to search ${entry.searchId}, expected ${searchId}`,\n )\n }\n },\n createProjector: () => new SearchState(searchId),\n }\n}\n\n/** Append-only file-backed search ledger with idempotent writes. */\nexport class FileSearchLedger implements SearchLedger {\n readonly path: string\n readonly searchId: string\n readonly trustedHeadPath: string\n private readonly trustedHeadMode: SearchLedgerTrustedHeadMode\n private readonly journal: FileLedgerJournal<\n SearchLedgerHeader,\n SearchLedgerEvent,\n SearchStateView\n >\n\n constructor(path: string, searchId: string, trustedHead: SearchLedgerTrustedHeadMode = 'pin') {\n if (path.trim().length === 0) throw new SearchLedgerError('ledger path is empty')\n if (searchId.length === 0 || searchId.trim() !== searchId) {\n throw new SearchLedgerError('searchId must be non-empty without surrounding whitespace')\n }\n this.searchId = searchId\n this.trustedHeadMode = trustedHead\n this.journal = new FileLedgerJournal(path, searchLedgerCodec(searchId), {\n requireTrustedHead: trustedHead === 'require',\n })\n this.path = this.journal.path\n this.trustedHeadPath = this.journal.trustedHeadPath\n }\n\n async state(): Promise<SearchStateView> {\n return this.journal.replay()\n }\n\n async append(input: SearchLedgerEvent): Promise<SearchLedgerAppendResult> {\n // Normalize before the journal hashes the event so retries from different\n // processes produce byte-identical entries.\n const event = validateSearchLedgerEvent(input)\n const { entry, appended, projection } = await this.journal.append(event, {\n pinHead: this.trustedHeadMode !== 'off',\n })\n return { entry, appended, state: projection }\n }\n\n async trustedHead(): Promise<LedgerTrustedHead | null> {\n return this.journal.trustedHead()\n }\n\n async pinTrustedHead(): Promise<LedgerTrustedHead> {\n return this.journal.pinTrustedHead()\n }\n\n async clearTrustedHead(): Promise<LedgerTrustedHeadRemoval> {\n return this.journal.clearTrustedHead()\n }\n}\n\n/** A search ledger held in an in-process text store. */\nclass MemorySearchLedger implements SearchLedger {\n readonly path: string\n readonly searchId: string\n readonly trustedHeadPath: string\n private readonly journal: MemoryLedgerJournal<\n SearchLedgerHeader,\n SearchLedgerEvent,\n SearchStateView\n >\n\n constructor(path: string, searchId: string, store: LedgerTextStore) {\n if (path.trim().length === 0) throw new SearchLedgerError('ledger path is empty')\n if (searchId.length === 0 || searchId.trim() !== searchId) {\n throw new SearchLedgerError('searchId must be non-empty without surrounding whitespace')\n }\n this.path = path\n this.searchId = searchId\n this.trustedHeadPath = `${path}.head`\n this.journal = new MemoryLedgerJournal(path, searchLedgerCodec(searchId), store)\n }\n\n async state(): Promise<SearchStateView> {\n return this.journal.replay()\n }\n\n async append(input: SearchLedgerEvent): Promise<SearchLedgerAppendResult> {\n const { entry, appended, projection } = await this.journal.append(\n validateSearchLedgerEvent(input),\n )\n return { entry, appended, state: projection }\n }\n\n async trustedHead(): Promise<LedgerTrustedHead | null> {\n return null\n }\n\n async pinTrustedHead(): Promise<LedgerTrustedHead> {\n throw new SearchLedgerError(\n `search ledger ${this.path} is held in memory; a trusted head protects only a file`,\n )\n }\n\n async clearTrustedHead(): Promise<LedgerTrustedHeadRemoval> {\n return { removed: false }\n }\n}\n\nfunction parseSearchLedgerEntry(raw: unknown, context: LedgerLineContext): SearchLedgerEntry {\n const schema = (raw as { schema?: unknown } | null)?.schema\n if (schema !== SEARCH_LEDGER_SCHEMA) {\n throw new SearchLedgerIntegrityError(\n `search ledger ${context.path} line ${context.line} was written under schema ${JSON.stringify(schema)}; this version reads only ${SEARCH_LEDGER_SCHEMA} and does not translate other formats`,\n )\n }\n const parsed = EntrySchema.safeParse(raw)\n if (!parsed.success) {\n throw new SearchLedgerIntegrityError(\n `search ledger ${context.path} has a malformed entry at line ${context.line}: ${formatZodError(parsed.error)}`,\n )\n }\n const entry = parsed.data as SearchLedgerEntry\n const normalizedEvent = validateSearchLedgerEvent(entry.event)\n if (canonicalString(normalizedEvent) !== canonicalString(entry.event)) {\n throw new SearchLedgerIntegrityError(\n `search ledger ${context.path} has non-canonical event ordering at line ${context.line}`,\n )\n }\n return entry\n}\n\nfunction normalizeEvent(event: SearchLedgerEvent): SearchLedgerEvent {\n const artifacts = sortArtifacts(event.artifacts)\n switch (event.kind) {\n case 'search-opened':\n return {\n ...event,\n artifacts,\n splits: {\n ...event.splits,\n train: { ...event.splits.train, tasks: sortTasks(event.splits.train.tasks) },\n selection: { ...event.splits.selection, tasks: sortTasks(event.splits.selection.tasks) },\n test: { ...event.splits.test, tasks: sortTasks(event.splits.test.tasks) },\n },\n }\n case 'node-registered':\n return {\n ...event,\n artifacts,\n surfaces: [...event.surfaces].sort((a, b) => compareStrings(a.surfaceId, b.surfaceId)),\n }\n case 'cell-settled':\n return {\n ...event,\n artifacts,\n surfaceEvidence: [...event.surfaceEvidence]\n .map((evidence) => ({ ...evidence, evidence: sortArtifacts(evidence.evidence) }))\n .sort((a, b) => compareStrings(a.surfaceId, b.surfaceId)),\n }\n default:\n return { ...event, artifacts }\n }\n}\n\nfunction sortTasks(tasks: SearchTask[]): SearchTask[] {\n return [...tasks].sort((a, b) => compareStrings(a.taskId, b.taskId))\n}\n\nfunction sortArtifacts(artifacts: SearchArtifactRef[]): SearchArtifactRef[] {\n return [...artifacts].sort((a, b) => compareStrings(artifactKey(a), artifactKey(b)))\n}\n\nfunction formatZodError(error: z.ZodError): string {\n return error.issues\n .map((issue) => `${issue.path.length > 0 ? issue.path.join('.') : '<root>'}: ${issue.message}`)\n .join('; ')\n}\n\nexport type * from './search-ledger-types'\nexport { SEARCH_LEDGER_SCHEMA }\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { s as ValidationError } from "./errors-Dngq5h35.js";
2
- import { l as appendLedgerLine, u as tryWithLedgerFileLock } from "./journal-DvKCvjty.js";
3
- import "./ledger-core-B2hahzrt.js";
1
+ import { s as ValidationError } from "./errors-BcOs5MKW.js";
2
+ import { c as tryWithLedgerFileLock, s as appendLedgerLine } from "./journal-CR4QikYp.js";
3
+ import "./ledger-core-DrJhbms9.js";
4
4
  //#region src/campaign/search-ledger-errors.ts
5
5
  /** Base error for invalid search-ledger input or operations. */
6
6
  var SearchLedgerError = class extends ValidationError {};
@@ -24,4 +24,4 @@ function tryWithSearchLedgerFileLock(ledgerPath, run) {
24
24
  //#endregion
25
25
  export { SearchLedgerError as a, SearchLedgerConflictError as i, appendSearchLedgerLine as n, SearchLedgerIntegrityError as o, tryWithSearchLedgerFileLock as r, SEARCH_LEDGER_FILE_CONTEXT as t };
26
26
 
27
- //# sourceMappingURL=search-ledger-file-BqOo-bVo.js.map
27
+ //# sourceMappingURL=search-ledger-file-UKCO2r8a.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-ledger-file-UKCO2r8a.js","names":[],"sources":["../src/campaign/search-ledger-errors.ts","../src/campaign/search-ledger-file.ts"],"sourcesContent":["import { ValidationError } from '../errors'\n\n/** Base error for invalid search-ledger input or operations. */\nexport class SearchLedgerError extends ValidationError {}\n\n/** Error raised when durable search-ledger data fails an integrity check. */\nexport class SearchLedgerIntegrityError extends SearchLedgerError {}\n\n/** Error raised when an event identifier is reused with different content. */\nexport class SearchLedgerConflictError extends SearchLedgerError {}\n","/** Campaign binding of the generic journal file layer to search-ledger errors. */\n\nimport { appendLedgerLine } from '../ledger-core/journal-file'\nimport {\n type FileLockResult,\n type LedgerFileContext,\n tryWithLedgerFileLock,\n} from '../ledger-core'\nimport { SearchLedgerIntegrityError } from './search-ledger-errors'\n\nexport const SEARCH_LEDGER_FILE_CONTEXT: LedgerFileContext = {\n subject: 'search ledger',\n integrityError: (message, options) => new SearchLedgerIntegrityError(message, options),\n}\n\nexport function appendSearchLedgerLine(path: string, line: string): void {\n appendLedgerLine(path, line, SEARCH_LEDGER_FILE_CONTEXT)\n}\n\n\n\nexport type { FileLockResult }\n\nexport function tryWithSearchLedgerFileLock<T>(\n ledgerPath: string,\n run: () => T,\n): FileLockResult<T> {\n return tryWithLedgerFileLock(ledgerPath, SEARCH_LEDGER_FILE_CONTEXT, run)\n}\n"],"mappings":";;;;;AAGA,IAAa,oBAAb,cAAuC,gBAAgB,CAAC;;AAGxD,IAAa,6BAAb,cAAgD,kBAAkB,CAAC;;AAGnE,IAAa,4BAAb,cAA+C,kBAAkB,CAAC;;;;ACClE,MAAa,6BAAgD;CAC3D,SAAS;CACT,iBAAiB,SAAS,YAAY,IAAI,2BAA2B,SAAS,OAAO;AACvF;AAEA,SAAgB,uBAAuB,MAAc,MAAoB;CACvE,iBAAiB,MAAM,MAAM,0BAA0B;AACzD;AAMA,SAAgB,4BACd,YACA,KACmB;CACnB,OAAO,sBAAsB,YAAY,4BAA4B,GAAG;AAC1E"}
@@ -1 +1 @@
1
- {"version":3,"file":"search-ledger-types-p2xKfiDJ.d.ts","names":[],"sources":["../src/experiment/claim.ts","../src/campaign/search-ledger-types.ts"],"mappings":"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"}
1
+ {"version":3,"file":"search-ledger-types-p2xKfiDJ.d.ts","names":[],"sources":["../src/experiment/claim.ts","../src/campaign/search-ledger-types.ts"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { o as SearchLedgerIntegrityError } from "./search-ledger-file-BqOo-bVo.js";
2
- import { r as parseSearchLedgerLine } from "./search-ledger-d7V8o9Lk.js";
1
+ import { o as SearchLedgerIntegrityError } from "./search-ledger-file-UKCO2r8a.js";
2
+ import { r as parseSearchLedgerLine } from "./search-ledger-TUvB5gWH.js";
3
3
  import { createHash } from "node:crypto";
4
4
  import { z } from "zod";
5
5
  import { fileURLToPath } from "node:url";
@@ -773,6 +773,6 @@ async function shipBestEffort(ship, ledgerPath) {
773
773
  }
774
774
  }
775
775
  //#endregion
776
- export { TraceSpanEventSchema as C, IngestTracesRequestSchema as S, HOSTED_WIRE_VERSION as T, admitSearchLedgerBatch as _, HostedRequestError as a, searchLedgerHeadPath as b, hostedTenantFromEnv as c, SEARCH_LEDGER_BATCH_MAX_LINES as d, SEARCH_LEDGER_INGEST_PATH as f, SearchRunKindSchema as g, SearchLedgerHeadSchema as h, startSearchShipper as i, IngestSearchLedgerRequestSchema as l, SearchLedgerConflictSchema as m, shipBestEffort as n, createHostedClient as o, SearchBlobPutResponseSchema as p, shipSearchLedger as r, hostedClientFromEnv as s, SearchShipConflictError as t, SEARCH_LEDGER_BATCH_MAX_BYTES as u, searchBlobPath as v, UnixNanoTimestampSchema as w, IngestResponseSchema as x, searchLedgerArtifactRefs as y };
776
+ export { IngestTracesRequestSchema as _, createHostedClient as a, HOSTED_WIRE_VERSION as b, IngestSearchLedgerRequestSchema as c, SearchBlobPutResponseSchema as d, SearchLedgerConflictSchema as f, IngestResponseSchema as g, admitSearchLedgerBatch as h, startSearchShipper as i, SEARCH_LEDGER_BATCH_MAX_BYTES as l, SearchRunKindSchema as m, shipBestEffort as n, hostedClientFromEnv as o, SearchLedgerHeadSchema as p, shipSearchLedger as r, hostedTenantFromEnv as s, SearchShipConflictError as t, SEARCH_LEDGER_INGEST_PATH as u, TraceSpanEventSchema as v, UnixNanoTimestampSchema as y };
777
777
 
778
- //# sourceMappingURL=search-shipper-er4pK5_Y.js.map
778
+ //# sourceMappingURL=search-shipper-Cw2z3-td.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-shipper-Cw2z3-td.js","names":[],"sources":["../src/hosted/types.ts","../src/hosted/schemas.ts","../src/hosted/search-ledger-wire.ts","../src/hosted/client.ts","../src/hosted/search-shipper.ts"],"sourcesContent":["/**\n * # Hosted-tier wire format: the shapes every orchestrator (ours, a partner's\n * self-hosted one, a future open implementation) must accept.\n *\n * This package implements exactly one wire version. Servers reject every\n * other version instead of translating old payloads.\n *\n * The wire carries two streams in one transport:\n *\n * 1. **Search ledgers** (`/v1/search-blobs/*`, `/v1/ingest/search-ledger`).\n * A producer ships a search's hash-chained ledger lines and the blobs\n * they name; `./search-ledger-wire.ts` owns those shapes.\n *\n * 2. **Trace spans** (`POST /v1/ingest/traces`). Standard OTLP-shaped\n * spans with a few additional attributes so the orchestrator can\n * pivot from a search cell to its underlying execution. Compatible\n * with any OTel collector.\n *\n * Every endpoint is authenticated with a bearer token and a tenant id\n * header. Tenants isolate everything downstream of ingest; no tenant\n * ever sees another tenant's data.\n */\n\nexport const HOSTED_WIRE_VERSION = '2026-07-24.v1' as const\nexport type HostedWireVersion = typeof HOSTED_WIRE_VERSION\n\n// ── Transport headers ───────────────────────────────────────────────\n\n/** Every ingest request carries these. */\nexport interface HostedIngestHeaders {\n /** Bearer token. The orchestrator validates against the tenant key. */\n authorization: `Bearer ${string}`\n /** Stable tenant id (the orchestrator-side primary key for the tenant). */\n 'x-tangle-tenant-id': string\n /** Wire-version pin so the server can reject incompatible payloads. */\n 'x-tangle-wire-version': HostedWireVersion\n /** Stable request key generated once and reused across retries. */\n 'idempotency-key': string\n}\n\n// ── Trace span event ────────────────────────────────────────────────\n\n/**\n * Canonical unsigned 64-bit integer encoded as a base-10 string.\n * JSON numbers cannot represent OTLP nanosecond timestamps exactly.\n */\nexport type UnixNanoTimestamp = string\n\n/**\n * OTel-shape span with a few additional attributes for pivoting.\n * Compatible with any OTLP collector — `name`, `traceId`, `spanId`,\n * `startTimeUnixNano`, `endTimeUnixNano`, `attributes` are stock OTel.\n */\nexport interface TraceSpanEvent {\n traceId: string\n spanId: string\n parentSpanId?: string\n name: string\n startTimeUnixNano: UnixNanoTimestamp\n endTimeUnixNano: UnixNanoTimestamp\n attributes: Record<string, string | number | boolean>\n events?: Array<{\n timeUnixNano: UnixNanoTimestamp\n name: string\n attributes?: Record<string, string | number | boolean>\n }>\n status?: { code: 'OK' | 'ERROR' | 'UNSET'; message?: string }\n /** Pivot to the producing run. */\n 'tangle.runId'?: string\n /** Pivot to the specific generation. */\n 'tangle.generation'?: number\n /** Pivot to the specific cell. */\n 'tangle.cellId'?: string\n /** Pivot to the specific scenario. */\n 'tangle.scenarioId'?: string\n}\n\n// ── Ingest request bodies ───────────────────────────────────────────\n\nexport interface IngestTracesRequest {\n wireVersion: HostedWireVersion\n spans: TraceSpanEvent[]\n}\n\nexport interface IngestResponse {\n /** Accepted spans count. */\n accepted: number\n /** Rejected spans with reasons (validation failures, conflicting identity). */\n rejected: Array<{ index: number; reason: string }>\n}\n","import { z } from 'zod'\nimport type {\n IngestResponse,\n IngestTracesRequest,\n TraceSpanEvent,\n UnixNanoTimestamp,\n} from './types'\nimport { HOSTED_WIRE_VERSION } from './types'\n\nconst finiteNumber = z.number().finite()\nconst nonNegativeInteger = z.number().int().nonnegative()\nconst nonEmptyString = z\n .string()\n .min(1)\n .refine((value) => value.trim().length > 0, 'must not be blank')\nconst attributeValue = z.union([z.string(), finiteNumber, z.boolean()])\nconst attributes = z.record(z.string(), attributeValue)\nconst UINT64_MAX = 18_446_744_073_709_551_615n\n\nexport const UnixNanoTimestampSchema: z.ZodType<UnixNanoTimestamp> = z\n .string()\n .regex(/^(0|[1-9][0-9]*)$/, 'expected an unsigned base-10 integer string')\n .refine((value) => BigInt(value) <= UINT64_MAX, 'must fit in an unsigned 64-bit integer')\n\nconst TraceSpanEventEntrySchema = z\n .object({\n timeUnixNano: UnixNanoTimestampSchema,\n name: nonEmptyString,\n attributes: attributes.optional(),\n })\n .strict()\n\nexport const TraceSpanEventSchema: z.ZodType<TraceSpanEvent> = z\n .object({\n traceId: nonEmptyString,\n spanId: nonEmptyString,\n parentSpanId: nonEmptyString.optional(),\n name: nonEmptyString,\n startTimeUnixNano: UnixNanoTimestampSchema,\n endTimeUnixNano: UnixNanoTimestampSchema,\n attributes,\n events: z.array(TraceSpanEventEntrySchema).optional(),\n status: z\n .object({\n code: z.enum(['OK', 'ERROR', 'UNSET']),\n message: z.string().optional(),\n })\n .strict()\n .optional(),\n 'tangle.runId': nonEmptyString.optional(),\n 'tangle.generation': nonNegativeInteger.optional(),\n 'tangle.cellId': nonEmptyString.optional(),\n 'tangle.scenarioId': nonEmptyString.optional(),\n })\n .strict()\n .refine((span) => BigInt(span.endTimeUnixNano) >= BigInt(span.startTimeUnixNano), {\n path: ['endTimeUnixNano'],\n message: 'endTimeUnixNano must be greater than or equal to startTimeUnixNano',\n })\n\nexport const IngestTracesEnvelopeSchema = z\n .object({\n wireVersion: z.literal(HOSTED_WIRE_VERSION),\n spans: z.array(z.unknown()),\n })\n .strict()\n\nexport const IngestTracesRequestSchema: z.ZodType<IngestTracesRequest> = z\n .object({\n wireVersion: z.literal(HOSTED_WIRE_VERSION),\n spans: z.array(TraceSpanEventSchema),\n })\n .strict()\n\nexport const IngestResponseSchema: z.ZodType<IngestResponse> = z\n .object({\n accepted: nonNegativeInteger,\n rejected: z.array(\n z\n .object({\n index: nonNegativeInteger,\n reason: nonEmptyString,\n })\n .strict(),\n ),\n })\n .strict()\n","/**\n * The search-ledger wire: how a producer ships a search ledger to a hosted\n * store, and the rule a store applies to each batch.\n *\n * A producer ships three things, in this order:\n *\n * 1. Blobs: `PUT /v1/search-blobs/<sha256 hex>` with the exact bytes an\n * entry's artifact ref names. The store re-hashes them; the call is\n * idempotent by content.\n * 2. Head: `GET /v1/ingest/search-ledger/<searchId>/head` tells a restarted\n * producer where the store's copy of the chain ends.\n * 3. Entries: `POST /v1/ingest/search-ledger` with canonical ledger lines,\n * starting at `fromSequence`. The store verifies every line, links it to\n * its stored head, and answers with its new head.\n *\n * The lines are the ledger's own bytes, so producer and store hash identical\n * input. A line below the store's head with an equal hash is a no-op; a\n * different hash is a fork (`409 chain_conflict`); a batch that starts past\n * the head is a gap (`409 sequence_gap`). Both 409s carry the store's head,\n * so a producer resends from there or stops on a fork.\n */\n\nimport { z } from 'zod'\nimport { parseSearchLedgerLine } from '../campaign/search-ledger'\nimport { SearchLedgerIntegrityError } from '../campaign/search-ledger-errors'\nimport type {\n SearchArtifactRef,\n SearchLedgerEntry,\n SearchLedgerEvent,\n SearchLedgerHash,\n} from '../campaign/search-ledger-types'\nimport { HOSTED_WIRE_VERSION } from './types'\n\n/** At most this many lines in one ingest request. */\nexport const SEARCH_LEDGER_BATCH_MAX_LINES = 1000\n/** At most this many UTF-8 bytes across one request's lines. A single line\n * larger than this cannot be shipped. */\nexport const SEARCH_LEDGER_BATCH_MAX_BYTES = 1_048_576\n\nexport const SEARCH_LEDGER_INGEST_PATH = '/v1/ingest/search-ledger'\n\nexport function searchLedgerHeadPath(searchId: string): string {\n return `${SEARCH_LEDGER_INGEST_PATH}/${encodeURIComponent(searchId)}/head`\n}\n\n/** Blobs are addressed by the hex digest alone. */\nexport function searchBlobPath(sha256: SearchLedgerHash): string {\n return `/v1/search-blobs/${sha256.slice('sha256:'.length)}`\n}\n\nconst HASH = z.custom<SearchLedgerHash>(\n (value) => typeof value === 'string' && /^sha256:[a-f0-9]{64}$/.test(value),\n 'expected sha256:<64 lowercase hex characters>',\n)\nconst SEARCH_ID = z\n .string()\n .min(1)\n .refine((value) => value.trim() === value, 'must not contain surrounding whitespace')\nconst SEQUENCE = z.number().int().nonnegative().safe()\n\n/** What the run is for: an optimization, or an eval (a one-node search). */\nexport const SearchRunKindSchema = z.enum(['optimization', 'eval'])\nexport type SearchRunKind = z.infer<typeof SearchRunKindSchema>\n\n/** Where a store's copy of one search's chain ends. `headHash` is null exactly\n * when the store holds no entry. */\nexport const SearchLedgerHeadSchema = z\n .object({ searchId: SEARCH_ID, nextSequence: SEQUENCE, headHash: HASH.nullable() })\n .strict()\n .refine((head) => (head.nextSequence === 0) === (head.headHash === null), {\n message: 'headHash must be null exactly when nextSequence is 0',\n path: ['headHash'],\n })\nexport type SearchLedgerHead = z.infer<typeof SearchLedgerHeadSchema>\n\nexport const IngestSearchLedgerRequestSchema = z\n .object({\n wireVersion: z.literal(HOSTED_WIRE_VERSION),\n searchId: SEARCH_ID,\n runKind: SearchRunKindSchema,\n fromSequence: SEQUENCE,\n lines: z.array(z.string().min(1)).min(1).max(SEARCH_LEDGER_BATCH_MAX_LINES),\n })\n .strict()\n .superRefine((request, ctx) => {\n const bytes = searchLedgerLinesByteLength(request.lines)\n if (bytes > SEARCH_LEDGER_BATCH_MAX_BYTES) {\n ctx.addIssue({\n code: 'custom',\n path: ['lines'],\n message: `lines hold ${bytes} bytes; at most ${SEARCH_LEDGER_BATCH_MAX_BYTES} per request`,\n })\n }\n })\nexport type IngestSearchLedgerRequest = z.infer<typeof IngestSearchLedgerRequestSchema>\n\n/** The body of a `409`: a fork or a gap, with the store's head. */\nexport const SearchLedgerConflictSchema = z\n .object({\n error: z.enum(['chain_conflict', 'sequence_gap']),\n message: z.string().min(1),\n head: SearchLedgerHeadSchema,\n })\n .strict()\nexport type SearchLedgerConflict = z.infer<typeof SearchLedgerConflictSchema>\n\n/** What a store kept of one blob. `masked` and `withheld` come from the\n * store's own redaction scan or the tenant's content posture. */\nexport const SearchBlobPutResponseSchema = z\n .object({\n sha256: HASH,\n byteLength: SEQUENCE,\n state: z.enum(['stored', 'masked', 'withheld']),\n })\n .strict()\nexport type SearchBlobPutResponse = z.infer<typeof SearchBlobPutResponseSchema>\n\nconst UTF8 = new TextEncoder()\n\nfunction searchLedgerLinesByteLength(lines: readonly string[]): number {\n let bytes = 0\n for (const line of lines) bytes += UTF8.encode(line).byteLength\n return bytes\n}\n\n/** Every blob an event names, once each. Ship these before the event. */\nexport function searchLedgerArtifactRefs(event: SearchLedgerEvent): SearchArtifactRef[] {\n const refs: SearchArtifactRef[] = [...event.artifacts]\n switch (event.kind) {\n case 'node-registered':\n refs.push(event.artifact, ...event.surfaces.map((surface) => surface.artifact))\n break\n case 'edge-recorded':\n for (const ref of [event.rationale, ...event.diffs]) if ('uri' in ref) refs.push(ref)\n break\n case 'cell-settled':\n for (const evidence of event.surfaceEvidence) refs.push(...evidence.evidence)\n break\n default:\n break\n }\n const unique = new Map<string, SearchArtifactRef>()\n for (const ref of refs) if (!unique.has(ref.sha256)) unique.set(ref.sha256, ref)\n return [...unique.values()]\n}\n\nexport type SearchLedgerBatchAdmission =\n | {\n status: 'accepted'\n /** Entries past the stored head, in order, with their exact lines. */\n entries: SearchLedgerEntry[]\n lines: string[]\n /** The head after storing `entries`. */\n head: SearchLedgerHead\n }\n | { status: 'conflict'; conflict: SearchLedgerConflict }\n\nexport interface AdmitSearchLedgerBatchInput {\n request: IngestSearchLedgerRequest\n /** The store's head for `request.searchId` before this batch. */\n head: SearchLedgerHead\n /** The stored hash at a sequence below the head. */\n storedEntryHash(sequence: number): SearchLedgerHash | undefined\n}\n\n/**\n * Apply the wire's chain rule to one batch. Each line is verified in isolation\n * (`parseSearchLedgerLine`) and linked to the stored head. A malformed line\n * throws `SearchLedgerIntegrityError`, which a store answers with 422; the\n * state machine (`SearchState`) runs after admission, on `entries`.\n */\nexport function admitSearchLedgerBatch(\n input: AdmitSearchLedgerBatchInput,\n): SearchLedgerBatchAdmission {\n const { request, head } = input\n if (request.searchId !== head.searchId) {\n throw new Error(`head is for search ${head.searchId}, request is for ${request.searchId}`)\n }\n if (request.fromSequence > head.nextSequence) {\n return conflict(\n 'sequence_gap',\n `batch starts at sequence ${request.fromSequence}; the store expects ${head.nextSequence}`,\n head,\n )\n }\n const entries: SearchLedgerEntry[] = []\n const lines: string[] = []\n let previousHash = head.headHash\n for (let index = 0; index < request.lines.length; index++) {\n const sequence = request.fromSequence + index\n const line = request.lines[index]!\n const entry = parseSearchLedgerLine(line, request.searchId, {\n path: `search ${request.searchId}`,\n line: sequence + 1,\n })\n if (entry.sequence !== sequence) {\n throw new SearchLedgerIntegrityError(\n `line ${index} of the batch holds sequence ${entry.sequence}, expected ${sequence}`,\n )\n }\n if (sequence < head.nextSequence) {\n if (input.storedEntryHash(sequence) !== entry.entryHash) {\n return conflict(\n 'chain_conflict',\n `sequence ${sequence} differs from the stored entry; the ledger forked`,\n head,\n )\n }\n continue\n }\n if (entry.previousHash !== previousHash) {\n if (sequence === head.nextSequence) {\n return conflict(\n 'chain_conflict',\n `sequence ${sequence} does not extend the stored head; the ledger forked`,\n head,\n )\n }\n throw new SearchLedgerIntegrityError(\n `sequence ${sequence} does not extend sequence ${sequence - 1} in the same batch`,\n )\n }\n entries.push(entry)\n lines.push(line)\n previousHash = entry.entryHash\n }\n const last = entries.at(-1)\n return {\n status: 'accepted',\n entries,\n lines,\n head: last\n ? { searchId: head.searchId, nextSequence: last.sequence + 1, headHash: last.entryHash }\n : head,\n }\n}\n\nfunction conflict(\n error: SearchLedgerConflict['error'],\n message: string,\n head: SearchLedgerHead,\n): SearchLedgerBatchAdmission {\n return { status: 'conflict', conflict: { error, message, head } }\n}\n","/**\n * # Hosted-tier ingest client.\n *\n * Ships search ledgers and trace spans to any orchestrator (ours, a\n * partner's self-hosted one, or a future open implementation) that speaks\n * the wire format in `./types.ts` and `./search-ledger-wire.ts`.\n *\n * Three modes:\n * - **Ours:** point at `https://orchestrator.tangle.tools` (the host root —\n * the client appends the versioned `/v1/...` path itself; a trailing\n * `/v1` on the endpoint is tolerated and normalized away).\n * - **Self-hosted:** point at whatever URL runs the reference receiver\n * from `examples/hosted-ingest-server/`.\n * - **Off (default):** when no tenant is configured, nothing is sent.\n * Everything stays local.\n *\n * Every call retries network errors, 408, 429 and 5xx. When the server sends\n * `Retry-After`, the client waits exactly that long before the next attempt.\n */\n\nimport type { z } from 'zod'\nimport { IngestResponseSchema, IngestTracesRequestSchema } from './schemas'\nimport {\n type IngestSearchLedgerRequest,\n IngestSearchLedgerRequestSchema,\n SEARCH_LEDGER_INGEST_PATH,\n type SearchBlobPutResponse,\n SearchBlobPutResponseSchema,\n type SearchLedgerConflict,\n SearchLedgerConflictSchema,\n type SearchLedgerHead,\n SearchLedgerHeadSchema,\n searchBlobPath,\n searchLedgerHeadPath,\n} from './search-ledger-wire'\nimport {\n HOSTED_WIRE_VERSION,\n type HostedWireVersion,\n type IngestResponse,\n type IngestTracesRequest,\n type TraceSpanEvent,\n} from './types'\n\nexport interface HostedTenant {\n /** Orchestrator endpoint base URL (no trailing slash). Required. */\n endpoint: string\n /** Bearer token issued by the orchestrator. Required. */\n apiKey: string\n /** Tenant id — the orchestrator's primary key for this consumer. Required. */\n tenantId: string\n /** Optional `fetch` override (auth wrappers, custom agent). */\n fetchImpl?: typeof fetch\n /** Per-attempt timeout in ms. Default 30s. */\n timeoutMs?: number\n /** Retries on network errors, 408, 429 and 5xx. Default 2. */\n retries?: number\n}\n\n/** A search-ledger batch the store accepted, or the fork or gap it refused. */\nexport type SearchLedgerIngestOutcome =\n | { status: 'accepted'; head: SearchLedgerHead }\n | { status: 'conflict'; conflict: SearchLedgerConflict }\n\nexport interface HostedClient {\n ingestTraces(spans: TraceSpanEvent[], idempotencyKey?: string): Promise<IngestResponse>\n /** The store's head for one search; `nextSequence` 0 when it holds nothing. */\n searchLedgerHead(searchId: string, signal?: AbortSignal): Promise<SearchLedgerHead>\n ingestSearchLedger(\n request: IngestSearchLedgerRequest,\n signal?: AbortSignal,\n ): Promise<SearchLedgerIngestOutcome>\n putSearchBlob(\n sha256: `sha256:${string}`,\n bytes: Uint8Array<ArrayBuffer>,\n contentType: string,\n signal?: AbortSignal,\n ): Promise<SearchBlobPutResponse>\n readonly tenant: HostedTenant\n readonly wireVersion: HostedWireVersion\n}\n\n/** A request the server refused, after any retries. */\nclass HostedRequestError extends Error {\n readonly status: number\n readonly body: string\n constructor(url: string, status: number, body: string) {\n super(`hosted ${url} failed (${status}): ${body.slice(0, 500)}`)\n this.name = 'HostedRequestError'\n this.status = status\n this.body = body\n }\n}\n\ninterface HostedRequest {\n method: 'GET' | 'POST' | 'PUT'\n path: string\n body?: string | Uint8Array<ArrayBuffer>\n contentType?: string\n idempotencyKey?: string\n signal?: AbortSignal\n /** Statuses returned to the caller instead of thrown. */\n expected?: readonly number[]\n}\n\nconst MAX_IDEMPOTENCY_KEY_LENGTH = 256\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(signal.reason)\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort)\n resolve()\n }, ms)\n const onAbort = () => {\n clearTimeout(timer)\n reject(signal!.reason)\n }\n signal?.addEventListener('abort', onAbort, { once: true })\n })\n}\n\n/** `Retry-After` as milliseconds: delay-seconds or an HTTP date. Null when\n * absent or unreadable, so the caller falls back to its own backoff. */\nfunction retryAfterMs(value: string | null, now = Date.now()): number | null {\n if (value === null) return null\n const trimmed = value.trim()\n if (/^\\d+$/.test(trimmed)) return Number(trimmed) * 1000\n const at = Date.parse(trimmed)\n return Number.isFinite(at) ? Math.max(0, at - now) : null\n}\n\nfunction backoffMs(attempt: number): number {\n return 2 ** attempt * 200 + Math.random() * 200\n}\n\nfunction normalizeHostedBase(endpoint: string): string {\n return endpoint.trim().replace(/\\/+$/, '').replace(/\\/v1$/, '')\n}\n\nfunction resolveIdempotencyKey(key: string | undefined): string {\n const resolved = key ?? globalThis.crypto.randomUUID()\n if (resolved.trim().length === 0) throw new Error('idempotency key must not be blank')\n if (resolved.length > MAX_IDEMPOTENCY_KEY_LENGTH) {\n throw new Error(`idempotency key must be at most ${MAX_IDEMPOTENCY_KEY_LENGTH} characters`)\n }\n return resolved\n}\n\nfunction isRetryable(status: number): boolean {\n return status >= 500 || status === 408 || status === 429\n}\n\nasync function send(\n tenant: HostedTenant,\n request: HostedRequest,\n): Promise<{ status: number; json: unknown; url: string }> {\n const timeoutMs = tenant.timeoutMs ?? 30_000\n const maxRetries = tenant.retries ?? 2\n const f: typeof fetch = tenant.fetchImpl ?? ((...args) => fetch(...args))\n const url = `${normalizeHostedBase(tenant.endpoint)}${request.path}`\n const headers: Record<string, string> = {\n authorization: `Bearer ${tenant.apiKey}`,\n 'x-tangle-tenant-id': tenant.tenantId,\n 'x-tangle-wire-version': HOSTED_WIRE_VERSION,\n }\n if (request.method !== 'GET') {\n headers['idempotency-key'] = resolveIdempotencyKey(request.idempotencyKey)\n headers['content-type'] = request.contentType ?? 'application/json'\n }\n\n let lastError: unknown\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const timeout = AbortSignal.timeout(timeoutMs)\n const signal = request.signal ? AbortSignal.any([request.signal, timeout]) : timeout\n let res: Response\n try {\n res = await f(url, {\n method: request.method,\n headers,\n ...(request.body === undefined ? {} : { body: request.body }),\n signal,\n })\n } catch (err) {\n if (request.signal?.aborted) throw err\n lastError = err\n if (attempt === maxRetries) throw err\n await sleep(backoffMs(attempt), request.signal)\n continue\n }\n\n if (!res.ok && !request.expected?.includes(res.status)) {\n const text = await res.text().catch(() => '')\n const error = new HostedRequestError(url, res.status, text)\n if (!isRetryable(res.status) || attempt === maxRetries) throw error\n lastError = error\n await sleep(\n retryAfterMs(res.headers.get('retry-after')) ?? backoffMs(attempt),\n request.signal,\n )\n continue\n }\n\n try {\n return { status: res.status, json: await res.json(), url }\n } catch (error) {\n throw new Error(`hosted ${url} returned invalid JSON`, { cause: error })\n }\n }\n throw lastError ?? new Error('hosted request exhausted retries')\n}\n\nfunction parseResponse<T>(schema: z.ZodType<T>, value: unknown, url: string): T {\n const parsed = schema.safeParse(value)\n if (parsed.success) return parsed.data\n const reason = parsed.error.issues\n .map((issue) => `${issue.path.map(String).join('.') || 'value'}: ${issue.message}`)\n .join('; ')\n throw new Error(`hosted ${url} returned an invalid response: ${reason}`)\n}\n\nexport function createHostedClient(tenant: HostedTenant): HostedClient {\n if (normalizeHostedBase(tenant.endpoint).length === 0) throw new Error('endpoint is required')\n if (tenant.apiKey.trim().length === 0) throw new Error('apiKey is required')\n if (tenant.tenantId.trim().length === 0) throw new Error('tenantId is required')\n if (\n tenant.timeoutMs !== undefined &&\n (!Number.isFinite(tenant.timeoutMs) || tenant.timeoutMs <= 0)\n ) {\n throw new Error('timeoutMs must be greater than 0')\n }\n if (tenant.retries !== undefined && (!Number.isInteger(tenant.retries) || tenant.retries < 0)) {\n throw new Error('retries must be a non-negative integer')\n }\n\n return {\n tenant,\n wireVersion: HOSTED_WIRE_VERSION,\n\n async ingestTraces(spans, idempotencyKey) {\n const body: IngestTracesRequest = IngestTracesRequestSchema.parse({\n wireVersion: HOSTED_WIRE_VERSION,\n spans,\n })\n const res = await send(tenant, {\n method: 'POST',\n path: '/v1/ingest/traces',\n body: JSON.stringify(body),\n idempotencyKey,\n })\n return parseResponse(IngestResponseSchema, res.json, res.url)\n },\n\n async searchLedgerHead(searchId, signal) {\n const res = await send(tenant, {\n method: 'GET',\n path: searchLedgerHeadPath(searchId),\n signal,\n })\n const head = parseResponse(SearchLedgerHeadSchema, res.json, res.url)\n if (head.searchId !== searchId) {\n throw new Error(`hosted ${res.url} returned the head of search ${head.searchId}`)\n }\n return head\n },\n\n async ingestSearchLedger(request, signal) {\n const body = IngestSearchLedgerRequestSchema.parse(request)\n const last = body.lines.at(-1)!\n const res = await send(tenant, {\n method: 'POST',\n path: SEARCH_LEDGER_INGEST_PATH,\n body: JSON.stringify(body),\n // Equal key exactly when the batch is equal, so a cached response is\n // always the response to these lines.\n idempotencyKey: `search-ledger:${await sha256Hex(\n `${body.searchId}\\n${body.runKind}\\n${body.fromSequence}\\n${body.lines.length}\\n${last}`,\n )}`,\n signal,\n expected: [409],\n })\n if (res.status === 409) {\n return {\n status: 'conflict',\n conflict: parseResponse(SearchLedgerConflictSchema, res.json, res.url),\n }\n }\n return { status: 'accepted', head: parseResponse(SearchLedgerHeadSchema, res.json, res.url) }\n },\n\n async putSearchBlob(sha256, bytes, contentType, signal) {\n const res = await send(tenant, {\n method: 'PUT',\n path: searchBlobPath(sha256),\n body: bytes,\n contentType,\n idempotencyKey: `search-blob:${sha256}`,\n signal,\n })\n const stored = parseResponse(SearchBlobPutResponseSchema, res.json, res.url)\n if (stored.sha256 !== sha256) {\n throw new Error(`hosted ${res.url} acknowledged blob ${stored.sha256}, sent ${sha256}`)\n }\n return stored\n },\n }\n}\n\nasync function sha256Hex(text: string): Promise<string> {\n const digest = await globalThis.crypto.subtle.digest('SHA-256', new TextEncoder().encode(text))\n return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, '0')).join('')\n}\n\n/**\n * Build a {@link HostedTenant} from env, or `undefined` when ingest is not\n * configured, so a product wires it unconditionally and it stays off until the\n * env is set. Env precedence:\n * - endpoint: `TANGLE_INGEST_URL` → `TANGLE_ORCHESTRATOR_URL`\n * - apiKey: `TANGLE_INGEST_API_KEY` → `TANGLE_API_KEY`\n * - tenantId: `TANGLE_TENANT_ID`\n * A trailing slash on the endpoint is stripped. `overrides` win over env.\n */\nexport function hostedTenantFromEnv(\n overrides: Partial<HostedTenant> & { env?: Record<string, string | undefined> } = {},\n): HostedTenant | undefined {\n const env = overrides.env ?? process.env\n const endpoint = (\n overrides.endpoint ??\n env.TANGLE_INGEST_URL ??\n env.TANGLE_ORCHESTRATOR_URL\n )?.trim()\n const apiKey = (overrides.apiKey ?? env.TANGLE_INGEST_API_KEY ?? env.TANGLE_API_KEY)?.trim()\n const tenantId = (overrides.tenantId ?? env.TANGLE_TENANT_ID)?.trim()\n if (!endpoint || !apiKey || !tenantId) return undefined\n const tenant: HostedTenant = { endpoint: endpoint.replace(/\\/+$/, ''), apiKey, tenantId }\n if (overrides.fetchImpl) tenant.fetchImpl = overrides.fetchImpl\n if (overrides.timeoutMs !== undefined) tenant.timeoutMs = overrides.timeoutMs\n if (overrides.retries !== undefined) tenant.retries = overrides.retries\n return tenant\n}\n\n/** {@link createHostedClient} over {@link hostedTenantFromEnv}; `undefined`\n * when ingest is not configured. */\nexport function hostedClientFromEnv(\n overrides: Partial<HostedTenant> & { env?: Record<string, string | undefined> } = {},\n): HostedClient | undefined {\n const tenant = hostedTenantFromEnv(overrides)\n return tenant ? createHostedClient(tenant) : undefined\n}\n","/**\n * Ship a search ledger to a hosted store while the search runs, or after.\n *\n * The local ledger is the source of truth and the search never waits on the\n * network: the shipper reads the ledger file the recorder already made\n * durable, uploads the blobs each entry names, then posts the entries. It\n * starts from the store's head, so a restarted process, a lost response, or a\n * second shipper continues where the store's chain ends instead of resending\n * the search. A store that holds a different chain for the same search stops\n * the shipper with `SearchShipConflictError`; nothing is overwritten.\n */\n\nimport { createHash } from 'node:crypto'\nimport { open, readFile } from 'node:fs/promises'\nimport { fileURLToPath } from 'node:url'\nimport type { SearchLedgerEntry, SearchLedgerHash } from '../campaign/search-ledger-types'\nimport { createHostedClient, type HostedClient, type HostedTenant } from './client'\nimport {\n SEARCH_LEDGER_BATCH_MAX_BYTES,\n SEARCH_LEDGER_BATCH_MAX_LINES,\n type SearchLedgerConflict,\n type SearchLedgerHead,\n type SearchRunKind,\n searchLedgerArtifactRefs,\n} from './search-ledger-wire'\nimport { HOSTED_WIRE_VERSION } from './types'\n\nexport interface SearchShipOptions {\n tenant: HostedTenant\n ledger: { path: string; searchId: string }\n runKind: SearchRunKind\n /** `full` (default) uploads every blob an entry names; `digests` ships the\n * entries alone, so the store holds refs and digests without content. */\n content?: 'full' | 'digests'\n signal?: AbortSignal\n}\n\n/** A blob an entry names that was not uploaded, and why. */\nexport interface SearchShipMissingBlob {\n sha256: SearchLedgerHash\n uri: string\n reason: string\n}\n\nexport interface SearchShipResult {\n searchId: string\n /** The store's head after the last accepted batch. */\n head: SearchLedgerHead\n /** Local complete lines, which the store now holds when `head` reaches them. */\n localLines: number\n /** Ledger lines posted, counting resends after a gap. */\n linesPosted: number\n batches: number\n /** Resends after the store answered `sequence_gap`. */\n gapResends: number\n blobs: {\n content: 'full' | 'digests'\n uploaded: number\n stored: number\n masked: number\n withheld: number\n missing: SearchShipMissingBlob[]\n }\n}\n\n/** The store holds a different chain for this search. */\nexport class SearchShipConflictError extends Error {\n readonly conflict: SearchLedgerConflict\n constructor(conflict: SearchLedgerConflict) {\n super(\n `search ${conflict.head.searchId}: ${conflict.error}: ${conflict.message} (store head ${conflict.head.nextSequence} ${conflict.head.headHash ?? 'empty'})`,\n )\n this.name = 'SearchShipConflictError'\n this.conflict = conflict\n }\n}\n\n/** Ship every complete line of the ledger file now, then return. */\nexport async function shipSearchLedger(options: SearchShipOptions): Promise<SearchShipResult> {\n return new SearchLedgerTail(options).ship()\n}\n\nexport interface SearchShipper {\n /** Ship what is in the file now without waiting for the next tick. */\n flush(): Promise<SearchShipResult>\n /** Stop tailing, ship the rest of the file, and return the final result. */\n stop(): Promise<SearchShipResult>\n /** The last transient failure, cleared by the next successful tick. */\n readonly lastError: Error | null\n}\n\n/**\n * Tail the ledger: ship new lines every `intervalMs` (default 2 s) until\n * `stop()`. A transient failure is kept on `lastError` and retried on the next\n * tick; a conflict stops tailing and is thrown by `stop()`.\n */\nexport function startSearchShipper(\n options: SearchShipOptions & { intervalMs?: number },\n): SearchShipper {\n const tail = new SearchLedgerTail(options)\n const intervalMs = options.intervalMs ?? 2000\n const stopping = new AbortController()\n let lastError: Error | null = null\n let conflict: SearchShipConflictError | null = null\n let running: Promise<unknown> = Promise.resolve()\n\n const tick = (): Promise<unknown> => {\n running = running.then(async () => {\n if (conflict) return\n try {\n await tail.ship()\n lastError = null\n } catch (error) {\n if (error instanceof SearchShipConflictError) conflict = error\n else lastError = error instanceof Error ? error : new Error(String(error))\n }\n })\n return running\n }\n\n const loop = (async () => {\n while (!stopping.signal.aborted && !conflict) {\n await tick()\n await new Promise<void>((resolve) => {\n const timer = setTimeout(resolve, intervalMs)\n stopping.signal.addEventListener(\n 'abort',\n () => {\n clearTimeout(timer)\n resolve()\n },\n { once: true },\n )\n })\n }\n })()\n\n return {\n get lastError() {\n return lastError\n },\n async flush() {\n await tick()\n if (conflict) throw conflict\n if (lastError) throw lastError\n return tail.result()\n },\n async stop() {\n stopping.abort()\n await loop\n await running\n if (conflict) throw conflict\n return tail.ship()\n },\n }\n}\n\n/** One full batch of lines with their newlines, plus a byte to see where a\n * maximal line ends. */\nconst READ_CHUNK_BYTES = SEARCH_LEDGER_BATCH_MAX_BYTES + SEARCH_LEDGER_BATCH_MAX_LINES + 1\n\ninterface LocalLine {\n text: string\n entry: SearchLedgerEntry\n bytes: number\n}\n\nclass SearchLedgerTail {\n private readonly client: HostedClient\n private readonly options: SearchShipOptions\n private readonly content: 'full' | 'digests'\n /** Where the store's chain ends, and the byte offset of that line locally. */\n private head: SearchLedgerHead | null = null\n private offset = 0\n private localLines = 0\n private readonly uploaded = new Set<string>()\n private readonly missing = new Map<string, SearchShipMissingBlob>()\n private readonly counts = {\n linesPosted: 0,\n batches: 0,\n gapResends: 0,\n uploaded: 0,\n stored: 0,\n masked: 0,\n withheld: 0,\n }\n\n constructor(options: SearchShipOptions) {\n this.options = options\n this.content = options.content ?? 'full'\n this.client = createHostedClient(options.tenant)\n }\n\n result(): SearchShipResult {\n const { linesPosted, batches, gapResends, uploaded, stored, masked, withheld } = this.counts\n return {\n searchId: this.options.ledger.searchId,\n head: this.head ?? {\n searchId: this.options.ledger.searchId,\n nextSequence: 0,\n headHash: null,\n },\n localLines: this.localLines,\n linesPosted,\n batches,\n gapResends,\n blobs: {\n content: this.content,\n uploaded,\n stored,\n masked,\n withheld,\n missing: [...this.missing.values()],\n },\n }\n }\n\n async ship(): Promise<SearchShipResult> {\n const { signal } = this.options\n if (this.head === null) {\n await this.syncTo(await this.client.searchLedgerHead(this.options.ledger.searchId, signal))\n }\n for (;;) {\n const lines = await this.readChunk(this.offset, this.head!)\n if (lines.length === 0) return this.result()\n const batch = takeBatch(lines)\n if (this.content === 'full') await this.uploadBlobs(batch)\n const fromSequence = this.head!.nextSequence\n const outcome = await this.client.ingestSearchLedger(\n {\n wireVersion: HOSTED_WIRE_VERSION,\n searchId: this.options.ledger.searchId,\n runKind: this.options.runKind,\n fromSequence,\n lines: batch.map((line) => line.text),\n },\n signal,\n )\n this.counts.batches++\n this.counts.linesPosted += batch.length\n if (outcome.status === 'conflict') {\n if (outcome.conflict.error === 'chain_conflict') {\n throw new SearchShipConflictError(outcome.conflict)\n }\n this.counts.gapResends++\n await this.syncTo(outcome.conflict.head)\n continue\n }\n const last = batch.at(-1)!.entry\n if (\n outcome.head.nextSequence < last.sequence + 1 ||\n (outcome.head.nextSequence === last.sequence + 1 &&\n outcome.head.headHash !== last.entryHash)\n ) {\n throw new Error(\n `store acknowledged sequence ${fromSequence}..${last.sequence} with head ${outcome.head.nextSequence} ${outcome.head.headHash}`,\n )\n }\n await this.syncTo(outcome.head)\n }\n }\n\n /** Move the cursor to the store's head, checking that the local ledger holds\n * the same entry there. A different entry is a fork; a store ahead of the\n * local file holds lines this ledger never wrote. */\n private async syncTo(head: SearchLedgerHead): Promise<void> {\n if (head.searchId !== this.options.ledger.searchId) {\n throw new Error(`store answered for search ${head.searchId}`)\n }\n const fork = (message: string) =>\n new SearchShipConflictError({ error: 'chain_conflict', message, head })\n const empty: SearchLedgerHead = { searchId: head.searchId, nextSequence: 0, headHash: null }\n const forward = this.head !== null && head.nextSequence >= this.head.nextSequence\n let offset = forward ? this.offset : 0\n let cursor = forward ? this.head! : empty\n while (cursor.nextSequence < head.nextSequence) {\n const lines = await this.readChunk(offset, cursor)\n if (lines.length === 0) {\n throw fork(\n `the store holds ${head.nextSequence} entries; the local ledger holds ${cursor.nextSequence}`,\n )\n }\n const take = Math.min(lines.length, head.nextSequence - cursor.nextSequence)\n for (let index = 0; index < take; index++) offset += lines[index]!.bytes\n const last = lines[take - 1]!.entry\n cursor = {\n searchId: head.searchId,\n nextSequence: last.sequence + 1,\n headHash: last.entryHash,\n }\n }\n if (cursor.headHash !== head.headHash) {\n throw fork(`the store's entry ${head.nextSequence - 1} differs from the local ledger's`)\n }\n this.offset = offset\n this.head = head\n }\n\n /** The complete lines in one read chunk from `offset`, checked to continue\n * the chain at `head`. A chunk holds at least one full batch. */\n private async readChunk(offset: number, head: SearchLedgerHead): Promise<LocalLine[]> {\n const bytes = await readRange(this.options.ledger.path, offset, READ_CHUNK_BYTES)\n const lines: LocalLine[] = []\n let start = 0\n let expectedSequence = head.nextSequence\n let previousHash = head.headHash\n for (;;) {\n const newline = bytes.indexOf(0x0a, start)\n // A line without its newline is still being written, or continues in\n // the next chunk.\n if (newline < 0) break\n const text = bytes.toString('utf8', start, newline)\n const entry = JSON.parse(text) as SearchLedgerEntry\n if (\n entry.searchId !== this.options.ledger.searchId ||\n entry.sequence !== expectedSequence ||\n entry.previousHash !== previousHash\n ) {\n throw new Error(\n `${this.options.ledger.path} line ${expectedSequence + 1} does not continue the chain at sequence ${expectedSequence}`,\n )\n }\n lines.push({ text, entry, bytes: newline + 1 - start })\n expectedSequence++\n previousHash = entry.entryHash\n start = newline + 1\n }\n if (lines.length === 0 && bytes.byteLength === READ_CHUNK_BYTES) {\n throw new Error(\n `${this.options.ledger.path} line ${expectedSequence + 1} is longer than ${SEARCH_LEDGER_BATCH_MAX_BYTES} bytes; one request carries at most that`,\n )\n }\n this.localLines = Math.max(this.localLines, expectedSequence)\n return lines\n }\n\n private async uploadBlobs(batch: LocalLine[]): Promise<void> {\n for (const line of batch) {\n for (const ref of searchLedgerArtifactRefs(line.entry.event)) {\n if (this.uploaded.has(ref.sha256) || this.missing.has(ref.sha256)) continue\n const bytes = await readBlob(ref.uri)\n if (typeof bytes === 'string') {\n this.missing.set(ref.sha256, { sha256: ref.sha256, uri: ref.uri, reason: bytes })\n continue\n }\n const digest = `sha256:${createHash('sha256').update(bytes).digest('hex')}`\n if (digest !== ref.sha256 || bytes.byteLength !== ref.byteLength) {\n this.missing.set(ref.sha256, {\n sha256: ref.sha256,\n uri: ref.uri,\n reason: `local bytes are ${digest} (${bytes.byteLength} bytes), not the ref's ${ref.sha256} (${ref.byteLength} bytes)`,\n })\n continue\n }\n const stored = await this.client.putSearchBlob(\n ref.sha256,\n new Uint8Array(bytes),\n ref.uri.endsWith('.json') ? 'application/json' : 'application/octet-stream',\n this.options.signal,\n )\n this.uploaded.add(ref.sha256)\n this.counts.uploaded++\n this.counts[stored.state]++\n }\n }\n }\n}\n\n/** The longest prefix of `lines` within one request's limits. */\nfunction takeBatch(lines: LocalLine[]): LocalLine[] {\n const batch: LocalLine[] = []\n let bytes = 0\n for (const line of lines) {\n const size = line.bytes - 1\n if (size > SEARCH_LEDGER_BATCH_MAX_BYTES) {\n throw new Error(\n `ledger line ${line.entry.sequence} holds ${size} bytes; one request carries at most ${SEARCH_LEDGER_BATCH_MAX_BYTES}`,\n )\n }\n if (\n batch.length === SEARCH_LEDGER_BATCH_MAX_LINES ||\n bytes + size > SEARCH_LEDGER_BATCH_MAX_BYTES\n )\n break\n batch.push(line)\n bytes += size\n }\n return batch\n}\n\n/** Up to `limit` bytes of the file from `offset`; empty before the recorder\n * created the file. */\nasync function readRange(path: string, offset: number, limit: number): Promise<Buffer> {\n let handle: Awaited<ReturnType<typeof open>>\n try {\n handle = await open(path, 'r')\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT' && offset === 0) return Buffer.alloc(0)\n throw error\n }\n try {\n const { size } = await handle.stat()\n if (size < offset) throw new Error(`${path} shrank below byte ${offset}`)\n const bytes = Buffer.alloc(Math.min(limit, size - offset))\n let read = 0\n while (read < bytes.byteLength) {\n const { bytesRead } = await handle.read(bytes, read, bytes.byteLength - read, offset + read)\n if (bytesRead === 0) break\n read += bytesRead\n }\n return bytes.subarray(0, read)\n } finally {\n await handle.close()\n }\n}\n\n/** The bytes at a `file:` ref, or why there are none. */\nasync function readBlob(uri: string): Promise<Buffer | string> {\n if (!uri.startsWith('file:'))\n return `the shipper reads only file: refs, not ${uri.split(':')[0]}:`\n try {\n return await readFile(fileURLToPath(uri))\n } catch (error) {\n return `unreadable: ${(error as NodeJS.ErrnoException).code ?? String(error)}`\n }\n}\n\n/**\n * Run a ship that must never fail its caller, such as the one a loop runs at\n * its end. A failure, a store short of the local ledger, or a blob that did\n * not upload is logged with the command that resumes it.\n */\nexport async function shipBestEffort(\n ship: () => Promise<SearchShipResult>,\n ledgerPath: string,\n): Promise<SearchShipResult | undefined> {\n const resume = `agent-eval search ship ${ledgerPath}`\n try {\n const shipped = await ship()\n if (shipped.head.nextSequence < shipped.localLines) {\n console.warn(\n `[agent-eval] search ${shipped.searchId}: the store holds ${shipped.head.nextSequence} of ${shipped.localLines} ledger entries; resume with ${resume}`,\n )\n }\n if (shipped.blobs.missing.length > 0) {\n console.warn(\n `[agent-eval] search ${shipped.searchId}: ${shipped.blobs.missing.length} blob(s) were not uploaded, first: ${shipped.blobs.missing[0]!.reason}`,\n )\n }\n return shipped\n } catch (error) {\n console.warn(\n `[agent-eval] search ledger ship failed (continuing; resume with ${resume}): ${error instanceof Error ? error.message : String(error)}`,\n )\n return undefined\n }\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import "./paired-tests-jbwPdSz5.js";
2
- import { r as minimumPairsForPairedDeltaTest } from "./paired-promotion-decision-BN6IQTiu.js";
3
- import { a as SearchLedgerError } from "./search-ledger-file-BqOo-bVo.js";
4
- import { x as estimateNode } from "./search-kernel-BztlERLv.js";
1
+ import "./mean-BbA_JCzW.js";
2
+ import { r as minimumPairsForPairedDeltaTest } from "./paired-promotion-decision-D0SHb-ZL.js";
3
+ import { a as SearchLedgerError } from "./search-ledger-file-UKCO2r8a.js";
4
+ import { w as estimateNode } from "./pareto-BzsxidFD.js";
5
5
  //#region src/campaign/search-summary.ts
6
6
  /**
7
7
  * The agent's view of a search: the same projection a human reads.
@@ -130,4 +130,4 @@ function formatEstimate(estimate) {
130
130
  //#endregion
131
131
  export { searchProposerView as n, renderSearchSummary as t };
132
132
 
133
- //# sourceMappingURL=search-summary-CBvz3u_S.js.map
133
+ //# sourceMappingURL=search-summary-DQIvJsSB.js.map