@tangle-network/agent-eval 0.217.1 → 0.218.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 (172) hide show
  1. package/CHANGELOG.md +36 -1
  2. package/dist/adapters/http.d.ts +2 -2
  3. package/dist/analyst/index.d.ts +1 -1
  4. package/dist/analyst/index.d.ts.map +1 -1
  5. package/dist/analyst/index.js +9 -9
  6. package/dist/analyst/index.js.map +1 -1
  7. package/dist/{analyze-runs-DyeNcenW.d.ts → analyze-runs-DjlZOVXx.d.ts} +2 -2
  8. package/dist/{analyze-runs-DyeNcenW.d.ts.map → analyze-runs-DjlZOVXx.d.ts.map} +1 -1
  9. package/dist/{benchmark-command-xQK8nOI6.js → benchmark-command-BupdHRyf.js} +661 -562
  10. package/dist/benchmark-command-BupdHRyf.js.map +1 -0
  11. package/dist/benchmarks/index.d.ts +4 -4
  12. package/dist/benchmarks/index.js +3 -3
  13. package/dist/campaign/index.d.ts +4 -4
  14. package/dist/campaign/index.js +10 -10
  15. package/dist/{campaign-CJGkxAQ6.js → campaign-CGvUTnmc.js} +312 -281
  16. package/dist/{campaign-CJGkxAQ6.js.map → campaign-CGvUTnmc.js.map} +1 -1
  17. package/dist/{campaign-evidence-CQYw8_0H.js → campaign-evidence-DunzcJGv.js} +2 -2
  18. package/dist/{campaign-evidence-CQYw8_0H.js.map → campaign-evidence-DunzcJGv.js.map} +1 -1
  19. package/dist/{chat-client-ldqxYYTN.js → chat-client-B2pXlPdx.js} +2 -2
  20. package/dist/{chat-client-ldqxYYTN.js.map → chat-client-B2pXlPdx.js.map} +1 -1
  21. package/dist/{chat-json-call-DavzexSp.js → chat-json-call-Dm9c-b41.js} +2 -2
  22. package/dist/{chat-json-call-DavzexSp.js.map → chat-json-call-Dm9c-b41.js.map} +1 -1
  23. package/dist/cli.js +10 -10
  24. package/dist/{completion-verifier-B_jw6C9p.js → completion-verifier-DbLVf3i8.js} +4 -4
  25. package/dist/{completion-verifier-B_jw6C9p.js.map → completion-verifier-DbLVf3i8.js.map} +1 -1
  26. package/dist/contract/index.d.ts +7 -7
  27. package/dist/contract/index.js +90 -10
  28. package/dist/contract/index.js.map +1 -1
  29. package/dist/{default-registry-ClYjq3QE.js → default-registry-BJ-Pq6yL.js} +309 -277
  30. package/dist/{default-registry-ClYjq3QE.js.map → default-registry-BJ-Pq6yL.js.map} +1 -1
  31. package/dist/{define-agent-eval-BDxNlP3D.js → define-agent-eval-BGdFKlrc.js} +165 -105
  32. package/dist/define-agent-eval-BGdFKlrc.js.map +1 -0
  33. package/dist/{define-agent-eval-BIkH_gAR.d.ts → define-agent-eval-BlH10zEw.d.ts} +6 -6
  34. package/dist/{define-agent-eval-BIkH_gAR.d.ts.map → define-agent-eval-BlH10zEw.d.ts.map} +1 -1
  35. package/dist/diagnosis/index.d.ts +1 -1
  36. package/dist/{dspy-rlm-engine-DhdCr1Dc.js → dspy-rlm-engine-CSMwudLO.js} +2 -2
  37. package/dist/{dspy-rlm-engine-DhdCr1Dc.js.map → dspy-rlm-engine-CSMwudLO.js.map} +1 -1
  38. package/dist/eval-campaign-BUMIxKTE.js +393 -0
  39. package/dist/eval-campaign-BUMIxKTE.js.map +1 -0
  40. package/dist/{evaluation-jTjC_QQD.d.ts → evaluation-BOZ38vOH.d.ts} +2 -2
  41. package/dist/{evaluation-jTjC_QQD.d.ts.map → evaluation-BOZ38vOH.d.ts.map} +1 -1
  42. package/dist/evaluation.d.ts +1 -1
  43. package/dist/experiment/index.d.ts +1 -1
  44. package/dist/experiment/index.d.ts.map +1 -1
  45. package/dist/experiment/index.js +110 -71
  46. package/dist/experiment/index.js.map +1 -1
  47. package/dist/{exporters-Cl6IeNAu.js → exporters-DWvM16LE.js} +2 -2
  48. package/dist/{exporters-Cl6IeNAu.js.map → exporters-DWvM16LE.js.map} +1 -1
  49. package/dist/{external-optimizer-process-KVFGvYX1.js → external-optimizer-process-C3Wm7Vhn.js} +2 -2
  50. package/dist/{external-optimizer-process-KVFGvYX1.js.map → external-optimizer-process-C3Wm7Vhn.js.map} +1 -1
  51. package/dist/{external-optimizer-subprocess-XIHBOSKt.js → external-optimizer-subprocess-B5gdLRZv.js} +3 -3
  52. package/dist/{external-optimizer-subprocess-XIHBOSKt.js.map → external-optimizer-subprocess-B5gdLRZv.js.map} +1 -1
  53. package/dist/{findings-store-BMVQtEsm.js → findings-store-BtTzPL0d.js} +5 -5
  54. package/dist/{findings-store-BMVQtEsm.js.map → findings-store-BtTzPL0d.js.map} +1 -1
  55. package/dist/{hf-dataset-D9f7-oX7.js → hf-dataset-CKxIJQba.js} +3 -3
  56. package/dist/{hf-dataset-D9f7-oX7.js.map → hf-dataset-CKxIJQba.js.map} +1 -1
  57. package/dist/hosted/index.js +1 -1
  58. package/dist/{index-ZuWx52WG.d.ts → index-B16FNdW5.d.ts} +34 -17
  59. package/dist/index-B16FNdW5.d.ts.map +1 -0
  60. package/dist/{index-9jJ2fKSX.d.ts → index-CalAsXMR.d.ts} +7 -5
  61. package/dist/index-CalAsXMR.d.ts.map +1 -0
  62. package/dist/{index-BiT6RtNH.d.ts → index-DbMOXYnP.d.ts} +6 -6
  63. package/dist/{index-BiT6RtNH.d.ts.map → index-DbMOXYnP.d.ts.map} +1 -1
  64. package/dist/index.d.ts +9 -9
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +611 -688
  67. package/dist/index.js.map +1 -1
  68. package/dist/{integrity-DOd9Q86O.js → integrity-C8oUeB0g.js} +322 -197
  69. package/dist/integrity-C8oUeB0g.js.map +1 -0
  70. package/dist/{journal-CR4QikYp.js → journal-C7om8Gum.js} +48 -38
  71. package/dist/journal-C7om8Gum.js.map +1 -0
  72. package/dist/ledger-core/index.d.ts +1 -1
  73. package/dist/ledger-core/index.js +2 -2
  74. package/dist/ledger-core/lock-holder.d.ts +2 -0
  75. package/dist/ledger-core/lock-holder.js +181 -0
  76. package/dist/ledger-core/lock-holder.js.map +1 -0
  77. package/dist/{ledger-core-DrJhbms9.js → ledger-core-CAxUdDk0.js} +2 -2
  78. package/dist/{ledger-core-DrJhbms9.js.map → ledger-core-CAxUdDk0.js.map} +1 -1
  79. package/dist/{llm-client-BshCREn6.js → llm-client-_Y6ic-tf.js} +238 -248
  80. package/dist/llm-client-_Y6ic-tf.js.map +1 -0
  81. package/dist/{llm-judge-C8jMTNNG.js → llm-judge-Djxh-Uhs.js} +646 -458
  82. package/dist/llm-judge-Djxh-Uhs.js.map +1 -0
  83. package/dist/lock-holder-DaJbfpci.d.ts +86 -0
  84. package/dist/lock-holder-DaJbfpci.d.ts.map +1 -0
  85. package/dist/{matrix-DHe-dwVJ.d.ts → matrix-CCSBna4q.d.ts} +2 -2
  86. package/dist/{matrix-DHe-dwVJ.d.ts.map → matrix-CCSBna4q.d.ts.map} +1 -1
  87. package/dist/{mint-zszyYlpA.js → mint-CbdwjTPW.js} +2 -2
  88. package/dist/{mint-zszyYlpA.js.map → mint-CbdwjTPW.js.map} +1 -1
  89. package/dist/multishot/golden/index.d.ts +1 -1
  90. package/dist/multishot/index.d.ts +2 -2
  91. package/dist/openapi.json +1 -1
  92. package/dist/{pareto-BzsxidFD.js → pareto-CTv8vozZ.js} +4 -4
  93. package/dist/{pareto-BzsxidFD.js.map → pareto-CTv8vozZ.js.map} +1 -1
  94. package/dist/{promotion-gate-DaY95yU6.d.ts → promotion-gate-CxEHRsZW.d.ts} +2 -2
  95. package/dist/{promotion-gate-DaY95yU6.d.ts.map → promotion-gate-CxEHRsZW.d.ts.map} +1 -1
  96. package/dist/{proposal-findings-BbWidvUk.js → proposal-findings-n-5WBbEx.js} +2 -2
  97. package/dist/{proposal-findings-BbWidvUk.js.map → proposal-findings-n-5WBbEx.js.map} +1 -1
  98. package/dist/{render-C-w2EZ6p.js → render-Cs34y0iX.js} +404 -208
  99. package/dist/render-Cs34y0iX.js.map +1 -0
  100. package/dist/reporting.d.ts +2 -2
  101. package/dist/{researcher-0ABVIdGa.d.ts → researcher-GU1tV4dn.d.ts} +2 -2
  102. package/dist/{researcher-0ABVIdGa.d.ts.map → researcher-GU1tV4dn.d.ts.map} +1 -1
  103. package/dist/rl.d.ts +2 -2
  104. package/dist/rl.js +4 -4
  105. package/dist/rollout/index.js +5 -5
  106. package/dist/{rollout-D6C50mfA.js → rollout-Dd1ucT_M.js} +5 -5
  107. package/dist/{rollout-D6C50mfA.js.map → rollout-Dd1ucT_M.js.map} +1 -1
  108. package/dist/schema-C-ziyJD7.d.ts.map +1 -1
  109. package/dist/{schema-DxcKTzbi.js → schema-CvhfLjtZ.js} +77 -47
  110. package/dist/schema-CvhfLjtZ.js.map +1 -0
  111. package/dist/search/index.d.ts +2 -2
  112. package/dist/search/index.d.ts.map +1 -1
  113. package/dist/search/index.js +2 -2
  114. package/dist/{search-kernel-DxqjBxA-.d.ts → search-kernel-p9JB3SmL.d.ts} +3 -3
  115. package/dist/{search-kernel-DxqjBxA-.d.ts.map → search-kernel-p9JB3SmL.d.ts.map} +1 -1
  116. package/dist/{search-ledger-TUvB5gWH.js → search-ledger-ClpN4I3e.js} +4 -4
  117. package/dist/{search-ledger-TUvB5gWH.js.map → search-ledger-ClpN4I3e.js.map} +1 -1
  118. package/dist/{search-ledger-file-UKCO2r8a.js → search-ledger-file-Bd5Tioq6.js} +3 -3
  119. package/dist/{search-ledger-file-UKCO2r8a.js.map → search-ledger-file-Bd5Tioq6.js.map} +1 -1
  120. package/dist/{search-shipper-Cw2z3-td.js → search-shipper-Bg2HW3Uv.js} +3 -3
  121. package/dist/{search-shipper-Cw2z3-td.js.map → search-shipper-Bg2HW3Uv.js.map} +1 -1
  122. package/dist/{search-summary-DQIvJsSB.js → search-summary-CrBuvVnf.js} +3 -3
  123. package/dist/{search-summary-DQIvJsSB.js.map → search-summary-CrBuvVnf.js.map} +1 -1
  124. package/dist/{server-DoVbqqtJ.js → server-C6M0qR8h.js} +2 -2
  125. package/dist/{server-DoVbqqtJ.js.map → server-C6M0qR8h.js.map} +1 -1
  126. package/dist/{single-run-lock-U58yf8N6.js → single-run-lock-Dekd8_Wv.js} +7 -7
  127. package/dist/single-run-lock-Dekd8_Wv.js.map +1 -0
  128. package/dist/{skillopt-optimization-method-kyL94-ri.js → skillopt-optimization-method-5dlex7MJ.js} +1339 -1059
  129. package/dist/skillopt-optimization-method-5dlex7MJ.js.map +1 -0
  130. package/dist/{statistical-heldout-C9AbgREN.d.ts → statistical-heldout-BHfLZHrm.d.ts} +2 -2
  131. package/dist/{statistical-heldout-C9AbgREN.d.ts.map → statistical-heldout-BHfLZHrm.d.ts.map} +1 -1
  132. package/dist/{summary-report-DM7tlml1.d.ts → summary-report-CkbRcSuu.d.ts} +16 -1
  133. package/dist/summary-report-CkbRcSuu.d.ts.map +1 -0
  134. package/dist/supervisor-run/index.d.ts.map +1 -1
  135. package/dist/supervisor-run/index.js +3 -3
  136. package/dist/{systemone-Bp_Ac0p1.d.ts → systemone-BMzDJb1i.d.ts} +3 -3
  137. package/dist/{systemone-Bp_Ac0p1.d.ts.map → systemone-BMzDJb1i.d.ts.map} +1 -1
  138. package/dist/systemone.d.ts +2 -2
  139. package/dist/{terminal-record-78g6E4vh.js → terminal-record-D4Rv-j1W.js} +241 -193
  140. package/dist/{terminal-record-78g6E4vh.js.map → terminal-record-D4Rv-j1W.js.map} +1 -1
  141. package/dist/trajectory-replay/index.d.ts +4 -1
  142. package/dist/trajectory-replay/index.d.ts.map +1 -1
  143. package/dist/trajectory-replay/index.js +834 -824
  144. package/dist/trajectory-replay/index.js.map +1 -1
  145. package/dist/{tree-BGRglkKd.js → tree-B5e1uAeL.js} +122 -14
  146. package/dist/tree-B5e1uAeL.js.map +1 -0
  147. package/dist/{types-DtMbFw6U.d.ts → types-BKCzzmit.d.ts} +2 -2
  148. package/dist/{types-DtMbFw6U.d.ts.map → types-BKCzzmit.d.ts.map} +1 -1
  149. package/dist/{types-D8GhJoHk.d.ts → types-DtkO1G9L.d.ts} +2 -2
  150. package/dist/{types-D8GhJoHk.d.ts.map → types-DtkO1G9L.d.ts.map} +1 -1
  151. package/dist/wire/index.js +1 -1
  152. package/docs/design/statistics-decisions.md +1 -1
  153. package/docs/eval-surface-map.md +1 -0
  154. package/docs/profile-json-identity.md +1 -2
  155. package/docs/public-api.md +27 -16
  156. package/package.json +7 -2
  157. package/dist/benchmark-command-xQK8nOI6.js.map +0 -1
  158. package/dist/define-agent-eval-BDxNlP3D.js.map +0 -1
  159. package/dist/eval-campaign-BLEfBGbA.js +0 -343
  160. package/dist/eval-campaign-BLEfBGbA.js.map +0 -1
  161. package/dist/index-9jJ2fKSX.d.ts.map +0 -1
  162. package/dist/index-ZuWx52WG.d.ts.map +0 -1
  163. package/dist/integrity-DOd9Q86O.js.map +0 -1
  164. package/dist/journal-CR4QikYp.js.map +0 -1
  165. package/dist/llm-client-BshCREn6.js.map +0 -1
  166. package/dist/llm-judge-C8jMTNNG.js.map +0 -1
  167. package/dist/render-C-w2EZ6p.js.map +0 -1
  168. package/dist/schema-DxcKTzbi.js.map +0 -1
  169. package/dist/single-run-lock-U58yf8N6.js.map +0 -1
  170. package/dist/skillopt-optimization-method-kyL94-ri.js.map +0 -1
  171. package/dist/summary-report-DM7tlml1.d.ts.map +0 -1
  172. package/dist/tree-BGRglkKd.js.map +0 -1
@@ -4,20 +4,20 @@ import { r as summarizeExecution, t as analyzeRuns } from "../analyze-runs-DqPJa
4
4
  import { i as pairedBootstrap } from "../mean-BbA_JCzW.js";
5
5
  import { t as decidePairedPromotion } from "../paired-promotion-decision-D0SHb-ZL.js";
6
6
  import { a as heldoutSignificance } from "../statistical-heldout-Bksv92Th.js";
7
- import { B as defaultProductionGate, Q as runCampaign, Z as runEval, i as transientDispatchFailure, o as clamp01, p as runImprovementLoop, t as llmJudge } from "../llm-judge-C8jMTNNG.js";
7
+ import { B as defaultProductionGate, Q as runCampaign, Z as runEval, i as transientDispatchFailure, o as clamp01, p as runImprovementLoop, t as llmJudge } from "../llm-judge-Djxh-Uhs.js";
8
8
  import { i as isModelPriced, n as estimateCost } from "../metrics-BKaPBtIG.js";
9
9
  import { t as CostLedger } from "../cost-ledger-D0352Z4d.js";
10
- import { z as campaignSplitDigest } from "../campaign-evidence-CQYw8_0H.js";
11
- import { o as mapConcurrentRange } from "../journal-CR4QikYp.js";
12
- import { M as fsCampaignStorage, N as inMemoryCampaignStorage } from "../external-optimizer-subprocess-XIHBOSKt.js";
10
+ import { z as campaignSplitDigest } from "../campaign-evidence-DunzcJGv.js";
11
+ import { o as mapConcurrentRange } from "../journal-C7om8Gum.js";
12
+ import { M as fsCampaignStorage, N as inMemoryCampaignStorage } from "../external-optimizer-subprocess-B5gdLRZv.js";
13
13
  import { a as makeProposalFinding } from "../types-DqFMNTgK.js";
14
14
  import { n as isRecord } from "../json-BhdsJaOQ.js";
15
- import { n as SelfImproveRunError, r as selfImprove, t as defineAgentEval } from "../define-agent-eval-BDxNlP3D.js";
16
- import { t as buildDefaultAnalystRegistry } from "../default-registry-ClYjq3QE.js";
15
+ import { n as SelfImproveRunError, r as selfImprove, t as defineAgentEval } from "../define-agent-eval-BGdFKlrc.js";
16
+ import { t as buildDefaultAnalystRegistry } from "../default-registry-BJ-Pq6yL.js";
17
17
  import { t as extractUsage } from "../extract-usage-BZLU01kR.js";
18
- import { t as createChatClient } from "../chat-client-ldqxYYTN.js";
18
+ import { t as createChatClient } from "../chat-client-B2pXlPdx.js";
19
19
  import { n as InMemoryOutcomeStore, t as FileSystemOutcomeStore } from "../outcome-store-DUcMj-3D.js";
20
- import { c as composeGate, l as externalTextOptimizationMethod, n as compareOptimizationMethods, r as gepaOptimizationMethod, s as heldOutGate, t as skillOptOptimizationMethod } from "../skillopt-optimization-method-kyL94-ri.js";
20
+ import { c as composeGate, l as externalTextOptimizationMethod, n as compareOptimizationMethods, r as gepaOptimizationMethod, s as heldOutGate, t as skillOptOptimizationMethod } from "../skillopt-optimization-method-5dlex7MJ.js";
21
21
  import { n as paretoPolicy, r as paretoSignificanceGate, t as buildEvidenceVector } from "../promotion-policy-6A8osGr_.js";
22
22
  import { t as fromOtelSpans } from "../otel-spans-CdN909k1.js";
23
23
  import { createHash } from "node:crypto";
@@ -369,6 +369,11 @@ function assertKnownCost(cost, label) {
369
369
  * only validates the projected measurements and derives their shared decision.
370
370
  */
371
371
  function evaluatePairedMeasurements(options) {
372
+ return pairedVerdict(budgetAndChecks(runTotals(dimensionRegressions(pairedEstimates(validatePairedInput({ options }))))));
373
+ }
374
+ /** The checked policy and measurements, their cell ids, shared dimensions and score arrays. */
375
+ function validatePairedInput(prev) {
376
+ const { options } = prev;
372
377
  if (options.measurements.length === 0) throw new Error("paired measurement evaluation requires at least one paired cell");
373
378
  const preparationCost = options.preparationCost ?? {
374
379
  usd: 0,
@@ -384,6 +389,28 @@ function evaluatePairedMeasurements(options) {
384
389
  const baselineScores = measurements.map((measurement) => measurement.baseline.score);
385
390
  const candidateScores = measurements.map((measurement) => measurement.candidate.score);
386
391
  const { confidenceLevel: confidence, resamples, bootstrapSeed, deltaThreshold, minProductiveRuns, budgetUsd, criticalDimensions, regressionTolerance } = policy;
392
+ return {
393
+ ...prev,
394
+ preparationCost,
395
+ policy,
396
+ measurements,
397
+ cellIds,
398
+ dimensions,
399
+ baselineScores,
400
+ candidateScores,
401
+ confidence,
402
+ resamples,
403
+ bootstrapSeed,
404
+ deltaThreshold,
405
+ minProductiveRuns,
406
+ budgetUsd,
407
+ criticalDimensions,
408
+ regressionTolerance
409
+ };
410
+ }
411
+ /** Held-out significance, the overall, cost and latency estimates, and the observed power. */
412
+ function pairedEstimates(prev) {
413
+ const { options, measurements, cellIds, dimensions, baselineScores, candidateScores, confidence, resamples, bootstrapSeed, deltaThreshold, minProductiveRuns } = prev;
387
414
  const significance = heldoutSignificance({
388
415
  before: baselineScores,
389
416
  after: candidateScores,
@@ -456,6 +483,19 @@ function evaluatePairedMeasurements(options) {
456
483
  confidence,
457
484
  sharedScorerChannel: options.sharedScorerChannel
458
485
  });
486
+ return {
487
+ ...prev,
488
+ significance,
489
+ overall,
490
+ objectives,
491
+ cost,
492
+ latency,
493
+ power
494
+ };
495
+ }
496
+ /** Critical dimensions that regressed, on either burden of proof. */
497
+ function dimensionRegressions(prev) {
498
+ const { measurements, dimensions, confidence, resamples, bootstrapSeed, minProductiveRuns, criticalDimensions, regressionTolerance, objectives, power } = prev;
459
499
  const powerSufficient = power.sufficient;
460
500
  const guardedDimensions = new Set(criticalDimensions);
461
501
  const missingCriticalDimensions = criticalDimensions.filter((dimension) => !dimensions.includes(dimension));
@@ -473,9 +513,22 @@ function evaluatePairedMeasurements(options) {
473
513
  }).promote;
474
514
  }));
475
515
  const regressions = objectives.filter((objective) => objective.kind === "dimension" && guardedDimensions.has(objective.name) && objective.availability === "measured" && (objective.confidenceInterval.lower < -regressionTolerance || regressionProven.has(objective.name)));
516
+ return {
517
+ ...prev,
518
+ powerSufficient,
519
+ guardedDimensions,
520
+ missingCriticalDimensions,
521
+ regressionProven,
522
+ regressions
523
+ };
524
+ }
525
+ /** Run completion, per-task regressions and the measurement cost. */
526
+ function runTotals(prev) {
527
+ const { options, measurements } = prev;
476
528
  const measurementCostUsd = measurements.reduce((sum, measurement) => sum + measurement.baseline.costUsd + measurement.candidate.costUsd, 0);
477
529
  const measurementWorkDurationMs = measurements.reduce((sum, measurement) => sum + measurement.baseline.latencyMs + measurement.candidate.latencyMs, 0);
478
- const incompleteRuns = measurements.flatMap((measurement) => [measurement.baseline, measurement.candidate]).filter((run) => !run.completed);
530
+ const completedRuns = measurements.flatMap((measurement) => [measurement.baseline, measurement.candidate]);
531
+ const incompleteRuns = completedRuns.filter((run) => !run.completed);
479
532
  const regressedTasks = measurements.filter((measurement) => !measurement.candidate.passed && measurement.baseline.passed);
480
533
  const sharedTaskFailures = measurements.filter((measurement) => !measurement.candidate.passed && !measurement.baseline.passed);
481
534
  const repairedTasks = measurements.filter((measurement) => measurement.candidate.passed && !measurement.baseline.passed);
@@ -484,7 +537,22 @@ function evaluatePairedMeasurements(options) {
484
537
  provenance: measurements.every((measurement) => measurement.baseline.costProvenance === "observed" && measurement.candidate.costProvenance === "observed") ? "observed" : "estimated"
485
538
  };
486
539
  const measurementCost = options.measurementCost ?? derivedMeasurementCost;
487
- assertKnownCost(measurementCost, "paired measurement cost");
540
+ return {
541
+ ...prev,
542
+ measurementCostUsd,
543
+ measurementWorkDurationMs,
544
+ completedRuns,
545
+ incompleteRuns,
546
+ regressedTasks,
547
+ sharedTaskFailures,
548
+ repairedTasks,
549
+ derivedMeasurementCost,
550
+ measurementCost
551
+ };
552
+ }
553
+ /** Total cost against the budget, and the checks the verdict is drawn from. */
554
+ function budgetAndChecks(prev) {
555
+ const { options, preparationCost, budgetUsd, significance, powerSufficient, missingCriticalDimensions, regressions, incompleteRuns, regressedTasks, derivedMeasurementCost, measurementCost } = prev;
488
556
  if (options.measurementCost !== void 0 && (measurementCost.provenance !== derivedMeasurementCost.provenance || !numbersApproximatelyEqual(measurementCost.usd, derivedMeasurementCost.usd))) throw new Error("paired measurement cost does not match its signed receipts");
489
557
  const totalCost = {
490
558
  usd: preparationCost.usd + measurementCost.usd,
@@ -519,6 +587,18 @@ function evaluatePairedMeasurements(options) {
519
587
  ];
520
588
  const shipped = checks.every((check) => check.passed);
521
589
  const hardFailure = incompleteRuns.length > 0 || regressedTasks.length > 0 || regressions.length > 0 || missingCriticalDimensions.length > 0 || !budgetPassed;
590
+ return {
591
+ ...prev,
592
+ totalCost,
593
+ budgetPassed,
594
+ checks,
595
+ shipped,
596
+ hardFailure
597
+ };
598
+ }
599
+ /** The verdict, its reasons and the evaluation record. */
600
+ function pairedVerdict(prev) {
601
+ const { options, baselineScores, confidence, deltaThreshold, budgetUsd, significance, overall, objectives, power, powerSufficient, missingCriticalDimensions, regressions, measurementWorkDurationMs, incompleteRuns, regressedTasks, sharedTaskFailures, repairedTasks, measurementCost, totalCost, budgetPassed, checks, shipped, hardFailure } = prev;
522
602
  const reasons = [
523
603
  ...significance.significant ? [] : [significanceReason(significance, deltaThreshold)],
524
604
  ...powerSufficient || significance.fewRuns ? [] : [power.reason],