@tangle-network/agent-eval 0.23.1 → 0.25.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 (148) hide show
  1. package/CHANGELOG.md +145 -0
  2. package/README.md +212 -79
  3. package/dist/baseline-4R5deP0N.d.ts +108 -0
  4. package/dist/benchmarks/index.d.ts +3 -2
  5. package/dist/benchmarks/index.js +1 -1
  6. package/dist/builder-eval/index.d.ts +249 -0
  7. package/dist/builder-eval/index.js +391 -0
  8. package/dist/builder-eval/index.js.map +1 -0
  9. package/dist/{chunk-IOXMGMHQ.js → chunk-2A5XJB43.js} +142 -318
  10. package/dist/chunk-2A5XJB43.js.map +1 -0
  11. package/dist/chunk-47X6LRCE.js +76 -0
  12. package/dist/chunk-47X6LRCE.js.map +1 -0
  13. package/dist/{chunk-6M774GY6.js → chunk-4F5DQN55.js} +1 -1
  14. package/dist/chunk-4F5DQN55.js.map +1 -0
  15. package/dist/{chunk-KAO3Q65R.js → chunk-4S4BM3QQ.js} +15 -13
  16. package/dist/chunk-4S4BM3QQ.js.map +1 -0
  17. package/dist/chunk-5BKGXME7.js +65 -0
  18. package/dist/chunk-5BKGXME7.js.map +1 -0
  19. package/dist/{chunk-6KQG5HAH.js → chunk-5LBB5B3Z.js} +376 -72
  20. package/dist/chunk-5LBB5B3Z.js.map +1 -0
  21. package/dist/{chunk-42I2QC2L.js → chunk-6QDKWHLS.js} +18 -14
  22. package/dist/chunk-6QDKWHLS.js.map +1 -0
  23. package/dist/{chunk-VQQSPGSM.js → chunk-EDUKQ5AM.js} +247 -189
  24. package/dist/chunk-EDUKQ5AM.js.map +1 -0
  25. package/dist/chunk-I4MBDTY5.js +272 -0
  26. package/dist/chunk-I4MBDTY5.js.map +1 -0
  27. package/dist/chunk-JLZQWFV3.js +618 -0
  28. package/dist/chunk-JLZQWFV3.js.map +1 -0
  29. package/dist/chunk-K2TPS5LB.js +569 -0
  30. package/dist/chunk-K2TPS5LB.js.map +1 -0
  31. package/dist/chunk-KKHDIONI.js +414 -0
  32. package/dist/chunk-KKHDIONI.js.map +1 -0
  33. package/dist/chunk-KMPRBJK4.js +74 -0
  34. package/dist/chunk-KMPRBJK4.js.map +1 -0
  35. package/dist/{chunk-QUKKGHTZ.js → chunk-KTGTIOFD.js} +6 -3
  36. package/dist/chunk-KTGTIOFD.js.map +1 -0
  37. package/dist/chunk-LSH4MMOZ.js +838 -0
  38. package/dist/chunk-LSH4MMOZ.js.map +1 -0
  39. package/dist/chunk-NG236HPC.js +57 -0
  40. package/dist/chunk-NG236HPC.js.map +1 -0
  41. package/dist/{chunk-QBW3YBTR.js → chunk-NLMNWKVM.js} +14 -6
  42. package/dist/chunk-NLMNWKVM.js.map +1 -0
  43. package/dist/chunk-NU65VQ7M.js +99 -0
  44. package/dist/chunk-NU65VQ7M.js.map +1 -0
  45. package/dist/chunk-OWLAAMME.js +250 -0
  46. package/dist/chunk-OWLAAMME.js.map +1 -0
  47. package/dist/{chunk-SQQLHODJ.js → chunk-PC4UYEBM.js} +7 -4
  48. package/dist/chunk-PC4UYEBM.js.map +1 -0
  49. package/dist/{chunk-7EAUOUQS.js → chunk-RAF443UI.js} +213 -115
  50. package/dist/chunk-RAF443UI.js.map +1 -0
  51. package/dist/chunk-RZTMDUO7.js +49 -0
  52. package/dist/chunk-RZTMDUO7.js.map +1 -0
  53. package/dist/{chunk-EXGR4XEM.js → chunk-SESZDQPX.js} +23 -19
  54. package/dist/chunk-SESZDQPX.js.map +1 -0
  55. package/dist/{chunk-5IIQKMD5.js → chunk-TVVP3ZZQ.js} +14 -4
  56. package/dist/chunk-TVVP3ZZQ.js.map +1 -0
  57. package/dist/chunk-WWYCWKUM.js +196 -0
  58. package/dist/chunk-WWYCWKUM.js.map +1 -0
  59. package/dist/{chunk-AXHNWLIX.js → chunk-YRZ4M5GS.js} +2 -90
  60. package/dist/chunk-YRZ4M5GS.js.map +1 -0
  61. package/dist/chunk-ZN274SWR.js +613 -0
  62. package/dist/chunk-ZN274SWR.js.map +1 -0
  63. package/dist/cli.js +10 -6
  64. package/dist/cli.js.map +1 -1
  65. package/dist/{control-DvkH87qJ.d.ts → control-CBShYYA6.d.ts} +32 -33
  66. package/dist/control-runtime-BuJHoLg0.d.ts +180 -0
  67. package/dist/control.d.ts +8 -6
  68. package/dist/control.js +10 -7
  69. package/dist/{dataset-B9qvlm_o.d.ts → dataset-CiK_3LDr.d.ts} +5 -2
  70. package/dist/{emitter-B2XqDKFU.d.ts → emitter-DP_cSSiw.d.ts} +1 -1
  71. package/dist/errors-BZ9sTdz7.d.ts +70 -0
  72. package/dist/failure-cluster-C2EGSDiT.d.ts +76 -0
  73. package/dist/feedback-trajectory-DfFdrraJ.d.ts +169 -0
  74. package/dist/governance/index.d.ts +5 -0
  75. package/dist/governance/index.js +18 -0
  76. package/dist/governance/index.js.map +1 -0
  77. package/dist/{index-DDTlbHEK.d.ts → index--fVrWDiR.d.ts} +1 -1
  78. package/dist/index-Oj9fAPPN.d.ts +270 -0
  79. package/dist/index.d.ts +2018 -3003
  80. package/dist/index.js +7443 -9102
  81. package/dist/index.js.map +1 -1
  82. package/dist/{integrity-Cr5YodSY.d.ts → integrity-DK2EBVZC.d.ts} +4 -3
  83. package/dist/knowledge/index.d.ts +102 -0
  84. package/dist/knowledge/index.js +18 -0
  85. package/dist/knowledge/index.js.map +1 -0
  86. package/dist/meta-eval/index.d.ts +99 -0
  87. package/dist/meta-eval/index.js +324 -0
  88. package/dist/meta-eval/index.js.map +1 -0
  89. package/dist/multi-layer-verifier-LkP3LVKj.d.ts +141 -0
  90. package/dist/openapi.json +491 -1
  91. package/dist/optimization.d.ts +11 -8
  92. package/dist/optimization.js +11 -9
  93. package/dist/outcome-store-D6KWmYvj.d.ts +63 -0
  94. package/dist/pipelines/index.d.ts +172 -0
  95. package/dist/pipelines/index.js +345 -0
  96. package/dist/pipelines/index.js.map +1 -0
  97. package/dist/prm/index.d.ts +99 -0
  98. package/dist/prm/index.js +222 -0
  99. package/dist/prm/index.js.map +1 -0
  100. package/dist/query-DODUYdPg.d.ts +30 -0
  101. package/dist/release-report-BNgMdqPF.d.ts +292 -0
  102. package/dist/replay-BL96gCEP.d.ts +226 -0
  103. package/dist/reporting.d.ts +10 -295
  104. package/dist/reporting.js +10 -6
  105. package/dist/{eval-campaign-Ds5QljIh.d.ts → researcher-BPT8x_NT.d.ts} +148 -146
  106. package/dist/rl.d.ts +1762 -8
  107. package/dist/rl.js +2035 -58
  108. package/dist/rl.js.map +1 -1
  109. package/dist/rubric-D5tjHNJQ.d.ts +72 -0
  110. package/dist/rubric-predictive-validity-C0uDYwG6.d.ts +105 -0
  111. package/dist/{run-record-DNiOMBrZ.d.ts → run-record-CqzahIbx.d.ts} +4 -1
  112. package/dist/sequential-Dgz1n51-.d.ts +139 -0
  113. package/dist/{store-u47QaJ9G.d.ts → store-Db2Bv8Cf.d.ts} +1 -1
  114. package/dist/{summary-report-Ce1r4EYo.d.ts → summary-report-C7VPYEj2.d.ts} +3 -76
  115. package/dist/telemetry/file.js +4 -1
  116. package/dist/telemetry/file.js.map +1 -1
  117. package/dist/telemetry/index.js +57 -57
  118. package/dist/telemetry/index.js.map +1 -1
  119. package/dist/test-graded-scenario-B2kWEdh9.d.ts +146 -0
  120. package/dist/traces.d.ts +142 -387
  121. package/dist/traces.js +1302 -40
  122. package/dist/traces.js.map +1 -1
  123. package/dist/trajectory-CnoBo-JY.d.ts +32 -0
  124. package/dist/wire/index.d.ts +369 -25
  125. package/dist/wire/index.js +22 -3
  126. package/package.json +44 -18
  127. package/dist/chunk-42I2QC2L.js.map +0 -1
  128. package/dist/chunk-5IIQKMD5.js.map +0 -1
  129. package/dist/chunk-6KQG5HAH.js.map +0 -1
  130. package/dist/chunk-6M774GY6.js.map +0 -1
  131. package/dist/chunk-7EAUOUQS.js.map +0 -1
  132. package/dist/chunk-AXHNWLIX.js.map +0 -1
  133. package/dist/chunk-EXGR4XEM.js.map +0 -1
  134. package/dist/chunk-IOXMGMHQ.js.map +0 -1
  135. package/dist/chunk-KAO3Q65R.js.map +0 -1
  136. package/dist/chunk-LZKIOBG2.js +0 -2026
  137. package/dist/chunk-LZKIOBG2.js.map +0 -1
  138. package/dist/chunk-QBW3YBTR.js.map +0 -1
  139. package/dist/chunk-QUKKGHTZ.js.map +0 -1
  140. package/dist/chunk-SQQLHODJ.js.map +0 -1
  141. package/dist/chunk-V5QSWN7L.js +0 -1310
  142. package/dist/chunk-V5QSWN7L.js.map +0 -1
  143. package/dist/chunk-VQQSPGSM.js.map +0 -1
  144. package/dist/chunk-XPHOZPOM.js +0 -1947
  145. package/dist/chunk-XPHOZPOM.js.map +0 -1
  146. package/dist/feedback-trajectory-c43WGtTX.d.ts +0 -346
  147. package/dist/index-ekBXweiQ.d.ts +0 -1894
  148. package/dist/sequential-DgU2mFsE.d.ts +0 -304
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/control-runtime.ts","../src/run-evidence.ts","../src/action-policy.ts","../src/propose-review.ts","../src/propose-review-control.ts"],"sourcesContent":["/**\n * Policy-based agent control runtime.\n *\n * This is the minimal reusable loop behind driver-agent patterns:\n *\n * observe state -> validate -> decide next action -> act -> observe -> ...\n *\n * It deliberately does not model named \"topologies\". Direct execution,\n * critic/revise, driver intervention, specialist calls, and human escalation\n * are all just actions chosen by the control policy.\n */\n\nimport { TraceEmitter, type SpanHandle } from './trace/emitter'\nimport type { FailureClass } from './trace/schema'\nimport type { TraceStore } from './trace/store'\n\nexport type ControlSeverity = 'info' | 'warning' | 'error' | 'critical'\nexport type ControlActionFailureMode = 'continue' | 'stop'\n\nexport interface ControlEvalResult {\n /** Stable validator or judge id. */\n id: string\n /** Whether this check passed. */\n passed: boolean\n /** Optional normalized score. 1 = best, 0 = worst. */\n score?: number\n /** Objective validators should usually be \"error\" or \"critical\" when failed. */\n severity?: ControlSeverity\n /** Human-readable result. */\n detail?: string\n /** Small evidence string or pointer. Avoid large payloads. */\n evidence?: string\n /** True when the result came from deterministic state, not LLM judgment. */\n objective?: boolean\n /** Structured details for downstream control policies and reports. */\n metadata?: Record<string, unknown>\n}\n\nexport interface ControlBudget {\n maxSteps: number\n maxWallMs?: number\n maxCostUsd?: number\n}\n\nexport interface ControlStopPolicies<TState, TAction> {\n /**\n * Stop after N consecutive steps with no state fingerprint change and\n * less than `minScoreDelta` score movement. Disabled when omitted.\n */\n maxNoProgressSteps?: number\n /**\n * Stop after the same action fingerprint is selected N consecutive\n * times. Disabled when omitted.\n */\n maxRepeatedActions?: number\n /** Minimum score movement that counts as progress. Default 0.001. */\n minScoreDelta?: number\n /** Override the default JSON/string fingerprint for state comparisons. */\n stateFingerprint?: (state: TState) => string\n /** Override the default JSON/string fingerprint for repeated-action checks. */\n actionFingerprint?: (action: TAction) => string\n}\n\nexport interface ControlContext<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {\n intent: string\n state: TState\n evals: TEval[]\n history: ControlStep<TState, TAction, TActionResult, TEval>[]\n budget: ControlBudget\n stepIndex: number\n wallMs: number\n spentCostUsd: number\n remainingCostUsd?: number\n abortSignal: AbortSignal\n emitter?: TraceEmitter\n}\n\nexport type ControlDecision<TAction> =\n | {\n type: 'continue'\n action: TAction\n reason?: string\n }\n | {\n type: 'stop'\n reason: string\n pass?: boolean\n score?: number\n }\n\nexport interface StopDecision {\n stop: boolean\n pass: boolean\n reason: string\n score?: number\n failureClass?: FailureClass\n}\n\nexport interface ControlActionOutcome<TActionResult> {\n ok: boolean\n result?: TActionResult\n error?: string\n costUsd?: number\n durationMs: number\n}\n\nexport interface ControlRuntimeError {\n phase: 'observe' | 'validate' | 'decide' | 'act' | 'stop-policy' | 'on-step' | 'trace'\n stepIndex: number\n message: string\n}\n\nexport interface ControlStep<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {\n index: number\n decision: ControlDecision<TAction>\n beforeState: TState\n afterState: TState\n evalsBefore: TEval[]\n evalsAfter: TEval[]\n actionOutcome?: ControlActionOutcome<TActionResult>\n startedAt: string\n endedAt: string\n}\n\nexport interface ControlRunResult<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {\n intent: string\n pass: boolean\n completed: boolean\n reason: string\n score?: number\n steps: ControlStep<TState, TAction, TActionResult, TEval>[]\n finalState: TState | undefined\n finalEvals: TEval[]\n wallMs: number\n spentCostUsd: number\n runId: string | null\n failureClass?: FailureClass\n runtimeErrors: ControlRuntimeError[]\n stoppedBy: 'policy' | 'stop-policy' | 'budget' | 'abort' | 'runtime-error'\n}\n\nexport interface ControlRuntimeConfig<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {\n intent: string\n budget?: Partial<ControlBudget>\n signal?: AbortSignal\n /** Defaults to `continue`: action failures are recorded, then the policy gets another chance. */\n actionFailure?: ControlActionFailureMode\n /**\n * Extract cost from an action result. Used for `maxCostUsd` budget\n * enforcement and trace budget ledger emission.\n */\n getActionCostUsd?: (ctx: {\n action: TAction\n result: TActionResult\n state: TState\n evals: TEval[]\n history: ControlStep<TState, TAction, TActionResult, TEval>[]\n }) => number | undefined\n\n /** Read typed task/product state. Prefer structured state over transcript-only context. */\n observe: (ctx: {\n history: ControlStep<TState, TAction, TActionResult, TEval>[]\n abortSignal: AbortSignal\n }) => Promise<TState> | TState\n\n /** Objective validators first, subjective judges only where objective state is insufficient. */\n validate: (ctx: {\n intent: string\n state: TState\n history: ControlStep<TState, TAction, TActionResult, TEval>[]\n abortSignal: AbortSignal\n }) => Promise<TEval[]> | TEval[]\n\n /** Choose the next control action. Can call a worker, ask user, run critic, inspect state, or stop. */\n decide: (ctx: ControlContext<TState, TAction, TActionResult, TEval>) => Promise<ControlDecision<TAction>> | ControlDecision<TAction>\n\n /** Execute the action selected by the policy. */\n act: (action: TAction, ctx: ControlContext<TState, TAction, TActionResult, TEval>) => Promise<TActionResult> | TActionResult\n\n /** Final stopping policy. Called before decide and after each action. */\n shouldStop?: (ctx: ControlContext<TState, TAction, TActionResult, TEval>) => Promise<StopDecision> | StopDecision\n\n /** Optional hook for tracing or live progress updates. */\n onStep?: (step: ControlStep<TState, TAction, TActionResult, TEval>) => Promise<void> | void\n\n /** Optional generic stuck-loop policies. Custom `shouldStop` still runs first. */\n stopPolicies?: ControlStopPolicies<TState, TAction>\n\n /** Optional trace sink. Emits one run plus one span per control step. */\n store?: TraceStore\n scenarioId?: string\n projectId?: string\n variantId?: string\n}\n\nconst DEFAULT_BUDGET: ControlBudget = {\n maxSteps: 8,\n maxWallMs: 5 * 60 * 1000,\n}\n\nexport async function runAgentControlLoop<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult>(\n config: ControlRuntimeConfig<TState, TAction, TActionResult, TEval>,\n): Promise<ControlRunResult<TState, TAction, TActionResult, TEval>> {\n const budget = normalizeBudget(config.budget)\n const actionFailure = config.actionFailure ?? 'continue'\n const controller = new AbortController()\n const upstreamAbort = () => controller.abort(config.signal?.reason)\n if (config.signal) {\n if (config.signal.aborted) controller.abort(config.signal.reason)\n else config.signal.addEventListener('abort', upstreamAbort, { once: true })\n }\n\n const started = Date.now()\n const wallTimer = budget.maxWallMs\n ? setTimeout(() => controller.abort(new Error('control runtime wall timeout')), budget.maxWallMs)\n : undefined\n const history: ControlStep<TState, TAction, TActionResult, TEval>[] = []\n const emitter = config.store ? new TraceEmitter(config.store) : undefined\n let spentCostUsd = 0\n const runtimeErrors: ControlRuntimeError[] = []\n let lastStateFingerprint: string | undefined\n let lastActionFingerprint: string | undefined\n let noProgressStreak = 0\n let repeatedActionStreak = 0\n\n try {\n if (emitter) {\n await runTrace(runtimeErrors, 0, () => emitter.startRun({\n scenarioId: config.scenarioId ?? 'agent-control-loop',\n projectId: config.projectId,\n variantId: config.variantId,\n layer: 'meta',\n tags: {\n intent: config.intent.slice(0, 120),\n maxSteps: String(budget.maxSteps),\n ...(budget.maxCostUsd !== undefined ? { maxCostUsd: String(budget.maxCostUsd) } : {}),\n },\n }))\n }\n\n let state: TState\n let evals: TEval[]\n try {\n state = await config.observe({ history, abortSignal: controller.signal })\n } catch (err) {\n const error = runtimeError('observe', 0, err)\n runtimeErrors.push(error)\n return finish(emitter, {\n intent: config.intent,\n pass: false,\n completed: false,\n reason: error.message,\n steps: history,\n finalState: undefined,\n finalEvals: [],\n wallMs: Date.now() - started,\n spentCostUsd,\n runId: emitter?.runId ?? null,\n failureClass: 'unknown',\n runtimeErrors,\n stoppedBy: 'runtime-error',\n })\n }\n try {\n evals = await config.validate({ intent: config.intent, state, history, abortSignal: controller.signal })\n await recordEvalSpans(emitter, evals, 'initial', runtimeErrors, 0)\n } catch (err) {\n const error = runtimeError('validate', 0, err)\n runtimeErrors.push(error)\n return finish(emitter, {\n intent: config.intent,\n pass: false,\n completed: false,\n reason: error.message,\n steps: history,\n finalState: state,\n finalEvals: [],\n wallMs: Date.now() - started,\n spentCostUsd,\n runId: emitter?.runId ?? null,\n failureClass: 'unknown',\n runtimeErrors,\n stoppedBy: 'runtime-error',\n })\n }\n lastStateFingerprint = fingerprintState(state, config.stopPolicies)\n\n for (let stepIndex = 0; stepIndex < budget.maxSteps; stepIndex++) {\n if (controller.signal.aborted) {\n return finish(emitter, {\n intent: config.intent,\n pass: false,\n completed: false,\n reason: abortReason(controller.signal),\n score: undefined,\n steps: history,\n finalState: state,\n finalEvals: evals,\n wallMs: Date.now() - started,\n spentCostUsd,\n runId: emitter?.runId ?? null,\n failureClass: 'timeout',\n runtimeErrors,\n stoppedBy: 'abort',\n })\n }\n\n const budgetStop = budgetStopDecision(budget, spentCostUsd)\n if (budgetStop.stop) {\n return finish(emitter, {\n intent: config.intent,\n pass: false,\n completed: false,\n reason: budgetStop.reason,\n score: averageScore(evals),\n steps: history,\n finalState: state,\n finalEvals: evals,\n wallMs: Date.now() - started,\n spentCostUsd,\n runId: emitter?.runId ?? null,\n failureClass: 'budget_exceeded',\n runtimeErrors,\n stoppedBy: 'budget',\n })\n }\n\n const ctx = makeContext(config.intent, state, evals, history, budget, stepIndex, started, spentCostUsd, controller.signal, emitter)\n let stop: StopDecision\n try {\n stop = config.shouldStop ? await config.shouldStop(ctx) : defaultStopDecision(evals)\n } catch (err) {\n runtimeErrors.push(runtimeError('stop-policy', stepIndex, err))\n return finish(emitter, {\n intent: config.intent,\n pass: false,\n completed: false,\n reason: runtimeErrors[runtimeErrors.length - 1].message,\n score: averageScore(evals),\n steps: history,\n finalState: state,\n finalEvals: evals,\n wallMs: Date.now() - started,\n spentCostUsd,\n runId: emitter?.runId ?? null,\n failureClass: 'unknown',\n runtimeErrors,\n stoppedBy: 'runtime-error',\n })\n }\n if (stop.stop) {\n return finish(emitter, {\n intent: config.intent,\n pass: stop.pass,\n completed: true,\n reason: stop.reason,\n score: stop.score,\n steps: history,\n finalState: state,\n finalEvals: evals,\n wallMs: Date.now() - started,\n spentCostUsd,\n runId: emitter?.runId ?? null,\n failureClass: stop.failureClass,\n runtimeErrors,\n stoppedBy: 'stop-policy',\n })\n }\n\n let decision: ControlDecision<TAction>\n try {\n decision = await config.decide(ctx)\n } catch (err) {\n runtimeErrors.push(runtimeError('decide', stepIndex, err))\n return finish(emitter, {\n intent: config.intent,\n pass: false,\n completed: false,\n reason: runtimeErrors[runtimeErrors.length - 1].message,\n score: averageScore(evals),\n steps: history,\n finalState: state,\n finalEvals: evals,\n wallMs: Date.now() - started,\n spentCostUsd,\n runId: emitter?.runId ?? null,\n failureClass: 'unknown',\n runtimeErrors,\n stoppedBy: 'runtime-error',\n })\n }\n if (decision.type === 'stop') {\n return finish(emitter, {\n intent: config.intent,\n pass: decision.pass ?? false,\n completed: true,\n reason: decision.reason,\n score: decision.score,\n steps: history,\n finalState: state,\n finalEvals: evals,\n wallMs: Date.now() - started,\n spentCostUsd,\n runId: emitter?.runId ?? null,\n failureClass: decision.pass === false ? 'unknown' : undefined,\n runtimeErrors,\n stoppedBy: 'policy',\n })\n }\n\n const actionFingerprint = fingerprintAction(decision.action, config.stopPolicies)\n repeatedActionStreak = actionFingerprint === lastActionFingerprint ? repeatedActionStreak + 1 : 1\n lastActionFingerprint = actionFingerprint\n const repeatedActionStop = repeatedActionStopDecision(config.stopPolicies, repeatedActionStreak)\n if (repeatedActionStop.stop) {\n return finish(emitter, {\n intent: config.intent,\n pass: false,\n completed: true,\n reason: repeatedActionStop.reason,\n score: averageScore(evals),\n steps: history,\n finalState: state,\n finalEvals: evals,\n wallMs: Date.now() - started,\n spentCostUsd,\n runId: emitter?.runId ?? null,\n failureClass: 'tool_recovery_failure',\n runtimeErrors,\n stoppedBy: 'stop-policy',\n })\n }\n\n const beforeState = state\n const evalsBefore = evals\n const scoreBefore = averageScore(evals)\n const actionStarted = Date.now()\n const stepHandle = emitter\n ? await runTrace(runtimeErrors, stepIndex, () => emitter.tool({\n name: `control-step-${stepIndex}`,\n toolName: 'agent-control-action',\n args: decision.action,\n attributes: {\n decision: decision.reason ?? 'continue',\n repeatedActionStreak,\n },\n }))\n : undefined\n let actionOutcome: ControlActionOutcome<TActionResult>\n try {\n const result = await config.act(decision.action, ctx)\n const rawCostUsd = config.getActionCostUsd?.({\n action: decision.action,\n result,\n state,\n evals,\n history,\n })\n const costUsd = normalizeActionCostUsd(rawCostUsd, runtimeErrors, stepIndex)\n if (costUsd !== undefined && Number.isFinite(costUsd) && costUsd > 0) {\n spentCostUsd += costUsd\n await recordCostBudget(emitter, budget, spentCostUsd, stepHandle, runtimeErrors, stepIndex)\n }\n actionOutcome = {\n ok: true,\n result,\n ...(costUsd !== undefined ? { costUsd } : {}),\n durationMs: Date.now() - actionStarted,\n }\n } catch (err) {\n runtimeErrors.push(runtimeError('act', stepIndex, err))\n actionOutcome = {\n ok: false,\n error: runtimeErrors[runtimeErrors.length - 1].message,\n durationMs: Date.now() - actionStarted,\n }\n if (actionFailure === 'stop') {\n await runTrace(runtimeErrors, stepIndex, () => stepHandle?.fail(actionOutcome.error ?? 'action failed'))\n const step: ControlStep<TState, TAction, TActionResult, TEval> = {\n index: stepIndex,\n decision,\n beforeState,\n afterState: state,\n evalsBefore,\n evalsAfter: evals,\n actionOutcome,\n startedAt: new Date(actionStarted).toISOString(),\n endedAt: new Date().toISOString(),\n }\n history.push(step)\n await runOnStep(config.onStep, step, runtimeErrors)\n return finish(emitter, {\n intent: config.intent,\n pass: false,\n completed: false,\n reason: actionOutcome.error ?? 'action failed',\n score: averageScore(evals),\n steps: history,\n finalState: state,\n finalEvals: evals,\n wallMs: Date.now() - started,\n spentCostUsd,\n runId: emitter?.runId ?? null,\n failureClass: 'unknown',\n runtimeErrors,\n stoppedBy: 'runtime-error',\n })\n }\n }\n\n try {\n state = await config.observe({ history, abortSignal: controller.signal })\n } catch (err) {\n runtimeErrors.push(runtimeError('observe', stepIndex, err))\n const step: ControlStep<TState, TAction, TActionResult, TEval> = {\n index: stepIndex,\n decision,\n beforeState,\n afterState: beforeState,\n evalsBefore,\n evalsAfter: evals,\n actionOutcome,\n startedAt: new Date(actionStarted).toISOString(),\n endedAt: new Date().toISOString(),\n }\n history.push(step)\n await runTrace(runtimeErrors, stepIndex, () => stepHandle?.fail(runtimeErrors[runtimeErrors.length - 1].message))\n await runOnStep(config.onStep, step, runtimeErrors)\n return finish(emitter, {\n intent: config.intent,\n pass: false,\n completed: false,\n reason: runtimeErrors[runtimeErrors.length - 1].message,\n score: averageScore(evals),\n steps: history,\n finalState: beforeState,\n finalEvals: evals,\n wallMs: Date.now() - started,\n spentCostUsd,\n runId: emitter?.runId ?? null,\n failureClass: 'unknown',\n runtimeErrors,\n stoppedBy: 'runtime-error',\n })\n }\n try {\n evals = await config.validate({ intent: config.intent, state, history, abortSignal: controller.signal })\n await recordEvalSpans(emitter, evals, `step-${stepIndex}`, runtimeErrors, stepIndex, stepHandle?.span.spanId)\n } catch (err) {\n runtimeErrors.push(runtimeError('validate', stepIndex, err))\n const step: ControlStep<TState, TAction, TActionResult, TEval> = {\n index: stepIndex,\n decision,\n beforeState,\n afterState: state,\n evalsBefore,\n evalsAfter: evals,\n actionOutcome,\n startedAt: new Date(actionStarted).toISOString(),\n endedAt: new Date().toISOString(),\n }\n history.push(step)\n await runTrace(runtimeErrors, stepIndex, () => stepHandle?.fail(runtimeErrors[runtimeErrors.length - 1].message))\n await runOnStep(config.onStep, step, runtimeErrors)\n return finish(emitter, {\n intent: config.intent,\n pass: false,\n completed: false,\n reason: runtimeErrors[runtimeErrors.length - 1].message,\n score: averageScore(evals),\n steps: history,\n finalState: state,\n finalEvals: evals,\n wallMs: Date.now() - started,\n spentCostUsd,\n runId: emitter?.runId ?? null,\n failureClass: 'unknown',\n runtimeErrors,\n stoppedBy: 'runtime-error',\n })\n }\n const scoreAfter = averageScore(evals)\n const stateFingerprint = fingerprintState(state, config.stopPolicies)\n const noProgressStop = noProgressStopDecision({\n policies: config.stopPolicies,\n lastStateFingerprint,\n stateFingerprint,\n scoreBefore,\n scoreAfter,\n currentStreak: noProgressStreak,\n })\n noProgressStreak = noProgressStop.streak\n lastStateFingerprint = stateFingerprint\n\n const step: ControlStep<TState, TAction, TActionResult, TEval> = {\n index: stepIndex,\n decision,\n beforeState,\n afterState: state,\n evalsBefore,\n evalsAfter: evals,\n actionOutcome,\n startedAt: new Date(actionStarted).toISOString(),\n endedAt: new Date().toISOString(),\n }\n history.push(step)\n if (actionOutcome.ok) {\n await runTrace(runtimeErrors, stepIndex, () => stepHandle?.end({\n attributes: {\n actionCostUsd: actionOutcome.costUsd ?? null,\n spentCostUsd,\n scoreBefore: scoreBefore ?? null,\n scoreAfter: scoreAfter ?? null,\n noProgressStreak,\n },\n }))\n } else {\n await runTrace(runtimeErrors, stepIndex, () => stepHandle?.fail(actionOutcome.error ?? 'action failed', {\n attributes: {\n spentCostUsd,\n noProgressStreak,\n },\n }))\n }\n await runOnStep(config.onStep, step, runtimeErrors)\n\n if (noProgressStop.stop) {\n return finish(emitter, {\n intent: config.intent,\n pass: false,\n completed: true,\n reason: noProgressStop.reason,\n score: scoreAfter,\n steps: history,\n finalState: state,\n finalEvals: evals,\n wallMs: Date.now() - started,\n spentCostUsd,\n runId: emitter?.runId ?? null,\n failureClass: 'tool_recovery_failure',\n runtimeErrors,\n stoppedBy: 'stop-policy',\n })\n }\n\n const postStepBudgetStop = budgetStopDecision(budget, spentCostUsd)\n if (postStepBudgetStop.stop) {\n return finish(emitter, {\n intent: config.intent,\n pass: false,\n completed: false,\n reason: postStepBudgetStop.reason,\n score: scoreAfter,\n steps: history,\n finalState: state,\n finalEvals: evals,\n wallMs: Date.now() - started,\n spentCostUsd,\n runId: emitter?.runId ?? null,\n failureClass: 'budget_exceeded',\n runtimeErrors,\n stoppedBy: 'budget',\n })\n }\n\n const postStepCtx = makeContext(config.intent, state, evals, history, budget, stepIndex + 1, started, spentCostUsd, controller.signal, emitter)\n let postStepStop: StopDecision\n try {\n postStepStop = config.shouldStop ? await config.shouldStop(postStepCtx) : defaultStopDecision(evals)\n } catch (err) {\n runtimeErrors.push(runtimeError('stop-policy', stepIndex + 1, err))\n return finish(emitter, {\n intent: config.intent,\n pass: false,\n completed: false,\n reason: runtimeErrors[runtimeErrors.length - 1].message,\n score: averageScore(evals),\n steps: history,\n finalState: state,\n finalEvals: evals,\n wallMs: Date.now() - started,\n spentCostUsd,\n runId: emitter?.runId ?? null,\n failureClass: 'unknown',\n runtimeErrors,\n stoppedBy: 'runtime-error',\n })\n }\n if (postStepStop.stop) {\n return finish(emitter, {\n intent: config.intent,\n pass: postStepStop.pass,\n completed: true,\n reason: postStepStop.reason,\n score: postStepStop.score,\n steps: history,\n finalState: state,\n finalEvals: evals,\n wallMs: Date.now() - started,\n spentCostUsd,\n runId: emitter?.runId ?? null,\n failureClass: postStepStop.failureClass,\n runtimeErrors,\n stoppedBy: 'stop-policy',\n })\n }\n }\n\n return finish(emitter, {\n intent: config.intent,\n pass: false,\n completed: false,\n reason: `budget exhausted: maxSteps=${budget.maxSteps}`,\n steps: history,\n finalState: state,\n finalEvals: evals,\n wallMs: Date.now() - started,\n spentCostUsd,\n runId: emitter?.runId ?? null,\n failureClass: 'budget_exceeded',\n runtimeErrors,\n stoppedBy: 'budget',\n })\n } catch (err) {\n runtimeErrors.push(runtimeError('act', history.length, err))\n return finish(emitter, {\n intent: config.intent,\n pass: false,\n completed: false,\n reason: runtimeErrors[runtimeErrors.length - 1].message,\n steps: history,\n finalState: undefined,\n finalEvals: [],\n wallMs: Date.now() - started,\n spentCostUsd,\n runId: emitter?.runId ?? null,\n failureClass: 'unknown',\n runtimeErrors,\n stoppedBy: 'runtime-error',\n })\n } finally {\n if (wallTimer) clearTimeout(wallTimer)\n if (config.signal) config.signal.removeEventListener('abort', upstreamAbort)\n }\n}\n\nexport function stopOnNoProgress<TState, TAction>(maxNoProgressSteps: number, options: Omit<ControlStopPolicies<TState, TAction>, 'maxNoProgressSteps'> = {}): ControlStopPolicies<TState, TAction> {\n return { ...options, maxNoProgressSteps }\n}\n\nexport function stopOnRepeatedAction<TState, TAction>(maxRepeatedActions: number, options: Omit<ControlStopPolicies<TState, TAction>, 'maxRepeatedActions'> = {}): ControlStopPolicies<TState, TAction> {\n return { ...options, maxRepeatedActions }\n}\n\nexport function objectiveEval(input: Omit<ControlEvalResult, 'objective'>): ControlEvalResult {\n return { ...input, objective: true }\n}\n\nexport function subjectiveEval(input: Omit<ControlEvalResult, 'objective'>): ControlEvalResult {\n return { ...input, objective: false }\n}\n\nfunction normalizeBudget(input: Partial<ControlBudget> | undefined): ControlBudget {\n const raw = { ...DEFAULT_BUDGET, ...input } as Record<string, unknown>\n if (!Number.isInteger(raw.maxSteps) || (raw.maxSteps as number) < 1) {\n throw new RangeError(`ControlRuntime budget.maxSteps must be an integer >= 1, got ${String(raw.maxSteps)}`)\n }\n const budget: ControlBudget = { maxSteps: raw.maxSteps as number }\n if (raw.maxWallMs !== undefined) {\n if (typeof raw.maxWallMs !== 'number' || !Number.isFinite(raw.maxWallMs) || raw.maxWallMs <= 0) {\n throw new RangeError(`ControlRuntime budget.maxWallMs must be a positive finite number, got ${String(raw.maxWallMs)}`)\n }\n budget.maxWallMs = raw.maxWallMs\n }\n if (raw.maxCostUsd !== undefined) {\n if (typeof raw.maxCostUsd !== 'number' || !Number.isFinite(raw.maxCostUsd) || raw.maxCostUsd < 0) {\n throw new RangeError(`ControlRuntime budget.maxCostUsd must be a nonnegative finite number, got ${String(raw.maxCostUsd)}`)\n }\n budget.maxCostUsd = raw.maxCostUsd\n }\n return budget\n}\n\nfunction normalizeActionCostUsd(\n costUsd: number | undefined,\n runtimeErrors: ControlRuntimeError[],\n stepIndex: number,\n): number | undefined {\n if (costUsd === undefined) return undefined\n if (!Number.isFinite(costUsd) || costUsd < 0) {\n runtimeErrors.push(runtimeError('act', stepIndex, new Error(`invalid action costUsd: ${String(costUsd)}`)))\n return undefined\n }\n return costUsd\n}\n\nexport function allCriticalPassed(evals: ControlEvalResult[]): boolean {\n return evals.every((result) => result.passed || (result.severity !== 'critical' && result.severity !== 'error'))\n}\n\nfunction makeContext<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n intent: string,\n state: TState,\n evals: TEval[],\n history: ControlStep<TState, TAction, TActionResult, TEval>[],\n budget: ControlBudget,\n stepIndex: number,\n started: number,\n spentCostUsd: number,\n abortSignal: AbortSignal,\n emitter?: TraceEmitter,\n): ControlContext<TState, TAction, TActionResult, TEval> {\n return {\n intent,\n state,\n evals,\n history,\n budget,\n stepIndex,\n wallMs: Date.now() - started,\n spentCostUsd,\n remainingCostUsd: budget.maxCostUsd === undefined ? undefined : Math.max(0, budget.maxCostUsd - spentCostUsd),\n abortSignal,\n emitter,\n }\n}\n\nfunction defaultStopDecision(evals: ControlEvalResult[]): StopDecision {\n if (!evals.length) return { stop: false, pass: false, reason: 'no evals yet' }\n const pass = allCriticalPassed(evals)\n return pass\n ? { stop: true, pass: true, reason: 'all critical evals passed', score: averageScore(evals) }\n : { stop: false, pass: false, reason: 'critical evals still failing', score: averageScore(evals) }\n}\n\nfunction averageScore(evals: ControlEvalResult[]): number | undefined {\n const scored = evals.map((result) => result.score).filter((score): score is number => typeof score === 'number')\n if (!scored.length) return undefined\n return Math.round((scored.reduce((sum, score) => sum + score, 0) / scored.length) * 1000) / 1000\n}\n\nfunction budgetStopDecision(budget: ControlBudget, spentCostUsd: number): { stop: boolean; reason: string } {\n if (budget.maxCostUsd !== undefined && spentCostUsd >= budget.maxCostUsd) {\n return {\n stop: true,\n reason: `budget exhausted: maxCostUsd=${budget.maxCostUsd}`,\n }\n }\n return { stop: false, reason: '' }\n}\n\nasync function recordCostBudget(\n emitter: TraceEmitter | undefined,\n budget: ControlBudget,\n spentCostUsd: number,\n handle: SpanHandle | undefined,\n runtimeErrors: ControlRuntimeError[],\n stepIndex: number,\n): Promise<void> {\n if (!emitter || budget.maxCostUsd === undefined) return\n const maxCostUsd = budget.maxCostUsd\n await runTrace(runtimeErrors, stepIndex, () => emitter.recordBudget({\n dimension: 'usd',\n limit: maxCostUsd,\n consumed: spentCostUsd,\n remaining: Math.max(0, maxCostUsd - spentCostUsd),\n breached: spentCostUsd >= maxCostUsd,\n spanId: handle?.span.spanId,\n }))\n}\n\nasync function recordEvalSpans(\n emitter: TraceEmitter | undefined,\n evals: ControlEvalResult[],\n phase: string,\n runtimeErrors: ControlRuntimeError[],\n stepIndex: number,\n targetSpanId?: string,\n): Promise<void> {\n if (!emitter) return\n for (const result of evals) {\n await runTrace(runtimeErrors, stepIndex, () => emitter.recordJudge({\n judgeId: result.objective ? 'objective-validator' : 'subjective-judge',\n targetSpanId: targetSpanId ?? emitter.runId,\n name: `control-eval/${result.id}`,\n dimension: result.id,\n score: typeof result.score === 'number' ? result.score : result.passed ? 1 : 0,\n rationale: result.detail,\n evidence: result.evidence,\n attributes: {\n phase,\n passed: result.passed,\n severity: result.severity,\n objective: result.objective,\n },\n }))\n }\n}\n\nasync function runOnStep<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n onStep: ControlRuntimeConfig<TState, TAction, TActionResult, TEval>['onStep'] | undefined,\n step: ControlStep<TState, TAction, TActionResult, TEval>,\n runtimeErrors: ControlRuntimeError[],\n): Promise<void> {\n if (!onStep) return\n try {\n await onStep(step)\n } catch (err) {\n runtimeErrors.push(runtimeError('on-step', step.index, err))\n }\n}\n\nasync function runTrace<T>(\n runtimeErrors: ControlRuntimeError[],\n stepIndex: number,\n write: () => Promise<T | undefined> | T | undefined,\n): Promise<T | undefined> {\n try {\n return await write()\n } catch (err) {\n runtimeErrors.push(runtimeError('trace', stepIndex, err))\n return undefined\n }\n}\n\nfunction noProgressStopDecision<TState, TAction>(args: {\n policies: ControlStopPolicies<TState, TAction> | undefined\n lastStateFingerprint: string | undefined\n stateFingerprint: string\n scoreBefore: number | undefined\n scoreAfter: number | undefined\n currentStreak: number\n}): { stop: boolean; reason: string; streak: number } {\n const max = args.policies?.maxNoProgressSteps\n if (!max || max <= 0) return { stop: false, reason: '', streak: 0 }\n const minScoreDelta = args.policies?.minScoreDelta ?? 0.001\n const scoreDelta = Math.abs((args.scoreAfter ?? 0) - (args.scoreBefore ?? 0))\n const stateUnchanged = args.lastStateFingerprint !== undefined\n && args.lastStateFingerprint === args.stateFingerprint\n const scoreFlat = scoreDelta < minScoreDelta\n const streak = stateUnchanged && scoreFlat ? args.currentStreak + 1 : 0\n return streak >= max\n ? { stop: true, reason: `stuck: no state/score progress for ${streak} step(s)`, streak }\n : { stop: false, reason: '', streak }\n}\n\nfunction repeatedActionStopDecision<TState, TAction>(\n policies: ControlStopPolicies<TState, TAction> | undefined,\n streak: number,\n): { stop: boolean; reason: string } {\n const max = policies?.maxRepeatedActions\n if (!max || max <= 0 || streak < max) return { stop: false, reason: '' }\n return {\n stop: true,\n reason: `stuck: repeated same action for ${streak} step(s)`,\n }\n}\n\nfunction fingerprintState<TState, TAction>(\n state: TState,\n policies?: ControlStopPolicies<TState, TAction>,\n): string {\n if (policies?.stateFingerprint) return policies.stateFingerprint(state)\n return stableFingerprint(state)\n}\n\nfunction fingerprintAction<TState, TAction>(\n action: TAction,\n policies?: ControlStopPolicies<TState, TAction>,\n): string {\n if (policies?.actionFingerprint) return policies.actionFingerprint(action)\n return stableFingerprint(action)\n}\n\nfunction stableFingerprint(value: unknown): string {\n if (typeof value === 'string') return value\n if (typeof value === 'number' || typeof value === 'boolean' || value == null) return String(value)\n try {\n return JSON.stringify(sortForFingerprint(value))\n } catch {\n return String(value)\n }\n}\n\nfunction sortForFingerprint(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortForFingerprint)\n if (!value || typeof value !== 'object') return value\n const record = value as Record<string, unknown>\n const sorted: Record<string, unknown> = {}\n for (const key of Object.keys(record).sort()) {\n sorted[key] = sortForFingerprint(record[key])\n }\n return sorted\n}\n\nfunction abortReason(signal: AbortSignal): string {\n const reason = signal.reason\n if (reason instanceof Error) return reason.message\n return reason ? String(reason) : 'aborted'\n}\n\nfunction runtimeError(phase: ControlRuntimeError['phase'], stepIndex: number, err: unknown): ControlRuntimeError {\n const message = err instanceof Error ? err.message : String(err)\n return { phase, stepIndex, message }\n}\n\nasync function finish<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n emitter: TraceEmitter | undefined,\n result: ControlRunResult<TState, TAction, TActionResult, TEval>,\n): Promise<ControlRunResult<TState, TAction, TActionResult, TEval>> {\n await runTrace(result.runtimeErrors, result.steps.length, () => emitter?.endRun({\n pass: result.pass,\n score: result.score ?? averageScore(result.finalEvals),\n failureClass: result.failureClass,\n notes: result.reason,\n }))\n return result\n}\n","import type {\n ControlEvalResult,\n ControlRunResult,\n} from './control-runtime'\nimport {\n validateRunRecord,\n type RunRecord,\n type RunSplitTag,\n type RunTokenUsage,\n} from './run-record'\nimport type { FailureClass } from './trace/schema'\n\nexport interface RunEvidenceMetadata {\n experimentId: string\n candidateId: string\n seed: number\n model: string\n promptHash: string\n configHash: string\n commitSha: string\n splitTag: RunSplitTag\n tokenUsage: RunTokenUsage\n queueMs?: number\n judgeMetadata?: RunRecord['judgeMetadata']\n raw?: Record<string, number>\n}\n\nexport interface ControlRunToRunRecordOptions extends RunEvidenceMetadata {\n runId?: string\n score?: number\n failureMode?: string\n}\n\n/**\n * Project a completed control-loop run into the strict RunRecord shape used by\n * release gates, optimizer tables, and research reports.\n *\n * The control loop owns live execution evidence. The caller still supplies the\n * experimental cell metadata because prompt/config hashes, split assignment,\n * model snapshot, and commit SHA are product/harness concerns.\n */\nexport function controlRunToRunRecord<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult>(\n run: ControlRunResult<TState, TAction, TActionResult, TEval>,\n options: ControlRunToRunRecordOptions,\n): RunRecord {\n const score = clampScore(options.score ?? run.score ?? scoreFromEvals(run.finalEvals) ?? (run.pass ? 1 : 0))\n const outcome = options.splitTag === 'holdout'\n ? { holdoutScore: score, raw: normalizeRawMetrics(options.raw, run, score) }\n : { searchScore: score, raw: normalizeRawMetrics(options.raw, run, score) }\n\n return validateRunRecord({\n runId: options.runId ?? run.runId ?? `control:${options.experimentId}:${options.candidateId}:${options.seed}:${options.splitTag}`,\n experimentId: options.experimentId,\n candidateId: options.candidateId,\n seed: options.seed,\n model: options.model,\n promptHash: options.promptHash,\n configHash: options.configHash,\n commitSha: options.commitSha,\n wallMs: run.wallMs,\n ...(options.queueMs !== undefined ? { queueMs: options.queueMs } : {}),\n costUsd: run.spentCostUsd,\n tokenUsage: options.tokenUsage,\n ...(options.judgeMetadata ? { judgeMetadata: options.judgeMetadata } : {}),\n outcome,\n failureMode: options.failureMode ?? failureModeFromRun(run),\n splitTag: options.splitTag,\n })\n}\n\nexport function scoreFromEvals(evals: readonly ControlEvalResult[]): number | undefined {\n const scores = evals\n .map((e) => e.score)\n .filter((score): score is number => typeof score === 'number' && Number.isFinite(score))\n if (scores.length === 0) return undefined\n return clampScore(scores.reduce((sum, score) => sum + score, 0) / scores.length)\n}\n\nfunction normalizeRawMetrics<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n raw: Record<string, number> | undefined,\n run: ControlRunResult<TState, TAction, TActionResult, TEval>,\n score: number,\n): Record<string, number> {\n return {\n ...finiteOnly(raw ?? {}),\n score,\n pass: run.pass ? 1 : 0,\n completed: run.completed ? 1 : 0,\n steps: run.steps.length,\n runtimeErrors: run.runtimeErrors.length,\n }\n}\n\nfunction finiteOnly(values: Record<string, number>): Record<string, number> {\n const out: Record<string, number> = {}\n for (const [key, value] of Object.entries(values)) {\n if (Number.isFinite(value)) out[key] = value\n }\n return out\n}\n\nfunction failureModeFromRun<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n run: ControlRunResult<TState, TAction, TActionResult, TEval>,\n): FailureClass | undefined {\n if (run.pass) return undefined\n return run.failureClass ?? 'unknown'\n}\n\nfunction clampScore(value: number): number {\n if (!Number.isFinite(value)) return 0\n return Math.max(0, Math.min(1, value))\n}\n","import type { FeedbackLabel, ProposedSideEffect } from './feedback-trajectory'\n\nexport interface ActionExecutionPolicy {\n allowedTypes?: string[]\n blockedTypes?: string[]\n alwaysRequireApprovalTypes?: string[]\n autoApproveTypes?: string[]\n requireApprovalForExternalSideEffects?: boolean\n requireApprovalAboveCostUsd?: number\n maxActionCostUsd?: number\n remainingBudgetUsd?: number\n expectedOutcomeRequired?: boolean\n killCriteriaRequired?: boolean\n}\n\nexport interface ActionPolicyDecision {\n allowed: boolean\n blocked: boolean\n requiresApproval: boolean\n reasons: string[]\n label?: FeedbackLabel\n}\n\nexport function evaluateActionPolicy(\n action: ProposedSideEffect,\n policy: ActionExecutionPolicy = {},\n options: { createdAt?: string } = {},\n): ActionPolicyDecision {\n const reasons: string[] = []\n let blocked = false\n let requiresApproval = Boolean(action.requiresApproval)\n\n if (policy.allowedTypes?.length && !policy.allowedTypes.includes(action.type)) {\n blocked = true\n reasons.push(`action type \"${action.type}\" is not allowed`)\n }\n if (policy.blockedTypes?.includes(action.type)) {\n blocked = true\n reasons.push(`action type \"${action.type}\" is blocked`)\n }\n if (policy.alwaysRequireApprovalTypes?.includes(action.type)) {\n requiresApproval = true\n reasons.push(`action type \"${action.type}\" requires approval`)\n }\n if (policy.requireApprovalForExternalSideEffects && action.externalSideEffect) {\n requiresApproval = true\n reasons.push('external side effect requires approval')\n }\n if (policy.requireApprovalAboveCostUsd !== undefined && (action.costUsd ?? 0) > policy.requireApprovalAboveCostUsd) {\n requiresApproval = true\n reasons.push(`cost ${action.costUsd} exceeds approval threshold ${policy.requireApprovalAboveCostUsd}`)\n }\n if (policy.maxActionCostUsd !== undefined && (action.costUsd ?? 0) > policy.maxActionCostUsd) {\n blocked = true\n reasons.push(`cost ${action.costUsd} exceeds max action cost ${policy.maxActionCostUsd}`)\n }\n if (policy.remainingBudgetUsd !== undefined && (action.costUsd ?? 0) > policy.remainingBudgetUsd) {\n blocked = true\n reasons.push(`cost ${action.costUsd} exceeds remaining budget ${policy.remainingBudgetUsd}`)\n }\n if (policy.expectedOutcomeRequired && !action.metadata?.expectedOutcome) {\n blocked = true\n reasons.push('expected outcome is required')\n }\n if (policy.killCriteriaRequired && !action.metadata?.killCriteria) {\n blocked = true\n reasons.push('kill criteria are required')\n }\n if (policy.autoApproveTypes?.includes(action.type) && requiresApproval) {\n reasons.push(`action type \"${action.type}\" is auto-approved only when no approval policy applies`)\n }\n\n if (!reasons.length) reasons.push(requiresApproval ? 'approval required' : 'action allowed')\n\n const label = blocked || requiresApproval\n ? {\n source: 'policy' as const,\n kind: blocked ? 'policy_block' as const : 'comment' as const,\n value: { actionType: action.type, blocked, requiresApproval },\n reason: reasons.join('; '),\n severity: blocked ? 'critical' as const : 'warning' as const,\n createdAt: options.createdAt ?? new Date().toISOString(),\n metadata: { action, policy },\n }\n : undefined\n\n return {\n allowed: !blocked,\n blocked,\n requiresApproval: !blocked && requiresApproval,\n reasons,\n label,\n }\n}\n","/**\n * Propose / Verify / Review — the core multi-shot primitive.\n *\n * shot N: propose(state, priorReview) → new state\n * verify(state) → pass/fail, optional layers\n * review(state, verification, memory) → observations + next-shot\n * instruction + shouldContinue\n * memory.append(entry)\n *\n * Roles are strictly separated:\n *\n * - The WORKER is whatever the caller wraps in `propose`. It is\n * stateful — caller owns its resume/session mechanism.\n * - The VERIFIER grades the state. It produces the ground truth.\n * The reviewer cannot overturn or downgrade a verification layer.\n * - The REVIEWER is stateless per call. Its continuity is the\n * `ReviewMemoryStore` — durable JSONL by default, or any store\n * implementing the interface. It reads memory + trace summary +\n * verification and directs the NEXT proposer shot.\n *\n * This shape is load-bearing. The reviewer never grades; the verifier\n * never directs. Two processes, two prompts, two concerns — which is\n * what keeps the loop from confirmation-biasing itself into \"all\n * passed\" when it didn't.\n *\n * Short-circuits and soft-fails are both first-class:\n * - verify.pass === true → reviewer LLM call is skipped, memory\n * records a success entry, loop exits.\n * - review throws → the shot still counts; the loop uses the\n * last-known instruction (or `fallbackInstruction`) for the next\n * propose call. A transient reviewer failure must NEVER abort a\n * valid arc.\n *\n * Composable: `propose` itself can be another `runProposeReview` call.\n * That's the dogfooding path — a harness built on this primitive is in\n * turn evaluable by it.\n */\n\nimport { appendFileSync, existsSync, mkdirSync, readFileSync } from 'fs'\nimport { dirname } from 'path'\n\nimport type { FailureClass } from './trace/schema'\nimport type { TraceStore } from './trace/store'\nimport { TraceEmitter, type SpanHandle } from './trace/emitter'\n\n// ── Types ────────────────────────────────────────────────────────────\n\nexport interface Verification {\n pass: boolean\n score?: number\n failingLayers?: string[]\n details?: unknown\n}\n\nexport interface Review {\n observations: string\n diagnosis: string\n nextShotInstruction: string\n shouldContinue: boolean\n confidence: number\n}\n\nexport interface ReviewMemoryEntry extends Review {\n shot: number\n timestamp: number\n verification: {\n pass: boolean\n score?: number\n failingLayers?: string[]\n }\n}\n\nexport interface ProposeInput<State> {\n shot: number\n goal: string\n state: State\n priorReview: Review | null\n abortSignal: AbortSignal\n emitter?: TraceEmitter\n}\n\nexport interface ProposeOutput<State, Summary = unknown> {\n state: State\n traceSummary?: Summary\n}\n\nexport interface ReviewInput<State, Summary = unknown> {\n shot: number\n goal: string\n state: State\n verification: Verification\n traceSummary: Summary | undefined\n memory: ReviewMemoryEntry[]\n}\n\nexport type ProposeFn<State, Summary = unknown> =\n (input: ProposeInput<State>) => Promise<ProposeOutput<State, Summary>>\n\nexport type VerifyFn<State> = (state: State) => Promise<Verification>\n\nexport type ReviewFn<State, Summary = unknown> =\n (input: ReviewInput<State, Summary>) => Promise<Review>\n\nexport interface ReviewMemoryStore {\n load(): Promise<ReviewMemoryEntry[]>\n append(entry: ReviewMemoryEntry): Promise<void>\n}\n\nexport interface ProposeReviewConfig<State, Summary = unknown> {\n goal: string\n initialState: State\n propose: ProposeFn<State, Summary>\n verify: VerifyFn<State>\n review: ReviewFn<State, Summary>\n /** Hard shot cap. Default 10. */\n maxShots?: number\n /** Wall-clock cap in ms. Default 10 min. */\n maxWallMs?: number\n /**\n * If the reviewer returns confidence ≤ floor on `confidenceFloorWindow`\n * consecutive shots, terminate early. Default floor 0.3, window 2.\n * Set window to 0 or floor to <0 to disable.\n */\n confidenceFloor?: number\n confidenceFloorWindow?: number\n /** Defaults to an in-memory store if omitted. */\n memory?: ReviewMemoryStore\n /** If provided, emit a Run + per-shot spans. */\n store?: TraceStore\n scenarioId?: string\n projectId?: string\n variantId?: string\n /**\n * Used when the reviewer soft-fails on shot 1 (no prior instruction to\n * fall back to). Default is a generic \"inspect failures and fix\".\n */\n fallbackInstruction?: string\n}\n\nexport interface ProposeReviewShot<State, Summary = unknown> {\n shot: number\n state: State\n verification: Verification\n traceSummary: Summary | undefined\n review: Review\n reviewAvailable: boolean\n reviewError?: string\n durationMs: number\n}\n\nexport interface ProposeReviewReport<State, Summary = unknown> {\n runId: string | null\n completed: boolean\n shots: ProposeReviewShot<State, Summary>[]\n finalState: State\n finalVerification: Verification\n failureClass?: FailureClass\n wallMs: number\n score: number\n}\n\n// ── Memory stores ────────────────────────────────────────────────────\n\nexport function inMemoryReviewStore(initial: ReviewMemoryEntry[] = []): ReviewMemoryStore {\n const entries: ReviewMemoryEntry[] = [...initial]\n return {\n async load() {\n return [...entries]\n },\n async append(entry) {\n entries.push(entry)\n },\n }\n}\n\nexport function jsonlReviewStore(path: string): ReviewMemoryStore {\n return {\n async load() {\n if (!existsSync(path)) return []\n const raw = readFileSync(path, 'utf8')\n const out: ReviewMemoryEntry[] = []\n for (const line of raw.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed) continue\n try {\n out.push(JSON.parse(trimmed) as ReviewMemoryEntry)\n } catch {\n // A corrupt line is an observability problem, not a correctness\n // one — skip it rather than aborting the loop.\n }\n }\n return out\n },\n async append(entry) {\n mkdirSync(dirname(path), { recursive: true })\n appendFileSync(path, JSON.stringify(entry) + '\\n')\n },\n }\n}\n\n// ── Core loop ────────────────────────────────────────────────────────\n\nconst DEFAULT_FALLBACK_INSTRUCTION =\n 'Inspect the verification failures above. Fix the critical issues first, then the major ones. Do not restate the failures — act on them.'\n\nexport async function runProposeReview<State, Summary = unknown>(\n config: ProposeReviewConfig<State, Summary>,\n): Promise<ProposeReviewReport<State, Summary>> {\n const maxShots = config.maxShots ?? 10\n const maxWallMs = config.maxWallMs ?? 10 * 60 * 1000\n const confidenceFloor = config.confidenceFloor ?? 0.3\n const confidenceFloorWindow = config.confidenceFloorWindow ?? 2\n const memory = config.memory ?? inMemoryReviewStore()\n const fallbackInstruction = config.fallbackInstruction ?? DEFAULT_FALLBACK_INSTRUCTION\n\n const emitter = config.store\n ? new TraceEmitter(config.store)\n : null\n if (emitter) {\n await emitter.startRun({\n scenarioId: config.scenarioId ?? 'propose-review',\n projectId: config.projectId,\n variantId: config.variantId,\n layer: 'meta',\n tags: {\n goal: config.goal.slice(0, 120),\n maxShots: String(maxShots),\n },\n })\n }\n\n const abort = new AbortController()\n const wallStart = Date.now()\n const wallTimer = setTimeout(() => abort.abort(new Error('propose-review wall timeout')), maxWallMs)\n\n const shots: ProposeReviewShot<State, Summary>[] = []\n let state = config.initialState\n let priorReview: Review | null = null\n let lastVerification: Verification = { pass: false }\n let failureClass: FailureClass | undefined\n let completed = false\n let lowConfidenceStreak = 0\n\n try {\n for (let shot = 1; shot <= maxShots; shot++) {\n if (abort.signal.aborted) {\n failureClass = 'timeout'\n break\n }\n\n const shotStart = Date.now()\n const shotHandle = emitter\n ? await emitter.span({ kind: 'tool', name: `shot-${shot}` })\n : null\n\n // 1. Propose.\n let proposeOut: ProposeOutput<State, Summary>\n try {\n proposeOut = await config.propose({\n shot,\n goal: config.goal,\n state,\n priorReview,\n abortSignal: abort.signal,\n emitter: emitter ?? undefined,\n })\n } catch (err) {\n await shotHandle?.fail(err instanceof Error ? err : String(err))\n failureClass = 'unknown'\n throw err\n }\n state = proposeOut.state\n const traceSummary = proposeOut.traceSummary\n\n // 2. Verify.\n let verification: Verification\n try {\n verification = await config.verify(state)\n } catch (err) {\n await shotHandle?.fail(err instanceof Error ? err : String(err))\n failureClass = 'unknown'\n throw err\n }\n lastVerification = verification\n\n // 3. Review — short-circuit on pass; soft-fail on throw.\n const memorySnapshot = await memory.load()\n const verificationDigest = {\n pass: verification.pass,\n score: verification.score,\n failingLayers: verification.failingLayers ?? [],\n }\n\n let review: Review\n let reviewAvailable = true\n let reviewError: string | undefined\n\n if (verification.pass) {\n review = {\n observations: 'verification passed — skipping reviewer LLM call',\n diagnosis: 'no failures to diagnose',\n nextShotInstruction: '(done)',\n shouldContinue: false,\n confidence: 1,\n }\n } else {\n try {\n review = await config.review({\n shot,\n goal: config.goal,\n state,\n verification,\n traceSummary,\n memory: memorySnapshot,\n })\n review = coerceReview(review)\n } catch (err) {\n reviewAvailable = false\n reviewError = err instanceof Error ? err.message : String(err)\n const lastInstruction = memorySnapshot.length > 0\n ? memorySnapshot[memorySnapshot.length - 1]!.nextShotInstruction\n : fallbackInstruction\n review = {\n observations: '(reviewer unavailable — using last-known instruction)',\n diagnosis: reviewError,\n nextShotInstruction: lastInstruction,\n shouldContinue: true,\n confidence: 0.3,\n }\n }\n }\n\n const entry: ReviewMemoryEntry = {\n shot,\n timestamp: Date.now(),\n ...review,\n verification: verificationDigest,\n }\n await memory.append(entry)\n\n const shotRecord: ProposeReviewShot<State, Summary> = {\n shot,\n state,\n verification,\n traceSummary,\n review,\n reviewAvailable,\n reviewError,\n durationMs: Date.now() - shotStart,\n }\n shots.push(shotRecord)\n\n await shotHandle?.end({\n attributes: {\n verificationPass: verification.pass,\n verificationScore: verification.score ?? null,\n reviewShouldContinue: review.shouldContinue,\n reviewConfidence: review.confidence,\n reviewAvailable,\n },\n } as Partial<SpanHandle['span']>)\n\n // 4. Exit rules.\n if (verification.pass) {\n completed = true\n break\n }\n if (!review.shouldContinue) {\n break\n }\n if (confidenceFloorWindow > 0 && review.confidence <= confidenceFloor) {\n lowConfidenceStreak += 1\n if (lowConfidenceStreak >= confidenceFloorWindow) break\n } else {\n lowConfidenceStreak = 0\n }\n\n priorReview = review\n }\n\n if (!completed && !failureClass) {\n failureClass = shots.length >= maxShots ? 'budget_exceeded' : 'unknown'\n }\n } finally {\n clearTimeout(wallTimer)\n }\n\n const score = lastVerification.pass\n ? 1\n : typeof lastVerification.score === 'number'\n ? lastVerification.score\n : 0\n\n if (emitter) {\n await emitter.endRun({\n pass: completed,\n score,\n failureClass,\n notes: `${shots.length} shot(s); final pass=${lastVerification.pass}`,\n })\n }\n\n return {\n runId: emitter?.runId ?? null,\n completed,\n shots,\n finalState: state,\n finalVerification: lastVerification,\n failureClass,\n wallMs: Date.now() - wallStart,\n score,\n }\n}\n\n// ── Reviewer helper (LLM-backed) ─────────────────────────────────────\n\nexport interface LlmJsonCall {\n (req: { system: string; user: string }): Promise<unknown>\n}\n\nexport interface LlmReviewerConfig<State, Summary = unknown> {\n callJson: LlmJsonCall\n renderState?: (state: State) => string\n renderTraceSummary?: (summary: Summary | undefined) => string\n /** Appended to the default system prompt. */\n systemPromptAddendum?: string\n}\n\nconst REVIEWER_SYSTEM_PROMPT = `You are a senior reviewer directing a multi-shot build loop.\nYou do NOT grade — the verifier already did. Your job is to direct the worker's next shot.\nYou are blind to the worker's inner monologue. You see what it DID, not what it thought.\nReturn STRICT JSON matching the schema. No prose outside the JSON.`\n\nexport function createLlmReviewer<State, Summary = unknown>(\n cfg: LlmReviewerConfig<State, Summary>,\n): ReviewFn<State, Summary> {\n const renderState = cfg.renderState ?? ((s: State) => safeJson(s))\n const renderTraceSummary = cfg.renderTraceSummary ?? ((s: Summary | undefined) =>\n s === undefined ? '(none)' : safeJson(s))\n const system = cfg.systemPromptAddendum\n ? `${REVIEWER_SYSTEM_PROMPT}\\n\\n${cfg.systemPromptAddendum}`\n : REVIEWER_SYSTEM_PROMPT\n\n return async (input) => {\n const memoryBlock = input.memory.length === 0\n ? '(no prior shots — this is shot 1)'\n : input.memory\n .map((m) => [\n `shot ${m.shot} — verification.pass=${m.verification.pass}` +\n (typeof m.verification.score === 'number'\n ? ` score=${m.verification.score.toFixed(2)}`\n : '') +\n ` confidence=${m.confidence.toFixed(2)} failing=[${(m.verification.failingLayers ?? []).join(',')}]`,\n ` observations: ${m.observations.slice(0, 400)}`,\n ` diagnosis: ${m.diagnosis.slice(0, 400)}`,\n ` instruction given: ${m.nextShotInstruction.slice(0, 400)}`,\n ].join('\\n'))\n .join('\\n\\n')\n\n const user = [\n `=== GOAL ===`,\n input.goal,\n ``,\n `=== SHOT NUMBER ===`,\n String(input.shot),\n ``,\n `=== CURRENT STATE ===`,\n renderState(input.state),\n ``,\n `=== TRACE SUMMARY ===`,\n renderTraceSummary(input.traceSummary),\n ``,\n `=== VERIFICATION ===`,\n summarizeVerification(input.verification),\n ``,\n `=== REVIEWER MEMORY (prior shots) ===`,\n memoryBlock,\n ``,\n `=== YOUR TASK ===`,\n `Return STRICT JSON:`,\n `{`,\n ` \"observations\": string (20..2000 chars, first-person worker behavior — quote counts, errors, loops)`,\n ` \"diagnosis\": string (20..1500 chars, root cause, NOT a restatement of verification)`,\n ` \"nextShotInstruction\": string (40..3000 chars, concrete directive to the worker)`,\n ` \"shouldContinue\": boolean (false if verification.pass, or if thrashing, or unachievable)`,\n ` \"confidence\": number in [0,1]`,\n `}`,\n ].join('\\n')\n\n const raw = await cfg.callJson({ system, user })\n return coerceReview(raw as Partial<Review>)\n }\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\nfunction coerceReview(raw: Partial<Review> | null | undefined): Review {\n if (!raw || typeof raw !== 'object') {\n throw new Error('reviewer returned non-object')\n }\n const observations = typeof raw.observations === 'string' ? raw.observations : ''\n const diagnosis = typeof raw.diagnosis === 'string' ? raw.diagnosis : ''\n const nextShotInstruction = typeof raw.nextShotInstruction === 'string' ? raw.nextShotInstruction : ''\n if (!observations || !diagnosis || !nextShotInstruction) {\n throw new Error('reviewer missing required string fields')\n }\n if (typeof raw.shouldContinue !== 'boolean') {\n throw new Error('reviewer missing shouldContinue boolean')\n }\n const confidenceRaw = Number(raw.confidence)\n if (!Number.isFinite(confidenceRaw)) {\n throw new Error('reviewer confidence not finite')\n }\n return {\n observations,\n diagnosis,\n nextShotInstruction,\n shouldContinue: raw.shouldContinue,\n confidence: Math.max(0, Math.min(1, confidenceRaw)),\n }\n}\n\nfunction summarizeVerification(v: Verification): string {\n const header = `pass=${v.pass}` +\n (typeof v.score === 'number' ? ` score=${v.score.toFixed(3)}` : '') +\n (v.failingLayers && v.failingLayers.length > 0\n ? ` failing=[${v.failingLayers.join(', ')}]`\n : '')\n const details = v.details === undefined ? '' : `\\n${safeJson(v.details).slice(0, 1500)}`\n return header + details\n}\n\nfunction safeJson(x: unknown): string {\n try {\n return JSON.stringify(x, null, 2)\n } catch {\n return String(x)\n }\n}\n","import {\n objectiveEval,\n runAgentControlLoop,\n type ControlRunResult,\n type ControlRuntimeConfig,\n} from './control-runtime'\nimport {\n inMemoryReviewStore,\n type ProposeFn,\n type ProposeOutput,\n type Review,\n type ReviewFn,\n type ReviewMemoryEntry,\n type ReviewMemoryStore,\n type Verification,\n type VerifyFn,\n} from './propose-review'\nimport type { FailureClass } from './trace/schema'\nimport type { TraceStore } from './trace/store'\n\nexport interface ProposeReviewControlState<State, Summary = unknown> {\n shot: number\n state: State\n priorReview: Review | null\n verification: Verification\n traceSummary?: Summary\n memory: ReviewMemoryEntry[]\n completed: boolean\n reviewAvailable: boolean\n reviewError?: string\n}\n\nexport interface ProposeReviewControlAction {\n type: 'propose-review-shot'\n shot: number\n}\n\nexport interface ProposeReviewControlResult<State, Summary = unknown> {\n state: State\n verification: Verification\n traceSummary?: Summary\n review: Review | null\n reviewAvailable: boolean\n reviewError?: string\n}\n\nexport interface ProposeReviewControlConfig<State, Summary = unknown> {\n goal: string\n initialState: State\n propose: ProposeFn<State, Summary>\n verify: VerifyFn<State>\n review: ReviewFn<State, Summary>\n maxShots?: number\n maxWallMs?: number\n memory?: ReviewMemoryStore\n store?: TraceStore\n scenarioId?: string\n projectId?: string\n variantId?: string\n fallbackInstruction?: string\n confidenceFloor?: number\n confidenceFloorWindow?: number\n failureClassFromVerification?: (verification: Verification) => FailureClass | undefined\n actionFailure?: ControlRuntimeConfig<\n ProposeReviewControlState<State, Summary>,\n ProposeReviewControlAction,\n ProposeReviewControlResult<State, Summary>\n >['actionFailure']\n}\n\nconst DEFAULT_FALLBACK_INSTRUCTION =\n 'Inspect the verification failures above. Fix the critical issues first, then the major ones. Do not restate the failures — act on them.'\n\nexport async function runProposeReviewAsControlLoop<State, Summary = unknown>(\n config: ProposeReviewControlConfig<State, Summary>,\n): Promise<ControlRunResult<\n ProposeReviewControlState<State, Summary>,\n ProposeReviewControlAction,\n ProposeReviewControlResult<State, Summary>\n>> {\n const maxShots = config.maxShots ?? 10\n const confidenceFloor = config.confidenceFloor ?? 0.3\n const confidenceFloorWindow = config.confidenceFloorWindow ?? 2\n const memory = config.memory ?? inMemoryReviewStore()\n const fallbackInstruction = config.fallbackInstruction ?? DEFAULT_FALLBACK_INSTRUCTION\n const failureClassFromVerification = config.failureClassFromVerification ?? controlFailureClassFromVerification\n let lowConfidenceStreak = 0\n\n let current: ProposeReviewControlState<State, Summary> = {\n shot: 0,\n state: config.initialState,\n priorReview: null,\n verification: { pass: false },\n memory: await memory.load(),\n completed: false,\n reviewAvailable: false,\n }\n\n return runAgentControlLoop({\n intent: config.goal,\n budget: { maxSteps: maxShots, maxWallMs: config.maxWallMs },\n store: config.store,\n scenarioId: config.scenarioId ?? 'propose-review-control',\n projectId: config.projectId,\n variantId: config.variantId,\n actionFailure: config.actionFailure ?? 'stop',\n observe: () => current,\n validate: ({ state }) => [\n objectiveEval({\n id: 'verification',\n passed: state.verification.pass,\n score: state.verification.score,\n severity: 'critical',\n detail: state.verification.pass\n ? 'verification passed'\n : `verification failed${state.verification.failingLayers?.length ? `: ${state.verification.failingLayers.join(', ')}` : ''}`,\n }),\n ],\n shouldStop: ({ state }) => {\n if (state.verification.pass) {\n return { stop: true, pass: true, reason: 'verification passed', score: state.verification.score }\n }\n if (state.completed) {\n return {\n stop: true,\n pass: false,\n reason: 'reviewer stopped continuation',\n score: state.verification.score,\n failureClass: failureClassFromVerification(state.verification),\n }\n }\n return { stop: false, pass: false, reason: 'verification still failing', score: state.verification.score }\n },\n decide: ({ state }) => ({\n type: 'continue',\n action: { type: 'propose-review-shot', shot: state.shot + 1 },\n reason: state.priorReview?.nextShotInstruction ?? fallbackInstruction,\n }),\n act: async (action, ctx) => {\n const shot = action.shot\n const proposeOut: ProposeOutput<State, Summary> = await config.propose({\n shot,\n goal: config.goal,\n state: current.state,\n priorReview: current.priorReview,\n abortSignal: ctx.abortSignal,\n emitter: ctx.emitter,\n })\n\n const nextState = proposeOut.state\n const verification = await config.verify(nextState)\n let review: Review | null = null\n let reviewAvailable = false\n let reviewError: string | undefined\n let shouldContinue = !verification.pass\n\n if (!verification.pass) {\n try {\n review = await config.review({\n shot,\n goal: config.goal,\n state: nextState,\n verification,\n traceSummary: proposeOut.traceSummary,\n memory: await memory.load(),\n })\n reviewAvailable = true\n shouldContinue = review.shouldContinue\n lowConfidenceStreak = review.confidence <= confidenceFloor ? lowConfidenceStreak + 1 : 0\n if (confidenceFloorWindow > 0 && lowConfidenceStreak >= confidenceFloorWindow) shouldContinue = false\n } catch (err) {\n reviewError = err instanceof Error ? err.message : String(err)\n review = current.priorReview ?? {\n observations: 'Reviewer unavailable.',\n diagnosis: reviewError,\n nextShotInstruction: fallbackInstruction,\n shouldContinue: true,\n confidence: 0,\n }\n shouldContinue = true\n }\n } else {\n review = {\n observations: 'Verification passed.',\n diagnosis: 'No further revision needed.',\n nextShotInstruction: '',\n shouldContinue: false,\n confidence: 1,\n }\n }\n\n const entry: ReviewMemoryEntry = {\n ...(review ?? {\n observations: 'No review.',\n diagnosis: '',\n nextShotInstruction: fallbackInstruction,\n shouldContinue,\n confidence: 0,\n }),\n shot,\n timestamp: Date.now(),\n verification: {\n pass: verification.pass,\n score: verification.score,\n failingLayers: verification.failingLayers,\n },\n }\n await memory.append(entry)\n\n current = {\n shot,\n state: nextState,\n priorReview: review,\n verification,\n traceSummary: proposeOut.traceSummary,\n memory: await memory.load(),\n completed: verification.pass || !shouldContinue,\n reviewAvailable,\n reviewError,\n }\n\n return {\n state: nextState,\n verification,\n traceSummary: proposeOut.traceSummary,\n review,\n reviewAvailable,\n reviewError,\n }\n },\n })\n}\n\nexport function controlFailureClassFromVerification(verification: Verification): FailureClass | undefined {\n if (verification.pass) return undefined\n return verification.failingLayers?.length ? 'instruction_following' : 'unknown'\n}\n"],"mappings":"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","names":["step","DEFAULT_FALLBACK_INSTRUCTION"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/feedback-trajectory.ts","../src/pareto.ts","../src/held-out-gate.ts","../src/researcher.ts","../src/prompt-evolution.ts","../src/multi-shot-optimization.ts","../src/reflective-mutation.ts"],"sourcesContent":["import type { DatasetScenario, DatasetSplit } from './dataset'\nimport type { ControlEvalResult, ControlRunResult, ControlStep } from './control-runtime'\n\nexport type FeedbackArtifactType =\n | 'text'\n | 'code'\n | 'plan'\n | 'research'\n | 'action'\n | 'ui'\n | 'decision'\n | 'data'\n | 'other'\n\nexport type FeedbackLabelSource = 'user' | 'judge' | 'environment' | 'metric' | 'policy' | 'system'\n\nexport type FeedbackLabelKind =\n | 'approve'\n | 'reject'\n | 'select'\n | 'edit'\n | 'rank'\n | 'rate'\n | 'comment'\n | 'metric_outcome'\n | 'policy_block'\n | 'revision_request'\n\nexport type FeedbackSeverity = 'info' | 'warning' | 'error' | 'critical'\n\nexport interface FeedbackTask {\n intent: string\n context?: unknown\n}\n\nexport interface ProposedSideEffect {\n type: string\n risk?: 'low' | 'medium' | 'high'\n costUsd?: number\n externalSideEffect?: boolean\n requiresApproval?: boolean\n metadata?: Record<string, unknown>\n}\n\nexport interface FeedbackLabel {\n id?: string\n source: FeedbackLabelSource\n kind: FeedbackLabelKind\n value: unknown\n reason?: string\n severity?: FeedbackSeverity\n createdAt: string\n metadata?: Record<string, unknown>\n}\n\nexport interface FeedbackAttempt {\n id: string\n stepIndex: number\n artifactType: FeedbackArtifactType\n artifact: unknown\n options?: unknown[]\n proposedAction?: ProposedSideEffect\n evals?: ControlEvalResult[]\n feedback?: FeedbackLabel[]\n createdAt: string\n metadata?: Record<string, unknown>\n}\n\nexport interface FeedbackOutcome {\n success?: boolean\n score?: number\n metrics?: Record<string, number>\n costUsd?: number\n detail?: string\n observedAt?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface FeedbackTrajectory {\n id: string\n projectId?: string\n scenarioId?: string\n task: FeedbackTask\n attempts: FeedbackAttempt[]\n labels: FeedbackLabel[]\n outcome?: FeedbackOutcome\n split?: DatasetSplit\n tags?: Record<string, string>\n createdAt: string\n updatedAt?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface FeedbackTrajectoryStore {\n save(trajectory: FeedbackTrajectory): Promise<void>\n get(id: string): Promise<FeedbackTrajectory | null>\n list(filter?: FeedbackTrajectoryFilter): Promise<FeedbackTrajectory[]>\n appendAttempt(id: string, attempt: FeedbackAttempt): Promise<FeedbackTrajectory>\n appendLabel(id: string, label: FeedbackLabel, attemptId?: string): Promise<FeedbackTrajectory>\n}\n\nexport interface FeedbackTrajectoryFilter {\n projectId?: string\n scenarioId?: string\n split?: DatasetSplit\n tag?: [string, string]\n}\n\nexport interface FeedbackSplitPolicy {\n trainPct?: number\n devPct?: number\n testPct?: number\n holdoutPct?: number\n}\n\nexport interface PreferenceMemoryEntry {\n instruction: string\n rationale: string\n weight: number\n sourceTrajectoryId: string\n sourceLabelId?: string\n category?: string\n}\n\nexport interface FeedbackOptimizerRow {\n scenarioId: string\n trajectoryId: string\n labelKinds: FeedbackLabelKind[]\n score?: number\n metadata?: Record<string, unknown>\n}\n\nexport interface FeedbackReplayResult {\n trajectoryId: string\n pass: boolean\n score?: number\n labels: FeedbackLabel[]\n outcome?: FeedbackOutcome\n metadata?: Record<string, unknown>\n}\n\nexport interface FeedbackReplayAdapter {\n replay(trajectory: FeedbackTrajectory): Promise<Omit<FeedbackReplayResult, 'trajectoryId'>> | Omit<FeedbackReplayResult, 'trajectoryId'>\n}\n\nconst DEFAULT_SPLIT_POLICY: Required<FeedbackSplitPolicy> = {\n trainPct: 70,\n devPct: 15,\n testPct: 10,\n holdoutPct: 5,\n}\n\nexport class InMemoryFeedbackTrajectoryStore implements FeedbackTrajectoryStore {\n private readonly trajectories = new Map<string, FeedbackTrajectory>()\n\n async save(trajectory: FeedbackTrajectory): Promise<void> {\n this.trajectories.set(trajectory.id, cloneTrajectory(trajectory))\n }\n\n async get(id: string): Promise<FeedbackTrajectory | null> {\n const trajectory = this.trajectories.get(id)\n return trajectory ? cloneTrajectory(trajectory) : null\n }\n\n async list(filter: FeedbackTrajectoryFilter = {}): Promise<FeedbackTrajectory[]> {\n return [...this.trajectories.values()]\n .filter((trajectory) => matchesFilter(trajectory, filter))\n .map(cloneTrajectory)\n }\n\n async appendAttempt(id: string, attempt: FeedbackAttempt): Promise<FeedbackTrajectory> {\n const trajectory = this.trajectories.get(id)\n if (!trajectory) throw new Error(`FeedbackTrajectoryStore.appendAttempt: unknown trajectory \"${id}\"`)\n const next = cloneTrajectory({\n ...trajectory,\n attempts: [...trajectory.attempts, attempt],\n updatedAt: attempt.createdAt,\n })\n this.trajectories.set(id, next)\n return cloneTrajectory(next)\n }\n\n async appendLabel(id: string, label: FeedbackLabel, attemptId?: string): Promise<FeedbackTrajectory> {\n const trajectory = this.trajectories.get(id)\n if (!trajectory) throw new Error(`FeedbackTrajectoryStore.appendLabel: unknown trajectory \"${id}\"`)\n const attempts = attemptId\n ? trajectory.attempts.map((attempt) => attempt.id === attemptId\n ? { ...attempt, feedback: [...(attempt.feedback ?? []), label] }\n : attempt)\n : trajectory.attempts\n const next = cloneTrajectory({\n ...trajectory,\n attempts,\n labels: attemptId ? trajectory.labels : [...trajectory.labels, label],\n updatedAt: label.createdAt,\n })\n this.trajectories.set(id, next)\n return cloneTrajectory(next)\n }\n}\n\nexport class FileSystemFeedbackTrajectoryStore implements FeedbackTrajectoryStore {\n private readonly dir: string\n private readonly memory = new InMemoryFeedbackTrajectoryStore()\n private loaded = false\n\n constructor(options: { dir: string }) {\n this.dir = options.dir\n }\n\n async save(trajectory: FeedbackTrajectory): Promise<void> {\n await this.load()\n await this.memory.save(trajectory)\n await this.append({ op: 'save', trajectory })\n }\n\n async get(id: string): Promise<FeedbackTrajectory | null> {\n await this.load()\n return this.memory.get(id)\n }\n\n async list(filter: FeedbackTrajectoryFilter = {}): Promise<FeedbackTrajectory[]> {\n await this.load()\n return this.memory.list(filter)\n }\n\n async appendAttempt(id: string, attempt: FeedbackAttempt): Promise<FeedbackTrajectory> {\n await this.load()\n const next = await this.memory.appendAttempt(id, attempt)\n await this.append({ op: 'appendAttempt', id, attempt })\n return next\n }\n\n async appendLabel(id: string, label: FeedbackLabel, attemptId?: string): Promise<FeedbackTrajectory> {\n await this.load()\n const next = await this.memory.appendLabel(id, label, attemptId)\n await this.append({ op: 'appendLabel', id, label, attemptId })\n return next\n }\n\n private async append(record: unknown): Promise<void> {\n const { appendFile, mkdir } = await import('node:fs/promises')\n const { join } = await import('node:path')\n await mkdir(this.dir, { recursive: true })\n await appendFile(join(this.dir, 'feedback-trajectories.ndjson'), JSON.stringify(record) + '\\n', 'utf8')\n }\n\n private async load(): Promise<void> {\n if (this.loaded) return\n const { readFile } = await import('node:fs/promises')\n const { join } = await import('node:path')\n const file = join(this.dir, 'feedback-trajectories.ndjson')\n try {\n const raw = await readFile(file, 'utf8')\n for (const line of raw.split('\\n')) {\n if (!line.trim()) continue\n try {\n const record = JSON.parse(line) as\n | { op: 'save'; trajectory: FeedbackTrajectory }\n | { op: 'appendAttempt'; id: string; attempt: FeedbackAttempt }\n | { op: 'appendLabel'; id: string; label: FeedbackLabel; attemptId?: string }\n if (record.op === 'save') await this.memory.save(record.trajectory)\n if (record.op === 'appendAttempt') await this.memory.appendAttempt(record.id, record.attempt)\n if (record.op === 'appendLabel') await this.memory.appendLabel(record.id, record.label, record.attemptId)\n } catch {\n /* corrupt records are skipped so one bad line does not discard the corpus */\n }\n }\n } catch {\n /* first run */\n }\n this.loaded = true\n }\n}\n\nexport function createFeedbackTrajectory(input: {\n id?: string\n projectId?: string\n scenarioId?: string\n task: FeedbackTask\n attempts?: FeedbackAttempt[]\n labels?: FeedbackLabel[]\n outcome?: FeedbackOutcome\n split?: DatasetSplit\n tags?: Record<string, string>\n createdAt?: string\n metadata?: Record<string, unknown>\n}): FeedbackTrajectory {\n const createdAt = input.createdAt ?? new Date().toISOString()\n const id = input.id ?? `ft_${stableHash(`${input.projectId ?? ''}|${input.scenarioId ?? ''}|${input.task.intent}|${createdAt}`).toString(16)}`\n return {\n id,\n projectId: input.projectId,\n scenarioId: input.scenarioId,\n task: input.task,\n attempts: input.attempts ?? [],\n labels: input.labels ?? [],\n outcome: input.outcome,\n split: input.split,\n tags: input.tags,\n createdAt,\n metadata: input.metadata,\n }\n}\n\nexport function assignFeedbackSplit(\n trajectory: Pick<FeedbackTrajectory, 'id' | 'projectId' | 'scenarioId' | 'task'>,\n policy: FeedbackSplitPolicy = {},\n): DatasetSplit {\n const split = { ...DEFAULT_SPLIT_POLICY, ...policy }\n const total = split.trainPct + split.devPct + split.testPct + split.holdoutPct\n if (total <= 0) throw new Error('assignFeedbackSplit: split percentages must sum above zero')\n const bucket = stableHash(`${trajectory.projectId ?? ''}|${trajectory.scenarioId ?? ''}|${trajectory.id}|${trajectory.task.intent}`) % total\n if (bucket < split.trainPct) return 'train'\n if (bucket < split.trainPct + split.devPct) return 'dev'\n if (bucket < split.trainPct + split.devPct + split.testPct) return 'test'\n return 'holdout'\n}\n\nexport function withAssignedFeedbackSplit(\n trajectory: FeedbackTrajectory,\n policy?: FeedbackSplitPolicy,\n): FeedbackTrajectory {\n return {\n ...trajectory,\n split: trajectory.split ?? assignFeedbackSplit(trajectory, policy),\n }\n}\n\nexport function feedbackTrajectoryToDatasetScenario(trajectory: FeedbackTrajectory): DatasetScenario {\n const withSplit = withAssignedFeedbackSplit(trajectory)\n return {\n id: withSplit.scenarioId ?? withSplit.id,\n split: withSplit.split,\n payload: withSplit,\n tags: {\n ...(withSplit.projectId ? { projectId: withSplit.projectId } : {}),\n ...(withSplit.tags ?? {}),\n source: 'feedback-trajectory',\n },\n }\n}\n\nexport function feedbackTrajectoriesToDatasetScenarios(\n trajectories: FeedbackTrajectory[],\n): DatasetScenario[] {\n return trajectories.map(feedbackTrajectoryToDatasetScenario)\n}\n\nexport function feedbackTrajectoryToOptimizerRow(trajectory: FeedbackTrajectory): FeedbackOptimizerRow {\n const labels = allLabels(trajectory)\n return {\n scenarioId: trajectory.scenarioId ?? trajectory.id,\n trajectoryId: trajectory.id,\n labelKinds: [...new Set(labels.map((label) => label.kind))],\n score: trajectory.outcome?.score ?? scoreFromLabels(labels),\n metadata: {\n projectId: trajectory.projectId,\n split: trajectory.split,\n intent: trajectory.task.intent,\n attempts: trajectory.attempts.length,\n outcome: trajectory.outcome,\n labels,\n },\n }\n}\n\nexport function feedbackTrajectoriesToOptimizerRows(\n trajectories: FeedbackTrajectory[],\n): FeedbackOptimizerRow[] {\n return trajectories.map(feedbackTrajectoryToOptimizerRow)\n}\n\nexport async function replayFeedbackTrajectory(\n trajectory: FeedbackTrajectory,\n adapter: FeedbackReplayAdapter,\n): Promise<FeedbackReplayResult> {\n try {\n const result = await adapter.replay(trajectory)\n return {\n trajectoryId: trajectory.id,\n ...result,\n }\n } catch (err) {\n const createdAt = new Date().toISOString()\n const message = err instanceof Error ? err.message : String(err)\n return {\n trajectoryId: trajectory.id,\n pass: false,\n labels: [{\n source: 'system',\n kind: 'reject',\n value: false,\n reason: message,\n severity: 'error',\n createdAt,\n }],\n outcome: {\n success: false,\n score: 0,\n detail: message,\n observedAt: createdAt,\n },\n metadata: { replayError: true },\n }\n }\n}\n\nexport async function replayFeedbackTrajectories(\n trajectories: FeedbackTrajectory[],\n adapter: FeedbackReplayAdapter,\n): Promise<FeedbackReplayResult[]> {\n const results: FeedbackReplayResult[] = []\n for (const trajectory of trajectories) {\n results.push(await replayFeedbackTrajectory(trajectory, adapter))\n }\n return results\n}\n\nexport function summarizePreferenceMemory(\n trajectories: FeedbackTrajectory[],\n options: { maxEntries?: number } = {},\n): PreferenceMemoryEntry[] {\n const maxEntries = options.maxEntries ?? 20\n const entries: PreferenceMemoryEntry[] = []\n for (const trajectory of trajectories) {\n for (const label of allLabels(trajectory)) {\n const instruction = instructionFromLabel(trajectory, label)\n if (!instruction) continue\n entries.push({\n instruction,\n rationale: label.reason ?? `${label.kind} label from ${label.source}`,\n weight: weightForLabel(label),\n sourceTrajectoryId: trajectory.id,\n sourceLabelId: label.id,\n category: label.kind,\n })\n }\n }\n\n const byInstruction = new Map<string, PreferenceMemoryEntry>()\n for (const entry of entries) {\n const key = entry.instruction.toLowerCase().replace(/\\s+/g, ' ').trim()\n const existing = byInstruction.get(key)\n if (!existing || entry.weight > existing.weight) byInstruction.set(key, entry)\n }\n return [...byInstruction.values()]\n .sort((a, b) => b.weight - a.weight)\n .slice(0, maxEntries)\n}\n\nexport function renderPreferenceMemoryMarkdown(entries: PreferenceMemoryEntry[]): string {\n const lines = ['# Preference Memory', '']\n for (const entry of entries) {\n lines.push(`- ${entry.instruction}`)\n lines.push(` Rationale: ${entry.rationale}`)\n lines.push(` Source: ${entry.sourceTrajectoryId}`)\n lines.push('')\n }\n return lines.join('\\n').trim() + '\\n'\n}\n\nexport function serializeFeedbackTrajectoriesJsonl(trajectories: FeedbackTrajectory[]): string {\n return trajectories\n .slice()\n .sort((a, b) => a.id.localeCompare(b.id))\n .map((trajectory) => JSON.stringify(canonicalize(trajectory)))\n .join('\\n') + '\\n'\n}\n\nexport function parseFeedbackTrajectoriesJsonl(jsonl: string): FeedbackTrajectory[] {\n const trajectories: FeedbackTrajectory[] = []\n for (const line of jsonl.split('\\n')) {\n if (!line.trim()) continue\n trajectories.push(JSON.parse(line) as FeedbackTrajectory)\n }\n return trajectories\n}\n\nexport function controlRunToFeedbackTrajectory<TState, TAction, TActionResult>(\n run: ControlRunResult<TState, TAction, TActionResult>,\n options: {\n projectId?: string\n scenarioId?: string\n artifactType?: FeedbackArtifactType\n artifactFromStep?: (step: ControlStep<TState, TAction, TActionResult>) => unknown\n proposedActionFromStep?: (step: ControlStep<TState, TAction, TActionResult>) => ProposedSideEffect | undefined\n createdAt?: string\n } = {},\n): FeedbackTrajectory {\n const createdAt = options.createdAt ?? new Date().toISOString()\n const trajectoryId = run.runId ?? `ft_control_${stableHash(`${run.intent}|${createdAt}`).toString(16)}`\n return createFeedbackTrajectory({\n id: trajectoryId,\n projectId: options.projectId,\n scenarioId: options.scenarioId,\n task: { intent: run.intent },\n createdAt,\n attempts: run.steps.map((step) => ({\n id: `${trajectoryId}_step_${step.index}`,\n stepIndex: step.index,\n artifactType: options.artifactType ?? 'action',\n artifact: options.artifactFromStep?.(step) ?? step.actionOutcome?.result ?? step.decision,\n proposedAction: options.proposedActionFromStep?.(step),\n evals: step.evalsAfter,\n createdAt: step.startedAt,\n metadata: {\n decision: step.decision,\n actionOutcome: step.actionOutcome,\n },\n })),\n labels: [\n {\n source: 'system',\n kind: run.pass ? 'approve' : 'reject',\n value: run.pass,\n reason: run.reason,\n severity: run.pass ? 'info' : 'error',\n createdAt,\n },\n ],\n outcome: {\n success: run.pass,\n score: run.score,\n costUsd: run.spentCostUsd,\n detail: run.reason,\n observedAt: createdAt,\n metadata: {\n stoppedBy: run.stoppedBy,\n failureClass: run.failureClass,\n },\n },\n })\n}\n\nfunction allLabels(trajectory: FeedbackTrajectory): FeedbackLabel[] {\n const labels = [\n ...trajectory.labels,\n ...trajectory.attempts.flatMap((attempt) => attempt.feedback ?? []),\n ]\n const seen = new Set<string>()\n return labels.filter((label) => {\n const key = label.id ?? `${label.source}|${label.kind}|${label.createdAt}|${JSON.stringify(label.value)}`\n if (seen.has(key)) return false\n seen.add(key)\n return true\n })\n}\n\nfunction scoreFromLabels(labels: FeedbackLabel[]): number | undefined {\n if (!labels.length) return undefined\n const scored = labels.map((label) => {\n if (label.kind === 'approve' || label.kind === 'select') return 1\n if (label.kind === 'reject' || label.kind === 'policy_block') return 0\n if (label.kind === 'rate' && typeof label.value === 'number') return Math.max(0, Math.min(1, label.value))\n return undefined\n }).filter((value): value is number => typeof value === 'number')\n if (!scored.length) return undefined\n return Math.round((scored.reduce((sum, value) => sum + value, 0) / scored.length) * 1000) / 1000\n}\n\nfunction instructionFromLabel(trajectory: FeedbackTrajectory, label: FeedbackLabel): string | undefined {\n if (label.kind === 'reject' && label.reason) return `Avoid outputs like \"${compact(trajectory.task.intent, 80)}\" when: ${label.reason}`\n if (label.kind === 'revision_request' && label.reason) return `Revise similar work by applying: ${label.reason}`\n if (label.kind === 'select' && label.reason) return `Prefer selected options for \"${compact(trajectory.task.intent, 80)}\" because: ${label.reason}`\n if (label.kind === 'approve' && label.reason) return `Repeat the pattern approved for \"${compact(trajectory.task.intent, 80)}\": ${label.reason}`\n if (label.kind === 'comment' && label.reason) return label.reason\n return undefined\n}\n\nfunction weightForLabel(label: FeedbackLabel): number {\n const severity = label.severity === 'critical' ? 4 : label.severity === 'error' ? 3 : label.severity === 'warning' ? 2 : 1\n const source = label.source === 'user' ? 3 : label.source === 'metric' || label.source === 'environment' ? 2 : 1\n return severity * source\n}\n\nfunction matchesFilter(trajectory: FeedbackTrajectory, filter: FeedbackTrajectoryFilter): boolean {\n if (filter.projectId && trajectory.projectId !== filter.projectId) return false\n if (filter.scenarioId && trajectory.scenarioId !== filter.scenarioId) return false\n if (filter.split && trajectory.split !== filter.split) return false\n if (filter.tag) {\n const [key, value] = filter.tag\n if (trajectory.tags?.[key] !== value) return false\n }\n return true\n}\n\nfunction cloneTrajectory(trajectory: FeedbackTrajectory): FeedbackTrajectory {\n return JSON.parse(JSON.stringify(trajectory)) as FeedbackTrajectory\n}\n\nfunction compact(value: string, max: number): string {\n const normalized = value.replace(/\\s+/g, ' ').trim()\n return normalized.length > max ? `${normalized.slice(0, max).trim()}...` : normalized\n}\n\nfunction stableHash(input: string): number {\n let hash = 2166136261\n for (let i = 0; i < input.length; i += 1) {\n hash ^= input.charCodeAt(i)\n hash = Math.imul(hash, 16777619)\n }\n return hash >>> 0\n}\n\nfunction canonicalize(value: unknown): unknown {\n if (value === null || typeof value !== 'object') return value\n if (Array.isArray(value)) return value.map(canonicalize)\n const out: Record<string, unknown> = {}\n for (const key of Object.keys(value as Record<string, unknown>).sort()) {\n out[key] = canonicalize((value as Record<string, unknown>)[key])\n }\n return out\n}\n","/**\n * Pareto frontier — multi-objective optimization over candidate runs.\n *\n * Lifted from ADC pareto.ts and blueprint-agent frontier.ts. When you're\n * trading off (cost, latency, quality) or (passRate, tokenBudget,\n * ttfb), you rarely have a single \"winner\" — you have a set of\n * non-dominated candidates. This module exposes:\n *\n * - `paretoFrontier`: filter a set of candidates to the non-dominated ones\n * - `dominates`: does A dominate B across all objectives?\n *\n * Each objective is declared with a direction: 'maximize' (higher=better)\n * or 'minimize' (lower=better). Candidates are any object; pass an\n * `objective(candidate)` accessor.\n */\n\nexport type Direction = 'maximize' | 'minimize'\n\nexport interface Objective<T> {\n /** Stable label used in reports. */\n name: string\n direction: Direction\n value: (candidate: T) => number\n}\n\nexport interface ParetoResult<T> {\n frontier: T[]\n dominated: T[]\n /** Index map: frontier[i] dominates each of dominatedBy[i]. */\n dominanceMap: Array<{ dominator: T; dominated: T[] }>\n}\n\n/** Does candidate A weakly dominate B — strictly better on at least one objective and no worse on any? */\nexport function dominates<T>(a: T, b: T, objectives: Objective<T>[]): boolean {\n let strictlyBetter = false\n for (const obj of objectives) {\n const av = obj.value(a)\n const bv = obj.value(b)\n if (!Number.isFinite(av) || !Number.isFinite(bv)) return false\n const aIsBetter = obj.direction === 'maximize' ? av > bv : av < bv\n const aIsWorse = obj.direction === 'maximize' ? av < bv : av > bv\n if (aIsWorse) return false\n if (aIsBetter) strictlyBetter = true\n }\n return strictlyBetter\n}\n\n/**\n * Compute the non-dominated frontier. Candidates with NaN/Infinity on any\n * objective are excluded (can't rank them). A candidate enters the frontier\n * iff no other candidate dominates it.\n */\nexport function paretoFrontier<T>(candidates: T[], objectives: Objective<T>[]): ParetoResult<T> {\n if (objectives.length === 0) {\n throw new Error('paretoFrontier: at least 1 objective required')\n }\n const valid = candidates.filter((c) =>\n objectives.every((o) => Number.isFinite(o.value(c))),\n )\n const frontier: T[] = []\n const dominated: T[] = []\n for (const c of valid) {\n const isDominated = valid.some((other) => other !== c && dominates(other, c, objectives))\n if (isDominated) dominated.push(c)\n else frontier.push(c)\n }\n const dominanceMap = frontier.map((d) => ({\n dominator: d,\n dominated: dominated.filter((x) => dominates(d, x, objectives)),\n }))\n return { frontier, dominated, dominanceMap }\n}\n\n/**\n * Weighted-sum scalarisation. Use as a tie-break / single-winner selector\n * when callers don't want to consume a frontier. Each objective contributes\n * its normalised value (0..1 via min-max across the candidate pool) times\n * its weight; missing weights default to 1/N.\n *\n * Direction is honoured automatically — `minimize` axes have their values\n * inverted before scaling so \"higher scalar = better\" always holds.\n */\nexport function scalarScore<T>(\n candidates: T[],\n objectives: Objective<T>[],\n options: { weights?: Partial<Record<string, number>> } = {},\n): Array<{ candidate: T; score: number }> {\n if (candidates.length === 0) return []\n const weights = options.weights ?? {}\n const totalWeight = objectives.reduce((s, o) => s + (weights[o.name] ?? 1), 0)\n\n // Pre-compute min/max per objective for normalisation.\n const ranges = objectives.map((obj) => {\n const values = candidates.map((c) => obj.value(c)).filter((v) => Number.isFinite(v))\n if (values.length === 0) return { min: 0, max: 1 }\n const min = Math.min(...values)\n const max = Math.max(...values)\n return { min, max: max === min ? min + 1 : max }\n })\n\n return candidates.map((c) => {\n let score = 0\n objectives.forEach((obj, i) => {\n const v = obj.value(c)\n if (!Number.isFinite(v)) return\n const { min, max } = ranges[i]!\n const normalised = (v - min) / (max - min)\n const directional = obj.direction === 'maximize' ? normalised : 1 - normalised\n const weight = (weights[obj.name] ?? 1) / totalWeight\n score += directional * weight\n })\n return { candidate: c, score }\n })\n}\n\n/**\n * NSGA-II crowding distance — secondary sort for ties on the frontier.\n *\n * When the Pareto front collapses to a single point (or many candidates tie\n * on dominance), naive selection picks arbitrarily and the population\n * degenerates over generations. NSGA-II preserves diversity by preferring\n * candidates with more empty space around them on the frontier.\n *\n * Returns an array of `{ candidate, distance }` in the SAME order as the\n * input. Higher distance = more isolated = should be preferred when\n * preserving diversity.\n */\nexport function crowdingDistance<T>(\n candidates: T[],\n objectives: Objective<T>[],\n): Array<{ candidate: T; distance: number }> {\n const distances = new Map<T, number>(candidates.map((c) => [c, 0]))\n\n for (const obj of objectives) {\n const sorted = [...candidates].sort((a, b) => obj.value(a) - obj.value(b))\n const min = obj.value(sorted[0]!)\n const max = obj.value(sorted[sorted.length - 1]!)\n const range = max - min || 1\n\n // Boundary points get infinity (always preferred for diversity).\n distances.set(sorted[0]!, Infinity)\n distances.set(sorted[sorted.length - 1]!, Infinity)\n for (let i = 1; i < sorted.length - 1; i++) {\n const prev = obj.value(sorted[i - 1]!)\n const next = obj.value(sorted[i + 1]!)\n const current = distances.get(sorted[i]!)!\n if (current === Infinity) continue\n distances.set(sorted[i]!, current + (next - prev) / range)\n }\n }\n\n return candidates.map((c) => ({ candidate: c, distance: distances.get(c) ?? 0 }))\n}\n\n/**\n * Pareto frontier with tie-break by crowding distance — the canonical\n * NSGA-II selection step. Returns the frontier sorted by descending crowding\n * distance so callers can `.slice(0, k)` to pick K diverse winners.\n */\nexport function paretoFrontierWithCrowding<T>(\n candidates: T[],\n objectives: Objective<T>[],\n): Array<{ candidate: T; distance: number }> {\n const { frontier } = paretoFrontier(candidates, objectives)\n if (frontier.length === 0) return []\n const distances = crowdingDistance(frontier, objectives)\n return distances.sort((a, b) => b.distance - a.distance)\n}\n","/**\n * HeldOutGate — first-class held-out paired-delta promotion gate.\n *\n * Encodes the \"honesty override\" pattern that lived inline in\n * `~/webb/redteam/scripts/agent-eval-autoresearch.ts:138–171`.\n * The optimizer's best-guess is one thing; what we should actually\n * ship is another. The gate is the line between them.\n *\n * A candidate is promoted iff ALL three pass:\n *\n * 1. **Productive runs**: the candidate has at least\n * `minProductiveRuns` paired observations on items where BOTH\n * candidate and baseline produced a real (non-silent) score.\n * 2. **Paired delta**: the lower bound of the bootstrap CI on the\n * median per-item delta (candidate − baseline) on the HOLDOUT\n * split is strictly greater than `pairedDeltaThreshold`.\n * 3. **Overfit gap**: the candidate's gap between search-split\n * score and holdout-split score is no worse (more positive)\n * than the baseline's gap by more than `overfitGapThreshold`.\n * \"Better on search, worse on holdout\" is the canonical\n * overfit pattern; this catches it.\n *\n * The decision carries a machine-readable `rejectionCode` plus an\n * `evidence` block with every number the gate looked at, so the\n * downstream researcher / paper / dashboard can re-derive the\n * verdict without re-running.\n *\n * See also:\n * - `src/paired-stats.ts` for `pairedBootstrap` + `pairedWilcoxon`\n * - `src/run-record.ts` for the input row schema\n * - `src/reference-replay.ts` for the older, reference-replay-\n * specific promotion path (still useful for replay-style evals).\n */\n\nimport type { RunRecord } from './run-record'\nimport { pairedBootstrap, pairedWilcoxon } from './paired-stats'\n\nexport type HeldOutGateRejectionCode =\n | 'few_runs'\n | 'negative_delta'\n | 'overfit_gap'\n\nexport interface HeldOutGateConfig {\n /** Minimum number of paired (candidate, baseline) holdout observations\n * required before the gate will even consider promoting. Default 3. */\n minProductiveRuns?: number\n /** The bootstrap-CI lower bound on the median paired holdout delta\n * must exceed this to promote. Default 0. */\n pairedDeltaThreshold?: number\n /** Maximum allowed worsening of (search − holdout) gap relative to\n * baseline. Default 0.15 (i.e. candidate may overfit by up to 15\n * absolute score points more than baseline before rejection). */\n overfitGapThreshold?: number\n /** Stable label of the baseline candidate. Required — paper-grade\n * evaluation never compares two unlabelled candidates. */\n baselineKey: string\n /** Confidence level for the bootstrap CI. Default 0.95. */\n confidence?: number\n /** Bootstrap resamples. Default 2000. */\n bootstrapResamples?: number\n /** Optional deterministic seed for the bootstrap. Default undefined\n * (Math.random). */\n seed?: number\n}\n\nexport interface GateEvidence {\n /** Number of paired (candidate, baseline) holdout observations used. */\n productiveRuns: number\n /** Median of (candidate − baseline) paired holdout deltas. */\n medianPairedDelta: number\n /** Bootstrap CI on the median paired holdout delta. */\n pairedCI: { low: number; high: number }\n /** Wilcoxon signed-rank p-value on the paired holdout deltas. */\n pairedPValue: number\n /** Mean candidate score on the search split (NaN if none). */\n searchScore: number\n /** Mean candidate score on the holdout split (NaN if none). */\n holdoutScore: number\n /** Candidate (search − holdout) gap. */\n overfitGap: number\n /** Baseline (search − holdout) gap. */\n baselineOverfitGap: number\n}\n\nexport interface GateDecision {\n /** Final promote/no-promote verdict. */\n promote: boolean\n /** The candidate that was evaluated. */\n candidateId: string\n /** The baseline it was compared against. */\n baselineId: string\n /** Every number the gate looked at, for audit + paper export. */\n evidence: GateEvidence\n /** Human-readable reason. */\n reason: string\n /** Machine-readable rejection code, or null on promote. */\n rejectionCode: HeldOutGateRejectionCode | null\n}\n\n/**\n * Held-out paired-delta promotion gate. Construct once with config,\n * call `evaluate(candidateRuns, baselineRuns)` per (candidate,\n * baseline) pair. Stateless across calls.\n */\nexport class HeldOutGate {\n private readonly minProductiveRuns: number\n private readonly pairedDeltaThreshold: number\n private readonly overfitGapThreshold: number\n private readonly baselineKey: string\n private readonly confidence: number\n private readonly resamples: number\n private readonly seed?: number\n\n constructor(config: HeldOutGateConfig) {\n if (!config.baselineKey) {\n throw new Error('HeldOutGate: baselineKey is required')\n }\n this.minProductiveRuns = config.minProductiveRuns ?? 3\n this.pairedDeltaThreshold = config.pairedDeltaThreshold ?? 0\n this.overfitGapThreshold = config.overfitGapThreshold ?? 0.15\n this.baselineKey = config.baselineKey\n this.confidence = config.confidence ?? 0.95\n this.resamples = config.bootstrapResamples ?? 2000\n this.seed = config.seed\n }\n\n /** Decide whether `candidate` should replace `baseline`. Pairing\n * is by (experimentId, seed) — identical experiment + seed pairs\n * the candidate run with the matching baseline run. Pairs without\n * a holdout score on both sides are dropped. */\n evaluate(candidate: RunRecord[], baseline: RunRecord[]): GateDecision {\n const candidateId = inferCandidateId(candidate, this.baselineKey)\n const baselineId = this.baselineKey\n\n // Pair holdout runs by (experimentId, seed).\n const baselineHoldoutByKey = indexHoldoutByKey(baseline)\n const beforeHoldout: number[] = []\n const afterHoldout: number[] = []\n for (const run of candidate) {\n if (run.splitTag !== 'holdout') continue\n if (run.outcome.holdoutScore === undefined) continue\n const key = pairKey(run)\n const counterpart = baselineHoldoutByKey.get(key)\n if (counterpart === undefined) continue\n beforeHoldout.push(counterpart)\n afterHoldout.push(run.outcome.holdoutScore)\n }\n\n const productiveRuns = beforeHoldout.length\n\n // Always compute the gap numbers — useful even when we reject on\n // few_runs (you want to see why).\n const candidateSearchMean = mean(scores(candidate, 'searchScore', 'search'))\n const candidateHoldoutMean = mean(scores(candidate, 'holdoutScore', 'holdout'))\n const baselineSearchMean = mean(scores(baseline, 'searchScore', 'search'))\n const baselineHoldoutMean = mean(scores(baseline, 'holdoutScore', 'holdout'))\n\n const overfitGap = safeDiff(candidateSearchMean, candidateHoldoutMean)\n const baselineOverfitGap = safeDiff(baselineSearchMean, baselineHoldoutMean)\n\n // Few-runs gate.\n if (productiveRuns < this.minProductiveRuns) {\n return {\n promote: false,\n candidateId,\n baselineId,\n evidence: {\n productiveRuns,\n medianPairedDelta: productiveRuns > 0 ? medianDelta(beforeHoldout, afterHoldout) : 0,\n pairedCI: { low: 0, high: 0 },\n pairedPValue: 1,\n searchScore: candidateSearchMean,\n holdoutScore: candidateHoldoutMean,\n overfitGap,\n baselineOverfitGap,\n },\n reason: `few_runs: ${productiveRuns} paired holdout observation(s) < min ${this.minProductiveRuns}`,\n rejectionCode: 'few_runs',\n }\n }\n\n // Paired bootstrap on holdout deltas.\n const ci = pairedBootstrap(beforeHoldout, afterHoldout, {\n confidence: this.confidence,\n resamples: this.resamples,\n statistic: 'median',\n seed: this.seed,\n })\n const wilcoxon = pairedWilcoxon(beforeHoldout, afterHoldout)\n\n const evidence: GateEvidence = {\n productiveRuns,\n medianPairedDelta: ci.median,\n pairedCI: { low: ci.low, high: ci.high },\n pairedPValue: wilcoxon.p,\n searchScore: candidateSearchMean,\n holdoutScore: candidateHoldoutMean,\n overfitGap,\n baselineOverfitGap,\n }\n\n // Negative-delta gate (CI lower bound must clear the threshold).\n if (!(ci.low > this.pairedDeltaThreshold)) {\n return {\n promote: false,\n candidateId,\n baselineId,\n evidence,\n reason:\n `negative_delta: paired holdout median Δ=${fmt(ci.median)} ` +\n `CI=[${fmt(ci.low)}, ${fmt(ci.high)}] does not clear threshold ${fmt(this.pairedDeltaThreshold)}`,\n rejectionCode: 'negative_delta',\n }\n }\n\n // Overfit-gap gate. We allow some absolute slack —\n // candidate.gap ≤ baseline.gap + overfitGapThreshold.\n if (\n Number.isFinite(overfitGap) &&\n Number.isFinite(baselineOverfitGap) &&\n overfitGap > baselineOverfitGap + this.overfitGapThreshold\n ) {\n return {\n promote: false,\n candidateId,\n baselineId,\n evidence,\n reason:\n `overfit_gap: candidate gap=${fmt(overfitGap)} exceeds baseline gap=${fmt(baselineOverfitGap)} ` +\n `by more than ${fmt(this.overfitGapThreshold)}`,\n rejectionCode: 'overfit_gap',\n }\n }\n\n return {\n promote: true,\n candidateId,\n baselineId,\n evidence,\n reason:\n `promote: paired holdout median Δ=${fmt(ci.median)} ` +\n `CI=[${fmt(ci.low)}, ${fmt(ci.high)}] over ${productiveRuns} pairs; ` +\n `overfit gap candidate=${fmt(overfitGap)} vs baseline=${fmt(baselineOverfitGap)}`,\n rejectionCode: null,\n }\n }\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\nfunction inferCandidateId(candidate: RunRecord[], baselineKey: string): string {\n for (const run of candidate) {\n if (run.candidateId && run.candidateId !== baselineKey) return run.candidateId\n }\n // All candidate rows match the baseline key — caller mistake, but\n // surface the symptom rather than throwing inside the gate.\n return candidate[0]?.candidateId ?? '(unknown candidate)'\n}\n\nfunction indexHoldoutByKey(runs: RunRecord[]): Map<string, number> {\n const out = new Map<string, number>()\n for (const r of runs) {\n if (r.splitTag !== 'holdout') continue\n if (r.outcome.holdoutScore === undefined) continue\n out.set(pairKey(r), r.outcome.holdoutScore)\n }\n return out\n}\n\nfunction pairKey(r: RunRecord): string {\n return `${r.experimentId}::${r.seed}`\n}\n\nfunction scores(\n runs: RunRecord[],\n field: 'searchScore' | 'holdoutScore',\n splitFilter: 'search' | 'holdout',\n): number[] {\n const out: number[] = []\n for (const r of runs) {\n if (r.splitTag !== splitFilter) continue\n const v = r.outcome[field]\n if (typeof v === 'number' && Number.isFinite(v)) out.push(v)\n }\n return out\n}\n\nfunction mean(xs: number[]): number {\n if (xs.length === 0) return Number.NaN\n return xs.reduce((s, x) => s + x, 0) / xs.length\n}\n\nfunction safeDiff(a: number, b: number): number {\n if (!Number.isFinite(a) || !Number.isFinite(b)) return Number.NaN\n return a - b\n}\n\nfunction medianDelta(before: number[], after: number[]): number {\n const ds = before.map((b, i) => after[i]! - b).sort((x, y) => x - y)\n if (ds.length === 0) return 0\n const mid = Math.floor(ds.length / 2)\n return ds.length % 2 === 0 ? (ds[mid - 1]! + ds[mid]!) / 2 : ds[mid]!\n}\n\nfunction fmt(x: number): string {\n if (!Number.isFinite(x)) return String(x)\n return x.toFixed(4)\n}\n","/**\n * Researcher interface — stable hook for an external autonomous-research\n * agent to drive the meta-loop.\n *\n * Implementations live downstream (typically in a private repo that\n * runs the actual LLM). This package ships only the contract + a\n * `NoopResearcher` so consumers can wire the surface without being\n * forced to implement every method up front.\n *\n * The four methods mirror the four stages of the paper \"Two Loops,\n * Three Roles\":\n *\n * inspectFailures — given the observed runs, what failure modes\n * are present? (data → diagnosis)\n * proposeChange — given diagnosed failure modes, what\n * structural changes should we try?\n * (diagnosis → plan delta)\n * applyChange — fold the proposed deltas into a concrete\n * experiment plan against an existing baseline.\n * (plan delta → executable plan)\n * evaluateChange — run the plan, return runs + the gate verdict.\n * (executable plan → verdict)\n *\n * Composition is the discipline: a Researcher implementation MUST\n * keep these four steps separate and inspectable. Conflating\n * \"diagnose + propose + run\" into a single LLM call defeats the\n * point of the framework — you can't audit which step lied.\n *\n * THIS INTERFACE IS STABLE. Breaking changes require a new module\n * (e.g. `Researcher2`) so existing implementations keep working.\n */\n\nimport type { GateDecision } from './held-out-gate'\nimport type { RunRecord, RunSplitTag } from './run-record'\n\n/** A diagnosed failure mode with the run-IDs that exhibit it. */\nexport interface FailureMode {\n /** Short machine-readable code. Must be stable across runs of the\n * same researcher to enable longitudinal tracking. */\n code: string\n /** Human-readable description for the paper / dashboard. */\n description: string\n evidence: {\n /** Run IDs (from `RunRecord.runId`) where this failure mode was\n * observed. */\n runIds: string[]\n /** Number of run samples that informed the diagnosis. */\n samples: number\n }\n}\n\n/** A single steering change the researcher wants to try. */\nexport interface SteeringChange {\n kind: 'reviewer_prompt' | 'skill_add' | 'skill_remove' | 'threshold' | 'budget'\n /** Implementation-specific payload. Researcher implementations\n * define the schema — keep this `unknown` here to avoid coupling\n * the public interface to any one researcher's internal model. */\n payload: unknown\n /** Why the researcher proposed this change. Goes into the audit\n * trail next to the failure-mode evidence. */\n rationale: string\n /** Optional self-reported expected delta on the headline metric. */\n expectedDelta?: number\n}\n\n/** A single experiment plan, mapped onto the search/holdout splits. */\nexport interface ExperimentPlan {\n baselineCandidateId: string\n proposedCandidateId: string\n changes: SteeringChange[]\n /** USD ceiling for the entire experiment. The runner must stop\n * before exceeding this and report a partial result. */\n evaluationBudgetUsd: number\n /** Item IDs (your dataset keys) for the search vs holdout splits. */\n splits: { search: string[]; holdout: string[] }\n}\n\n/** Result of running a plan: every run, plus the gate verdict. */\nexport interface ExperimentResult {\n plan: ExperimentPlan\n runs: RunRecord[]\n gateDecision: GateDecision\n}\n\n/**\n * The researcher loop. Stable, four-step, inspectable.\n *\n * ┌──────────┐ inspectFailures ┌──────────┐ proposeChange ┌──────────┐\n * │ runs │ ─────────────────▶│ failures │ ──────────────▶│ changes │\n * └──────────┘ └──────────┘ └────┬─────┘\n * │\n * ▼\n * ┌────────────────┐ applyChange ┌────────┐\n * │ ExperimentPlan │ ◀────────────│ base │\n * └────────┬───────┘ └────────┘\n * │\n * evaluateChange ▼\n * ┌────────────────┐\n * │ ExperimentResult│\n * └────────────────┘\n */\nexport interface Researcher {\n inspectFailures(runs: RunRecord[]): Promise<FailureMode[]>\n proposeChange(failures: FailureMode[]): Promise<SteeringChange[]>\n applyChange(changes: SteeringChange[], baseline: ExperimentPlan): Promise<ExperimentPlan>\n evaluateChange(plan: ExperimentPlan): Promise<ExperimentResult>\n}\n\nexport interface CallbackResearcherOptions {\n inspectFailures: Researcher['inspectFailures']\n proposeChange: Researcher['proposeChange']\n applyChange: Researcher['applyChange']\n evaluateChange: Researcher['evaluateChange']\n}\n\n/**\n * Minimal concrete researcher for tests, scripts, and small integrations.\n * Larger autonomous researchers can still implement `Researcher` directly.\n */\nexport class CallbackResearcher implements Researcher {\n constructor(private readonly callbacks: CallbackResearcherOptions) {}\n\n inspectFailures(runs: RunRecord[]): Promise<FailureMode[]> {\n return this.callbacks.inspectFailures(runs)\n }\n\n proposeChange(failures: FailureMode[]): Promise<SteeringChange[]> {\n return this.callbacks.proposeChange(failures)\n }\n\n applyChange(changes: SteeringChange[], baseline: ExperimentPlan): Promise<ExperimentPlan> {\n return this.callbacks.applyChange(changes, baseline)\n }\n\n evaluateChange(plan: ExperimentPlan): Promise<ExperimentResult> {\n return this.callbacks.evaluateChange(plan)\n }\n}\n\n/**\n * No-op researcher — fails loud on every method. Use as a placeholder\n * in code paths that wire the interface but don't have an implementation\n * yet. Importantly, this does NOT silently succeed: a no-op researcher\n * that returned empty arrays would muffle the loop's signal that\n * nobody implemented the brain.\n */\nexport class NoopResearcher implements Researcher {\n private readonly hint: string\n\n constructor(hint = 'NoopResearcher: no implementation wired') {\n this.hint = hint\n }\n\n async inspectFailures(_runs: RunRecord[]): Promise<FailureMode[]> {\n throw new Error(`${this.hint} (inspectFailures not implemented)`)\n }\n\n async proposeChange(_failures: FailureMode[]): Promise<SteeringChange[]> {\n throw new Error(`${this.hint} (proposeChange not implemented)`)\n }\n\n async applyChange(_changes: SteeringChange[], _baseline: ExperimentPlan): Promise<ExperimentPlan> {\n throw new Error(`${this.hint} (applyChange not implemented)`)\n }\n\n async evaluateChange(_plan: ExperimentPlan): Promise<ExperimentResult> {\n throw new Error(`${this.hint} (evaluateChange not implemented)`)\n }\n}\n\n/** Re-export the split alias so callers don't have to import twice. */\nexport type { RunSplitTag }\n","/**\n * PromptEvolutionLoop — population-based reflective-mutation evolution.\n *\n * Above the existing `AxGepaSteeringOptimizer` (which RANKS variants),\n * this loop GENERATES variants. Each generation:\n * 1. Score the population across (variant × scenario × rep).\n * 2. Pick survivors from the Pareto frontier (with crowding-distance tie-break).\n * 3. Ask the mutator for replacements until population size is restored.\n * 4. Repeat for N generations OR until convergence.\n *\n * Domain-agnostic. Consumers supply:\n * - A seed population of `EvolvableVariant`s.\n * - A `ScoreAdapter` that runs (variant, scenario, rep) → `TrialResult`.\n * - A `MutateAdapter` that produces children given trace evidence.\n * - Pareto `Objective<TrialAggregate>[]` defining the multi-objective vector.\n *\n * The loop owns: population management, parallel scheduling (concurrency-\n * limited), Pareto selection with crowding distance, generation reporting.\n *\n * It does NOT own: rendering trials to a model, executing prompts, choosing\n * mutation primitives, persisting to disk. Those are the consumer's call.\n */\n\nimport { paretoFrontierWithCrowding, scalarScore, type Objective } from './pareto'\n\nexport interface EvolvableVariant<P = unknown> {\n /** Stable id for the variant — surfaces in reports and trial results. */\n id: string\n /** Variant payload — interpretation is the consumer's responsibility. */\n payload: P\n /** Generation index (0 = seed, then 1, 2, ...). */\n generation: number\n /** Parent variant id when produced via mutation; absent for seeds. */\n parentId?: string\n /** Human label for reports. */\n label: string\n /** What the mutator was trying to fix. */\n rationale?: string\n}\n\nexport interface TrialResult {\n variantId: string\n scenarioId: string\n rep: number\n ok: boolean\n /** Primary scalar score the consumer cares about (e.g., recall, accuracy). */\n score: number\n /** Token cost (or any cost-like dimension). */\n cost?: number\n /** Wall time in ms. */\n durationMs?: number\n /** Free-form metric bag for objective accessors. */\n metrics?: Record<string, number>\n error?: string\n}\n\n/** Aggregated trial summary for one (variant, scenario) pair across reps. */\nexport interface ScenarioAggregate {\n variantId: string\n scenarioId: string\n meanScore: number\n meanCost: number\n meanDurationMs: number\n okRate: number\n trials: number\n /** Mean of every numeric metric across reps. */\n metrics: Record<string, number>\n}\n\n/** Aggregated trial summary for one variant across all scenarios. */\nexport interface VariantAggregate {\n variantId: string\n meanScore: number\n meanCost: number\n meanDurationMs: number\n okRate: number\n scenarios: ScenarioAggregate[]\n /** Mean of every numeric metric, averaged across scenarios. */\n metrics: Record<string, number>\n}\n\nexport interface ScoreAdapter<P = unknown> {\n score(args: {\n variant: EvolvableVariant<P>\n scenarioId: string\n rep: number\n }): Promise<TrialResult>\n}\n\nexport interface MutateAdapter<P = unknown> {\n mutate(args: {\n parent: EvolvableVariant<P>\n parentAggregate: VariantAggregate\n topTrials: TrialResult[]\n bottomTrials: TrialResult[]\n childCount: number\n generation: number\n }): Promise<EvolvableVariant<P>[]>\n}\n\nexport interface PromptEvolutionConfig<P = unknown> {\n runId: string\n /** What component is being mutated — surfaces in reports + reflection prompts. */\n target: string\n seedVariants: EvolvableVariant<P>[]\n scenarioIds: string[]\n reps: number\n generations: number\n populationSize: number\n /** Maximum concurrent score() calls. */\n scoreConcurrency: number\n scoreAdapter: ScoreAdapter<P>\n mutateAdapter: MutateAdapter<P>\n /** Pareto objectives over `VariantAggregate`. Ordered by importance. */\n objectives: Objective<VariantAggregate>[]\n /** Optional weights for the scalar tie-break selector (by objective name). */\n scalarWeights?: Record<string, number>\n /** Stop early if a generation produces no Pareto improvement. Default true. */\n earlyStopOnNoImprovement?: boolean\n onProgress?: (event: PromptEvolutionEvent) => void\n /**\n * Optional cache key for memoising scored (variantId, scenarioId, rep)\n * tuples. When provided AND a cache instance is passed, repeated trials\n * skip re-scoring. Cache keys are stable across runs.\n */\n cache?: TrialCache\n}\n\nexport interface TrialCache {\n get(key: string): TrialResult | undefined\n set(key: string, value: TrialResult): void\n}\n\nexport class InMemoryTrialCache implements TrialCache {\n private store = new Map<string, TrialResult>()\n get(key: string): TrialResult | undefined { return this.store.get(key) }\n set(key: string, value: TrialResult): void { this.store.set(key, value) }\n size(): number { return this.store.size }\n clear(): void { this.store.clear() }\n}\n\nexport type PromptEvolutionEvent =\n | { type: 'generation-start'; generation: number; populationSize: number }\n | { type: 'trial-complete'; generation: number; variantId: string; scenarioId: string; rep: number; ok: boolean; score: number; cached: boolean }\n | { type: 'generation-complete'; report: GenerationReport<unknown> }\n | { type: 'converged'; generation: number; reason: string }\n\nexport interface GenerationReport<P = unknown> {\n runId: string\n target: string\n generation: number\n variants: EvolvableVariant<P>[]\n aggregates: VariantAggregate[]\n /** Frontier candidates, sorted by descending crowding distance. */\n paretoFrontIds: string[]\n /** Scalar-best variant id — used for the single \"winner\" if callers want one. */\n winnerId: string\n /** Trials that fed this generation (kept for downstream reporting). */\n trials: TrialResult[]\n}\n\nexport interface PromptEvolutionResult<P = unknown> {\n runId: string\n target: string\n generations: GenerationReport<P>[]\n /** Best variant by scalar score in the final generation. */\n bestVariant: EvolvableVariant<P>\n /** Best aggregate (matches bestVariant). */\n bestAggregate: VariantAggregate\n}\n\nexport async function runPromptEvolution<P>(\n config: PromptEvolutionConfig<P>,\n): Promise<PromptEvolutionResult<P>> {\n const generations: GenerationReport<P>[] = []\n let population = [...config.seedVariants]\n let bestVariant: EvolvableVariant<P> = population[0]!\n let bestAggregate: VariantAggregate | null = null\n\n for (let generation = 0; generation < config.generations; generation++) {\n config.onProgress?.({ type: 'generation-start', generation, populationSize: population.length })\n\n const trials = await scorePopulation(population, config, generation)\n const aggregates = aggregateTrials(population, config.scenarioIds, trials)\n\n const front = paretoFrontierWithCrowding(aggregates, config.objectives)\n const frontIds = new Set(front.map((c) => c.candidate.variantId))\n\n const scored = scalarScore(aggregates, config.objectives, { weights: config.scalarWeights })\n scored.sort((a, b) => b.score - a.score)\n const winnerId = scored[0]?.candidate.variantId ?? aggregates[0]?.variantId ?? population[0]!.id\n\n const report: GenerationReport<P> = {\n runId: config.runId,\n target: config.target,\n generation,\n variants: population,\n aggregates,\n paretoFrontIds: front.map((c) => c.candidate.variantId),\n winnerId,\n trials,\n }\n generations.push(report)\n config.onProgress?.({ type: 'generation-complete', report })\n\n const winnerAgg = aggregates.find((a) => a.variantId === winnerId)\n if (winnerAgg) {\n const winner = population.find((v) => v.id === winnerId)\n if (winner) bestVariant = winner\n bestAggregate = winnerAgg\n }\n\n // Convergence: no Pareto-or-scalar improvement vs previous generation.\n if (config.earlyStopOnNoImprovement !== false && generations.length >= 2) {\n const prev = generations[generations.length - 2]!\n const noChange = prev.winnerId === winnerId && samePopulation(prev.paretoFrontIds, [...frontIds])\n if (noChange) {\n config.onProgress?.({ type: 'converged', generation, reason: 'no improvement vs previous generation' })\n break\n }\n }\n\n if (generation === config.generations - 1) break\n\n population = await nextPopulation(population, aggregates, trials, front, config, generation + 1)\n }\n\n return {\n runId: config.runId,\n target: config.target,\n generations,\n bestVariant,\n bestAggregate: bestAggregate ?? aggregateTrials(population, config.scenarioIds, []).find((a) => a.variantId === bestVariant.id)!,\n }\n}\n\nasync function scorePopulation<P>(\n population: EvolvableVariant<P>[],\n config: PromptEvolutionConfig<P>,\n generation: number,\n): Promise<TrialResult[]> {\n const jobs: Array<() => Promise<TrialResult>> = []\n for (const variant of population) {\n for (const scenarioId of config.scenarioIds) {\n for (let rep = 0; rep < config.reps; rep++) {\n jobs.push(async () => {\n const cacheKey = `${variant.id}|${scenarioId}|${rep}`\n const cached = config.cache?.get(cacheKey)\n if (cached) {\n config.onProgress?.({\n type: 'trial-complete',\n generation,\n variantId: variant.id,\n scenarioId,\n rep,\n ok: cached.ok,\n score: cached.score,\n cached: true,\n })\n return cached\n }\n const result = await config.scoreAdapter.score({ variant, scenarioId, rep })\n config.cache?.set(cacheKey, result)\n config.onProgress?.({\n type: 'trial-complete',\n generation,\n variantId: variant.id,\n scenarioId,\n rep,\n ok: result.ok,\n score: result.score,\n cached: false,\n })\n return result\n })\n }\n }\n }\n return runWithConcurrency(jobs, config.scoreConcurrency)\n}\n\nasync function runWithConcurrency<T>(jobs: Array<() => Promise<T>>, concurrency: number): Promise<T[]> {\n const results: T[] = new Array(jobs.length)\n const limit = Math.max(1, concurrency)\n let next = 0\n async function worker(): Promise<void> {\n while (true) {\n const i = next++\n if (i >= jobs.length) return\n results[i] = await jobs[i]!()\n }\n }\n await Promise.all(Array.from({ length: limit }, () => worker()))\n return results\n}\n\nfunction aggregateTrials<P>(\n population: EvolvableVariant<P>[],\n scenarioIds: string[],\n trials: TrialResult[],\n): VariantAggregate[] {\n return population.map((variant) => {\n const variantTrials = trials.filter((t) => t.variantId === variant.id)\n const scenarios = scenarioIds.map<ScenarioAggregate>((sid) => {\n const scenarioTrials = variantTrials.filter((t) => t.scenarioId === sid)\n const okTrials = scenarioTrials.filter((t) => t.ok)\n // Mean score must include every successfully-graded trial — a trial\n // with score=0.6 and ok=false (below quality_bar) is real signal, not\n // noise. Only `error` trials (agent crash, judge crash) carry a\n // synthetic score and are excluded. okRate continues to reflect the\n // pass/fail rate against the configured quality_bar.\n const gradedTrials = scenarioTrials.filter((t) => !t.error)\n const metrics = aggregateMetrics(gradedTrials.map((t) => t.metrics ?? {}))\n return {\n variantId: variant.id,\n scenarioId: sid,\n meanScore: mean(gradedTrials.map((t) => t.score)),\n meanCost: mean(gradedTrials.map((t) => t.cost ?? 0)),\n meanDurationMs: mean(gradedTrials.map((t) => t.durationMs ?? 0)),\n okRate: scenarioTrials.length === 0 ? 0 : okTrials.length / scenarioTrials.length,\n trials: scenarioTrials.length,\n metrics,\n }\n })\n return {\n variantId: variant.id,\n meanScore: mean(scenarios.map((s) => s.meanScore)),\n meanCost: mean(scenarios.map((s) => s.meanCost)),\n meanDurationMs: mean(scenarios.map((s) => s.meanDurationMs)),\n okRate: mean(scenarios.map((s) => s.okRate)),\n scenarios,\n metrics: aggregateMetrics(scenarios.map((s) => s.metrics)),\n }\n })\n}\n\nfunction aggregateMetrics(rows: Array<Record<string, number>>): Record<string, number> {\n const buckets = new Map<string, number[]>()\n for (const row of rows) {\n for (const [k, v] of Object.entries(row)) {\n if (!Number.isFinite(v)) continue\n const list = buckets.get(k) ?? []\n list.push(v)\n buckets.set(k, list)\n }\n }\n const out: Record<string, number> = {}\n for (const [k, list] of buckets) out[k] = mean(list)\n return out\n}\n\nfunction mean(xs: number[]): number {\n if (xs.length === 0) return 0\n return xs.reduce((a, b) => a + b, 0) / xs.length\n}\n\nasync function nextPopulation<P>(\n current: EvolvableVariant<P>[],\n aggregates: VariantAggregate[],\n trials: TrialResult[],\n front: Array<{ candidate: VariantAggregate; distance: number }>,\n config: PromptEvolutionConfig<P>,\n nextGeneration: number,\n): Promise<EvolvableVariant<P>[]> {\n const survivorIds = new Set(front.map((c) => c.candidate.variantId))\n const survivors = current.filter((v) => survivorIds.has(v.id))\n\n // Pick the best survivor (by scalar) as the mutation parent.\n const ranked = scalarScore(aggregates, config.objectives, { weights: config.scalarWeights })\n .sort((a, b) => b.score - a.score)\n const parentId = ranked[0]?.candidate.variantId ?? current[0]!.id\n const parent = current.find((v) => v.id === parentId) ?? current[0]!\n const parentAggregate = aggregates.find((a) => a.variantId === parent.id) ?? aggregates[0]!\n\n const topTrials = topKTrialsByScore(trials, parent.id, 3)\n const bottomTrials = bottomKTrialsByScore(trials, parent.id, 3)\n const childCount = Math.max(0, config.populationSize - survivors.length)\n let children: EvolvableVariant<P>[] = []\n if (childCount > 0) {\n children = await config.mutateAdapter.mutate({\n parent,\n parentAggregate,\n topTrials,\n bottomTrials,\n childCount,\n generation: nextGeneration,\n })\n children = children.slice(0, childCount).map((c) => ({ ...c, generation: nextGeneration, parentId: parent.id }))\n }\n return [...survivors, ...children]\n}\n\nfunction topKTrialsByScore(trials: TrialResult[], variantId: string, k: number): TrialResult[] {\n return trials.filter((t) => t.variantId === variantId && t.ok).sort((a, b) => b.score - a.score).slice(0, k)\n}\n\nfunction bottomKTrialsByScore(trials: TrialResult[], variantId: string, k: number): TrialResult[] {\n return trials.filter((t) => t.variantId === variantId && t.ok).sort((a, b) => a.score - b.score).slice(0, k)\n}\n\nfunction samePopulation(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false\n const setA = new Set(a)\n return b.every((id) => setA.has(id))\n}\n","/**\n * Multi-shot optimization adapter.\n *\n * This is the canonical bridge between variable-length agent trajectories\n * and `runPromptEvolution`. Apps provide four things:\n *\n * - variants: prompt/config/tool-policy candidates\n * - runner: executes one full task trajectory for a variant\n * - scorer: turns that trajectory into score + actionable side information\n * - mutator: proposes new variants from top/bottom scored trials\n *\n * The adapter owns the boring but easy-to-get-wrong glue: stable seeds,\n * score/cost objectives, error-to-trial conversion, ASI metric projection,\n * and optional paired holdout gating via `HeldOutGate`.\n */\n\nimport { HeldOutGate, type GateDecision, type HeldOutGateConfig } from './held-out-gate'\nimport {\n runPromptEvolution,\n type PromptEvolutionEvent,\n type PromptEvolutionResult,\n type EvolvableVariant,\n type ScoreAdapter,\n type TrialCache,\n type TrialResult,\n type VariantAggregate,\n} from './prompt-evolution'\nimport { type Objective } from './pareto'\nimport { type RunRecord, validateRunRecord, type RunSplitTag } from './run-record'\nimport { type TrialTrace } from './reflective-mutation'\n\nexport type MultiShotSplit = 'search' | 'dev' | 'holdout'\n\nexport type AsiSeverity = 'info' | 'warning' | 'error' | 'critical'\n\nexport type MultiShotVariant<P = unknown> = EvolvableVariant<P>\n\nexport interface ActionableSideInfo {\n /** Stable expectation/check id when available. */\n expectationId?: string\n /** Human-readable diagnosis of what happened. */\n message: string\n severity?: AsiSeverity\n /** Concrete trace excerpt, file path, tool call, screenshot id, etc. */\n evidence?: string\n /** Prompt/tool/context surface likely responsible. */\n responsibleSurface?: string\n /** Suggested fix in natural language. */\n suggestion?: string\n /** Whether this expectation was satisfied. Defaults to false for ASI rows. */\n matched?: boolean\n metadata?: Record<string, unknown>\n}\n\nexport interface MultiShotTrace {\n scenarioId: string\n /** Full turn/tool trace. Shape is intentionally app-owned. */\n turns?: unknown[]\n toolCalls?: unknown[]\n artifacts?: unknown[]\n /** Compact final output or summary used by reflection prompts. */\n transcript?: string\n output?: unknown\n metadata?: Record<string, unknown>\n}\n\nexport interface MultiShotRun {\n trace: MultiShotTrace\n costUsd?: number\n durationMs?: number\n tokenUsage?: { input?: number; output?: number; cached?: number }\n metadata?: Record<string, unknown>\n}\n\nexport interface MultiShotRunInput<P = unknown> {\n variant: EvolvableVariant<P>\n scenarioId: string\n rep: number\n split: MultiShotSplit\n /** Stable paired seed for baseline/candidate comparisons. */\n seed: number\n}\n\nexport interface MultiShotRunner<P = unknown> {\n run(input: MultiShotRunInput<P>): Promise<MultiShotRun> | MultiShotRun\n}\n\nexport interface MultiShotScore {\n /** Primary score in [0,1]. The adapter clamps for safety. */\n score: number\n /** Pass/fail for top/bottom trial selection. Defaults to true. */\n ok?: boolean\n costUsd?: number\n durationMs?: number\n metrics?: Record<string, number>\n asi?: ActionableSideInfo[]\n /** Optional rich output shown to reflection mutators. */\n emitted?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface MultiShotScorer<P = unknown> {\n score(input: MultiShotRunInput<P> & { run: MultiShotRun }): Promise<MultiShotScore> | MultiShotScore\n}\n\nexport interface MultiShotTrialResult extends TrialResult {\n split: MultiShotSplit\n seed: number\n trace?: MultiShotTrace\n asi?: ActionableSideInfo[]\n emitted?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface MultiShotMutateAdapter<P = unknown> {\n mutate(args: {\n parent: EvolvableVariant<P>\n parentAggregate: VariantAggregate\n topTrials: MultiShotTrialResult[]\n bottomTrials: MultiShotTrialResult[]\n childCount: number\n generation: number\n }): Promise<EvolvableVariant<P>[]>\n}\n\nexport interface MultiShotGateConfig<P = unknown> {\n /** Search rows are optional, but enable HeldOutGate's overfit-gap check. */\n searchScenarioIds?: string[]\n holdoutScenarioIds: string[]\n reps?: number\n gate: HeldOutGateConfig\n /** Convert scored trajectory runs into paper-grade RunRecords. */\n toRunRecord(input: {\n variant: EvolvableVariant<P>\n scenarioId: string\n rep: number\n split: RunSplitTag\n seed: number\n trial: MultiShotTrialResult\n }): RunRecord\n}\n\nexport interface MultiShotOptimizationConfig<P = unknown> {\n runId: string\n target: string\n seedVariants: EvolvableVariant<P>[]\n searchScenarioIds: string[]\n reps: number\n generations: number\n populationSize: number\n scoreConcurrency?: number\n runner: MultiShotRunner<P>\n scorer: MultiShotScorer<P>\n mutateAdapter: MultiShotMutateAdapter<P>\n objectives?: Objective<VariantAggregate>[]\n scalarWeights?: Record<string, number>\n cache?: TrialCache\n earlyStopOnNoImprovement?: boolean\n seedBase?: number\n onProgress?: (event: PromptEvolutionEvent) => void\n gate?: MultiShotGateConfig<P>\n}\n\nexport interface MultiShotGateResult {\n decision: GateDecision\n candidateRuns: RunRecord[]\n baselineRuns: RunRecord[]\n}\n\nexport interface MultiShotOptimizationResult<P = unknown> {\n evolution: PromptEvolutionResult<P>\n /** Best candidate on the optimizer-visible search split. */\n searchBestVariant: EvolvableVariant<P>\n searchBestAggregate: VariantAggregate\n /** Variant callers should actually ship after optional holdout gating. */\n promotedVariant: EvolvableVariant<P>\n promotedAggregate: VariantAggregate\n /** Null when no gate was configured or the search-best candidate was the baseline. */\n gate: MultiShotGateResult | null\n}\n\nexport async function runMultiShotOptimization<P>(\n config: MultiShotOptimizationConfig<P>,\n): Promise<MultiShotOptimizationResult<P>> {\n validateConfig(config)\n\n const scoreAdapter: ScoreAdapter<P> = {\n score: (args) => scoreOne(config, args.variant, args.scenarioId, args.rep, 'search'),\n }\n\n const evolution = await runPromptEvolution<P>({\n runId: config.runId,\n target: config.target,\n seedVariants: config.seedVariants,\n scenarioIds: config.searchScenarioIds,\n reps: config.reps,\n generations: config.generations,\n populationSize: config.populationSize,\n scoreConcurrency: config.scoreConcurrency ?? 1,\n scoreAdapter,\n mutateAdapter: {\n mutate: (args) => config.mutateAdapter.mutate({\n ...args,\n topTrials: args.topTrials as MultiShotTrialResult[],\n bottomTrials: args.bottomTrials as MultiShotTrialResult[],\n }),\n },\n objectives: config.objectives ?? defaultMultiShotObjectives(),\n scalarWeights: config.scalarWeights,\n earlyStopOnNoImprovement: config.earlyStopOnNoImprovement,\n cache: config.cache,\n onProgress: config.onProgress,\n })\n\n let gate: MultiShotGateResult | null = null\n const baseline = config.seedVariants[0]!\n let promotedVariant = evolution.bestVariant\n let promotedAggregate = evolution.bestAggregate\n if (config.gate && evolution.bestVariant.id !== baseline.id) {\n gate = await evaluateMultiShotGate(config, baseline, evolution.bestVariant)\n if (!gate.decision.promote) {\n promotedVariant = baseline\n promotedAggregate = aggregateFor(evolution, baseline.id)\n }\n }\n\n return {\n evolution,\n searchBestVariant: evolution.bestVariant,\n searchBestAggregate: evolution.bestAggregate,\n promotedVariant,\n promotedAggregate,\n gate,\n }\n}\n\nexport function defaultMultiShotObjectives(): Objective<VariantAggregate>[] {\n return [\n { name: 'score', direction: 'maximize', value: (a) => a.meanScore },\n { name: 'cost', direction: 'minimize', value: (a) => a.meanCost },\n ]\n}\n\nexport function trialTraceFromMultiShotTrial(trial: MultiShotTrialResult): TrialTrace {\n return {\n id: `${trial.variantId}/${trial.scenarioId}/r${trial.rep}`,\n score: trial.score,\n inputName: trial.scenarioId,\n expectations: (trial.asi ?? []).map((item, i) => ({\n id: item.expectationId ?? `asi-${i}`,\n phrase: item.message,\n matched: item.matched ?? false,\n })),\n emitted: trial.emitted ?? traceExcerpt(trial.trace),\n metrics: trial.metrics,\n }\n}\n\nasync function evaluateMultiShotGate<P>(\n config: MultiShotOptimizationConfig<P>,\n baseline: EvolvableVariant<P>,\n candidate: EvolvableVariant<P>,\n): Promise<MultiShotGateResult> {\n const gateConfig = config.gate!\n const reps = gateConfig.reps ?? config.reps\n const candidateRuns: RunRecord[] = []\n const baselineRuns: RunRecord[] = []\n\n const searchIds = gateConfig.searchScenarioIds ?? config.searchScenarioIds\n for (const scenarioId of searchIds) {\n for (let rep = 0; rep < reps; rep++) {\n const seed = seedFor(config, scenarioId, rep)\n const baseTrial = await scoreOne(config, baseline, scenarioId, rep, 'search')\n const candTrial = await scoreOne(config, candidate, scenarioId, rep, 'search')\n baselineRuns.push(toValidatedRecord(config, baseline, scenarioId, rep, 'search', seed, baseTrial))\n candidateRuns.push(toValidatedRecord(config, candidate, scenarioId, rep, 'search', seed, candTrial))\n }\n }\n\n for (const scenarioId of gateConfig.holdoutScenarioIds) {\n for (let rep = 0; rep < reps; rep++) {\n const seed = seedFor(config, scenarioId, rep)\n const baseTrial = await scoreOne(config, baseline, scenarioId, rep, 'holdout')\n const candTrial = await scoreOne(config, candidate, scenarioId, rep, 'holdout')\n baselineRuns.push(toValidatedRecord(config, baseline, scenarioId, rep, 'holdout', seed, baseTrial))\n candidateRuns.push(toValidatedRecord(config, candidate, scenarioId, rep, 'holdout', seed, candTrial))\n }\n }\n\n const decision = new HeldOutGate(gateConfig.gate).evaluate(candidateRuns, baselineRuns)\n return { decision, candidateRuns, baselineRuns }\n}\n\nasync function scoreOne<P>(\n config: MultiShotOptimizationConfig<P>,\n variant: EvolvableVariant<P>,\n scenarioId: string,\n rep: number,\n split: MultiShotSplit,\n): Promise<MultiShotTrialResult> {\n const seed = seedFor(config, scenarioId, rep)\n const input: MultiShotRunInput<P> = { variant, scenarioId, rep, split, seed }\n try {\n const run = await config.runner.run(input)\n const scored = await config.scorer.score({ ...input, run })\n const asi = scored.asi ?? []\n return {\n variantId: variant.id,\n scenarioId,\n rep,\n ok: scored.ok ?? true,\n score: clamp01(scored.score),\n cost: scored.costUsd ?? run.costUsd ?? 0,\n durationMs: scored.durationMs ?? run.durationMs ?? 0,\n metrics: {\n ...numericMetrics(scored.metrics),\n ...asiMetrics(asi),\n },\n split,\n seed,\n trace: run.trace,\n asi,\n emitted: scored.emitted ?? traceExcerpt(run.trace),\n metadata: scored.metadata,\n }\n } catch (err) {\n return {\n variantId: variant.id,\n scenarioId,\n rep,\n ok: false,\n score: 0,\n cost: 0,\n durationMs: 0,\n metrics: { error: 1 },\n error: err instanceof Error ? err.message : String(err),\n split,\n seed,\n asi: [{\n severity: 'critical',\n message: err instanceof Error ? err.message : String(err),\n responsibleSurface: config.target,\n }],\n emitted: '',\n }\n }\n}\n\nfunction toValidatedRecord<P>(\n config: MultiShotOptimizationConfig<P>,\n variant: EvolvableVariant<P>,\n scenarioId: string,\n rep: number,\n split: RunSplitTag,\n seed: number,\n trial: MultiShotTrialResult,\n): RunRecord {\n const record = config.gate!.toRunRecord({ variant, scenarioId, rep, split, seed, trial })\n return validateRunRecord(record)\n}\n\nfunction validateConfig<P>(config: MultiShotOptimizationConfig<P>): void {\n if (!config.runId.trim()) throw new Error('runMultiShotOptimization: runId must not be empty')\n if (!config.target.trim()) throw new Error('runMultiShotOptimization: target must not be empty')\n if (config.seedVariants.length === 0) {\n throw new Error('runMultiShotOptimization: seedVariants must not be empty')\n }\n if (config.searchScenarioIds.length === 0) {\n throw new Error('runMultiShotOptimization: searchScenarioIds must not be empty')\n }\n requirePositiveInteger(config.reps, 'reps')\n requirePositiveInteger(config.generations, 'generations')\n requirePositiveInteger(config.populationSize, 'populationSize')\n if (config.scoreConcurrency !== undefined) requirePositiveInteger(config.scoreConcurrency, 'scoreConcurrency')\n if (config.populationSize < config.seedVariants.length) {\n throw new Error('runMultiShotOptimization: populationSize must be >= seedVariants.length')\n }\n assertUnique(config.seedVariants.map((v) => v.id), 'seedVariants.id')\n assertUnique(config.searchScenarioIds, 'searchScenarioIds')\n\n if (config.gate) {\n if (config.gate.holdoutScenarioIds.length === 0) {\n throw new Error('runMultiShotOptimization: gate.holdoutScenarioIds must not be empty')\n }\n if (config.gate.reps !== undefined) requirePositiveInteger(config.gate.reps, 'gate.reps')\n assertUnique(config.gate.holdoutScenarioIds, 'gate.holdoutScenarioIds')\n if (config.gate.searchScenarioIds) assertUnique(config.gate.searchScenarioIds, 'gate.searchScenarioIds')\n const searchIds = new Set(config.searchScenarioIds)\n for (const id of config.gate.holdoutScenarioIds) {\n if (searchIds.has(id)) {\n throw new Error(`runMultiShotOptimization: holdout scenario \"${id}\" also appears in searchScenarioIds`)\n }\n }\n const baselineId = config.seedVariants[0]!.id\n if (config.gate.gate.baselineKey !== baselineId) {\n throw new Error(\n `runMultiShotOptimization: gate.gate.baselineKey must match first seed variant id \"${baselineId}\"`,\n )\n }\n }\n}\n\nfunction requirePositiveInteger(value: number, name: string): void {\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(`runMultiShotOptimization: ${name} must be a positive integer`)\n }\n}\n\nfunction assertUnique(values: string[], name: string): void {\n const seen = new Set<string>()\n for (const value of values) {\n if (!value.trim()) throw new Error(`runMultiShotOptimization: ${name} must not contain empty values`)\n if (seen.has(value)) throw new Error(`runMultiShotOptimization: duplicate ${name} \"${value}\"`)\n seen.add(value)\n }\n}\n\nfunction aggregateFor<P>(evolution: PromptEvolutionResult<P>, variantId: string): VariantAggregate {\n const final = evolution.generations[evolution.generations.length - 1]\n const aggregate = final?.aggregates.find((a) => a.variantId === variantId)\n if (!aggregate) {\n throw new Error(`runMultiShotOptimization: missing aggregate for variant \"${variantId}\"`)\n }\n return aggregate\n}\n\nfunction seedFor<P>(config: MultiShotOptimizationConfig<P>, scenarioId: string, rep: number): number {\n const base = config.seedBase ?? 0\n return (base + stableHash(`${scenarioId}\\x1f${rep}`)) % Number.MAX_SAFE_INTEGER\n}\n\nfunction stableHash(input: string): number {\n let h = 2166136261\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i)\n h = Math.imul(h, 16777619)\n }\n return h >>> 0\n}\n\nfunction clamp01(n: number): number {\n if (!Number.isFinite(n)) return 0\n return Math.max(0, Math.min(1, n))\n}\n\nfunction numericMetrics(metrics: Record<string, number> | undefined): Record<string, number> {\n const out: Record<string, number> = {}\n for (const [k, v] of Object.entries(metrics ?? {})) {\n if (Number.isFinite(v)) out[k] = v\n }\n return out\n}\n\nfunction asiMetrics(asi: ActionableSideInfo[]): Record<string, number> {\n const out: Record<string, number> = { asi: asi.length }\n for (const item of asi.slice(0, 1000)) {\n const sev = normalizeSeverity(item.severity)\n out[`asi.${sev}`] = (out[`asi.${sev}`] ?? 0) + 1\n if (item.responsibleSurface) {\n const key = `surface.${metricKeySegment(item.responsibleSurface)}`\n out[key] = (out[key] ?? 0) + 1\n }\n }\n return out\n}\n\nfunction normalizeSeverity(severity: AsiSeverity | undefined): AsiSeverity {\n if (severity === 'info' || severity === 'warning' || severity === 'error' || severity === 'critical') {\n return severity\n }\n return 'error'\n}\n\nfunction metricKeySegment(raw: string): string {\n return raw.trim().replace(/[^a-zA-Z0-9._-]+/g, '_').slice(0, 80) || 'unknown'\n}\n\nfunction traceExcerpt(trace: MultiShotTrace | undefined): string | undefined {\n if (!trace) return undefined\n if (typeof trace.output === 'string') return trace.output\n if (trace.transcript) return trace.transcript\n if (trace.turns) {\n try {\n const clipped = trace.turns.slice(0, 20)\n const suffix = trace.turns.length > clipped.length ? ` ... ${trace.turns.length - clipped.length} more turn(s)` : ''\n return `${JSON.stringify(clipped).slice(0, 2000)}${suffix}`\n } catch {\n return '[unserializable trace turns]'\n }\n }\n return undefined\n}\n","/**\n * Reflective mutation — primitives for trace-conditioned prompt rewriting.\n *\n * Used by `prompt-evolution.ts` (and any consumer running iterative\n * improvement). Given a parent prompt + concrete trace evidence (top trials,\n * bottom trials, missed expectations), produce an LLM-ready prompt that\n * proposes targeted mutations — not blind rephrasings.\n *\n * Why this lives outside `prompt-evolution.ts`: any consumer that wants to\n * run reflective rewriting WITHOUT the population/Pareto machinery can\n * import these primitives directly.\n *\n * Quality bar (vs. naive \"mutate this prompt\"):\n * - Show parent ↔ children diff, not just one variant\n * - Quote specific missed goldens with their match phrases\n * - Surface the model's actual emitted output side-by-side with what was expected\n * - Quote concrete mutation primitives so the model has a vocabulary\n */\n\nexport interface TrialTrace {\n /** Stable id for the trial — surfaces in the prompt for grounding. */\n id: string\n /** Score the trial received on its primary metric. */\n score: number\n /** Candidate inputs the agent was given (e.g., the fixture or scenario). */\n inputName?: string\n /**\n * Goldens / expectations this trial was tested against, with whether each\n * was matched. The reflection prompt quotes the missed ones specifically.\n */\n expectations?: Array<{ id: string; phrase: string; matched: boolean }>\n /** Free-form text — what the agent actually emitted (e.g., findings, plan). */\n emitted?: string\n /** Optional structured metrics (recall, precision, cost, latency). */\n metrics?: Record<string, number>\n}\n\nexport interface ReflectionContext {\n /** What is being mutated — appears in the system prompt for orientation. */\n target: string\n /** Current variant's payload — JSON-serialised for the prompt. */\n parentPayload: unknown\n /** Best-performing trials this generation. */\n topTrials: TrialTrace[]\n /** Worst-performing trials this generation — the missed-golden source. */\n bottomTrials: TrialTrace[]\n /** How many children the mutator should propose. */\n childCount: number\n /** Optional: domain-specific mutation primitives the model can pick from. */\n mutationPrimitives?: string[]\n}\n\nexport const DEFAULT_MUTATION_PRIMITIVES: string[] = [\n 'Strengthen an imperative (\"should\" → \"must\")',\n 'Add a concrete example pulled from a missed-golden phrase',\n 'Remove a redundant rule that did not improve recall',\n 'Add a counterfactual (\"if X is missing, the score is capped at Y\")',\n 'Reorder sections so the highest-impact rule is first',\n 'Replace abstract language with a domain-specific noun the trial misses',\n]\n\n/**\n * Build the LLM-ready reflection prompt. Output is plain text — pass it as\n * the user message. The system message should be small and stable (e.g.\n * \"Output ONLY a JSON object matching the schema below.\").\n */\nexport function buildReflectionPrompt(ctx: ReflectionContext): string {\n const primitives = ctx.mutationPrimitives ?? DEFAULT_MUTATION_PRIMITIVES\n const sections: string[] = []\n\n sections.push(`# Mutation target: ${ctx.target}`)\n sections.push('')\n sections.push(`You are tuning the prompt component named \\`${ctx.target}\\`. The current variant is shown below; you have ${ctx.topTrials.length} top trials and ${ctx.bottomTrials.length} bottom trials as evidence. Propose ${ctx.childCount} mutation${ctx.childCount === 1 ? '' : 's'} that fix specific weaknesses visible in the bottom trials. Avoid blank rephrasings.`)\n sections.push('')\n\n sections.push('## Current variant')\n sections.push('```json')\n sections.push(JSON.stringify(ctx.parentPayload, null, 2))\n sections.push('```')\n sections.push('')\n\n if (ctx.bottomTrials.length > 0) {\n sections.push('## Failures (bottom trials) — what went wrong')\n sections.push('')\n for (const trial of ctx.bottomTrials) {\n sections.push(`### Trial \\`${trial.id}\\` — score ${trial.score.toFixed(2)}${trial.inputName ? ` (${trial.inputName})` : ''}`)\n const missed = (trial.expectations ?? []).filter((e) => !e.matched)\n if (missed.length > 0) {\n sections.push('')\n sections.push('**Missed expectations:**')\n for (const m of missed) {\n sections.push(`- \\`${m.id}\\`: should match phrase \\`${quote(m.phrase)}\\``)\n }\n }\n if (trial.emitted) {\n sections.push('')\n sections.push('**What the agent emitted:**')\n sections.push('```')\n sections.push(truncate(trial.emitted, 600))\n sections.push('```')\n }\n sections.push('')\n }\n }\n\n if (ctx.topTrials.length > 0) {\n sections.push('## Successes (top trials) — what to preserve')\n sections.push('')\n for (const trial of ctx.topTrials) {\n sections.push(`- \\`${trial.id}\\`: score ${trial.score.toFixed(2)}${trial.inputName ? ` (${trial.inputName})` : ''}`)\n }\n sections.push('')\n }\n\n sections.push('## Allowed mutation primitives')\n sections.push('')\n for (const p of primitives) sections.push(`- ${p}`)\n sections.push('')\n\n sections.push('## Output schema')\n sections.push('')\n sections.push('Respond with a JSON object — no prose, no markdown fences:')\n sections.push('```json')\n sections.push(JSON.stringify(\n {\n proposals: [\n {\n label: '<short label, ≤ 40 chars>',\n rationale: '<which failure this targets and which primitive you used>',\n payload: '<full payload of the new variant — same shape as the current variant>',\n },\n ],\n },\n null,\n 2,\n ))\n sections.push('```')\n\n return sections.join('\\n')\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s\n return s.slice(0, max) + '… [truncated]'\n}\n\nfunction quote(s: string): string {\n return s.replace(/`/g, '\\\\`')\n}\n\nexport interface ReflectionProposal {\n label: string\n rationale: string\n payload: unknown\n}\n\n/**\n * Parse the model's JSON response back into proposals. Tolerates markdown\n * fences and surrounding prose. Returns at most `maxProposals`.\n */\n/**\n * Walk the input as JSON-aware (string vs not, escape-aware) and close\n * unclosed `{` / `[` in LIFO order at the tail. If the input was already\n * balanced returns it unchanged. If a string was open at end-of-input we\n * also close it with `\"` first, since a truncated string-mid-value is the\n * most common LLM cap-hit failure mode and JSON.parse cannot proceed\n * without one.\n *\n * Returns null when the structure is unrecoverable (e.g. depth would go\n * negative — that's an *over*-closed prefix, not a truncation).\n */\nfunction autoCloseTruncatedJson(raw: string): string | null {\n const stack: Array<'{' | '['> = []\n let inString = false\n let escape = false\n for (const c of raw) {\n if (escape) {\n escape = false\n continue\n }\n if (inString) {\n if (c === '\\\\') { escape = true; continue }\n if (c === '\"') { inString = false; continue }\n continue\n }\n if (c === '\"') { inString = true; continue }\n if (c === '{' || c === '[') stack.push(c)\n else if (c === '}') {\n if (stack.pop() !== '{') return null\n } else if (c === ']') {\n if (stack.pop() !== '[') return null\n }\n }\n if (stack.length === 0 && !inString) return raw\n let suffix = ''\n if (inString) suffix += '\"'\n while (stack.length > 0) {\n const opener = stack.pop()!\n suffix += opener === '{' ? '}' : ']'\n }\n return raw + suffix\n}\n\nexport function parseReflectionResponse(raw: string, maxProposals?: number): ReflectionProposal[] {\n let text = raw.trim()\n if (text.startsWith('```')) text = text.replace(/^```(?:json)?\\n?/, '').replace(/\\n?```$/, '')\n\n // Try to parse as either a JSON object `{proposals: [...]}` or a bare\n // array `[...]`. LLMs frequently emit one or the other depending on how\n // they read the schema example; accept both.\n let parsed: unknown = null\n const objectStart = text.indexOf('{')\n const objectEnd = text.lastIndexOf('}')\n const arrayStart = text.indexOf('[')\n const arrayEnd = text.lastIndexOf(']')\n // Prefer whichever delimiter comes first (the model committed to that shape).\n const tryObjectFirst = objectStart >= 0 && (arrayStart < 0 || objectStart < arrayStart)\n const candidates: string[] = []\n if (tryObjectFirst) {\n if (objectStart >= 0 && objectEnd > objectStart) candidates.push(text.slice(objectStart, objectEnd + 1))\n if (arrayStart >= 0 && arrayEnd > arrayStart) candidates.push(text.slice(arrayStart, arrayEnd + 1))\n } else {\n if (arrayStart >= 0 && arrayEnd > arrayStart) candidates.push(text.slice(arrayStart, arrayEnd + 1))\n if (objectStart >= 0 && objectEnd > objectStart) candidates.push(text.slice(objectStart, objectEnd + 1))\n }\n for (const slice of candidates) {\n try {\n parsed = JSON.parse(slice)\n break\n } catch {\n // try next\n }\n }\n\n // Truncation-tolerant fallback: LLMs frequently hit a max_tokens cap\n // mid-emission, leaving N unclosed `}` / `]` at the tail. Close them in\n // order from the deepest unclosed structure outward, by walking the\n // candidate slice and tracking depth, then retrying JSON.parse. This\n // recovers any complete proposals before the cutoff and drops the rest.\n if (parsed == null) {\n for (const slice of candidates) {\n const closed = autoCloseTruncatedJson(slice)\n if (closed != null && closed !== slice) {\n try {\n parsed = JSON.parse(closed)\n break\n } catch {\n // give up on this candidate\n }\n }\n }\n }\n\n if (parsed == null) return []\n\n // Normalize: accept `{proposals: [...]}` or a bare array.\n let proposalsRaw: unknown\n if (Array.isArray(parsed)) {\n proposalsRaw = parsed\n } else if (parsed && typeof parsed === 'object') {\n proposalsRaw = (parsed as { proposals?: unknown }).proposals\n }\n if (!Array.isArray(proposalsRaw)) return []\n\n const out: ReflectionProposal[] = []\n for (const p of proposalsRaw) {\n if (!p || typeof p !== 'object') continue\n const obj = p as { label?: unknown; rationale?: unknown; payload?: unknown }\n if (!('payload' in obj)) continue\n out.push({\n label: typeof obj.label === 'string' ? obj.label : 'mutation',\n rationale: typeof obj.rationale === 'string' ? obj.rationale : '',\n payload: obj.payload,\n })\n if (maxProposals !== undefined && out.length >= maxProposals) break\n }\n return out\n}\n"],"mappings":"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","names":["mean","stableHash"]}