@tangle-network/agent-eval 0.175.0 → 0.177.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/adapters/http.d.ts +1 -1
  3. package/dist/agent-profile-cell-0gSi5ffD.js +374 -0
  4. package/dist/agent-profile-cell-0gSi5ffD.js.map +1 -0
  5. package/dist/analyst/index.d.ts +2 -2
  6. package/dist/analyst/index.js +3 -3
  7. package/dist/{benchmark-command-D_5xG9LG.js → benchmark-command-BrsZhMSk.js} +7 -7
  8. package/dist/{benchmark-command-D_5xG9LG.js.map → benchmark-command-BrsZhMSk.js.map} +1 -1
  9. package/dist/benchmarks/index.d.ts +1 -1
  10. package/dist/benchmarks/index.js +3 -3
  11. package/dist/campaign/index.d.ts +3 -3
  12. package/dist/campaign/index.js +9 -9
  13. package/dist/{campaign-BzMSCejE.js → campaign-CIn-ErlJ.js} +111 -13
  14. package/dist/campaign-CIn-ErlJ.js.map +1 -0
  15. package/dist/campaign-evidence-D8DBLqLI.js +2083 -0
  16. package/dist/campaign-evidence-D8DBLqLI.js.map +1 -0
  17. package/dist/cli.js +1 -1
  18. package/dist/contract/index.d.ts +4 -4
  19. package/dist/contract/index.js +8 -8
  20. package/dist/{define-agent-eval-ox5McL6e.js → define-agent-eval-CJG7LD9M.js} +54 -36
  21. package/dist/define-agent-eval-CJG7LD9M.js.map +1 -0
  22. package/dist/{define-agent-eval-V1jQyCDR.d.ts → define-agent-eval-CqmlXUfQ.d.ts} +11 -4
  23. package/dist/define-agent-eval-CqmlXUfQ.d.ts.map +1 -0
  24. package/dist/{dspy-rlm-engine-Caz2pl4L.js → dspy-rlm-engine-DqjER2sV.js} +2 -2
  25. package/dist/{dspy-rlm-engine-Caz2pl4L.js.map → dspy-rlm-engine-DqjER2sV.js.map} +1 -1
  26. package/dist/{eval-campaign-BeAjdhzC.js → eval-campaign-Cs-7MiCs.js} +4 -5
  27. package/dist/{eval-campaign-BeAjdhzC.js.map → eval-campaign-Cs-7MiCs.js.map} +1 -1
  28. package/dist/experiment/index.d.ts +3 -68
  29. package/dist/experiment/index.d.ts.map +1 -1
  30. package/dist/experiment/index.js +6 -128
  31. package/dist/experiment/index.js.map +1 -1
  32. package/dist/{attestation-XSUpbc4o.js → experiment-tracker-BKEumQug.js} +2 -96
  33. package/dist/experiment-tracker-BKEumQug.js.map +1 -0
  34. package/dist/{attestation-c1QvaBdX.d.ts → experiment-tracker-CNwqCZFD.d.ts} +2 -78
  35. package/dist/experiment-tracker-CNwqCZFD.d.ts.map +1 -0
  36. package/dist/{external-optimizer-process-CxnFL1hd.js → external-optimizer-process-Dlz8YxrT.js} +3 -3
  37. package/dist/{external-optimizer-process-CxnFL1hd.js.map → external-optimizer-process-Dlz8YxrT.js.map} +1 -1
  38. package/dist/{external-optimizer-subprocess-CQi27uEI.js → external-optimizer-subprocess-q3VzlGAO.js} +2 -2
  39. package/dist/{external-optimizer-subprocess-CQi27uEI.js.map → external-optimizer-subprocess-q3VzlGAO.js.map} +1 -1
  40. package/dist/{index-DKXuBPXf.d.ts → index-CtGf6e6X.d.ts} +50 -10
  41. package/dist/index-CtGf6e6X.d.ts.map +1 -0
  42. package/dist/{index-BTrx5s8m.d.ts → index-DuaNwvse.d.ts} +4 -4
  43. package/dist/{index-BTrx5s8m.d.ts.map → index-DuaNwvse.d.ts.map} +1 -1
  44. package/dist/{index-D-UdhAmg.d.ts → index-u0d1Jp4F.d.ts} +4 -2
  45. package/dist/{index-D-UdhAmg.d.ts.map → index-u0d1Jp4F.d.ts.map} +1 -1
  46. package/dist/index.d.ts +4 -4
  47. package/dist/index.js +14 -15
  48. package/dist/index.js.map +1 -1
  49. package/dist/ledger-core/index.d.ts +2 -2
  50. package/dist/ledger-core/index.js +2 -2
  51. package/dist/{ledger-core-PIfjCbKn.js → ledger-core-Cs9f7385.js} +60 -47
  52. package/dist/{ledger-core-PIfjCbKn.js.map → ledger-core-Cs9f7385.js.map} +1 -1
  53. package/dist/{llm-judge-DmNaBrXB.js → llm-judge-CV80fkYA.js} +1039 -1517
  54. package/dist/llm-judge-CV80fkYA.js.map +1 -0
  55. package/dist/{mint-vWOdD8Ae.js → mint-Cc1_zwRQ.js} +2 -2
  56. package/dist/{mint-vWOdD8Ae.js.map → mint-Cc1_zwRQ.js.map} +1 -1
  57. package/dist/openapi.json +1 -1
  58. package/dist/{produced-state-B8mw6zj9.js → produced-state-CQFi465p.js} +3 -2
  59. package/dist/{produced-state-B8mw6zj9.js.map → produced-state-CQFi465p.js.map} +1 -1
  60. package/dist/profile-cell.js +1 -268
  61. package/dist/{promotion-policy-LY9mVQ7W.js → promotion-policy-DWOm70gx.js} +2 -2
  62. package/dist/{promotion-policy-LY9mVQ7W.js.map → promotion-policy-DWOm70gx.js.map} +1 -1
  63. package/dist/{release-confidence-BsGEg_xg.js → release-confidence-BcGCclTB.js} +2 -2
  64. package/dist/{release-confidence-BsGEg_xg.js.map → release-confidence-BcGCclTB.js.map} +1 -1
  65. package/dist/reporting.js +2 -2
  66. package/dist/{reward-hacking-CKW4teig.js → reward-hacking-D0XwhVWE.js} +2 -215
  67. package/dist/reward-hacking-D0XwhVWE.js.map +1 -0
  68. package/dist/rl.js +5 -4
  69. package/dist/rl.js.map +1 -1
  70. package/dist/rollout/index.js +2 -2
  71. package/dist/{rollout-CGlDq1GI.js → rollout-DmoJVqrF.js} +2 -2
  72. package/dist/{rollout-CGlDq1GI.js.map → rollout-DmoJVqrF.js.map} +1 -1
  73. package/dist/run-record-CR63CpHK.js +216 -0
  74. package/dist/run-record-CR63CpHK.js.map +1 -0
  75. package/dist/{run-record-ZIsR9Fif.js → run-record-DQpSf7t-.js} +2 -2
  76. package/dist/{run-record-ZIsR9Fif.js.map → run-record-DQpSf7t-.js.map} +1 -1
  77. package/dist/{semantic-concept-judge-E3s_fEjB.js → semantic-concept-judge-Dw-f7TEs.js} +3 -3
  78. package/dist/{semantic-concept-judge-E3s_fEjB.js.map → semantic-concept-judge-Dw-f7TEs.js.map} +1 -1
  79. package/dist/{sequential-B51qAYE4.js → sequential-B5gXgcyp.js} +3 -3
  80. package/dist/{sequential-B51qAYE4.js.map → sequential-B5gXgcyp.js.map} +1 -1
  81. package/dist/{skillopt-optimization-method-f7399oGb.js → skillopt-optimization-method-D0o2c2yM.js} +6 -749
  82. package/dist/skillopt-optimization-method-D0o2c2yM.js.map +1 -0
  83. package/dist/{statistical-heldout-Cqb73yE9.d.ts → statistical-heldout-Z9NROFFS.d.ts} +156 -3
  84. package/dist/statistical-heldout-Z9NROFFS.d.ts.map +1 -0
  85. package/dist/{summary-report-Bgh8CpNK.js → summary-report-B16xy9Kd.js} +2 -2
  86. package/dist/{summary-report-Bgh8CpNK.js.map → summary-report-B16xy9Kd.js.map} +1 -1
  87. package/dist/traces.js +1 -1
  88. package/docs/campaign-proposers.md +44 -0
  89. package/docs/public-api.md +62 -39
  90. package/docs/search-history-receipts.md +48 -1
  91. package/package.json +1 -1
  92. package/dist/attestation-XSUpbc4o.js.map +0 -1
  93. package/dist/attestation-c1QvaBdX.d.ts.map +0 -1
  94. package/dist/campaign-BzMSCejE.js.map +0 -1
  95. package/dist/define-agent-eval-V1jQyCDR.d.ts.map +0 -1
  96. package/dist/define-agent-eval-ox5McL6e.js.map +0 -1
  97. package/dist/index-DKXuBPXf.d.ts.map +0 -1
  98. package/dist/llm-judge-DmNaBrXB.js.map +0 -1
  99. package/dist/power-preflight-CFXm0Vjo.js +0 -502
  100. package/dist/power-preflight-CFXm0Vjo.js.map +0 -1
  101. package/dist/pre-registration-D94b7Of5.js +0 -110
  102. package/dist/pre-registration-D94b7Of5.js.map +0 -1
  103. package/dist/profile-cell.js.map +0 -1
  104. package/dist/reward-hacking-CKW4teig.js.map +0 -1
  105. package/dist/skillopt-optimization-method-f7399oGb.js.map +0 -1
  106. package/dist/statistical-heldout-Cqb73yE9.d.ts.map +0 -1
@@ -20,6 +20,50 @@ Use it when one surface must get better.
20
20
  Use it when two or more methods must be compared at equal budget.
21
21
  Runnable versions: [`examples/self-improve-optimizer`](../examples/self-improve-optimizer/) and [`examples/compare-optimization-methods`](../examples/compare-optimization-methods/).
22
22
 
23
+ ## Compose searches over a candidate
24
+
25
+ Use `scopedOptimizationMethod()` to change one projection while scoring the complete candidate.
26
+ The caller supplies `project` and `merge`; Eval does not prescribe profile names or learning procedures.
27
+ Their roundtrip must preserve the exact baseline before any child search runs.
28
+ Scoped artifact paths and dispatch identity include the complete parent hash to prevent reuse across different evaluation contexts.
29
+ A text or component surface can include serialized profiles, working evaluation definitions, and immutable state references.
30
+ The host must resolve and verify those references when executing a candidate.
31
+ Keep final decision cases outside the working candidate and every optimizer callback.
32
+
33
+ Use `sequentialOptimizationMethod()` to pass each selected candidate into the next method.
34
+ It does not require an intermediate candidate to beat the original baseline.
35
+ Each child can use GEPA, SkillOpt, or an arbitrary `OptimizationMethod` callback.
36
+ Use the existing GEPA recipe when only the optimizer engines change over one shared surface.
37
+
38
+ ```ts
39
+ const learnerThenSpecialist = sequentialOptimizationMethod({
40
+ name: 'learner-then-specialist',
41
+ methods: [
42
+ scopedOptimizationMethod({
43
+ name: 'learner', method: learnerSearch,
44
+ project: selectLearner, merge: replaceLearner,
45
+ }),
46
+ scopedOptimizationMethod({
47
+ name: 'specialist', method: specialistSearch,
48
+ project: selectSpecialist, merge: replaceSpecialist,
49
+ }),
50
+ ],
51
+ })
52
+ ```
53
+
54
+ Pass this method and a joint method to `compareOptimizationMethods()` to compare their final candidates.
55
+ Its existing `optimizationConcurrency` controls independent searches; stages inside a sequence run in order.
56
+ All children share the spend account and receive only train and selection cases.
57
+ Child costs are reconciled separately and summed without adding ledger charges.
58
+ The returned `composition.stages` preserves each baseline hash, selected surface, cost, provenance, token usage, and history receipt.
59
+ Missing child usage remains missing in that child's provenance.
60
+ Comparison scores retain this composition.
61
+
62
+ Set `searchHistoryPolicy: 'require-complete'` on the outer comparison or `selfImprove()` call to require every child receipt.
63
+ Set `searchHistoryVerification: 'ledger'` to verify each referenced ledger before final assessment.
64
+ Composite history coverage contains recursive `stages`; it does not fabricate one aggregate receipt.
65
+ Any parent receipt supplied by a custom method is also verified; it cannot replace missing child evidence.
66
+
23
67
  ## Read An Improvement Result
24
68
 
25
69
  `selfImprove({ method })` executes the complete method once and measures its selected surface on final cases.
@@ -7,11 +7,11 @@ Generated by `pnpm api:census` on demand — this is a dated reading, not a gate
7
7
  | measure | count |
8
8
  | --- | --- |
9
9
  | export subpaths | 28 |
10
- | published value exports (subpath x symbol) | 1380 |
11
- | distinct symbols | 1211 |
12
- | production | 931 |
10
+ | published value exports (subpath x symbol) | 1403 |
11
+ | distinct symbols | 1231 |
12
+ | production | 944 |
13
13
  | planned | 218 |
14
- | none | 231 |
14
+ | none | 241 |
15
15
 
16
16
  Type-only exports are not listed: a type binds no runtime surface, and removing one cannot break a caller at run time.
17
17
 
@@ -84,7 +84,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
84
84
 
85
85
  ### `.`
86
86
 
87
- 338 value exports — 271 production, 34 planned, 33 none.
87
+ 348 value exports — 273 production, 35 planned, 40 none.
88
88
 
89
89
  | symbol | consumer | evidence |
90
90
  | --- | --- | --- |
@@ -111,7 +111,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
111
111
  | `argHash` | production | agent-runtime:src/runtime/supervise/detector-monitor.ts |
112
112
  | `assertCapabilityHeadroom` | production | blueprint-agent:scripts/experiments/lib/validity-gates.ts |
113
113
  | `assertCrossFamily` | production | agent-builder:frontier/judges/artifact-head-to-head.ts |
114
- | `assertCrossFamilyServed` | planned | doc: docs/building-doctrine.md |
114
+ | `assertCrossFamilyServed` | planned | doc: README.md |
115
115
  | `assertNoHiddenLeak` | planned | doc: docs/design/statistics-decisions.md |
116
116
  | `assertNoJudgeVerdict` | production | this package: src/analyst/policy-edit.ts:6 |
117
117
  | `assertProductBenchmarkRun` | production | creative-agent:eval/research-package.ts |
@@ -151,6 +151,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
151
151
  | `checkTraceContracts` | production | creative-agent:eval/lib/trace-contracts.ts |
152
152
  | `clamp01` | production | agent-dev-container:products/intelligence/api/src/lib/consultant/executor.ts |
153
153
  | `classifyFailure` | production | phony:products/builder/api/src/eval/autoresearch/trace-analyst.ts |
154
+ | `classifyFailureReason` | none | only this package's tests: tests/failure-taxonomy.test.ts:2 |
154
155
  | `cliffsDelta` | production | agent-builder:src/lib/.server/eval/loops/differential-eval.ts |
155
156
  | `CODING_HARNESSES` | production | agent-runtime:src/runtime/define-leaderboard.ts |
156
157
  | `cohensD` | production | starter-foundry:examples/recruiter-eval-workspace/eval/src/eval/regression/gate.ts |
@@ -182,6 +183,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
182
183
  | `createAntiSlopJudge` | production | phony:products/builder/api/src/eval/judges.ts |
183
184
  | `createBoundedTraceAnalysisStore` | production | braid:src/adapters/analysis/trace-store.ts |
184
185
  | `createChatClient` | production | agent-dev-container:products/intelligence/api/src/lib/intent-audit-analyst.ts |
186
+ | `createChatTraceEngine` | planned | doc: docs/trace-analysis.md |
185
187
  | `createDspyRlmTraceEngine` | production | agent-dev-container:products/intelligence/api/src/lib/deep-trace-analyst.ts |
186
188
  | `createFeedbackTrajectory` | production | agent-builder:src/lib/.server/eval/feedback/feedback-capture.ts |
187
189
  | `createLlmCorrectnessChecker` | production | agent-app:src/eval/index.ts |
@@ -190,11 +192,14 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
190
192
  | `CrossFamilyError` | production | creative-agent:eval/lib/judge-ensemble.ts |
191
193
  | `decidePairedPromotion` | production | discovery-lab:tools/decide.mjs |
192
194
  | `DECISION_PAIRED_DELTA_STATISTIC` | production | this package: src/campaign/gates/promotion-policy.ts:33 |
195
+ | `DEFAULT_BOUNDED_PROCESS_TIMEOUT_MS` | production | this package: src/command-runner.ts:28 |
196
+ | `DEFAULT_FAILURE_REASON_RULES` | none | only this package's tests: tests/failure-taxonomy.test.ts:2 |
193
197
  | `DEFAULT_PERMUTATIONS` | none | — |
194
198
  | `DEFAULT_RED_TEAM_CORPUS` | production | starter-foundry:registry/layers/agent-eval/redteam/files/src/eval/redteam/runner.ts |
195
199
  | `DEFAULT_REDACTION_RULES` | production | agent-dev-container:products/intelligence/api/src/lib/redact.ts |
196
200
  | `DEFAULT_TRACE_ANALYST_BUDGETS` | production | agent-builder:src/lib/.server/eval/stores/d1-trace-analysis-store-adapter.ts |
197
201
  | `DEFAULT_TRACE_ANALYST_KINDS` | production | agent-dev-container:products/intelligence/api/src/lib/deep-trace-analyst.ts |
202
+ | `DEFAULT_TRACE_ANALYST_OUTPUT_TOKENS` | production | this package: src/analyst/chat-trace-engine.ts:46 |
198
203
  | `defaultBlendWeights` | production | blueprint-agent:scripts/experiments/lib/qa-grader.ts |
199
204
  | `defineAgentEval` | planned | example: examples/evaluate-a-change/index.ts:10 |
200
205
  | `defineEquivalenceCheck` | planned | example: examples/verify-without-an-answer-key/index.ts:13 |
@@ -225,8 +230,10 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
225
230
  | `extractProducedState` | production | agent-app:src/eval/index.ts |
226
231
  | `extractUsage` | production | this package: src/contract/intake/code-agent-session.ts:12 |
227
232
  | `extractUsageFromSse` | production | this package: src/trace/capture-fetch.ts:8 |
233
+ | `FAILURE_BLAME` | none | only this package's tests: tests/failure-taxonomy.test.ts:2 |
228
234
  | `FAILURE_CLASSES` | production | agent-dev-container:products/intelligence/api/src/lib/deep-trace-analyst.ts |
229
235
  | `FAILURE_MODE_KIND_SPEC` | planned | consumer tests: legal-agent:tests/eval/analysts/completion-coverage.ts |
236
+ | `failureBlame` | none | only this package's tests: tests/failure-taxonomy.test.ts:2 |
230
237
  | `failureClusterView` | production | insurance-agent:scripts/analyze-agent-eval-evidence.ts |
231
238
  | `feedbackTrajectoriesToDatasetScenarios` | production | creative-agent:eval/control/creative-onboarding.ts |
232
239
  | `feedbackTrajectoriesToOptimizerRows` | production | agent-dev-container:products/intelligence/api/src/lib/feedback-memory.ts |
@@ -251,6 +258,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
251
258
  | `holm` | planned | doc: docs/design/statistics-decisions.md |
252
259
  | `improvementVerdict` | production | blueprint-agent:scripts/experiments/lib/vb-improve-harness.ts |
253
260
  | `inferDomainKeywords` | production | blueprint-agent:scripts/experiments/lib/analyze-vb-run/suite-projection.ts |
261
+ | `INFRA_FAILURE_BLAMES` | none | only this package's tests: tests/failure-taxonomy.test.ts:2 |
254
262
  | `InMemoryFeedbackTrajectoryStore` | production | creative-agent:eval/control/creative-onboarding.ts |
255
263
  | `InMemoryRawProviderSink` | production | agent-builder:src/lib/.server/eval/loops/canonical-campaign.ts |
256
264
  | `inMemoryReviewStore` | production | agent-builder:scripts/propose-review-smoke.ts |
@@ -279,6 +287,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
279
287
  | `llmJudge` | production | agent-runtime:examples/agentic-data-creation/offline-fixtures.ts |
280
288
  | `LlmResponseError` | production | agent-dev-container:products/intelligence/api/src/lib/optimization-engine.ts |
281
289
  | `loadScorecard` | production | ai-trading-blueprint:evals/src/trading/scorecard-integration.ts |
290
+ | `LOCAL_COMMAND_RUNNER_DEFAULT_CAP_MS` | none | only this package's tests: src/command-runner.test.ts:6 |
282
291
  | `localCommandRunner` | production | blueprint-agent:scripts/experiments/lib/command-runner.ts |
283
292
  | `makeFinding` | production | agent-dev-container:products/intelligence/api/src/lib/consultant/candidates.ts |
284
293
  | `makePolicyEdit` | none | only this package's tests: src/analyst/policy-edit.test.ts:2 |
@@ -344,6 +353,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
344
353
  | `projectRuntimeTrajectoryEvidence` | production | agent-dev-container:products/intelligence/api/src/lib/workflow-trace-preflight.ts |
345
354
  | `PromptRegistry` | production | blueprint-agent:scripts/experiments/lib/surface-prompt-registry.ts |
346
355
  | `proposeSynthesisTargets` | production | blueprint-agent:scripts/experiments/researcher/inspect.ts |
356
+ | `quotaExhaustedUntil` | none | only this package's tests: src/campaign/transient-failure.test.ts:3 |
347
357
  | `ranks` | planned | doc: docs/design/statistics-decisions.md |
348
358
  | `readProductBenchmarkManifest` | production | creative-agent:eval/research-package.ts |
349
359
  | `recordRuns` | planned | consumer tests: tax-agent:tests/eval/benchmarks/taxcalc/analyze.mjs |
@@ -362,7 +372,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
362
372
  | `roundTripRunRecord` | none | only this package's tests: tests/run-record.test.ts:3 |
363
373
  | `routeFields` | none | only this package's tests: src/hidden-criteria-grading.test.ts:4 |
364
374
  | `runAgentControlLoop` | production | agent-runtime:src/run.ts |
365
- | `runBoundedProcess` | production | this package: src/sandbox-harness.ts:16 |
375
+ | `runBoundedProcess` | production | this package: src/command-runner.ts:28 |
366
376
  | `runCampaign` | production | agent-app:src/eval-campaign/index.ts |
367
377
  | `runCanaries` | production | agent-builder:src/lib/.server/eval/loops/canary-cron.ts |
368
378
  | `runCounterfactual` | production | traces:src/replay-batch.ts |
@@ -438,7 +448,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
438
448
 
439
449
  ### `./analyst`
440
450
 
441
- 127 value exports — 77 production, 19 planned, 31 none.
451
+ 129 value exports — 78 production, 20 planned, 31 none.
442
452
 
443
453
  | symbol | consumer | evidence |
444
454
  | --- | --- | --- |
@@ -484,6 +494,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
484
494
  | `CONTROL_INTEGRITY_ANALYST` | none | only this package's tests: src/analyst/kinds/control-integrity.test.ts:5 |
485
495
  | `ControlIntegrityAnalyst` | none | — |
486
496
  | `createChatClient` | production | agent-dev-container:products/intelligence/api/src/lib/intent-audit-analyst.ts |
497
+ | `createChatTraceEngine` | planned | doc: docs/trace-analysis.md |
487
498
  | `createDspyRlmTraceEngine` | production | agent-dev-container:products/intelligence/api/src/lib/deep-trace-analyst.ts |
488
499
  | `createPrimeBenchmarkRunner` | production | this package: src/analyst/benchmark-command.ts:62 |
489
500
  | `createPublicBenchmarkDirectRunner` | production | this package: src/analyst/benchmark-command.ts:60 |
@@ -493,6 +504,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
493
504
  | `decodeReplyRows` | production | this package: src/analyst/benchmark-public-model.ts:57 |
494
505
  | `DEFAULT_MAX_VERIFICATION_ARTIFACT_BYTES` | production | this package: src/analyst/benchmark-command.ts:73 |
495
506
  | `DEFAULT_TRACE_ANALYST_KINDS` | production | agent-dev-container:products/intelligence/api/src/lib/deep-trace-analyst.ts |
507
+ | `DEFAULT_TRACE_ANALYST_OUTPUT_TOKENS` | production | this package: src/analyst/chat-trace-engine.ts:46 |
496
508
  | `defaultIsMaterial` | none | only this package's tests: src/analyst/analyst.test.ts:8 |
497
509
  | `defineCustomAnalyst` | planned | doc: docs/trace-analysis.md |
498
510
  | `defineTraceAnalyst` | planned | doc: docs/charter.md |
@@ -558,7 +570,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
558
570
  | `rlmEngineLimits` | none | only this package's tests: src/analyst/definition-parity.test.ts:26 |
559
571
  | `roundAgentRxStep` | production | this package: src/analyst/benchmark-agentrx-calibration.ts:2 |
560
572
  | `runAnalystBenchmark` | production | this package: benchmarks/trace-analysis/codetracebench-glm52-20260730/summarize-codetracer.mjs:6 |
561
- | `runAnalystBenchmarkCommand` | production | this package: src/cli.ts:16 |
573
+ | `runAnalystBenchmarkCommand` | production | this package: src/cli.ts:17 |
562
574
  | `runPrimeExchange` | production | this package: src/analyst/benchmark-runner-prime.ts:19 |
563
575
  | `runTraceAnalyst` | production | this package: scripts/gepa-analyst-campaign.ts:71 |
564
576
  | `scoreAnalystFindings` | production | this package: scripts/gepa-analyst-campaign.ts:57 |
@@ -616,7 +628,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
616
628
 
617
629
  ### `./campaign`
618
630
 
619
- 118 value exports — 77 production, 15 planned, 26 none.
631
+ 122 value exports — 81 production, 15 planned, 26 none.
620
632
 
621
633
  | symbol | consumer | evidence |
622
634
  | --- | --- | --- |
@@ -625,7 +637,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
625
637
  | `assertCampaignDesign` | production | this package: src/campaign/plan-campaign-run.ts:10 |
626
638
  | `assertCampaignSplitIdentity` | production | agent-knowledge:src/memory/experiment/learning-pairs.ts |
627
639
  | `assertCodeSurfaceIdentity` | none | — |
628
- | `assertCompleteSearchHistory` | production | this package: src/campaign/presets/compare-optimization-methods.ts:31 |
640
+ | `assertCompleteSearchHistory` | production | this package: src/campaign/optimization-method.ts:9 |
629
641
  | `assertSearchHistoryMatchesReplay` | planned | doc: docs/search-history-receipts.md |
630
642
  | `autoevalsScorerJudge` | none | only this package's tests: src/campaign/upstream-evaluators.test.ts:6 |
631
643
  | `buildCellSchedule` | production | this package: src/campaign/plan-campaign-run.ts:9 |
@@ -634,7 +646,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
634
646
  | `buildTraceAnalystSurfaceDispatch` | none | only this package's tests: src/campaign/analyst-surface.test.ts:4 |
635
647
  | `campaignBreakdown` | production | this package: src/campaign/external-text-evaluation.ts:11 |
636
648
  | `campaignMeanComposite` | production | agent-dev-container:products/intelligence/api/src/lib/optimization-engine.ts |
637
- | `campaignMeasurementDigest` | none | only this package's tests: src/campaign/provenance-integrity.test.ts:5 |
649
+ | `campaignMeasurementDigest` | production | this package: src/contract/self-improve-method.ts:12 |
638
650
  | `campaignScenarioIdentity` | production | agent-runtime:bench/src/swe-arena/premeasured-from-cells.mts |
639
651
  | `campaignSplitDigest` | production | agent-runtime:bench/src/swe-arena/premeasured-from-cells.mts |
640
652
  | `campaignSplitDigestFromIdentities` | production | agent-runtime:src/improvement/method-identity.ts |
@@ -644,7 +656,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
644
656
  | `codeSurfaceIdentityMaterial` | none | — |
645
657
  | `combineComparisonCosts` | production | this package: src/campaign/external-text-optimization.ts:41 |
646
658
  | `compareOptimizationMethods` | production | agent-app:src/eval-campaign/index.ts |
647
- | `compareRankKeys` | production | this package: src/campaign/presets/run-optimization.ts:29 |
659
+ | `compareRankKeys` | production | this package: src/campaign/presets/run-optimization.ts:30 |
648
660
  | `componentSurfaceIdentityMaterial` | none | only this package's tests: src/campaign/surface-identity.test.ts:4 |
649
661
  | `composeGate` | production | discovery-lab:tools/confirmation-gate.mjs |
650
662
  | `costFromLedgerSummary` | production | supervisor-lab:bench/drain/seat.ts |
@@ -660,7 +672,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
660
672
  | `detectScale` | production | this package: src/campaign/gates/promotion-policy.ts:39 |
661
673
  | `dimensionRegressions` | production | agent-dev-container:products/intelligence/api/src/lib/optimization-engine.ts |
662
674
  | `discoverEvalFixtures` | planned | doc: docs/eval-fixtures.md |
663
- | `emitLoopProvenance` | production | this package: src/contract/self-improve.ts:27 |
675
+ | `emitLoopProvenance` | production | this package: src/contract/self-improve.ts:26 |
664
676
  | `externalTextOptimizationMethod` | production | agent-app:src/eval-campaign/index.ts |
665
677
  | `FileSearchLedger` | none | — |
666
678
  | `finalizeProfileMatrix` | production | discovery-lab:tools/run-profile-confirmation.mjs |
@@ -678,7 +690,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
678
690
  | `llmJudge` | production | agent-runtime:examples/agentic-data-creation/offline-fixtures.ts |
679
691
  | `loadEvalFixture` | planned | doc: docs/eval-fixtures.md |
680
692
  | `loadEvalFixtureScenarios` | planned | example: examples/eval-fixtures-quickstart/index.ts:11 |
681
- | `loopProvenanceArgsFromResult` | production | this package: src/contract/self-improve.ts:27 |
693
+ | `loopProvenanceArgsFromResult` | production | this package: src/contract/self-improve.ts:26 |
682
694
  | `loopProvenanceSpans` | none | only this package's tests: src/campaign/provenance-integrity.test.ts:5 |
683
695
  | `makePlaybackDispatch` | none | only this package's tests: src/campaign/presets/playback.test.ts:6 |
684
696
  | `makeProposalFinding` | production | agent-runtime:bench/src/swe-arena/outer-loop.mts |
@@ -697,16 +709,18 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
697
709
  | `ProfileMatrixError` | production | this package: src/campaign/presets/segmented-profile-matrix.ts:22 |
698
710
  | `provenanceRecordPath` | planned | consumer tests: agent-dev-container:products/intelligence/api/tests/optimization-engine.test.ts |
699
711
  | `provenanceSpansPath` | none | only this package's tests: tests/contract-self-improve.test.ts:25 |
712
+ | `quotaExhaustedUntil` | none | only this package's tests: src/campaign/transient-failure.test.ts:3 |
700
713
  | `readCachedCell` | production | discovery-lab:tools/strict-screen.mjs |
701
714
  | `readExternalOptimizerObservationArtifact` | production | agent-runtime:src/improvement/method-execution.ts |
702
715
  | `readGepaCandidatePopulationArtifact` | production | agent-runtime:src/improvement/method-execution.ts |
703
716
  | `recordCandidatePopulationSearch` | production | this package: src/campaign/gepa-optimization-method.ts:67 |
704
717
  | `renderScoreboardMarkdown` | production | blueprint-agent:scripts/experiments/eval/launch-scoreboard/run.ts |
705
718
  | `renderSurfaceDiff` | production | agent-dev-container:products/intelligence/api/src/lib/optimization-evidence-packet.ts |
719
+ | `replaySearchLedgerText` | production | this package: src/campaign/search-history-receipt.ts:9 |
706
720
  | `resolveExternalOptimizerCallbackLimits` | production | this package: src/analyst/dspy-rlm-engine.ts:1 |
707
721
  | `resolveExternalOptimizerProcessLimits` | production | this package: src/analyst/benchmark-command-persistence.ts:6 |
708
722
  | `resolveRunDir` | production | agent-dev-container:products/intelligence/api/src/lib/eval-engine.ts |
709
- | `resolveWorktreePath` | none | only this package's tests: tests/campaign/worktree.test.ts:16 |
723
+ | `resolveWorktreePath` | none | only this package's tests: tests/campaign/worktree.test.ts:17 |
710
724
  | `rolloutArgumentDiff` | none | only this package's tests: src/campaign/grounded-reflection.test.ts:2 |
711
725
  | `runCampaign` | production | agent-app:src/eval-campaign/index.ts |
712
726
  | `runEval` | production | ai-trading-blueprint:evals/src/sim/multishot-user-sim.ts |
@@ -717,17 +731,18 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
717
731
  | `scoreboardSummary` | production | blueprint-agent:scripts/experiments/eval/launch-scoreboard/run.ts |
718
732
  | `scoreDiscrimination` | production | supervisor-lab:bench/comms/seat-discrimination.ts |
719
733
  | `scoreUserStory` | production | blueprint-agent:scripts/experiments/eval/launch-scoreboard/scoreboard-core.ts |
720
- | `searchHistoryCoverageRow` | production | this package: src/campaign/presets/compare-optimization-methods.ts:31 |
721
- | `SearchHistoryRequiredError` | none | only this package's tests: src/campaign/presets/compare-optimization-methods-history.test.ts:7 |
722
- | `SearchLedgerConflictError` | production | this package: src/campaign/search-ledger.ts:33 |
723
- | `SearchLedgerError` | production | this package: src/campaign/search-ledger.ts:33 |
734
+ | `searchHistoryCoverageRow` | production | this package: src/campaign/optimization-method.ts:9 |
735
+ | `SearchHistoryRequiredError` | none | only this package's tests: src/campaign/presets/compare-optimization-methods-history.test.ts:10 |
736
+ | `SearchLedgerConflictError` | production | this package: src/campaign/search-ledger.ts:34 |
737
+ | `SearchLedgerError` | production | this package: src/campaign/search-ledger.ts:34 |
724
738
  | `SearchLedgerIntegrityError` | production | this package: src/campaign/search-ledger-file.ts:10 |
725
- | `SearchRecorder` | production | this package: src/campaign/presets/run-optimization.ts:37 |
739
+ | `SearchRecorder` | production | this package: src/campaign/presets/run-optimization.ts:38 |
726
740
  | `selectDiscriminative` | none | only this package's tests: src/campaign/scenario-selection.test.ts:2 |
727
741
  | `sequentialDecide` | planned | doc: docs/experiment.md |
728
742
  | `sequentialPairedGate` | planned | consumer tests: legal-agent:tests/eval/self-improve.ts |
729
743
  | `skillOptOptimizationMethod` | production | agent-app:src/eval-campaign/index.ts |
730
744
  | `surfaceContentHash` | production | discovery-lab:tools/run-profile-confirmation.mjs |
745
+ | `surfaceDispatchRef` | production | this package: src/campaign/presets/run-final-comparison.ts:4 |
731
746
  | `surfaceHash` | production | agent-builder:src/lib/.server/eval/loops/evolution-runner.ts |
732
747
  | `tangleTracesRoot` | none | only this package's tests: src/campaign/run-dir.test.ts:4 |
733
748
  | `traceAnalystQualityJudge` | production | this package: scripts/gepa-analyst-campaign.ts:74 |
@@ -736,12 +751,13 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
736
751
  | `validateSearchLedgerEvent` | planned | consumer tests: discovery-lab:tools/search-ledger-planless.test.mjs |
737
752
  | `verifyCodeSurface` | production | agent-runtime:src/candidate-execution/builder.ts |
738
753
  | `verifyLoopProvenanceRecord` | none | only this package's tests: src/campaign/provenance-integrity.test.ts:5 |
754
+ | `verifySearchHistoryArtifact` | production | this package: src/campaign/optimization-method.ts:9 |
739
755
  | `verifySearchHistoryReceipt` | planned | doc: docs/search-history-receipts.md |
740
- | `WorktreeAdapterError` | none | only this package's tests: tests/campaign/worktree.test.ts:16 |
756
+ | `WorktreeAdapterError` | none | only this package's tests: tests/campaign/worktree.test.ts:17 |
741
757
 
742
758
  ### `./contract`
743
759
 
744
- 64 value exports — 40 production, 15 planned, 9 none.
760
+ 65 value exports — 41 production, 14 planned, 10 none.
745
761
 
746
762
  | symbol | consumer | evidence |
747
763
  | --- | --- | --- |
@@ -780,11 +796,12 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
780
796
  | `measuredComparisonFromAgentProfileImprovementExperiment` | production | agent-runtime:src/intelligence/authored-profile-improvement.ts |
781
797
  | `measuredComparisonFromCandidateExperiment` | production | agent-runtime:src/intelligence/improvement-cycle.ts |
782
798
  | `observeCodeAgentSession` | production | this package: src/contract/intake/code-agent-session.ts:13 |
799
+ | `observeCodeAgentStore` | none | only this package's tests: tests/contract-code-agent-store.test.ts:5 |
783
800
  | `paretoPolicy` | none | only this package's tests: src/campaign/gates/promotion-policy.test.ts:3 |
784
801
  | `paretoSignificanceGate` | production | agent-app:src/eval-campaign/index.ts |
785
802
  | `parseAgentTrace` | planned | doc: docs/code-agent-intake.md |
786
803
  | `parseCodeAgentJsonl` | planned | doc: docs/code-agent-intake.md |
787
- | `parseCodeAgentJsonlFile` | planned | doc: docs/code-agent-intake.md |
804
+ | `parseCodeAgentJsonlFile` | production | this package: src/contract/intake/code-agent-store.ts:38 |
788
805
  | `partitionRunsByAuthoringModel` | planned | doc: docs/code-agent-intake.md |
789
806
  | `REFERENCE_EQUIVALENCE_INPUT_LIMITS` | none | only this package's tests: src/reference-equivalence-judge.test.ts:13 |
790
807
  | `REFERENCE_EQUIVALENCE_JUDGE_VERSION` | none | only this package's tests: src/reference-equivalence-judge.test.ts:13 |
@@ -812,7 +829,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
812
829
 
813
830
  ### `./experiment`
814
831
 
815
- 83 value exports — 48 production, 18 planned, 17 none.
832
+ 84 value exports — 50 production, 17 planned, 17 none.
816
833
 
817
834
  | symbol | consumer | evidence |
818
835
  | --- | --- | --- |
@@ -831,7 +848,8 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
831
848
  | `composeFunnels` | planned | doc: docs/experiment.md |
832
849
  | `computeEstimand` | production | this package: src/experiment/define.ts:21 |
833
850
  | `computeInterval` | production | this package: src/experiment/define.ts:21 |
834
- | `createEvidenceReceipt` | planned | consumer tests: agent-runtime:tests/integration/runtime-eval-pursuit-evidence.test.ts |
851
+ | `createCampaignEvidenceReceipt` | production | this package: src/campaign/presets/compare-optimization-methods.ts:11 |
852
+ | `createEvidenceReceipt` | production | this package: src/experiment/campaign-evidence.ts:7 |
835
853
  | `defineExperiment` | production | this package: scripts/tb-gated-stop-ab.ts:55 |
836
854
  | `DesignRefusalError` | none | only this package's tests: tests/experiment/power.test.ts:10 |
837
855
  | `eProcess` | production | this package: src/campaign/gates/sequential.ts:35 |
@@ -941,7 +959,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
941
959
 
942
960
  ### `./ledger-core`
943
961
 
944
- 16 value exports — 15 production, 0 planned, 1 none.
962
+ 17 value exports — 16 production, 0 planned, 1 none.
945
963
 
946
964
  | symbol | consumer | evidence |
947
965
  | --- | --- | --- |
@@ -955,6 +973,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
955
973
  | `LedgerCanonicalizationError` | none | only this package's tests: src/ledger-core/canonical.test.ts:5 |
956
974
  | `probeAtomicFileLock` | production | this package: src/campaign/single-run-lock.ts:17 |
957
975
  | `readTrustedHeadFile` | production | this package: src/ledger-core/journal.ts:29 |
976
+ | `replayLedgerText` | production | this package: src/campaign/search-ledger.ts:22 |
958
977
  | `trustedHeadPathFor` | production | this package: src/ledger-core/journal.ts:29 |
959
978
  | `tryAcquireAtomicFileLock` | production | this package: src/campaign/single-run-lock.ts:17 |
960
979
  | `tryWithLedgerFileLock` | production | this package: src/campaign/search-ledger-file.ts:3 |
@@ -1232,7 +1251,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
1232
1251
  | `ROLLOUT_ROLES` | production | this package: src/rollout/interchange/harbor.ts:60 |
1233
1252
  | `ROLLOUT_SCHEMA` | production | agent-runtime:bench/src/rollout-ledger/backfill-swe-arena.mts |
1234
1253
  | `ROLLOUT_SPLITS` | production | this package: src/rollout/interchange/harbor.ts:60 |
1235
- | `runRolloutReleaseCli` | production | this package: src/cli.ts:18 |
1254
+ | `runRolloutReleaseCli` | production | this package: src/cli.ts:19 |
1236
1255
  | `scoreOrigin` | production | this package: src/rollout/mint.ts:38 |
1237
1256
  | `scrubLines` | production | supervisor-lab:bench/vertical-rollout-package.ts |
1238
1257
  | `scrubRolloutLine` | none | only this package's tests: src/rollout/release/scrub.test.ts:4 |
@@ -1270,7 +1289,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
1270
1289
 
1271
1290
  ### `./supervisor-run`
1272
1291
 
1273
- 29 value exports — 21 production, 4 planned, 4 none.
1292
+ 33 value exports — 23 production, 4 planned, 6 none.
1274
1293
 
1275
1294
  | symbol | consumer | evidence |
1276
1295
  | --- | --- | --- |
@@ -1284,23 +1303,27 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
1284
1303
  | `isUnavailable` | production | discovery-lab:tools/disco.mjs |
1285
1304
  | `loopsSupervisorRunReader` | planned | named in traces (bind not in the import graph) |
1286
1305
  | `NO_SOURCE_LIMITS` | production | traces:src/supervisor-run-context.ts |
1306
+ | `NO_TERMINAL_RECORD` | none | only this package's tests: src/supervisor-run/terminal-record.test.ts:8 |
1287
1307
  | `parsePatch` | planned | named in browser-agent-driver (bind not in the import graph) |
1288
1308
  | `parseSupervisorTree` | production | discovery-lab:experiments/0005-run-visibility/probe.mjs |
1289
1309
  | `readClaudeCodeSupervisorRun` | none | only this package's tests: src/supervisor-run/claude-code-reader.test.ts:6 |
1290
1310
  | `readLoopsSupervisorRun` | planned | named in discovery-lab (bind not in the import graph) |
1291
1311
  | `readRuntimeSupervisorRun` | production | discovery-lab:pursuits/final-agent-authored-campaign-20260810/materialize-candidates.mjs |
1312
+ | `readTerminalRecord` | production | this package: src/supervisor-run/analyze.ts:18 |
1292
1313
  | `renderSupervisorRollupMarkdown` | production | traces:src/cli.ts |
1293
1314
  | `renderSupervisorRunHeadline` | production | discovery-lab:experiments/0005-run-visibility/probe.mjs |
1294
1315
  | `renderSupervisorRunMarkdown` | production | agent-runtime:bench/src/swe-arena/run-report.mts |
1295
1316
  | `reportSupervisorRound` | production | agent-runtime:bench/src/swe-arena/outer-loop.mts |
1296
1317
  | `rollupSupervisorRuns` | production | discovery-lab:tools/disco.mjs |
1318
+ | `runSupervisorRunCommand` | production | this package: src/cli.ts:20 |
1319
+ | `RUNTIME_FAILED_STATUS` | none | — |
1297
1320
  | `runtimeSupervisorRunReader` | none | only this package's tests: src/supervisor-run/index.test.ts:2 |
1298
1321
  | `showMeasured` | production | this package: src/supervisor-run/render.ts:8 |
1299
1322
  | `SUPERVISOR_RUN_INTEGRITY_SCHEMA` | production | this package: src/supervisor-run/integrity.ts:4 |
1300
- | `SUPERVISOR_RUN_ROLLUP_SCHEMA` | production | this package: src/supervisor-run/analyze.ts:18 |
1301
- | `SUPERVISOR_RUN_SCHEMA` | production | this package: src/supervisor-run/analyze.ts:18 |
1323
+ | `SUPERVISOR_RUN_ROLLUP_SCHEMA` | production | this package: src/supervisor-run/analyze.ts:19 |
1324
+ | `SUPERVISOR_RUN_SCHEMA` | production | this package: src/supervisor-run/analyze.ts:19 |
1302
1325
  | `supervisorRunRolloutLines` | planned | consumer tests: discovery-lab:tools/runtime-journal-eval.test.mjs |
1303
- | `unavailable` | production | this package: src/supervisor-run/analyze.ts:18 |
1326
+ | `unavailable` | production | this package: src/supervisor-run/analyze.ts:19 |
1304
1327
  | `writeSupervisorRunReport` | production | agent-runtime:bench/src/swe-arena/run-report.mts |
1305
1328
  | `writeSupervisorRunReportSafe` | production | agent-runtime:bench/src/swe-arena/outer-loop.mts |
1306
1329
 
@@ -1468,7 +1491,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
1468
1491
  | `createOtelTracingStore` | none | only this package's tests: tests/trace-contracts.test.ts:4 |
1469
1492
  | `DEFAULT_REDACTION_RULES` | production | agent-dev-container:products/intelligence/api/src/lib/redact.ts |
1470
1493
  | `DEFAULT_TRACE_ANALYST_BUDGETS` | production | agent-builder:src/lib/.server/eval/stores/d1-trace-analysis-store-adapter.ts |
1471
- | `defaultProviderRedactor` | production | this package: src/llm-client.ts:46 |
1494
+ | `defaultProviderRedactor` | production | this package: src/llm-client.ts:53 |
1472
1495
  | `defaultTraceInsightPanel` | none | only this package's tests: src/trace-analyst/insights.test.ts:3 |
1473
1496
  | `describeTraceInsightScope` | production | blueprint-agent:scripts/experiments/lib/analyze-vb-run/report-html.ts |
1474
1497
  | `domainEvidencePattern` | production | blueprint-agent:scripts/experiments/lib/analyze-vb-run/session-loader.ts |
@@ -1523,7 +1546,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
1523
1546
  | `OUTPUT_VALUE` | production | agent-runtime:src/runtime/supervise-surface.ts |
1524
1547
  | `planTraceInsightQuestions` | none | only this package's tests: src/trace-analyst/insights.test.ts:3 |
1525
1548
  | `projectOtlpFlatLine` | production | this package: src/trace-analyst/otlp-to-run-records.ts:63 |
1526
- | `providerFromBaseUrl` | production | this package: src/llm-client.ts:46 |
1549
+ | `providerFromBaseUrl` | production | this package: src/llm-client.ts:53 |
1527
1550
  | `REDACTION_VERSION` | production | agent-dev-container:products/intelligence/api/src/lib/redact.ts |
1528
1551
  | `redactString` | production | agent-dev-container:products/intelligence/api/src/lib/redact.ts |
1529
1552
  | `redactValue` | production | traces:src/index.ts |
@@ -1626,7 +1649,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
1626
1649
 
1627
1650
  | symbol | consumer | evidence |
1628
1651
  | --- | --- | --- |
1629
- | `buildOpenApi` | production | this package: src/cli.ts:20 |
1652
+ | `buildOpenApi` | production | this package: src/cli.ts:22 |
1630
1653
  | `createApp` | planned | doc: docs/wire-protocol.md |
1631
1654
  | `dispatchRpc` | planned | doc: docs/wire-protocol.md |
1632
1655
  | `ErrorResponseSchema` | production | this package: src/wire/openapi.ts:15 |
@@ -1637,7 +1660,7 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
1637
1660
  | `handleJudge` | production | this package: src/wire/rpc.ts:15 |
1638
1661
  | `handleListRubrics` | production | this package: src/wire/rpc.ts:15 |
1639
1662
  | `handleTracesIngest` | production | this package: src/wire/server.ts:20 |
1640
- | `handleVersion` | production | this package: src/cli.ts:19 |
1663
+ | `handleVersion` | production | this package: src/cli.ts:21 |
1641
1664
  | `hashRubric` | production | this package: src/wire/handlers.ts:22 |
1642
1665
  | `HealthResponseSchema` | production | this package: src/wire/openapi.ts:15 |
1643
1666
  | `JudgeRequestSchema` | production | this package: src/wire/openapi.ts:15 |
@@ -1647,10 +1670,10 @@ The `none` set was reviewed symbol by symbol on 2026-08-21. Four rules decided m
1647
1670
  | `RUBRIC_VERSION_SCHEME` | none | — |
1648
1671
  | `RubricDimensionSchema` | none | only this package's tests: tests/wire/schemas.test.ts:12 |
1649
1672
  | `RubricSchema` | none | only this package's tests: tests/wire/schemas.test.ts:12 |
1650
- | `runRpcBatch` | production | this package: src/cli.ts:21 |
1651
- | `runRpcOnce` | production | this package: src/cli.ts:21 |
1673
+ | `runRpcBatch` | production | this package: src/cli.ts:23 |
1674
+ | `runRpcOnce` | production | this package: src/cli.ts:23 |
1652
1675
  | `startServer` | production | creative-agent:eval/ingestion-server.ts |
1653
- | `startServerAsync` | production | this package: src/cli.ts:22 |
1676
+ | `startServerAsync` | production | this package: src/cli.ts:24 |
1654
1677
  | `TraceEventSchema` | planned | named in insurance-agent (bind not in the import graph) |
1655
1678
  | `TracesIngestRequestSchema` | production | this package: src/wire/openapi.ts:15 |
1656
1679
  | `TracesIngestResponseSchema` | production | this package: src/wire/openapi.ts:15 |
@@ -147,6 +147,37 @@ const comparison = await compareOptimizationMethods({
147
147
  })
148
148
  ```
149
149
 
150
+ `selfImprove({ method })` accepts the same `searchHistoryPolicy` and `searchHistoryVerification` options.
151
+ Both workflows use the same method preparation, result validation, cost reconciliation, and history admission.
152
+ `selfImprove` returns `searchHistoryCoverage`; comparison returns coverage for every method.
153
+ The default remains `allow-missing` with receipt verification.
154
+
155
+ ### Verify referenced history before final assessment
156
+
157
+ Set `searchHistoryVerification: 'ledger'` to require the referenced bytes, even with `allow-missing`.
158
+ Combine it with `require-complete` to require both verified bytes and complete history.
159
+
160
+ ```ts
161
+ const comparison = await compareOptimizationMethods({
162
+ // ...methods, partitions, dispatch, judges, runDir
163
+ searchHistoryPolicy: 'require-complete',
164
+ searchHistoryVerification: 'ledger',
165
+ storage,
166
+ })
167
+ ```
168
+
169
+ Eval reads the receipt URI through `storage.read`.
170
+ A `file:` URI becomes a local path; other URIs remain opaque storage keys.
171
+ A custom `CampaignStorage` can resolve retained artifacts without another ledger implementation.
172
+ Missing bytes, length or digest mismatches, invalid chains, and replay discrepancies refuse final dispatch.
173
+ A verified coverage row carries `ledgerVerified: true`.
174
+ Receipt-only coverage does not make that claim.
175
+
176
+ Existing search recorders compute `ledger.sha256` with `hashCanonical` over the complete JSONL string.
177
+ It hashes that string's canonical JSON encoding, rather than the raw UTF-8 file.
178
+ Verification preserves this existing identity scheme.
179
+ `byteLength` measures the UTF-8 JSONL bytes.
180
+
150
181
  Every method finishes optimization before the first untouched-final-test dispatch. Under `require-complete`, missing, malformed, producer-mismatched, interrupted, or denominator-incomplete evidence aborts at that boundary.
151
182
 
152
183
  ## Verification boundary
@@ -155,7 +186,8 @@ Every method finishes optimization before the first untouched-final-test dispatc
155
186
 
156
187
  `assertSearchHistoryMatchesReplay()` additionally proves that the envelope was derived from the supplied canonical replay.
157
188
 
158
- Neither function fetches or retains the ledger artifact. A skeptical consumer must resolve `receipt.ledger`, verify its digest and byte length, replay it with `SearchLedger`, and then call `assertSearchHistoryMatchesReplay()`.
189
+ `verifySearchHistoryArtifact(receipt, storage)` resolves bytes and runs both checks through the canonical journal codec.
190
+ The two receipt-only functions do not fetch or retain the ledger artifact. A skeptical consumer must resolve `receipt.ledger`, verify its digest and byte length, replay it with `SearchLedger`, and then call `assertSearchHistoryMatchesReplay()`.
159
191
 
160
192
  The receipt does not prove that:
161
193
 
@@ -175,3 +207,18 @@ Those claims require held-out evaluation, artifact retention, provenance verific
175
207
  - **Knowledge** owns what information was visible, retrieved, and selected for use.
176
208
  - **Interface** owns portable profiles, diffs, identities, and digest primitives.
177
209
  - **SDKs** should automate these owner contracts, not copy their types or introduce another optimizer loop.
210
+
211
+ ## Bind final measurements to execution evidence
212
+
213
+ Both complete-method workflows accept optional `evidence: CampaignEvidenceContext`.
214
+ It requires the caller's pursuit, evaluator, environment, authority, and attestation provenance.
215
+ Eval does not infer independent authority or certify those external declarations.
216
+
217
+ Each measured baseline and winner receives the existing `EvidenceReceipt` format.
218
+ Eval derives candidate, input-set, output, and result digests from the executed surface and complete campaign.
219
+ A missing or deferred final measurement cannot produce a receipt.
220
+ Receipts describe measurements; they do not override the release gate or replace the method's selected winner.
221
+
222
+ `createCampaignEvidenceReceipt` on `/experiment` provides the same binding for other complete campaign consumers.
223
+ Changing an output changes its output digest; changing a judge result changes its measurement digest.
224
+ The final receipt retains caller authority, including `candidate-self-report`, without upgrading it.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/agent-eval",
3
- "version": "0.175.0",
3
+ "version": "0.177.0",
4
4
  "description": "Evaluate and improve AI agents from runs, traces, judges, and feedback. Compare candidates, cluster failures, measure lift, and gate releases.",
5
5
  "homepage": "https://github.com/tangle-network/agent-eval#readme",
6
6
  "repository": {
@@ -1 +0,0 @@
1
- {"version":3,"file":"attestation-XSUpbc4o.js","names":[],"sources":["../src/experiment-tracker.ts","../src/attestation.ts"],"sourcesContent":["/**\n * Experiment tracker — git-provenanced experiment log with N-rep stats and a\n * KEEP / REGRESSION / NOISE verdict against a parent.\n *\n * Every loop the fleet runs reduces to the same question: \"I ran the candidate\n * N times — is the median measurably better than the parent, or is the delta\n * inside the noise band?\" The hand-rolled copies bake a fixed score scale\n * (percentage points), a fixed store path (`.evolve/experiments-v2.json`), and\n * `execSync('git …')` straight into the module. This is the canonical version:\n * provenance and persistence are injected, thresholds are configurable, and the\n * stats + verdict are pure functions you can unit-test without a git repo or a\n * filesystem.\n *\n * Stats per experiment: median / mean / min / max / iqr / stddev / passRate /\n * n, plus a `stable` flag (`iqr < iqrUnstableAbove && stddev < stddevUnstableAbove`).\n *\n * Verdict against a parent (both must have `n >= minRepsForVerdict`):\n * - NOISE — the candidate is too unstable to judge (`!stable`)\n * - KEEP — `medianDelta > keepThreshold`\n * - REGRESSION — `medianDelta < -regressionThreshold`\n * - NOISE — otherwise (delta inside the band)\n * With no parent (or insufficient reps) the verdict is the neutral ITERATE.\n */\n\nimport { execSync } from 'node:child_process'\nimport type { EvidenceRef } from './analyst/types'\nimport { iqr } from './baseline'\nimport { ValidationError } from './errors'\n\n/** Verdict for one experiment relative to its parent. ITERATE is the neutral\n * \"keep collecting reps / no parent to compare against\" state. */\nexport type ExperimentVerdict = 'KEEP' | 'ITERATE' | 'NOISE' | 'REGRESSION'\n\n/** Git provenance for the working tree an experiment was run from. */\nexport interface ExperimentProvenance {\n /** Commit sha (short or full — the tracker does not interpret it). */\n commit: string\n /** First line of the commit message. */\n message: string\n /** Files changed vs the parent commit, or a marker like 'uncommitted'. */\n changedFiles: string[]\n}\n\n/** A single repetition of an experiment, carrying the score the verdict is\n * computed on plus any free-form per-rep metrics the consumer wants kept. */\nexport interface ExperimentRep {\n /** 0-indexed repetition number within the experiment. */\n rep: number\n /** The score this rep is judged on (same scale as the thresholds). */\n score: number\n /** ISO timestamp the rep completed. */\n timestamp: string\n /** Stable execution/run identity that produced this score. */\n runId?: string\n /** Mechanically resolvable trace, artifact, metric, or finding evidence. */\n evidence?: EvidenceRef[]\n /** Whether this rep passed the consumer's own gate — folded into `passRate`. */\n passed?: boolean\n /** Free-form numeric metrics retained for later analysis. */\n metrics?: Record<string, number>\n}\n\nexport interface ExperimentStats {\n median: number\n mean: number\n min: number\n max: number\n /** Inter-quartile range of the rep scores. */\n iqr: number\n /** Population standard deviation of the rep scores. */\n stddev: number\n /** Fraction of reps with `passed === true`, over reps that set `passed`.\n * null when no rep declared a pass/fail outcome. */\n passRate: number | null\n /** Number of reps. */\n n: number\n /** True when the sample is tight enough to trust for a verdict. */\n stable: boolean\n}\n\nexport interface Experiment {\n /** Stable id for the experiment. */\n id: string\n /** Free-form label / config descriptor. */\n label: string\n /** Git provenance captured when the experiment was created. */\n provenance: ExperimentProvenance\n /** Parent experiment id this candidate is compared against, if any. */\n parentId?: string\n /** One-line summary of what changed from the parent. */\n changeSummary: string\n reps: ExperimentRep[]\n stats: ExperimentStats\n verdict: ExperimentVerdict\n /** ISO timestamp the experiment was created. */\n createdAt: string\n}\n\nexport interface ImprovementThresholds {\n /** medianDelta strictly above this ⇒ KEEP. Default 5. */\n keepThreshold?: number\n /** medianDelta strictly below the negative of this ⇒ REGRESSION. Default 5. */\n regressionThreshold?: number\n /** iqr at or above this ⇒ unstable. Default 10. */\n iqrUnstableAbove?: number\n /** stddev at or above this ⇒ unstable. Default Infinity (iqr-only stability). */\n stddevUnstableAbove?: number\n /** Reps required on BOTH candidate and parent before a verdict is rendered.\n * Default 3. */\n minRepsForVerdict?: number\n}\n\nexport interface ImprovementVerdictResult {\n verdict: ExperimentVerdict\n /** candidate.median − parent.median; null when no parent or insufficient reps. */\n medianDelta: number | null\n /** Human-readable reason for the verdict — for dashboards and logs. */\n reason: string\n}\n\nconst DEFAULTS: Required<ImprovementThresholds> = {\n keepThreshold: 5,\n regressionThreshold: 5,\n iqrUnstableAbove: 10,\n stddevUnstableAbove: Number.POSITIVE_INFINITY,\n minRepsForVerdict: 3,\n}\n\nfunction resolveThresholds(t: ImprovementThresholds | undefined): Required<ImprovementThresholds> {\n const r = { ...DEFAULTS, ...(t ?? {}) }\n if (r.keepThreshold < 0) {\n throw new ValidationError(\n `experiment-tracker: keepThreshold must be >= 0, got ${r.keepThreshold}`,\n )\n }\n if (r.regressionThreshold < 0) {\n throw new ValidationError(\n `experiment-tracker: regressionThreshold must be >= 0, got ${r.regressionThreshold}`,\n )\n }\n if (r.minRepsForVerdict < 1) {\n throw new ValidationError(\n `experiment-tracker: minRepsForVerdict must be >= 1, got ${r.minRepsForVerdict}`,\n )\n }\n return r\n}\n\nfunction median(sorted: number[]): number {\n const n = sorted.length\n if (n === 0) return 0\n const mid = Math.floor(n / 2)\n return n % 2 === 0 ? (sorted[mid - 1]! + sorted[mid]!) / 2 : sorted[mid]!\n}\n\n/** Population standard deviation (÷n). 0 for fewer than 2 values. */\nfunction stddev(values: number[], mean: number): number {\n if (values.length < 2) return 0\n const variance = values.reduce((acc, v) => acc + (v - mean) ** 2, 0) / values.length\n return Math.sqrt(variance)\n}\n\n/**\n * Compute the N-rep statistics for a set of reps. Pure — no I/O. The `stable`\n * flag is the trust gate the verdict depends on: a sample whose spread exceeds\n * the configured bounds can't distinguish a real delta from run-to-run noise.\n */\nexport function computeExperimentStats(\n reps: ExperimentRep[],\n thresholds?: ImprovementThresholds,\n): ExperimentStats {\n const t = resolveThresholds(thresholds)\n const n = reps.length\n if (n === 0) {\n return {\n median: 0,\n mean: 0,\n min: 0,\n max: 0,\n iqr: 0,\n stddev: 0,\n passRate: null,\n n: 0,\n stable: false,\n }\n }\n const scores = reps.map((r) => {\n if (!Number.isFinite(r.score)) {\n throw new ValidationError(`experiment-tracker: rep ${r.rep} has non-finite score ${r.score}`)\n }\n return r.score\n })\n const sorted = [...scores].sort((a, b) => a - b)\n const mean = scores.reduce((s, v) => s + v, 0) / n\n const sd = stddev(scores, mean)\n const spread = iqr(scores)\n const rated = reps.filter((r) => typeof r.passed === 'boolean')\n const passRate = rated.length === 0 ? null : rated.filter((r) => r.passed).length / rated.length\n const stable = spread < t.iqrUnstableAbove && sd < t.stddevUnstableAbove\n return {\n median: median(sorted),\n mean,\n min: sorted[0]!,\n max: sorted[n - 1]!,\n iqr: spread,\n stddev: sd,\n passRate,\n n,\n stable,\n }\n}\n\n/**\n * Verdict for a candidate against its parent. Pure — operates on already-computed\n * stats. KEEP/REGRESSION require both sides to have `>= minRepsForVerdict` reps\n * AND the candidate to be `stable`; otherwise the result is NOISE (unstable) or\n * ITERATE (not enough reps / no parent).\n */\nexport function improvementVerdict(\n candidate: ExperimentStats,\n parent: ExperimentStats | null,\n thresholds?: ImprovementThresholds,\n): ImprovementVerdictResult {\n const t = resolveThresholds(thresholds)\n if (!parent) {\n return {\n verdict: 'ITERATE',\n medianDelta: null,\n reason: 'no parent experiment to compare against',\n }\n }\n if (candidate.n < t.minRepsForVerdict || parent.n < t.minRepsForVerdict) {\n return {\n verdict: 'ITERATE',\n medianDelta: null,\n reason: `need >= ${t.minRepsForVerdict} reps on both sides (candidate n=${candidate.n}, parent n=${parent.n})`,\n }\n }\n if (!candidate.stable) {\n return {\n verdict: 'NOISE',\n medianDelta: candidate.median - parent.median,\n reason: `candidate unstable (iqr=${candidate.iqr}, stddev=${candidate.stddev.toFixed(2)})`,\n }\n }\n const medianDelta = candidate.median - parent.median\n if (medianDelta > t.keepThreshold) {\n return { verdict: 'KEEP', medianDelta, reason: `median +${medianDelta} > +${t.keepThreshold}` }\n }\n if (medianDelta < -t.regressionThreshold) {\n return {\n verdict: 'REGRESSION',\n medianDelta,\n reason: `median ${medianDelta} < -${t.regressionThreshold}`,\n }\n }\n return {\n verdict: 'NOISE',\n medianDelta,\n reason: `median delta ${medianDelta} inside noise band [-${t.regressionThreshold}, +${t.keepThreshold}]`,\n }\n}\n\n// ── Provenance + persistence seams ───────────────────────────────────\n\n/** Reads git provenance for the working tree. Inject a fake in tests; the\n * default implementation shells out to `git`. */\nexport type ProvenanceReader = () => ExperimentProvenance | Promise<ExperimentProvenance>\n\n/** Persistence seam for the experiment log. Inject in-memory in tests; the\n * filesystem implementation is `fileExperimentStore`. */\nexport interface ExperimentStore {\n load(): Promise<Experiment[]>\n save(experiments: Experiment[]): Promise<void>\n}\n\n/**\n * Default provenance reader: `git rev-parse HEAD`, the subject line, and the\n * files changed vs `HEAD~1`. Fail-loud — a tracker that silently logs\n * `commit: 'unknown'` corrupts the provenance the whole point of the log is to\n * carry. When the working tree genuinely has no parent commit, pass an override.\n */\nexport const gitProvenanceReader: ProvenanceReader = () => {\n const run = (cmd: string): string => execSync(cmd, { encoding: 'utf8' }).trim()\n const commit = run('git rev-parse --short HEAD')\n const message = run('git log -1 --format=%s')\n const changedRaw = run('git diff --name-only HEAD~1')\n const changedFiles = changedRaw.length === 0 ? [] : changedRaw.split('\\n').filter(Boolean)\n return { commit, message, changedFiles }\n}\n\n/** In-memory store — the default when no persistence is wanted (tests, ephemeral\n * runs). State lives on the instance. */\nexport function inMemoryExperimentStore(initial: Experiment[] = []): ExperimentStore {\n let state = initial.map((e) => structuredClone(e))\n return {\n async load() {\n return state.map((e) => structuredClone(e))\n },\n async save(experiments) {\n state = experiments.map((e) => structuredClone(e))\n },\n }\n}\n\n/** Filesystem store — a single JSON array at `path`, created on first save. */\nexport function fileExperimentStore(path: string): ExperimentStore {\n return {\n async load() {\n const fs = await import('node:fs/promises')\n try {\n const raw = await fs.readFile(path, 'utf8')\n const parsed = JSON.parse(raw)\n if (!Array.isArray(parsed)) {\n throw new ValidationError(`experiment-tracker: store at ${path} is not a JSON array`)\n }\n return parsed as Experiment[]\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return []\n throw err\n }\n },\n async save(experiments) {\n const fs = await import('node:fs/promises')\n const pathMod = await import('node:path')\n await fs.mkdir(pathMod.dirname(path), { recursive: true })\n await fs.writeFile(path, JSON.stringify(experiments, null, 2), 'utf8')\n },\n }\n}\n\nexport interface ExperimentTrackerOptions {\n store?: ExperimentStore\n provenanceReader?: ProvenanceReader\n thresholds?: ImprovementThresholds\n /** Clock seam for deterministic timestamps in tests. Default `Date.now`. */\n now?: () => number\n}\n\nexport interface CreateExperimentInput {\n id: string\n label: string\n changeSummary: string\n parentId?: string\n /** Override provenance instead of reading from git (e.g. CI metadata). */\n provenance?: ExperimentProvenance\n}\n\n/**\n * Stateful tracker over an `ExperimentStore`. Create an experiment (provenance\n * is captured once), append reps as they complete (stats + verdict recompute on\n * every append), and read the log back for a dashboard. All persistence and git\n * access flow through the injected seams, so the tracker is fully testable\n * without a repo or disk.\n */\nexport class ExperimentTracker {\n private readonly store: ExperimentStore\n private readonly provenanceReader: ProvenanceReader\n private readonly thresholds: Required<ImprovementThresholds>\n private readonly now: () => number\n\n constructor(options: ExperimentTrackerOptions = {}) {\n this.store = options.store ?? inMemoryExperimentStore()\n this.provenanceReader = options.provenanceReader ?? gitProvenanceReader\n this.thresholds = resolveThresholds(options.thresholds)\n this.now = options.now ?? Date.now\n }\n\n async create(input: CreateExperimentInput): Promise<Experiment> {\n const experiments = await this.store.load()\n if (experiments.some((e) => e.id === input.id)) {\n throw new ValidationError(`experiment-tracker: experiment id \"${input.id}\" already exists`)\n }\n if (input.parentId && !experiments.some((e) => e.id === input.parentId)) {\n throw new ValidationError(\n `experiment-tracker: parent experiment \"${input.parentId}\" not found`,\n )\n }\n const provenance = input.provenance ?? (await this.provenanceReader())\n const experiment: Experiment = {\n id: input.id,\n label: input.label,\n provenance,\n parentId: input.parentId,\n changeSummary: input.changeSummary,\n reps: [],\n stats: computeExperimentStats([], this.thresholds),\n verdict: 'ITERATE',\n createdAt: new Date(this.now()).toISOString(),\n }\n experiments.push(experiment)\n await this.store.save(experiments)\n return structuredClone(experiment)\n }\n\n /** Append a rep (its `rep` index defaults to the current rep count) and\n * recompute stats + verdict. Returns the updated experiment. */\n async addRep(\n experimentId: string,\n rep: Omit<ExperimentRep, 'rep' | 'timestamp'> & { rep?: number; timestamp?: string },\n ): Promise<Experiment> {\n const experiments = await this.store.load()\n const exp = experiments.find((e) => e.id === experimentId)\n if (!exp)\n throw new ValidationError(`experiment-tracker: experiment \"${experimentId}\" not found`)\n if (rep.runId !== undefined && rep.runId.trim().length === 0) {\n throw new ValidationError('experiment-tracker: rep runId must be non-empty when present')\n }\n const evidence = rep.evidence?.map((reference, index) => {\n if (reference.uri.trim().length === 0) {\n throw new ValidationError(\n `experiment-tracker: rep evidence[${index}].uri must be non-empty`,\n )\n }\n return {\n kind: reference.kind,\n uri: reference.uri,\n ...(reference.excerpt === undefined ? {} : { excerpt: reference.excerpt }),\n }\n })\n const fullRep: ExperimentRep = {\n rep: rep.rep ?? exp.reps.length,\n score: rep.score,\n timestamp: rep.timestamp ?? new Date(this.now()).toISOString(),\n ...(rep.runId === undefined ? {} : { runId: rep.runId }),\n ...(evidence === undefined ? {} : { evidence }),\n ...(rep.passed === undefined ? {} : { passed: rep.passed }),\n ...(rep.metrics === undefined ? {} : { metrics: { ...rep.metrics } }),\n }\n exp.reps.push(fullRep)\n exp.stats = computeExperimentStats(exp.reps, this.thresholds)\n const parent = exp.parentId ? experiments.find((e) => e.id === exp.parentId) : undefined\n exp.verdict = improvementVerdict(exp.stats, parent?.stats ?? null, this.thresholds).verdict\n await this.store.save(experiments)\n return structuredClone(exp)\n }\n\n async get(experimentId: string): Promise<Experiment | undefined> {\n const experiments = await this.store.load()\n const found = experiments.find((e) => e.id === experimentId)\n return found ? structuredClone(found) : undefined\n }\n\n async list(): Promise<Experiment[]> {\n return this.store.load()\n }\n\n /** Full verdict (not just the enum) for an experiment vs its parent. */\n async verdictFor(experimentId: string): Promise<ImprovementVerdictResult> {\n const experiments = await this.store.load()\n const exp = experiments.find((e) => e.id === experimentId)\n if (!exp)\n throw new ValidationError(`experiment-tracker: experiment \"${experimentId}\" not found`)\n const parent = exp.parentId ? experiments.find((e) => e.id === exp.parentId) : undefined\n return improvementVerdict(exp.stats, parent?.stats ?? null, this.thresholds)\n }\n}\n","/**\n * Reproducibility attestation for any serializable report object.\n *\n * `attest()` binds a report to its content address (sha-256 over canonical\n * JSON) AND binds that address to the provenance needed to reproduce it:\n * model versions, seeds, price-table hash, code SHA, inputs hash. The outer\n * `envelopeHash` prevents provenance from being rewritten while leaving the\n * report hash valid.\n *\n * Layering: content-addressing is the substrate's job; cryptographic SIGNING\n * (who vouches for the attestation, key management, transparency logs) is the\n * consumer's layer on top. An `AttestedReport` is a stable byte-identical\n * payload a consumer can sign — the substrate never holds keys.\n *\n * Generic by design: the report parameter is ANY value `canonicalJson`\n * accepts (campaign results, fuzz capsules, scorecards, cost ledgers). Do not\n * couple this module to a specific report schema.\n */\n\nimport { contentHash } from './verdict-cache'\n\n/** Hash scheme identifier carried by every attestation. A verifier rejects\n * unknown algorithms instead of guessing. */\nexport const ATTESTATION_ALGORITHM = 'sha256/canonical-json' as const\n\nexport interface AttestationProvenance {\n /** Every model involved in producing the report, name → version/id. */\n modelVersions: Record<string, string>\n /** RNG seeds the run was driven by, when seeded. */\n seeds?: number[]\n /** Content hash of the price table used for cost figures — cost numbers\n * are only reproducible against the same prices. */\n priceTableHash?: string\n /** Git SHA of the code that produced the report. */\n codeSha: string\n /** Content hash of the input set (scenarios, dataset manifest, ...). */\n inputsHash?: string\n /** ISO-8601 timestamp, caller-supplied — the substrate stays clock-free\n * so attestation is deterministic and testable. */\n createdAt: string\n}\n\nexport interface AttestedReport {\n /** Hex sha-256 over the canonical JSON of the report. */\n reportHash: string\n provenance: AttestationProvenance\n algorithm: typeof ATTESTATION_ALGORITHM\n /**\n * Hex sha-256 over `{ reportHash, provenance, algorithm }`. New attestations\n * always carry it. Optional only so persisted pre-envelope attestations can\n * still be read and explicitly recognized as legacy by callers.\n */\n envelopeHash?: string\n}\n\nexport interface AttestationVerification {\n valid: boolean\n /** Populated iff `valid` is false — names the exact mismatch. */\n reason?: string\n /** True only for a valid pre-envelope attestation whose provenance is not cryptographically bound. */\n legacyUnboundProvenance?: true\n}\n\nfunction envelopeMaterial(\n reportHash: string,\n provenance: AttestationProvenance,\n algorithm: typeof ATTESTATION_ALGORITHM,\n): object {\n return { reportHash, provenance, algorithm }\n}\n\n/**\n * Content-address a report and bind it to its provenance. Throws (via\n * `canonicalJson`) if the report or provenance contains undefined / function /\n * symbol / non-finite numbers — an attestation that cannot be unambiguously\n * serialized cannot be trusted.\n */\nexport function attest(report: unknown, provenance: AttestationProvenance): AttestedReport {\n const reportHash = contentHash(report)\n const algorithm = ATTESTATION_ALGORITHM\n return {\n reportHash,\n provenance,\n algorithm,\n envelopeHash: contentHash(envelopeMaterial(reportHash, provenance, algorithm)),\n }\n}\n\n/**\n * Verify a report against its attestation. Returns a typed outcome rather\n * than throwing: an unverifiable report (e.g. one that no longer\n * canonicalizes) is a verification failure with the cause in `reason`, not a\n * crash — verifiers run in pipelines that must record WHY, not die.\n *\n * Legacy attestations without `envelopeHash` remain readable, but verification\n * explicitly marks their provenance as unbound so a promotion path can refuse\n * them instead of accidentally treating old metadata as cryptographic proof.\n */\nexport function verifyAttestation(\n report: unknown,\n attested: AttestedReport,\n): AttestationVerification {\n if (attested.algorithm !== ATTESTATION_ALGORITHM) {\n return {\n valid: false,\n reason: `unknown algorithm '${attested.algorithm}' — this verifier only checks '${ATTESTATION_ALGORITHM}'`,\n }\n }\n let recomputed: string\n try {\n recomputed = contentHash(report)\n } catch (err) {\n return {\n valid: false,\n reason: `report is not canonicalizable: ${err instanceof Error ? err.message : String(err)}`,\n }\n }\n if (recomputed !== attested.reportHash) {\n return {\n valid: false,\n reason: `report hash mismatch: attested ${attested.reportHash}, recomputed ${recomputed}`,\n }\n }\n\n if (attested.envelopeHash === undefined) {\n return { valid: true, legacyUnboundProvenance: true }\n }\n\n let envelopeHash: string\n try {\n envelopeHash = contentHash(\n envelopeMaterial(attested.reportHash, attested.provenance, attested.algorithm),\n )\n } catch (err) {\n return {\n valid: false,\n reason: `attestation provenance is not canonicalizable: ${err instanceof Error ? err.message : String(err)}`,\n }\n }\n if (envelopeHash !== attested.envelopeHash) {\n return {\n valid: false,\n reason: `attestation envelope hash mismatch: attested ${attested.envelopeHash}, recomputed ${envelopeHash}`,\n }\n }\n\n return { valid: true }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"attestation-c1QvaBdX.d.ts","names":[],"sources":["../src/statistics/power-and-mde.ts","../src/statistics/random.ts","../src/experiment-tracker.ts","../src/attestation.ts"],"mappings":";;;;;;;;iBAWgB,mBAAmB;EACjC;EACA;EACA;EACA;;;;;;;;;;;iBAsBc,yBAAyB;EACvC;EACA;EACA;EACA;;;;;;;;iBAkBc,UAAU;EACxB;EACA;EACA;EACA;;;;;;;;;;;;;;;;iBAyBc,iBAAiB;EAC/B;EACA;EACA;EACA;EACA;;;;;;;iBAyBc,aAAa;EAC3B;EACA;EACA;EACA;EACA;;;;;;;;iBCrHc,WAAW;;;;;KCyBf;;UAGK;;EAEf;;EAEA;;EAEA;;;;UAKe;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA,WAAW;;EAEX;;EAEA,UAAU;;UAGK;EACf;EACA;EACA;EACA;;EAEA;;EAEA;;;EAGA;;EAEA;;EAEA;;UAGe;;EAEf;;EAEA;;EAEA,YAAY;;EAEZ;;EAEA;EACA,MAAM;EACN,OAAO;EACP,SAAS;;EAET;;UAGe;;EAEf;;EAEA;;EAEA;;EAEA;;;EAGA;;UAGe;EACf,SAAS;;EAET;;EAEA;;;;;;;iBAkDc,uBACd,MAAM,iBACN,aAAa,wBACZ;;;;;;;iBAgDa,mBACd,WAAW,iBACX,QAAQ,wBACR,aAAa,wBACZ;;;KA6CS,yBAAyB,uBAAuB,QAAQ;;;UAInD;EACf,QAAQ,QAAQ;EAChB,KAAK,aAAa,eAAe;;;;iBAoBnB,wBAAwB,UAAS,eAAoB;;iBAarD,oBAAoB,eAAe;UAyBlC;EACf,QAAQ;EACR,mBAAmB;EACnB,aAAa;;EAEb;;UAGe;EACf;EACA;EACA;EACA;;EAEA,aAAa;;;;;;;;;cAUF;mBACM;mBACA;mBACA;mBACA;EAEjB,YAAY,UAAS;EAOf,OAAO,OAAO,wBAAwB,QAAQ;;;EA6B9C,OACJ,sBACA,KAAK,KAAK;IAAwC;IAAc;MAC/D,QAAQ;EAqCL,IAAI,uBAAuB,QAAQ;EAMnC,QAAQ,QAAQ;;EAKhB,WAAW,uBAAuB,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;cCzarC;UAEI;;EAEf,eAAe;;EAEf;;;EAGA;;EAEA;;EAEA;;;EAGA;;UAGe;;EAEf;EACA,YAAY;EACZ,kBAAkB;;;;;;EAMlB;;UAGe;EACf;;EAEA;;EAEA;;;;;;;;iBAiBc,OAAO,iBAAiB,YAAY,wBAAwB;;;;;;;;;;;iBAqB5D,kBACd,iBACA,UAAU,iBACT"}