@tangle-network/agent-eval 0.126.6 → 0.127.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 (129) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/README.md +2 -2
  3. package/dist/analyst/index.d.ts +52 -40
  4. package/dist/analyst/index.js +4 -4
  5. package/dist/belief-state/index.d.ts +34 -36
  6. package/dist/belief-state/index.js +2 -2
  7. package/dist/benchmarks/index.d.ts +30 -12
  8. package/dist/benchmarks/index.js +12 -10
  9. package/dist/builder-eval/index.js +1 -1
  10. package/dist/campaign/index.d.ts +432 -146
  11. package/dist/campaign/index.js +11 -9
  12. package/dist/{chunk-ARU2PZFM.js → chunk-424XHVKV.js} +43 -23
  13. package/dist/chunk-424XHVKV.js.map +1 -0
  14. package/dist/{chunk-NUKSVU3W.js → chunk-5DTSBUL2.js} +2 -2
  15. package/dist/{chunk-BTACVO2W.js → chunk-65QETEKG.js} +542 -258
  16. package/dist/chunk-65QETEKG.js.map +1 -0
  17. package/dist/{chunk-CGG5SLH3.js → chunk-ARCFIY7U.js} +2 -2
  18. package/dist/{chunk-P22LJ3Y2.js → chunk-CLELFRQG.js} +6 -4
  19. package/dist/chunk-CLELFRQG.js.map +1 -0
  20. package/dist/{chunk-LUNF2SEL.js → chunk-DJKY2TSY.js} +3 -3
  21. package/dist/chunk-DPUHNQLN.js +232 -0
  22. package/dist/chunk-DPUHNQLN.js.map +1 -0
  23. package/dist/{chunk-IPYXE555.js → chunk-EJGRPCO3.js} +36 -13
  24. package/dist/chunk-EJGRPCO3.js.map +1 -0
  25. package/dist/{chunk-K6IAZZ6L.js → chunk-FA3MFYNA.js} +132 -110
  26. package/dist/chunk-FA3MFYNA.js.map +1 -0
  27. package/dist/chunk-IG35YDN3.js +614 -0
  28. package/dist/chunk-IG35YDN3.js.map +1 -0
  29. package/dist/{chunk-DPZAEKA6.js → chunk-IMGJZBFG.js} +84 -56
  30. package/dist/chunk-IMGJZBFG.js.map +1 -0
  31. package/dist/{chunk-H5UD2323.js → chunk-IN455XKS.js} +53 -1
  32. package/dist/chunk-IN455XKS.js.map +1 -0
  33. package/dist/{chunk-PJQFMIOX.js → chunk-MHELPNRP.js} +31 -1
  34. package/dist/chunk-MHELPNRP.js.map +1 -0
  35. package/dist/{chunk-IILEIWGW.js → chunk-NL33OXEP.js} +41 -36
  36. package/dist/chunk-NL33OXEP.js.map +1 -0
  37. package/dist/{chunk-474LBSOX.js → chunk-OD5NQ2CS.js} +41 -16
  38. package/dist/chunk-OD5NQ2CS.js.map +1 -0
  39. package/dist/{chunk-QOTFXW5L.js → chunk-P5W7RQKK.js} +2 -2
  40. package/dist/{chunk-IR3KBHOY.js → chunk-P6FYH6K4.js} +39 -3
  41. package/dist/chunk-P6FYH6K4.js.map +1 -0
  42. package/dist/{chunk-J5SQWP6Y.js → chunk-PBE2LOSS.js} +18 -2
  43. package/dist/chunk-PBE2LOSS.js.map +1 -0
  44. package/dist/{chunk-E3IADPLG.js → chunk-PRB53E3J.js} +50 -224
  45. package/dist/chunk-PRB53E3J.js.map +1 -0
  46. package/dist/{chunk-X4UCIOTZ.js → chunk-S5YLIBFX.js} +2 -2
  47. package/dist/{chunk-7VYEGHWF.js → chunk-SZLVEKMJ.js} +41 -20
  48. package/dist/chunk-SZLVEKMJ.js.map +1 -0
  49. package/dist/{chunk-LKKT3IVV.js → chunk-TSN7JT6D.js} +6 -4
  50. package/dist/{chunk-LKKT3IVV.js.map → chunk-TSN7JT6D.js.map} +1 -1
  51. package/dist/{chunk-M7AH34KV.js → chunk-UTA2TGC4.js} +32 -16
  52. package/dist/chunk-UTA2TGC4.js.map +1 -0
  53. package/dist/{chunk-MAX3TN3C.js → chunk-UWZZKKU7.js} +7 -19
  54. package/dist/chunk-UWZZKKU7.js.map +1 -0
  55. package/dist/{chunk-ZVCHKKOP.js → chunk-WED5KLZQ.js} +39 -15
  56. package/dist/chunk-WED5KLZQ.js.map +1 -0
  57. package/dist/{chunk-OCFJACJU.js → chunk-X6VOPMLD.js} +74 -14
  58. package/dist/chunk-X6VOPMLD.js.map +1 -0
  59. package/dist/{chunk-MOXWMGPC.js → chunk-Y5CYOL42.js} +159 -70
  60. package/dist/chunk-Y5CYOL42.js.map +1 -0
  61. package/dist/{chunk-FO7HEH76.js → chunk-YJBNWCAA.js} +2 -2
  62. package/dist/chunk-ZPUEEM5U.js +179 -0
  63. package/dist/chunk-ZPUEEM5U.js.map +1 -0
  64. package/dist/{chunk-KE2VWPZX.js → chunk-ZUUWPZCV.js} +3 -3
  65. package/dist/cli.js +4 -4
  66. package/dist/contract/index.d.ts +464 -126
  67. package/dist/contract/index.js +425 -211
  68. package/dist/contract/index.js.map +1 -1
  69. package/dist/control.d.ts +34 -32
  70. package/dist/control.js +2 -2
  71. package/dist/hosted/index.d.ts +142 -41
  72. package/dist/hosted/index.js +23 -1
  73. package/dist/index.d.ts +365 -256
  74. package/dist/index.js +315 -226
  75. package/dist/index.js.map +1 -1
  76. package/dist/meta-eval/index.d.ts +32 -32
  77. package/dist/meta-eval/index.js +2 -2
  78. package/dist/multishot/index.d.ts +1 -0
  79. package/dist/openapi.json +1 -1
  80. package/dist/pipelines/index.js +2 -2
  81. package/dist/reporting.d.ts +97 -74
  82. package/dist/reporting.js +5 -4
  83. package/dist/rl.d.ts +177 -131
  84. package/dist/rl.js +232 -126
  85. package/dist/rl.js.map +1 -1
  86. package/dist/rollout/index.d.ts +53 -63
  87. package/dist/rollout/index.js +7 -5
  88. package/dist/{run-campaign-FFRM3RH5.js → run-campaign-3A2EBYBE.js} +4 -3
  89. package/dist/supervisor-run/index.d.ts +7 -15
  90. package/dist/supervisor-run/index.js +2 -2
  91. package/dist/traces.d.ts +66 -41
  92. package/dist/traces.js +9 -5
  93. package/dist/wire/index.d.ts +1 -0
  94. package/dist/wire/index.js +2 -2
  95. package/docs/concepts.md +18 -1
  96. package/docs/hosted-ingest-spec.md +37 -40
  97. package/docs/insight-report.md +57 -7
  98. package/docs/research-report-methodology.md +20 -21
  99. package/docs/rollout.md +13 -8
  100. package/package.json +21 -14
  101. package/dist/chunk-474LBSOX.js.map +0 -1
  102. package/dist/chunk-7VYEGHWF.js.map +0 -1
  103. package/dist/chunk-ARU2PZFM.js.map +0 -1
  104. package/dist/chunk-BTACVO2W.js.map +0 -1
  105. package/dist/chunk-DPZAEKA6.js.map +0 -1
  106. package/dist/chunk-E3IADPLG.js.map +0 -1
  107. package/dist/chunk-H5UD2323.js.map +0 -1
  108. package/dist/chunk-IILEIWGW.js.map +0 -1
  109. package/dist/chunk-IPYXE555.js.map +0 -1
  110. package/dist/chunk-IR3KBHOY.js.map +0 -1
  111. package/dist/chunk-J5SQWP6Y.js.map +0 -1
  112. package/dist/chunk-K6IAZZ6L.js.map +0 -1
  113. package/dist/chunk-M7AH34KV.js.map +0 -1
  114. package/dist/chunk-MAX3TN3C.js.map +0 -1
  115. package/dist/chunk-MOXWMGPC.js.map +0 -1
  116. package/dist/chunk-OCFJACJU.js.map +0 -1
  117. package/dist/chunk-P22LJ3Y2.js.map +0 -1
  118. package/dist/chunk-PJQFMIOX.js.map +0 -1
  119. package/dist/chunk-ZVCHKKOP.js.map +0 -1
  120. package/dist/chunk-ZZUXHH3R.js +0 -99
  121. package/dist/chunk-ZZUXHH3R.js.map +0 -1
  122. /package/dist/{chunk-NUKSVU3W.js.map → chunk-5DTSBUL2.js.map} +0 -0
  123. /package/dist/{chunk-CGG5SLH3.js.map → chunk-ARCFIY7U.js.map} +0 -0
  124. /package/dist/{chunk-LUNF2SEL.js.map → chunk-DJKY2TSY.js.map} +0 -0
  125. /package/dist/{chunk-QOTFXW5L.js.map → chunk-P5W7RQKK.js.map} +0 -0
  126. /package/dist/{chunk-X4UCIOTZ.js.map → chunk-S5YLIBFX.js.map} +0 -0
  127. /package/dist/{chunk-FO7HEH76.js.map → chunk-YJBNWCAA.js.map} +0 -0
  128. /package/dist/{chunk-KE2VWPZX.js.map → chunk-ZUUWPZCV.js.map} +0 -0
  129. /package/dist/{run-campaign-FFRM3RH5.js.map → run-campaign-3A2EBYBE.js.map} +0 -0
@@ -237,6 +237,7 @@ type CostLedgerHandle = Pick<CostLedger, Exclude<keyof CostLedger, 'listPending'
237
237
  * OpenAI-compatible `/v1/chat/completions` client with:
238
238
  * - Exponential-backoff retry on 429 + 5xx gateway errors (502/503/504).
239
239
  * - Retry on transient network errors (fetch failed, AbortError, ECONNRESET).
240
+ * - One retry at temperature 1 when a model explicitly requires it.
240
241
  * - Graceful json_schema → json_object degrade on 400 with schema-reject body.
241
242
  * - Fenced-JSON stripping (```json ... ```) for models that wrap structured output.
242
243
  * - Configurable base URL + api key / bearer, works with LiteLLM proxies, OpenAI
@@ -419,7 +420,8 @@ type FailureClass = 'success' | 'reasoning_error' | 'tool_selection_error' | 'to
419
420
  * researcher loop SHOULD be recorded as a `RunRecord`. The mandatory
420
421
  * fields are exactly those the paper "Two Loops, Three Roles" requires
421
422
  * for reproducibility: who/what/when/cost/seed/hash, plus the search vs
422
- * holdout split tag and either a `searchScore` or a `holdoutScore`.
423
+ * holdout split tag. A task score is optional because execution-only records
424
+ * must preserve missing labels instead of converting errors into zero quality.
423
425
  *
424
426
  * This is intentionally NOT a replacement for the rich `Run` /
425
427
  * `ProposeReviewReport` / `ScenarioResult` types already in the
@@ -440,6 +442,13 @@ type FailureClass = 'success' | 'reasoning_error' | 'tool_selection_error' | 'to
440
442
  /** Search/dev/holdout split tag. 'search' is the paper-grade alias for the
441
443
  * combined train+test pool that the optimizer is allowed to read. */
442
444
  type RunSplitTag = 'search' | 'dev' | 'holdout';
445
+ /**
446
+ * Explicit execution-lifecycle result for a run.
447
+ *
448
+ * This is separate from task quality (`outcome`) and failure classification.
449
+ * Producers set it only from root-run or process evidence.
450
+ */
451
+ type RunTerminalOutcome = 'succeeded' | 'failed' | 'cancelled' | 'incomplete' | 'unknown';
443
452
  interface RunTokenUsage {
444
453
  input: number;
445
454
  /** All generated tokens charged as output, including reasoning tokens. */
@@ -453,11 +462,6 @@ interface RunTokenUsage {
453
462
  }
454
463
  /**
455
464
  * How a run's USD amount was obtained.
456
- *
457
- * `costUsd` remains mandatory for wire compatibility. New producers should
458
- * always populate this discriminated union so a missing bill is never
459
- * mistaken for an observed zero-dollar run. For `uncaptured`, `costUsd` uses
460
- * the legacy `0` sentinel while this field carries the truthful null.
461
465
  */
462
466
  type RunCostProvenance = {
463
467
  kind: 'observed';
@@ -503,8 +507,8 @@ interface JudgeScoresRecord {
503
507
  perJudge: Record<string, Record<string, number>>;
504
508
  /** Per-dim mean across judges. Convenience — derivable from `perJudge`. */
505
509
  perDimMean: Record<string, number>;
506
- /** Composite mean across all dims and judges. Mirrors the score
507
- * the gate sees on `outcome.searchScore` / `holdoutScore`. */
510
+ /** Composite mean across successful judges. Mirrors the task score only
511
+ * when `failedJudges` is empty. */
508
512
  composite: number;
509
513
  /** Judges that errored or returned an unparseable verdict. Recorded
510
514
  * by id (e.g. `['glm-5.1']`) so a partial-failure case is explicit,
@@ -515,11 +519,11 @@ interface JudgeScoresRecord {
515
519
  notes?: string;
516
520
  }
517
521
  interface RunOutcome {
518
- /** Score on the search/optimization split. Optional because a
519
- * holdout-only evaluation only fills `holdoutScore`. */
522
+ /** Score on the search/optimization split. Optional for holdout-only and
523
+ * execution-only records. */
520
524
  searchScore?: number;
521
- /** Score on the held-out split. Optional because a search-only run
522
- * only fills `searchScore`. At least one must be present. */
525
+ /** Score on the held-out split. Optional for search-only and execution-only
526
+ * records. When both scores are absent, the run is explicitly unlabeled. */
523
527
  holdoutScore?: number;
524
528
  /** Bag of any other metric the run produced — judge dimensions,
525
529
  * pass/fail counters, latency stats, etc. Numeric only — keeps
@@ -583,42 +587,39 @@ interface RunRecord {
583
587
  wallMs: number;
584
588
  /** Time spent queued before execution started, if known. */
585
589
  queueMs?: number;
586
- /** Total USD cost. Mandatory runs without a cost number are
587
- * unbounded by definition and must not be admitted into the gate.
588
- * `0` is retained as the compatibility sentinel for an uncaptured amount;
589
- * inspect `costProvenance` before treating it as observed. */
590
- costUsd: number;
591
- /** Observed, model-priced estimate, or genuinely uncaptured USD amount.
592
- * Optional only so existing serialized RunRecords remain valid. */
593
- costProvenance?: RunCostProvenance;
590
+ /** Total USD cost, or null when the producer could not capture one. */
591
+ costUsd: number | null;
592
+ /** Whether `costUsd` came from billing data, a price calculation, or is unavailable. */
593
+ costProvenance: RunCostProvenance;
594
594
  /** Token usage breakdown. */
595
595
  tokenUsage: RunTokenUsage;
596
+ /** Root-run or process terminal result. Never inferred from a child span. */
597
+ terminalOutcome: RunTerminalOutcome;
598
+ /** Root-run or process failure reason. Valid only for a failed, cancelled,
599
+ * or incomplete terminal result; never populated from a child span. */
600
+ terminalFailureReason?: string;
596
601
  /** Judge-side metadata, if a judge was used. */
597
602
  judgeMetadata?: RunJudgeMetadata;
598
603
  /** Per-split scores + raw bag. */
599
604
  outcome: RunOutcome;
600
- /** Canonical, cross-agent failure class drawn from the shared
605
+ /** Canonical task-failure class drawn from the shared
601
606
  * `FAILURE_CLASSES` taxonomy. This is the aggregation key that makes
602
607
  * "which failure dominates across the whole fleet" answerable in ONE
603
608
  * vocabulary — every agent classifies against the same enum. Producers
604
- * set it via the substrate classifier; leave unset only when the failure
605
- * genuinely can't be classified. */
609
+ * set it only from task-result evidence. Execution errors belong in
610
+ * `outcome.raw.execution_error_count`, even when the run later fails. */
606
611
  failureClass?: FailureClass;
607
- /** Free-form domain-specific failure detail, scoped UNDER `failureClass`
612
+ /** Free-form task-failure detail, scoped UNDER `failureClass`
608
613
  * (e.g. failureClass='tool_recovery_failure', failureMode='forge_build_unsatisfied').
609
- * The within-agent drill-down; `failureClass` is the cross-agent key. */
614
+ * Do not populate this from a child execution error alone. */
610
615
  failureMode?: string;
611
616
  /** Which split this run was drawn from. */
612
617
  splitTag: RunSplitTag;
613
618
  /**
614
- * Stable scenario identifier the run was scored against. Optional for
615
- * backwards compatibility, but **strongly recommended**: every primitive
616
- * that pairs runs by scenario (preferences, paired stats, BT tournament)
617
- * keys on this. The campaign artifact populates it canonically; legacy
618
- * runs without it fall back to inference from `outcome.raw.scenario_id`
619
- * or `experimentId`.
619
+ * Stable scenario identifier the run observed or was scored against.
620
+ * Comparison primitives match this identity rather than input order.
620
621
  */
621
- scenarioId?: string;
622
+ scenarioId: string;
622
623
  /**
623
624
  * Canonical identity for the agent profile cell that produced this row:
624
625
  * profile artifact hash plus optional harness/model/prompt/reporting
@@ -976,6 +977,13 @@ interface OptimizerConfig extends OptimizerConfigBase {
976
977
  }
977
978
  /** Five-valued verdict taxonomy (MOSS-paper alignment). */
978
979
  type GateDecision = 'ship' | 'hold' | 'need_more_work' | 'model_ceiling' | 'arch_ceiling';
980
+ /** Outcome of one check that contributed to a release decision. */
981
+ type GateCheckStatus = 'pass' | 'fail' | 'not_evaluated';
982
+ interface GateContribution {
983
+ name: string;
984
+ status: GateCheckStatus;
985
+ detail: unknown;
986
+ }
979
987
  interface GateContext<TArtifact, TScenario extends Scenario> {
980
988
  candidateArtifacts: Map<string, TArtifact>;
981
989
  baselineArtifacts?: Map<string, TArtifact>;
@@ -1009,11 +1017,7 @@ interface GateContext<TArtifact, TScenario extends Scenario> {
1009
1017
  interface GateResult {
1010
1018
  decision: GateDecision;
1011
1019
  reasons: string[];
1012
- contributingGates: Array<{
1013
- name: string;
1014
- passed: boolean;
1015
- detail: unknown;
1016
- }>;
1020
+ contributingGates: GateContribution[];
1017
1021
  delta?: number;
1018
1022
  }
1019
1023
  /** Composable promotion gate. */
@@ -1157,6 +1161,10 @@ interface CampaignCellResult<TArtifact> {
1157
1161
  durationMs: number;
1158
1162
  seed: number;
1159
1163
  cached: boolean;
1164
+ /** Stage that produced `error`. Missing on successful cells. */
1165
+ errorStage?: 'dispatch' | 'judge';
1166
+ /** Judge that threw when `errorStage` is `judge`. */
1167
+ errorJudge?: string;
1160
1168
  error?: string;
1161
1169
  }
1162
1170
  interface JudgeAggregate {
@@ -1181,8 +1189,10 @@ interface GenerationRecord {
1181
1189
  * handled — the evidence a blind `Mutator` cannot see. */
1182
1190
  interface GenerationCandidate {
1183
1191
  surfaceHash: string;
1184
- composite: number;
1185
- ci95: [number, number];
1192
+ /** Mean over complete task-quality scores, or null when none were produced. */
1193
+ composite: number | null;
1194
+ /** Descriptive interval for `composite`, or null when no score exists. */
1195
+ ci95: [number, number] | null;
1186
1196
  /** Exact surface this candidate mutated. */
1187
1197
  parentSurfaceHash?: string;
1188
1198
  /** Measured search-split composite of the exact parent surface. */
@@ -1192,13 +1202,12 @@ interface GenerationCandidate {
1192
1202
  observedDeltaFromParent?: number;
1193
1203
  /** Whether this candidate had a scorable result for every designed campaign
1194
1204
  * cell and was therefore eligible for ranking, promotion, and Pareto
1195
- * selection. Older externally-authored records may omit this field; loop
1196
- * records always populate it. */
1197
- eligibleForPromotion?: boolean;
1205
+ * selection. */
1206
+ eligibleForPromotion: boolean;
1198
1207
  /** Exact denominator receipt for selection eligibility. Scores stay
1199
1208
  * descriptive: an incomplete candidate is retained with its observed score
1200
1209
  * and errors instead of receiving an invented penalty. */
1201
- coverage?: {
1210
+ coverage: {
1202
1211
  expectedCells: number;
1203
1212
  scorableCells: number;
1204
1213
  unscorableCells: Array<{
@@ -1239,10 +1248,18 @@ interface CampaignAggregates {
1239
1248
  cost: CostLedgerSummary;
1240
1249
  /** Compatibility alias of `cost.totalCostUsd`. */
1241
1250
  totalCostUsd: number;
1251
+ /** Cells whose dispatch completed, including cells whose later judge failed. */
1242
1252
  cellsExecuted: number;
1243
1253
  cellsSkipped: number;
1244
1254
  cellsCached: number;
1255
+ /** All non-skipped dispatch, judge, and unclassified cell failures. */
1245
1256
  cellsFailed: number;
1257
+ /** Present on results that record failure stages. */
1258
+ cellsDispatchFailed?: number;
1259
+ /** Present on results that record failure stages. */
1260
+ cellsJudgeFailed?: number;
1261
+ /** Legacy failures whose stage was not recorded. */
1262
+ cellsUnclassifiedFailed?: number;
1246
1263
  }
1247
1264
  interface CampaignResult<TArtifact = unknown, TScenario extends Scenario = Scenario> {
1248
1265
  /** sha256(scenarios, judges, dispatch source ref, optimizer config, seed). Stable identity for reruns. */
@@ -1379,7 +1396,7 @@ declare function createReferenceEquivalenceJudge(options: ReferenceEquivalenceJu
1379
1396
  * `ViewTraceOversized`.
1380
1397
  */
1381
1398
  /** OTLP span kind (subset we actually use). */
1382
- type TraceAnalystSpanKind = 'AGENT' | 'LLM' | 'TOOL' | 'CHAIN' | 'GUARDRAIL' | 'SPAN' | 'UNKNOWN';
1399
+ type TraceAnalystSpanKind = 'AGENT' | 'LLM' | 'TOOL' | 'CHAIN' | 'EVALUATOR' | 'GUARDRAIL' | 'SPAN' | 'UNKNOWN';
1383
1400
  type TraceAnalystSpanStatus = 'OK' | 'ERROR' | 'UNSET';
1384
1401
  /** Subset of OTLP span fields the analyst exposes to the agent. The
1385
1402
  * store's job is to project upstream's full span shape down to this
@@ -1948,10 +1965,10 @@ interface PairedMetricDelta {
1948
1965
  n: number;
1949
1966
  /** Pairs where at least one side does not carry the metric. */
1950
1967
  nMissing: number;
1951
- /** Median paired delta; NaN when `n === 0` (no data ≠ measured zero). */
1952
- medianDelta: number;
1953
- /** Mean paired delta; NaN when `n === 0`. */
1954
- meanDelta: number;
1968
+ /** Median paired delta, or null when `n === 0`. */
1969
+ medianDelta: number | null;
1970
+ /** Mean paired delta, or null when `n === 0`. */
1971
+ meanDelta: number | null;
1955
1972
  /** Bootstrap CI on the paired delta (`pairedBootstrap`); null when
1956
1973
  * `n === 0` — a zero-width [0, 0] interval on no data would read as a
1957
1974
  * measured tight null. */
@@ -2856,6 +2873,86 @@ declare function planEvalFixtureRun<TArtifact = unknown>(options: PlanEvalFixtur
2856
2873
  * (so the result records every gate's reason — useful for diagnostics). */
2857
2874
  declare function composeGate<TArtifact = unknown, TScenario extends Scenario = Scenario>(...gates: Array<Gate<TArtifact, TScenario>>): Gate<TArtifact, TScenario>;
2858
2875
 
2876
+ /**
2877
+ * Liveness canaries — cheap statistical checks that catch the failure
2878
+ * modes a green test suite never sees.
2879
+ *
2880
+ * Three canary types in this module:
2881
+ *
2882
+ * 1. **Silent judge fallback** — the judge degraded to a fallback
2883
+ * path (rules-only / cached / heuristic) without anyone
2884
+ * noticing. Signature: a string of consecutive runs whose
2885
+ * `judgeMetadata.confidence` equals a known fallback constant
2886
+ * (default 0.30) OR whose `judgeMetadata.fallback` is true.
2887
+ *
2888
+ * 2. **Judge calibration drift** — the judge's confidence
2889
+ * distribution has drifted from a historical window. Two-sample
2890
+ * Kolmogorov-Smirnov test on the recent vs historical confidences,
2891
+ * with the empirical-CDF max-difference statistic.
2892
+ *
2893
+ * 3. **Eval-set distribution shift** — the mix of categories /
2894
+ * buckets in the recent runs differs significantly from the
2895
+ * historical mix. Chi-square test on the binned counts.
2896
+ *
2897
+ * Outputs are alerts. The canary does NOT fail loud the way a test
2898
+ * does — failing tests are reserved for hard correctness violations.
2899
+ * A canary that fires is a *signal* to investigate, not a verdict.
2900
+ *
2901
+ * Why this lives here rather than in `observability.ts`: that module
2902
+ * exports already, and is a pure-fanout-to-Langfuse/Prometheus
2903
+ * adapter. Canaries are statistical detectors, not adapters.
2904
+ */
2905
+
2906
+ interface CanaryOptions {
2907
+ /**
2908
+ * Silent-fallback detection.
2909
+ * - `constant`: confidence value treated as the fallback signal.
2910
+ * Default 0.30 (matches the soft-fail default in
2911
+ * `propose-review.ts`).
2912
+ * - `consecutiveThreshold`: trip the alert after this many
2913
+ * consecutive runs at `constant` (or `fallback === true`).
2914
+ * Default 3.
2915
+ */
2916
+ silentFallback?: {
2917
+ constant?: number;
2918
+ consecutiveThreshold?: number;
2919
+ /** Floating-point tolerance when comparing against `constant`. */
2920
+ epsilon?: number;
2921
+ };
2922
+ /**
2923
+ * Calibration-drift detection.
2924
+ * - `historyWindow`: number of past runs (oldest-first) treated as
2925
+ * the historical baseline. Default 50.
2926
+ * - `recentWindow`: number of recent runs (newest-first) compared
2927
+ * against history. Default 20.
2928
+ * - `ksAlpha`: alpha for the KS statistic vs critical value.
2929
+ * Default 0.05.
2930
+ * - `minRecent`: minimum recent runs required to even attempt the
2931
+ * check. Default 10.
2932
+ */
2933
+ calibrationDrift?: {
2934
+ historyWindow?: number;
2935
+ recentWindow?: number;
2936
+ ksAlpha?: number;
2937
+ minRecent?: number;
2938
+ };
2939
+ /**
2940
+ * Distribution-shift detection.
2941
+ * - `category`: function that maps a run to a categorical bucket.
2942
+ * Required to enable this canary; if omitted the chi-square check
2943
+ * is skipped entirely.
2944
+ * - `chiSquareAlpha`: alpha. Default 0.05.
2945
+ * - `historyWindow`, `recentWindow`, `minRecent`: like above.
2946
+ */
2947
+ distributionShift?: {
2948
+ category: (run: RunRecord) => string | null;
2949
+ chiSquareAlpha?: number;
2950
+ historyWindow?: number;
2951
+ recentWindow?: number;
2952
+ minRecent?: number;
2953
+ };
2954
+ }
2955
+
2859
2956
  /**
2860
2957
  * Dataset — versioned, sliceable, content-hashed scenario collection.
2861
2958
  *
@@ -2927,6 +3024,178 @@ interface RedTeamCase extends DatasetScenario {
2927
3024
  payload: RedTeamPayload;
2928
3025
  }
2929
3026
 
3027
+ /**
3028
+ * Validator-output verdict — substrate primitive for "did this output pass,
3029
+ * and how well?"
3030
+ *
3031
+ * Used by:
3032
+ * - `@tangle-network/agent-eval/matrix` — verdict per cell in the cartesian.
3033
+ * - `@tangle-network/agent-runtime` — Validator<Output, Verdict = DefaultVerdict>.
3034
+ * Runtime keeps `Validator` because it's coupled to runtime-shaped
3035
+ * `ValidationCtx` (iteration, signal, traceEmitter); the verdict TYPE
3036
+ * itself is a substrate concept and lives here.
3037
+ *
3038
+ * Repo layering: agent-eval is the substrate (no upward deps). Both
3039
+ * agent-runtime and agent-knowledge consume this type FROM agent-eval —
3040
+ * never the other way around. See CLAUDE.md "Repo layering" for the rule.
3041
+ */
3042
+ /**
3043
+ * Minimal verdict shape — `valid` + `score` are required; `scores` +
3044
+ * `notes` are optional surface. Validators that need richer shapes
3045
+ * parameterise `Validator<Output, MyVerdict>` with their own type.
3046
+ *
3047
+ * Need structured extras? Extend DefaultVerdict with typed fields — never
3048
+ * serialize extras into `notes`.
3049
+ */
3050
+ interface DefaultVerdict {
3051
+ /** Whether the output meets the validator's pass criteria. */
3052
+ valid: boolean;
3053
+ /** Aggregate score in [0, 1]. Drivers use this for winner selection. */
3054
+ score: number;
3055
+ /** Per-dimension scores. Free-form; weighted into `score` by the validator. */
3056
+ scores?: Record<string, number>;
3057
+ /** Human-readable rationale; surfaces in trace + final-result `winner.verdict`. */
3058
+ notes?: string;
3059
+ }
3060
+
3061
+ /**
3062
+ * Verifiable reward channel.
3063
+ *
3064
+ * For RL on coding / math / theorem-proving / structured-output tasks, the
3065
+ * reward signal is *decidable* — a test passes or fails, a proof checks or
3066
+ * doesn't, an output validates against a schema or doesn't. These rewards
3067
+ * are dramatically more useful for RL training than LLM-judge scores
3068
+ * because they don't drift, can't be Goodhart-gamed by the policy in the
3069
+ * same way, and don't require a separate calibration loop.
3070
+ *
3071
+ * The `MultiLayerVerifier` already produces this signal — it just doesn't
3072
+ * surface it in a shape that's clean enough for RL training. This module
3073
+ * wraps the verifier output so consumers can:
3074
+ *
3075
+ * 1. Extract a clean `VerifiableReward` from a `VerificationReport`
3076
+ * 2. Distinguish *deterministic* rewards (compile, test, schema) from
3077
+ * *probabilistic* rewards (judge) so they can be weighted differently
3078
+ * in the RL training step
3079
+ * 3. Filter `RunRecord[]` to only those with a verifiable reward,
3080
+ * producing the clean training set that DeepSeek-R1-style GRPO and
3081
+ * AlphaProof-style search both depend on
3082
+ *
3083
+ * Why this matters: every credible 2025-2026 frontier RL result on coding
3084
+ * agents leans on verifiable reward (DeepSeek-R1 GRPO on test pass-rate,
3085
+ * o-series RL on math/code, AlphaProof on Lean kernel checking). Mixing
3086
+ * judge scores into the reward signal poisons the gradient. This module
3087
+ * is the seam.
3088
+ */
3089
+
3090
+ type VerifiableRewardSource = 'compile' | 'test' | 'schema' | 'sandbox' | 'judge' | 'composite';
3091
+ interface VerifiableRewardExtractionOptions {
3092
+ /**
3093
+ * Which layers count as deterministic-reward sources. The verifier doesn't
3094
+ * tag layers as "this is verifiable"; the caller declares it via this list
3095
+ * (or via the layer name → source mapping). Default treats common names
3096
+ * (`install`, `typecheck`, `build`, `lint`, `test`, `compile`, `schema`,
3097
+ * `sandbox`) as deterministic.
3098
+ */
3099
+ deterministicLayers?: string[];
3100
+ /**
3101
+ * Map layer name → reward source. Defaults to a sensible string-match.
3102
+ */
3103
+ sourceFor?: (layerName: string) => VerifiableRewardSource;
3104
+ /**
3105
+ * Whether to fall back to a probabilistic (judge) reward when no
3106
+ * deterministic layer produced a numeric score. Default `true`. Set to
3107
+ * `false` for "deterministic-only" training pipelines that should
3108
+ * discard runs without a verifiable signal.
3109
+ */
3110
+ fallbackToJudge?: boolean;
3111
+ /**
3112
+ * Default confidence for probabilistic (judge) rewards when the judge
3113
+ * doesn't report one. Default `0.7`.
3114
+ */
3115
+ judgeConfidenceFloor?: number;
3116
+ }
3117
+
3118
+ /**
3119
+ * Reward hacking / Goodhart detection.
3120
+ *
3121
+ * Goodhart's Law says: when a measure becomes a target, it ceases to be
3122
+ * a good measure. In RLHF and agentic-RL settings this is the dominant
3123
+ * failure mode — the policy learns to produce outputs that score well on
3124
+ * the proxy reward (judge, rubric, test pass-rate) without producing
3125
+ * the underlying capability the proxy was meant to track.
3126
+ *
3127
+ * Krakovna et al. (2020, "Specification Gaming Examples in AI") and the
3128
+ * subsequent RLHF reward-hacking literature (Skalse et al. 2022, Kim et al.
3129
+ * 2023) converge on a few diagnostic signatures:
3130
+ *
3131
+ * 1. **Reward divergence:** the proxy reward grows while the held-out
3132
+ * ground-truth signal stagnates or drops. Predictive validity over
3133
+ * time captures this.
3134
+ * 2. **Distributional shift in outputs:** after RL, the policy produces
3135
+ * outputs that no longer match the reference distribution — usually
3136
+ * because it found a high-reward attractor that's degenerate (e.g.
3137
+ * one-token responses, repetition, formatting tricks).
3138
+ * 3. **Disagreement between independent rewards:** if you train on
3139
+ * reward A and a held-out independent reward B drops sharply, you're
3140
+ * probably hacking A.
3141
+ * 4. **Calibration drift:** the verifiable / deterministic component of
3142
+ * the reward is stable; the probabilistic / judge component drifts up
3143
+ * while the deterministic component doesn't. The judge is being
3144
+ * gamed.
3145
+ *
3146
+ * This module ships explicit detectors for all four signatures, plus a
3147
+ * combined verdict. The output is diagnostic — actionable signals,
3148
+ * not autoreject — because each signature has known false positives
3149
+ * (e.g., a policy that genuinely improves can show distributional shift).
3150
+ *
3151
+ * Differs from `rubricPredictiveValidity` (which is a *standing* check on
3152
+ * whether rubrics correlate with deployment outcomes) — this is a
3153
+ * *temporal* check on whether the reward-vs-truth gap is *widening over
3154
+ * time during a training run*.
3155
+ */
3156
+
3157
+ interface DetectRewardHackingInput {
3158
+ /**
3159
+ * Run records ordered by recency (oldest first). The detector segments
3160
+ * them into prefix/suffix windows to compute "did the gap widen."
3161
+ */
3162
+ runs: RunRecord[];
3163
+ /**
3164
+ * The metric the policy was trained to optimize. Should be present on
3165
+ * `outcome.raw` or `outcome.holdoutScore`. Default reads `outcome.holdoutScore`.
3166
+ */
3167
+ proxyOf?: (run: RunRecord) => number | null;
3168
+ /**
3169
+ * The held-out ground-truth metric. For RL on coding, this is typically
3170
+ * test pass-rate. For RLHF, it's downstream task performance or human
3171
+ * preference. For knowledge tasks, it's an independently-graded score.
3172
+ */
3173
+ truthOf?: (run: RunRecord) => number | null;
3174
+ /**
3175
+ * Independent secondary reward. Used for the `reward_disagreement`
3176
+ * signal. Default uses the verifiable reward extractor (deterministic
3177
+ * sources only).
3178
+ */
3179
+ secondaryRewardOf?: (run: RunRecord) => number | null;
3180
+ /**
3181
+ * Window size — how many of the most recent runs count as the "after"
3182
+ * cohort. Default min(50, half the runs).
3183
+ */
3184
+ windowSize?: number;
3185
+ /**
3186
+ * Severity threshold to flag a signal. Default 0.3 (suspect) and 0.6
3187
+ * (gaming).
3188
+ */
3189
+ thresholds?: {
3190
+ suspect?: number;
3191
+ gaming?: number;
3192
+ };
3193
+ /**
3194
+ * Verifiable-reward options used for the secondary-reward fallback.
3195
+ */
3196
+ verifiableRewardOptions?: VerifiableRewardExtractionOptions;
3197
+ }
3198
+
2930
3199
  /**
2931
3200
  * `defaultProductionGate` — composes the substrate's existing safety
2932
3201
  * primitives (red-team / reward-hacking / canary / heldout) into a single
@@ -2939,6 +3208,10 @@ interface RedTeamCase extends DatasetScenario {
2939
3208
  * extra domain-specific gates they need (`composeGate(defaultProductionGate(...), customGate)`).
2940
3209
  */
2941
3210
 
3211
+ type DefaultProductionGateCheck = 'dimension-regression' | 'budget' | 'red-team' | 'reward-hacking' | 'canary';
3212
+ type DefaultProductionRewardHackingOptions = Omit<DetectRewardHackingInput, 'runs' | 'truthOf'> & {
3213
+ truthOf: NonNullable<DetectRewardHackingInput['truthOf']>;
3214
+ };
2942
3215
  interface DefaultProductionGateOptions {
2943
3216
  /** Required: scenarios held out from training; substrate compares
2944
3217
  * candidate-on-holdout vs baseline-on-holdout. */
@@ -2971,19 +3244,25 @@ interface DefaultProductionGateOptions {
2971
3244
  * native scale. When omitted it auto-scales off observed magnitudes:
2972
3245
  * 0.05 on [0,1], 5 on 0-100. */
2973
3246
  regressionTolerance?: number;
2974
- /** Total $ budget for ALL cells in this campaign — including baseline + candidate.
2975
- * Composite verdict refuses to ship when spend exceeded budget. */
3247
+ /** Total $ budget for the complete improvement run. Requires
3248
+ * `GateContext.costLedger`; missing or incomplete accounting holds. */
2976
3249
  budgetUsd?: number;
2977
- /** Red-team cases to probe candidate outputs against. When omitted the
2978
- * substrate uses `DEFAULT_RED_TEAM_CORPUS`. Provide a domain-specific
2979
- * battery for tighter coverage. */
3250
+ /** Static artifact-screening cases. Only `expected: 'ignore'` cases without
3251
+ * tool assertions are valid because this check does not dispatch case inputs
3252
+ * or observe tool calls. */
2980
3253
  redTeamBattery?: RedTeamCase[];
2981
- /** Run records (oldest-first) needed for the reward-hacking detector.
2982
- * Substrate populates from prior production-loop generations. */
3254
+ /** Shared run history, oldest first. Supplying history does not enable either
3255
+ * monitoring check; configure `rewardHacking` and/or `canary` explicitly. */
2983
3256
  recentRuns?: RunRecord[];
2984
- /** When true, the gate refuses to ship if the reward-hacking detector
2985
- * fires at the `gaming` severity. Default true. */
2986
- blockOnRewardHackingGaming?: boolean;
3257
+ /** Enable reward-hacking monitoring with a caller-owned independent truth channel. */
3258
+ rewardHacking?: DefaultProductionRewardHackingOptions;
3259
+ /** Enable canary monitoring. Pass `{}` to use the canary defaults. */
3260
+ canary?: CanaryOptions;
3261
+ /** Optional checks that must be evaluated even when their normal input is
3262
+ * absent. Configuring a check's input also makes that check required.
3263
+ * Missing evidence always records `not_evaluated`; required unevaluated
3264
+ * checks hold the release decision. Held-out significance is always required. */
3265
+ requiredChecks?: DefaultProductionGateCheck[];
2987
3266
  }
2988
3267
  /**
2989
3268
  * Opinionated production gate composing held-out significance, red-team, reward-hacking, and canary checks into a single `Gate.decide` decision.
@@ -3902,40 +4181,6 @@ interface Artifact {
3902
4181
  metadata?: Record<string, unknown>;
3903
4182
  }
3904
4183
 
3905
- /**
3906
- * Validator-output verdict — substrate primitive for "did this output pass,
3907
- * and how well?"
3908
- *
3909
- * Used by:
3910
- * - `@tangle-network/agent-eval/matrix` — verdict per cell in the cartesian.
3911
- * - `@tangle-network/agent-runtime` — Validator<Output, Verdict = DefaultVerdict>.
3912
- * Runtime keeps `Validator` because it's coupled to runtime-shaped
3913
- * `ValidationCtx` (iteration, signal, traceEmitter); the verdict TYPE
3914
- * itself is a substrate concept and lives here.
3915
- *
3916
- * Repo layering: agent-eval is the substrate (no upward deps). Both
3917
- * agent-runtime and agent-knowledge consume this type FROM agent-eval —
3918
- * never the other way around. See CLAUDE.md "Repo layering" for the rule.
3919
- */
3920
- /**
3921
- * Minimal verdict shape — `valid` + `score` are required; `scores` +
3922
- * `notes` are optional surface. Validators that need richer shapes
3923
- * parameterise `Validator<Output, MyVerdict>` with their own type.
3924
- *
3925
- * Need structured extras? Extend DefaultVerdict with typed fields — never
3926
- * serialize extras into `notes`.
3927
- */
3928
- interface DefaultVerdict {
3929
- /** Whether the output meets the validator's pass criteria. */
3930
- valid: boolean;
3931
- /** Aggregate score in [0, 1]. Drivers use this for winner selection. */
3932
- score: number;
3933
- /** Per-dimension scores. Free-form; weighted into `score` by the validator. */
3934
- scores?: Record<string, number>;
3935
- /** Human-readable rationale; surfaces in trace + final-result `winner.verdict`. */
3936
- notes?: string;
3937
- }
3938
-
3939
4184
  /**
3940
4185
  * Completion verifier — the task-completion oracle.
3941
4186
  *
@@ -4251,8 +4496,8 @@ interface ProfileSummary {
4251
4496
  model: string;
4252
4497
  /** RunRecords produced for this profile (= scenarios × reps). */
4253
4498
  records: number;
4254
- /** Mean composite across this profile's records. */
4255
- meanComposite: number;
4499
+ /** Mean across scored records, or null when the profile has no task labels. */
4500
+ meanComposite: number | null;
4256
4501
  totalCostUsd: number;
4257
4502
  /** Per-profile integrity verdict — surfaces a single profile that ran stub
4258
4503
  * even when the matrix as a whole looks real. */
@@ -4480,7 +4725,7 @@ interface RunOptimizationBaseOptions<TScenario extends Scenario, TArtifact> exte
4480
4725
  candidates: Array<{
4481
4726
  surfaceHash: string;
4482
4727
  campaign: CampaignResult<TArtifact, TScenario>;
4483
- composite: number;
4728
+ composite: number | null;
4484
4729
  }>;
4485
4730
  history: GenerationRecord[];
4486
4731
  /** Shared run spend account and receipt attribution phase. */
@@ -4641,7 +4886,7 @@ interface ParetoPoint {
4641
4886
  onFrontier: boolean;
4642
4887
  /** Optional gate verdict for this candidate, if a `GateDecision`
4643
4888
  * for it was passed in. */
4644
- gate?: 'promote' | 'reject_few_runs' | 'reject_negative_delta' | 'reject_overfit_gap' | null;
4889
+ gate?: 'promote' | 'reject';
4645
4890
  }
4646
4891
  interface ParetoFigureSpec {
4647
4892
  kind: 'pareto-cost-quality';
@@ -4695,8 +4940,8 @@ interface InsightReport {
4695
4940
  /** Number of runs analyzed. */
4696
4941
  n: number;
4697
4942
  /** Runtime facts carried by the run records. These describe execution,
4698
- * not task quality: duration, queueing, token categories, models, and
4699
- * explicitly recorded failures. */
4943
+ * not task quality: duration, queueing, token categories, models,
4944
+ * execution errors, and terminal outcomes. */
4700
4945
  execution: ExecutionInsight;
4701
4946
  /** Composite-score distribution across all runs. Always present. */
4702
4947
  composite: ScalarDistribution;
@@ -4754,10 +4999,9 @@ interface InsightReport {
4754
4999
  * Surfaced metrics: composite, cost, duration, tokenUsage, plus any
4755
5000
  * per-dimension judge metric present in both windows. */
4756
5001
  priorPeriodComparison?: PriorPeriodComparison;
4757
- /** Model-free failure-mode breakdown from `RunRecord.failureMode`, ranked
4758
- * by count descending. Present when any run carries a `failureMode`.
4759
- * Complements `failureClusters` (LLM-semantic) with the structured tags
4760
- * the harness already recorded — actionable with no analyst wired. */
5002
+ /** Model-free task-failure breakdown from `RunRecord.failureClass` or
5003
+ * `failureMode`, ranked by count descending. Tags from successful or
5004
+ * otherwise non-failed tasks are excluded. */
4761
5005
  failureModes?: FailureModeTally[];
4762
5006
  /** Top-N actionable recommendations, ranked by priority. The packet's
4763
5007
  * human-readable layer; the numeric sections are the evidence. */
@@ -4806,14 +5050,45 @@ interface ExecutionInsight {
4806
5050
  events: number;
4807
5051
  reportingRuns: number;
4808
5052
  };
4809
- /** Failure counts remain separate from outcome scores. `reportedErrorEvents`
4810
- * sums `outcome.raw.error_span_count` only where a producer supplied it. */
4811
- failures: {
5053
+ /** Runs with explicit execution-error telemetry. This is independent of
5054
+ * whether the root run ultimately succeeded, failed, or has no terminal
5055
+ * evidence. */
5056
+ executionErrors: {
4812
5057
  runs: number;
4813
- fraction: number;
4814
- reportedErrorEvents: number;
5058
+ /** Share among runs that supplied an execution-error count.
5059
+ * `null` when no run supplied error telemetry. */
5060
+ fraction: number | null;
5061
+ /** Execution-error events reported through the canonical count. */
5062
+ events: number;
5063
+ /** Runs that supplied an execution-error count, including explicit zeroes. */
4815
5064
  reportingRuns: number;
5065
+ /** Exact sum of `outcome.raw.error_span_count`, kept separate from other errors. */
5066
+ errorSpanEvents: number;
5067
+ /** Runs that supplied `outcome.raw.error_span_count`, including explicit zeroes. */
5068
+ errorSpanReportingRuns: number;
5069
+ /**
5070
+ * Error-telemetry coverage crossed with independently reported terminal
5071
+ * outcomes. `unreported` is distinct from a reported zero.
5072
+ */
5073
+ byTerminalOutcome: Record<RunTerminalOutcome, ExecutionErrorOutcomeCell>;
4816
5074
  };
5075
+ /** Root-run or process outcomes. Missing `RunRecord.terminalOutcome` values
5076
+ * count as `unknown`; child-span status never changes these counts. */
5077
+ terminalOutcomes: {
5078
+ succeeded: number;
5079
+ failed: number;
5080
+ cancelled: number;
5081
+ incomplete: number;
5082
+ unknown: number;
5083
+ };
5084
+ }
5085
+ interface ExecutionErrorOutcomeCell {
5086
+ /** Runs that explicitly reported one or more execution errors. */
5087
+ withErrors: number;
5088
+ /** Runs that explicitly reported zero execution errors. */
5089
+ withoutErrors: number;
5090
+ /** Runs with no execution-error count from the producer. */
5091
+ unreported: number;
4817
5092
  }
4818
5093
  interface TokenUsageInsight {
4819
5094
  input: ScalarDistribution;
@@ -4833,12 +5108,18 @@ interface TokenUsageInsight {
4833
5108
  interface ScalarDistribution {
4834
5109
  /** Sample count after dropping non-finite values. */
4835
5110
  n: number;
4836
- mean: number;
4837
- p50: number;
4838
- p95: number;
4839
- stddev: number;
4840
- min: number;
4841
- max: number;
5111
+ /** Null when `n` is zero. */
5112
+ mean: number | null;
5113
+ /** Null when `n` is zero. */
5114
+ p50: number | null;
5115
+ /** Null when `n` is zero. */
5116
+ p95: number | null;
5117
+ /** Null when `n` is zero. */
5118
+ stddev: number | null;
5119
+ /** Null when `n` is zero. */
5120
+ min: number | null;
5121
+ /** Null when `n` is zero. */
5122
+ max: number | null;
4842
5123
  /** Histogram bins using `agent-eval`'s `gainHistogram` primitive. */
4843
5124
  histogram: GainDistributionBin[];
4844
5125
  /** Worst-N runs by score, ascending. Populated for the composite
@@ -4904,12 +5185,16 @@ interface LiftInsight {
4904
5185
  pValue: number;
4905
5186
  /** Number of paired observations. */
4906
5187
  n: number;
4907
- /** Cohen's d for the delta. */
4908
- cohensD: number;
5188
+ /** Scored baseline observations without a candidate match. */
5189
+ unpairedBaseline: number;
5190
+ /** Scored candidate observations without a baseline match. */
5191
+ unpairedCandidate: number;
5192
+ /** Cohen's dz for paired deltas; null when the observed delta variance is zero. */
5193
+ cohensD: number | null;
4909
5194
  /** Minimum detectable effect at current n, 80% power. */
4910
5195
  mde: number;
4911
- /** Sample size needed to detect the observed delta at 80% power. */
4912
- requiredN: number;
5196
+ /** Paired sample size needed to detect the standardized effect at 80% power. */
5197
+ requiredN: number | null;
4913
5198
  }
4914
5199
  interface FailureClusterInsight {
4915
5200
  /** All clusters identified by the registry, ranked by share descending. */
@@ -4973,7 +5258,7 @@ interface ReleaseSummary {
4973
5258
  status: 'pass' | 'warn' | 'fail';
4974
5259
  axes: Array<{
4975
5260
  name: 'quality-lift' | 'contamination' | 'composite-distribution';
4976
- status: 'pass' | 'warn' | 'fail';
5261
+ status: 'pass' | 'warn' | 'fail' | 'not_evaluated';
4977
5262
  detail: string;
4978
5263
  }>;
4979
5264
  /** Free-form issues surfaced beyond the standard axes. Empty by default;
@@ -5033,9 +5318,8 @@ interface Recommendation {
5033
5318
  * # Hosted-tier wire format — the schema that EVERY orchestrator (ours,
5034
5319
  * a partner's self-hosted one, a future open implementation) must accept.
5035
5320
  *
5036
- * **Stability:** every type in this file is committed under semver. New
5037
- * minors only ADD optional fields. Breaking changes mean a major bump
5038
- * (`HostedWireVersion` literal increment).
5321
+ * This package implements exactly one wire version. Servers reject every
5322
+ * other version instead of translating old payloads.
5039
5323
  *
5040
5324
  * The wire format is two event streams in one transport:
5041
5325
  *
@@ -5054,7 +5338,7 @@ interface Recommendation {
5054
5338
  * ever sees another tenant's data.
5055
5339
  */
5056
5340
 
5057
- declare const HOSTED_WIRE_VERSION: "2026-05-26.v1";
5341
+ declare const HOSTED_WIRE_VERSION: "2026-07-24.v1";
5058
5342
  type HostedWireVersion = typeof HOSTED_WIRE_VERSION;
5059
5343
  /** Lifecycle stages of an eval-run as the substrate reports them. */
5060
5344
  type EvalRunStatus = 'started' | 'baseline-complete' | 'generation-complete' | 'gate-decided' | 'finished' | 'errored';
@@ -5063,11 +5347,15 @@ interface EvalRunCellScore {
5063
5347
  scenarioId: string;
5064
5348
  /** Repetition index when reps > 1; 0 for the default. */
5065
5349
  rep: number;
5066
- /** Composite score across all judges + dimensions for this cell. */
5067
- compositeMean: number;
5068
- /** Per-judge per-dimension scores; null where the judge did not run. */
5350
+ /** Composite score across successful judges, or null when unscored. */
5351
+ compositeMean: number | null;
5352
+ /** Per-judge and per-dimension scores; failed or missing judges are absent. */
5069
5353
  dimensions: Record<string, Record<string, number>>;
5070
- /** Per-cell error message if the dispatch threw. Null on success. */
5354
+ /** Root execution result, kept separate from task quality. */
5355
+ terminalOutcome: RunTerminalOutcome;
5356
+ /** Canonical execution-error count, or null when the producer did not measure it. */
5357
+ executionErrorCount: number | null;
5358
+ /** Per-cell dispatch or judge error. Missing on success. */
5071
5359
  errorMessage?: string;
5072
5360
  }
5073
5361
  interface EvalRunGenerationSnapshot {
@@ -5081,8 +5369,8 @@ interface EvalRunGenerationSnapshot {
5081
5369
  surface?: MutableSurface;
5082
5370
  /** Per-cell scores for this generation. */
5083
5371
  cells: EvalRunCellScore[];
5084
- /** Aggregate composite mean across all cells in this generation. */
5085
- compositeMean: number;
5372
+ /** Mean across scored cells, or null when no cell has a task-quality label. */
5373
+ compositeMean: number | null;
5086
5374
  /** Total $ spent across this generation. */
5087
5375
  costUsd: number;
5088
5376
  /** Wall-clock duration of this generation. */
@@ -5122,10 +5410,14 @@ interface EvalRunEvent {
5122
5410
  * paired-bootstrap lift CI, judge stats, inter-rater agreement,
5123
5411
  * contamination check, failure clusters (when an analyst is wired),
5124
5412
  * outcome correlation (when downstream signal is supplied), and the
5125
- * recommendations the dashboard surfaces verbatim. Additive; older
5126
- * clients that don't know about this field continue to work. */
5413
+ * recommendations the dashboard surfaces verbatim. */
5127
5414
  insightReport?: InsightReport;
5128
5415
  }
5416
+ /**
5417
+ * Canonical unsigned 64-bit integer encoded as a base-10 string.
5418
+ * JSON numbers cannot represent OTLP nanosecond timestamps exactly.
5419
+ */
5420
+ type UnixNanoTimestamp = string;
5129
5421
  /**
5130
5422
  * OTel-shape span with a few additional attributes for eval-run pivoting.
5131
5423
  * Compatible with any OTLP collector — `name`, `traceId`, `spanId`,
@@ -5136,11 +5428,11 @@ interface TraceSpanEvent {
5136
5428
  spanId: string;
5137
5429
  parentSpanId?: string;
5138
5430
  name: string;
5139
- startTimeUnixNano: number;
5140
- endTimeUnixNano: number;
5431
+ startTimeUnixNano: UnixNanoTimestamp;
5432
+ endTimeUnixNano: UnixNanoTimestamp;
5141
5433
  attributes: Record<string, string | number | boolean>;
5142
5434
  events?: Array<{
5143
- timeUnixNano: number;
5435
+ timeUnixNano: UnixNanoTimestamp;
5144
5436
  name: string;
5145
5437
  attributes?: Record<string, string | number | boolean>;
5146
5438
  }>;
@@ -5257,8 +5549,8 @@ interface LoopProvenanceCandidate {
5257
5549
  eligibleForPromotion: boolean;
5258
5550
  /** Designed-denominator receipt retained even for incomplete candidates. */
5259
5551
  coverage: NonNullable<GenerationCandidate['coverage']>;
5260
- /** Mean composite this candidate scored on the search split. */
5261
- composite: number;
5552
+ /** Mean composite this candidate scored on the search split, or null when unscorable. */
5553
+ composite: number | null;
5262
5554
  /** Whether this candidate was promoted out of its generation. */
5263
5555
  promoted: boolean;
5264
5556
  }
@@ -5330,11 +5622,7 @@ interface LoopProvenanceRecord {
5330
5622
  decision: GateDecision;
5331
5623
  reasons: string[];
5332
5624
  delta?: number;
5333
- contributingGates: Array<{
5334
- name: string;
5335
- passed: boolean;
5336
- detail: unknown;
5337
- }>;
5625
+ contributingGates: GateContribution[];
5338
5626
  };
5339
5627
  /** Present iff the loop ran with `holdout: 'deferred'` — the held-out
5340
5628
  * comparison was intentionally not measured in this run, so the holdout
@@ -5529,11 +5817,9 @@ declare function selectDiscriminative(signals: ScenarioSignal[], k: number, opts
5529
5817
  * the optimizers cannot drift on how a surface's score is computed.
5530
5818
  */
5531
5819
 
5532
- /** Mean composite across a campaign: per cell, the mean of its finite,
5533
- * successful judge composites; then the mean across cells. Invalid scores
5534
- * remain visible on raw cells and coverage receipts but never poison the
5535
- * descriptive aggregate with NaN. Cells with no valid scores are skipped.
5536
- * Empty ⇒ 0. */
5820
+ /** Mean composite across cells with complete task-quality evidence.
5821
+ * Partial judge results remain on their cells but never enter this value.
5822
+ * A campaign with no complete score has no numeric mean and fails loudly. */
5537
5823
  declare function campaignMeanComposite<TArtifact, TScenario extends Scenario>(campaign: CampaignResult<TArtifact, TScenario>): number;
5538
5824
  /** Compare fixed-length lexicographic rank keys where each element is higher-is-better.
5539
5825
  * Returns a positive number when `a` ranks above `b`, negative when below, and
@@ -6106,4 +6392,4 @@ declare function verifyCodeSurface(surface: CodeSurface, worktreeDir?: string):
6106
6392
  * identity against the checkout at `worktreeRef`. */
6107
6393
  declare function resolveWorktreePath(surface: CodeSurface, worktreeDir?: string): string;
6108
6394
 
6109
- export { type AnalystArtifact, type AnalystScenario, type AnalyzeCrossSurfaceInteractionsInput, type AxisEvidence, type AxisVerdict, type BuildAnalystSurfaceDispatchOptions, type BuildEvidenceVectorOptions, type BuildLoopProvenanceArgs, type CampaignAggregates, type CampaignArtifactWriter, type CampaignBreakdown, type CampaignCellFailureReceipt, type CampaignCellResult, type CampaignCostMeter, type CampaignResult, type CampaignRunPlan, type CampaignRunPlanCell, type CampaignScenarioIdentity, type CampaignStorage, type CampaignTokenUsage, type CampaignTraceWriter, type CodeSurface, type CodeSurfaceVerification, type CompareOptimizationMethodsOptions, type ComparisonCost, type ComponentSurface, type CostLedgerHandle, type CrossSurfaceAdditionDecision, type CrossSurfaceAdditionRejectionReason, type CrossSurfaceAttemptCompleteness, type CrossSurfaceBestSingleSelection, type CrossSurfaceBootstrapPolicy, type CrossSurfaceCandidate, type CrossSurfaceCandidateComparison, type CrossSurfaceCandidateEvidence, type CrossSurfaceCandidateOutcome, type CrossSurfaceCandidateSummary, type CrossSurfaceComponent, type CrossSurfaceComponentEvidence, type CrossSurfaceCompositionStep, type CrossSurfaceDistribution, type CrossSurfaceEligibility, type CrossSurfaceEvidenceBreakdown, type CrossSurfaceIneligibilityReason, type CrossSurfaceInteractionAwareSelection, type CrossSurfaceInteractionEffect, type CrossSurfaceInteractionPath, type CrossSurfaceInteractionReport, type CrossSurfaceInteractionTask, type CrossSurfaceNaiveStackSelection, type CrossSurfacePairCompatibility, type CrossSurfacePairEvidence, type CrossSurfacePairIncompatibilityReason, type CrossSurfacePairwiseEntry, type CrossSurfaceRankedSingle, type CrossSurfaceRelativeCost, type CrossSurfaceSelectionPolicy, type CrossSurfaceSelections, type CrossSurfaceTaskRow, type DefaultProductionGateOptions, type DimensionRegression, type DiscriminationScore, type DispatchContext, type DispatchFn, type EmitLoopProvenanceArgs, type EmitLoopProvenanceResult, type EvalFixture, type EvalFixtureFile, type EvalFixtureLoadOptions, type EvalFixtureRunPlan, type EvalFixtureScenario, type EvalFixtureValidationMode, type EvidenceVector, type ExternalOptimizationExample, type ExternalTextEvaluationResponse, type ExternalTextOptimizationMethodConfig, type ExternalTextOptimizerContext, type ExternalTextOptimizerResult, type FailureModeRecallJudgeOptions, FileSearchLedger, FsLabeledScenarioStore, type FsLabeledScenarioStoreOptions, type Gate, type GateContext, type GateDecision, type GateResult, type GenerationCandidate, type GenerationRecord, type GepaAdaptiveEngineRun, type GepaEngineOptions, type GepaEngineRun, type GepaOptimizationMethodConfig, type GepaOptimizationRecipe, type GepaRunnerCommand, type GitWorktreeAdapterOptions, type HeldOutGateOptions, type HeldoutSignificance, type HeldoutSignificanceOptions, type JudgeAggregate, type JudgeConfig, type JudgeDimension, type JudgeScore, type LabelTrust, type LabeledScenarioRecord, type LabeledScenarioSampleArgs, type LabeledScenarioSource, type LabeledScenarioStore, LabeledScenarioStoreError, type LabeledScenarioWrite, type LlmJudgeDimension, type LlmJudgeOptions, type LoadEvalFixtureScenariosOptions, type LoopProvenanceArgsFromResult, type LoopProvenanceBackend, type LoopProvenanceCandidate, type LoopProvenanceEvidence, type LoopProvenanceOptimizationMethod, type LoopProvenanceRecord, type MutableSurface, type NeutralizationGateOptions, type ObjectiveSource, type OpenAICompatibleOptimizerModel, type OpenAutoPrOptions, type OpenAutoPrResult, type OpenSearchLedgerOptions, type OptimizationMethod, type OptimizationMethodComparison, type OptimizationMethodInput, type OptimizationMethodPairwise, type OptimizationMethodProvenance, type OptimizationMethodResult, type OptimizationMethodRunOptions, type OptimizationMethodScore, type OptimizationPackageSource, type OptimizationProposer, type OptimizationTokenUsage, type OptimizerConfig, type OptimizerModelBudget, type PairedHoldout, type ParetoParent, type ParetoSignificanceGateOptions, type PendingCostCallView, type PlanCampaignRunOptions, type PlanEvalFixtureRunOptions, type PlaybackContext, type PlaybackDriver, type PlaybackStep, type PowerPreflight, type PowerPreflightOptions, type PremeasuredOptimizationBaseline, type ProfileDispatchFn, ProfileMatrixError, type ProfileSummary, type PromotionObjective, type PromotionPolicy, type ProposalTrackContext, type ProposeContext, type ProposedCandidate, type RedactionStatus, type ReferenceEquivalenceJudgeOptions, type ReferenceEquivalenceScenario, type RolloutArgumentDiff, type RolloutArgumentDiffOptions, type RolloutCall, type RunCampaignOptions, type RunEvalOptions, type RunImprovementLoopOptions, type RunImprovementLoopResult, type RunOptimizationOptions, type RunOptimizationResult, type RunProfileMatrixOptions, type RunProfileMatrixResult, SEARCH_LEDGER_SCHEMA, type Scenario, type ScenarioAggregate, type ScenarioRollup, type ScenarioSignal, type ScoreboardRenderOptions, type ScoreboardRow, type ScoreboardSummary, type ScoredRollout, type ScoredSurfaceOutcome, type SearchAccountingAudit, type SearchArtifactRef, type SearchAttemptAccounting, type SearchCandidateDecidedEvent, type SearchCandidateLineage, type SearchCandidateRegisteredEvent, type SearchCandidateSlot, type SearchCandidateSlotClosedEvent, type SearchCandidateSurface, type SearchCompletedEvent, type SearchCostAccounting, type SearchFailureReason, type SearchLedger, type SearchLedgerAppendResult, SearchLedgerConflictError, type SearchLedgerEntry, SearchLedgerError, type SearchLedgerEvent, type SearchLedgerHash, SearchLedgerIntegrityError, type SearchLedgerReplay, type SearchModelIdentity, type SearchOperationKind, type SearchOperationRecordedEvent, type SearchPlan, type SearchPlannedEvent, type SearchPlannedOperation, type SearchPlannedTask, type SearchSourceRef, type SearchSurfaceEffect, type SearchSurfaceEvidence, type SearchSurfaceKind, type SearchTaskAttemptedEvent, type SearchTaskOutcome, type SearchTokenAccounting, type SequentialDecideFn, type SequentialDecideOptions, type SequentialDecision, type SequentialObservation, type SequentialPairedGate, type SequentialPairedGateOptions, type SessionScript, type SingleRunLock, type SingleRunLockOptions, type SkillOptOptimizationMethodConfig, type SkillOptRunnerCommand, type SkillOptTrainerConfig, type SurfaceProposer, type TraceSpan, type TransientFailureOptions, type UngroundedLiteralReport, type UserStory, type UserStoryVerdict, type Worktree, type WorktreeAdapter, WorktreeAdapterError, acquireSingleRunLock, analyzeCrossSurfaceInteractions, assertCampaignDesign, assertCampaignSplitIdentity, assertCodeSurfaceIdentity, assertComponentSurface, buildAnalystSurfaceDispatch, buildEvidenceVector, buildLoopProvenanceRecord, campaignBreakdown, campaignMeanComposite, campaignMeasurementDigest, campaignScenarioIdentity, campaignSplitDigest, campaignSplitDigestFromIdentities, canonicalDigest, classifyUngroundedLiterals, codeSurfaceIdentityMaterial, compareOptimizationMethods, compareRankKeys, componentSurfaceIdentityMaterial, composeGate, costFromLedgerSummary, createReferenceEquivalenceJudge, createRunCostLedger, defaultProductionGate, detectScale, dimensionRegressions, discoverEvalFixtures, emitLoopProvenance, externalTextOptimizationMethod, failureModeRecallJudge, fsCampaignStorage, gepaOptimizationMethod, gitWorktreeAdapter, heldOutGate, heldoutSignificance, inMemoryCampaignStorage, isProposedCandidate, isTransientTransportFailure, labelTrustRank, llmJudge, loadEvalFixture, loadEvalFixtureScenarios, loopProvenanceArgsFromResult, loopProvenanceSpans, makePlaybackDispatch, neutralizationGate, neutralizeText, openAutoPr, openSearchLedger, optimizationTokenUsageFromSummary, pairHoldout, paretoPolicy, paretoSignificanceGate, planCampaignRun, planEvalFixtureRun, powerPreflight, provenanceRecordPath, provenanceSpansPath, renderScoreboardMarkdown, renderSurfaceDiff, resolveRunDir, resolveWorktreePath, rolloutArgumentDiff, runCampaign, runEval, runImprovementLoop, runOptimization, runProfileMatrix, scoreDiscrimination, scoreUserStory, scoreboardSummary, selectDiscriminative, sequentialDecide, sequentialPairedGate, skillOptOptimizationMethod, surfaceContentHash, surfaceHash, tangleTracesRoot, userStoryScoreboard, validateSearchLedgerEvent, verifyCodeSurface, verifyLoopProvenanceRecord };
6395
+ export { type AnalystArtifact, type AnalystScenario, type AnalyzeCrossSurfaceInteractionsInput, type AxisEvidence, type AxisVerdict, type BuildAnalystSurfaceDispatchOptions, type BuildEvidenceVectorOptions, type BuildLoopProvenanceArgs, type CampaignAggregates, type CampaignArtifactWriter, type CampaignBreakdown, type CampaignCellFailureReceipt, type CampaignCellResult, type CampaignCostMeter, type CampaignResult, type CampaignRunPlan, type CampaignRunPlanCell, type CampaignScenarioIdentity, type CampaignStorage, type CampaignTokenUsage, type CampaignTraceWriter, type CodeSurface, type CodeSurfaceVerification, type CompareOptimizationMethodsOptions, type ComparisonCost, type ComponentSurface, type CostLedgerHandle, type CrossSurfaceAdditionDecision, type CrossSurfaceAdditionRejectionReason, type CrossSurfaceAttemptCompleteness, type CrossSurfaceBestSingleSelection, type CrossSurfaceBootstrapPolicy, type CrossSurfaceCandidate, type CrossSurfaceCandidateComparison, type CrossSurfaceCandidateEvidence, type CrossSurfaceCandidateOutcome, type CrossSurfaceCandidateSummary, type CrossSurfaceComponent, type CrossSurfaceComponentEvidence, type CrossSurfaceCompositionStep, type CrossSurfaceDistribution, type CrossSurfaceEligibility, type CrossSurfaceEvidenceBreakdown, type CrossSurfaceIneligibilityReason, type CrossSurfaceInteractionAwareSelection, type CrossSurfaceInteractionEffect, type CrossSurfaceInteractionPath, type CrossSurfaceInteractionReport, type CrossSurfaceInteractionTask, type CrossSurfaceNaiveStackSelection, type CrossSurfacePairCompatibility, type CrossSurfacePairEvidence, type CrossSurfacePairIncompatibilityReason, type CrossSurfacePairwiseEntry, type CrossSurfaceRankedSingle, type CrossSurfaceRelativeCost, type CrossSurfaceSelectionPolicy, type CrossSurfaceSelections, type CrossSurfaceTaskRow, type DefaultProductionGateCheck, type DefaultProductionGateOptions, type DefaultProductionRewardHackingOptions, type DimensionRegression, type DiscriminationScore, type DispatchContext, type DispatchFn, type EmitLoopProvenanceArgs, type EmitLoopProvenanceResult, type EvalFixture, type EvalFixtureFile, type EvalFixtureLoadOptions, type EvalFixtureRunPlan, type EvalFixtureScenario, type EvalFixtureValidationMode, type EvidenceVector, type ExternalOptimizationExample, type ExternalTextEvaluationResponse, type ExternalTextOptimizationMethodConfig, type ExternalTextOptimizerContext, type ExternalTextOptimizerResult, type FailureModeRecallJudgeOptions, FileSearchLedger, FsLabeledScenarioStore, type FsLabeledScenarioStoreOptions, type Gate, type GateCheckStatus, type GateContext, type GateContribution, type GateDecision, type GateResult, type GenerationCandidate, type GenerationRecord, type GepaAdaptiveEngineRun, type GepaEngineOptions, type GepaEngineRun, type GepaOptimizationMethodConfig, type GepaOptimizationRecipe, type GepaRunnerCommand, type GitWorktreeAdapterOptions, type HeldOutGateOptions, type HeldoutSignificance, type HeldoutSignificanceOptions, type JudgeAggregate, type JudgeConfig, type JudgeDimension, type JudgeScore, type LabelTrust, type LabeledScenarioRecord, type LabeledScenarioSampleArgs, type LabeledScenarioSource, type LabeledScenarioStore, LabeledScenarioStoreError, type LabeledScenarioWrite, type LlmJudgeDimension, type LlmJudgeOptions, type LoadEvalFixtureScenariosOptions, type LoopProvenanceArgsFromResult, type LoopProvenanceBackend, type LoopProvenanceCandidate, type LoopProvenanceEvidence, type LoopProvenanceOptimizationMethod, type LoopProvenanceRecord, type MutableSurface, type NeutralizationGateOptions, type ObjectiveSource, type OpenAICompatibleOptimizerModel, type OpenAutoPrOptions, type OpenAutoPrResult, type OpenSearchLedgerOptions, type OptimizationMethod, type OptimizationMethodComparison, type OptimizationMethodInput, type OptimizationMethodPairwise, type OptimizationMethodProvenance, type OptimizationMethodResult, type OptimizationMethodRunOptions, type OptimizationMethodScore, type OptimizationPackageSource, type OptimizationProposer, type OptimizationTokenUsage, type OptimizerConfig, type OptimizerModelBudget, type PairedHoldout, type ParetoParent, type ParetoSignificanceGateOptions, type PendingCostCallView, type PlanCampaignRunOptions, type PlanEvalFixtureRunOptions, type PlaybackContext, type PlaybackDriver, type PlaybackStep, type PowerPreflight, type PowerPreflightOptions, type PremeasuredOptimizationBaseline, type ProfileDispatchFn, ProfileMatrixError, type ProfileSummary, type PromotionObjective, type PromotionPolicy, type ProposalTrackContext, type ProposeContext, type ProposedCandidate, type RedactionStatus, type ReferenceEquivalenceJudgeOptions, type ReferenceEquivalenceScenario, type RolloutArgumentDiff, type RolloutArgumentDiffOptions, type RolloutCall, type RunCampaignOptions, type RunEvalOptions, type RunImprovementLoopOptions, type RunImprovementLoopResult, type RunOptimizationOptions, type RunOptimizationResult, type RunProfileMatrixOptions, type RunProfileMatrixResult, SEARCH_LEDGER_SCHEMA, type Scenario, type ScenarioAggregate, type ScenarioRollup, type ScenarioSignal, type ScoreboardRenderOptions, type ScoreboardRow, type ScoreboardSummary, type ScoredRollout, type ScoredSurfaceOutcome, type SearchAccountingAudit, type SearchArtifactRef, type SearchAttemptAccounting, type SearchCandidateDecidedEvent, type SearchCandidateLineage, type SearchCandidateRegisteredEvent, type SearchCandidateSlot, type SearchCandidateSlotClosedEvent, type SearchCandidateSurface, type SearchCompletedEvent, type SearchCostAccounting, type SearchFailureReason, type SearchLedger, type SearchLedgerAppendResult, SearchLedgerConflictError, type SearchLedgerEntry, SearchLedgerError, type SearchLedgerEvent, type SearchLedgerHash, SearchLedgerIntegrityError, type SearchLedgerReplay, type SearchModelIdentity, type SearchOperationKind, type SearchOperationRecordedEvent, type SearchPlan, type SearchPlannedEvent, type SearchPlannedOperation, type SearchPlannedTask, type SearchSourceRef, type SearchSurfaceEffect, type SearchSurfaceEvidence, type SearchSurfaceKind, type SearchTaskAttemptedEvent, type SearchTaskOutcome, type SearchTokenAccounting, type SequentialDecideFn, type SequentialDecideOptions, type SequentialDecision, type SequentialObservation, type SequentialPairedGate, type SequentialPairedGateOptions, type SessionScript, type SingleRunLock, type SingleRunLockOptions, type SkillOptOptimizationMethodConfig, type SkillOptRunnerCommand, type SkillOptTrainerConfig, type SurfaceProposer, type TraceSpan, type TransientFailureOptions, type UngroundedLiteralReport, type UserStory, type UserStoryVerdict, type Worktree, type WorktreeAdapter, WorktreeAdapterError, acquireSingleRunLock, analyzeCrossSurfaceInteractions, assertCampaignDesign, assertCampaignSplitIdentity, assertCodeSurfaceIdentity, assertComponentSurface, buildAnalystSurfaceDispatch, buildEvidenceVector, buildLoopProvenanceRecord, campaignBreakdown, campaignMeanComposite, campaignMeasurementDigest, campaignScenarioIdentity, campaignSplitDigest, campaignSplitDigestFromIdentities, canonicalDigest, classifyUngroundedLiterals, codeSurfaceIdentityMaterial, compareOptimizationMethods, compareRankKeys, componentSurfaceIdentityMaterial, composeGate, costFromLedgerSummary, createReferenceEquivalenceJudge, createRunCostLedger, defaultProductionGate, detectScale, dimensionRegressions, discoverEvalFixtures, emitLoopProvenance, externalTextOptimizationMethod, failureModeRecallJudge, fsCampaignStorage, gepaOptimizationMethod, gitWorktreeAdapter, heldOutGate, heldoutSignificance, inMemoryCampaignStorage, isProposedCandidate, isTransientTransportFailure, labelTrustRank, llmJudge, loadEvalFixture, loadEvalFixtureScenarios, loopProvenanceArgsFromResult, loopProvenanceSpans, makePlaybackDispatch, neutralizationGate, neutralizeText, openAutoPr, openSearchLedger, optimizationTokenUsageFromSummary, pairHoldout, paretoPolicy, paretoSignificanceGate, planCampaignRun, planEvalFixtureRun, powerPreflight, provenanceRecordPath, provenanceSpansPath, renderScoreboardMarkdown, renderSurfaceDiff, resolveRunDir, resolveWorktreePath, rolloutArgumentDiff, runCampaign, runEval, runImprovementLoop, runOptimization, runProfileMatrix, scoreDiscrimination, scoreUserStory, scoreboardSummary, selectDiscriminative, sequentialDecide, sequentialPairedGate, skillOptOptimizationMethod, surfaceContentHash, surfaceHash, tangleTracesRoot, userStoryScoreboard, validateSearchLedgerEvent, verifyCodeSurface, verifyLoopProvenanceRecord };