@tangle-network/agent-eval 0.102.1 → 0.103.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/http.d.ts +2 -2
- package/dist/adapters/langchain.d.ts +2 -2
- package/dist/adapters/otel.d.ts +5 -5
- package/dist/analyst/index.d.ts +9 -9
- package/dist/analyst/index.js +3 -3
- package/dist/{analyze-runs-Cd-A_K4l.d.ts → analyze-runs-rF2eGxZ_.d.ts} +3 -3
- package/dist/belief-state/index.d.ts +3 -3
- package/dist/belief-state/index.js +1 -1
- package/dist/benchmarks/index.d.ts +2 -2
- package/dist/builder-eval/index.js +2 -2
- package/dist/campaign/index.d.ts +43 -16
- package/dist/campaign/index.js +9 -9
- package/dist/campaign/index.js.map +1 -1
- package/dist/{chunk-Z3FLN24V.js → chunk-2B4HPFXN.js} +104 -43
- package/dist/chunk-2B4HPFXN.js.map +1 -0
- package/dist/{chunk-7RBJANJD.js → chunk-3722PKPB.js} +2 -2
- package/dist/{chunk-YLKDN7JV.js → chunk-66T25VWE.js} +5 -5
- package/dist/chunk-66T25VWE.js.map +1 -0
- package/dist/{chunk-6FIAJHCU.js → chunk-6YVAN6R3.js} +4 -4
- package/dist/{chunk-ABOIVNXL.js → chunk-AGYDMORK.js} +1 -1
- package/dist/chunk-AGYDMORK.js.map +1 -0
- package/dist/{chunk-B2TMQM62.js → chunk-BHCFJGL4.js} +2 -2
- package/dist/{chunk-IH7LYRHL.js → chunk-BXZVBX3D.js} +3 -3
- package/dist/{chunk-6GT4NI4V.js → chunk-CLS3374R.js} +2 -2
- package/dist/{chunk-HRGUJTER.js → chunk-HYGRFL7C.js} +1 -1
- package/dist/{chunk-HRGUJTER.js.map → chunk-HYGRFL7C.js.map} +1 -1
- package/dist/{chunk-2NSLDY4B.js → chunk-J5MUFXEY.js} +2 -2
- package/dist/{chunk-UFSG7ACU.js → chunk-JZXGWLK5.js} +1 -1
- package/dist/chunk-JZXGWLK5.js.map +1 -0
- package/dist/{chunk-IN3SHQML.js → chunk-LMSQ6EFA.js} +2 -2
- package/dist/{chunk-AIGWQEME.js → chunk-LOZOZYHU.js} +2 -2
- package/dist/{chunk-NF7OZ4J7.js → chunk-QCBB6ZIU.js} +2 -2
- package/dist/chunk-RQNOLV3I.js +855 -0
- package/dist/chunk-RQNOLV3I.js.map +1 -0
- package/dist/{chunk-JU6ZX3CX.js → chunk-SMCACT4Z.js} +2 -2
- package/dist/{chunk-6Q2DYRWV.js → chunk-TCPP4Z5Q.js} +5 -5
- package/dist/{chunk-VDGPPGE3.js → chunk-UMEAR2FI.js} +2 -2
- package/dist/{chunk-VDGPPGE3.js.map → chunk-UMEAR2FI.js.map} +1 -1
- package/dist/{chunk-QIT2XZ4E.js → chunk-VNM52AGA.js} +3 -3
- package/dist/chunk-VNM52AGA.js.map +1 -0
- package/dist/{chunk-CMJSTXUR.js → chunk-YFYIOSNV.js} +107 -20
- package/dist/chunk-YFYIOSNV.js.map +1 -0
- package/dist/{code-agent-session-Ce-9u7YM.d.ts → code-agent-session-Cen-qD2y.d.ts} +1 -1
- package/dist/contract/index.d.ts +18 -18
- package/dist/contract/index.js +10 -10
- package/dist/{control-C8RmK9H4.d.ts → control-KofK3gfG.d.ts} +1 -1
- package/dist/control.d.ts +2 -2
- package/dist/control.js +3 -3
- package/dist/{corpus-CiSzzLa5.d.ts → corpus-CysLCiK4.d.ts} +1 -1
- package/dist/{default-registry-ZhqsTr4K.d.ts → default-registry-Ez4cxuZ4.d.ts} +2 -2
- package/dist/diagnose.d.ts +3 -3
- package/dist/diagnose.js +3 -3
- package/dist/{gepa-DeyPTlvx.d.ts → gepa-COlCAkHN.d.ts} +22 -1
- package/dist/governance/index.d.ts +1 -1
- package/dist/hosted/index.d.ts +5 -5
- package/dist/{index-B-bFgiAF.d.ts → index-unCSYRJJ.d.ts} +1 -1
- package/dist/index.d.ts +36 -28
- package/dist/index.js +32 -18
- package/dist/index.js.map +1 -1
- package/dist/{insight-report-k0sRTzKg.d.ts → insight-report-DumCfEur.d.ts} +2 -2
- package/dist/{judge-calibration-0p2QcWNE.d.ts → judge-calibration-7C-IDmKr.d.ts} +3 -0
- package/dist/{kind-factory-D0nk7AKV.d.ts → kind-factory-BLHxwX71.d.ts} +1 -1
- package/dist/meta-eval/index.d.ts +4 -4
- package/dist/meta-eval/index.js +3 -3
- package/dist/{multi-layer-verifier-DUZXrPDA.d.ts → multi-layer-verifier-CI4jdX-q.d.ts} +3 -0
- package/dist/multishot/index.d.ts +2 -2
- package/dist/openapi.json +1 -1
- package/dist/pipelines/index.d.ts +1 -1
- package/dist/pipelines/index.js +3 -3
- package/dist/{policy-edit-BDQzzsBU.d.ts → policy-edit-nUhuFtLF.d.ts} +2 -2
- package/dist/{pre-registration-Dzg61IQA.d.ts → pre-registration-CUOSGAZK.d.ts} +45 -12
- package/dist/product-benchmark/index.d.ts +104 -1
- package/dist/product-benchmark/index.js +15 -1
- package/dist/{provenance-BhJm32vN.d.ts → provenance-B2VsP0jP.d.ts} +20 -4
- package/dist/{query-B7GGjRox.d.ts → query-0aTmbmQe.d.ts} +1 -0
- package/dist/{release-report-BQ1Ziyu-.d.ts → release-report-DkaCZ9k4.d.ts} +5 -2
- package/dist/reporting.d.ts +6 -6
- package/dist/reporting.js +4 -4
- package/dist/{researcher-B_ODTAJs.d.ts → researcher-SDAezfML.d.ts} +2 -2
- package/dist/rl.d.ts +9 -9
- package/dist/rl.js +7 -7
- package/dist/{rubric-predictive-validity-0MdjTt8R.d.ts → rubric-predictive-validity-ZGIlJNce.d.ts} +1 -1
- package/dist/{run-campaign-3NWW5PLF.js → run-campaign-DAHKO5CT.js} +3 -3
- package/dist/{run-record-MRdJ-Kq2.d.ts → run-record-CPfd1ARZ.d.ts} +3 -0
- package/dist/{runtime-trajectory-8w0_jmtR.d.ts → runtime-trajectory-DZ8ei-Jo.d.ts} +1 -1
- package/dist/{semantic-concept-judge-D-IlH5v1.d.ts → semantic-concept-judge-C6mDEBIo.d.ts} +3 -3
- package/dist/{statistics-xP-cWc5k.d.ts → statistics-D88peojY.d.ts} +1 -1
- package/dist/{summary-report-C0nnxOD8.d.ts → summary-report-Fc_YFJat.d.ts} +1 -1
- package/dist/traces.d.ts +2 -2
- package/dist/traces.js +4 -4
- package/dist/{types-DFI_Z-ZL.d.ts → types-Bihq6-a3.d.ts} +1 -1
- package/dist/{types-Dz9cKF0g.d.ts → types-DA9yj-Jd.d.ts} +1 -1
- package/dist/workflow/index.d.ts +7 -7
- package/dist/workflow/index.js +3 -3
- package/package.json +1 -1
- package/dist/chunk-63MBSQTX.js +0 -350
- package/dist/chunk-63MBSQTX.js.map +0 -1
- package/dist/chunk-ABOIVNXL.js.map +0 -1
- package/dist/chunk-CMJSTXUR.js.map +0 -1
- package/dist/chunk-QIT2XZ4E.js.map +0 -1
- package/dist/chunk-UFSG7ACU.js.map +0 -1
- package/dist/chunk-YLKDN7JV.js.map +0 -1
- package/dist/chunk-Z3FLN24V.js.map +0 -1
- /package/dist/{chunk-7RBJANJD.js.map → chunk-3722PKPB.js.map} +0 -0
- /package/dist/{chunk-6FIAJHCU.js.map → chunk-6YVAN6R3.js.map} +0 -0
- /package/dist/{chunk-B2TMQM62.js.map → chunk-BHCFJGL4.js.map} +0 -0
- /package/dist/{chunk-IH7LYRHL.js.map → chunk-BXZVBX3D.js.map} +0 -0
- /package/dist/{chunk-6GT4NI4V.js.map → chunk-CLS3374R.js.map} +0 -0
- /package/dist/{chunk-2NSLDY4B.js.map → chunk-J5MUFXEY.js.map} +0 -0
- /package/dist/{chunk-IN3SHQML.js.map → chunk-LMSQ6EFA.js.map} +0 -0
- /package/dist/{chunk-AIGWQEME.js.map → chunk-LOZOZYHU.js.map} +0 -0
- /package/dist/{chunk-NF7OZ4J7.js.map → chunk-QCBB6ZIU.js.map} +0 -0
- /package/dist/{chunk-JU6ZX3CX.js.map → chunk-SMCACT4Z.js.map} +0 -0
- /package/dist/{chunk-6Q2DYRWV.js.map → chunk-TCPP4Z5Q.js.map} +0 -0
- /package/dist/{run-campaign-3NWW5PLF.js.map → run-campaign-DAHKO5CT.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/product-benchmark/index.ts","../src/product-benchmark/export.ts"],"sourcesContent":["import { existsSync, readFileSync, statSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { ValidationError } from '../errors'\n\nexport const productBenchmarkSplits = ['practice', 'dev', 'holdout', 'safety', 'sentinel'] as const\n\nexport type ProductBenchmarkSplit = (typeof productBenchmarkSplits)[number]\n\nexport interface ProductBenchmarkRepoRef {\n readonly url: string\n readonly commit: string\n readonly branch: string\n}\n\nexport interface ProductBenchmarkSubstrateVersions {\n readonly agentEval: string\n readonly agentRuntime: string\n readonly agentInterface: string\n readonly sandbox: string\n readonly agentBench?: string\n}\n\nexport interface ProductBenchmarkProfileRef {\n readonly id: string\n readonly profileHash: string\n readonly agentProfilePath: string\n}\n\nexport interface ProductBenchmarkArm {\n readonly id: string\n readonly profileId: string\n readonly mutableSurfaces: readonly string[]\n readonly policyAxes: Record<string, unknown>\n}\n\nexport interface ProductBenchmarkScenario {\n readonly id: string\n readonly split: ProductBenchmarkSplit\n readonly tags: readonly string[]\n readonly sourceAllowedForSynthesis: boolean\n}\n\nexport interface ProductBenchmarkBudgets {\n readonly maxUsd: number\n readonly maxCells: number\n readonly maxWallMs: number\n}\n\nexport interface ProductBenchmarkManifest {\n readonly schemaVersion: 1\n readonly projectId: string\n readonly benchmarkId: string\n readonly repo: ProductBenchmarkRepoRef\n readonly substrate: ProductBenchmarkSubstrateVersions\n readonly profiles: readonly ProductBenchmarkProfileRef[]\n readonly arms: readonly ProductBenchmarkArm[]\n readonly scenarios: readonly ProductBenchmarkScenario[]\n readonly budgets: ProductBenchmarkBudgets\n readonly expectedArtifactDir: string\n}\n\nexport interface AgentProfileRuntimeReceipt {\n readonly model: string\n readonly harness: string\n readonly backend: string\n readonly reasoningEffort?: string\n}\n\nexport type RuntimeResolution = AgentProfileRuntimeReceipt\n\nexport interface ProductBenchmarkRecord {\n readonly schemaVersion: 1\n readonly projectId: string\n readonly benchmarkId: string\n readonly runId: string\n readonly scenarioId: string\n readonly split: ProductBenchmarkSplit\n readonly armId: string\n readonly rep: number\n readonly agentProfile: {\n readonly id: string\n readonly hash: string\n readonly path: string\n readonly declared: RuntimeResolution\n readonly resolved: RuntimeResolution\n }\n readonly model: {\n readonly provider: string\n readonly id: string\n }\n readonly backend: {\n readonly kind: string\n readonly version: string\n }\n readonly outcome: {\n readonly pass: boolean\n readonly score: number\n readonly dimensions: Record<string, number>\n readonly failureMode: string | null\n }\n readonly usage: {\n readonly inputTokens: number\n readonly outputTokens: number\n readonly costUsd: number\n readonly wallMs: number\n readonly toolCalls: number\n }\n readonly integrity: {\n readonly realBackend: boolean\n readonly rawCapture: boolean\n readonly traceCapture: boolean\n readonly noStubRows: boolean\n readonly priced: boolean\n readonly profileMaterialized: boolean\n }\n readonly artifacts: {\n readonly records: string\n readonly traces: string\n readonly raws: string\n readonly scores: string\n readonly workspace: string\n }\n}\n\nexport interface ProductBenchmarkRunInput {\n readonly manifestPath: string\n readonly recordsPath: string\n readonly artifactRoot?: string\n readonly checkArtifacts?: boolean\n}\n\nexport interface ProductBenchmarkValidationReport {\n readonly manifestPath: string\n readonly recordsPath: string\n readonly records: number\n /** Manifest repo fields that are empty or the `'unknown'` export sentinel. */\n readonly repoFailures: readonly string[]\n /** Manifest substrate versions that are empty or the `'unknown'` export\n * sentinel — a bundle without substrate identity is not reproducible. */\n readonly substrateFailures: readonly string[]\n readonly projects: readonly string[]\n readonly benchmarks: readonly string[]\n readonly arms: readonly string[]\n readonly scenarios: readonly string[]\n readonly passed: number\n readonly failed: number\n readonly inputTokens: number\n readonly outputTokens: number\n readonly costUsd: number\n readonly wallMs: number\n readonly integrityFailures: readonly string[]\n readonly missingArtifacts: readonly string[]\n}\n\nexport interface ProductBenchmarkArtifactPaths {\n readonly manifestPath: string\n readonly recordsPath: string\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction fail(path: string, message: string): never {\n throw new ValidationError(`${path}: ${message}`)\n}\n\nfunction wrapValidationError(path: string, err: unknown): never {\n if (err instanceof ValidationError) {\n throw new ValidationError(`${path}: ${err.message}`, { cause: err })\n }\n throw new ValidationError(`${path}: ${err instanceof Error ? err.message : String(err)}`, {\n cause: err,\n })\n}\n\nfunction expectObject(value: unknown, path: string): Record<string, unknown> {\n if (!isObject(value)) fail(path, 'must be an object')\n return value\n}\n\nfunction expectString(value: unknown, path: string): string {\n if (typeof value !== 'string' || value.trim().length === 0)\n fail(path, 'must be a non-empty string')\n return value\n}\n\nfunction expectBoolean(value: unknown, path: string): boolean {\n if (typeof value !== 'boolean') fail(path, 'must be a boolean')\n return value\n}\n\nfunction expectNumber(\n value: unknown,\n path: string,\n opts: { readonly min?: number; readonly max?: number; readonly integer?: boolean } = {},\n): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) fail(path, 'must be a finite number')\n if (opts.integer && !Number.isInteger(value)) fail(path, 'must be an integer')\n if (opts.min !== undefined && value < opts.min) fail(path, `must be >= ${opts.min}`)\n if (opts.max !== undefined && value > opts.max) fail(path, `must be <= ${opts.max}`)\n return value\n}\n\nfunction expectStringArray(value: unknown, path: string): string[] {\n if (!Array.isArray(value)) fail(path, 'must be an array')\n return value.map((entry, index) => expectString(entry, `${path}[${index}]`))\n}\n\nfunction expectObjectArray(value: unknown, path: string): Record<string, unknown>[] {\n if (!Array.isArray(value)) fail(path, 'must be an array')\n return value.map((entry, index) => expectObject(entry, `${path}[${index}]`))\n}\n\nfunction expectSplit(value: unknown, path: string): ProductBenchmarkSplit {\n const split = expectString(value, path)\n if (!productBenchmarkSplits.includes(split as ProductBenchmarkSplit)) {\n fail(path, `must be one of ${productBenchmarkSplits.join(', ')}`)\n }\n return split as ProductBenchmarkSplit\n}\n\nfunction optionalString(value: unknown, path: string): string | undefined {\n if (value === undefined) return undefined\n return expectString(value, path)\n}\n\nfunction expectDimensions(value: unknown, path: string): Record<string, number> {\n const obj = expectObject(value, path)\n const out: Record<string, number> = {}\n for (const [key, raw] of Object.entries(obj)) out[key] = expectNumber(raw, `${path}.${key}`)\n return out\n}\n\nfunction expectRuntimeResolution(value: unknown, path: string): RuntimeResolution {\n const obj = expectObject(value, path)\n return {\n model: expectString(obj.model, `${path}.model`),\n harness: expectString(obj.harness, `${path}.harness`),\n backend: expectString(obj.backend, `${path}.backend`),\n ...(obj.reasoningEffort !== undefined\n ? { reasoningEffort: optionalString(obj.reasoningEffort, `${path}.reasoningEffort`) }\n : {}),\n }\n}\n\nexport function validateProductBenchmarkManifest(value: unknown): ProductBenchmarkManifest {\n const obj = expectObject(value, 'manifest')\n if (obj.schemaVersion !== 1) fail('manifest.schemaVersion', 'must be 1')\n const repo = expectObject(obj.repo, 'manifest.repo')\n const substrate = expectObject(obj.substrate, 'manifest.substrate')\n const profiles = expectObjectArray(obj.profiles, 'manifest.profiles').map((profile, index) => ({\n id: expectString(profile.id, `manifest.profiles[${index}].id`),\n profileHash: expectString(profile.profileHash, `manifest.profiles[${index}].profileHash`),\n agentProfilePath: expectString(\n profile.agentProfilePath,\n `manifest.profiles[${index}].agentProfilePath`,\n ),\n }))\n const arms = expectObjectArray(obj.arms, 'manifest.arms').map((arm, index) => ({\n id: expectString(arm.id, `manifest.arms[${index}].id`),\n profileId: expectString(arm.profileId, `manifest.arms[${index}].profileId`),\n mutableSurfaces: expectStringArray(\n arm.mutableSurfaces,\n `manifest.arms[${index}].mutableSurfaces`,\n ),\n policyAxes: expectObject(arm.policyAxes, `manifest.arms[${index}].policyAxes`),\n }))\n const scenarios = expectObjectArray(obj.scenarios, 'manifest.scenarios').map(\n (scenario, index) => ({\n id: expectString(scenario.id, `manifest.scenarios[${index}].id`),\n split: expectSplit(scenario.split, `manifest.scenarios[${index}].split`),\n tags: expectStringArray(scenario.tags, `manifest.scenarios[${index}].tags`),\n sourceAllowedForSynthesis: expectBoolean(\n scenario.sourceAllowedForSynthesis,\n `manifest.scenarios[${index}].sourceAllowedForSynthesis`,\n ),\n }),\n )\n const budgets = expectObject(obj.budgets, 'manifest.budgets')\n if (profiles.length === 0) fail('manifest.profiles', 'must contain at least one profile')\n if (arms.length === 0) fail('manifest.arms', 'must contain at least one arm')\n if (scenarios.length === 0) fail('manifest.scenarios', 'must contain at least one scenario')\n assertUnique(\n profiles.map((profile) => profile.id),\n 'manifest.profiles.id',\n )\n assertUnique(\n arms.map((arm) => arm.id),\n 'manifest.arms.id',\n )\n assertUnique(\n scenarios.map((scenario) => scenario.id),\n 'manifest.scenarios.id',\n )\n const profileIds = new Set(profiles.map((profile) => profile.id))\n for (const arm of arms) {\n if (!profileIds.has(arm.profileId))\n fail(`manifest.arms.${arm.id}.profileId`, `unknown profile ${arm.profileId}`)\n }\n return {\n schemaVersion: 1,\n projectId: expectString(obj.projectId, 'manifest.projectId'),\n benchmarkId: expectString(obj.benchmarkId, 'manifest.benchmarkId'),\n repo: {\n url: expectString(repo.url, 'manifest.repo.url'),\n commit: expectString(repo.commit, 'manifest.repo.commit'),\n branch: expectString(repo.branch, 'manifest.repo.branch'),\n },\n substrate: {\n agentEval: expectString(substrate.agentEval, 'manifest.substrate.agentEval'),\n agentRuntime: expectString(substrate.agentRuntime, 'manifest.substrate.agentRuntime'),\n agentInterface: expectString(substrate.agentInterface, 'manifest.substrate.agentInterface'),\n sandbox: expectString(substrate.sandbox, 'manifest.substrate.sandbox'),\n ...(substrate.agentBench !== undefined\n ? { agentBench: expectString(substrate.agentBench, 'manifest.substrate.agentBench') }\n : {}),\n },\n profiles,\n arms,\n scenarios,\n budgets: {\n maxUsd: expectNumber(budgets.maxUsd, 'manifest.budgets.maxUsd', { min: 0 }),\n maxCells: expectNumber(budgets.maxCells, 'manifest.budgets.maxCells', {\n min: 0,\n integer: true,\n }),\n maxWallMs: expectNumber(budgets.maxWallMs, 'manifest.budgets.maxWallMs', {\n min: 0,\n integer: true,\n }),\n },\n expectedArtifactDir: expectString(obj.expectedArtifactDir, 'manifest.expectedArtifactDir'),\n }\n}\n\nexport function validateProductBenchmarkRecord(value: unknown): ProductBenchmarkRecord {\n const obj = expectObject(value, 'record')\n if (obj.schemaVersion !== 1) fail('record.schemaVersion', 'must be 1')\n const agentProfile = expectObject(obj.agentProfile, 'record.agentProfile')\n const model = expectObject(obj.model, 'record.model')\n const backend = expectObject(obj.backend, 'record.backend')\n const outcome = expectObject(obj.outcome, 'record.outcome')\n const usage = expectObject(obj.usage, 'record.usage')\n const integrity = expectObject(obj.integrity, 'record.integrity')\n const artifacts = expectObject(obj.artifacts, 'record.artifacts')\n const record: ProductBenchmarkRecord = {\n schemaVersion: 1,\n projectId: expectString(obj.projectId, 'record.projectId'),\n benchmarkId: expectString(obj.benchmarkId, 'record.benchmarkId'),\n runId: expectString(obj.runId, 'record.runId'),\n scenarioId: expectString(obj.scenarioId, 'record.scenarioId'),\n split: expectSplit(obj.split, 'record.split'),\n armId: expectString(obj.armId, 'record.armId'),\n rep: expectNumber(obj.rep, 'record.rep', { min: 1, integer: true }),\n agentProfile: {\n id: expectString(agentProfile.id, 'record.agentProfile.id'),\n hash: expectString(agentProfile.hash, 'record.agentProfile.hash'),\n path: expectString(agentProfile.path, 'record.agentProfile.path'),\n declared: expectRuntimeResolution(agentProfile.declared, 'record.agentProfile.declared'),\n resolved: expectRuntimeResolution(agentProfile.resolved, 'record.agentProfile.resolved'),\n },\n model: {\n provider: expectString(model.provider, 'record.model.provider'),\n id: expectString(model.id, 'record.model.id'),\n },\n backend: {\n kind: expectString(backend.kind, 'record.backend.kind'),\n version: expectString(backend.version, 'record.backend.version'),\n },\n outcome: {\n pass: expectBoolean(outcome.pass, 'record.outcome.pass'),\n score: expectNumber(outcome.score, 'record.outcome.score', { min: 0, max: 1 }),\n dimensions: expectDimensions(outcome.dimensions, 'record.outcome.dimensions'),\n failureMode:\n outcome.failureMode === null\n ? null\n : expectString(outcome.failureMode, 'record.outcome.failureMode'),\n },\n usage: {\n inputTokens: expectNumber(usage.inputTokens, 'record.usage.inputTokens', {\n min: 0,\n integer: true,\n }),\n outputTokens: expectNumber(usage.outputTokens, 'record.usage.outputTokens', {\n min: 0,\n integer: true,\n }),\n costUsd: expectNumber(usage.costUsd, 'record.usage.costUsd', { min: 0 }),\n wallMs: expectNumber(usage.wallMs, 'record.usage.wallMs', { min: 0, integer: true }),\n toolCalls: expectNumber(usage.toolCalls, 'record.usage.toolCalls', { min: 0, integer: true }),\n },\n integrity: {\n realBackend: expectBoolean(integrity.realBackend, 'record.integrity.realBackend'),\n rawCapture: expectBoolean(integrity.rawCapture, 'record.integrity.rawCapture'),\n traceCapture: expectBoolean(integrity.traceCapture, 'record.integrity.traceCapture'),\n noStubRows: expectBoolean(integrity.noStubRows, 'record.integrity.noStubRows'),\n priced: expectBoolean(integrity.priced, 'record.integrity.priced'),\n profileMaterialized: expectBoolean(\n integrity.profileMaterialized,\n 'record.integrity.profileMaterialized',\n ),\n },\n artifacts: {\n records: expectString(artifacts.records, 'record.artifacts.records'),\n traces: expectString(artifacts.traces, 'record.artifacts.traces'),\n raws: expectString(artifacts.raws, 'record.artifacts.raws'),\n scores: expectString(artifacts.scores, 'record.artifacts.scores'),\n workspace: expectString(artifacts.workspace, 'record.artifacts.workspace'),\n },\n }\n if (record.integrity.realBackend && record.usage.inputTokens + record.usage.outputTokens === 0) {\n fail('record.usage', 'realBackend rows must carry non-zero token usage')\n }\n return record\n}\n\nexport function productBenchmarkIntegrityFailures(record: ProductBenchmarkRecord): string[] {\n const failures: string[] = []\n for (const [key, value] of Object.entries(record.integrity)) {\n if (!value) failures.push(`${record.runId}:${key}=false`)\n }\n return failures\n}\n\nexport function readProductBenchmarkRecords(path: string): ProductBenchmarkRecord[] {\n const lines = readFileSync(path, 'utf8')\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean)\n const records: ProductBenchmarkRecord[] = []\n for (const [index, line] of lines.entries()) {\n try {\n records.push(validateProductBenchmarkRecord(JSON.parse(line)))\n } catch (err) {\n wrapValidationError(`${path}:${index + 1}`, err)\n }\n }\n return records\n}\n\nexport function readProductBenchmarkManifest(path: string): ProductBenchmarkManifest {\n try {\n return validateProductBenchmarkManifest(JSON.parse(readFileSync(path, 'utf8')))\n } catch (err) {\n wrapValidationError(path, err)\n }\n}\n\nexport function validateProductBenchmarkRun(\n input: ProductBenchmarkRunInput,\n): ProductBenchmarkValidationReport {\n const manifest = readProductBenchmarkManifest(input.manifestPath)\n const records = readProductBenchmarkRecords(input.recordsPath)\n const manifestProjectBench = `${manifest.projectId}/${manifest.benchmarkId}`\n const integrityFailures = records.flatMap(productBenchmarkIntegrityFailures)\n const missingArtifacts =\n input.checkArtifacts === false\n ? []\n : records.flatMap((record) =>\n missingArtifactsForRecord(record, input.artifactRoot ?? dirname(input.recordsPath)),\n )\n for (const [index, record] of records.entries()) {\n const recordProjectBench = `${record.projectId}/${record.benchmarkId}`\n if (recordProjectBench !== manifestProjectBench) {\n fail(\n `records[${index}]`,\n `project/benchmark ${recordProjectBench} does not match manifest ${manifestProjectBench}`,\n )\n }\n if (!manifest.arms.some((arm) => arm.id === record.armId))\n fail(`records[${index}].armId`, `unknown arm ${record.armId}`)\n if (!manifest.scenarios.some((scenario) => scenario.id === record.scenarioId)) {\n fail(`records[${index}].scenarioId`, `unknown scenario ${record.scenarioId}`)\n }\n }\n const repoFailures = (['url', 'commit', 'branch'] as const)\n .filter((key) => manifest.repo[key].trim().length === 0 || manifest.repo[key] === 'unknown')\n .map((key) => `manifest.repo.${key}`)\n const substrateFailures = (['agentEval', 'agentRuntime', 'agentInterface', 'sandbox'] as const)\n .filter(\n (key) => manifest.substrate[key].trim().length === 0 || manifest.substrate[key] === 'unknown',\n )\n .map((key) => `manifest.substrate.${key}`)\n return {\n manifestPath: input.manifestPath,\n recordsPath: input.recordsPath,\n records: records.length,\n repoFailures,\n substrateFailures,\n projects: sortedUnique(records.map((record) => record.projectId)),\n benchmarks: sortedUnique(records.map((record) => record.benchmarkId)),\n arms: sortedUnique(records.map((record) => record.armId)),\n scenarios: sortedUnique(records.map((record) => record.scenarioId)),\n passed: records.filter((record) => record.outcome.pass).length,\n failed: records.filter((record) => !record.outcome.pass).length,\n inputTokens: sum(records, (record) => record.usage.inputTokens),\n outputTokens: sum(records, (record) => record.usage.outputTokens),\n costUsd: sum(records, (record) => record.usage.costUsd),\n wallMs: sum(records, (record) => record.usage.wallMs),\n integrityFailures,\n missingArtifacts,\n }\n}\n\nfunction missingArtifactsForRecord(record: ProductBenchmarkRecord, artifactRoot: string): string[] {\n const missing: string[] = []\n for (const [key, value] of Object.entries(record.artifacts)) {\n const path = resolveArtifactPath(value, artifactRoot)\n if (!existsSync(path)) missing.push(`${record.runId}:${key}:${value}`)\n }\n return missing\n}\n\nfunction resolveArtifactPath(value: string, artifactRoot: string): string {\n return value.startsWith('/') ? value : join(artifactRoot, value)\n}\n\nfunction assertUnique(values: readonly string[], path: string): void {\n const seen = new Set<string>()\n for (const value of values) {\n if (seen.has(value)) fail(path, `duplicate ${value}`)\n seen.add(value)\n }\n}\n\nfunction sortedUnique(values: readonly string[]): string[] {\n return [...new Set(values)].sort()\n}\n\nfunction sum<T>(items: readonly T[], fn: (item: T) => number): number {\n return items.reduce((total, item) => total + fn(item), 0)\n}\n\nexport function findProductBenchmarkArtifacts(\n runDir: string,\n): ProductBenchmarkArtifactPaths | null {\n const manifestPath = join(runDir, 'product-benchmark-manifest.json')\n const recordsPath = join(runDir, 'product-benchmark-records.jsonl')\n if (\n existsSync(manifestPath) &&\n statSync(manifestPath).isFile() &&\n existsSync(recordsPath) &&\n statSync(recordsPath).isFile()\n ) {\n return { manifestPath, recordsPath }\n }\n return null\n}\n\n/**\n * Fail-loud gate over a bundle directory: locates the manifest + records,\n * runs `validateProductBenchmarkRun`, and throws with every repo,\n * integrity, and artifact failure listed. Returns the report when clean.\n */\nexport function assertProductBenchmarkRun(runDir: string): ProductBenchmarkValidationReport {\n const artifacts = findProductBenchmarkArtifacts(runDir)\n if (!artifacts) {\n fail(runDir, 'missing product-benchmark-manifest.json or product-benchmark-records.jsonl')\n }\n const report = validateProductBenchmarkRun({ ...artifacts, artifactRoot: runDir })\n const failures = [\n ...report.repoFailures,\n ...report.substrateFailures,\n ...report.integrityFailures,\n ...report.missingArtifacts,\n ]\n if (failures.length > 0) {\n fail(runDir, `product benchmark validation failed:\\n${failures.join('\\n')}`)\n }\n return report\n}\n\nexport type {\n ProductBenchmarkExportOptions,\n ProductBenchmarkExportResult,\n ProductBenchmarkSingleRunExportOptions,\n} from './export'\nexport {\n buildProductBenchmarkManifest,\n exportProductBenchmark,\n exportProductBenchmarkRuns,\n productBenchmarkMutableSurfaces,\n productBenchmarkRepoIdentity,\n runRecordToProductBenchmarkRecord,\n} from './export'\n","/**\n * Export side of the product benchmark bundle contract: convert product\n * eval run directories (`records.jsonl` of `RunRecord` rows + trace/raw\n * artifacts) into a portable `product-benchmark-manifest.json` +\n * `product-benchmark-records.jsonl` bundle that\n * `validateProductBenchmarkRun` accepts.\n *\n * Product-specific policy (safety-split detection, tool-call recovery,\n * profile id fallback, artifact materialization) enters through explicit\n * options; everything else is the shared union of the tax/legal/creative\n * exporters. Scenario catalogs, smoke runners, and CLIs stay in the\n * products.\n *\n * Input rows are checked structurally, not with `validateRunRecord`:\n * product harnesses record bare model aliases and partial provenance, and\n * the bundle contract's own validators re-check every field that matters\n * on the way out.\n */\n\nimport { spawnSync } from 'node:child_process'\nimport { createHash } from 'node:crypto'\nimport { cpSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { basename, dirname, isAbsolute, join, relative, resolve } from 'node:path'\nimport { ValidationError } from '../errors'\nimport type { RunRecord } from '../run-record'\nimport type {\n ProductBenchmarkManifest,\n ProductBenchmarkRecord,\n ProductBenchmarkSplit,\n RuntimeResolution,\n} from './index'\nimport { validateProductBenchmarkManifest, validateProductBenchmarkRecord } from './index'\n\n/** Full mutable-surface superset a product arm may declare. */\nexport const productBenchmarkMutableSurfaces = [\n 'prompt',\n 'resources.files',\n 'tools',\n 'mcp',\n 'hooks',\n 'subagents',\n] as const\n\nexport interface ProductBenchmarkExportOptions {\n /** Source eval run directories, each containing a `records.jsonl` of RunRecord rows. */\n readonly runDirs: readonly string[]\n /** Destination directory for the bundle (manifest + records + materialized source runs). */\n readonly outDir: string\n readonly projectId: string\n readonly benchmarkId: string\n /** Repo-relative path of the product's canonical agent profile source. */\n readonly agentProfilePath: string\n /** Pass threshold applied when a row carries no explicit `outcome.raw.pass`. Default 0.7. */\n readonly passThreshold?: number\n /**\n * First scenario tag. Defaults to `projectId` with a trailing `-agent`\n * stripped (`tax-agent` → `tax`), matching the product exporters.\n */\n readonly scenarioTagPrefix?: string\n /** Profile id used when a row has no `agentProfile.profileId`. Defaults to the row's arm id. */\n readonly fallbackProfileId?: string\n /** Arm mutable surfaces recorded in the manifest. Defaults to the full superset. */\n readonly mutableSurfaces?: readonly string[]\n /**\n * Copy each run dir into `<outDir>/source-runs/` and record\n * bundle-relative artifact paths (portable, self-contained). When false,\n * artifacts keep absolute paths into the original run dirs. Default true.\n */\n readonly materializeSourceRuns?: boolean\n /**\n * Override split classification for a row. Return undefined to fall back\n * to the default (`outcome.raw.safety === 1` → safety, then splitTag).\n */\n readonly classifySplit?: (record: RunRecord) => ProductBenchmarkSplit | undefined\n /** Recovers a tool-call count when the row's raw bag carries none (e.g. from turn artifacts). */\n readonly toolCallFallback?: (record: RunRecord, runDir: string) => number\n /** Backend version recorded per row. Defaults to the cwd package.json's `@tangle-network/sandbox` range. */\n readonly backendVersion?: string\n /**\n * Explicit substrate versions for the manifest, merged over what the cwd\n * package.json / node_modules resolve. Use when a substrate package is not\n * installed where the export runs — the validator refuses an `'unknown'`\n * version, so provide the real one rather than shipping the sentinel.\n */\n readonly substrate?: Partial<ProductBenchmarkManifest['substrate']>\n}\n\nexport interface ProductBenchmarkSingleRunExportOptions\n extends Omit<ProductBenchmarkExportOptions, 'runDirs'> {\n readonly runDir: string\n}\n\nexport interface ProductBenchmarkExportResult {\n readonly manifestPath: string\n readonly recordsPath: string\n readonly records: number\n}\n\ninterface ResolvedExportOptions {\n readonly projectId: string\n readonly benchmarkId: string\n readonly agentProfilePath: string\n readonly passThreshold: number\n readonly scenarioTagPrefix: string\n readonly fallbackProfileId?: string\n readonly mutableSurfaces: readonly string[]\n readonly classifySplit?: (record: RunRecord) => ProductBenchmarkSplit | undefined\n readonly toolCallFallback?: (record: RunRecord, runDir: string) => number\n readonly backendVersion: string\n}\n\n// ── Provenance helpers ───────────────────────────────────────────────\n\nfunction sha256(value: string): string {\n return `sha256:${createHash('sha256').update(value).digest('hex')}`\n}\n\nfunction safePathPart(value: string): string {\n return (\n value\n .replace(/[^a-zA-Z0-9_.-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 80) || 'artifact'\n )\n}\n\nfunction git(args: readonly string[], fallback: string): string {\n const res = spawnSync('git', args, { cwd: process.cwd(), encoding: 'utf8' })\n const value = res.status === 0 ? res.stdout.trim() : ''\n return value.length > 0 ? value : fallback\n}\n\nfunction knownEnv(name: string): string | undefined {\n const value = process.env[name]?.trim()\n return value && value !== 'unknown' ? value : undefined\n}\n\nfunction ciBranchName(): string | undefined {\n const direct =\n knownEnv('GITHUB_HEAD_REF') ?? knownEnv('GITHUB_REF_NAME') ?? knownEnv('VERCEL_GIT_COMMIT_REF')\n if (direct) return direct\n const ref = knownEnv('GITHUB_REF')\n return ref?.startsWith('refs/heads/') ? ref.slice('refs/heads/'.length) : undefined\n}\n\nfunction repoBranch(): string {\n const ci = ciBranchName()\n if (ci) return ci\n const branch = git(['branch', '--show-current'], '')\n if (branch) return branch\n const name = git(['name-rev', '--name-only', '--exclude=tags/*', 'HEAD'], '')\n if (name && name !== 'undefined') return name\n return `detached:${git(['rev-parse', '--short', 'HEAD'], 'unknown')}`\n}\n\n/** Repo identity from the exporting process's cwd. `'unknown'` values are flagged by `validateProductBenchmarkRun`. */\nexport function productBenchmarkRepoIdentity(): ProductBenchmarkManifest['repo'] {\n return {\n url: git(['config', '--get', 'remote.origin.url'], 'unknown'),\n commit: git(['rev-parse', 'HEAD'], 'unknown'),\n branch: repoBranch(),\n }\n}\n\n/** The declared range from the cwd package.json when present, else the\n * INSTALLED version read from node_modules (covers transitive installs —\n * a product that gets sandbox via agent-runtime still records real\n * provenance), else the `'unknown'` sentinel the validator refuses. */\nfunction packageVersion(name: string): string {\n const pkg = JSON.parse(readFileSync(resolve('package.json'), 'utf8')) as {\n name?: string\n version?: string\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n }\n if (pkg.name === name && pkg.version) return pkg.version\n const declared = pkg.dependencies?.[name] ?? pkg.devDependencies?.[name]\n if (declared) return declared\n const installed = resolve('node_modules', name, 'package.json')\n if (existsSync(installed)) {\n const installedPkg = JSON.parse(readFileSync(installed, 'utf8')) as { version?: string }\n if (installedPkg.version) return installedPkg.version\n }\n return 'unknown'\n}\n\n// ── Run record ingestion ─────────────────────────────────────────────\n\nfunction readRunRecords(path: string): RunRecord[] {\n const lines = readFileSync(path, 'utf8')\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean)\n return lines.map((line, index) => {\n let parsed: unknown\n try {\n parsed = JSON.parse(line)\n } catch (err) {\n throw new ValidationError(\n `${path}:${index + 1}: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err },\n )\n }\n return expectRunRecordShape(parsed, `${path}:${index + 1}`)\n })\n}\n\nfunction expectRunRecordShape(value: unknown, path: string): RunRecord {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new ValidationError(`${path}: run record must be an object`)\n }\n const obj = value as Record<string, unknown>\n for (const key of ['runId', 'model'] as const) {\n if (typeof obj[key] !== 'string' || obj[key].length === 0) {\n throw new ValidationError(`${path}: run record ${key} must be a non-empty string`)\n }\n }\n for (const key of ['costUsd', 'wallMs'] as const) {\n if (typeof obj[key] !== 'number' || !Number.isFinite(obj[key])) {\n throw new ValidationError(`${path}: run record ${key} must be a finite number`)\n }\n }\n const tokenUsage = obj.tokenUsage as Record<string, unknown> | undefined\n if (\n !tokenUsage ||\n typeof tokenUsage.input !== 'number' ||\n typeof tokenUsage.output !== 'number'\n ) {\n throw new ValidationError(`${path}: run record tokenUsage.input/output must be numbers`)\n }\n const outcome = obj.outcome as Record<string, unknown> | undefined\n if (!outcome || !outcome.raw || typeof outcome.raw !== 'object') {\n throw new ValidationError(`${path}: run record outcome.raw must be an object`)\n }\n return value as RunRecord\n}\n\n// ── Row mapping ──────────────────────────────────────────────────────\n\nfunction clamp01(value: number): number {\n return Math.max(0, Math.min(1, value))\n}\n\nfunction splitOf(record: RunRecord, opts: ResolvedExportOptions): ProductBenchmarkSplit {\n const custom = opts.classifySplit?.(record)\n if (custom) return custom\n if ((record.outcome.raw as Record<string, number>).safety === 1) return 'safety'\n if (record.splitTag === 'holdout') return 'holdout'\n if (record.splitTag === 'dev') return 'dev'\n return 'practice'\n}\n\nfunction scoreOf(record: RunRecord): number {\n const score = record.outcome.holdoutScore ?? record.outcome.searchScore\n if (typeof score === 'number' && Number.isFinite(score)) return clamp01(score)\n const rawScore = record.outcome.raw.score ?? record.outcome.raw.composite\n return typeof rawScore === 'number' && Number.isFinite(rawScore) ? clamp01(rawScore) : 0\n}\n\nfunction rawPassOf(record: RunRecord): boolean | null {\n const rawPass = (record.outcome.raw as Record<string, unknown>).pass\n if (typeof rawPass === 'boolean') return rawPass\n if (typeof rawPass === 'number' && Number.isFinite(rawPass)) return rawPass >= 1\n return null\n}\n\nfunction passOf(record: RunRecord, score: number, threshold: number): boolean {\n const rawPass = rawPassOf(record)\n if (rawPass !== null) return rawPass && !record.failureMode\n return score >= threshold && !record.failureMode\n}\n\n/** A failed row always carries a failure mode; synthesized when the harness left it empty. */\nfunction failureModeOf(record: RunRecord, score: number, threshold: number): string | null {\n if (record.failureMode) return record.failureMode\n const belowThreshold = `quality-below-threshold: ${Math.round(score * 100)}% < ${Math.round(threshold * 100)}%`\n if (rawPassOf(record) === false) {\n return score < threshold ? belowThreshold : 'product-pass-failed'\n }\n if (passOf(record, score, threshold)) return null\n return belowThreshold\n}\n\nfunction numericDimensions(record: RunRecord): Record<string, number> {\n const dimensions: Record<string, number> = {}\n for (const [key, value] of Object.entries(record.outcome.raw ?? {})) {\n if (typeof value === 'number' && Number.isFinite(value)) dimensions[key] = value\n }\n if (Object.keys(dimensions).length === 0) dimensions.score = scoreOf(record)\n return dimensions\n}\n\nfunction armIdOf(record: RunRecord): string {\n if (record.candidateId) return record.candidateId\n const variant = record.agentProfile?.dimensions?.variant\n if (typeof variant === 'string' && variant.length > 0) return variant\n const variantId = record.agentProfile?.dimensions?.variantId\n if (typeof variantId === 'string' && variantId.length > 0) return variantId\n return 'production-profile'\n}\n\nfunction backendOf(record: RunRecord): string {\n const backend = record.agentProfile?.dimensions?.backend\n return typeof backend === 'string' && backend.length > 0 ? backend : 'unknown'\n}\n\nfunction modelProvider(record: RunRecord): string {\n const backend = backendOf(record)\n if (backend === 'cli-bridge') return 'cli-bridge'\n if (backend === 'sandbox') return 'router'\n if (record.model.startsWith('router/')) return 'router'\n return backend === 'unknown' ? 'router' : backend\n}\n\nfunction runtimeResolution(record: RunRecord, opts: ResolvedExportOptions): RuntimeResolution {\n const reasoningEffort = record.agentProfile?.dimensions?.reasoningLevel\n return {\n model: record.agentProfile?.model ?? record.model,\n harness: record.agentProfile?.harness?.id ?? `${opts.projectId}-canonical-eval`,\n backend: backendOf(record),\n ...(typeof reasoningEffort === 'string' && reasoningEffort.length > 0\n ? { reasoningEffort }\n : {}),\n }\n}\n\nfunction sourceProfileHash(record: RunRecord): string {\n return (\n record.agentProfile?.sourceProfile?.hash ??\n record.agentProfile?.cellId ??\n sha256(\n JSON.stringify({\n candidateId: record.candidateId,\n promptHash: record.promptHash,\n configHash: record.configHash,\n }),\n )\n )\n}\n\nfunction materializedProfileHash(record: RunRecord, runtime: RuntimeResolution): string {\n return sha256(\n JSON.stringify({ sourceProfileHash: sourceProfileHash(record), model: runtime.model }),\n )\n}\n\nfunction profileIdOf(\n record: RunRecord,\n armId: string,\n runtime: RuntimeResolution,\n opts: ResolvedExportOptions,\n): string {\n const base = record.agentProfile?.profileId ?? opts.fallbackProfileId ?? armId\n const withArm = base.endsWith(`:${armId}`) ? base : `${base}:${armId}`\n return `${withArm}:${runtime.model}`\n}\n\nfunction toolCallsOf(record: RunRecord, runDir: string, opts: ResolvedExportOptions): number {\n const raw = record.outcome.raw as Record<string, unknown>\n const primary = Number(raw.tool_call_count ?? raw.tool_calls ?? raw.toolCalls ?? 0)\n if (Number.isFinite(primary) && primary > 0) return primary\n const fallback = opts.toolCallFallback?.(record, runDir)\n if (fallback !== undefined && Number.isFinite(fallback) && fallback > 0) return fallback\n return Number.isFinite(primary) ? primary : 0\n}\n\n// ── Artifact layout ──────────────────────────────────────────────────\n\nconst TRACE_CANDIDATES = ['traces.jsonl', 'traces', 'trace', 'trace-store'] as const\nconst RAW_CANDIDATES = ['raws.jsonl', 'raw-events'] as const\nconst SCORE_CANDIDATES = ['scores.json', 'manifest.json'] as const\n\nfunction firstExisting(runDir: string, candidates: readonly string[]): string {\n return candidates.find((candidate) => existsSync(join(runDir, candidate))) ?? candidates[0]!\n}\n\nfunction relativeArtifacts(runDir: string): ProductBenchmarkRecord['artifacts'] {\n return {\n records: 'records.jsonl',\n traces: firstExisting(runDir, TRACE_CANDIDATES),\n raws: firstExisting(runDir, RAW_CANDIDATES),\n scores: firstExisting(runDir, SCORE_CANDIDATES),\n workspace: existsSync(join(runDir, 'workspace')) ? 'workspace' : '.',\n }\n}\n\nfunction absoluteArtifacts(runDir: string): ProductBenchmarkRecord['artifacts'] {\n const rel = relativeArtifacts(runDir)\n return {\n records: resolve(runDir, rel.records),\n traces: resolve(runDir, rel.traces),\n raws: resolve(runDir, rel.raws),\n scores: resolve(runDir, rel.scores),\n workspace: resolve(runDir, rel.workspace),\n }\n}\n\nfunction materializeRunArtifacts(\n runDir: string,\n outDir: string,\n index: number,\n): ProductBenchmarkRecord['artifacts'] {\n if (resolve(runDir) === resolve(outDir)) return relativeArtifacts(runDir)\n const rel = relative(runDir, outDir)\n if (rel && !rel.startsWith('..') && !isAbsolute(rel)) {\n throw new ValidationError(`outDir must not be nested inside runDir: ${outDir}`)\n }\n const id = `${String(index + 1).padStart(2, '0')}-${safePathPart(basename(runDir))}-${sha256(runDir).slice(7, 19)}`\n const destRel = join('source-runs', id)\n const destAbs = join(outDir, destRel)\n mkdirSync(dirname(destAbs), { recursive: true })\n cpSync(runDir, destAbs, { recursive: true, force: true })\n const source = relativeArtifacts(runDir)\n return {\n records: join(destRel, source.records),\n traces: join(destRel, source.traces),\n raws: join(destRel, source.raws),\n scores: join(destRel, source.scores),\n workspace: source.workspace === '.' ? destRel : join(destRel, source.workspace),\n }\n}\n\nfunction existsArtifact(artifactRoot: string, value: string): boolean {\n return existsSync(resolve(artifactRoot, value))\n}\n\n// ── Record + manifest construction ───────────────────────────────────\n\n/** Map one RunRecord row to a validated product benchmark record. */\nexport function runRecordToProductBenchmarkRecord(\n record: RunRecord,\n runDir: string,\n artifactRoot: string,\n artifacts: ProductBenchmarkRecord['artifacts'],\n options: ProductBenchmarkExportOptions | ProductBenchmarkSingleRunExportOptions,\n): ProductBenchmarkRecord {\n const opts = resolveOptions(options)\n const runtime = runtimeResolution(record, opts)\n const score = scoreOf(record)\n const armId = armIdOf(record)\n const inputTokens = record.tokenUsage.input\n const outputTokens = record.tokenUsage.output\n const toolCallCount = toolCallsOf(record, runDir, opts)\n const dimensions = numericDimensions(record)\n if (!('tool_calls' in dimensions)) dimensions.tool_calls = toolCallCount\n const product: ProductBenchmarkRecord = {\n schemaVersion: 1,\n projectId: opts.projectId,\n benchmarkId: opts.benchmarkId,\n runId: record.runId,\n scenarioId: record.scenarioId ?? record.experimentId,\n split: splitOf(record, opts),\n armId,\n rep: Number(record.seed ?? 0) + 1,\n agentProfile: {\n id: profileIdOf(record, armId, runtime, opts),\n hash: materializedProfileHash(record, runtime),\n path: opts.agentProfilePath,\n declared: runtime,\n resolved: runtime,\n },\n model: { provider: modelProvider(record), id: record.model },\n backend: { kind: backendOf(record), version: opts.backendVersion },\n outcome: {\n pass: passOf(record, score, opts.passThreshold),\n score,\n dimensions,\n failureMode: failureModeOf(record, score, opts.passThreshold),\n },\n usage: {\n inputTokens,\n outputTokens,\n costUsd: record.costUsd,\n // Rounded: the bundle contract requires integer milliseconds.\n wallMs: Math.round(record.wallMs),\n toolCalls: toolCallCount,\n },\n integrity: {\n realBackend: inputTokens + outputTokens > 0,\n rawCapture: existsArtifact(artifactRoot, artifacts.raws),\n traceCapture: existsArtifact(artifactRoot, artifacts.traces),\n noStubRows: inputTokens + outputTokens > 0,\n priced: record.costUsd > 0,\n profileMaterialized: Boolean(record.agentProfile?.cellId),\n },\n artifacts,\n }\n return validateProductBenchmarkRecord(product)\n}\n\n/** One record per arm id, failing loud when records sharing an arm id\n * disagree on any attribute the manifest arm carries (profile, model,\n * backend, harness, reasoning effort) — an id-only dedup would silently\n * keep one policy and misrepresent the rest. */\nfunction uniqueArmRecords(records: readonly ProductBenchmarkRecord[]): ProductBenchmarkRecord[] {\n const byArm = new Map<string, ProductBenchmarkRecord>()\n for (const record of records) {\n const prior = byArm.get(record.armId)\n if (!prior) {\n byArm.set(record.armId, record)\n continue\n }\n const fields = [\n ['profileId', prior.agentProfile.id, record.agentProfile.id],\n ['model', prior.agentProfile.resolved.model, record.agentProfile.resolved.model],\n ['backend', prior.agentProfile.resolved.backend, record.agentProfile.resolved.backend],\n ['harness', prior.agentProfile.resolved.harness, record.agentProfile.resolved.harness],\n [\n 'reasoningEffort',\n prior.agentProfile.resolved.reasoningEffort,\n record.agentProfile.resolved.reasoningEffort,\n ],\n ] as const\n for (const [name, a, b] of fields) {\n if (a !== b) {\n throw new ValidationError(\n `records for arm '${record.armId}' disagree on ${name} (${String(a)} vs ${String(b)}) — one arm id must map to one policy`,\n )\n }\n }\n }\n return [...byArm.values()]\n}\n\n/** One record per scenario id, failing loud on a divergent split — the\n * manifest scenario carries one split, so two records disagreeing would be\n * silently misfiled. */\nfunction uniqueScenarioRecords(\n records: readonly ProductBenchmarkRecord[],\n): ProductBenchmarkRecord[] {\n const byScenario = new Map<string, ProductBenchmarkRecord>()\n for (const record of records) {\n const prior = byScenario.get(record.scenarioId)\n if (!prior) {\n byScenario.set(record.scenarioId, record)\n continue\n }\n if (prior.split !== record.split) {\n throw new ValidationError(\n `records for scenario '${record.scenarioId}' disagree on split (${prior.split} vs ${record.split})`,\n )\n }\n }\n return [...byScenario.values()]\n}\n\n/** Derive the bundle manifest from already-normalized records. */\nexport function buildProductBenchmarkManifest(\n records: readonly ProductBenchmarkRecord[],\n options: Pick<\n ProductBenchmarkExportOptions,\n 'outDir' | 'projectId' | 'benchmarkId' | 'scenarioTagPrefix' | 'mutableSurfaces' | 'substrate'\n >,\n): ProductBenchmarkManifest {\n if (records.length === 0) {\n throw new ValidationError('cannot build a product benchmark manifest from zero records')\n }\n const scenarioTagPrefix = options.scenarioTagPrefix ?? defaultScenarioTagPrefix(options.projectId)\n const mutableSurfaces = options.mutableSurfaces ?? productBenchmarkMutableSurfaces\n const byProfile = new Map<string, ProductBenchmarkManifest['profiles'][number]>()\n for (const record of records) {\n byProfile.set(record.agentProfile.id, {\n id: record.agentProfile.id,\n profileHash: record.agentProfile.hash,\n agentProfilePath: record.agentProfile.path,\n })\n }\n const manifest: ProductBenchmarkManifest = {\n schemaVersion: 1,\n projectId: options.projectId,\n benchmarkId: options.benchmarkId,\n repo: productBenchmarkRepoIdentity(),\n substrate: {\n agentEval: packageVersion('@tangle-network/agent-eval'),\n agentRuntime: packageVersion('@tangle-network/agent-runtime'),\n agentInterface: packageVersion('@tangle-network/agent-interface'),\n sandbox: packageVersion('@tangle-network/sandbox'),\n ...options.substrate,\n },\n profiles: [...byProfile.values()],\n arms: uniqueArmRecords(records).map((record) => ({\n id: record.armId,\n profileId: record.agentProfile.id,\n mutableSurfaces: [...mutableSurfaces],\n policyAxes: {\n carrier: record.armId.includes('policy') ? 'resource-file' : 'profile',\n model: record.agentProfile.resolved.model,\n backend: record.agentProfile.resolved.backend,\n harness: record.agentProfile.resolved.harness,\n ...(record.agentProfile.resolved.reasoningEffort !== undefined\n ? { reasoningEffort: record.agentProfile.resolved.reasoningEffort }\n : {}),\n },\n })),\n scenarios: uniqueScenarioRecords(records).map((record) => ({\n id: record.scenarioId,\n split: record.split,\n tags: [scenarioTagPrefix, options.benchmarkId, record.split],\n sourceAllowedForSynthesis: false,\n })),\n budgets: {\n maxUsd: records.reduce((sum, record) => sum + record.usage.costUsd, 0),\n maxCells: records.length,\n maxWallMs: records.reduce((sum, record) => sum + record.usage.wallMs, 0),\n },\n expectedArtifactDir: resolve(options.outDir),\n }\n return validateProductBenchmarkManifest(manifest)\n}\n\n// ── Entry points ─────────────────────────────────────────────────────\n\n/** Single-run convenience wrapper over `exportProductBenchmarkRuns`. */\nexport function exportProductBenchmark(\n options: ProductBenchmarkSingleRunExportOptions,\n): ProductBenchmarkExportResult {\n const { runDir, ...rest } = options\n return exportProductBenchmarkRuns({ ...rest, runDirs: [runDir] })\n}\n\n/**\n * Export one or more product eval run dirs into a validated product\n * benchmark bundle at `outDir`. Both the manifest and every record are\n * run through the contract validators before anything is written.\n */\nexport function exportProductBenchmarkRuns(\n options: ProductBenchmarkExportOptions,\n): ProductBenchmarkExportResult {\n const opts = resolveOptions(options)\n const outDir = resolve(options.outDir)\n const runDirs = options.runDirs.map((runDir) => resolve(runDir))\n if (runDirs.length === 0) throw new ValidationError('export requires at least one run directory')\n const materialize = options.materializeSourceRuns !== false\n const rows = runDirs.flatMap((runDir) => {\n const sourceRecordsPath = join(runDir, 'records.jsonl')\n if (!existsSync(sourceRecordsPath)) throw new ValidationError(`missing ${sourceRecordsPath}`)\n const records = readRunRecords(sourceRecordsPath)\n if (records.length === 0) throw new ValidationError(`${sourceRecordsPath} is empty`)\n return records.map((record) => ({ record, runDir }))\n })\n mkdirSync(outDir, { recursive: true })\n const artifactsByRunDir = new Map<string, ProductBenchmarkRecord['artifacts']>()\n for (const [index, runDir] of runDirs.entries()) {\n artifactsByRunDir.set(\n runDir,\n materialize ? materializeRunArtifacts(runDir, outDir, index) : absoluteArtifacts(runDir),\n )\n }\n const artifactRoot = materialize ? outDir : '/'\n const normalized = rows.map(({ record, runDir }) =>\n runRecordToProductBenchmarkRecord(\n record,\n runDir,\n artifactRoot,\n artifactsByRunDir.get(runDir)!,\n { ...options, runDirs, backendVersion: opts.backendVersion },\n ),\n )\n const manifest = buildProductBenchmarkManifest(normalized, {\n outDir,\n projectId: opts.projectId,\n benchmarkId: opts.benchmarkId,\n scenarioTagPrefix: opts.scenarioTagPrefix,\n mutableSurfaces: opts.mutableSurfaces,\n ...(options.substrate !== undefined ? { substrate: options.substrate } : {}),\n })\n const manifestPath = join(outDir, 'product-benchmark-manifest.json')\n const recordsPath = join(outDir, 'product-benchmark-records.jsonl')\n writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`)\n writeFileSync(recordsPath, `${normalized.map((record) => JSON.stringify(record)).join('\\n')}\\n`)\n return { manifestPath, recordsPath, records: normalized.length }\n}\n\nfunction defaultScenarioTagPrefix(projectId: string): string {\n return projectId.replace(/-agent$/, '') || projectId\n}\n\nfunction resolveOptions(\n options: ProductBenchmarkExportOptions | ProductBenchmarkSingleRunExportOptions,\n): ResolvedExportOptions {\n return {\n projectId: options.projectId,\n benchmarkId: options.benchmarkId,\n agentProfilePath: options.agentProfilePath,\n passThreshold: options.passThreshold ?? 0.7,\n scenarioTagPrefix: options.scenarioTagPrefix ?? defaultScenarioTagPrefix(options.projectId),\n ...(options.fallbackProfileId !== undefined\n ? { fallbackProfileId: options.fallbackProfileId }\n : {}),\n mutableSurfaces: options.mutableSurfaces ?? productBenchmarkMutableSurfaces,\n ...(options.classifySplit !== undefined ? { classifySplit: options.classifySplit } : {}),\n ...(options.toolCallFallback !== undefined\n ? { toolCallFallback: options.toolCallFallback }\n : {}),\n backendVersion: options.backendVersion ?? packageVersion('@tangle-network/sandbox'),\n }\n}\n"],"mappings":"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","names":["existsSync","readFileSync","dirname","join","sum","readFileSync","dirname","existsSync","join"]}
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
aggregateRunScore,
|
|
6
6
|
clamp01
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-LMSQ6EFA.js";
|
|
8
8
|
import {
|
|
9
9
|
LlmClient,
|
|
10
10
|
callLlmJson
|
|
@@ -790,4 +790,4 @@ export {
|
|
|
790
790
|
runSemanticConceptJudge,
|
|
791
791
|
createSemanticConceptJudge
|
|
792
792
|
};
|
|
793
|
-
//# sourceMappingURL=chunk-
|
|
793
|
+
//# sourceMappingURL=chunk-SMCACT4Z.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
summarizeBackendIntegrity
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-VNM52AGA.js";
|
|
4
4
|
import {
|
|
5
5
|
paretoChart
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-CLS3374R.js";
|
|
7
7
|
import {
|
|
8
8
|
cohensD,
|
|
9
9
|
pairedBootstrap,
|
|
@@ -12,10 +12,10 @@ import {
|
|
|
12
12
|
pearsonR,
|
|
13
13
|
requiredSampleSize,
|
|
14
14
|
spearmanR
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-HYGRFL7C.js";
|
|
16
16
|
import {
|
|
17
17
|
llmSpans
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-JZXGWLK5.js";
|
|
19
19
|
|
|
20
20
|
// src/contamination-guard.ts
|
|
21
21
|
function checkCanaries(output, scenarios) {
|
|
@@ -822,4 +822,4 @@ export {
|
|
|
822
822
|
HoldoutAuditor,
|
|
823
823
|
analyzeRuns
|
|
824
824
|
};
|
|
825
|
-
//# sourceMappingURL=chunk-
|
|
825
|
+
//# sourceMappingURL=chunk-TCPP4Z5Q.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
summaryTable
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-CLS3374R.js";
|
|
4
4
|
import {
|
|
5
5
|
VerificationError
|
|
6
6
|
} from "./chunk-3BFEG2F6.js";
|
|
@@ -574,4 +574,4 @@ export {
|
|
|
574
574
|
judgeReplayGate,
|
|
575
575
|
renderReleaseReport
|
|
576
576
|
};
|
|
577
|
-
//# sourceMappingURL=chunk-
|
|
577
|
+
//# sourceMappingURL=chunk-UMEAR2FI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/release-confidence.ts","../src/promotion-gate.ts","../src/release-report.ts"],"sourcesContent":["/**\n * Release confidence gate.\n *\n * This is the production-facing composition layer over the lower-level\n * primitives:\n * - Dataset manifests prove corpus/version coverage.\n * - RunRecord rows prove reproducible search/holdout outcomes.\n * - Multi-shot trace evidence carries turn counts and ASI diagnostics.\n * - HeldOutGate decisions remain the paired promotion authority.\n *\n * The gate is intentionally pure and conservative. Missing declared evidence\n * fails closed instead of being treated as a neutral zero.\n */\n\nimport type { DatasetManifest, DatasetScenario, DatasetSplit } from './dataset'\nimport { VerificationError } from './errors'\nimport type { GateDecision } from './held-out-gate'\nimport type { RunRecord, RunSplitTag } from './run-record'\n\n/** Severity of an actionable finding attached to a run/trace. */\nexport type AsiSeverity = 'info' | 'warning' | 'error' | 'critical'\n\n/** Actionable side-info — a diagnosed finding the loop can act on. */\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 type ReleaseConfidenceStatus = 'pass' | 'warn' | 'fail'\nexport type ReleaseConfidenceAxisName =\n | 'corpus'\n | 'quality'\n | 'generalization'\n | 'diagnostics'\n | 'efficiency'\n\nexport interface ReleaseTraceEvidence {\n scenarioId: string\n candidateId?: string\n split?: RunSplitTag\n score?: number\n ok?: boolean\n turnCount?: number\n costUsd?: number\n durationMs?: number\n failureMode?: string\n asi?: ActionableSideInfo[]\n metadata?: Record<string, unknown>\n}\n\nexport interface ReleaseConfidenceThresholds {\n /** Require a Dataset manifest or explicit scenarios. Default true. */\n requireCorpus?: boolean\n minScenarioCount?: number\n minSearchRuns?: number\n minHoldoutRuns?: number\n /** Require at least one holdout scenario/run. Default true. */\n requireHoldout?: boolean\n minPassRate?: number\n minMeanScore?: number\n /** Search mean may exceed holdout mean by at most this much. */\n maxOverfitGap?: number\n maxMeanCostUsd?: number\n maxP95WallMs?: number\n /** Low-score/failed rows must carry ASI. Default true. */\n requireAsiForFailures?: boolean\n /** Score below this is considered a failure for ASI coverage. Default 0.5. */\n failureScoreThreshold?: number\n}\n\nexport interface ReleaseConfidenceInput {\n target: string\n candidateId?: string\n baselineId?: string\n dataset?: DatasetManifest\n scenarios?: readonly DatasetScenario[]\n runs?: readonly RunRecord[]\n traces?: readonly ReleaseTraceEvidence[]\n gateDecision?: GateDecision | null\n thresholds?: ReleaseConfidenceThresholds\n}\n\nexport interface ReleaseConfidenceAxis {\n name: ReleaseConfidenceAxisName\n status: ReleaseConfidenceStatus\n score: number\n detail: string\n}\n\nexport interface ReleaseConfidenceIssue {\n axis: ReleaseConfidenceAxisName\n severity: 'critical' | 'warning'\n code: string\n detail: string\n}\n\nexport interface ReleaseConfidenceMetrics {\n scenarioCount: number\n searchRuns: number\n holdoutRuns: number\n passRate: number\n meanScore: number\n searchMeanScore: number\n holdoutMeanScore: number\n overfitGap: number\n meanCostUsd: number\n p95WallMs: number\n failedRows: number\n failuresWithAsi: number\n singleShotTraces: number\n multiShotTraces: number\n splitCounts: Record<DatasetSplit, number>\n domainCounts: Record<string, number>\n failureModeCounts: Record<string, number>\n responsibleSurfaceCounts: Record<string, number>\n}\n\nexport interface ReleaseConfidenceScorecard {\n target: string\n candidateId: string | null\n baselineId: string | null\n status: ReleaseConfidenceStatus\n promote: boolean\n axes: ReleaseConfidenceAxis[]\n issues: ReleaseConfidenceIssue[]\n metrics: ReleaseConfidenceMetrics\n dataset: DatasetManifest | null\n gateDecision: GateDecision | null\n summary: string\n}\n\nconst DEFAULT_THRESHOLDS: Required<ReleaseConfidenceThresholds> = {\n requireCorpus: true,\n minScenarioCount: 1,\n minSearchRuns: 1,\n minHoldoutRuns: 1,\n requireHoldout: true,\n minPassRate: 0.8,\n minMeanScore: 0.7,\n maxOverfitGap: 0.15,\n maxMeanCostUsd: Number.POSITIVE_INFINITY,\n maxP95WallMs: Number.POSITIVE_INFINITY,\n requireAsiForFailures: true,\n failureScoreThreshold: 0.5,\n}\n\nexport function evaluateReleaseConfidence(\n input: ReleaseConfidenceInput,\n): ReleaseConfidenceScorecard {\n const thresholds = { ...DEFAULT_THRESHOLDS, ...input.thresholds }\n const candidateId = input.candidateId ?? null\n const runs = filterCandidate(input.runs ?? [], candidateId, input.baselineId)\n const traces = filterTraceCandidate(input.traces ?? [], candidateId, input.baselineId)\n const scenarios = input.scenarios ?? []\n const scenarioCount = input.dataset?.scenarioCount ?? scenarios.length\n const splitCounts = input.dataset?.splitCounts ?? countScenarioSplits(scenarios)\n const searchScores = scoresFor(runs, 'search')\n const holdoutScores = scoresFor(runs, 'holdout')\n const allScores = [...searchScores, ...holdoutScores]\n const traceScores = traces.map((t) => t.score).filter(isFiniteNumber)\n const scoreUniverse = allScores.length > 0 ? allScores : traceScores\n const searchRuns = runs.filter((r) => r.splitTag === 'search').length\n const holdoutRuns = runs.filter((r) => r.splitTag === 'holdout').length\n const searchMeanScore = mean(searchScores)\n const holdoutMeanScore = mean(holdoutScores)\n const metrics: ReleaseConfidenceMetrics = {\n scenarioCount,\n searchRuns,\n holdoutRuns,\n passRate: passRate(runs, traces, thresholds.failureScoreThreshold),\n meanScore: mean(scoreUniverse),\n searchMeanScore,\n holdoutMeanScore,\n overfitGap: safeDiff(searchMeanScore, holdoutMeanScore),\n meanCostUsd: mean([\n ...runs.map((r) => r.costUsd),\n ...traces.map((t) => t.costUsd).filter(isFiniteNumber),\n ]),\n p95WallMs: percentile(\n [...runs.map((r) => r.wallMs), ...traces.map((t) => t.durationMs).filter(isFiniteNumber)],\n 0.95,\n ),\n failedRows: failedRows(runs, traces, thresholds.failureScoreThreshold).length,\n failuresWithAsi: failedRows(runs, traces, thresholds.failureScoreThreshold).filter(\n (row) => row.hasAsi,\n ).length,\n singleShotTraces: traces.filter((t) => t.turnCount === 1).length,\n multiShotTraces: traces.filter((t) => (t.turnCount ?? 0) > 1).length,\n splitCounts,\n domainCounts: countDomains(scenarios),\n failureModeCounts: countFailureModes(runs, traces, thresholds.failureScoreThreshold),\n responsibleSurfaceCounts: countResponsibleSurfaces(traces),\n }\n\n const issues: ReleaseConfidenceIssue[] = []\n checkCorpus(input, thresholds, metrics, issues)\n checkQuality(thresholds, metrics, issues)\n checkGeneralization(input.gateDecision ?? null, thresholds, metrics, issues)\n checkDiagnostics(thresholds, metrics, issues)\n checkEfficiency(thresholds, metrics, issues)\n\n const axes = buildAxes(metrics, thresholds, input.gateDecision ?? null, issues)\n const status = issues.some((i) => i.severity === 'critical')\n ? 'fail'\n : issues.length > 0\n ? 'warn'\n : 'pass'\n\n return {\n target: input.target,\n candidateId,\n baselineId: input.baselineId ?? null,\n status,\n promote: status === 'pass' && (input.gateDecision ? input.gateDecision.promote : true),\n axes,\n issues,\n metrics,\n dataset: input.dataset ?? null,\n gateDecision: input.gateDecision ?? null,\n summary: renderSummary(input.target, status, metrics, issues),\n }\n}\n\nexport function assertReleaseConfidence(input: ReleaseConfidenceInput): ReleaseConfidenceScorecard {\n const scorecard = evaluateReleaseConfidence(input)\n if (scorecard.status === 'fail') {\n throw new VerificationError(scorecard.summary)\n }\n return scorecard\n}\n\nfunction filterCandidate(\n runs: readonly RunRecord[],\n candidateId: string | null,\n baselineId?: string,\n): RunRecord[] {\n if (candidateId) return runs.filter((r) => r.candidateId === candidateId)\n if (baselineId) return runs.filter((r) => r.candidateId !== baselineId)\n return [...runs]\n}\n\nfunction filterTraceCandidate(\n traces: readonly ReleaseTraceEvidence[],\n candidateId: string | null,\n baselineId?: string,\n): ReleaseTraceEvidence[] {\n if (candidateId)\n return traces.filter((t) => t.candidateId === undefined || t.candidateId === candidateId)\n if (baselineId)\n return traces.filter((t) => t.candidateId === undefined || t.candidateId !== baselineId)\n return [...traces]\n}\n\nfunction checkCorpus(\n input: ReleaseConfidenceInput,\n thresholds: Required<ReleaseConfidenceThresholds>,\n metrics: ReleaseConfidenceMetrics,\n issues: ReleaseConfidenceIssue[],\n): void {\n if (thresholds.requireCorpus && !input.dataset && (input.scenarios?.length ?? 0) === 0) {\n issues.push({\n axis: 'corpus',\n severity: 'critical',\n code: 'missing_corpus',\n detail: 'No Dataset manifest or scenarios supplied.',\n })\n }\n if (metrics.scenarioCount < thresholds.minScenarioCount) {\n issues.push({\n axis: 'corpus',\n severity: 'critical',\n code: 'few_scenarios',\n detail: `${metrics.scenarioCount} scenario(s) < min ${thresholds.minScenarioCount}.`,\n })\n }\n if (thresholds.requireHoldout && metrics.splitCounts.holdout === 0) {\n issues.push({\n axis: 'corpus',\n severity: 'critical',\n code: 'missing_holdout_split',\n detail: 'Corpus has no holdout scenarios.',\n })\n }\n}\n\nfunction checkQuality(\n thresholds: Required<ReleaseConfidenceThresholds>,\n metrics: ReleaseConfidenceMetrics,\n issues: ReleaseConfidenceIssue[],\n): void {\n if (metrics.searchRuns < thresholds.minSearchRuns) {\n issues.push({\n axis: 'quality',\n severity: 'critical',\n code: 'few_search_runs',\n detail: `${metrics.searchRuns} search run(s) < min ${thresholds.minSearchRuns}.`,\n })\n }\n if (metrics.passRate < thresholds.minPassRate) {\n issues.push({\n axis: 'quality',\n severity: 'critical',\n code: 'low_pass_rate',\n detail: `passRate ${fmt(metrics.passRate)} < ${fmt(thresholds.minPassRate)}.`,\n })\n }\n if (metrics.meanScore < thresholds.minMeanScore) {\n issues.push({\n axis: 'quality',\n severity: 'critical',\n code: 'low_mean_score',\n detail: `meanScore ${fmt(metrics.meanScore)} < ${fmt(thresholds.minMeanScore)}.`,\n })\n }\n}\n\nfunction checkGeneralization(\n gateDecision: GateDecision | null,\n thresholds: Required<ReleaseConfidenceThresholds>,\n metrics: ReleaseConfidenceMetrics,\n issues: ReleaseConfidenceIssue[],\n): void {\n if (thresholds.requireHoldout && metrics.holdoutRuns < thresholds.minHoldoutRuns) {\n issues.push({\n axis: 'generalization',\n severity: 'critical',\n code: 'few_holdout_runs',\n detail: `${metrics.holdoutRuns} holdout run(s) < min ${thresholds.minHoldoutRuns}.`,\n })\n }\n if (Number.isFinite(metrics.overfitGap) && metrics.overfitGap > thresholds.maxOverfitGap) {\n issues.push({\n axis: 'generalization',\n severity: 'critical',\n code: 'overfit_gap',\n detail: `search-holdout gap ${fmt(metrics.overfitGap)} > ${fmt(thresholds.maxOverfitGap)}.`,\n })\n }\n if (gateDecision && !gateDecision.promote) {\n issues.push({\n axis: 'generalization',\n severity: 'critical',\n code: `gate_${gateDecision.rejectionCode ?? 'reject'}`,\n detail: gateDecision.reason,\n })\n }\n}\n\nfunction checkDiagnostics(\n thresholds: Required<ReleaseConfidenceThresholds>,\n metrics: ReleaseConfidenceMetrics,\n issues: ReleaseConfidenceIssue[],\n): void {\n if (!thresholds.requireAsiForFailures) return\n if (metrics.failedRows > metrics.failuresWithAsi) {\n issues.push({\n axis: 'diagnostics',\n severity: 'critical',\n code: 'missing_failure_asi',\n detail: `${metrics.failedRows - metrics.failuresWithAsi} failed row(s) have no actionable side information.`,\n })\n }\n}\n\nfunction checkEfficiency(\n thresholds: Required<ReleaseConfidenceThresholds>,\n metrics: ReleaseConfidenceMetrics,\n issues: ReleaseConfidenceIssue[],\n): void {\n if (metrics.meanCostUsd > thresholds.maxMeanCostUsd) {\n issues.push({\n axis: 'efficiency',\n severity: 'critical',\n code: 'cost_budget',\n detail: `meanCostUsd ${fmt(metrics.meanCostUsd)} > ${fmt(thresholds.maxMeanCostUsd)}.`,\n })\n }\n if (metrics.p95WallMs > thresholds.maxP95WallMs) {\n issues.push({\n axis: 'efficiency',\n severity: 'critical',\n code: 'latency_budget',\n detail: `p95WallMs ${fmt(metrics.p95WallMs)} > ${fmt(thresholds.maxP95WallMs)}.`,\n })\n }\n}\n\nfunction buildAxes(\n metrics: ReleaseConfidenceMetrics,\n thresholds: Required<ReleaseConfidenceThresholds>,\n gateDecision: GateDecision | null,\n issues: ReleaseConfidenceIssue[],\n): ReleaseConfidenceAxis[] {\n return [\n axis(\n 'corpus',\n issues,\n bounded(metrics.scenarioCount / Math.max(1, thresholds.minScenarioCount)),\n `${metrics.scenarioCount} scenarios; holdout=${metrics.splitCounts.holdout}`,\n ),\n axis(\n 'quality',\n issues,\n Math.min(metrics.passRate, metrics.meanScore),\n `passRate=${fmt(metrics.passRate)} meanScore=${fmt(metrics.meanScore)}`,\n ),\n axis(\n 'generalization',\n issues,\n gateDecision && !gateDecision.promote\n ? 0\n : gapScore(metrics.overfitGap, thresholds.maxOverfitGap),\n `holdoutRuns=${metrics.holdoutRuns} overfitGap=${fmt(metrics.overfitGap)}`,\n ),\n axis(\n 'diagnostics',\n issues,\n metrics.failedRows === 0 ? 1 : metrics.failuresWithAsi / metrics.failedRows,\n `failuresWithAsi=${metrics.failuresWithAsi}/${metrics.failedRows}`,\n ),\n axis(\n 'efficiency',\n issues,\n efficiencyScore(metrics, thresholds),\n `meanCostUsd=${fmt(metrics.meanCostUsd)} p95WallMs=${fmt(metrics.p95WallMs)}`,\n ),\n ]\n}\n\nfunction axis(\n name: ReleaseConfidenceAxisName,\n issues: ReleaseConfidenceIssue[],\n score: number,\n detail: string,\n): ReleaseConfidenceAxis {\n const own = issues.filter((i) => i.axis === name)\n const status = own.some((i) => i.severity === 'critical')\n ? 'fail'\n : own.length > 0\n ? 'warn'\n : 'pass'\n return { name, status, score: bounded(score), detail }\n}\n\nfunction countScenarioSplits(scenarios: readonly DatasetScenario[]): Record<DatasetSplit, number> {\n const counts: Record<DatasetSplit, number> = { train: 0, dev: 0, test: 0, holdout: 0 }\n for (const scenario of scenarios) counts[scenario.split ?? 'train']++\n return counts\n}\n\nfunction countDomains(scenarios: readonly DatasetScenario[]): Record<string, number> {\n const out: Record<string, number> = {}\n for (const scenario of scenarios) {\n const domain = scenario.tags?.domain ?? scenario.tags?.category ?? 'uncategorized'\n out[domain] = (out[domain] ?? 0) + 1\n }\n return out\n}\n\nfunction countFailureModes(\n runs: readonly RunRecord[],\n traces: readonly ReleaseTraceEvidence[],\n threshold: number,\n): Record<string, number> {\n const out: Record<string, number> = {}\n for (const run of runs) {\n const score = run.outcome.holdoutScore ?? run.outcome.searchScore\n if (run.failureMode || (score !== undefined && score < threshold)) {\n const mode = run.failureMode ?? 'low_score'\n out[mode] = (out[mode] ?? 0) + 1\n }\n }\n for (const trace of traces) {\n if (\n trace.failureMode ||\n trace.ok === false ||\n (trace.score !== undefined && trace.score < threshold)\n ) {\n const mode = trace.failureMode ?? (trace.ok === false ? 'not_ok' : 'low_score')\n out[mode] = (out[mode] ?? 0) + 1\n }\n }\n return out\n}\n\nfunction countResponsibleSurfaces(traces: readonly ReleaseTraceEvidence[]): Record<string, number> {\n const out: Record<string, number> = {}\n for (const trace of traces) {\n for (const asi of trace.asi ?? []) {\n const surface = asi.responsibleSurface ?? 'unknown'\n out[surface] = (out[surface] ?? 0) + 1\n }\n }\n return out\n}\n\nfunction failedRows(\n runs: readonly RunRecord[],\n traces: readonly ReleaseTraceEvidence[],\n threshold: number,\n): Array<{ hasAsi: boolean }> {\n const out: Array<{ hasAsi: boolean }> = []\n for (const run of runs) {\n const score = run.outcome.holdoutScore ?? run.outcome.searchScore\n if (run.failureMode || (score !== undefined && score < threshold)) {\n const asiMetric = run.outcome.raw.asi\n out.push({ hasAsi: typeof asiMetric === 'number' && asiMetric > 0 })\n }\n }\n for (const trace of traces) {\n if (\n trace.failureMode ||\n trace.ok === false ||\n (trace.score !== undefined && trace.score < threshold)\n ) {\n out.push({ hasAsi: (trace.asi?.length ?? 0) > 0 })\n }\n }\n return out\n}\n\nfunction passRate(\n runs: readonly RunRecord[],\n traces: readonly ReleaseTraceEvidence[],\n threshold: number,\n): number {\n const outcomes = [\n ...runs.map((run) => {\n const score = run.outcome.holdoutScore ?? run.outcome.searchScore\n return !run.failureMode && score !== undefined && score >= threshold\n }),\n ...traces.map(\n (trace) => trace.ok !== false && (trace.score === undefined || trace.score >= threshold),\n ),\n ]\n if (outcomes.length === 0) return 0\n return outcomes.filter(Boolean).length / outcomes.length\n}\n\nfunction scoresFor(runs: readonly RunRecord[], split: RunSplitTag): number[] {\n return runs\n .filter((run) => run.splitTag === split)\n .map((run) => (split === 'holdout' ? run.outcome.holdoutScore : run.outcome.searchScore))\n .filter(isFiniteNumber)\n}\n\nfunction mean(xs: readonly number[]): number {\n if (xs.length === 0) return Number.NaN\n return xs.reduce((sum, x) => sum + x, 0) / xs.length\n}\n\nfunction percentile(xs: readonly number[], p: number): number {\n if (xs.length === 0) return Number.NaN\n const sorted = [...xs].sort((a, b) => a - b)\n return sorted[Math.min(sorted.length - 1, Math.max(0, Math.ceil(p * sorted.length) - 1))]!\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value)\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 gapScore(gap: number, maxGap: number): number {\n if (!Number.isFinite(gap)) return 0\n if (maxGap <= 0) return gap <= 0 ? 1 : 0\n return bounded(1 - Math.max(0, gap) / maxGap)\n}\n\nfunction efficiencyScore(\n metrics: ReleaseConfidenceMetrics,\n thresholds: Required<ReleaseConfidenceThresholds>,\n): number {\n const cost =\n Number.isFinite(thresholds.maxMeanCostUsd) && Number.isFinite(metrics.meanCostUsd)\n ? bounded(thresholds.maxMeanCostUsd / Math.max(metrics.meanCostUsd, 1e-12))\n : 1\n const latency =\n Number.isFinite(thresholds.maxP95WallMs) && Number.isFinite(metrics.p95WallMs)\n ? bounded(thresholds.maxP95WallMs / Math.max(metrics.p95WallMs, 1e-12))\n : 1\n return Math.min(cost, latency)\n}\n\nfunction bounded(x: number): number {\n if (!Number.isFinite(x)) return 0\n return Math.max(0, Math.min(1, x))\n}\n\nfunction renderSummary(\n target: string,\n status: ReleaseConfidenceStatus,\n metrics: ReleaseConfidenceMetrics,\n issues: ReleaseConfidenceIssue[],\n): string {\n const prefix = `release confidence ${status}: ${target}`\n const metricText = `scenarios=${metrics.scenarioCount} searchRuns=${metrics.searchRuns} holdoutRuns=${metrics.holdoutRuns} passRate=${fmt(metrics.passRate)} meanScore=${fmt(metrics.meanScore)}`\n if (issues.length === 0) return `${prefix}; ${metricText}`\n return `${prefix}; ${metricText}; issues=${issues.map((i) => i.code).join(',')}`\n}\n\nfunction fmt(x: number): string {\n if (!Number.isFinite(x)) return String(x)\n return x.toFixed(4)\n}\n","/**\n * Bootstrap-CI promotion gate.\n *\n * In any iterative-improvement loop (GEPA, prompt evolution, dataset\n * curation), the question is \"did this generation actually improve, or are\n * we celebrating noise?\". With small N and noisy outcomes, point-estimate\n * deltas lie. Bootstrap confidence intervals tell the operator whether the\n * delta is real before code or prompts get promoted.\n *\n * This module is pure functions — no I/O, no model calls. Easy to unit-test\n * and to compose into any verdict gate.\n *\n * Default gate:\n * - Bootstrap mean baseline vs candidate (1k resamples).\n * - Compute the delta distribution; pass if the lower CI bound > 0.\n * - Tunable confidence (default 95%) and resample count.\n *\n * Verdict semantics intentionally match the existing `experiments.jsonl`\n * vocabulary:\n * - ADVANCE: candidate's CI lower bound > baseline mean (real win)\n * - KEEP: overlap, but candidate point estimate >= baseline (neutral)\n * - REVERT: candidate's CI upper bound < baseline mean (real regression)\n * - INCONCLUSIVE: not enough samples or CI straddles zero with no signal\n */\n\nexport type Verdict = 'ADVANCE' | 'KEEP' | 'REVERT' | 'INCONCLUSIVE'\n\nexport interface BootstrapResult {\n baselineMean: number\n candidateMean: number\n /** candidateMean - baselineMean, point estimate. */\n delta: number\n /** Lower bound of the (1 - alpha) CI on the delta. */\n ciLower: number\n /** Upper bound of the (1 - alpha) CI on the delta. */\n ciUpper: number\n /** Number of bootstrap resamples used. */\n iterations: number\n alpha: number\n verdict: Verdict\n}\n\nexport interface BootstrapOptions {\n /** Confidence level alpha (default 0.05 → 95% CI). */\n alpha?: number\n /** Number of resamples (default 1000). */\n iterations?: number\n /**\n * Minimum total samples (baseline + candidate) below which we always\n * return INCONCLUSIVE — bootstrap with too few samples is meaningless.\n * Default 6 (combined).\n */\n minTotalSamples?: number\n /** RNG seed for reproducibility. Default: Math.random. */\n seed?: number\n}\n\n/**\n * Compute the bootstrap CI on (candidateMean - baselineMean) and a verdict.\n *\n * Uses simple percentile bootstrap on the difference of resampled means.\n * That's the standard non-parametric primitive — no distributional\n * assumptions, robust to skew, easy to reason about.\n */\nexport function bootstrapCi(\n baseline: number[],\n candidate: number[],\n options: BootstrapOptions = {},\n): BootstrapResult {\n const alpha = options.alpha ?? 0.05\n const iterations = options.iterations ?? 1000\n const minTotal = options.minTotalSamples ?? 6\n const rng = mulberry32(options.seed ?? hashSeed(baseline, candidate))\n\n const baselineMean = mean(baseline)\n const candidateMean = mean(candidate)\n const delta = candidateMean - baselineMean\n\n if (\n baseline.length + candidate.length < minTotal ||\n baseline.length === 0 ||\n candidate.length === 0\n ) {\n return {\n baselineMean,\n candidateMean,\n delta,\n ciLower: -Infinity,\n ciUpper: Infinity,\n iterations: 0,\n alpha,\n verdict: 'INCONCLUSIVE',\n }\n }\n\n const deltas: number[] = new Array(iterations)\n for (let i = 0; i < iterations; i++) {\n const bResample = resample(baseline, rng)\n const cResample = resample(candidate, rng)\n deltas[i] = mean(cResample) - mean(bResample)\n }\n deltas.sort((a, b) => a - b)\n const lowerIdx = Math.floor((alpha / 2) * iterations)\n const upperIdx = Math.floor((1 - alpha / 2) * iterations) - 1\n const ciLower = deltas[Math.max(0, lowerIdx)]!\n const ciUpper = deltas[Math.min(iterations - 1, upperIdx)]!\n\n let verdict: Verdict\n if (ciLower > 0) verdict = 'ADVANCE'\n else if (ciUpper < 0) verdict = 'REVERT'\n else if (delta >= 0) verdict = 'KEEP'\n else verdict = 'INCONCLUSIVE'\n\n return {\n baselineMean,\n candidateMean,\n delta,\n ciLower,\n ciUpper,\n iterations,\n alpha,\n verdict,\n }\n}\n\nfunction mean(xs: number[]): number {\n if (xs.length === 0) return 0\n let s = 0\n for (const x of xs) s += x\n return s / xs.length\n}\n\nfunction resample(xs: number[], rng: () => number): number[] {\n const out = new Array(xs.length)\n for (let i = 0; i < xs.length; i++) out[i] = xs[Math.floor(rng() * xs.length)]\n return out\n}\n\n/** Mulberry32 — fast deterministic PRNG. Stable across runs given the same seed. */\nfunction mulberry32(seed: number): () => number {\n let t = seed >>> 0\n return () => {\n t += 0x6d2b79f5\n let r = t\n r = Math.imul(r ^ (r >>> 15), r | 1)\n r ^= r + Math.imul(r ^ (r >>> 7), r | 61)\n return ((r ^ (r >>> 14)) >>> 0) / 4294967296\n }\n}\n\n/** Stable seed derived from the inputs — same data → same CI bounds. */\nfunction hashSeed(a: number[], b: number[]): number {\n let h = 2166136261\n for (const x of [...a, ...b]) {\n const view = new Float64Array([x])\n const bytes = new Uint8Array(view.buffer)\n for (const byte of bytes) {\n h ^= byte\n h = Math.imul(h, 16777619)\n }\n }\n return h >>> 0\n}\n\n/**\n * Judge-replay promotion gate.\n *\n * The cheap inner-loop judge that drives an evolution run is by definition\n * fast and noisy. When you're about to promote a winning variant to the\n * canonical default, you want a STRONGER judge (a more expensive model, a\n * human grader, a separately-trained reward model) to confirm the win\n * generalises beyond the inner loop.\n *\n * This helper takes raw winner + baseline outputs, scores both through the\n * stronger judge, and applies `bootstrapCi`. ADVANCE means the stronger\n * judge agrees the winner is real with the configured confidence. Doesn't\n * matter what shape your \"output\" is — pass a string, an object, anything\n * the judge can read.\n */\nexport interface JudgeReplayGateArgs<TOutput> {\n baselineOutputs: TOutput[]\n candidateOutputs: TOutput[]\n /** Stronger judge — async to allow LLM calls. Return a 0..N scalar score. */\n judge: (output: TOutput) => Promise<number> | number\n alpha?: number\n iterations?: number\n /** RNG seed for reproducibility. */\n seed?: number\n /** Maximum concurrent judge calls. Default 4. */\n judgeConcurrency?: number\n}\n\nexport async function judgeReplayGate<TOutput>(\n args: JudgeReplayGateArgs<TOutput>,\n): Promise<BootstrapResult & { baselineSamples: number; candidateSamples: number }> {\n const concurrency = args.judgeConcurrency ?? 4\n const baselineScores = await scoreAll(args.baselineOutputs, args.judge, concurrency)\n const candidateScores = await scoreAll(args.candidateOutputs, args.judge, concurrency)\n const ci = bootstrapCi(baselineScores, candidateScores, {\n ...(args.alpha !== undefined ? { alpha: args.alpha } : {}),\n ...(args.iterations !== undefined ? { iterations: args.iterations } : {}),\n ...(args.seed !== undefined ? { seed: args.seed } : {}),\n })\n return {\n ...ci,\n baselineSamples: baselineScores.length,\n candidateSamples: candidateScores.length,\n }\n}\n\nasync function scoreAll<TOutput>(\n outputs: TOutput[],\n judge: (output: TOutput) => Promise<number> | number,\n concurrency: number,\n): Promise<number[]> {\n const results: number[] = new Array(outputs.length)\n let next = 0\n async function worker(): Promise<void> {\n while (true) {\n const i = next++\n if (i >= outputs.length) return\n const v = await judge(outputs[i]!)\n results[i] = Number.isFinite(v) ? v : 0\n }\n }\n await Promise.all(Array.from({ length: Math.max(1, concurrency) }, () => worker()))\n return results\n}\n","import type { ReleaseConfidenceScorecard } from './release-confidence'\nimport type { RunRecord } from './run-record'\nimport { summaryTable } from './summary-report'\n\nexport interface RenderReleaseReportOptions {\n title?: string\n runs?: readonly RunRecord[]\n comparator?: string\n traceAnalystFindings?: readonly string[]\n nextActions?: readonly string[]\n}\n\nexport function renderReleaseReport(\n scorecard: ReleaseConfidenceScorecard,\n options: RenderReleaseReportOptions = {},\n): string {\n const title = options.title ?? `Release Report: ${scorecard.target}`\n const lines: string[] = []\n lines.push(`# ${title}`)\n lines.push('')\n lines.push(`Status: **${scorecard.status.toUpperCase()}**`)\n lines.push(`Promote: **${scorecard.promote ? 'yes' : 'no'}**`)\n if (scorecard.candidateId) lines.push(`Candidate: \\`${scorecard.candidateId}\\``)\n if (scorecard.baselineId) lines.push(`Baseline: \\`${scorecard.baselineId}\\``)\n lines.push('')\n lines.push(scorecard.summary)\n lines.push('')\n\n lines.push('## Metrics')\n lines.push('')\n lines.push('| Metric | Value |')\n lines.push('|---|---:|')\n lines.push(`| Scenarios | ${scorecard.metrics.scenarioCount} |`)\n lines.push(`| Search runs | ${scorecard.metrics.searchRuns} |`)\n lines.push(`| Holdout runs | ${scorecard.metrics.holdoutRuns} |`)\n lines.push(`| Pass rate | ${pct(scorecard.metrics.passRate)} |`)\n lines.push(`| Mean score | ${num(scorecard.metrics.meanScore)} |`)\n lines.push(`| Search mean | ${num(scorecard.metrics.searchMeanScore)} |`)\n lines.push(`| Holdout mean | ${num(scorecard.metrics.holdoutMeanScore)} |`)\n lines.push(`| Overfit gap | ${num(scorecard.metrics.overfitGap)} |`)\n lines.push(`| Mean cost | $${num(scorecard.metrics.meanCostUsd)} |`)\n lines.push(`| p95 wall time | ${Math.round(scorecard.metrics.p95WallMs)} ms |`)\n lines.push('')\n\n if (scorecard.issues.length > 0) {\n lines.push('## Issues')\n lines.push('')\n for (const issue of scorecard.issues) {\n lines.push(`- **${issue.severity}** \\`${issue.code}\\` (${issue.axis}): ${issue.detail}`)\n }\n lines.push('')\n }\n\n const surfaces = entries(scorecard.metrics.responsibleSurfaceCounts)\n if (surfaces.length > 0) {\n lines.push('## Responsible Surfaces')\n lines.push('')\n for (const [surface, count] of surfaces) lines.push(`- ${surface}: ${count}`)\n lines.push('')\n }\n\n const failures = entries(scorecard.metrics.failureModeCounts)\n if (failures.length > 0) {\n lines.push('## Failure Modes')\n lines.push('')\n for (const [mode, count] of failures) lines.push(`- ${mode}: ${count}`)\n lines.push('')\n }\n\n if (options.runs && options.runs.length > 0) {\n lines.push('## Run Summary')\n lines.push('')\n lines.push(\n summaryTable([...options.runs], {\n comparator: options.comparator ?? scorecard.baselineId ?? undefined,\n split: 'holdout',\n }).markdown,\n )\n lines.push('')\n }\n\n if (options.traceAnalystFindings && options.traceAnalystFindings.length > 0) {\n lines.push('## TraceAnalyst Findings')\n lines.push('')\n for (const finding of options.traceAnalystFindings) lines.push(`- ${finding}`)\n lines.push('')\n }\n\n const nextActions = options.nextActions ?? defaultNextActions(scorecard)\n if (nextActions.length > 0) {\n lines.push('## Next Actions')\n lines.push('')\n for (const action of nextActions) lines.push(`- ${action}`)\n lines.push('')\n }\n\n return `${lines.join('\\n').trimEnd()}\\n`\n}\n\nfunction defaultNextActions(scorecard: ReleaseConfidenceScorecard): string[] {\n if (scorecard.promote) return ['Promote the candidate and keep canaries enabled.']\n return scorecard.issues\n .filter((issue) => issue.severity === 'critical')\n .map((issue) => `Resolve ${issue.code}: ${issue.detail}`)\n}\n\nfunction entries(values: Record<string, number>): Array<[string, number]> {\n return Object.entries(values)\n .filter(([, count]) => count > 0)\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n}\n\nfunction pct(value: number): string {\n return Number.isFinite(value) ? `${(value * 100).toFixed(1)}%` : 'n/a'\n}\n\nfunction num(value: number): string {\n return Number.isFinite(value) ? value.toFixed(3) : 'n/a'\n}\n"],"mappings":"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","names":["mean"]}
|
|
1
|
+
{"version":3,"sources":["../src/release-confidence.ts","../src/promotion-gate.ts","../src/release-report.ts"],"sourcesContent":["/**\n * Release confidence gate.\n *\n * This is the production-facing composition layer over the lower-level\n * primitives:\n * - Dataset manifests prove corpus/version coverage.\n * - RunRecord rows prove reproducible search/holdout outcomes.\n * - Multi-shot trace evidence carries turn counts and ASI diagnostics.\n * - HeldOutGate decisions remain the paired promotion authority.\n *\n * The gate is intentionally pure and conservative. Missing declared evidence\n * fails closed instead of being treated as a neutral zero.\n */\n\nimport type { DatasetManifest, DatasetScenario, DatasetSplit } from './dataset'\nimport { VerificationError } from './errors'\nimport type { GateDecision } from './held-out-gate'\nimport type { RunRecord, RunSplitTag } from './run-record'\n\n/** Severity of an actionable finding attached to a run/trace. */\nexport type AsiSeverity = 'info' | 'warning' | 'error' | 'critical'\n\n/** Actionable side-info — a diagnosed finding the loop can act on. */\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 type ReleaseConfidenceStatus = 'pass' | 'warn' | 'fail'\nexport type ReleaseConfidenceAxisName =\n | 'corpus'\n | 'quality'\n | 'generalization'\n | 'diagnostics'\n | 'efficiency'\n\nexport interface ReleaseTraceEvidence {\n scenarioId: string\n candidateId?: string\n split?: RunSplitTag\n score?: number\n ok?: boolean\n turnCount?: number\n costUsd?: number\n durationMs?: number\n failureMode?: string\n asi?: ActionableSideInfo[]\n metadata?: Record<string, unknown>\n}\n\nexport interface ReleaseConfidenceThresholds {\n /** Require a Dataset manifest or explicit scenarios. Default true. */\n requireCorpus?: boolean\n minScenarioCount?: number\n minSearchRuns?: number\n minHoldoutRuns?: number\n /** Require at least one holdout scenario/run. Default true. */\n requireHoldout?: boolean\n minPassRate?: number\n minMeanScore?: number\n /** Search mean may exceed holdout mean by at most this much. */\n maxOverfitGap?: number\n maxMeanCostUsd?: number\n maxP95WallMs?: number\n /** Low-score/failed rows must carry ASI. Default true. */\n requireAsiForFailures?: boolean\n /** Score below this is considered a failure for ASI coverage. Default 0.5. */\n failureScoreThreshold?: number\n}\n\nexport interface ReleaseConfidenceInput {\n target: string\n candidateId?: string\n baselineId?: string\n dataset?: DatasetManifest\n scenarios?: readonly DatasetScenario[]\n runs?: readonly RunRecord[]\n traces?: readonly ReleaseTraceEvidence[]\n gateDecision?: GateDecision | null\n thresholds?: ReleaseConfidenceThresholds\n}\n\nexport interface ReleaseConfidenceAxis {\n name: ReleaseConfidenceAxisName\n status: ReleaseConfidenceStatus\n score: number\n detail: string\n}\n\nexport interface ReleaseConfidenceIssue {\n axis: ReleaseConfidenceAxisName\n severity: 'critical' | 'warning'\n code: string\n detail: string\n}\n\nexport interface ReleaseConfidenceMetrics {\n scenarioCount: number\n searchRuns: number\n holdoutRuns: number\n passRate: number\n meanScore: number\n searchMeanScore: number\n holdoutMeanScore: number\n overfitGap: number\n meanCostUsd: number\n p95WallMs: number\n failedRows: number\n failuresWithAsi: number\n singleShotTraces: number\n multiShotTraces: number\n splitCounts: Record<DatasetSplit, number>\n domainCounts: Record<string, number>\n failureModeCounts: Record<string, number>\n responsibleSurfaceCounts: Record<string, number>\n}\n\nexport interface ReleaseConfidenceScorecard {\n target: string\n candidateId: string | null\n baselineId: string | null\n status: ReleaseConfidenceStatus\n promote: boolean\n axes: ReleaseConfidenceAxis[]\n issues: ReleaseConfidenceIssue[]\n metrics: ReleaseConfidenceMetrics\n dataset: DatasetManifest | null\n gateDecision: GateDecision | null\n summary: string\n}\n\nconst DEFAULT_THRESHOLDS: Required<ReleaseConfidenceThresholds> = {\n requireCorpus: true,\n minScenarioCount: 1,\n minSearchRuns: 1,\n minHoldoutRuns: 1,\n requireHoldout: true,\n minPassRate: 0.8,\n minMeanScore: 0.7,\n maxOverfitGap: 0.15,\n maxMeanCostUsd: Number.POSITIVE_INFINITY,\n maxP95WallMs: Number.POSITIVE_INFINITY,\n requireAsiForFailures: true,\n failureScoreThreshold: 0.5,\n}\n\nexport function evaluateReleaseConfidence(\n input: ReleaseConfidenceInput,\n): ReleaseConfidenceScorecard {\n const thresholds = { ...DEFAULT_THRESHOLDS, ...input.thresholds }\n const candidateId = input.candidateId ?? null\n const runs = filterCandidate(input.runs ?? [], candidateId, input.baselineId)\n const traces = filterTraceCandidate(input.traces ?? [], candidateId, input.baselineId)\n const scenarios = input.scenarios ?? []\n const scenarioCount = input.dataset?.scenarioCount ?? scenarios.length\n const splitCounts = input.dataset?.splitCounts ?? countScenarioSplits(scenarios)\n const searchScores = scoresFor(runs, 'search')\n const holdoutScores = scoresFor(runs, 'holdout')\n const allScores = [...searchScores, ...holdoutScores]\n const traceScores = traces.map((t) => t.score).filter(isFiniteNumber)\n const scoreUniverse = allScores.length > 0 ? allScores : traceScores\n const searchRuns = runs.filter((r) => r.splitTag === 'search').length\n const holdoutRuns = runs.filter((r) => r.splitTag === 'holdout').length\n const searchMeanScore = mean(searchScores)\n const holdoutMeanScore = mean(holdoutScores)\n const metrics: ReleaseConfidenceMetrics = {\n scenarioCount,\n searchRuns,\n holdoutRuns,\n passRate: passRate(runs, traces, thresholds.failureScoreThreshold),\n meanScore: mean(scoreUniverse),\n searchMeanScore,\n holdoutMeanScore,\n overfitGap: safeDiff(searchMeanScore, holdoutMeanScore),\n meanCostUsd: mean([\n ...runs.map((r) => r.costUsd),\n ...traces.map((t) => t.costUsd).filter(isFiniteNumber),\n ]),\n p95WallMs: percentile(\n [...runs.map((r) => r.wallMs), ...traces.map((t) => t.durationMs).filter(isFiniteNumber)],\n 0.95,\n ),\n failedRows: failedRows(runs, traces, thresholds.failureScoreThreshold).length,\n failuresWithAsi: failedRows(runs, traces, thresholds.failureScoreThreshold).filter(\n (row) => row.hasAsi,\n ).length,\n singleShotTraces: traces.filter((t) => t.turnCount === 1).length,\n multiShotTraces: traces.filter((t) => (t.turnCount ?? 0) > 1).length,\n splitCounts,\n domainCounts: countDomains(scenarios),\n failureModeCounts: countFailureModes(runs, traces, thresholds.failureScoreThreshold),\n responsibleSurfaceCounts: countResponsibleSurfaces(traces),\n }\n\n const issues: ReleaseConfidenceIssue[] = []\n checkCorpus(input, thresholds, metrics, issues)\n checkQuality(thresholds, metrics, issues)\n checkGeneralization(input.gateDecision ?? null, thresholds, metrics, issues)\n checkDiagnostics(thresholds, metrics, issues)\n checkEfficiency(thresholds, metrics, issues)\n\n const axes = buildAxes(metrics, thresholds, input.gateDecision ?? null, issues)\n const status = issues.some((i) => i.severity === 'critical')\n ? 'fail'\n : issues.length > 0\n ? 'warn'\n : 'pass'\n\n return {\n target: input.target,\n candidateId,\n baselineId: input.baselineId ?? null,\n status,\n promote: status === 'pass' && (input.gateDecision ? input.gateDecision.promote : true),\n axes,\n issues,\n metrics,\n dataset: input.dataset ?? null,\n gateDecision: input.gateDecision ?? null,\n summary: renderSummary(input.target, status, metrics, issues),\n }\n}\n\nexport function assertReleaseConfidence(input: ReleaseConfidenceInput): ReleaseConfidenceScorecard {\n const scorecard = evaluateReleaseConfidence(input)\n if (scorecard.status === 'fail') {\n throw new VerificationError(scorecard.summary)\n }\n return scorecard\n}\n\nfunction filterCandidate(\n runs: readonly RunRecord[],\n candidateId: string | null,\n baselineId?: string,\n): RunRecord[] {\n if (candidateId) return runs.filter((r) => r.candidateId === candidateId)\n if (baselineId) return runs.filter((r) => r.candidateId !== baselineId)\n return [...runs]\n}\n\nfunction filterTraceCandidate(\n traces: readonly ReleaseTraceEvidence[],\n candidateId: string | null,\n baselineId?: string,\n): ReleaseTraceEvidence[] {\n if (candidateId)\n return traces.filter((t) => t.candidateId === undefined || t.candidateId === candidateId)\n if (baselineId)\n return traces.filter((t) => t.candidateId === undefined || t.candidateId !== baselineId)\n return [...traces]\n}\n\nfunction checkCorpus(\n input: ReleaseConfidenceInput,\n thresholds: Required<ReleaseConfidenceThresholds>,\n metrics: ReleaseConfidenceMetrics,\n issues: ReleaseConfidenceIssue[],\n): void {\n if (thresholds.requireCorpus && !input.dataset && (input.scenarios?.length ?? 0) === 0) {\n issues.push({\n axis: 'corpus',\n severity: 'critical',\n code: 'missing_corpus',\n detail: 'No Dataset manifest or scenarios supplied.',\n })\n }\n if (metrics.scenarioCount < thresholds.minScenarioCount) {\n issues.push({\n axis: 'corpus',\n severity: 'critical',\n code: 'few_scenarios',\n detail: `${metrics.scenarioCount} scenario(s) < min ${thresholds.minScenarioCount}.`,\n })\n }\n if (thresholds.requireHoldout && metrics.splitCounts.holdout === 0) {\n issues.push({\n axis: 'corpus',\n severity: 'critical',\n code: 'missing_holdout_split',\n detail: 'Corpus has no holdout scenarios.',\n })\n }\n}\n\nfunction checkQuality(\n thresholds: Required<ReleaseConfidenceThresholds>,\n metrics: ReleaseConfidenceMetrics,\n issues: ReleaseConfidenceIssue[],\n): void {\n if (metrics.searchRuns < thresholds.minSearchRuns) {\n issues.push({\n axis: 'quality',\n severity: 'critical',\n code: 'few_search_runs',\n detail: `${metrics.searchRuns} search run(s) < min ${thresholds.minSearchRuns}.`,\n })\n }\n if (metrics.passRate < thresholds.minPassRate) {\n issues.push({\n axis: 'quality',\n severity: 'critical',\n code: 'low_pass_rate',\n detail: `passRate ${fmt(metrics.passRate)} < ${fmt(thresholds.minPassRate)}.`,\n })\n }\n if (metrics.meanScore < thresholds.minMeanScore) {\n issues.push({\n axis: 'quality',\n severity: 'critical',\n code: 'low_mean_score',\n detail: `meanScore ${fmt(metrics.meanScore)} < ${fmt(thresholds.minMeanScore)}.`,\n })\n }\n}\n\nfunction checkGeneralization(\n gateDecision: GateDecision | null,\n thresholds: Required<ReleaseConfidenceThresholds>,\n metrics: ReleaseConfidenceMetrics,\n issues: ReleaseConfidenceIssue[],\n): void {\n if (thresholds.requireHoldout && metrics.holdoutRuns < thresholds.minHoldoutRuns) {\n issues.push({\n axis: 'generalization',\n severity: 'critical',\n code: 'few_holdout_runs',\n detail: `${metrics.holdoutRuns} holdout run(s) < min ${thresholds.minHoldoutRuns}.`,\n })\n }\n if (Number.isFinite(metrics.overfitGap) && metrics.overfitGap > thresholds.maxOverfitGap) {\n issues.push({\n axis: 'generalization',\n severity: 'critical',\n code: 'overfit_gap',\n detail: `search-holdout gap ${fmt(metrics.overfitGap)} > ${fmt(thresholds.maxOverfitGap)}.`,\n })\n }\n if (gateDecision && !gateDecision.promote) {\n issues.push({\n axis: 'generalization',\n severity: 'critical',\n code: `gate_${gateDecision.rejectionCode ?? 'reject'}`,\n detail: gateDecision.reason,\n })\n }\n}\n\nfunction checkDiagnostics(\n thresholds: Required<ReleaseConfidenceThresholds>,\n metrics: ReleaseConfidenceMetrics,\n issues: ReleaseConfidenceIssue[],\n): void {\n if (!thresholds.requireAsiForFailures) return\n if (metrics.failedRows > metrics.failuresWithAsi) {\n issues.push({\n axis: 'diagnostics',\n severity: 'critical',\n code: 'missing_failure_asi',\n detail: `${metrics.failedRows - metrics.failuresWithAsi} failed row(s) have no actionable side information.`,\n })\n }\n}\n\nfunction checkEfficiency(\n thresholds: Required<ReleaseConfidenceThresholds>,\n metrics: ReleaseConfidenceMetrics,\n issues: ReleaseConfidenceIssue[],\n): void {\n if (metrics.meanCostUsd > thresholds.maxMeanCostUsd) {\n issues.push({\n axis: 'efficiency',\n severity: 'critical',\n code: 'cost_budget',\n detail: `meanCostUsd ${fmt(metrics.meanCostUsd)} > ${fmt(thresholds.maxMeanCostUsd)}.`,\n })\n }\n if (metrics.p95WallMs > thresholds.maxP95WallMs) {\n issues.push({\n axis: 'efficiency',\n severity: 'critical',\n code: 'latency_budget',\n detail: `p95WallMs ${fmt(metrics.p95WallMs)} > ${fmt(thresholds.maxP95WallMs)}.`,\n })\n }\n}\n\nfunction buildAxes(\n metrics: ReleaseConfidenceMetrics,\n thresholds: Required<ReleaseConfidenceThresholds>,\n gateDecision: GateDecision | null,\n issues: ReleaseConfidenceIssue[],\n): ReleaseConfidenceAxis[] {\n return [\n axis(\n 'corpus',\n issues,\n bounded(metrics.scenarioCount / Math.max(1, thresholds.minScenarioCount)),\n `${metrics.scenarioCount} scenarios; holdout=${metrics.splitCounts.holdout}`,\n ),\n axis(\n 'quality',\n issues,\n Math.min(metrics.passRate, metrics.meanScore),\n `passRate=${fmt(metrics.passRate)} meanScore=${fmt(metrics.meanScore)}`,\n ),\n axis(\n 'generalization',\n issues,\n gateDecision && !gateDecision.promote\n ? 0\n : gapScore(metrics.overfitGap, thresholds.maxOverfitGap),\n `holdoutRuns=${metrics.holdoutRuns} overfitGap=${fmt(metrics.overfitGap)}`,\n ),\n axis(\n 'diagnostics',\n issues,\n metrics.failedRows === 0 ? 1 : metrics.failuresWithAsi / metrics.failedRows,\n `failuresWithAsi=${metrics.failuresWithAsi}/${metrics.failedRows}`,\n ),\n axis(\n 'efficiency',\n issues,\n efficiencyScore(metrics, thresholds),\n `meanCostUsd=${fmt(metrics.meanCostUsd)} p95WallMs=${fmt(metrics.p95WallMs)}`,\n ),\n ]\n}\n\nfunction axis(\n name: ReleaseConfidenceAxisName,\n issues: ReleaseConfidenceIssue[],\n score: number,\n detail: string,\n): ReleaseConfidenceAxis {\n const own = issues.filter((i) => i.axis === name)\n const status = own.some((i) => i.severity === 'critical')\n ? 'fail'\n : own.length > 0\n ? 'warn'\n : 'pass'\n return { name, status, score: bounded(score), detail }\n}\n\nfunction countScenarioSplits(scenarios: readonly DatasetScenario[]): Record<DatasetSplit, number> {\n const counts: Record<DatasetSplit, number> = { train: 0, dev: 0, test: 0, holdout: 0 }\n for (const scenario of scenarios) counts[scenario.split ?? 'train']++\n return counts\n}\n\nfunction countDomains(scenarios: readonly DatasetScenario[]): Record<string, number> {\n const out: Record<string, number> = {}\n for (const scenario of scenarios) {\n const domain = scenario.tags?.domain ?? scenario.tags?.category ?? 'uncategorized'\n out[domain] = (out[domain] ?? 0) + 1\n }\n return out\n}\n\nfunction countFailureModes(\n runs: readonly RunRecord[],\n traces: readonly ReleaseTraceEvidence[],\n threshold: number,\n): Record<string, number> {\n const out: Record<string, number> = {}\n for (const run of runs) {\n const score = run.outcome.holdoutScore ?? run.outcome.searchScore\n if (run.failureMode || (score !== undefined && score < threshold)) {\n const mode = run.failureMode ?? 'low_score'\n out[mode] = (out[mode] ?? 0) + 1\n }\n }\n for (const trace of traces) {\n if (\n trace.failureMode ||\n trace.ok === false ||\n (trace.score !== undefined && trace.score < threshold)\n ) {\n const mode = trace.failureMode ?? (trace.ok === false ? 'not_ok' : 'low_score')\n out[mode] = (out[mode] ?? 0) + 1\n }\n }\n return out\n}\n\nfunction countResponsibleSurfaces(traces: readonly ReleaseTraceEvidence[]): Record<string, number> {\n const out: Record<string, number> = {}\n for (const trace of traces) {\n for (const asi of trace.asi ?? []) {\n const surface = asi.responsibleSurface ?? 'unknown'\n out[surface] = (out[surface] ?? 0) + 1\n }\n }\n return out\n}\n\nfunction failedRows(\n runs: readonly RunRecord[],\n traces: readonly ReleaseTraceEvidence[],\n threshold: number,\n): Array<{ hasAsi: boolean }> {\n const out: Array<{ hasAsi: boolean }> = []\n for (const run of runs) {\n const score = run.outcome.holdoutScore ?? run.outcome.searchScore\n if (run.failureMode || (score !== undefined && score < threshold)) {\n const asiMetric = run.outcome.raw.asi\n out.push({ hasAsi: typeof asiMetric === 'number' && asiMetric > 0 })\n }\n }\n for (const trace of traces) {\n if (\n trace.failureMode ||\n trace.ok === false ||\n (trace.score !== undefined && trace.score < threshold)\n ) {\n out.push({ hasAsi: (trace.asi?.length ?? 0) > 0 })\n }\n }\n return out\n}\n\nfunction passRate(\n runs: readonly RunRecord[],\n traces: readonly ReleaseTraceEvidence[],\n threshold: number,\n): number {\n const outcomes = [\n ...runs.map((run) => {\n const score = run.outcome.holdoutScore ?? run.outcome.searchScore\n return !run.failureMode && score !== undefined && score >= threshold\n }),\n ...traces.map(\n (trace) => trace.ok !== false && (trace.score === undefined || trace.score >= threshold),\n ),\n ]\n if (outcomes.length === 0) return 0\n return outcomes.filter(Boolean).length / outcomes.length\n}\n\nfunction scoresFor(runs: readonly RunRecord[], split: RunSplitTag): number[] {\n return runs\n .filter((run) => run.splitTag === split)\n .map((run) => (split === 'holdout' ? run.outcome.holdoutScore : run.outcome.searchScore))\n .filter(isFiniteNumber)\n}\n\nfunction mean(xs: readonly number[]): number {\n if (xs.length === 0) return Number.NaN\n return xs.reduce((sum, x) => sum + x, 0) / xs.length\n}\n\nfunction percentile(xs: readonly number[], p: number): number {\n if (xs.length === 0) return Number.NaN\n const sorted = [...xs].sort((a, b) => a - b)\n return sorted[Math.min(sorted.length - 1, Math.max(0, Math.ceil(p * sorted.length) - 1))]!\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value)\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 gapScore(gap: number, maxGap: number): number {\n if (!Number.isFinite(gap)) return 0\n if (maxGap <= 0) return gap <= 0 ? 1 : 0\n return bounded(1 - Math.max(0, gap) / maxGap)\n}\n\nfunction efficiencyScore(\n metrics: ReleaseConfidenceMetrics,\n thresholds: Required<ReleaseConfidenceThresholds>,\n): number {\n const cost =\n Number.isFinite(thresholds.maxMeanCostUsd) && Number.isFinite(metrics.meanCostUsd)\n ? bounded(thresholds.maxMeanCostUsd / Math.max(metrics.meanCostUsd, 1e-12))\n : 1\n const latency =\n Number.isFinite(thresholds.maxP95WallMs) && Number.isFinite(metrics.p95WallMs)\n ? bounded(thresholds.maxP95WallMs / Math.max(metrics.p95WallMs, 1e-12))\n : 1\n return Math.min(cost, latency)\n}\n\nfunction bounded(x: number): number {\n if (!Number.isFinite(x)) return 0\n return Math.max(0, Math.min(1, x))\n}\n\nfunction renderSummary(\n target: string,\n status: ReleaseConfidenceStatus,\n metrics: ReleaseConfidenceMetrics,\n issues: ReleaseConfidenceIssue[],\n): string {\n const prefix = `release confidence ${status}: ${target}`\n const metricText = `scenarios=${metrics.scenarioCount} searchRuns=${metrics.searchRuns} holdoutRuns=${metrics.holdoutRuns} passRate=${fmt(metrics.passRate)} meanScore=${fmt(metrics.meanScore)}`\n if (issues.length === 0) return `${prefix}; ${metricText}`\n return `${prefix}; ${metricText}; issues=${issues.map((i) => i.code).join(',')}`\n}\n\nfunction fmt(x: number): string {\n if (!Number.isFinite(x)) return String(x)\n return x.toFixed(4)\n}\n","/**\n * Bootstrap-CI promotion gate.\n *\n * In any iterative-improvement loop (GEPA, prompt evolution, dataset\n * curation), the question is \"did this generation actually improve, or are\n * we celebrating noise?\". With small N and noisy outcomes, point-estimate\n * deltas lie. Bootstrap confidence intervals tell the operator whether the\n * delta is real before code or prompts get promoted.\n *\n * This module is pure functions — no I/O, no model calls. Easy to unit-test\n * and to compose into any verdict gate.\n *\n * Default gate:\n * - Bootstrap mean baseline vs candidate (1k resamples).\n * - Compute the delta distribution; pass if the lower CI bound > 0.\n * - Tunable confidence (default 95%) and resample count.\n *\n * Verdict semantics intentionally match the existing `experiments.jsonl`\n * vocabulary:\n * - ADVANCE: candidate's CI lower bound > baseline mean (real win)\n * - KEEP: overlap, but candidate point estimate >= baseline (neutral)\n * - REVERT: candidate's CI upper bound < baseline mean (real regression)\n * - INCONCLUSIVE: not enough samples or CI straddles zero with no signal\n */\n\nexport type Verdict = 'ADVANCE' | 'KEEP' | 'REVERT' | 'INCONCLUSIVE'\n\nexport interface BootstrapResult {\n baselineMean: number\n candidateMean: number\n /** candidateMean - baselineMean, point estimate. */\n delta: number\n /** Lower bound of the (1 - alpha) CI on the delta. */\n ciLower: number\n /** Upper bound of the (1 - alpha) CI on the delta. */\n ciUpper: number\n /** Number of bootstrap resamples used. */\n iterations: number\n alpha: number\n verdict: Verdict\n}\n\nexport interface BootstrapOptions {\n /** Confidence level alpha (default 0.05 → 95% CI). */\n alpha?: number\n /** Number of resamples (default 1000). */\n iterations?: number\n /**\n * Minimum total samples (baseline + candidate) below which we always\n * return INCONCLUSIVE — bootstrap with too few samples is meaningless.\n * Default 6 (combined).\n */\n minTotalSamples?: number\n /** RNG seed for reproducibility. Default: Math.random. */\n seed?: number\n}\n\n/**\n * Compute the bootstrap CI on (candidateMean - baselineMean) and a verdict.\n *\n * Uses simple percentile bootstrap on the difference of resampled means.\n * That's the standard non-parametric primitive — no distributional\n * assumptions, robust to skew, easy to reason about.\n */\nexport function bootstrapCi(\n baseline: number[],\n candidate: number[],\n options: BootstrapOptions = {},\n): BootstrapResult {\n const alpha = options.alpha ?? 0.05\n const iterations = options.iterations ?? 1000\n const minTotal = options.minTotalSamples ?? 6\n const rng = mulberry32(options.seed ?? hashSeed(baseline, candidate))\n\n const baselineMean = mean(baseline)\n const candidateMean = mean(candidate)\n const delta = candidateMean - baselineMean\n\n if (\n baseline.length + candidate.length < minTotal ||\n baseline.length === 0 ||\n candidate.length === 0\n ) {\n return {\n baselineMean,\n candidateMean,\n delta,\n ciLower: -Infinity,\n ciUpper: Infinity,\n iterations: 0,\n alpha,\n verdict: 'INCONCLUSIVE',\n }\n }\n\n const deltas: number[] = new Array(iterations)\n for (let i = 0; i < iterations; i++) {\n const bResample = resample(baseline, rng)\n const cResample = resample(candidate, rng)\n deltas[i] = mean(cResample) - mean(bResample)\n }\n deltas.sort((a, b) => a - b)\n const lowerIdx = Math.floor((alpha / 2) * iterations)\n const upperIdx = Math.floor((1 - alpha / 2) * iterations) - 1\n const ciLower = deltas[Math.max(0, lowerIdx)]!\n const ciUpper = deltas[Math.min(iterations - 1, upperIdx)]!\n\n let verdict: Verdict\n if (ciLower > 0) verdict = 'ADVANCE'\n else if (ciUpper < 0) verdict = 'REVERT'\n else if (delta >= 0) verdict = 'KEEP'\n else verdict = 'INCONCLUSIVE'\n\n return {\n baselineMean,\n candidateMean,\n delta,\n ciLower,\n ciUpper,\n iterations,\n alpha,\n verdict,\n }\n}\n\nfunction mean(xs: number[]): number {\n if (xs.length === 0) return 0\n let s = 0\n for (const x of xs) s += x\n return s / xs.length\n}\n\nfunction resample(xs: number[], rng: () => number): number[] {\n const out = new Array(xs.length)\n for (let i = 0; i < xs.length; i++) out[i] = xs[Math.floor(rng() * xs.length)]\n return out\n}\n\n/** Mulberry32 — fast deterministic PRNG. Stable across runs given the same seed. */\nfunction mulberry32(seed: number): () => number {\n let t = seed >>> 0\n return () => {\n t += 0x6d2b79f5\n let r = t\n r = Math.imul(r ^ (r >>> 15), r | 1)\n r ^= r + Math.imul(r ^ (r >>> 7), r | 61)\n return ((r ^ (r >>> 14)) >>> 0) / 4294967296\n }\n}\n\n/** Stable seed derived from the inputs — same data → same CI bounds. */\nfunction hashSeed(a: number[], b: number[]): number {\n let h = 2166136261\n for (const x of [...a, ...b]) {\n const view = new Float64Array([x])\n const bytes = new Uint8Array(view.buffer)\n for (const byte of bytes) {\n h ^= byte\n h = Math.imul(h, 16777619)\n }\n }\n return h >>> 0\n}\n\n/**\n * Judge-replay promotion gate.\n *\n * The cheap inner-loop judge that drives an evolution run is by definition\n * fast and noisy. When you're about to promote a winning variant to the\n * canonical default, you want a STRONGER judge (a more expensive model, a\n * human grader, a separately-trained reward model) to confirm the win\n * generalises beyond the inner loop.\n *\n * This helper takes raw winner + baseline outputs, scores both through the\n * stronger judge, and applies `bootstrapCi`. ADVANCE means the stronger\n * judge agrees the winner is real with the configured confidence. Doesn't\n * matter what shape your \"output\" is — pass a string, an object, anything\n * the judge can read.\n */\nexport interface JudgeReplayGateArgs<TOutput> {\n baselineOutputs: TOutput[]\n candidateOutputs: TOutput[]\n /** Stronger judge — async to allow LLM calls. Return a 0..N scalar score. */\n judge: (output: TOutput) => Promise<number> | number\n alpha?: number\n iterations?: number\n /** RNG seed for reproducibility. */\n seed?: number\n /** Maximum concurrent judge calls. Default 4. */\n judgeConcurrency?: number\n}\n\n/**\n * Confirm a candidate's win with a stronger judge: score baseline and candidate outputs independently, then bootstrap a CI to verify the lift generalises beyond the inner loop.\n */\nexport async function judgeReplayGate<TOutput>(\n args: JudgeReplayGateArgs<TOutput>,\n): Promise<BootstrapResult & { baselineSamples: number; candidateSamples: number }> {\n const concurrency = args.judgeConcurrency ?? 4\n const baselineScores = await scoreAll(args.baselineOutputs, args.judge, concurrency)\n const candidateScores = await scoreAll(args.candidateOutputs, args.judge, concurrency)\n const ci = bootstrapCi(baselineScores, candidateScores, {\n ...(args.alpha !== undefined ? { alpha: args.alpha } : {}),\n ...(args.iterations !== undefined ? { iterations: args.iterations } : {}),\n ...(args.seed !== undefined ? { seed: args.seed } : {}),\n })\n return {\n ...ci,\n baselineSamples: baselineScores.length,\n candidateSamples: candidateScores.length,\n }\n}\n\nasync function scoreAll<TOutput>(\n outputs: TOutput[],\n judge: (output: TOutput) => Promise<number> | number,\n concurrency: number,\n): Promise<number[]> {\n const results: number[] = new Array(outputs.length)\n let next = 0\n async function worker(): Promise<void> {\n while (true) {\n const i = next++\n if (i >= outputs.length) return\n const v = await judge(outputs[i]!)\n results[i] = Number.isFinite(v) ? v : 0\n }\n }\n await Promise.all(Array.from({ length: Math.max(1, concurrency) }, () => worker()))\n return results\n}\n","import type { ReleaseConfidenceScorecard } from './release-confidence'\nimport type { RunRecord } from './run-record'\nimport { summaryTable } from './summary-report'\n\nexport interface RenderReleaseReportOptions {\n title?: string\n runs?: readonly RunRecord[]\n comparator?: string\n traceAnalystFindings?: readonly string[]\n nextActions?: readonly string[]\n}\n\nexport function renderReleaseReport(\n scorecard: ReleaseConfidenceScorecard,\n options: RenderReleaseReportOptions = {},\n): string {\n const title = options.title ?? `Release Report: ${scorecard.target}`\n const lines: string[] = []\n lines.push(`# ${title}`)\n lines.push('')\n lines.push(`Status: **${scorecard.status.toUpperCase()}**`)\n lines.push(`Promote: **${scorecard.promote ? 'yes' : 'no'}**`)\n if (scorecard.candidateId) lines.push(`Candidate: \\`${scorecard.candidateId}\\``)\n if (scorecard.baselineId) lines.push(`Baseline: \\`${scorecard.baselineId}\\``)\n lines.push('')\n lines.push(scorecard.summary)\n lines.push('')\n\n lines.push('## Metrics')\n lines.push('')\n lines.push('| Metric | Value |')\n lines.push('|---|---:|')\n lines.push(`| Scenarios | ${scorecard.metrics.scenarioCount} |`)\n lines.push(`| Search runs | ${scorecard.metrics.searchRuns} |`)\n lines.push(`| Holdout runs | ${scorecard.metrics.holdoutRuns} |`)\n lines.push(`| Pass rate | ${pct(scorecard.metrics.passRate)} |`)\n lines.push(`| Mean score | ${num(scorecard.metrics.meanScore)} |`)\n lines.push(`| Search mean | ${num(scorecard.metrics.searchMeanScore)} |`)\n lines.push(`| Holdout mean | ${num(scorecard.metrics.holdoutMeanScore)} |`)\n lines.push(`| Overfit gap | ${num(scorecard.metrics.overfitGap)} |`)\n lines.push(`| Mean cost | $${num(scorecard.metrics.meanCostUsd)} |`)\n lines.push(`| p95 wall time | ${Math.round(scorecard.metrics.p95WallMs)} ms |`)\n lines.push('')\n\n if (scorecard.issues.length > 0) {\n lines.push('## Issues')\n lines.push('')\n for (const issue of scorecard.issues) {\n lines.push(`- **${issue.severity}** \\`${issue.code}\\` (${issue.axis}): ${issue.detail}`)\n }\n lines.push('')\n }\n\n const surfaces = entries(scorecard.metrics.responsibleSurfaceCounts)\n if (surfaces.length > 0) {\n lines.push('## Responsible Surfaces')\n lines.push('')\n for (const [surface, count] of surfaces) lines.push(`- ${surface}: ${count}`)\n lines.push('')\n }\n\n const failures = entries(scorecard.metrics.failureModeCounts)\n if (failures.length > 0) {\n lines.push('## Failure Modes')\n lines.push('')\n for (const [mode, count] of failures) lines.push(`- ${mode}: ${count}`)\n lines.push('')\n }\n\n if (options.runs && options.runs.length > 0) {\n lines.push('## Run Summary')\n lines.push('')\n lines.push(\n summaryTable([...options.runs], {\n comparator: options.comparator ?? scorecard.baselineId ?? undefined,\n split: 'holdout',\n }).markdown,\n )\n lines.push('')\n }\n\n if (options.traceAnalystFindings && options.traceAnalystFindings.length > 0) {\n lines.push('## TraceAnalyst Findings')\n lines.push('')\n for (const finding of options.traceAnalystFindings) lines.push(`- ${finding}`)\n lines.push('')\n }\n\n const nextActions = options.nextActions ?? defaultNextActions(scorecard)\n if (nextActions.length > 0) {\n lines.push('## Next Actions')\n lines.push('')\n for (const action of nextActions) lines.push(`- ${action}`)\n lines.push('')\n }\n\n return `${lines.join('\\n').trimEnd()}\\n`\n}\n\nfunction defaultNextActions(scorecard: ReleaseConfidenceScorecard): string[] {\n if (scorecard.promote) return ['Promote the candidate and keep canaries enabled.']\n return scorecard.issues\n .filter((issue) => issue.severity === 'critical')\n .map((issue) => `Resolve ${issue.code}: ${issue.detail}`)\n}\n\nfunction entries(values: Record<string, number>): Array<[string, number]> {\n return Object.entries(values)\n .filter(([, count]) => count > 0)\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n}\n\nfunction pct(value: number): string {\n return Number.isFinite(value) ? `${(value * 100).toFixed(1)}%` : 'n/a'\n}\n\nfunction num(value: number): string {\n return Number.isFinite(value) ? value.toFixed(3) : 'n/a'\n}\n"],"mappings":"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","names":["mean"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
confidenceInterval
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-HYGRFL7C.js";
|
|
4
4
|
import {
|
|
5
5
|
AgentEvalError
|
|
6
6
|
} from "./chunk-3BFEG2F6.js";
|
|
@@ -140,7 +140,7 @@ function canonicalizeAt(value, path) {
|
|
|
140
140
|
break;
|
|
141
141
|
}
|
|
142
142
|
const obj = value;
|
|
143
|
-
if (typeof obj
|
|
143
|
+
if (typeof obj.toJSON === "function") {
|
|
144
144
|
return canonicalizeAt(obj.toJSON(), path);
|
|
145
145
|
}
|
|
146
146
|
if (Array.isArray(obj)) {
|
|
@@ -787,4 +787,4 @@ export {
|
|
|
787
787
|
runCampaign,
|
|
788
788
|
planCampaignRun
|
|
789
789
|
};
|
|
790
|
-
//# sourceMappingURL=chunk-
|
|
790
|
+
//# sourceMappingURL=chunk-VNM52AGA.js.map
|