@tangle-network/agent-eval 0.102.0 → 0.103.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/adapters/http.d.ts +2 -2
  2. package/dist/adapters/langchain.d.ts +2 -2
  3. package/dist/adapters/otel.d.ts +4 -4
  4. package/dist/analyst/index.d.ts +8 -8
  5. package/dist/{analyze-runs-BlJRBniC.d.ts → analyze-runs-Cd-A_K4l.d.ts} +3 -3
  6. package/dist/belief-state/index.d.ts +3 -3
  7. package/dist/benchmarks/index.d.ts +2 -2
  8. package/dist/campaign/index.d.ts +14 -14
  9. package/dist/campaign/index.js +34 -11
  10. package/dist/campaign/index.js.map +1 -1
  11. package/dist/{chunk-G6S73VA7.js → chunk-2NSLDY4B.js} +3 -2
  12. package/dist/{chunk-G6S73VA7.js.map → chunk-2NSLDY4B.js.map} +1 -1
  13. package/dist/{chunk-4LWD6GC7.js → chunk-6FIAJHCU.js} +2 -2
  14. package/dist/{chunk-PMF5WIBX.js → chunk-7RBJANJD.js} +2 -2
  15. package/dist/{chunk-BOETF6BU.js → chunk-B2TMQM62.js} +2 -2
  16. package/dist/{chunk-QUCGGMYM.js → chunk-HV5PBTJF.js} +3 -3
  17. package/dist/{chunk-CMJSTXUR.js → chunk-IXOV77YF.js} +105 -18
  18. package/dist/chunk-IXOV77YF.js.map +1 -0
  19. package/dist/{chunk-52CCCXU3.js → chunk-NTVWIH24.js} +104 -43
  20. package/dist/chunk-NTVWIH24.js.map +1 -0
  21. package/dist/chunk-RQNOLV3I.js +855 -0
  22. package/dist/chunk-RQNOLV3I.js.map +1 -0
  23. package/dist/{chunk-JCUREYF5.js → chunk-U3IDYATS.js} +2 -2
  24. package/dist/{chunk-LSCBODPQ.js → chunk-XKA6ZGEY.js} +11 -2
  25. package/dist/chunk-XKA6ZGEY.js.map +1 -0
  26. package/dist/{code-agent-session-B6ZcDwyA.d.ts → code-agent-session-Ce-9u7YM.d.ts} +1 -1
  27. package/dist/contract/index.d.ts +16 -16
  28. package/dist/contract/index.js +5 -5
  29. package/dist/{control-DC8TELh0.d.ts → control-C8RmK9H4.d.ts} +1 -1
  30. package/dist/control.d.ts +2 -2
  31. package/dist/control.js +2 -2
  32. package/dist/{corpus-ONOzGFmG.d.ts → corpus-CiSzzLa5.d.ts} +1 -1
  33. package/dist/{default-registry-Dhrc__SE.d.ts → default-registry-ZhqsTr4K.d.ts} +2 -2
  34. package/dist/diagnose.d.ts +3 -3
  35. package/dist/diagnose.js +1 -1
  36. package/dist/{gepa-bxuDoaO9.d.ts → gepa-DeyPTlvx.d.ts} +1 -1
  37. package/dist/hosted/index.d.ts +4 -4
  38. package/dist/{index-W96macmS.d.ts → index-B-bFgiAF.d.ts} +1 -1
  39. package/dist/index.d.ts +27 -23
  40. package/dist/index.js +26 -10
  41. package/dist/index.js.map +1 -1
  42. package/dist/{insight-report-C02J3q4T.d.ts → insight-report-k0sRTzKg.d.ts} +1 -1
  43. package/dist/{kind-factory-OgqQSvLi.d.ts → kind-factory-D0nk7AKV.d.ts} +1 -1
  44. package/dist/meta-eval/index.d.ts +2 -2
  45. package/dist/multishot/index.d.ts +2 -2
  46. package/dist/openapi.json +1 -1
  47. package/dist/{policy-edit-Dccm9tyA.d.ts → policy-edit-BDQzzsBU.d.ts} +2 -2
  48. package/dist/{pre-registration-BjGZf9YA.d.ts → pre-registration-mWG2w8d-.d.ts} +45 -12
  49. package/dist/product-benchmark/index.d.ts +104 -1
  50. package/dist/product-benchmark/index.js +15 -1
  51. package/dist/{provenance-BEITkFII.d.ts → provenance-BhJm32vN.d.ts} +3 -3
  52. package/dist/{release-report-B1tA6pKu.d.ts → release-report-BQ1Ziyu-.d.ts} +2 -2
  53. package/dist/reporting.d.ts +4 -4
  54. package/dist/{researcher-Ba2y1Foi.d.ts → researcher-B_ODTAJs.d.ts} +2 -2
  55. package/dist/rl.d.ts +8 -8
  56. package/dist/rl.js +2 -2
  57. package/dist/{rubric-predictive-validity-w7tun-q3.d.ts → rubric-predictive-validity-0MdjTt8R.d.ts} +1 -1
  58. package/dist/{run-campaign-RF3H6D4U.js → run-campaign-2L4WCJHR.js} +2 -2
  59. package/dist/{run-record-DEwidcqn.d.ts → run-record-MRdJ-Kq2.d.ts} +12 -1
  60. package/dist/{runtime-trajectory-OJDaTYHN.d.ts → runtime-trajectory-8w0_jmtR.d.ts} +1 -1
  61. package/dist/{semantic-concept-judge-J8xvjdc3.d.ts → semantic-concept-judge-D-IlH5v1.d.ts} +2 -2
  62. package/dist/{summary-report-C4uzRWh8.d.ts → summary-report-C0nnxOD8.d.ts} +1 -1
  63. package/dist/traces.d.ts +1 -1
  64. package/dist/traces.js +2 -2
  65. package/dist/{types-fWqEJm7h.d.ts → types-DFI_Z-ZL.d.ts} +18 -1
  66. package/dist/{types-BEzCBMQD.d.ts → types-Dz9cKF0g.d.ts} +1 -1
  67. package/dist/workflow/index.d.ts +4 -4
  68. package/dist/workflow/index.js +1 -1
  69. package/package.json +1 -1
  70. package/dist/chunk-52CCCXU3.js.map +0 -1
  71. package/dist/chunk-63MBSQTX.js +0 -350
  72. package/dist/chunk-63MBSQTX.js.map +0 -1
  73. package/dist/chunk-CMJSTXUR.js.map +0 -1
  74. package/dist/chunk-LSCBODPQ.js.map +0 -1
  75. /package/dist/{chunk-4LWD6GC7.js.map → chunk-6FIAJHCU.js.map} +0 -0
  76. /package/dist/{chunk-PMF5WIBX.js.map → chunk-7RBJANJD.js.map} +0 -0
  77. /package/dist/{chunk-BOETF6BU.js.map → chunk-B2TMQM62.js.map} +0 -0
  78. /package/dist/{chunk-QUCGGMYM.js.map → chunk-HV5PBTJF.js.map} +0 -0
  79. /package/dist/{chunk-JCUREYF5.js.map → chunk-U3IDYATS.js.map} +0 -0
  80. /package/dist/{run-campaign-RF3H6D4U.js.map → run-campaign-2L4WCJHR.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"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  summarizeBackendIntegrity
3
- } from "./chunk-LSCBODPQ.js";
3
+ } from "./chunk-XKA6ZGEY.js";
4
4
  import {
5
5
  paretoChart
6
6
  } from "./chunk-6GT4NI4V.js";
@@ -822,4 +822,4 @@ export {
822
822
  HoldoutAuditor,
823
823
  analyzeRuns
824
824
  };
825
- //# sourceMappingURL=chunk-JCUREYF5.js.map
825
+ //# sourceMappingURL=chunk-U3IDYATS.js.map
@@ -140,7 +140,7 @@ function canonicalizeAt(value, path) {
140
140
  break;
141
141
  }
142
142
  const obj = value;
143
- if (typeof obj["toJSON"] === "function") {
143
+ if (typeof obj.toJSON === "function") {
144
144
  return canonicalizeAt(obj.toJSON(), path);
145
145
  }
146
146
  if (Array.isArray(obj)) {
@@ -429,6 +429,7 @@ async function executeCell(args) {
429
429
  };
430
430
  let costSoFar = 0;
431
431
  const tokensSoFar = { input: 0, output: 0 };
432
+ let resolvedModel;
432
433
  const cost = {
433
434
  observe(amount, source) {
434
435
  costSoFar += amount;
@@ -439,11 +440,18 @@ async function executeCell(args) {
439
440
  tokensSoFar.output += usage.output;
440
441
  if (usage.cached) tokensSoFar.cached = (tokensSoFar.cached ?? 0) + usage.cached;
441
442
  },
443
+ observeModel(model) {
444
+ const trimmed = model?.trim();
445
+ if (trimmed) resolvedModel = trimmed;
446
+ },
442
447
  current() {
443
448
  return costSoFar;
444
449
  },
445
450
  tokens() {
446
451
  return { ...tokensSoFar };
452
+ },
453
+ resolvedModel() {
454
+ return resolvedModel;
447
455
  }
448
456
  };
449
457
  const placement = args.opts.cellPlacement?.({
@@ -521,6 +529,7 @@ async function executeCell(args) {
521
529
  judgeScores,
522
530
  costUsd: costSoFar,
523
531
  tokenUsage: { ...tokensSoFar },
532
+ ...resolvedModel ? { resolvedModel } : {},
524
533
  durationMs: Date.now() - startMs,
525
534
  seed: args.slot.cellSeed,
526
535
  cached: false,
@@ -778,4 +787,4 @@ export {
778
787
  runCampaign,
779
788
  planCampaignRun
780
789
  };
781
- //# sourceMappingURL=chunk-LSCBODPQ.js.map
790
+ //# sourceMappingURL=chunk-XKA6ZGEY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/campaign/run-campaign.ts","../src/integrity/backend-integrity.ts","../src/verdict-cache.ts","../src/campaign/run-dir.ts","../src/campaign/storage.ts"],"sourcesContent":["/**\n * `runCampaign` — Pass A substrate primitive. ONE function that orchestrates\n * scenarios → dispatch → artifacts → judges → aggregates, with full\n * reproducibility (seed + manifest hash), cell-level resumability, bootstrap\n * CIs, and the `LabeledScenarioStore` capture flywheel.\n *\n * Improvement loops (optimizer / gate / autoOnPromote) ride on top of this\n * primitive but live in `presets/run-improvement-loop.ts`. This file keeps\n * the core orchestrator minimal — Phase 1 of the Pass A track.\n */\n\nimport { join } from 'node:path'\nimport { BackendIntegrityError, type BackendIntegrityReport } from '../integrity/backend-integrity'\nimport { confidenceInterval } from '../statistics'\nimport { contentHash } from '../verdict-cache'\nimport { resolveRunDir } from './run-dir'\nimport { type CampaignStorage, fsCampaignStorage } from './storage'\nimport type {\n CampaignAggregates,\n CampaignArtifactWriter,\n CampaignCellResult,\n CampaignCostMeter,\n CampaignResult,\n CampaignTokenUsage,\n CampaignTraceWriter,\n DispatchContext,\n DispatchFn,\n JudgeAggregate,\n JudgeConfig,\n JudgeScore,\n LabeledScenarioStore,\n Scenario,\n ScenarioAggregate,\n TraceSpan,\n} from './types'\n\nexport interface RunCampaignOptions<TScenario extends Scenario, TArtifact> {\n scenarios: TScenario[]\n dispatch: DispatchFn<TScenario, TArtifact>\n /**\n * Stable identity for the dispatch behavior, included in the manifest/cache\n * key. Set this when the same function name can run different models,\n * prompts, tools, or external config.\n */\n dispatchRef?: string\n judges?: JudgeConfig<TArtifact, TScenario>[]\n /** Required for reproducibility. Default 42. */\n seed?: number\n /** Per-scenario replicates for CI bands. Default 1; raise to 5+ for\n * bootstrap-tight intervals on critical eval. */\n reps?: number\n /** When true (default), completed cells are cached by\n * (manifestHash, scenarioId, rep, generation). Re-runs skip cached cells. */\n resumable?: boolean\n /** Optional store — when present, every artifact + judge score is captured\n * with the configured `captureSource`. Capture is default ON; pass `'off'`\n * to disable. */\n labeledStore?: LabeledScenarioStore | 'off'\n captureSource?: 'production-trace' | 'eval-run' | 'manual' | 'red-team' | 'synthetic'\n captureSourceVersionHash?: string\n /** Wall-clock cost cap across all cells. Cells beyond ceiling are skipped. */\n costCeiling?: number\n /** Max concurrent cells. Default 2. */\n maxConcurrency?: number\n /**\n * Per-cell dispatch deadline in ms. A `dispatch` that neither resolves nor\n * rejects within this window is a hang (a stalled model request, an\n * exhausted runtime resource, a backend that never closes its stream). When\n * set, the cell's `ctx.signal` is aborted and the cell is recorded as a LOUD\n * error (`dispatch exceeded <N>ms`) so the campaign proceeds and the failure\n * is visible — instead of one wedged cell silently hanging the whole run (and\n * every loop/CI job above it) forever. `undefined`/`0` = unbounded (legacy).\n */\n dispatchTimeoutMs?: number\n /** Required: where artifacts + traces land. A bare name (not an absolute path)\n * resolves to the shared `~/.tangle/traces/<repo>/runs/<name>` root so run\n * bundles never pollute a repo working tree. Pass an absolute path to override. */\n runDir: string\n /** Subject repo for the shared run-dir root (defaults to the CWD basename).\n * Only consulted when `runDir` is a bare name. */\n repo?: string\n /** Tracing posture. Default is the substrate's `FileSystemTraceStore` rooted\n * at `<runDir>/traces/`. `'off'` disables capture entirely — substrate\n * refuses this when the caller wires `autoOnPromote !== 'none'`. */\n tracing?: 'on' | 'off'\n /**\n * Per-cell usage expectation — the early, fine-grained sibling of the\n * batch `assertRealBackend` guard. A cell that produced an artifact (no\n * error) but reported `costUsd === 0` AND zero tokens is a stub: the\n * dispatch never reported LLM activity via `ctx.cost`. Modes:\n * - `'warn'` (default) — log the offending cell loudly, keep going.\n * - `'assert'` — throw `BackendIntegrityError` on the first such cell\n * (fail-fast; recommended for CI campaigns expecting real LLM calls).\n * - `'off'` — no check (replay / deterministic-only / offline analysis).\n */\n expectUsage?: 'assert' | 'warn' | 'off'\n /** Test seam — override the wall clock for deterministic tests. */\n now?: () => Date\n /** Test seam — override per-cell trace writer factory. */\n buildTraceWriter?: (cellId: string, dir: string) => CampaignTraceWriter\n /** Storage backend for run/cell dirs, the resumability cache, artifacts,\n * and trace spans. Default: the Node filesystem (`fsCampaignStorage`).\n * Pass `inMemoryCampaignStorage()` to run in a filesystem-less runtime\n * (Cloudflare Workers, Deno, edge) — the `CampaignResult` is still\n * produced; artifacts/traces just aren't persisted to disk. */\n storage?: CampaignStorage\n /**\n * Optional per-cell placement strategy. Returns an opaque string the\n * substrate forwards as `ctx.placement` to the Dispatch — placement-aware\n * Dispatches (e.g. `httpDispatch` from `/adapters/http`) use it to route\n * each cell to the right worker, region, or sandbox. When unset, every\n * cell receives `ctx.placement = undefined` and behaves identically to\n * the in-process case.\n *\n * @example\n * cellPlacement: ({ scenario }) => scenario.tags?.includes('eu') ? 'eu-west' : 'us-east'\n */\n cellPlacement?: (input: {\n scenario: TScenario\n rep: number\n generation?: number\n }) => string | undefined\n}\n\nexport async function runCampaign<TScenario extends Scenario, TArtifact>(\n opts: RunCampaignOptions<TScenario, TArtifact>,\n): Promise<CampaignResult<TArtifact, TScenario>> {\n const seed = opts.seed ?? 42\n const reps = opts.reps ?? 1\n const resumable = opts.resumable ?? true\n const maxConcurrency = opts.maxConcurrency ?? 2\n const now = opts.now ?? (() => new Date())\n const judges = opts.judges ?? []\n const storage = opts.storage ?? fsCampaignStorage()\n\n if (typeof opts.runDir !== 'string' || opts.runDir.trim().length === 0) {\n throw new Error('runCampaign: runDir is required and must be a non-empty string')\n }\n opts.runDir = resolveRunDir(opts.runDir, opts.repo)\n storage.ensureDir(opts.runDir)\n\n const manifestHash = computeManifestHash({\n scenarios: opts.scenarios,\n judges: judges as unknown as JudgeConfig<unknown>[],\n dispatchRef: dispatchRefFor(opts.dispatch, opts.dispatchRef),\n seed,\n reps,\n })\n\n const startedAt = now()\n const cells: CampaignCellResult<TArtifact>[] = []\n const artifactsByPath: Record<string, string> = {}\n\n // Build the cell schedule (scenario × rep).\n const schedule = buildCellSchedule(opts.scenarios, seed, reps)\n\n // Concurrency-limited execution.\n let totalCostUsd = 0\n let costCeilingReached = false\n const abortController = new AbortController()\n // Concurrency lanes that drain the cell schedule. Named \"lanes\" — not\n // \"workers\" — to avoid clashing with the taxonomy's worker (= the agent\n // harness in a sandbox, invoked behind `dispatch`). See loop-taxonomy.md.\n const lanes: Promise<void>[] = []\n let nextIdx = 0\n const cellsRef = cells\n\n for (let i = 0; i < maxConcurrency; i++) {\n lanes.push(\n (async () => {\n while (true) {\n const myIdx = nextIdx++\n if (myIdx >= schedule.length) return\n const slot = schedule[myIdx]!\n if (costCeilingReached) {\n cellsRef.push(skippedCell(slot, 'cost_ceiling_reached'))\n continue\n }\n const result = await executeCell({\n slot,\n opts,\n manifestHash,\n resumable,\n now,\n storage,\n buildTraceWriter: opts.buildTraceWriter ?? defaultBuildTraceWriter(storage),\n signal: abortController.signal,\n dispatchTimeoutMs: opts.dispatchTimeoutMs,\n })\n cellsRef.push(result.cell)\n enforceCellUsage(result.cell, opts.expectUsage ?? 'warn')\n totalCostUsd += result.cell.costUsd\n Object.assign(artifactsByPath, result.artifactsByPath)\n if (opts.costCeiling !== undefined && totalCostUsd >= opts.costCeiling) {\n costCeilingReached = true\n }\n // Capture into LabeledScenarioStore unless explicitly disabled.\n if (opts.labeledStore && opts.labeledStore !== 'off' && !result.cell.error) {\n await captureToStore({\n store: opts.labeledStore,\n cell: result.cell,\n scenario: slot.scenario,\n opts,\n now,\n }).catch((err) => {\n // Capture failures are non-fatal — log but don't crash the campaign.\n // (Trace would normally land here.)\n console.warn(\n `[runCampaign] capture failed for ${result.cell.cellId}: ${err instanceof Error ? err.message : String(err)}`,\n )\n })\n }\n }\n })(),\n )\n }\n await Promise.all(lanes)\n\n const endedAt = now()\n cellsRef.sort((a, b) => a.cellId.localeCompare(b.cellId))\n\n const aggregates = computeAggregates(\n cellsRef,\n judges as unknown as JudgeConfig<TArtifact>[],\n seed,\n )\n\n return {\n manifestHash,\n seed,\n startedAt: startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n durationMs: endedAt.getTime() - startedAt.getTime(),\n cells: cellsRef,\n aggregates,\n runDir: opts.runDir,\n artifactsByPath,\n scenarios: opts.scenarios.map((s) => ({ id: s.id, kind: s.kind })),\n }\n}\n\n// ── Internals ─────────────────────────────────────────────────────────\n\ninterface ExecuteCellArgs<TScenario extends Scenario, TArtifact> {\n slot: { scenario: TScenario; rep: number; cellId: string; cellSeed: number }\n opts: RunCampaignOptions<TScenario, TArtifact>\n manifestHash: string\n resumable: boolean\n now: () => Date\n storage: CampaignStorage\n buildTraceWriter: (cellId: string, dir: string) => CampaignTraceWriter\n signal: AbortSignal\n dispatchTimeoutMs?: number\n}\n\nasync function executeCell<TScenario extends Scenario, TArtifact>(\n args: ExecuteCellArgs<TScenario, TArtifact>,\n): Promise<{ cell: CampaignCellResult<TArtifact>; artifactsByPath: Record<string, string> }> {\n const storage = args.storage\n const cellDir = join(args.opts.runDir, args.slot.cellId.replace(/[^a-zA-Z0-9_-]/g, '_'))\n storage.ensureDir(cellDir)\n\n // Resumability: cache key = (manifestHash, scenarioId, rep)\n const cachePath = join(cellDir, 'cached-result.json')\n if (args.resumable) {\n const cached = readCachedCell<TArtifact>({\n storage,\n cachePath,\n cellId: args.slot.cellId,\n manifestHash: args.manifestHash,\n })\n if (cached.status === 'hit') {\n return { cell: { ...cached.cell, cached: true }, artifactsByPath: {} }\n }\n }\n\n const startMs = Date.now()\n const trace = args.buildTraceWriter(args.slot.cellId, cellDir)\n const artifactsByPath: Record<string, string> = {}\n const artifacts: CampaignArtifactWriter = {\n async write(path, content) {\n const fullPath = join(cellDir, path)\n storage.ensureDir(join(fullPath, '..'))\n storage.write(fullPath, content)\n artifactsByPath[`${args.slot.cellId}/${path}`] = fullPath\n return fullPath\n },\n async writeJson(path, value) {\n return artifacts.write(path, JSON.stringify(value, null, 2))\n },\n }\n let costSoFar = 0\n const tokensSoFar: CampaignTokenUsage = { input: 0, output: 0 }\n let resolvedModel: string | undefined\n const cost: CampaignCostMeter = {\n observe(amount, source) {\n costSoFar += amount\n trace.span(`cost.${source}`, { amountUsd: amount }).end()\n },\n observeTokens(usage) {\n tokensSoFar.input += usage.input\n tokensSoFar.output += usage.output\n if (usage.cached) tokensSoFar.cached = (tokensSoFar.cached ?? 0) + usage.cached\n },\n observeModel(model) {\n const trimmed = model?.trim()\n if (trimmed) resolvedModel = trimmed\n },\n current() {\n return costSoFar\n },\n tokens() {\n return { ...tokensSoFar }\n },\n resolvedModel() {\n return resolvedModel\n },\n }\n\n const placement = args.opts.cellPlacement?.({\n scenario: args.slot.scenario,\n rep: args.slot.rep,\n })\n\n // Per-cell abort signal, chained to the campaign signal. The dispatch sees\n // THIS signal so a timeout (below) can abort just this cell's in-flight work\n // without tearing down sibling cells — and a signal-honoring dispatch\n // releases its open request instead of leaking it past the deadline.\n const cellAbort = new AbortController()\n const onCampaignAbort = () => cellAbort.abort((args.signal as { reason?: unknown }).reason)\n if (args.signal.aborted) cellAbort.abort((args.signal as { reason?: unknown }).reason)\n else args.signal.addEventListener('abort', onCampaignAbort, { once: true })\n\n const ctx: DispatchContext = {\n cellId: args.slot.cellId,\n rep: args.slot.rep,\n seed: args.slot.cellSeed,\n signal: cellAbort.signal,\n trace,\n artifacts,\n cost,\n placement,\n }\n\n let artifact: TArtifact | undefined\n let errorMessage: string | undefined\n const timeoutMs = args.dispatchTimeoutMs\n let timeoutTimer: ReturnType<typeof setTimeout> | undefined\n try {\n const dispatched = args.opts.dispatch(args.slot.scenario, ctx)\n if (timeoutMs !== undefined && timeoutMs > 0) {\n // A dispatch that never settles (stalled model request, exhausted runtime\n // resource, a stream that never closes) must NOT hang the cell — and with\n // it the lane, the campaign, the loop, the CI job — forever. Race it\n // against the deadline; on timeout, abort the cell and fail it LOUD.\n artifact = await Promise.race([\n dispatched,\n new Promise<never>((_, reject) => {\n timeoutTimer = setTimeout(() => {\n cellAbort.abort(new Error('dispatch timeout'))\n reject(\n new Error(\n `dispatch exceeded ${timeoutMs}ms for cell '${args.slot.cellId}' — aborted and failed loud (no silent hang)`,\n ),\n )\n }, timeoutMs)\n if (typeof (timeoutTimer as { unref?: () => void }).unref === 'function')\n (timeoutTimer as { unref: () => void }).unref()\n }),\n ])\n } else {\n artifact = await dispatched\n }\n } catch (err) {\n errorMessage = err instanceof Error ? err.message : String(err)\n } finally {\n if (timeoutTimer) clearTimeout(timeoutTimer)\n args.signal.removeEventListener('abort', onCampaignAbort)\n }\n\n // Run judges (only if we have an artifact). A judge that throws invalidates\n // the cell — recorded as `error`, NOT folded into a fake composite:0 (a fake\n // zero is indistinguishable from a real zero and poisons every aggregate).\n const judgeScores: Record<string, JudgeScore> = {}\n if (artifact !== undefined) {\n for (const judge of args.opts.judges ?? []) {\n if (judge.appliesTo && !judge.appliesTo(args.slot.scenario)) continue\n try {\n judgeScores[judge.name] = await runJudgeCell(judge, {\n artifact,\n scenario: args.slot.scenario,\n signal: args.signal,\n })\n } catch (err) {\n errorMessage = `judge '${judge.name}' failed: ${err instanceof Error ? err.message : String(err)}`\n break\n }\n }\n }\n\n await trace.flush()\n\n const cell: CampaignCellResult<TArtifact> = {\n manifestHash: args.manifestHash,\n cellId: args.slot.cellId,\n scenarioId: args.slot.scenario.id,\n rep: args.slot.rep,\n artifact: (artifact ?? null) as TArtifact,\n judgeScores,\n costUsd: costSoFar,\n tokenUsage: { ...tokensSoFar },\n ...(resolvedModel ? { resolvedModel } : {}),\n durationMs: Date.now() - startMs,\n seed: args.slot.cellSeed,\n cached: false,\n error: errorMessage,\n }\n\n if (!errorMessage && args.resumable) {\n storage.write(cachePath, JSON.stringify(cell))\n }\n\n return { cell, artifactsByPath }\n}\n\nexport interface CampaignRunPlanCell {\n cellId: string\n scenarioId: string\n rep: number\n seed: number\n cachePath: string\n status: 'cached' | 'run'\n reason?: 'missing' | 'manifest-mismatch' | 'cell-mismatch' | 'corrupt' | 'resumable-off'\n}\n\nexport interface CampaignRunPlan {\n manifestHash: string\n totalCells: number\n cellsCached: number\n cellsToRun: number\n cells: CampaignRunPlanCell[]\n}\n\nexport interface PlanCampaignRunOptions<TScenario extends Scenario, TArtifact> {\n scenarios: TScenario[]\n dispatch?: DispatchFn<TScenario, TArtifact>\n dispatchRef?: string\n judges?: JudgeConfig<TArtifact, TScenario>[]\n seed?: number\n reps?: number\n resumable?: boolean\n runDir: string\n /** Subject repo for the shared run-dir root (see RunCampaignOptions.repo). */\n repo?: string\n storage?: CampaignStorage\n}\n\nexport function planCampaignRun<TScenario extends Scenario, TArtifact>(\n opts: PlanCampaignRunOptions<TScenario, TArtifact>,\n): CampaignRunPlan {\n const seed = opts.seed ?? 42\n const reps = opts.reps ?? 1\n const resumable = opts.resumable ?? true\n const storage = opts.storage ?? fsCampaignStorage()\n\n if (typeof opts.runDir !== 'string' || opts.runDir.trim().length === 0) {\n throw new Error('planCampaignRun: runDir is required and must be a non-empty string')\n }\n opts.runDir = resolveRunDir(opts.runDir, opts.repo)\n\n const manifestHash = computeManifestHash({\n scenarios: opts.scenarios,\n judges: (opts.judges ?? []) as unknown as JudgeConfig<unknown>[],\n dispatchRef: dispatchRefFor(opts.dispatch, opts.dispatchRef),\n seed,\n reps,\n })\n\n const cells = buildCellSchedule(opts.scenarios, seed, reps).map((slot): CampaignRunPlanCell => {\n const cachePath = join(\n opts.runDir,\n slot.cellId.replace(/[^a-zA-Z0-9_-]/g, '_'),\n 'cached-result.json',\n )\n if (!resumable) {\n return {\n cellId: slot.cellId,\n scenarioId: slot.scenario.id,\n rep: slot.rep,\n seed: slot.cellSeed,\n cachePath,\n status: 'run',\n reason: 'resumable-off',\n }\n }\n\n const cached = readCachedCell<unknown>({\n storage,\n cachePath,\n cellId: slot.cellId,\n manifestHash,\n })\n if (cached.status === 'hit') {\n return {\n cellId: slot.cellId,\n scenarioId: slot.scenario.id,\n rep: slot.rep,\n seed: slot.cellSeed,\n cachePath,\n status: 'cached',\n }\n }\n\n return {\n cellId: slot.cellId,\n scenarioId: slot.scenario.id,\n rep: slot.rep,\n seed: slot.cellSeed,\n cachePath,\n status: 'run',\n reason: cached.reason,\n }\n })\n\n const cellsCached = cells.filter((cell) => cell.status === 'cached').length\n return {\n manifestHash,\n totalCells: cells.length,\n cellsCached,\n cellsToRun: cells.length - cellsCached,\n cells,\n }\n}\n\n/**\n * Per-cell stub guard. A cell that produced an artifact (no error) but reported\n * `costUsd === 0` AND zero tokens means the dispatch never called `ctx.cost` —\n * i.e. it ran against a stub or silently dropped its usage. `'warn'` logs it,\n * `'assert'` throws (fail-fast), `'off'` skips. An errored/skipped cell or a\n * deterministic judge-only run that genuinely made no LLM call is not flagged.\n */\nfunction enforceCellUsage<TArtifact>(\n cell: CampaignCellResult<TArtifact>,\n mode: 'assert' | 'warn' | 'off',\n): void {\n if (mode === 'off' || cell.error) return\n if (cell.artifact === null || cell.artifact === undefined) return\n const zeroTokens = cell.tokenUsage.input === 0 && cell.tokenUsage.output === 0\n if (cell.costUsd !== 0 || !zeroTokens) return\n const msg = `cell '${cell.cellId}' produced an artifact but reported zero cost and zero tokens — the dispatch never reported LLM usage via ctx.cost.observe/observeTokens (a stub cell)`\n if (mode === 'assert') {\n const report: BackendIntegrityReport = {\n totalRecords: 1,\n stubRecords: 1,\n realRecords: 0,\n uncostedRecords: 0,\n totalInputTokens: 0,\n totalOutputTokens: 0,\n totalCostUsd: 0,\n verdict: 'stub',\n diagnosis: msg,\n }\n throw new BackendIntegrityError(`expectUsage: ${msg}`, report)\n }\n // eslint-disable-next-line no-console\n console.warn(`[runCampaign] expectUsage: ${msg}`)\n}\n\nasync function runJudgeCell<TArtifact, TScenario extends Scenario>(\n judge: JudgeConfig<TArtifact, TScenario>,\n input: { artifact: TArtifact; scenario: TScenario; signal: AbortSignal },\n): Promise<JudgeScore> {\n return judge.score(input)\n}\n\nfunction defaultBuildTraceWriter(\n storage: CampaignStorage,\n): (cellId: string, dir: string) => CampaignTraceWriter {\n return (cellId, dir) => {\n const spans: Array<Record<string, unknown>> = []\n return {\n span(name, attributes) {\n const startMs = Date.now()\n const record: Record<string, unknown> = { name, cellId, startMs, ...(attributes ?? {}) }\n const finish: TraceSpan = {\n end(endAttrs) {\n record.durationMs = Date.now() - startMs\n if (endAttrs) Object.assign(record, endAttrs)\n spans.push(record)\n },\n setAttribute(key, value) {\n record[key] = value\n },\n }\n return finish\n },\n async flush() {\n storage.write(join(dir, 'spans.jsonl'), spans.map((s) => JSON.stringify(s)).join('\\n'))\n },\n }\n }\n}\n\nfunction skippedCell<TScenario extends Scenario, TArtifact>(\n slot: { scenario: TScenario; rep: number; cellId: string; cellSeed: number },\n reason: string,\n): CampaignCellResult<TArtifact> {\n return {\n cellId: slot.cellId,\n scenarioId: slot.scenario.id,\n rep: slot.rep,\n artifact: null as unknown as TArtifact,\n judgeScores: {},\n costUsd: 0,\n tokenUsage: { input: 0, output: 0 },\n durationMs: 0,\n seed: slot.cellSeed,\n cached: false,\n error: `skipped: ${reason}`,\n }\n}\n\nfunction buildCellSchedule<TScenario extends Scenario>(\n scenarios: TScenario[],\n seed: number,\n reps: number,\n): Array<{ scenario: TScenario; rep: number; cellId: string; cellSeed: number }> {\n const schedule: Array<{ scenario: TScenario; rep: number; cellId: string; cellSeed: number }> = []\n let cellIndex = 0\n for (const scenario of scenarios) {\n for (let rep = 0; rep < reps; rep++) {\n const cellId = `${scenario.id}:${rep}`\n const cellSeed = seed + cellIndex\n schedule.push({ scenario, rep, cellId, cellSeed })\n cellIndex += 1\n }\n }\n return schedule\n}\n\nfunction dispatchRefFor<TScenario extends Scenario, TArtifact>(\n dispatch: DispatchFn<TScenario, TArtifact> | undefined,\n override: string | undefined,\n): string {\n const ref = override ?? dispatch?.name ?? 'anonymous'\n if (typeof ref !== 'string' || ref.trim().length === 0) {\n throw new Error('runCampaign: dispatchRef must be a non-empty string when provided')\n }\n return ref\n}\n\ntype CacheRead<TArtifact> =\n | { status: 'hit'; cell: CampaignCellResult<TArtifact> }\n | { status: 'miss'; reason: 'missing' | 'manifest-mismatch' | 'cell-mismatch' | 'corrupt' }\n\nfunction readCachedCell<TArtifact>(args: {\n storage: CampaignStorage\n cachePath: string\n cellId: string\n manifestHash: string\n}): CacheRead<TArtifact> {\n const raw = args.storage.read(args.cachePath)\n if (raw === undefined) return { status: 'miss', reason: 'missing' }\n\n try {\n const cached = JSON.parse(raw) as CampaignCellResult<TArtifact>\n if (cached.cellId !== args.cellId) return { status: 'miss', reason: 'cell-mismatch' }\n if (cached.manifestHash !== args.manifestHash) {\n return { status: 'miss', reason: 'manifest-mismatch' }\n }\n return { status: 'hit', cell: cached }\n } catch {\n return { status: 'miss', reason: 'corrupt' }\n }\n}\n\ninterface CaptureArgs<TScenario extends Scenario, TArtifact> {\n store: LabeledScenarioStore\n cell: CampaignCellResult<TArtifact>\n scenario: TScenario\n opts: RunCampaignOptions<TScenario, TArtifact>\n now: () => Date\n}\n\nasync function captureToStore<TScenario extends Scenario, TArtifact>(\n args: CaptureArgs<TScenario, TArtifact>,\n): Promise<void> {\n await args.store.observe({\n scenario: args.scenario,\n artifact: args.cell.artifact,\n judgeScores: args.cell.judgeScores,\n source: args.opts.captureSource ?? 'eval-run',\n sourceVersionHash: args.opts.captureSourceVersionHash ?? 'unknown',\n capturedAt: args.now().toISOString(),\n redactionStatus: 'raw',\n })\n}\n\n// ── Aggregates + manifest hash ────────────────────────────────────────\n\nfunction computeManifestHash(input: {\n scenarios: Scenario[]\n judges: JudgeConfig<unknown>[]\n dispatchRef: string\n seed: number\n reps: number\n}): string {\n return contentHash({\n scenarios: input.scenarios,\n judges: input.judges.map((j) => ({ name: j.name, dims: j.dimensions })),\n dispatch: input.dispatchRef,\n seed: input.seed,\n reps: input.reps,\n })\n}\n\nfunction computeAggregates<TArtifact>(\n cells: CampaignCellResult<TArtifact>[],\n judges: JudgeConfig<TArtifact>[],\n seed: number,\n): CampaignAggregates {\n const byJudge: Record<string, JudgeAggregate> = {}\n for (const judge of judges) {\n const scores: number[] = []\n for (const cell of cells) {\n const s = cell.judgeScores[judge.name]\n if (s !== undefined) scores.push(s.composite)\n }\n byJudge[judge.name] = aggregate(scores, seed)\n }\n const byScenario: Record<string, ScenarioAggregate> = {}\n const scenarioGroups = new Map<string, number[]>()\n for (const cell of cells) {\n const composites = Object.values(cell.judgeScores).map((s) => s.composite)\n if (composites.length === 0) continue\n const mean = composites.reduce((a, b) => a + b, 0) / composites.length\n const arr = scenarioGroups.get(cell.scenarioId) ?? []\n arr.push(mean)\n scenarioGroups.set(cell.scenarioId, arr)\n }\n for (const [scenarioId, samples] of scenarioGroups) {\n const ag = aggregate(samples, seed)\n byScenario[scenarioId] = { meanComposite: ag.mean, ci95: ag.ci95, n: ag.n }\n }\n return {\n byJudge,\n byScenario,\n totalCostUsd: cells.reduce((a, c) => a + c.costUsd, 0),\n cellsExecuted: cells.filter((c) => !c.error).length,\n cellsSkipped: cells.filter((c) => c.error?.startsWith('skipped:')).length,\n cellsCached: cells.filter((c) => c.cached).length,\n cellsFailed: cells.filter((c) => c.error && !c.error.startsWith('skipped:')).length,\n }\n}\n\n// Percentile bootstrap CI95 via seeded resampling. Deterministic for a given\n// seed — same campaign re-run produces identical CI bands. Falls back to\n// degenerate intervals at n<=1 (the bootstrap is undefined there).\nfunction aggregate(samples: number[], seed: number): JudgeAggregate {\n const n = samples.length\n if (n === 0) return { mean: 0, stdev: 0, ci95: [0, 0], n: 0 }\n const mean = samples.reduce((a, b) => a + b, 0) / n\n const variance = samples.reduce((a, b) => a + (b - mean) ** 2, 0) / Math.max(1, n - 1)\n const stdev = Math.sqrt(variance)\n const ci = confidenceInterval(samples, 0.95, { seed, resamples: 1000 })\n return { mean, stdev, ci95: [ci.lower, ci.upper], n }\n}\n","/**\n * Backend-integrity guard: distinguish \"agent failed\" from \"eval ran against\n * a stub / unconfigured backend.\" Without this guard a canonical eval can\n * silently report `0/N passed` and look like an agent-quality problem when\n * the LLM was never actually called — the failure mode we just hit running\n * the 4-vertical parallel eval (legal-sandbox-stub returned hard-coded 33-104\n * char strings; gtm/creative defaulted to a cli-bridge that wasn't running).\n *\n * The shape:\n *\n * const report = summarizeBackendIntegrity(records)\n * assertRealBackend(records) // throws BackendIntegrityError if 100% stub\n *\n * A record is \"stub-mode\" if its `tokenUsage.input === 0 && tokenUsage.output === 0`.\n * (`costUsd` alone is unreliable — some backends successfully call LLMs but\n * don't propagate pricing, producing real tokens with $0 cost.)\n *\n * Verdicts:\n * - `real` — at least one record has nonzero token usage\n * - `stub` — every record is stub-mode (eval ran blind)\n * - `mixed` — some records real, some stub (partial backend failure;\n * often the 429-cascade or auth-half-failed case)\n */\n\nimport { AgentEvalError } from '../errors'\nimport type { RunRecord } from '../run-record'\n\nexport interface BackendIntegrityReport {\n /** Total records inspected. */\n totalRecords: number\n /** Records with input=0 AND output=0 (a stub fingerprint). */\n stubRecords: number\n /** Records with nonzero token usage (real LLM activity). */\n realRecords: number\n /** Records where output>0 but costUsd=0 (real LLM, broken cost ledger). */\n uncostedRecords: number\n /** Sum of input tokens across all records. */\n totalInputTokens: number\n /** Sum of output tokens across all records. */\n totalOutputTokens: number\n /** Sum of costUsd across all records. */\n totalCostUsd: number\n /** Worst-case integrity verdict. */\n verdict: 'real' | 'mixed' | 'stub'\n /** Human-readable diagnosis suitable for terminal output. */\n diagnosis: string\n}\n\n/**\n * Error thrown when an integrity assertion fails. Caller can pattern-match\n * by `code === 'AGENT_EVAL_BACKEND_STUB'` to differentiate from other\n * errors.\n */\nexport class BackendIntegrityError extends AgentEvalError {\n constructor(\n message: string,\n public readonly report: BackendIntegrityReport,\n ) {\n super('backend_integrity', message)\n }\n}\n\nfunction isStubRecord(rec: RunRecord): boolean {\n return rec.tokenUsage.input === 0 && rec.tokenUsage.output === 0\n}\n\nfunction isUncostedRecord(rec: RunRecord): boolean {\n return rec.tokenUsage.output > 0 && rec.costUsd === 0\n}\n\n/**\n * Inspect a batch of RunRecords and return an integrity report. Pure\n * function — no I/O, no logging. The caller decides what to do with the\n * verdict (print warning, throw, gate CI, etc.).\n */\nexport function summarizeBackendIntegrity(\n records: ReadonlyArray<RunRecord>,\n): BackendIntegrityReport {\n const totalRecords = records.length\n let stubRecords = 0\n let realRecords = 0\n let uncostedRecords = 0\n let totalInputTokens = 0\n let totalOutputTokens = 0\n let totalCostUsd = 0\n for (const rec of records) {\n totalInputTokens += rec.tokenUsage.input\n totalOutputTokens += rec.tokenUsage.output\n totalCostUsd += rec.costUsd\n if (isStubRecord(rec)) stubRecords++\n else realRecords++\n if (isUncostedRecord(rec)) uncostedRecords++\n }\n const verdict: BackendIntegrityReport['verdict'] =\n totalRecords === 0\n ? 'stub'\n : stubRecords === totalRecords\n ? 'stub'\n : stubRecords === 0\n ? 'real'\n : 'mixed'\n const diagnosis = buildDiagnosis({\n totalRecords,\n stubRecords,\n realRecords,\n uncostedRecords,\n totalInputTokens,\n totalOutputTokens,\n totalCostUsd,\n verdict,\n })\n return {\n totalRecords,\n stubRecords,\n realRecords,\n uncostedRecords,\n totalInputTokens,\n totalOutputTokens,\n totalCostUsd,\n verdict,\n diagnosis,\n }\n}\n\nfunction buildDiagnosis(r: Omit<BackendIntegrityReport, 'diagnosis'>): string {\n if (r.totalRecords === 0) {\n return 'no records — eval produced zero runs; backend likely failed before first turn'\n }\n if (r.verdict === 'stub') {\n return [\n `all ${r.totalRecords} records have zero token usage — the LLM backend was never called.`,\n 'common causes: --backend sandbox without a sandbox bridge running; stub model returning hard-coded strings;',\n 'auth misconfigured so requests were silently dropped before the LLM. Re-run with --backend tcloud and TANGLE_API_KEY set,',\n 'or boot the cli-bridge / sandbox before invoking the eval.',\n ].join(' ')\n }\n if (r.verdict === 'mixed') {\n const pct = ((r.stubRecords / r.totalRecords) * 100).toFixed(0)\n return [\n `${r.stubRecords}/${r.totalRecords} records (${pct}%) have zero token usage — the backend partially failed.`,\n 'common causes: rate-limit cascade (429s after the first N personas);',\n 'transient auth expiry mid-run; provider outage. Treat the affected records as missing data, not agent failures.',\n ].join(' ')\n }\n // verdict === 'real'\n if (r.uncostedRecords > 0) {\n const pct = ((r.uncostedRecords / r.totalRecords) * 100).toFixed(0)\n return [\n `${r.totalRecords} records with real LLM activity (in=${r.totalInputTokens}, out=${r.totalOutputTokens} tokens).`,\n `${r.uncostedRecords} (${pct}%) have output tokens but costUsd=0. Two distinct roots:`,\n '(a) cost ledger mis-wired — no usage propagation from the runtime stream into RunRecord; or',\n '(b) the model is unpriced at the source (sandbox/router returned $0 despite real tokens).',\n 'For (b), price the measured tokens against the substrate table (estimateCost) instead of leaving $0.',\n ].join(' ')\n }\n return `${r.totalRecords} records with real LLM activity (in=${r.totalInputTokens}, out=${r.totalOutputTokens} tokens, $${r.totalCostUsd.toFixed(4)}).`\n}\n\n/**\n * Throw BackendIntegrityError if the verdict is 'stub' — i.e. every record\n * shows zero LLM activity. Non-strict callers can pass `{ allowMixed: false }`\n * to also reject mixed verdicts (recommended for CI gates).\n *\n * Real backends pass through silently.\n */\nexport function assertRealBackend(\n records: ReadonlyArray<RunRecord>,\n opts: { allowMixed?: boolean } = {},\n): BackendIntegrityReport {\n const report = summarizeBackendIntegrity(records)\n const allowMixed = opts.allowMixed ?? true\n if (report.verdict === 'stub') {\n throw new BackendIntegrityError(\n `backend-integrity: ran against a stub or unconfigured backend — ${report.diagnosis}`,\n report,\n )\n }\n if (!allowMixed && report.verdict === 'mixed') {\n throw new BackendIntegrityError(\n `backend-integrity: partial backend failure rejected — ${report.diagnosis}`,\n report,\n )\n }\n return report\n}\n","/**\n * Content-addressed judge-verdict caching.\n *\n * LAW: cache JUDGE VERDICTS only — judging the same artifact with the same\n * judge+rubric is pure. NEVER cache agent rollouts. (A router that cached\n * identical fanout prompts silently destroyed best-of-N diversity; rollout\n * caching reintroduces that failure class. Judging has no diversity to\n * destroy — same artifact + same rubric ⇒ same verdict is the desired\n * property, not a bug.)\n *\n * The cache key is a sha-256 over the canonical JSON of everything that can\n * change a verdict: the artifact content, the scenario id, the judge name,\n * the full dimension list (key + description — the description IS the rubric\n * text shown to the judge), and a caller-supplied `judgeVersion`.\n * `judgeVersion` is REQUIRED: a judge whose prompt/model/ensemble changes\n * without a version bump would otherwise silently serve stale verdicts.\n *\n * Strict canonicalization (`canonicalJson`) throws on undefined / function /\n * symbol / non-finite numbers — an artifact that cannot be unambiguously\n * serialized cannot be content-addressed, and coercing it would let two\n * different artifacts collide on one key.\n */\n\nimport { createHash } from 'node:crypto'\nimport { appendFileSync, existsSync, readFileSync } from 'node:fs'\nimport type { JudgeConfig, JudgeScore, Scenario } from './campaign/types'\n\n// ── canonical JSON + content hash ─────────────────────────────────────────\n\nfunction canonicalizeAt(value: unknown, path: string): string {\n if (value === null) return 'null'\n switch (typeof value) {\n case 'boolean':\n return value ? 'true' : 'false'\n case 'number':\n if (!Number.isFinite(value)) {\n throw new Error(\n `canonicalJson: non-finite number (${value}) at ${path} — ambiguity is an error, not a coercion`,\n )\n }\n return JSON.stringify(value)\n case 'string':\n return JSON.stringify(value)\n case 'undefined':\n case 'function':\n case 'symbol':\n throw new Error(\n `canonicalJson: ${typeof value} at ${path} — ambiguity is an error, not a coercion`,\n )\n case 'bigint':\n throw new Error(`canonicalJson: bigint at ${path} — not representable in JSON`)\n case 'object':\n break\n }\n const obj = value as Record<string, unknown>\n // Honor toJSON (Date → ISO string) before structural checks — without it a\n // Date would canonicalize to '{}' and every timestamp would collide.\n if (typeof obj.toJSON === 'function') {\n return canonicalizeAt((obj as { toJSON(): unknown }).toJSON(), path)\n }\n if (Array.isArray(obj)) {\n return `[${obj.map((item, i) => canonicalizeAt(item, `${path}[${i}]`)).join(',')}]`\n }\n if (obj instanceof Map || obj instanceof Set) {\n throw new Error(\n `canonicalJson: ${obj instanceof Map ? 'Map' : 'Set'} at ${path} — would serialize as '{}'; convert to a plain object/array first`,\n )\n }\n const keys = Object.keys(obj).sort()\n const parts = keys.map((k) => `${JSON.stringify(k)}:${canonicalizeAt(obj[k], `${path}.${k}`)}`)\n return `{${parts.join(',')}}`\n}\n\n/**\n * Stable JSON stringify: object keys sorted recursively, so two semantically\n * equal values produce byte-identical output regardless of key insertion\n * order. Throws on undefined / function / symbol / NaN / ±Infinity / bigint /\n * Map / Set — anything JSON.stringify would coerce or drop silently.\n *\n * Distinct from `pre-registration.ts`'s `canonicalize`/`hashJson`, which are\n * permissive (coercion allowed) and async (web-crypto). Use THIS pair when a\n * hash collision or silent coercion would corrupt a cache key or attestation.\n */\nexport function canonicalJson(value: unknown): string {\n return canonicalizeAt(value, '$')\n}\n\n/** Hex sha-256 over `canonicalJson(value)`. The content address used by the\n * verdict cache and report attestation. */\nexport function contentHash(value: unknown): string {\n return createHash('sha256').update(canonicalJson(value)).digest('hex')\n}\n\n// ── store contract ─────────────────────────────────────────────────────────\n\n/** Pluggable verdict store. Sync or async on both legs — `cachedJudge`\n * awaits the results either way. */\nexport interface VerdictCacheStore {\n get(key: string): Promise<JudgeScore | undefined> | JudgeScore | undefined\n set(key: string, score: JudgeScore): Promise<void> | void\n}\n\n/** Process-local Map-backed store. */\nexport function inMemoryVerdictCache(): VerdictCacheStore {\n const entries = new Map<string, JudgeScore>()\n return {\n get: (key) => entries.get(key),\n set: (key, score) => {\n entries.set(key, score)\n },\n }\n}\n\ninterface VerdictCacheLine {\n key: string\n score: JudgeScore\n}\n\nfunction parseCacheLine(line: string, path: string, lineNo: number): VerdictCacheLine {\n let parsed: unknown\n try {\n parsed = JSON.parse(line)\n } catch (err) {\n throw new Error(\n `fileVerdictCache: corrupt JSONL at ${path}:${lineNo} — ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n const rec = parsed as Partial<VerdictCacheLine>\n if (\n typeof rec !== 'object' ||\n rec === null ||\n typeof rec.key !== 'string' ||\n typeof rec.score !== 'object' ||\n rec.score === null ||\n typeof rec.score.composite !== 'number' ||\n typeof rec.score.dimensions !== 'object'\n ) {\n throw new Error(\n `fileVerdictCache: invalid record shape at ${path}:${lineNo} — expected {key, score:{dimensions, composite, notes}}`,\n )\n }\n return rec as VerdictCacheLine\n}\n\n/**\n * JSONL-file-backed store: the full file is loaded into an in-memory index at\n * construction; every `set` appends one line synchronously (durable before\n * the verdict is returned). A corrupt or malformed line throws at load with\n * file:line — a skipped line would silently re-judge (cost) or, worse, mask\n * a half-written file that needs operator attention.\n */\nexport function fileVerdictCache(path: string): VerdictCacheStore {\n const entries = new Map<string, JudgeScore>()\n if (existsSync(path)) {\n const lines = readFileSync(path, 'utf8').split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n if (line === undefined || line.trim() === '') continue\n const rec = parseCacheLine(line, path, i + 1)\n entries.set(rec.key, rec.score)\n }\n }\n return {\n get: (key) => entries.get(key),\n set: (key, score) => {\n appendFileSync(path, `${JSON.stringify({ key, score })}\\n`, 'utf8')\n entries.set(key, score)\n },\n }\n}\n\n// ── cached judge wrapper ───────────────────────────────────────────────────\n\nexport interface VerdictCacheStats {\n hits: number\n misses: number\n}\n\nexport interface CachedJudgeOptions {\n /** REQUIRED — part of the cache key. Bump on any change to the judge's\n * prompt, model, ensemble, or scoring logic; silent judge upgrades must\n * never serve stale verdicts. */\n judgeVersion: string\n}\n\n/** The wrapped judge: same `JudgeConfig` seam, plus hit/miss observability. */\nexport type CachedJudge<TArtifact, TScenario extends Scenario = Scenario> = JudgeConfig<\n TArtifact,\n TScenario\n> & {\n stats(): VerdictCacheStats\n}\n\n/**\n * Wrap a `JudgeConfig` so repeat judgments of the same artifact are served\n * from the store instead of re-invoking `score()`. The wrapper is generic\n * over the judge's own type parameters and preserves `appliesTo` — it is a\n * drop-in replacement anywhere a `JudgeConfig` is accepted.\n *\n * A judge that throws is NOT cached: the error propagates and the next\n * attempt re-judges (caching a failure would pin a transient outage forever).\n */\nexport function cachedJudge<TArtifact, TScenario extends Scenario = Scenario>(\n judge: JudgeConfig<TArtifact, TScenario>,\n store: VerdictCacheStore,\n options: CachedJudgeOptions,\n): CachedJudge<TArtifact, TScenario> {\n if (typeof options.judgeVersion !== 'string' || options.judgeVersion.trim() === '') {\n throw new Error('cachedJudge: judgeVersion is required and must be a non-empty string')\n }\n const stats: VerdictCacheStats = { hits: 0, misses: 0 }\n const wrapped: CachedJudge<TArtifact, TScenario> = {\n name: judge.name,\n dimensions: judge.dimensions,\n async score(input) {\n const key = contentHash({\n artifact: canonicalJson(input.artifact),\n scenarioId: input.scenario.id,\n judgeName: judge.name,\n dimensions: judge.dimensions,\n judgeVersion: options.judgeVersion,\n })\n const cached = await store.get(key)\n if (cached !== undefined) {\n stats.hits += 1\n return cached\n }\n const score = await judge.score(input)\n await store.set(key, score)\n stats.misses += 1\n return score\n },\n stats: () => ({ ...stats }),\n }\n if (judge.appliesTo) wrapped.appliesTo = judge.appliesTo\n return wrapped\n}\n","import { homedir } from 'node:os'\nimport { basename, isAbsolute, join } from 'node:path'\n\n/** The shared, out-of-repo root for campaign/benchmark run bundles. Keeping run\n * outputs here means they never land in a repo working tree (no per-repo\n * gitignore, no clutter, no accidental commits). Layout:\n * ~/.tangle/traces/<repo>/runs/<runName>/\n * where <repo> disambiguates runs across repos in one place. */\nexport function tangleTracesRoot(): string {\n return join(homedir(), '.tangle', 'traces')\n}\n\n/** Resolve a campaign `runDir`. An absolute path is honored as-is (the caller\n * chose an explicit location). A bare name is placed under the shared home root\n * so bundles never pollute a repo working tree — the default the harness should\n * compute so callers pass a *name*, not a path. */\nexport function resolveRunDir(runDir: string, repo?: string): string {\n if (isAbsolute(runDir)) return runDir\n const r = repo && repo.trim().length > 0 ? repo : basename(process.cwd())\n return join(tangleTracesRoot(), r, 'runs', runDir)\n}\n","import { createRequire } from 'node:module'\n\n/**\n * `CampaignStorage` — the filesystem seam `runCampaign` writes through\n * (run/cell dirs, the resumability cache, per-cell artifacts, trace spans).\n *\n * The default (`fsCampaignStorage`) is the Node filesystem — identical\n * behavior to the inline `node:fs` calls it replaces, so existing CLI\n * consumers are unaffected. `inMemoryCampaignStorage` keeps everything in a\n * `Map`, so the substrate runs in environments WITHOUT a filesystem\n * (Cloudflare Workers, Deno Deploy, other edge runtimes) — the campaign\n * still produces its `CampaignResult` (cells + aggregates) in memory;\n * artifacts/traces simply aren't persisted to disk.\n *\n * Paths are opaque keys to the in-memory adapter — it does not parse them,\n * so the same `join(...)`-built paths work unchanged across both adapters.\n */\nexport interface CampaignStorage {\n /** Ensure a directory exists (recursive). No-op for in-memory. */\n ensureDir(dir: string): void\n /** Does this path exist (as a written file or an ensured dir)? */\n exists(path: string): boolean\n /** Read a UTF-8 file; `undefined` when missing or unreadable. */\n read(path: string): string | undefined\n /** Write a file (string or bytes). Parent dir is assumed ensured. */\n write(path: string, content: string | Uint8Array): void\n}\n\n/** Node-filesystem storage — the default. Lazily requires `node:fs` so the\n * module imports cleanly in non-Node runtimes (where the caller passes\n * `inMemoryCampaignStorage` instead and never constructs this).\n *\n * `createRequire(import.meta.url)` is the ESM-native lazy require — a bare\n * `require` is a ReferenceError under `\"type\": \"module\"`, which is exactly\n * the shape this package publishes. */\nexport function fsCampaignStorage(): CampaignStorage {\n const nodeRequire = createRequire(import.meta.url)\n const { existsSync, mkdirSync, readFileSync, writeFileSync } = nodeRequire(\n 'node:fs',\n ) as typeof import('node:fs')\n return {\n ensureDir(dir) {\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\n },\n exists(path) {\n return existsSync(path)\n },\n read(path) {\n try {\n return readFileSync(path, 'utf8')\n } catch {\n return undefined\n }\n },\n write(path, content) {\n writeFileSync(path, content as Uint8Array)\n },\n }\n}\n\n/** In-memory storage for filesystem-less runtimes. Artifacts + trace spans\n * live in a `Map` for the duration of the run; the `CampaignResult` is\n * fully populated, but nothing is persisted to disk. */\nexport function inMemoryCampaignStorage(): CampaignStorage {\n const files = new Map<string, string | Uint8Array>()\n const dirs = new Set<string>()\n return {\n ensureDir(dir) {\n dirs.add(dir)\n },\n exists(path) {\n return files.has(path) || dirs.has(path)\n },\n read(path) {\n const value = files.get(path)\n if (value === undefined) return undefined\n return typeof value === 'string' ? value : new TextDecoder().decode(value)\n },\n write(path, content) {\n files.set(path, content)\n },\n }\n}\n"],"mappings":"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","names":["join","existsSync","readFileSync","join"]}
@@ -1,4 +1,4 @@
1
- import { b as RunSplitTag, R as RunRecord } from './run-record-DEwidcqn.js';
1
+ import { b as RunSplitTag, R as RunRecord } from './run-record-MRdJ-Kq2.js';
2
2
 
3
3
  type CodeAgentSessionSource = 'codex' | 'claude-code' | 'opencode' | 'kimi-code' | 'pi';
4
4
  interface ParsedCodeAgentJsonl {
@@ -1,19 +1,19 @@
1
- import { S as Scenario, M as MutableSurface, b as DispatchContext, a as JudgeConfig, f as SurfaceProposer, g as Gate, L as LabeledScenarioStore, C as CampaignResult, j as GateDecision } from '../types-fWqEJm7h.js';
2
- export { k as CampaignAggregates, l as CampaignArtifactWriter, m as CampaignCellResult, n as CampaignCostMeter, d as CampaignTraceWriter, o as CodeSurface, D as Dispatch, h as GateContext, G as GateResult, p as GenerationCandidate, e as GenerationRecord, c as JudgeDimension, J as JudgeScore, i as Mutator, O as OptimizationProposer, q as OptimizerConfig, r as SessionScript } from '../types-fWqEJm7h.js';
3
- import { L as LoopProvenanceRecord, R as RunEvalOptions } from '../provenance-BEITkFII.js';
4
- export { A as AxisEvidence, a as AxisVerdict, B as BuildEvidenceVectorOptions, D as DefaultProductionGateOptions, E as EvidenceVector, b as EvolutionaryProposerOptions, H as HeldOutGateOptions, O as ObjectiveSource, P as ParetoSignificanceGateOptions, c as PromotionObjective, d as PromotionPolicy, e as buildEvidenceVector, f as composeGate, g as defaultProductionGate, h as evolutionaryProposer, i as heldOutGate, p as paretoPolicy, j as paretoSignificanceGate, r as runEval } from '../provenance-BEITkFII.js';
5
- import { C as CampaignStorage, a as RunOptimizationOptions, b as RunImprovementLoopResult } from '../gepa-bxuDoaO9.js';
6
- export { G as GepaProposerOptions, R as RunCampaignOptions, c as RunImprovementLoopOptions, f as fsCampaignStorage, g as gepaProposer, i as inMemoryCampaignStorage, r as runCampaign, d as runImprovementLoop } from '../gepa-bxuDoaO9.js';
1
+ import { S as Scenario, M as MutableSurface, b as DispatchContext, a as JudgeConfig, f as SurfaceProposer, g as Gate, L as LabeledScenarioStore, C as CampaignResult, j as GateDecision } from '../types-DFI_Z-ZL.js';
2
+ export { k as CampaignAggregates, l as CampaignArtifactWriter, m as CampaignCellResult, n as CampaignCostMeter, d as CampaignTraceWriter, o as CodeSurface, D as Dispatch, h as GateContext, G as GateResult, p as GenerationCandidate, e as GenerationRecord, c as JudgeDimension, J as JudgeScore, i as Mutator, O as OptimizationProposer, q as OptimizerConfig, r as SessionScript } from '../types-DFI_Z-ZL.js';
3
+ import { L as LoopProvenanceRecord, R as RunEvalOptions } from '../provenance-BhJm32vN.js';
4
+ export { A as AxisEvidence, a as AxisVerdict, B as BuildEvidenceVectorOptions, D as DefaultProductionGateOptions, E as EvidenceVector, b as EvolutionaryProposerOptions, H as HeldOutGateOptions, O as ObjectiveSource, P as ParetoSignificanceGateOptions, c as PromotionObjective, d as PromotionPolicy, e as buildEvidenceVector, f as composeGate, g as defaultProductionGate, h as evolutionaryProposer, i as heldOutGate, p as paretoPolicy, j as paretoSignificanceGate, r as runEval } from '../provenance-BhJm32vN.js';
5
+ import { C as CampaignStorage, a as RunOptimizationOptions, b as RunImprovementLoopResult } from '../gepa-DeyPTlvx.js';
6
+ export { G as GepaProposerOptions, R as RunCampaignOptions, c as RunImprovementLoopOptions, f as fsCampaignStorage, g as gepaProposer, i as inMemoryCampaignStorage, r as runCampaign, d as runImprovementLoop } from '../gepa-DeyPTlvx.js';
7
7
  export { D as DeploymentOutcome, F as FileSystemOutcomeStore, a as FileSystemOutcomeStoreOptions, I as InMemoryOutcomeStore, b as OutcomeStore } from '../outcome-store-rnXLEqSn.js';
8
8
  import { HostedTenant, EvalRunCellScore, EvalRunGenerationSnapshot, EvalRunEvent, TraceSpanEvent } from '../hosted/index.js';
9
- import { R as RunRecord, b as RunSplitTag } from '../run-record-DEwidcqn.js';
10
- import { I as InsightReport } from '../insight-report-C02J3q4T.js';
11
- export { F as FailureClusterInsight, a as InterRaterInsight, J as JudgeInsight, L as LiftInsight, O as OutcomeCorrelationInsight, R as Recommendation, b as ReleaseSummary, S as ScalarDistribution } from '../insight-report-C02J3q4T.js';
12
- export { D as DefaultAnalystRegistryOptions, c as buildDefaultAnalystRegistry } from '../default-registry-Dhrc__SE.js';
13
- export { A as AnalystFinding } from '../types-BEzCBMQD.js';
14
- import { A as AnalyzeRunsOptions } from '../analyze-runs-BlJRBniC.js';
15
- export { a as analyzeRuns } from '../analyze-runs-BlJRBniC.js';
16
- export { C as CodeAgentSessionDiagnostic, a as CodeAgentSessionIntakeOptions, b as CodeAgentSessionIntakeResult, c as CodeAgentSessionMetrics, d as CodeAgentSessionSource, P as ParsedCodeAgentJsonl, f as fromClaudeCodeSession, e as fromCodexSession, g as fromKimiCodeSession, h as fromOpenCodeSession, i as fromPiSession, j as fromPigraphSession, p as parseCodeAgentJsonl } from '../code-agent-session-B6ZcDwyA.js';
9
+ import { R as RunRecord, b as RunSplitTag } from '../run-record-MRdJ-Kq2.js';
10
+ import { I as InsightReport } from '../insight-report-k0sRTzKg.js';
11
+ export { F as FailureClusterInsight, a as InterRaterInsight, J as JudgeInsight, L as LiftInsight, O as OutcomeCorrelationInsight, R as Recommendation, b as ReleaseSummary, S as ScalarDistribution } from '../insight-report-k0sRTzKg.js';
12
+ export { D as DefaultAnalystRegistryOptions, c as buildDefaultAnalystRegistry } from '../default-registry-ZhqsTr4K.js';
13
+ export { A as AnalystFinding } from '../types-Dz9cKF0g.js';
14
+ import { A as AnalyzeRunsOptions } from '../analyze-runs-Cd-A_K4l.js';
15
+ export { a as analyzeRuns } from '../analyze-runs-Cd-A_K4l.js';
16
+ export { C as CodeAgentSessionDiagnostic, a as CodeAgentSessionIntakeOptions, b as CodeAgentSessionIntakeResult, c as CodeAgentSessionMetrics, d as CodeAgentSessionSource, P as ParsedCodeAgentJsonl, f as fromClaudeCodeSession, e as fromCodexSession, g as fromKimiCodeSession, h as fromOpenCodeSession, i as fromPiSession, j as fromPigraphSession, p as parseCodeAgentJsonl } from '../code-agent-session-Ce-9u7YM.js';
17
17
  import '../red-team-BWdoyleI.js';
18
18
  import '../dataset-BbGkaN2I.js';
19
19
  import '../errors-CzMUYo7b.js';
@@ -27,10 +27,10 @@ import '@tangle-network/tcloud';
27
27
  import '../llm-client-Bj7g0rqu.js';
28
28
  import '../raw-provider-sink-C46HDghv.js';
29
29
  import '@tangle-network/agent-interface';
30
- import '../summary-report-C4uzRWh8.js';
30
+ import '../summary-report-C0nnxOD8.js';
31
31
  import '../failure-cluster-DH9Flgcf.js';
32
32
  import '@ax-llm/ax';
33
- import '../kind-factory-OgqQSvLi.js';
33
+ import '../kind-factory-D0nk7AKV.js';
34
34
  import '../store-C1YxJDEK.js';
35
35
  import 'zod';
36
36
 
@@ -18,22 +18,22 @@ import {
18
18
  paretoPolicy,
19
19
  paretoSignificanceGate,
20
20
  runEval
21
- } from "../chunk-QUCGGMYM.js";
21
+ } from "../chunk-HV5PBTJF.js";
22
22
  import {
23
23
  analyzeRuns
24
- } from "../chunk-JCUREYF5.js";
24
+ } from "../chunk-U3IDYATS.js";
25
25
  import {
26
26
  emitLoopProvenance,
27
27
  gepaProposer,
28
28
  heldOutGate,
29
29
  runImprovementLoop,
30
30
  surfaceContentHash
31
- } from "../chunk-52CCCXU3.js";
31
+ } from "../chunk-NTVWIH24.js";
32
32
  import {
33
33
  fsCampaignStorage,
34
34
  inMemoryCampaignStorage,
35
35
  runCampaign
36
- } from "../chunk-LSCBODPQ.js";
36
+ } from "../chunk-XKA6ZGEY.js";
37
37
  import "../chunk-VI2UW6B6.js";
38
38
  import {
39
39
  buildDefaultAnalystRegistry
@@ -59,7 +59,7 @@ import {
59
59
  import "../chunk-PC4UYEBM.js";
60
60
  import {
61
61
  parseRunRecordSafe
62
- } from "../chunk-G6S73VA7.js";
62
+ } from "../chunk-2NSLDY4B.js";
63
63
  import "../chunk-ABOIVNXL.js";
64
64
  import "../chunk-VSMTAMNK.js";
65
65
  import "../chunk-3BFEG2F6.js";
@@ -3,7 +3,7 @@ import { C as ControlEvalResult, a as ControlRunResult, h as ControlRuntimeConfi
3
3
  import { T as TraceEmitter } from './emitter-C2rqGH_l.js';
4
4
  import { F as FailureClass } from './schema-m0gsnbt3.js';
5
5
  import { T as TraceStore } from './store-BcFXE6LG.js';
6
- import { b as RunSplitTag, c as RunTokenUsage, R as RunRecord } from './run-record-DEwidcqn.js';
6
+ import { b as RunSplitTag, c as RunTokenUsage, R as RunRecord } from './run-record-MRdJ-Kq2.js';
7
7
 
8
8
  interface ActionExecutionPolicy {
9
9
  allowedTypes?: string[];
package/dist/control.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as ActionExecutionPolicy, a as ActionPolicyDecision, C as ControlRunToRunRecordOptions, e as ProposeReviewConfig, f as ProposeReviewControlAction, g as ProposeReviewControlConfig, h as ProposeReviewControlResult, i as ProposeReviewControlState, j as ProposeReviewReport, p as RunEvidenceMetadata, s as controlRunToRunRecord, u as evaluateActionPolicy, x as runProposeReview, y as runProposeReviewAsControlLoop, z as scoreFromEvals } from './control-DC8TELh0.js';
1
+ export { A as ActionExecutionPolicy, a as ActionPolicyDecision, C as ControlRunToRunRecordOptions, e as ProposeReviewConfig, f as ProposeReviewControlAction, g as ProposeReviewControlConfig, h as ProposeReviewControlResult, i as ProposeReviewControlState, j as ProposeReviewReport, p as RunEvidenceMetadata, s as controlRunToRunRecord, u as evaluateActionPolicy, x as runProposeReview, y as runProposeReviewAsControlLoop, z as scoreFromEvals } from './control-C8RmK9H4.js';
2
2
  export { c as ControlActionFailureMode, d as ControlActionOutcome, e as ControlBudget, f as ControlContext, g as ControlDecision, C as ControlEvalResult, a as ControlRunResult, h as ControlRuntimeConfig, i as ControlRuntimeError, j as ControlSeverity, b as ControlStep, k as ControlStopPolicies, S as StopDecision, l as allCriticalPassed, o as objectiveEval, r as runAgentControlLoop, s as stopOnNoProgress, m as stopOnRepeatedAction, n as subjectiveEval } from './control-runtime-Acf9CGhw.js';
3
3
  import './feedback-trajectory-BxY0cKfs.js';
4
4
  import './dataset-BbGkaN2I.js';
@@ -6,5 +6,5 @@ import './errors-CzMUYo7b.js';
6
6
  import './emitter-C2rqGH_l.js';
7
7
  import './schema-m0gsnbt3.js';
8
8
  import './store-BcFXE6LG.js';
9
- import './run-record-DEwidcqn.js';
9
+ import './run-record-MRdJ-Kq2.js';
10
10
  import '@tangle-network/agent-interface';
package/dist/control.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  runProposeReview,
5
5
  runProposeReviewAsControlLoop,
6
6
  scoreFromEvals
7
- } from "./chunk-BOETF6BU.js";
7
+ } from "./chunk-B2TMQM62.js";
8
8
  import {
9
9
  allCriticalPassed,
10
10
  objectiveEval,
@@ -13,7 +13,7 @@ import {
13
13
  stopOnRepeatedAction,
14
14
  subjectiveEval
15
15
  } from "./chunk-YEHAEDUD.js";
16
- import "./chunk-G6S73VA7.js";
16
+ import "./chunk-2NSLDY4B.js";
17
17
  import "./chunk-TVVP3ZZQ.js";
18
18
  import "./chunk-ABOIVNXL.js";
19
19
  import "./chunk-VSMTAMNK.js";
@@ -1,4 +1,4 @@
1
- import { R as RunRecord, b as RunSplitTag } from './run-record-DEwidcqn.js';
1
+ import { R as RunRecord, b as RunSplitTag } from './run-record-MRdJ-Kq2.js';
2
2
  import { S as Span } from './schema-m0gsnbt3.js';
3
3
  import { T as TraceStore } from './store-BcFXE6LG.js';
4
4
 
@@ -1,6 +1,6 @@
1
1
  import { AxAIService } from '@ax-llm/ax';
2
- import { T as TraceAnalystKindSpec } from './kind-factory-OgqQSvLi.js';
3
- import { a as Analyst, b as AnalystContext, c as AnalystRunSummary, A as AnalystFinding, d as AnalystRunResult, C as ChatClient, e as AnalystRunInputs, f as AnalystRunEvent } from './types-BEzCBMQD.js';
2
+ import { T as TraceAnalystKindSpec } from './kind-factory-D0nk7AKV.js';
3
+ import { a as Analyst, b as AnalystContext, c as AnalystRunSummary, A as AnalystFinding, d as AnalystRunResult, C as ChatClient, e as AnalystRunInputs, f as AnalystRunEvent } from './types-Dz9cKF0g.js';
4
4
 
5
5
  /**
6
6
  * AnalystRegistry — orchestrate N analysts against one run.
@@ -3,9 +3,9 @@ export { c as CounterfactualContext, d as CounterfactualResult } from './counter
3
3
  import { S as Span } from './schema-m0gsnbt3.js';
4
4
  import { T as TraceStore } from './store-BcFXE6LG.js';
5
5
  import { a as TrajectoryStep, T as Trajectory } from './trajectory-2TkpSEVh.js';
6
- import { h as AnalystSeverity, A as AnalystFinding } from './types-BEzCBMQD.js';
7
- import { C as CorpusRecord } from './corpus-ONOzGFmG.js';
8
- import { R as RunRecord } from './run-record-DEwidcqn.js';
6
+ import { h as AnalystSeverity, A as AnalystFinding } from './types-Dz9cKF0g.js';
7
+ import { C as CorpusRecord } from './corpus-CiSzzLa5.js';
8
+ import { R as RunRecord } from './run-record-MRdJ-Kq2.js';
9
9
  import './emitter-C2rqGH_l.js';
10
10
  import './store-C1YxJDEK.js';
11
11
  import './types-C7DGg5ex.js';
package/dist/diagnose.js CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  } from "./chunk-HRGUJTER.js";
14
14
  import {
15
15
  validateRunRecord
16
- } from "./chunk-G6S73VA7.js";
16
+ } from "./chunk-2NSLDY4B.js";
17
17
  import "./chunk-TVVP3ZZQ.js";
18
18
  import "./chunk-ABOIVNXL.js";
19
19
  import "./chunk-VSMTAMNK.js";
@@ -1,4 +1,4 @@
1
- import { S as Scenario, C as CampaignResult, G as GateResult, D as DispatchFn, a as JudgeConfig, L as LabeledScenarioStore, d as CampaignTraceWriter, e as GenerationRecord, M as MutableSurface, P as ParetoParent, f as SurfaceProposer, g as Gate } from './types-fWqEJm7h.js';
1
+ import { S as Scenario, C as CampaignResult, G as GateResult, D as DispatchFn, a as JudgeConfig, L as LabeledScenarioStore, d as CampaignTraceWriter, e as GenerationRecord, M as MutableSurface, P as ParetoParent, f as SurfaceProposer, g as Gate } from './types-DFI_Z-ZL.js';
2
2
  import { L as LlmClientOptions } from './llm-client-Bj7g0rqu.js';
3
3
 
4
4
  /**