@tangle-network/agent-eval 0.144.6 → 0.144.7

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 (239) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +2 -0
  3. package/dist/{benchmark-J9Qe6j2_.d.ts → agent-profile-CgDTo40f.d.ts} +91 -4
  4. package/dist/agent-profile-CgDTo40f.d.ts.map +1 -0
  5. package/dist/analyst/index.d.ts +470 -88
  6. package/dist/analyst/index.d.ts.map +1 -1
  7. package/dist/analyst/index.js +24 -5
  8. package/dist/analyst/index.js.map +1 -1
  9. package/dist/{analyze-runs-DWIvOAGk.js → analyze-runs-BNNK7irB.js} +3 -3
  10. package/dist/{analyze-runs-DWIvOAGk.js.map → analyze-runs-BNNK7irB.js.map} +1 -1
  11. package/dist/{baseline-D_fT6277.d.ts → baseline-CavEbRyH.d.ts} +2 -23
  12. package/dist/baseline-CavEbRyH.d.ts.map +1 -0
  13. package/dist/{benchmark-command-CQd78YHt.js → benchmark-command-BCafwNrf.js} +662 -605
  14. package/dist/benchmark-command-BCafwNrf.js.map +1 -0
  15. package/dist/benchmarks/index.d.ts +1 -1
  16. package/dist/benchmarks/index.js +1 -1
  17. package/dist/{benchmarks-BEOkuvIg.js → benchmarks-CDSolHq7.js} +4 -4
  18. package/dist/{benchmarks-BEOkuvIg.js.map → benchmarks-CDSolHq7.js.map} +1 -1
  19. package/dist/campaign/index.d.ts +7 -5
  20. package/dist/campaign/index.js +5 -3
  21. package/dist/{campaign-CXsdyym7.js → campaign-Tdy3h62h.js} +17 -301
  22. package/dist/campaign-Tdy3h62h.js.map +1 -0
  23. package/dist/cli.js +2 -2
  24. package/dist/{client-0JI64ovJ.d.ts → client-DjXROWpx.d.ts} +3 -3
  25. package/dist/{client-0JI64ovJ.d.ts.map → client-DjXROWpx.d.ts.map} +1 -1
  26. package/dist/{completion-verifier-CBiee74w.d.ts → completion-verifier-foUCLif_.d.ts} +5 -5
  27. package/dist/{completion-verifier-CBiee74w.d.ts.map → completion-verifier-foUCLif_.d.ts.map} +1 -1
  28. package/dist/contract/index.d.ts +9 -8
  29. package/dist/contract/index.d.ts.map +1 -1
  30. package/dist/contract/index.js +7 -6
  31. package/dist/contract/index.js.map +1 -1
  32. package/dist/control.d.ts +2 -2
  33. package/dist/control.js +1 -1
  34. package/dist/counterfactual-CWPTrMH7.js +126 -0
  35. package/dist/counterfactual-CWPTrMH7.js.map +1 -0
  36. package/dist/counterfactual-CxmxAONP.d.ts +72 -0
  37. package/dist/counterfactual-CxmxAONP.d.ts.map +1 -0
  38. package/dist/{default-registry-J9m-_tya.d.ts → default-registry-BZhStdjl.d.ts} +6 -5
  39. package/dist/default-registry-BZhStdjl.d.ts.map +1 -0
  40. package/dist/{default-registry-Dta70shL.js → default-registry-BaQXW1Ow.js} +2 -2
  41. package/dist/{default-registry-Dta70shL.js.map → default-registry-BaQXW1Ow.js.map} +1 -1
  42. package/dist/{dspy-rlm-engine-19FQEMBK.js → dspy-rlm-engine-BiN49gK6.js} +4 -3
  43. package/dist/{dspy-rlm-engine-19FQEMBK.js.map → dspy-rlm-engine-BiN49gK6.js.map} +1 -1
  44. package/dist/{tool-groups-CK0JCkqO.d.ts → engine-nB64f48I.d.ts} +18 -31
  45. package/dist/engine-nB64f48I.d.ts.map +1 -0
  46. package/dist/{eval-campaign-CfLQQs9B.js → eval-campaign-DNjCvAm-.js} +7 -6
  47. package/dist/{eval-campaign-CfLQQs9B.js.map → eval-campaign-DNjCvAm-.js.map} +1 -1
  48. package/dist/{exact-types-CBYF5MGd.d.ts → exact-types-Djvzosly.d.ts} +2 -2
  49. package/dist/{exact-types-CBYF5MGd.d.ts.map → exact-types-Djvzosly.d.ts.map} +1 -1
  50. package/dist/exec-BLtYZdWo.js +49 -0
  51. package/dist/exec-BLtYZdWo.js.map +1 -0
  52. package/dist/experiment/index.d.ts +802 -0
  53. package/dist/experiment/index.d.ts.map +1 -0
  54. package/dist/experiment/index.js +1108 -0
  55. package/dist/experiment/index.js.map +1 -0
  56. package/dist/experiment-tracker-CnRICnMl.js +500 -0
  57. package/dist/experiment-tracker-CnRICnMl.js.map +1 -0
  58. package/dist/experiment-tracker-IMntXr6J.d.ts +299 -0
  59. package/dist/experiment-tracker-IMntXr6J.d.ts.map +1 -0
  60. package/dist/{external-optimizer-contracts-Q9c0L3eY.d.ts → external-optimizer-contracts-CZuJNcT5.d.ts} +2 -2
  61. package/dist/{external-optimizer-contracts-Q9c0L3eY.d.ts.map → external-optimizer-contracts-CZuJNcT5.d.ts.map} +1 -1
  62. package/dist/{feedback-trajectory-GgoS0-MK.d.ts → feedback-trajectory-Rh280oXo.d.ts} +3 -3
  63. package/dist/{feedback-trajectory-GgoS0-MK.d.ts.map → feedback-trajectory-Rh280oXo.d.ts.map} +1 -1
  64. package/dist/fuzz.d.ts +1 -1
  65. package/dist/hosted/index.d.ts +3 -3
  66. package/dist/{index-BZUe-ODI.d.ts → index-BZ3-y4YL.d.ts} +3 -3
  67. package/dist/{index-BZUe-ODI.d.ts.map → index-BZ3-y4YL.d.ts.map} +1 -1
  68. package/dist/{index-DSC51roc.d.ts → index-C3ssXVLv.d.ts} +2 -2
  69. package/dist/{index-DSC51roc.d.ts.map → index-C3ssXVLv.d.ts.map} +1 -1
  70. package/dist/{index-4XwggC10.d.ts → index-C5HOo4ZF2.d.ts} +4 -4
  71. package/dist/index-C5HOo4ZF2.d.ts.map +1 -0
  72. package/dist/{index-B6-B0zTB.d.ts → index-CvXXlyz7.d.ts} +2 -2
  73. package/dist/{index-B6-B0zTB.d.ts.map → index-CvXXlyz7.d.ts.map} +1 -1
  74. package/dist/{index-Dx1kF3Ez.d.ts → index-CwDrUMe0.d.ts} +2 -2
  75. package/dist/{index-Dx1kF3Ez.d.ts.map → index-CwDrUMe0.d.ts.map} +1 -1
  76. package/dist/{index-BIL5vxxt.d.ts → index-Sh2I0DRc.d.ts} +11 -645
  77. package/dist/index-Sh2I0DRc.d.ts.map +1 -0
  78. package/dist/index.d.ts +214 -404
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +233 -649
  81. package/dist/index.js.map +1 -1
  82. package/dist/{insight-report-DqEsugpr.d.ts → insight-report-C6h6F_4L.d.ts} +3 -3
  83. package/dist/{insight-report-DqEsugpr.d.ts.map → insight-report-C6h6F_4L.d.ts.map} +1 -1
  84. package/dist/{integrity-CNGUaGBY.d.ts → integrity-BuqEKu-x.d.ts} +2 -2
  85. package/dist/{integrity-CNGUaGBY.d.ts.map → integrity-BuqEKu-x.d.ts.map} +1 -1
  86. package/dist/integrity-MLzHOfV9.js +141 -0
  87. package/dist/integrity-MLzHOfV9.js.map +1 -0
  88. package/dist/kind-factory-BHIgPmzS.js.map +1 -1
  89. package/dist/{llm-client-Dv5BiKLE.js → llm-client-DzvMUsS_.js} +24 -6
  90. package/dist/llm-client-DzvMUsS_.js.map +1 -0
  91. package/dist/matrix/index.d.ts +2 -2
  92. package/dist/meta-eval/index.d.ts +1 -1
  93. package/dist/{mint-DD-0oQTA.js → mint-CGEkzPLf.js} +2 -2
  94. package/dist/{mint-DD-0oQTA.js.map → mint-CGEkzPLf.js.map} +1 -1
  95. package/dist/{multi-layer-verifier-BHY1gWAc.d.ts → multi-layer-verifier-DnAqwl0h.d.ts} +2 -2
  96. package/dist/{multi-layer-verifier-BHY1gWAc.d.ts.map → multi-layer-verifier-DnAqwl0h.d.ts.map} +1 -1
  97. package/dist/multishot/index.d.ts +2 -2
  98. package/dist/openapi.json +1 -1
  99. package/dist/paired-promotion-decision-B6zJ3gYM.d.ts +114 -0
  100. package/dist/paired-promotion-decision-B6zJ3gYM.d.ts.map +1 -0
  101. package/dist/pipelines/index.d.ts +2 -1
  102. package/dist/pipelines/index.d.ts.map +1 -1
  103. package/dist/pre-registration-DakwTRXk.js +96 -0
  104. package/dist/pre-registration-DakwTRXk.js.map +1 -0
  105. package/dist/prime-bridge-transport-6feEglLf.d.ts +49 -0
  106. package/dist/prime-bridge-transport-6feEglLf.d.ts.map +1 -0
  107. package/dist/prime-protocol-BfSalTfR.js +453 -0
  108. package/dist/prime-protocol-BfSalTfR.js.map +1 -0
  109. package/dist/profile-cell.js +242 -1
  110. package/dist/profile-cell.js.map +1 -0
  111. package/dist/promotion-policy-ChWhTDBH.d.ts +289 -0
  112. package/dist/promotion-policy-ChWhTDBH.d.ts.map +1 -0
  113. package/dist/promotion-policy-CrLrmys8.js +682 -0
  114. package/dist/promotion-policy-CrLrmys8.js.map +1 -0
  115. package/dist/{propose-review-control-BciUCZoh.js → propose-review-control-qgWLA6E9.js} +2 -2
  116. package/dist/{propose-review-control-BciUCZoh.js.map → propose-review-control-qgWLA6E9.js.map} +1 -1
  117. package/dist/{release-report-ChOgpIoQ.d.ts → release-report-CI8uisI1.d.ts} +2 -2
  118. package/dist/{release-report-ChOgpIoQ.d.ts.map → release-report-CI8uisI1.d.ts.map} +1 -1
  119. package/dist/{release-report-Sl0xfkFv.js → release-report-Dy39cbFF.js} +3 -3
  120. package/dist/{release-report-Sl0xfkFv.js.map → release-report-Dy39cbFF.js.map} +1 -1
  121. package/dist/{replay-Krvb114g.d.ts → replay-DFf-teiC.d.ts} +5 -4
  122. package/dist/replay-DFf-teiC.d.ts.map +1 -0
  123. package/dist/{replay-GW61ezMW.js → replay-DyBLaKFc.js} +3 -3
  124. package/dist/{replay-GW61ezMW.js.map → replay-DyBLaKFc.js.map} +1 -1
  125. package/dist/reporting.d.ts +3 -3
  126. package/dist/reporting.js +2 -2
  127. package/dist/{researcher-xLeNcpKX.d.ts → researcher-BoaxeCzP.d.ts} +4 -4
  128. package/dist/{researcher-xLeNcpKX.d.ts.map → researcher-BoaxeCzP.d.ts.map} +1 -1
  129. package/dist/{reward-hacking-CyuzxKly.js → reward-hacking-B2tPL9a3.js} +12 -3
  130. package/dist/reward-hacking-B2tPL9a3.js.map +1 -0
  131. package/dist/{reward-hacking-RZgnGWlx.d.ts → reward-hacking-Cf1PtEOz.d.ts} +33 -3
  132. package/dist/reward-hacking-Cf1PtEOz.d.ts.map +1 -0
  133. package/dist/rl.d.ts +17 -7
  134. package/dist/rl.d.ts.map +1 -1
  135. package/dist/rl.js +16 -7
  136. package/dist/rl.js.map +1 -1
  137. package/dist/rollout/index.d.ts +2 -2
  138. package/dist/rollout/index.js +2 -2
  139. package/dist/{rollout-C2fD1cf4.js → rollout-2ECTXb2N.js} +2 -2
  140. package/dist/{rollout-C2fD1cf4.js.map → rollout-2ECTXb2N.js.map} +1 -1
  141. package/dist/{run-evidence-C6G41MSI.d.ts → run-evidence-BDFFai9R.d.ts} +2 -2
  142. package/dist/{run-evidence-C6G41MSI.d.ts.map → run-evidence-BDFFai9R.d.ts.map} +1 -1
  143. package/dist/{run-record-CWN8-VsV.js → run-record-DqOw5X6_.js} +2 -2
  144. package/dist/{run-record-CWN8-VsV.js.map → run-record-DqOw5X6_.js.map} +1 -1
  145. package/dist/{schema-Cef2cFmb.d.ts → schema-Cef2cFmb2.d.ts} +1 -1
  146. package/dist/schema-Cef2cFmb2.d.ts.map +1 -0
  147. package/dist/{semantic-concept-judge-DwF6n05O.js → semantic-concept-judge-Bmrq6yqU.js} +2 -2
  148. package/dist/{semantic-concept-judge-DwF6n05O.js.map → semantic-concept-judge-Bmrq6yqU.js.map} +1 -1
  149. package/dist/sequential-D-BLJBKU.js +299 -0
  150. package/dist/sequential-D-BLJBKU.js.map +1 -0
  151. package/dist/{server-D6XJQHw7.js → server-iu0ede49.js} +2 -2
  152. package/dist/{server-D6XJQHw7.js.map → server-iu0ede49.js.map} +1 -1
  153. package/dist/{single-run-lock-D5iN0Xzb.js → single-run-lock-BMQEv1wG.js} +7 -161
  154. package/dist/single-run-lock-BMQEv1wG.js.map +1 -0
  155. package/dist/{skill-usage-GlOphAhX.d.ts → skill-usage-CJlWEUFt.d.ts} +10 -10
  156. package/dist/{skill-usage-GlOphAhX.d.ts.map → skill-usage-CJlWEUFt.d.ts.map} +1 -1
  157. package/dist/{skillopt-optimization-method-7S43rbDB.d.ts → skillopt-optimization-method-BO7NAl3b.d.ts} +8 -294
  158. package/dist/skillopt-optimization-method-BO7NAl3b.d.ts.map +1 -0
  159. package/dist/{skillopt-optimization-method-Bfb-vBKe.js → skillopt-optimization-method-CQwZ-ZX8.js} +8 -652
  160. package/dist/skillopt-optimization-method-CQwZ-ZX8.js.map +1 -0
  161. package/dist/statistical-heldout-Dn9ruizm.d.ts +555 -0
  162. package/dist/statistical-heldout-Dn9ruizm.d.ts.map +1 -0
  163. package/dist/{statistics-C-dm-J6H.d.ts → statistics-D6Uebe_4.d.ts} +2 -2
  164. package/dist/{statistics-C-dm-J6H.d.ts.map → statistics-D6Uebe_4.d.ts.map} +1 -1
  165. package/dist/steps-BArUxhna.d.ts +51 -0
  166. package/dist/steps-BArUxhna.d.ts.map +1 -0
  167. package/dist/{integrity-fdt8XPAv.js → store-DNe_Uv1Q.js} +2 -140
  168. package/dist/store-DNe_Uv1Q.js.map +1 -0
  169. package/dist/{summary-report-B0cAyA7N.d.ts → summary-report-DuUS_i7W.d.ts} +3 -114
  170. package/dist/summary-report-DuUS_i7W.d.ts.map +1 -0
  171. package/dist/{summary-report-9A5y7EsK.js → summary-report-Lf-5I7xh.js} +2 -2
  172. package/dist/{summary-report-9A5y7EsK.js.map → summary-report-Lf-5I7xh.js.map} +1 -1
  173. package/dist/supervisor-run/index.d.ts +2 -2
  174. package/dist/supervisor-run/index.js +1 -1
  175. package/dist/{supervisor-run-DiyQVczd.js → supervisor-run-D_sokXcO.js} +32 -8
  176. package/dist/{supervisor-run-DiyQVczd.js.map → supervisor-run-D_sokXcO.js.map} +1 -1
  177. package/dist/tool-groups-DIVBnJyl.d.ts +28 -0
  178. package/dist/tool-groups-DIVBnJyl.d.ts.map +1 -0
  179. package/dist/trace-repair/index.d.ts +2102 -0
  180. package/dist/trace-repair/index.d.ts.map +1 -0
  181. package/dist/trace-repair/index.js +3878 -0
  182. package/dist/trace-repair/index.js.map +1 -0
  183. package/dist/traces.d.ts +6 -6
  184. package/dist/traces.js +3 -2
  185. package/dist/trajectory-YC15QDYQ.d.ts +24 -0
  186. package/dist/trajectory-YC15QDYQ.d.ts.map +1 -0
  187. package/dist/trajectory-replay/index.d.ts +781 -0
  188. package/dist/trajectory-replay/index.d.ts.map +1 -0
  189. package/dist/trajectory-replay/index.js +2103 -0
  190. package/dist/trajectory-replay/index.js.map +1 -0
  191. package/dist/{types-XMVEdrE_.d.ts → types-D216SgwM.d.ts} +24 -6
  192. package/dist/types-D216SgwM.d.ts.map +1 -0
  193. package/dist/{types-yLK8gXE9.d.ts → types-D4mog56g.d.ts} +2 -2
  194. package/dist/{types-yLK8gXE9.d.ts.map → types-D4mog56g.d.ts.map} +1 -1
  195. package/dist/{types-BhP9q0Fq.d.ts → types-DF_Udrp-.d.ts} +52 -3
  196. package/dist/{types-BhP9q0Fq.d.ts.map → types-DF_Udrp-.d.ts.map} +1 -1
  197. package/dist/{types-DOZyvsFU.d.ts → types-DYuNHo9R.d.ts} +3 -3
  198. package/dist/{types-DOZyvsFU.d.ts.map → types-DYuNHo9R.d.ts.map} +1 -1
  199. package/dist/usage-receipt-EVI8B8Xu.js.map +1 -1
  200. package/dist/verdict-DExhxfgR.d.ts +201 -0
  201. package/dist/verdict-DExhxfgR.d.ts.map +1 -0
  202. package/dist/verdict-cache-BCcOh0kF.js +159 -0
  203. package/dist/verdict-cache-BCcOh0kF.js.map +1 -0
  204. package/dist/wire/index.d.ts +2 -2
  205. package/dist/wire/index.js +1 -1
  206. package/docs/charter.md +112 -0
  207. package/docs/experiment.md +104 -0
  208. package/docs/prime-analyst.md +1 -0
  209. package/docs/trace-analysis.md +26 -0
  210. package/docs/trace-repair-admission.md +194 -0
  211. package/docs/trace-repair-analyst-arms.md +121 -0
  212. package/docs/trace-repair-continuation.md +107 -0
  213. package/docs/trace-repair-grader.md +163 -0
  214. package/docs/trajectory-replay.md +110 -0
  215. package/docs/verification-strategies.md +103 -0
  216. package/package.json +19 -2
  217. package/dist/agent-profile-cell-CbfBm2g6.js +0 -335
  218. package/dist/agent-profile-cell-CbfBm2g6.js.map +0 -1
  219. package/dist/baseline-D_fT6277.d.ts.map +0 -1
  220. package/dist/benchmark-J9Qe6j2_.d.ts.map +0 -1
  221. package/dist/benchmark-command-CQd78YHt.js.map +0 -1
  222. package/dist/campaign-CXsdyym7.js.map +0 -1
  223. package/dist/default-registry-J9m-_tya.d.ts.map +0 -1
  224. package/dist/index-4XwggC10.d.ts.map +0 -1
  225. package/dist/index-BIL5vxxt.d.ts.map +0 -1
  226. package/dist/integrity-fdt8XPAv.js.map +0 -1
  227. package/dist/llm-client-Dv5BiKLE.js.map +0 -1
  228. package/dist/replay-Krvb114g.d.ts.map +0 -1
  229. package/dist/reward-hacking-CyuzxKly.js.map +0 -1
  230. package/dist/reward-hacking-RZgnGWlx.d.ts.map +0 -1
  231. package/dist/schema-Cef2cFmb.d.ts.map +0 -1
  232. package/dist/single-run-lock-D5iN0Xzb.js.map +0 -1
  233. package/dist/skillopt-optimization-method-7S43rbDB.d.ts.map +0 -1
  234. package/dist/skillopt-optimization-method-Bfb-vBKe.js.map +0 -1
  235. package/dist/summary-report-B0cAyA7N.d.ts.map +0 -1
  236. package/dist/tool-groups-CK0JCkqO.d.ts.map +0 -1
  237. package/dist/types-XMVEdrE_.d.ts.map +0 -1
  238. package/dist/verdict-Dps8_okt.d.ts +0 -37
  239. package/dist/verdict-Dps8_okt.d.ts.map +0 -1
@@ -1,4 +1,3 @@
1
- import { n as CaptureIntegrityError } from "./errors-D-LKuDhb.js";
2
1
  //#region src/trace/store.ts
3
2
  var InMemoryTraceStore = class {
4
3
  runs = /* @__PURE__ */ new Map();
@@ -282,143 +281,6 @@ var FileSystemTraceStore = class {
282
281
  }
283
282
  };
284
283
  //#endregion
285
- //#region src/trace/integrity.ts
286
- /**
287
- * Run-completion integrity check — at end of run, verify the expected event
288
- * types were actually captured. The point is the launch-review failure mode:
289
- * a run *appears* successful but the raw provider events were never written,
290
- * so a downstream reviewer can't reconstruct what happened.
291
- *
292
- * Pattern:
293
- *
294
- * const report = await assertRunCaptured(store, runId, {
295
- * llmSpansMin: 1,
296
- * judgeSpansMin: 1,
297
- * rawSink: providerSink, // must have ≥ 1 event for this run
298
- * requireRawCoverageOfLlmSpans: true, // every llm span has matching raw events
299
- * })
300
- * if (!report.ok) throwIfRunIncomplete(report) // or mark run failed and continue
301
- *
302
- * The function is read-only on the store and returns a structured report;
303
- * the caller chooses the failure mode (throw, mark run failed, log warning).
304
- * `throwIfRunIncomplete` is the convenient strict mode.
305
- */
306
- var RunIntegrityError = class extends CaptureIntegrityError {
307
- report;
308
- constructor(report) {
309
- super(`Run ${report.runId} failed integrity check: ${report.issues.map((i) => i.code).join(", ")}`);
310
- this.report = report;
311
- }
312
- };
313
- async function assertRunCaptured(store, runId, expectations = {}) {
314
- const issues = [];
315
- const run = await store.getRun(runId);
316
- if (!run) return {
317
- ok: false,
318
- runId,
319
- llmSpanCount: 0,
320
- judgeSpanCount: 0,
321
- toolSpanCount: 0,
322
- rawProviderEventCount: 0,
323
- rawSpanCoverage: {
324
- covered: 0,
325
- total: 0
326
- },
327
- issues: [{
328
- code: "no_run",
329
- message: `Run ${runId} not found in store.`
330
- }]
331
- };
332
- const spans = await store.spans({ runId });
333
- const llmSpans = spans.filter((s) => s.kind === "llm");
334
- const judgeSpans = spans.filter((s) => s.kind === "judge");
335
- const toolSpans = spans.filter((s) => s.kind === "tool");
336
- const llmMin = expectations.llmSpansMin ?? 0;
337
- const judgeMin = expectations.judgeSpansMin ?? 0;
338
- const toolMin = expectations.toolSpansMin ?? 0;
339
- if (llmSpans.length < llmMin) issues.push({
340
- code: "missing_llm_spans",
341
- message: `Expected ≥ ${llmMin} LLM spans, found ${llmSpans.length}.`,
342
- detail: {
343
- expected: llmMin,
344
- found: llmSpans.length
345
- }
346
- });
347
- if (judgeSpans.length < judgeMin) issues.push({
348
- code: "missing_judge_spans",
349
- message: `Expected ≥ ${judgeMin} judge spans, found ${judgeSpans.length}.`,
350
- detail: {
351
- expected: judgeMin,
352
- found: judgeSpans.length
353
- }
354
- });
355
- if (toolSpans.length < toolMin) issues.push({
356
- code: "missing_tool_spans",
357
- message: `Expected ≥ ${toolMin} tool spans, found ${toolSpans.length}.`,
358
- detail: {
359
- expected: toolMin,
360
- found: toolSpans.length
361
- }
362
- });
363
- let rawEventCount = 0;
364
- let coverage = {
365
- covered: 0,
366
- total: llmSpans.length
367
- };
368
- if (expectations.rawSink) if (!expectations.rawSink.list) issues.push({
369
- code: "no_raw_sink",
370
- message: "Provided rawSink does not implement list(); cannot verify capture."
371
- });
372
- else {
373
- const events = await expectations.rawSink.list({ runId });
374
- rawEventCount = events.length;
375
- const rawMin = expectations.rawProviderEventsMin ?? 1;
376
- if (rawEventCount < rawMin) issues.push({
377
- code: "missing_raw_events",
378
- message: `Expected ≥ ${rawMin} raw provider events, found ${rawEventCount}.`,
379
- detail: {
380
- expected: rawMin,
381
- found: rawEventCount
382
- }
383
- });
384
- if (expectations.requireRawCoverageOfLlmSpans) {
385
- const requestEventsBySpan = new Set(events.filter((e) => e.direction === "request" && e.spanId).map((e) => e.spanId));
386
- const orphaned = llmSpans.filter((s) => !requestEventsBySpan.has(s.spanId));
387
- coverage = {
388
- covered: llmSpans.length - orphaned.length,
389
- total: llmSpans.length
390
- };
391
- if (orphaned.length > 0) issues.push({
392
- code: "orphan_llm_span",
393
- message: `${orphaned.length} LLM span(s) have no matching raw provider request event.`,
394
- detail: { orphanedSpanIds: orphaned.map((s) => s.spanId) }
395
- });
396
- }
397
- }
398
- else if (expectations.requireRawCoverageOfLlmSpans || expectations.rawProviderEventsMin) issues.push({
399
- code: "no_raw_sink",
400
- message: "Raw coverage required but no rawSink supplied to the integrity check."
401
- });
402
- if (expectations.requireOutcome && (run.outcome === void 0 || run.outcome === null)) issues.push({
403
- code: "missing_outcome",
404
- message: `Run ${runId} has no outcome recorded.`
405
- });
406
- return {
407
- ok: issues.length === 0,
408
- runId,
409
- llmSpanCount: llmSpans.length,
410
- judgeSpanCount: judgeSpans.length,
411
- toolSpanCount: toolSpans.length,
412
- rawProviderEventCount: rawEventCount,
413
- rawSpanCoverage: coverage,
414
- issues
415
- };
416
- }
417
- /** Strict mode: throws `RunIntegrityError` when the report isn't ok. */
418
- function throwIfRunIncomplete(report) {
419
- if (!report.ok) throw new RunIntegrityError(report);
420
- }
421
- //#endregion
422
- export { InMemoryTraceStore as a, FileSystemTraceStore as i, assertRunCaptured as n, throwIfRunIncomplete as r, RunIntegrityError as t };
284
+ export { InMemoryTraceStore as n, FileSystemTraceStore as t };
423
285
 
424
- //# sourceMappingURL=integrity-fdt8XPAv.js.map
286
+ //# sourceMappingURL=store-DNe_Uv1Q.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-DNe_Uv1Q.js","names":[],"sources":["../src/trace/store.ts"],"sourcesContent":["/**\n * TraceStore — persistence + query over the TraceSchema v1 corpus.\n *\n * Two implementations ship in the core:\n * - InMemoryTraceStore: dev + tests, fully in-process\n * - FileSystemTraceStore: NDJSON append-only files per entity, suitable\n * for long-running CI jobs; rolled over at 32MB\n *\n * Downstream adapters (DuckDB, Langfuse, R2 parquet) implement this same\n * interface — the rest of the framework is storage-agnostic.\n */\n\nimport type {\n Artifact,\n BudgetLedgerEntry,\n EventKind,\n Run,\n RunStatus,\n Span,\n SpanKind,\n TraceEvent,\n} from './schema'\n\nexport interface RunFilter {\n scenarioId?: string\n variantId?: string\n status?: RunStatus\n since?: number\n until?: number\n tag?: { key: string; value: string }\n parentRunId?: string\n projectId?: string\n chatId?: string\n layer?: import('./schema').RunLayer\n}\n\nexport interface SpanFilter {\n runId?: string\n parentSpanId?: string\n kind?: SpanKind\n name?: string\n toolName?: string\n judgeId?: string\n since?: number\n until?: number\n}\n\nexport interface EventFilter {\n runId?: string\n spanId?: string\n kind?: EventKind\n since?: number\n until?: number\n}\n\nexport interface TraceStore {\n appendRun(run: Run): Promise<void>\n updateRun(runId: string, patch: Partial<Run>): Promise<void>\n appendSpan(span: Span): Promise<void>\n updateSpan(spanId: string, patch: Partial<Span>): Promise<void>\n appendEvent(event: TraceEvent): Promise<void>\n appendArtifact(artifact: Artifact): Promise<void>\n appendBudgetEntry(entry: BudgetLedgerEntry): Promise<void>\n\n getRun(runId: string): Promise<Run | undefined>\n listRuns(filter?: RunFilter): Promise<Run[]>\n spans(filter?: SpanFilter): Promise<Span[]>\n events(filter?: EventFilter): Promise<TraceEvent[]>\n budget(runId: string): Promise<BudgetLedgerEntry[]>\n artifacts(runId: string): Promise<Artifact[]>\n}\n\n// ── In-memory ────────────────────────────────────────────────────────\n\nexport class InMemoryTraceStore implements TraceStore {\n private runs = new Map<string, Run>()\n private allSpans: Span[] = []\n private allEvents: TraceEvent[] = []\n private allArtifacts: Artifact[] = []\n private allBudget: BudgetLedgerEntry[] = []\n\n async appendRun(run: Run): Promise<void> {\n if (this.runs.has(run.runId)) throw new Error(`run ${run.runId} already exists`)\n this.runs.set(run.runId, { ...run })\n }\n\n async updateRun(runId: string, patch: Partial<Run>): Promise<void> {\n const existing = this.runs.get(runId)\n if (!existing) throw new Error(`run ${runId} not found`)\n this.runs.set(runId, { ...existing, ...patch })\n }\n\n async appendSpan(span: Span): Promise<void> {\n this.allSpans.push({ ...span })\n }\n\n async updateSpan(spanId: string, patch: Partial<Span>): Promise<void> {\n const idx = this.allSpans.findIndex((s) => s.spanId === spanId)\n if (idx < 0) throw new Error(`span ${spanId} not found`)\n this.allSpans[idx] = { ...this.allSpans[idx], ...patch } as Span\n }\n\n async appendEvent(event: TraceEvent): Promise<void> {\n this.allEvents.push({ ...event })\n }\n\n async appendArtifact(artifact: Artifact): Promise<void> {\n this.allArtifacts.push({ ...artifact })\n }\n\n async appendBudgetEntry(entry: BudgetLedgerEntry): Promise<void> {\n this.allBudget.push({ ...entry })\n }\n\n async getRun(runId: string): Promise<Run | undefined> {\n const r = this.runs.get(runId)\n return r ? { ...r } : undefined\n }\n\n async listRuns(filter: RunFilter = {}): Promise<Run[]> {\n return [...this.runs.values()].filter((r) => matchesRun(r, filter))\n }\n\n async spans(filter: SpanFilter = {}): Promise<Span[]> {\n return this.allSpans.filter((s) => matchesSpan(s, filter)).map((s) => ({ ...s }))\n }\n\n async events(filter: EventFilter = {}): Promise<TraceEvent[]> {\n return this.allEvents.filter((e) => matchesEvent(e, filter)).map((e) => ({ ...e }))\n }\n\n async budget(runId: string): Promise<BudgetLedgerEntry[]> {\n return this.allBudget.filter((b) => b.runId === runId).map((b) => ({ ...b }))\n }\n\n async artifacts(runId: string): Promise<Artifact[]> {\n return this.allArtifacts.filter((a) => a.runId === runId).map((a) => ({ ...a }))\n }\n}\n\nfunction matchesRun(r: Run, f: RunFilter): boolean {\n if (f.scenarioId && r.scenarioId !== f.scenarioId) return false\n if (f.variantId && r.variantId !== f.variantId) return false\n if (f.status && r.status !== f.status) return false\n if (f.since !== undefined && r.startedAt < f.since) return false\n if (f.until !== undefined && r.startedAt > f.until) return false\n if (f.tag && r.tags?.[f.tag.key] !== f.tag.value) return false\n if (f.parentRunId && r.parentRunId !== f.parentRunId) return false\n if (f.projectId && r.projectId !== f.projectId) return false\n if (f.chatId && r.chatId !== f.chatId) return false\n if (f.layer && r.layer !== f.layer) return false\n return true\n}\n\nfunction matchesSpan(s: Span, f: SpanFilter): boolean {\n if (f.runId && s.runId !== f.runId) return false\n if (f.parentSpanId && s.parentSpanId !== f.parentSpanId) return false\n if (f.kind && s.kind !== f.kind) return false\n if (f.name && s.name !== f.name) return false\n if (f.toolName && (s.kind !== 'tool' || s.toolName !== f.toolName)) return false\n if (f.judgeId && (s.kind !== 'judge' || s.judgeId !== f.judgeId)) return false\n if (f.since !== undefined && s.startedAt < f.since) return false\n if (f.until !== undefined && s.startedAt > f.until) return false\n return true\n}\n\nfunction matchesEvent(e: TraceEvent, f: EventFilter): boolean {\n if (f.runId && e.runId !== f.runId) return false\n if (f.spanId && e.spanId !== f.spanId) return false\n if (f.kind && e.kind !== f.kind) return false\n if (f.since !== undefined && e.timestamp < f.since) return false\n if (f.until !== undefined && e.timestamp > f.until) return false\n return true\n}\n\n// ── Filesystem (NDJSON append-only, one file per entity) ─────────────\n\nexport interface FileSystemTraceStoreOptions {\n dir: string\n /** Roll over NDJSON files when they exceed this size in bytes. Default 32 MB. */\n maxBytes?: number\n}\n\nexport class FileSystemTraceStore implements TraceStore {\n private dir: string\n private maxBytes: number\n /** Lazy in-memory index for queries — populated on first read. */\n private index?: InMemoryTraceStore\n /** Memoized index build — concurrent first reads share one build, and an\n * append racing an in-flight load awaits this so its row isn't lost. */\n private indexPromise?: Promise<InMemoryTraceStore>\n /** Strictly-increasing rollover stamp. Date.now() alone collides when two\n * rollovers land in the same millisecond, overwriting a rolled file. */\n private lastRolloverStamp = 0\n /**\n * Per-file append serialization. stat → conditional-rename → appendFile is a\n * read-modify-write on the active file; without a lock two concurrent appends\n * to the same `name` can both pass the size check (exceeding maxBytes) or one\n * can append to a file the other just renamed away. Each entry chains the\n * next append behind the prior one for that file.\n */\n private appendLocks = new Map<string, Promise<void>>()\n\n constructor(options: FileSystemTraceStoreOptions) {\n this.dir = options.dir\n this.maxBytes = options.maxBytes ?? 32 * 1024 * 1024\n }\n\n private async ensureDir(): Promise<void> {\n const fs = await import('node:fs/promises')\n await fs.mkdir(this.dir, { recursive: true })\n }\n\n private async append(name: string, record: unknown): Promise<void> {\n // If an index load is in flight, wait for it. The row must hit disk AFTER\n // the load finished reading, so it lands in the completed index via the\n // mirror below — never lost in the gap before `this.index` is assigned.\n if (this.indexPromise) await this.indexPromise\n // Chain this append behind any in-flight append for the same file. The tail\n // promise never rejects (errors are isolated to each caller's `result`), so\n // one failed append can't break the lock chain for the next one.\n const prior = this.appendLocks.get(name) ?? Promise.resolve()\n const result = prior.then(() => this.appendLocked(name, record))\n const tail = result.then(\n () => {},\n () => {},\n )\n this.appendLocks.set(name, tail)\n try {\n await result\n } finally {\n // Drop the slot once this append is the current tail, so the map doesn't\n // grow without bound across many appends to the same file.\n if (this.appendLocks.get(name) === tail) this.appendLocks.delete(name)\n }\n }\n\n private async appendLocked(name: string, record: unknown): Promise<void> {\n await this.ensureDir()\n const fs = await import('node:fs/promises')\n const path = await import('node:path')\n const active = path.join(this.dir, `${name}.ndjson`)\n try {\n const stat = await fs.stat(active)\n if (stat.size >= this.maxBytes) {\n // Strictly-increasing, collision-free even within one millisecond — a\n // bare Date.now() would let two same-ms rollovers overwrite each other.\n const stamp = Math.max(Date.now(), this.lastRolloverStamp + 1)\n this.lastRolloverStamp = stamp\n const rolled = path.join(this.dir, `${name}.${stamp}.ndjson`)\n await fs.rename(active, rolled)\n }\n } catch {\n /* file doesn't exist yet */\n }\n await fs.appendFile(active, `${JSON.stringify(record)}\\n`, 'utf8')\n // Mirror genuinely-new rows into the lazy index. Update rows (marked\n // with `_update: true` by updateRun/updateSpan) are applied by those\n // methods directly via the index's update* APIs — re-inserting them\n // here triggers a duplicate-id error once the first read populates\n // the index. Await the mirror: a fire-and-forget would let an index\n // rejection go unhandled and let disk + index diverge silently.\n if (this.index && !(record as { _update?: boolean })?._update) {\n await this.insertInto(name, record)\n }\n }\n\n private async insertInto(name: string, record: unknown): Promise<void> {\n if (!this.index) return\n switch (name) {\n case 'runs':\n await this.index.appendRun(record as Run)\n break\n case 'spans':\n await this.index.appendSpan(record as Span)\n break\n case 'events':\n await this.index.appendEvent(record as TraceEvent)\n break\n case 'artifacts':\n await this.index.appendArtifact(record as Artifact)\n break\n case 'budget':\n await this.index.appendBudgetEntry(record as BudgetLedgerEntry)\n break\n }\n }\n\n private load(): Promise<InMemoryTraceStore> {\n // Memoize: concurrent first reads share one build, and an append racing an\n // in-flight load awaits this same promise (see append()).\n this.indexPromise ??= this.buildIndex()\n return this.indexPromise\n }\n\n private async buildIndex(): Promise<InMemoryTraceStore> {\n const fs = await import('node:fs/promises')\n const path = await import('node:path')\n const store = new InMemoryTraceStore()\n let entries: string[]\n try {\n entries = await fs.readdir(this.dir)\n } catch {\n // No dir yet (first run / empty corpus). Anything past this point — parse\n // errors, missing patch bases — is real corruption and must fail loud.\n this.index = store\n return store\n }\n // Replay files in write order. For one entity, rolled files\n // (`name.<ts>.ndjson`) are older than the active bare file (`name.ndjson`),\n // and readdir order is not chronological — so without this sort a patch in\n // an older rolled file could be applied AFTER (overwrite) a newer patch in\n // the active file, silently restoring a stale field. Sort: per entity,\n // rolled ascending by timestamp, then the bare active file last.\n entries.sort((a, b) => {\n // Group by the same entity base the loop uses (`split('.')[0]`); within an\n // entity, real rollover files (`<base>.<ms>.ndjson`) sort by timestamp\n // ascending and the bare active file (no numeric segment) sorts last.\n // Non-rollover names tie (Infinity) and a stable sort preserves their\n // readdir order.\n const baseA = a.split('.')[0]!\n const baseB = b.split('.')[0]!\n if (baseA !== baseB) return baseA < baseB ? -1 : 1\n const ta = a.match(/^[^.]+\\.(\\d+)\\.ndjson$/)\n const tb = b.match(/^[^.]+\\.(\\d+)\\.ndjson$/)\n const tsA = ta ? Number(ta[1]) : Number.POSITIVE_INFINITY\n const tsB = tb ? Number(tb[1]) : Number.POSITIVE_INFINITY\n return tsA - tsB\n })\n {\n // Two-pass load. Pass 1 indexes all full (base) rows; pass 2 replays the\n // `_update` patch rows that updateRun/updateSpan append. readdir order is\n // not deterministic and rollover splits a stream across files, so a patch\n // can be read before its base. Applying patches in a separate pass — after\n // every base row is indexed — means a patch always finds its target.\n // Doing it in one pass let a patch hit the catch and append a runId-less\n // fragment, corrupting span/run counts cross-instance.\n const runUpdates: Array<Record<string, unknown>> = []\n const spanUpdates: Array<Record<string, unknown>> = []\n for (const file of entries) {\n if (!file.endsWith('.ndjson')) continue\n const full = path.join(this.dir, file)\n const content = await fs.readFile(full, 'utf8')\n const base = file.split('.')[0]\n const lines = content.split('\\n')\n for (let ln = 0; ln < lines.length; ln++) {\n const line = lines[ln]!\n if (!line.trim()) continue\n let record: ReturnType<typeof JSON.parse>\n try {\n record = JSON.parse(line)\n } catch (err) {\n // Fail loud WITH context — a bare SyntaxError loses which file/line\n // is corrupt and which valid rows surround it.\n throw new Error(\n `FileSystemTraceStore: corrupt NDJSON in ${file} line ${ln + 1}: ${\n err instanceof Error ? err.message : String(err)\n } — ${line.slice(0, 120)}`,\n )\n }\n if (base === 'runs') {\n if (record?._update) {\n runUpdates.push(record)\n continue\n }\n // A duplicate full row (same dir loaded twice into one stream) is\n // collapsed last-write-wins rather than thrown.\n try {\n await store.appendRun(record)\n } catch {\n await store.updateRun(record.runId, record)\n }\n } else if (base === 'spans') {\n // `updateSpan` appends an `_update: true` patch row instead of\n // rewriting the original span. Deferred to pass 2 so it collapses\n // onto the original span — otherwise a fresh FileSystemTraceStore\n // reading the same dir reports duplicate spans (one full, one\n // fragment with no runId/kind/name), which breaks any downstream\n // consumer that re-opens the store cross-process (e.g. the OTLP\n // converter).\n if (record?._update) {\n spanUpdates.push(record)\n continue\n }\n await store.appendSpan(record)\n } else if (base === 'events') {\n await store.appendEvent(record)\n } else if (base === 'artifacts') {\n await store.appendArtifact(record)\n } else if (base === 'budget') {\n await store.appendBudgetEntry(record)\n }\n }\n }\n // Pass 2: every base row is now indexed. A patch whose base is genuinely\n // absent (truncated/partial corpus) throws inside update* — we let it\n // propagate rather than silently appending a fragment, so a corrupt\n // corpus fails loud instead of polluting counts.\n for (const record of runUpdates) {\n await store.updateRun(record.runId as string, record as Partial<Run>)\n }\n for (const record of spanUpdates) {\n await store.updateSpan(record.spanId as string, record as Partial<Span>)\n }\n }\n this.index = store\n return store\n }\n\n async appendRun(run: Run): Promise<void> {\n await this.append('runs', run)\n }\n async updateRun(runId: string, patch: Partial<Run>): Promise<void> {\n // NDJSON is append-only; record updates as new rows with the same runId —\n // readers collapse by last-write-wins on load.\n await this.append('runs', { runId, ...patch, _update: true })\n if (this.index) await this.index.updateRun(runId, patch)\n }\n async appendSpan(span: Span): Promise<void> {\n await this.append('spans', span)\n }\n async updateSpan(spanId: string, patch: Partial<Span>): Promise<void> {\n await this.append('spans', { spanId, ...patch, _update: true })\n if (this.index) await this.index.updateSpan(spanId, patch)\n }\n async appendEvent(event: TraceEvent): Promise<void> {\n await this.append('events', event)\n }\n async appendArtifact(artifact: Artifact): Promise<void> {\n await this.append('artifacts', artifact)\n }\n async appendBudgetEntry(entry: BudgetLedgerEntry): Promise<void> {\n await this.append('budget', entry)\n }\n\n async getRun(runId: string): Promise<Run | undefined> {\n return (await this.load()).getRun(runId)\n }\n async listRuns(filter?: RunFilter): Promise<Run[]> {\n return (await this.load()).listRuns(filter)\n }\n async spans(filter?: SpanFilter): Promise<Span[]> {\n return (await this.load()).spans(filter)\n }\n async events(filter?: EventFilter): Promise<TraceEvent[]> {\n return (await this.load()).events(filter)\n }\n async budget(runId: string): Promise<BudgetLedgerEntry[]> {\n return (await this.load()).budget(runId)\n }\n async artifacts(runId: string): Promise<Artifact[]> {\n return (await this.load()).artifacts(runId)\n }\n}\n"],"mappings":";AA0EA,IAAa,qBAAb,MAAsD;CACpD,uBAAe,IAAI,IAAiB;CACpC,WAA2B,CAAC;CAC5B,YAAkC,CAAC;CACnC,eAAmC,CAAC;CACpC,YAAyC,CAAC;CAE1C,MAAM,UAAU,KAAyB;EACvC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,MAAM,IAAI,MAAM,OAAO,IAAI,MAAM,gBAAgB;EAC/E,KAAK,KAAK,IAAI,IAAI,OAAO,EAAE,GAAG,IAAI,CAAC;CACrC;CAEA,MAAM,UAAU,OAAe,OAAoC;EACjE,MAAM,WAAW,KAAK,KAAK,IAAI,KAAK;EACpC,IAAI,CAAC,UAAU,MAAM,IAAI,MAAM,OAAO,MAAM,WAAW;EACvD,KAAK,KAAK,IAAI,OAAO;GAAE,GAAG;GAAU,GAAG;EAAM,CAAC;CAChD;CAEA,MAAM,WAAW,MAA2B;EAC1C,KAAK,SAAS,KAAK,EAAE,GAAG,KAAK,CAAC;CAChC;CAEA,MAAM,WAAW,QAAgB,OAAqC;EACpE,MAAM,MAAM,KAAK,SAAS,WAAW,MAAM,EAAE,WAAW,MAAM;EAC9D,IAAI,MAAM,GAAG,MAAM,IAAI,MAAM,QAAQ,OAAO,WAAW;EACvD,KAAK,SAAS,OAAO;GAAE,GAAG,KAAK,SAAS;GAAM,GAAG;EAAM;CACzD;CAEA,MAAM,YAAY,OAAkC;EAClD,KAAK,UAAU,KAAK,EAAE,GAAG,MAAM,CAAC;CAClC;CAEA,MAAM,eAAe,UAAmC;EACtD,KAAK,aAAa,KAAK,EAAE,GAAG,SAAS,CAAC;CACxC;CAEA,MAAM,kBAAkB,OAAyC;EAC/D,KAAK,UAAU,KAAK,EAAE,GAAG,MAAM,CAAC;CAClC;CAEA,MAAM,OAAO,OAAyC;EACpD,MAAM,IAAI,KAAK,KAAK,IAAI,KAAK;EAC7B,OAAO,IAAI,EAAE,GAAG,EAAE,IAAI,KAAA;CACxB;CAEA,MAAM,SAAS,SAAoB,CAAC,GAAmB;EACrD,OAAO,CAAC,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,MAAM,WAAW,GAAG,MAAM,CAAC;CACpE;CAEA,MAAM,MAAM,SAAqB,CAAC,GAAoB;EACpD,OAAO,KAAK,SAAS,QAAQ,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,GAAG,EAAE,EAAE;CAClF;CAEA,MAAM,OAAO,SAAsB,CAAC,GAA0B;EAC5D,OAAO,KAAK,UAAU,QAAQ,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,GAAG,EAAE,EAAE;CACpF;CAEA,MAAM,OAAO,OAA6C;EACxD,OAAO,KAAK,UAAU,QAAQ,MAAM,EAAE,UAAU,KAAK,CAAC,CAAC,KAAK,OAAO,EAAE,GAAG,EAAE,EAAE;CAC9E;CAEA,MAAM,UAAU,OAAoC;EAClD,OAAO,KAAK,aAAa,QAAQ,MAAM,EAAE,UAAU,KAAK,CAAC,CAAC,KAAK,OAAO,EAAE,GAAG,EAAE,EAAE;CACjF;AACF;AAEA,SAAS,WAAW,GAAQ,GAAuB;CACjD,IAAI,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,OAAO;CAC1D,IAAI,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,OAAO;CACvD,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,OAAO;CAC9C,IAAI,EAAE,UAAU,KAAA,KAAa,EAAE,YAAY,EAAE,OAAO,OAAO;CAC3D,IAAI,EAAE,UAAU,KAAA,KAAa,EAAE,YAAY,EAAE,OAAO,OAAO;CAC3D,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,SAAS,EAAE,IAAI,OAAO,OAAO;CACzD,IAAI,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,OAAO;CAC7D,IAAI,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,OAAO;CACvD,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,OAAO;CAC9C,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,OAAO;CAC3C,OAAO;AACT;AAEA,SAAS,YAAY,GAAS,GAAwB;CACpD,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,OAAO;CAC3C,IAAI,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,OAAO;CAChE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO;CACxC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO;CACxC,IAAI,EAAE,aAAa,EAAE,SAAS,UAAU,EAAE,aAAa,EAAE,WAAW,OAAO;CAC3E,IAAI,EAAE,YAAY,EAAE,SAAS,WAAW,EAAE,YAAY,EAAE,UAAU,OAAO;CACzE,IAAI,EAAE,UAAU,KAAA,KAAa,EAAE,YAAY,EAAE,OAAO,OAAO;CAC3D,IAAI,EAAE,UAAU,KAAA,KAAa,EAAE,YAAY,EAAE,OAAO,OAAO;CAC3D,OAAO;AACT;AAEA,SAAS,aAAa,GAAe,GAAyB;CAC5D,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,OAAO;CAC3C,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,OAAO;CAC9C,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO;CACxC,IAAI,EAAE,UAAU,KAAA,KAAa,EAAE,YAAY,EAAE,OAAO,OAAO;CAC3D,IAAI,EAAE,UAAU,KAAA,KAAa,EAAE,YAAY,EAAE,OAAO,OAAO;CAC3D,OAAO;AACT;AAUA,IAAa,uBAAb,MAAwD;CACtD;CACA;;CAEA;;;CAGA;;;CAGA,oBAA4B;;;;;;;;CAQ5B,8BAAsB,IAAI,IAA2B;CAErD,YAAY,SAAsC;EAChD,KAAK,MAAM,QAAQ;EACnB,KAAK,WAAW,QAAQ,YAAY,KAAK,OAAO;CAClD;CAEA,MAAc,YAA2B;EAEvC,OAAM,MADW,OAAO,oBAAA,CACf,MAAM,KAAK,KAAK,EAAE,WAAW,KAAK,CAAC;CAC9C;CAEA,MAAc,OAAO,MAAc,QAAgC;EAIjE,IAAI,KAAK,cAAc,MAAM,KAAK;EAKlC,MAAM,UADQ,KAAK,YAAY,IAAI,IAAI,KAAK,QAAQ,QAAQ,EAAA,CACvC,WAAW,KAAK,aAAa,MAAM,MAAM,CAAC;EAC/D,MAAM,OAAO,OAAO,WACZ,CAAC,SACD,CAAC,CACT;EACA,KAAK,YAAY,IAAI,MAAM,IAAI;EAC/B,IAAI;GACF,MAAM;EACR,UAAU;GAGR,IAAI,KAAK,YAAY,IAAI,IAAI,MAAM,MAAM,KAAK,YAAY,OAAO,IAAI;EACvE;CACF;CAEA,MAAc,aAAa,MAAc,QAAgC;EACvE,MAAM,KAAK,UAAU;EACrB,MAAM,KAAK,MAAM,OAAO;EACxB,MAAM,OAAO,MAAM,OAAO;EAC1B,MAAM,SAAS,KAAK,KAAK,KAAK,KAAK,GAAG,KAAK,QAAQ;EACnD,IAAI;GAEF,KAAI,MADe,GAAG,KAAK,MAAM,EAAA,CACxB,QAAQ,KAAK,UAAU;IAG9B,MAAM,QAAQ,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,oBAAoB,CAAC;IAC7D,KAAK,oBAAoB;IACzB,MAAM,SAAS,KAAK,KAAK,KAAK,KAAK,GAAG,KAAK,GAAG,MAAM,QAAQ;IAC5D,MAAM,GAAG,OAAO,QAAQ,MAAM;GAChC;EACF,QAAQ,CAER;EACA,MAAM,GAAG,WAAW,QAAQ,GAAG,KAAK,UAAU,MAAM,EAAE,KAAK,MAAM;EAOjE,IAAI,KAAK,SAAS,CAAE,QAAkC,SACpD,MAAM,KAAK,WAAW,MAAM,MAAM;CAEtC;CAEA,MAAc,WAAW,MAAc,QAAgC;EACrE,IAAI,CAAC,KAAK,OAAO;EACjB,QAAQ,MAAR;GACE,KAAK;IACH,MAAM,KAAK,MAAM,UAAU,MAAa;IACxC;GACF,KAAK;IACH,MAAM,KAAK,MAAM,WAAW,MAAc;IAC1C;GACF,KAAK;IACH,MAAM,KAAK,MAAM,YAAY,MAAoB;IACjD;GACF,KAAK;IACH,MAAM,KAAK,MAAM,eAAe,MAAkB;IAClD;GACF,KAAK;IACH,MAAM,KAAK,MAAM,kBAAkB,MAA2B;IAC9D;EACJ;CACF;CAEA,OAA4C;EAG1C,KAAK,iBAAiB,KAAK,WAAW;EACtC,OAAO,KAAK;CACd;CAEA,MAAc,aAA0C;EACtD,MAAM,KAAK,MAAM,OAAO;EACxB,MAAM,OAAO,MAAM,OAAO;EAC1B,MAAM,QAAQ,IAAI,mBAAmB;EACrC,IAAI;EACJ,IAAI;GACF,UAAU,MAAM,GAAG,QAAQ,KAAK,GAAG;EACrC,QAAQ;GAGN,KAAK,QAAQ;GACb,OAAO;EACT;EAOA,QAAQ,MAAM,GAAG,MAAM;GAMrB,MAAM,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC;GAC3B,MAAM,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC;GAC3B,IAAI,UAAU,OAAO,OAAO,QAAQ,QAAQ,KAAK;GACjD,MAAM,KAAK,EAAE,MAAM,wBAAwB;GAC3C,MAAM,KAAK,EAAE,MAAM,wBAAwB;GAG3C,QAFY,KAAK,OAAO,GAAG,EAAE,IAAI,OAAO,sBAC5B,KAAK,OAAO,GAAG,EAAE,IAAI,OAAO;EAE1C,CAAC;EACD;GAQE,MAAM,aAA6C,CAAC;GACpD,MAAM,cAA8C,CAAC;GACrD,KAAK,MAAM,QAAQ,SAAS;IAC1B,IAAI,CAAC,KAAK,SAAS,SAAS,GAAG;IAC/B,MAAM,OAAO,KAAK,KAAK,KAAK,KAAK,IAAI;IACrC,MAAM,UAAU,MAAM,GAAG,SAAS,MAAM,MAAM;IAC9C,MAAM,OAAO,KAAK,MAAM,GAAG,CAAC,CAAC;IAC7B,MAAM,QAAQ,QAAQ,MAAM,IAAI;IAChC,KAAK,IAAI,KAAK,GAAG,KAAK,MAAM,QAAQ,MAAM;KACxC,MAAM,OAAO,MAAM;KACnB,IAAI,CAAC,KAAK,KAAK,GAAG;KAClB,IAAI;KACJ,IAAI;MACF,SAAS,KAAK,MAAM,IAAI;KAC1B,SAAS,KAAK;MAGZ,MAAM,IAAI,MACR,2CAA2C,KAAK,QAAQ,KAAK,EAAE,IAC7D,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAChD,KAAK,KAAK,MAAM,GAAG,GAAG,GACzB;KACF;KACA,IAAI,SAAS,QAAQ;MACnB,IAAI,QAAQ,SAAS;OACnB,WAAW,KAAK,MAAM;OACtB;MACF;MAGA,IAAI;OACF,MAAM,MAAM,UAAU,MAAM;MAC9B,QAAQ;OACN,MAAM,MAAM,UAAU,OAAO,OAAO,MAAM;MAC5C;KACF,OAAO,IAAI,SAAS,SAAS;MAQ3B,IAAI,QAAQ,SAAS;OACnB,YAAY,KAAK,MAAM;OACvB;MACF;MACA,MAAM,MAAM,WAAW,MAAM;KAC/B,OAAO,IAAI,SAAS,UAClB,MAAM,MAAM,YAAY,MAAM;UACzB,IAAI,SAAS,aAClB,MAAM,MAAM,eAAe,MAAM;UAC5B,IAAI,SAAS,UAClB,MAAM,MAAM,kBAAkB,MAAM;IAExC;GACF;GAKA,KAAK,MAAM,UAAU,YACnB,MAAM,MAAM,UAAU,OAAO,OAAiB,MAAsB;GAEtE,KAAK,MAAM,UAAU,aACnB,MAAM,MAAM,WAAW,OAAO,QAAkB,MAAuB;EAE3E;EACA,KAAK,QAAQ;EACb,OAAO;CACT;CAEA,MAAM,UAAU,KAAyB;EACvC,MAAM,KAAK,OAAO,QAAQ,GAAG;CAC/B;CACA,MAAM,UAAU,OAAe,OAAoC;EAGjE,MAAM,KAAK,OAAO,QAAQ;GAAE;GAAO,GAAG;GAAO,SAAS;EAAK,CAAC;EAC5D,IAAI,KAAK,OAAO,MAAM,KAAK,MAAM,UAAU,OAAO,KAAK;CACzD;CACA,MAAM,WAAW,MAA2B;EAC1C,MAAM,KAAK,OAAO,SAAS,IAAI;CACjC;CACA,MAAM,WAAW,QAAgB,OAAqC;EACpE,MAAM,KAAK,OAAO,SAAS;GAAE;GAAQ,GAAG;GAAO,SAAS;EAAK,CAAC;EAC9D,IAAI,KAAK,OAAO,MAAM,KAAK,MAAM,WAAW,QAAQ,KAAK;CAC3D;CACA,MAAM,YAAY,OAAkC;EAClD,MAAM,KAAK,OAAO,UAAU,KAAK;CACnC;CACA,MAAM,eAAe,UAAmC;EACtD,MAAM,KAAK,OAAO,aAAa,QAAQ;CACzC;CACA,MAAM,kBAAkB,OAAyC;EAC/D,MAAM,KAAK,OAAO,UAAU,KAAK;CACnC;CAEA,MAAM,OAAO,OAAyC;EACpD,QAAQ,MAAM,KAAK,KAAK,EAAA,CAAG,OAAO,KAAK;CACzC;CACA,MAAM,SAAS,QAAoC;EACjD,QAAQ,MAAM,KAAK,KAAK,EAAA,CAAG,SAAS,MAAM;CAC5C;CACA,MAAM,MAAM,QAAsC;EAChD,QAAQ,MAAM,KAAK,KAAK,EAAA,CAAG,MAAM,MAAM;CACzC;CACA,MAAM,OAAO,QAA6C;EACxD,QAAQ,MAAM,KAAK,KAAK,EAAA,CAAG,OAAO,MAAM;CAC1C;CACA,MAAM,OAAO,OAA6C;EACxD,QAAQ,MAAM,KAAK,KAAK,EAAA,CAAG,OAAO,KAAK;CACzC;CACA,MAAM,UAAU,OAAoC;EAClD,QAAQ,MAAM,KAAK,KAAK,EAAA,CAAG,UAAU,KAAK;CAC5C;AACF"}
@@ -1,117 +1,6 @@
1
1
  import { a as RunRecord } from "./run-record-DdSa93_W.js";
2
- import { y as PairedBootstrapResult } from "./statistics-C-dm-J6H.js";
2
+ import { r as PairedDecisionStatistic } from "./paired-promotion-decision-B6zJ3gYM.js";
3
3
  import { n as FailureClusterReport } from "./failure-cluster-CqcvCcdR.js";
4
- //#region src/paired-promotion-decision.d.ts
5
- /** Which paired estimator produced the deciding interval. */
6
- type PairedDecisionStatistic = 'paired_risk_difference' | 'mean_bootstrap' | 'median_bootstrap';
7
- /** Which test carried the decision, given the estimator and the sample size. */
8
- type PairedDecisionMethod = 'score-interval' | 'bootstrap-ci' | 'exact-sign';
9
- /** McNemar's exact paired-binary evidence, on the two-point path only. */
10
- interface PairedMcNemarEvidence {
11
- /** Discordant pairs the treatment won. */
12
- b: number;
13
- /** Discordant pairs the control won. */
14
- c: number;
15
- /** b + c — the only pairs carrying information. */
16
- nDiscordant: number;
17
- /** Two-sided exact p-value. */
18
- pValue: number;
19
- }
20
- interface PairedPromotionDecisionOptions {
21
- /** Smallest candidate-minus-baseline delta that counts as improvement, in the
22
- * caller's native units. May be negative (a noninferiority margin). Default 0. */
23
- threshold?: number;
24
- /** Confidence level. Default 0.95. */
25
- confidence?: number;
26
- /** Bootstrap resamples, on the paths where a bootstrap decides. Default 2000. */
27
- resamples?: number;
28
- /** Deterministic bootstrap seed. Omitted ⇒ derived from the deltas. */
29
- seed?: number;
30
- /** Caller-required paired observations. The exact test may impose a higher
31
- * minimum; the effective one is reported as `minimumPairs`. */
32
- minPairs?: number;
33
- /**
34
- * `'mean'` (default) routes by SHAPE: a two-point (pass/fail) outcome on any
35
- * encoding decides on the score interval, everything else on the mean
36
- * bootstrap. `'median'` forces the median bootstrap on every input, including
37
- * shapes where it is structurally blind — kept for callers who want outlier
38
- * robustness on genuinely continuous outcomes and accept that cost.
39
- */
40
- statistic?: 'mean' | 'median';
41
- }
42
- interface PairedPromotionDecision {
43
- /** Paired observations supplied. */
44
- n: number;
45
- /** Threshold the interval was judged against, native units. */
46
- threshold: number;
47
- confidence: number;
48
- statistic: PairedDecisionStatistic;
49
- method: PairedDecisionMethod;
50
- /** Common positive level of a two-point outcome ({0,1} ⇒ 1, {0,100} ⇒ 100),
51
- * or null when the outcome is not two-point. Non-null is exactly the
52
- * condition for the `paired_risk_difference` path, and it is the factor
53
- * `delta` / `low` / `high` were rescaled by. */
54
- binaryScale: number | null;
55
- /** Exact-tie fraction over the paired deltas; null when there are no pairs. */
56
- tieFraction: number | null;
57
- /** Point estimate of the DECIDING statistic, in the caller's native units. */
58
- delta: number;
59
- /** Lower bound of the DECIDING interval, native units. */
60
- low: number;
61
- /** Upper bound of the DECIDING interval, native units. */
62
- high: number;
63
- /** The bootstrap that decided, or null when the score interval did. Callers
64
- * that need a bootstrap as a diagnostic on the two-point path compute their
65
- * own — it is not computed here, so the binary path costs no resamples. */
66
- bootstrap: PairedBootstrapResult | null;
67
- /** McNemar's exact evidence, or null off the two-point path. */
68
- mcnemar: PairedMcNemarEvidence | null;
69
- /** Exact one-sided sign-test p-value on the small-sample bootstrap path;
70
- * null otherwise. */
71
- pValue: number | null;
72
- /** Effective observation minimum after accounting for confidence. */
73
- minimumPairs: number;
74
- /** n >= minimumPairs. */
75
- sufficient: boolean;
76
- /** The deciding interval is zero-width or non-finite — no evidence in either
77
- * direction, so it cannot clear any threshold on evidence. */
78
- indeterminate: boolean;
79
- /** McNemar's exact test refuses at a non-negative threshold. */
80
- exactTestVetoes: boolean;
81
- /** The deciding interval clears the threshold, ignoring the other two guards. */
82
- clearsThreshold: boolean;
83
- /** `sufficient && !indeterminate && clearsThreshold && !exactTestVetoes` —
84
- * the whole rule. */
85
- promote: boolean;
86
- /** What `delta` measures, for a reason string. */
87
- label: 'success-rate' | 'mean' | 'median';
88
- /** Why a zero-width interval is zero-width; empty when it is not. */
89
- indeterminateCause: string;
90
- /** Sentence naming the test when the exact sign test decided; else empty. */
91
- methodDetail: string;
92
- }
93
- /** The shape facts that pick the estimator, without computing an interval. */
94
- interface PairedDecisionShape {
95
- statistic: PairedDecisionStatistic;
96
- /** Common positive level of a two-point outcome; null when not two-point. */
97
- binaryScale: number | null;
98
- /** Exact-tie fraction over the paired deltas; null when there are no pairs. */
99
- tieFraction: number | null;
100
- }
101
- /**
102
- * Which estimator {@link decidePairedPromotion} would use on this data, and the
103
- * shape facts behind it — for callers that must report the shape on a path
104
- * where no interval is computed at all (an early rejection, or zero pairs).
105
- * Cheap: no bootstrap, no interval.
106
- */
107
- declare function pairedDecisionShape(before: number[], after: number[], statistic?: 'mean' | 'median'): PairedDecisionShape;
108
- /**
109
- * Decide whether a paired candidate-minus-baseline delta clears a promotion
110
- * threshold. `before` is the baseline arm, `after` the candidate arm, paired by
111
- * position. Throws on unequal lengths.
112
- */
113
- declare function decidePairedPromotion(before: number[], after: number[], options?: PairedPromotionDecisionOptions): PairedPromotionDecision;
114
- //#endregion
115
4
  //#region src/held-out-gate.d.ts
116
5
  type HeldOutGateRejectionCode = 'few_runs' | 'incomplete_coverage' | 'missing_split_scores' | 'missing_cost' | 'negative_delta' | 'indeterminate_delta' | 'overfit_gap' | 'cost_ceiling';
117
6
  /**
@@ -635,5 +524,5 @@ interface ResearchReport {
635
524
  */
636
525
  declare function researchReport(runs: RunRecord[], opts?: ResearchReportOptions): Promise<ResearchReport>;
637
526
  //#endregion
638
- export { PairedMcNemarEvidence as A, HeldOutGate as C, PairedDecisionMethod as D, SplitCoverage as E, PairedPromotionDecisionOptions as M, decidePairedPromotion as N, PairedDecisionShape as O, pairedDecisionShape as P, GateEvidence as S, HeldOutGateRejectionCode as T, paretoChart as _, ParetoPoint as a, DeltaStatistic as b, ResearchReportCandidate as c, ResearchReportOptions as d, ResearchReportRecommendation as f, gainHistogram as g, SummaryTableRow as h, ParetoFigureSpec as i, PairedPromotionDecision as j, PairedDecisionStatistic as k, ResearchReportDecision as l, SummaryTableOptions as m, GainDistributionFigureSpec as n, RESEARCH_REPORT_HARD_PAIR_FLOOR as o, SummaryTable as p, GainDistributionOptions as r, ResearchReport as s, GainDistributionBin as t, ResearchReportMethodology as u, researchReport as v, HeldOutGateConfig as w, GateDecision as x, summaryTable as y };
639
- //# sourceMappingURL=summary-report-B0cAyA7N.d.ts.map
527
+ export { HeldOutGate as C, SplitCoverage as E, GateEvidence as S, HeldOutGateRejectionCode as T, paretoChart as _, ParetoPoint as a, DeltaStatistic as b, ResearchReportCandidate as c, ResearchReportOptions as d, ResearchReportRecommendation as f, gainHistogram as g, SummaryTableRow as h, ParetoFigureSpec as i, ResearchReportDecision as l, SummaryTableOptions as m, GainDistributionFigureSpec as n, RESEARCH_REPORT_HARD_PAIR_FLOOR as o, SummaryTable as p, GainDistributionOptions as r, ResearchReport as s, GainDistributionBin as t, ResearchReportMethodology as u, researchReport as v, HeldOutGateConfig as w, GateDecision as x, summaryTable as y };
528
+ //# sourceMappingURL=summary-report-DuUS_i7W.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary-report-DuUS_i7W.d.ts","names":[],"sources":["../src/held-out-gate.ts","../src/summary-report.ts"],"mappings":";;;;KAwIY;;;;;;;;UAiBK;;EAEf;;;EAGA;;;;EAIA;;EAEA;;EAEA;;;EAGA;;UAGe;;;;EAIf;;;;;EAKA;;;;;;;;;;;EAWA;;;;EAIA;;;EAGA;;EAEA;;EAEA;;;EAGA;;;;;;;;;;;;;;;;;EAiBA;;;;;;;;;;;;;EAaA;;;;KAKU,iBAAiB;UAEZ;;EAEf;;EAEA;;EAEA;;;;;;;;EAQA,iBAAiB;;;;;EAKjB,gBAAgB;;;;;EAKhB;;;;;;;;;EASA,gBAAgB;;;EAGhB;;;EAGA;IAAY;IAAa;;;;EAGzB;;;;;;;EAOA;IAAW;IAAW;IAAW;IAAqB;;;;;;EAKtD;;;;;EAKA;;EAEA;;EAEA;;EAEA;;EAEA;;;;;EAKA;;;EAGA;;;;;;;EAOA;;UAGe;;EAEf;;EAEA;;EAEA;;EAEA,UAAU;;EAEV;;EAEA,eAAe;;;;;;;cAQJ;mBACM;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;EAEjB,YAAY,QAAQ;;;;EAoCpB,SAAS,WAAW,aAAa,UAAU,cAAc;;;;;;;UA2SjD;;;;UC7oBO;;;EAGf;;EAEA;;EAEA;;EAEA;;UAGe;EACf;EACA;EACA;EACA;EACA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;UAGe;EACf,MAAM;EACN;EACA;;EAEA;;;;;;;iBAQc,aAAa,MAAM,aAAa,OAAM,sBAA2B;UA6IhE;EACf;;EAEA;;EAEA;;EAEA;;;EAGA;;;EAGA;;UAGe;EACf;EACA;EACA,QAAQ;EACR;IAAQ;IAAc;;;;;;;;iBAQR,YACd,MAAM,aACN;EACE;EACA,gBAAgB,eAAe;IAEhC;UAsDc;;EAEf;;EAEA;;EAEA;;UAGe;EACf;EACA;EACA;EACA;;EAEA;;EAEA;;EAEA;EACA,MAAM;EACN;EACA;IAAM;IAAa;;;UAGJ;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;;;;;;iBAQc,cACd,MAAM,aACN,qBACA,oBACA,OAAM,0BACL;KA8ES;;;;;;cAYC;UAEI;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;;;;;;;;EASA;;;;;;;EAOA;IAAS;IAAa;;;;;;EAKtB;;;;;EAKA;;EAEA,gBAAgB,eAAe;;EAE/B,kBAAkB;;EAElB;;EAEA;;EAEA;;;;;;EAMA;;UAGe;EACf,UAAU;EACV;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;IAAU;IAAa;;;;;;;EAMvB;EACA;;;;;;;EAOA;EACA;EACA,OAAO;EACP,UAAU;EACV;;UAGe;;;;;EAKf;;EAEA;;EAEA;;EAEA;;EAEA;;UAGe;EACf;EACA;EACA;EACA;EACA;;;;;;EAMA;EACA;EACA;IAAQ;IAAa;;EACrB;EACA,gBAAgB;EAChB,YAAY;EACZ,SAAS;EACT;IACE,QAAQ;IACR,OAAO;;EAET,aAAa;EACb,kBAAkB;EAClB;EACA;;;;;;;;;;;;;;;;;;;;;iBA6IoB,eACpB,MAAM,aACN,OAAM,wBACL,QAAQ"}
@@ -1,4 +1,4 @@
1
- import { h as hashJson, p as canonicalize } from "./agent-profile-cell-CbfBm2g6.js";
1
+ import { r as hashJson, t as canonicalize } from "./pre-registration-DakwTRXk.js";
2
2
  import { r as observedSplitScore } from "./reward-nw2xZGZG.js";
3
3
  import { D as pairedCohensDz, E as pairedBootstrap, W as wilcoxonSignedRank, d as confidenceInterval, k as pairedMde, s as benjaminiHochberg } from "./statistics-ByxzSiOM.js";
4
4
  import { r as pairRunRecords } from "./paired-arms-iZ08VFMN.js";
@@ -864,4 +864,4 @@ function fmt(x) {
864
864
  //#endregion
865
865
  export { summaryTable as a, researchReport as i, gainHistogram as n, paretoChart as r, RESEARCH_REPORT_HARD_PAIR_FLOOR as t };
866
866
 
867
- //# sourceMappingURL=summary-report-9A5y7EsK.js.map
867
+ //# sourceMappingURL=summary-report-Lf-5I7xh.js.map