@tangle-network/agent-eval 0.215.1 → 0.216.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.
- package/CHANGELOG.md +12 -0
- package/dist/adapters/http.d.ts +2 -2
- package/dist/{agent-profile-DmzL8KaJ.d.ts → agent-profile-CIA2Atnt.d.ts} +3 -3
- package/dist/{agent-profile-DmzL8KaJ.d.ts.map → agent-profile-CIA2Atnt.d.ts.map} +1 -1
- package/dist/agreement-irr-DsTURxdr.js +186 -0
- package/dist/agreement-irr-DsTURxdr.js.map +1 -0
- package/dist/analyst/index.d.ts +485 -12
- package/dist/analyst/index.d.ts.map +1 -1
- package/dist/analyst/index.js +1543 -8
- package/dist/analyst/index.js.map +1 -1
- package/dist/{analyze-runs-BhFLOztS.d.ts → analyze-runs-CSDAh8A7.d.ts} +2 -2
- package/dist/{analyze-runs-BhFLOztS.d.ts.map → analyze-runs-CSDAh8A7.d.ts.map} +1 -1
- package/dist/{benchmark-command-CgpGi7vY.js → benchmark-command-CByl9dxG.js} +16 -32
- package/dist/benchmark-command-CByl9dxG.js.map +1 -0
- package/dist/benchmarks/index.d.ts +4 -4
- package/dist/benchmarks/index.js +3 -3
- package/dist/campaign/index.d.ts +6 -6
- package/dist/campaign/index.js +5 -5
- package/dist/{campaign-CpnsCgfz.js → campaign-BQ-Jujuj.js} +6 -6
- package/dist/{campaign-CpnsCgfz.js.map → campaign-BQ-Jujuj.js.map} +1 -1
- package/dist/cli.js +2 -2
- package/dist/cluster-bootstrap-B3JywQQn.js +66 -0
- package/dist/cluster-bootstrap-B3JywQQn.js.map +1 -0
- package/dist/contract/index.d.ts +9 -9
- package/dist/contract/index.js +6 -6
- package/dist/{default-registry-B4B7GMvI.d.ts → default-registry-BrWh62zf.d.ts} +6 -6
- package/dist/{default-registry-B4B7GMvI.d.ts.map → default-registry-BrWh62zf.d.ts.map} +1 -1
- package/dist/{default-registry-KP4-Tolz.js → default-registry-Cn1LQ2Ve.js} +741 -756
- package/dist/default-registry-Cn1LQ2Ve.js.map +1 -0
- package/dist/{define-agent-eval-DfXvNho5.d.ts → define-agent-eval-CEWkX5wZ.d.ts} +7 -7
- package/dist/{define-agent-eval-DfXvNho5.d.ts.map → define-agent-eval-CEWkX5wZ.d.ts.map} +1 -1
- package/dist/{define-agent-eval-BdfnqXeP.js → define-agent-eval-Ch3MWX6k.js} +3 -3
- package/dist/{define-agent-eval-BdfnqXeP.js.map → define-agent-eval-Ch3MWX6k.js.map} +1 -1
- package/dist/diagnosis/index.d.ts +2 -2
- package/dist/{dspy-rlm-engine-DZfHM7kT.js → dspy-rlm-engine-D-KX_e64.js} +3 -3
- package/dist/{dspy-rlm-engine-DZfHM7kT.js.map → dspy-rlm-engine-D-KX_e64.js.map} +1 -1
- package/dist/{engine-C37HS2kr.d.ts → engine-C_zNWfM8.d.ts} +4 -4
- package/dist/{engine-C37HS2kr.d.ts.map → engine-C_zNWfM8.d.ts.map} +1 -1
- package/dist/evaluation-Cn2dRZIz.d.ts +75 -0
- package/dist/evaluation-Cn2dRZIz.d.ts.map +1 -0
- package/dist/evaluation.d.ts +2 -74
- package/dist/{exact-types-Dlb73wN4.d.ts → exact-types-CD0lf5Qd.d.ts} +2 -2
- package/dist/{exact-types-Dlb73wN4.d.ts.map → exact-types-CD0lf5Qd.d.ts.map} +1 -1
- package/dist/experiment/index.d.ts +1 -1
- package/dist/{external-optimizer-process-GngofQML.js → external-optimizer-process-nnsY5D_4.js} +2 -2
- package/dist/{external-optimizer-process-GngofQML.js.map → external-optimizer-process-nnsY5D_4.js.map} +1 -1
- package/dist/{external-optimizer-subprocess-BUxifb8g.js → external-optimizer-subprocess-DcerlZSG.js} +261 -2
- package/dist/external-optimizer-subprocess-DcerlZSG.js.map +1 -0
- package/dist/{feedback-trajectory-BLN_6fEs.d.ts → feedback-trajectory-DkaDj0dj.d.ts} +3 -3
- package/dist/{feedback-trajectory-BLN_6fEs.d.ts.map → feedback-trajectory-DkaDj0dj.d.ts.map} +1 -1
- package/dist/{index-B7m2uzJL.d.ts → index-DlH0Y9gI.d.ts} +8 -8
- package/dist/{index-B7m2uzJL.d.ts.map → index-DlH0Y9gI.d.ts.map} +1 -1
- package/dist/{index-B3WBm953.d.ts → index-NvGBiO8H.d.ts} +6 -6
- package/dist/{index-B3WBm953.d.ts.map → index-NvGBiO8H.d.ts.map} +1 -1
- package/dist/{index-tYLUvk_w.d.ts → index-oQ4aHziK.d.ts} +7 -7
- package/dist/{index-tYLUvk_w.d.ts.map → index-oQ4aHziK.d.ts.map} +1 -1
- package/dist/index.d.ts +15 -15
- package/dist/index.js +12 -11
- package/dist/index.js.map +1 -1
- package/dist/{kind-factory-AaEhUADH.js → kind-factory-CbZ-6tvu.js} +2 -2
- package/dist/{kind-factory-AaEhUADH.js.map → kind-factory-CbZ-6tvu.js.map} +1 -1
- package/dist/{llm-judge-Cd5s5Ei6.js → llm-judge-PXV7Xljl.js} +3 -3
- package/dist/{llm-judge-Cd5s5Ei6.js.map → llm-judge-PXV7Xljl.js.map} +1 -1
- package/dist/{matrix-DXVAJMLD.d.ts → matrix-CHMiebFx.d.ts} +2 -2
- package/dist/{matrix-DXVAJMLD.d.ts.map → matrix-CHMiebFx.d.ts.map} +1 -1
- package/dist/meta-eval/index.js +1 -62
- package/dist/meta-eval/index.js.map +1 -1
- package/dist/multishot/golden/index.d.ts +1 -1
- package/dist/multishot/index.d.ts +2 -2
- package/dist/openapi.json +1 -1
- package/dist/pipelines/index.js +1 -1
- package/dist/{prime-protocol-BHia9vDz.d.ts → prime-protocol-CEE4BR9N.d.ts} +2 -2
- package/dist/{prime-protocol-BHia9vDz.d.ts.map → prime-protocol-CEE4BR9N.d.ts.map} +1 -1
- package/dist/{produced-state-BGp4BX8t.js → produced-state-ZCtDBxAE.js} +2 -2
- package/dist/{produced-state-BGp4BX8t.js.map → produced-state-ZCtDBxAE.js.map} +1 -1
- package/dist/{proposal-findings-CXblsskH.js → proposal-findings-BZiMTzAF.js} +2 -36
- package/dist/proposal-findings-BZiMTzAF.js.map +1 -0
- package/dist/{registry-CMYIaDgS.d.ts → registry-JYfPxcVz.d.ts} +9 -11
- package/dist/registry-JYfPxcVz.d.ts.map +1 -0
- package/dist/{report-command-CtIIsQKP.js → report-command-y8H6RSX8.js} +23 -7
- package/dist/report-command-y8H6RSX8.js.map +1 -0
- package/dist/rl.d.ts +3 -3
- package/dist/rl.js +1 -1
- package/dist/search/index.d.ts +2 -2
- package/dist/{search-kernel-BqyBZ9Wm.d.ts → search-kernel-CpcKH5Ih.d.ts} +2 -2
- package/dist/{search-kernel-BqyBZ9Wm.d.ts.map → search-kernel-CpcKH5Ih.d.ts.map} +1 -1
- package/dist/{semantic-concept-judge-BPqbwIVs.js → semantic-concept-judge-zQBG9hHU.js} +3 -3
- package/dist/{semantic-concept-judge-BPqbwIVs.js.map → semantic-concept-judge-zQBG9hHU.js.map} +1 -1
- package/dist/{skillopt-optimization-method-Dcepr6QL.js → skillopt-optimization-method-CCtzralq.js} +4 -4
- package/dist/{skillopt-optimization-method-Dcepr6QL.js.map → skillopt-optimization-method-CCtzralq.js.map} +1 -1
- package/dist/{statistical-heldout-CJTj2EoS.d.ts → statistical-heldout-BeR4bOdg.d.ts} +2 -2
- package/dist/{statistical-heldout-CJTj2EoS.d.ts.map → statistical-heldout-BeR4bOdg.d.ts.map} +1 -1
- package/dist/{store-otlp-DWVhUgEj.js → store-otlp-DtB4Slsr.js} +2 -2
- package/dist/{store-otlp-DWVhUgEj.js.map → store-otlp-DtB4Slsr.js.map} +1 -1
- package/dist/{store-tool-spans-BNzls3OD.d.ts → store-tool-spans-DR1SrCLK.d.ts} +4 -4
- package/dist/{store-tool-spans-BNzls3OD.d.ts.map → store-tool-spans-DR1SrCLK.d.ts.map} +1 -1
- package/dist/{store-tool-spans-BNICrhsb.js → store-tool-spans-fZIigrpP.js} +3 -3
- package/dist/{store-tool-spans-BNICrhsb.js.map → store-tool-spans-fZIigrpP.js.map} +1 -1
- package/dist/supervisor-run/index.d.ts +1 -1
- package/dist/supervisor-run/index.d.ts.map +1 -1
- package/dist/supervisor-run/index.js +1 -1
- package/dist/systemone-CpTLAlqb.d.ts +135 -0
- package/dist/systemone-CpTLAlqb.d.ts.map +1 -0
- package/dist/{systemone-review-DTClwgmE.js → systemone-review-BZWfrtq1.js} +2 -2
- package/dist/{systemone-review-DTClwgmE.js.map → systemone-review-BZWfrtq1.js.map} +1 -1
- package/dist/{systemone-review-C4dZgrgN.d.ts → systemone-review-B_yo1xsd.d.ts} +2 -2
- package/dist/{systemone-review-C4dZgrgN.d.ts.map → systemone-review-B_yo1xsd.d.ts.map} +1 -1
- package/dist/systemone.d.ts +4 -134
- package/dist/systemone.js +1 -1
- package/dist/terminal-record-BHocwFw1.js.map +1 -1
- package/dist/{tool-groups-BKRrtqy4.d.ts → tool-groups-mcxOXVlb.d.ts} +3 -3
- package/dist/tool-groups-mcxOXVlb.d.ts.map +1 -0
- package/dist/{tool-waste-BYt5rdt8.js → tool-waste-D52PqU9Q.js} +3 -156
- package/dist/tool-waste-D52PqU9Q.js.map +1 -0
- package/dist/{trace-questions-CLx8vt6t.d.ts → trace-questions-DG7nqLQ7.d.ts} +3 -3
- package/dist/{trace-questions-CLx8vt6t.d.ts.map → trace-questions-DG7nqLQ7.d.ts.map} +1 -1
- package/dist/trace-repair/index.d.ts +1 -1
- package/dist/traces.d.ts +3 -3
- package/dist/traces.js +3 -3
- package/dist/{types-CGEmVYOk.d.ts → types-B4C5nFw6.d.ts} +2 -2
- package/dist/{types-CGEmVYOk.d.ts.map → types-B4C5nFw6.d.ts.map} +1 -1
- package/dist/{types-DjOMwGY_.d.ts → types-BqkVmHfv.d.ts} +7 -1
- package/dist/types-BqkVmHfv.d.ts.map +1 -0
- package/dist/{types-DinHtRJp.d.ts → types-CfZMIzB_.d.ts} +2 -2
- package/dist/{types-DinHtRJp.d.ts.map → types-CfZMIzB_.d.ts.map} +1 -1
- package/dist/{types-CW5b90JH.js → types-IXD2HJzu.js} +16 -3
- package/dist/types-IXD2HJzu.js.map +1 -0
- package/dist/{types-DHb5TI36.d.ts → types-oKRhQAde.d.ts} +344 -3
- package/dist/types-oKRhQAde.d.ts.map +1 -0
- package/dist/wire/index.d.ts +1 -1
- package/docs/concepts.md +1 -0
- package/docs/finding-layers.md +69 -0
- package/package.json +1 -1
- package/dist/benchmark-command-CgpGi7vY.js.map +0 -1
- package/dist/default-registry-KP4-Tolz.js.map +0 -1
- package/dist/evaluation.d.ts.map +0 -1
- package/dist/external-optimizer-subprocess-BUxifb8g.js.map +0 -1
- package/dist/proposal-findings-CXblsskH.js.map +0 -1
- package/dist/registry-CMYIaDgS.d.ts.map +0 -1
- package/dist/report-command-CtIIsQKP.js.map +0 -1
- package/dist/systemone.d.ts.map +0 -1
- package/dist/tool-groups-BKRrtqy4.d.ts.map +0 -1
- package/dist/tool-waste-BYt5rdt8.js.map +0 -1
- package/dist/types-CW5b90JH.js.map +0 -1
- package/dist/types-DHb5TI36.d.ts.map +0 -1
- package/dist/types-DjOMwGY_.d.ts.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"report-command-CtIIsQKP.js","names":[],"sources":["../src/supervisor-run/analyze.ts","../src/supervisor-run/render.ts","../src/supervisor-run/runtime-reader.ts","../src/supervisor-run/reader.ts","../src/supervisor-run/report-command.ts"],"sourcesContent":["/**\n * The pure analyzer. Takes already-read bytes (`SupervisorRunSources`) and\n * returns the report — every metric derivable from a synthetic journal string\n * with no filesystem, no process, and no network. All I/O lives in a reader\n * (`reader.ts` is one).\n */\n\nimport { summarizeNumberSeries } from '../statistics'\nimport {\n asRecord,\n parseJson,\n parseJsonl,\n parseSupervisorTree,\n type SpawnRow,\n type WorkerLogFacts,\n workerSourceKey,\n} from './source-facts'\nimport { readTerminalRecord } from './terminal-record'\nimport {\n type DecisionMetrics,\n type EconomicsMetrics,\n isUnavailable,\n type Measured,\n type OrchestrationMetrics,\n type OutcomeMetrics,\n type PatchStats,\n type PerWorkerRow,\n type RollupCellRow,\n type SpendMeasurements,\n type SteerBreakdown,\n SUPERVISOR_RUN_ROLLUP_SCHEMA,\n SUPERVISOR_RUN_SCHEMA,\n type SupervisorRunReport,\n type SupervisorRunRollup,\n type SupervisorRunSources,\n type Unavailable,\n unavailable,\n} from './types'\n\nexport {\n asRecord,\n type CloseRow,\n parseJson,\n parseJsonl,\n parseSupervisorTree,\n type SpawnRow,\n type SteerAcknowledgementFact,\n type SteerRequestFact,\n type SupervisorJournalDialect,\n type SupervisorTreeFacts,\n type WorkerLogFacts,\n} from './source-facts'\n\nconst NO_CACHE_COUNTERS = 'the journal carries no cache-token counters for this role'\nconst NO_CACHE_BREAKDOWN =\n 'Runtime recorded cacheBreakdownKnown:false — the provider reported a total without splitting cache reads from writes'\n\n// ---------------------------------------------------------------------------\n// The analyzer.\n// ---------------------------------------------------------------------------\n\n/**\n * Analyze already-read supervisor-run bytes. Pure and synchronous: same bytes\n * in, same report out (modulo `generatedAt`, which `now` pins in tests).\n */\nexport function analyzeSupervisorRunSources(\n src: SupervisorRunSources,\n now: () => number = Date.now,\n): SupervisorRunReport {\n const gaps: string[] = []\n const gap = (what: string, reason: string): Unavailable => {\n gaps.push(`${what}: ${reason}`)\n return unavailable(reason)\n }\n\n const journalMissing =\n src.journalMissingReason ??\n (src.supRunDir === null ? 'no Runtime supervisor run directory' : 'journal.jsonl absent')\n const haveJournal = src.journal !== null\n const tree = parseSupervisorTree(src)\n const state = tree.state\n const result = parseJson(src.result)\n const judge = parseJson(src.judge)\n // Runtime's terminal record is named on the report so a status never arrives unlabeled.\n const terminal = readTerminalRecord({\n state,\n result,\n failure: src.failure === undefined ? undefined : parseJson(src.failure),\n })\n const { rootId, workerSpawns, workerCloses, startedAt, completedAt } = tree\n const rootSpawn =\n rootId === null ? null : (tree.spawns.find((spawn) => spawn.id === rootId) ?? null)\n const spawnById = new Map(workerSpawns.map((spawn) => [spawn.id, spawn]))\n const spawnsByLabel = new Map<string, SpawnRow[]>()\n for (const spawn of workerSpawns) {\n const matches = spawnsByLabel.get(spawn.label) ?? []\n matches.push(spawn)\n spawnsByLabel.set(spawn.label, matches)\n }\n const spawnsForSource = (\n worker: NonNullable<SupervisorRunSources['workers']>[number],\n ): readonly SpawnRow[] => {\n if (worker.workerId === undefined) return spawnsByLabel.get(worker.label) ?? []\n const spawn = spawnById.get(worker.workerId)\n return spawn === undefined ? [] : [spawn]\n }\n const spawnForSource = (\n worker: NonNullable<SupervisorRunSources['workers']>[number],\n ): SpawnRow | null => {\n const matches = spawnsForSource(worker)\n return matches.length === 1 ? (matches[0] ?? null) : null\n }\n\n // Wall provenance: explicit stamps when the store wrote both; otherwise the\n // journal event span (a lower bound) when there is no completion stamp at\n // all. A present-but-inverted stamp pair is corruption, not absence, and\n // stays unavailable.\n const wallSpanStart = startedAt ?? tree.firstEventAt\n const wallSpanEnd = tree.lastEventAt\n let supervisorWallMs: Measured<number>\n let supervisorWallSource: Measured<'stamps' | 'journal-span'>\n if (startedAt !== null && completedAt !== null && completedAt >= startedAt) {\n supervisorWallMs = completedAt - startedAt\n supervisorWallSource = 'stamps'\n } else if (\n completedAt === null &&\n wallSpanStart !== null &&\n wallSpanEnd !== null &&\n wallSpanEnd >= wallSpanStart\n ) {\n supervisorWallMs = wallSpanEnd - wallSpanStart\n supervisorWallSource = 'journal-span'\n } else {\n const reason = !haveJournal\n ? journalMissing\n : 'no parseable start/complete timestamps in state.json or journal'\n supervisorWallMs = gap('supervisorWallMs', reason)\n supervisorWallSource = unavailable(reason)\n }\n // Where the measured wall ends — the completion stamp, or the last stamped\n // journal event on the journal-span path. Idle and utilization integrate to\n // this bound so their denominator is the wall they are reported against.\n const wallEndAt = completedAt ?? (supervisorWallSource === 'journal-span' ? wallSpanEnd : null)\n\n // ── steers (worker inbox + control events) ─────────────────────────────\n const steerRows: SteerBreakdown[] = []\n let steerQueuedTotal = 0\n let steerDeliveredTotal = 0\n let upLegMessages = 0\n if (src.workers !== null) {\n for (const w of src.workers) {\n const facts = tree.workerLogs.get(workerSourceKey(w))\n const queued = facts?.steersQueued ?? null\n const delivered = facts?.steersDelivered ?? null\n upLegMessages += facts?.questions ?? 0\n if (queued !== null && delivered !== null) {\n steerRows.push({ workerId: w.workerId ?? null, worker: w.label, queued, delivered })\n }\n if (queued !== null) steerQueuedTotal += queued\n if (delivered !== null) steerDeliveredTotal += delivered\n }\n }\n const workersGapReason = src.workersMissingReason ?? 'workers/ directory absent'\n const unavailableReasons = (pick: (facts: WorkerLogFacts) => string | null): string | null => {\n const reasons = tree.workerLogRows\n .map((facts) => pick(facts))\n .filter((reason): reason is string => reason !== null)\n return reasons.length === 0\n ? null\n : `exact steer accounting unavailable for ${reasons.length} worker row(s): ${[...new Set(reasons)].join(' | ')}`\n }\n const queuedGapReason = unavailableReasons((facts) => facts.steersQueuedUnavailable)\n const deliveredGapReason = unavailableReasons((facts) => facts.steersDeliveredUnavailable)\n const workerEventsGapReason = unavailableReasons((facts) =>\n !facts.eventsCaptured\n ? 'events absent'\n : facts.eventsInvalidRows > 0\n ? 'events contain malformed rows'\n : null,\n )\n const steers: Measured<number> =\n src.workers === null\n ? gap('steers', workersGapReason)\n : queuedGapReason === null\n ? steerQueuedTotal\n : gap('steers', queuedGapReason)\n const steersDelivered: Measured<number> =\n src.workers === null\n ? unavailable(workersGapReason)\n : deliveredGapReason === null\n ? steerDeliveredTotal\n : unavailable(deliveredGapReason)\n const steersByWorker: Measured<readonly SteerBreakdown[]> =\n src.workers === null\n ? unavailable(workersGapReason)\n : queuedGapReason === null && deliveredGapReason === null\n ? steerRows\n : unavailable(queuedGapReason ?? deliveredGapReason ?? workersGapReason)\n\n // The `[driver] registered tools: …supervisor_steer…` banner names the verb without\n // invoking it, so banner lines are subtracted from the raw mention count.\n const driverSteerCalls: Measured<number> =\n src.driverLog === null\n ? gap('driverSteerCalls', 'driver.log absent')\n : Math.max(\n 0,\n (src.driverLog.match(/supervisor_steer/g) ?? []).length -\n registrationMentions(src.driverLog),\n )\n\n // ── waves / concurrency / idle ─────────────────────────────────────────\n const timeline: { at: number; delta: 1 | -1 }[] = []\n for (const s of workerSpawns) if (s.at !== null) timeline.push({ at: s.at, delta: 1 })\n for (const c of workerCloses) if (c.at !== null) timeline.push({ at: c.at, delta: -1 })\n timeline.sort((a, b) => a.at - b.at || a.delta - b.delta)\n\n let waves = 0\n const waveSizes: number[] = []\n let closedSinceWaveStart = true\n for (const step of timeline) {\n if (step.delta === 1) {\n if (closedSinceWaveStart) {\n waves += 1\n waveSizes.push(0)\n closedSinceWaveStart = false\n }\n waveSizes[waveSizes.length - 1] = (waveSizes[waveSizes.length - 1] ?? 0) + 1\n } else {\n closedSinceWaveStart = true\n }\n }\n\n let live = 0\n let maxConcurrency = 0\n let idleMs = 0\n let sumWorkerWallMs = 0\n let prev = startedAt\n for (const step of timeline) {\n if (prev !== null && step.at >= prev) {\n const span = step.at - prev\n if (live === 0) idleMs += span\n sumWorkerWallMs += span * live\n }\n live += step.delta\n if (live > maxConcurrency) maxConcurrency = live\n prev = step.at\n }\n if (prev !== null && wallEndAt !== null && wallEndAt >= prev) {\n const span = wallEndAt - prev\n if (live === 0) idleMs += span\n sumWorkerWallMs += span * live\n }\n\n const firstWorkerSpawnAt = workerSpawns.reduce<number | null>(\n (acc, s) => (s.at === null ? acc : acc === null ? s.at : Math.min(acc, s.at)),\n null,\n )\n const closeById = new Map(workerCloses.map((close) => [close.id, close]))\n const childSpawnsByParent = new Map<string, SpawnRow[]>()\n for (const spawn of workerSpawns) {\n if (spawn.parent === null) continue\n const siblings = childSpawnsByParent.get(spawn.parent) ?? []\n siblings.push(spawn)\n childSpawnsByParent.set(spawn.parent, siblings)\n }\n\n let respawns = 0\n let observeThenRespawn = 0\n let respawnWithoutEvidence = 0\n const repeatedLabelSet = new Set<string>()\n for (const siblings of childSpawnsByParent.values()) {\n const labelCounts = new Map<string, number>()\n for (const spawn of siblings) {\n labelCounts.set(spawn.label, (labelCounts.get(spawn.label) ?? 0) + 1)\n }\n for (const [label, count] of labelCounts) {\n if (count > 1) repeatedLabelSet.add(label)\n }\n\n const orderedSpawns = siblings\n .map((spawn, index) => ({ spawn, index }))\n .filter(\n (row): row is { spawn: SpawnRow & { at: number }; index: number } => row.spawn.at !== null,\n )\n .sort((a, b) => a.spawn.at - b.spawn.at || a.index - b.index)\n const directCloseTimes = siblings\n .map((spawn) => closeById.get(spawn.id)?.at ?? null)\n .filter((at): at is number => at !== null)\n .sort((a, b) => a - b)\n const firstDirectClose = directCloseTimes[0] ?? null\n\n for (let i = 1; i < orderedSpawns.length; i += 1) {\n const previous = orderedSpawns[i - 1]?.spawn.at\n const current = orderedSpawns[i]?.spawn.at\n if (previous === undefined || current === undefined) continue\n if (firstDirectClose === null || current <= firstDirectClose) continue\n respawns += 1\n const sawEvidence = hasNumberBetween(directCloseTimes, previous, current)\n if (sawEvidence) observeThenRespawn += 1\n else respawnWithoutEvidence += 1\n }\n }\n const repeatedLabels = [...repeatedLabelSet]\n\n const parentOf = new Map(tree.spawns.map((s) => [s.id, s.parent]))\n let delegationDepth = 0\n for (const s of workerSpawns) {\n let d = 0\n let cur: string | null = s.id\n const seen = new Set<string>()\n while (cur !== null && cur !== rootId && !seen.has(cur)) {\n seen.add(cur)\n d += 1\n cur = parentOf.get(cur) ?? null\n }\n if (d > delegationDepth) delegationDepth = d\n }\n\n const orchestration: OrchestrationMetrics = {\n workersSpawned: haveJournal ? workerSpawns.length : gap('workersSpawned', journalMissing),\n workersSettled: haveJournal\n ? workerCloses.filter((c) => c.kind === 'settled').length\n : unavailable(journalMissing),\n workersCancelled: haveJournal\n ? workerCloses.filter((c) => c.kind === 'cancelled').length\n : unavailable(journalMissing),\n steers,\n steersDelivered,\n steersByWorker,\n driverSteerCalls,\n waves: haveJournal ? waves : unavailable(journalMissing),\n waveSizes: haveJournal ? waveSizes : unavailable(journalMissing),\n maxConcurrency: haveJournal ? maxConcurrency : unavailable(journalMissing),\n respawns: haveJournal ? respawns : unavailable(journalMissing),\n repeatedLabels: haveJournal ? repeatedLabels : unavailable(journalMissing),\n delegationDepth: haveJournal ? delegationDepth : unavailable(journalMissing),\n timeToFirstSpawnMs:\n startedAt !== null && firstWorkerSpawnAt !== null\n ? firstWorkerSpawnAt - startedAt\n : haveJournal\n ? unavailable('no worker spawn timestamps')\n : unavailable(journalMissing),\n supervisorWallMs,\n supervisorWallSource,\n idleMs: isUnavailable(supervisorWallMs) ? unavailable(supervisorWallMs.unavailable) : idleMs,\n idlePct:\n isUnavailable(supervisorWallMs) || supervisorWallMs === 0\n ? isUnavailable(supervisorWallMs)\n ? unavailable(supervisorWallMs.unavailable)\n : unavailable('supervisor wall is 0ms')\n : round((idleMs / supervisorWallMs) * 100, 1),\n workerUtilization:\n isUnavailable(supervisorWallMs) || supervisorWallMs === 0\n ? isUnavailable(supervisorWallMs)\n ? unavailable(supervisorWallMs.unavailable)\n : unavailable('supervisor wall is 0ms')\n : round(sumWorkerWallMs / supervisorWallMs, 3),\n }\n\n // ── decision quality ───────────────────────────────────────────────────\n const settledByStatus: Record<string, number> = {}\n const settledVerdicts: Record<string, number> = {}\n for (const c of workerCloses) {\n const key = c.status ?? 'unknown'\n settledByStatus[key] = (settledByStatus[key] ?? 0) + 1\n if (c.verdict !== null) settledVerdicts[c.verdict] = (settledVerdicts[c.verdict] ?? 0) + 1\n }\n\n // A store with no verify step never says pass or fail. Counting its silent\n // workers as `rejected: 0 / accepted: 0` would read as \"nothing was accepted\".\n const verdictLimit = src.limits.workerVerdicts\n // A store that retains no delivered patch still SETTLES a verdict, and that verdict is\n // the acceptance decision it recorded. Only the split between a green verdict backed by\n // a patch and a green verdict with nothing behind it needs patch bytes, so the\n // deliverables limit takes `emptyPass` and leaves `accepted` measured.\n const deliverablesLimit = src.limits.deliverables\n let accepted = 0\n let emptyPass = 0\n let evidenceBytes = 0\n const sourceVerdicts: boolean[] = []\n for (const w of src.workers ?? []) {\n const f = tree.workerLogs.get(workerSourceKey(w))\n if (f?.finished) evidenceBytes += f.evidenceBytes\n const spawn = spawnForSource(w)\n const close = spawn === null ? null : (closeById.get(spawn.id) ?? null)\n const passed = close?.valid ?? f?.passed ?? null\n if (passed !== null) sourceVerdicts.push(passed)\n if (passed === true) {\n if (deliverablesLimit !== null || (w.patchBytes ?? f?.finishedPatchBytes ?? 0) > 0) {\n accepted += 1\n } else {\n emptyPass += 1\n }\n }\n }\n const settledCloses = workerCloses.filter((close) => close.kind === 'settled')\n const structuredVerdicts = settledCloses\n .map((close) => close.valid)\n .filter((valid): valid is boolean => valid !== null)\n const journalVerdictsComplete =\n settledCloses.length > 0 && structuredVerdicts.length === settledCloses.length\n const sourceVerdictsComplete =\n sourceVerdicts.length > 0 && sourceVerdicts.length >= settledCloses.length\n const rejected = journalVerdictsComplete\n ? structuredVerdicts.filter((valid) => !valid).length\n : sourceVerdictsComplete\n ? sourceVerdicts.filter((valid) => !valid).length\n : 0\n const rejectedLimit =\n journalVerdictsComplete || sourceVerdictsComplete\n ? null\n : settledCloses.length > 0\n ? (verdictLimit ?? 'a settled journal verdict has no validity and no matched worker log')\n : verdictLimit !== null\n ? verdictLimit\n : !haveJournal && src.workers === null\n ? workersGapReason\n : null\n\n const decision: DecisionMetrics = {\n settledByStatus: haveJournal ? settledByStatus : gap('settledByStatus', journalMissing),\n settledVerdicts:\n verdictLimit !== null\n ? unavailable(verdictLimit)\n : haveJournal\n ? settledVerdicts\n : unavailable(journalMissing),\n accepted:\n verdictLimit !== null\n ? gap('accepted', verdictLimit)\n : src.workers === null\n ? unavailable(workersGapReason)\n : accepted,\n rejected: rejectedLimit === null ? rejected : unavailable(rejectedLimit),\n emptyPass:\n verdictLimit !== null\n ? gap('emptyPass', verdictLimit)\n : deliverablesLimit !== null\n ? gap('emptyPass', deliverablesLimit)\n : src.workers === null\n ? unavailable(workersGapReason)\n : emptyPass,\n observeThenRespawn: haveJournal ? observeThenRespawn : unavailable(journalMissing),\n respawnWithoutEvidence: haveJournal ? respawnWithoutEvidence : unavailable(journalMissing),\n reviewActions:\n src.workers === null\n ? unavailable(workersGapReason)\n : queuedGapReason === null\n ? steerQueuedTotal + upLegMessages\n : unavailable(queuedGapReason),\n workerEvidenceBytes:\n src.workers === null\n ? unavailable(workersGapReason)\n : workerEventsGapReason === null\n ? evidenceBytes\n : unavailable(workerEventsGapReason),\n }\n\n // ── economics ──────────────────────────────────────────────────────────\n const rootChildIds = new Set(\n workerSpawns.filter((spawn) => spawn.parent === rootId).map((spawn) => spawn.id),\n )\n const rootChildCloses = workerCloses.filter((close) => rootChildIds.has(close.id))\n // Runtime marks a spend record `usdKnown: false` / `tokensKnown: false` when the work\n // HAPPENED but no provider receipt covered its price or its tokens. Folding such a record\n // in prices unreported work at zero; dropping the whole channel discards every record that\n // DID report. So each channel sums only the reporting records and names the rest.\n const rootChildSpends = rootChildCloses.filter((close) => close.hasSpend)\n const workerUsdUnknownNodes = rootChildSpends\n .filter((close) => !close.spend.usdKnown)\n .map((close) => close.id)\n const workerTokensUnknownNodes = rootChildSpends\n .filter((close) => !close.spend.tokensKnown)\n .map((close) => close.id)\n const workerTokenSpends = rootChildSpends.filter((close) => close.spend.tokensKnown)\n const journalWorkerIn = workerTokenSpends.reduce((a, c) => a + c.spend.tokens.input, 0)\n const journalWorkerOut = workerTokenSpends.reduce((a, c) => a + c.spend.tokens.output, 0)\n const journalWorkerUsd = rootChildSpends\n .filter((close) => close.spend.usdKnown)\n .reduce((a, c) => a + c.spend.usd, 0)\n const usdUnknownIds = new Set(\n workerCloses.filter((close) => close.hasSpend && !close.spend.usdKnown).map((c) => c.id),\n )\n const workerUsdById = new Map<string, number>()\n for (const c of workerCloses) {\n if (usdUnknownIds.has(c.id)) continue\n workerUsdById.set(c.id, (workerUsdById.get(c.id) ?? 0) + c.spend.usd)\n }\n const labelById = new Map(workerSpawns.map((spawn) => [spawn.id, spawn.label]))\n const usdUnknownLabels = new Set(\n [...usdUnknownIds].map((id) => labelById.get(id)).filter((l): l is string => l !== undefined),\n )\n const workerUsdByLabel = new Map<string, number>()\n for (const close of workerCloses) {\n const label = labelById.get(close.id)\n if (label === undefined || usdUnknownLabels.has(label)) continue\n workerUsdByLabel.set(label, (workerUsdByLabel.get(label) ?? 0) + close.spend.usd)\n }\n const brainUsdUnknownNodes =\n tree.brain.usdUnknownCount > 0 && rootId !== null ? ([rootId] as const) : []\n const brainTokensUnknownNodes =\n tree.brain.tokensUnknownCount > 0 && rootId !== null ? ([rootId] as const) : []\n const usdKnownRecords =\n tree.brain.usdKnownCount + rootChildSpends.filter((close) => close.spend.usdKnown).length\n const usdUnknownRecords = tree.brain.usdUnknownCount + workerUsdUnknownNodes.length\n const usdUnknownNodes = [...brainUsdUnknownNodes, ...workerUsdUnknownNodes]\n // The named nodes are what makes the gap actionable, but a fleet run can have hundreds,\n // and this string lands in a report line. Name the first few and count the rest.\n const NAMED_NODE_LIMIT = 5\n const nameNodes = (nodes: readonly string[]): string => {\n if (nodes.length === 0) return ''\n const shown = nodes.slice(0, NAMED_NODE_LIMIT)\n const rest = nodes.length - shown.length\n return ` (${shown.join(', ')}${rest === 0 ? '' : ` +${rest} more`})`\n }\n const unpriced = (unknown: number, total: number, nodes: readonly string[]): string =>\n `Runtime recorded usdKnown:false on ${unknown} of ${total} spend record(s)${nameNodes(nodes)}`\n // A token total is a bare `Measured<number>` with no record denominator beside it, so a\n // partial sum there would be an unlabelled floor — the exact collapse this module refuses.\n // Spend has `SpendMeasurement.records`/`unknownRecords` to carry the split, so it stays\n // partial; tokens go absent with the unreporting nodes named.\n const unreportedTokens = (unknown: number, total: number, nodes: readonly string[]): string =>\n `Runtime recorded tokensKnown:false on ${unknown} of ${total} spend record(s)${nameNodes(nodes)}`\n const usdPartial = usdKnownRecords > 0 && usdUnknownRecords > 0\n const usdAllUnknown = usdKnownRecords === 0 && usdUnknownRecords > 0\n // A role whose records are ALL unreported has nothing measured to report, so it stays\n // unavailable. A role with some of each keeps its sum and labels it in `source`.\n const brainTokensUnreported =\n tree.brain.tokensUnknownCount === 0\n ? null\n : unreportedTokens(\n tree.brain.tokensUnknownCount,\n tree.brain.meteredCount,\n brainTokensUnknownNodes,\n )\n const brainUsdUnreported =\n tree.brain.usdKnownCount > 0 || tree.brain.usdUnknownCount === 0\n ? null\n : unpriced(tree.brain.usdUnknownCount, tree.brain.meteredCount, brainUsdUnknownNodes)\n const workerUsdUnreported =\n workerUsdUnknownNodes.length === 0 || workerUsdUnknownNodes.length < rootChildSpends.length\n ? null\n : unpriced(workerUsdUnknownNodes.length, rootChildSpends.length, workerUsdUnknownNodes)\n const sq = src.harnessWorkerTokens\n const harnessGapReason =\n src.harnessMissingReason ?? 'harness session store unavailable and journal settled spend is 0'\n const workerTokenLimit = src.limits.workerTokens\n const workerTokensUnreported =\n workerTokensUnknownNodes.length === 0\n ? null\n : unreportedTokens(\n workerTokensUnknownNodes.length,\n rootChildSpends.length,\n workerTokensUnknownNodes,\n )\n const workerIn: Measured<number> =\n workerTokenLimit !== null\n ? gap('workers.tokensIn', workerTokenLimit)\n : workerTokensUnreported !== null\n ? gap('workers.tokensIn', workerTokensUnreported)\n : sq !== null\n ? journalWorkerIn + sq.input\n : haveJournal\n ? journalWorkerIn\n : gap('workers.tokensIn', harnessGapReason)\n const workerOut: Measured<number> =\n workerTokenLimit !== null\n ? unavailable(workerTokenLimit)\n : workerTokensUnreported !== null\n ? unavailable(workerTokensUnreported)\n : sq !== null\n ? journalWorkerOut + sq.output\n : haveJournal\n ? journalWorkerOut\n : unavailable(harnessGapReason)\n\n const stateResult = asRecord(state?.result)\n const stateUsd = typeof stateResult.spentUsd === 'number' ? stateResult.spentUsd : null\n const resultSpentTotal = asRecord(result?.spentTotal)\n const resultCloseUsd =\n typeof resultSpentTotal.usd === 'number' && Number.isFinite(resultSpentTotal.usd)\n ? resultSpentTotal.usd\n : null\n // The close record: what the store wrote as settled when the run closed.\n const closeUsd = stateUsd ?? resultCloseUsd\n // A store that logs tokens but never a price yields usd 0 from every sum. That\n // 0 is the store's silence, not a free run, so the limit outranks the sum.\n const usdLimit = src.limits.spendUsd\n // The close record carries its own completeness flag: `spentTotal.usdKnown: false` means\n // Runtime priced part of the run from a catalog, so the number is a floor, not a total.\n const closeUsdUnreported =\n stateUsd === null && resultCloseUsd !== null && resultSpentTotal.usdKnown === false\n const usdUnreportedReason = unpriced(\n usdUnknownRecords,\n usdKnownRecords + usdUnknownRecords,\n usdUnknownNodes,\n )\n // Which numbers may be partial, and which must go absent: a number may be a floor only\n // when its own record carries the known/unknown split beside it — `SpendMeasurement`\n // has `records`/`unknownRecords`, and `RoleSpend` has `source`. `totalUsd` is a bare\n // scalar, so a floor there is an unlabelled understatement and stays unavailable; the\n // partial sum with its denominators lives in `spend.journalDerived`, which this type's\n // own doc already names as the field to prefer.\n const totalUsd: Measured<number> =\n usdLimit !== null\n ? gap('totalUsd', usdLimit)\n : stateUsd !== null\n ? round(stateUsd, 6)\n : !haveJournal\n ? gap('totalUsd', journalMissing)\n : usdUnknownRecords > 0\n ? gap('totalUsd', usdUnreportedReason)\n : round(tree.brain.usd + journalWorkerUsd, 6)\n\n const journalSpendRecords = usdKnownRecords\n // `journalDerived` keeps its partial sum: `records` and `unknownRecords` state exactly\n // how much of the run it covers. Only an all-unreported channel has nothing to report.\n const journalDerivedAvailable = usdLimit === null && haveJournal && !usdAllUnknown\n const closeRecordAvailable = usdLimit === null && closeUsd !== null && !closeUsdUnreported\n const spend: SpendMeasurements = {\n journalDerived: {\n usd: journalDerivedAvailable\n ? round(tree.brain.usd + journalWorkerUsd, 6)\n : unavailable(usdLimit ?? (haveJournal ? usdUnreportedReason : journalMissing)),\n records: journalDerivedAvailable ? journalSpendRecords : 0,\n unknownRecords: usdLimit === null && haveJournal ? usdUnknownRecords : 0,\n partial: journalDerivedAvailable && usdPartial,\n unknownNodes: usdLimit === null && haveJournal ? usdUnknownNodes : [],\n },\n closeRecord: {\n usd: closeRecordAvailable\n ? round(closeUsd as number, 6)\n : unavailable(\n usdLimit ??\n (closeUsdUnreported\n ? 'close record incomplete: result.json spentTotal.usdKnown is false'\n : 'no close record: neither state.json result.spentUsd nor result.json spentTotal.usd is present'),\n ),\n records: closeRecordAvailable ? 1 : 0,\n unknownRecords: closeUsdUnreported ? 1 : 0,\n partial: false,\n unknownNodes: closeUsdUnreported && rootId !== null ? [rootId] : [],\n },\n }\n\n const noteCaptureGaps = (\n owner: string,\n captures: SupervisorRunSources['rootWorkspaceCaptures'],\n ): void => {\n if (captures === null || captures?.length === 0) {\n gaps.push(`${owner} workspaceCapture: no retained output capture evidence`)\n } else if (captures !== undefined) {\n for (const [index, capture] of captures.entries()) {\n const source = `${owner} workspaceCapture[${index + 1}]`\n if (capture.projectionGap !== null) gaps.push(`${source}: ${capture.projectionGap}`)\n if (capture.coverageComplete === false) {\n gaps.push(\n `${source}: ${capture.incompleteReason ?? 'provider reported incomplete coverage'}`,\n )\n }\n if (capture.coverageComplete === null && capture.projectionGap === null) {\n gaps.push(`${source}: capture coverage was not recorded`)\n }\n }\n }\n }\n noteCaptureGaps(`root ${rootId ?? src.runRef}`, src.rootWorkspaceCaptures)\n const perWorker: PerWorkerRow[] = (src.workers ?? []).map((w) => {\n noteCaptureGaps(`worker ${w.workerId ?? w.label}`, w.workspaceCaptures)\n const f = tree.workerLogs.get(workerSourceKey(w))\n const matchingSpawns = spawnsForSource(w)\n const spawn = spawnForSource(w)\n const close = spawn === null ? null : (closeById.get(spawn.id) ?? null)\n const passed = close?.valid ?? f?.passed ?? null\n const matchingRoles = new Set(matchingSpawns.map((candidate) => candidate.role))\n const matchingRuntimes = new Set(matchingSpawns.map((candidate) => candidate.runtime))\n const matchingProfiles = new Set(matchingSpawns.map((candidate) => candidate.profileDigest))\n const journalWallMs =\n spawn?.at !== null &&\n spawn?.at !== undefined &&\n close?.at !== null &&\n close?.at !== undefined &&\n close.at >= spawn.at\n ? close.at - spawn.at\n : null\n return {\n workerId: w.workerId ?? null,\n worker: w.label,\n role: matchingRoles.size === 1 ? (matchingSpawns[0]?.role ?? null) : null,\n runtime: matchingRuntimes.size === 1 ? (matchingSpawns[0]?.runtime ?? null) : null,\n profileDigest:\n matchingProfiles.size === 1 ? (matchingSpawns[0]?.profileDigest ?? null) : null,\n status: close?.status ?? null,\n failure: close?.reason ?? null,\n infra: close?.infra ?? null,\n wallMs: f?.started != null && f.finishedAt != null ? f.finishedAt - f.started : journalWallMs,\n tokensIn:\n w.tokensIn ??\n (close?.hasSpend === true && close.spend.tokensKnown ? close.spend.tokens.input : null),\n tokensOut:\n w.tokensOut ??\n (close?.hasSpend === true && close.spend.tokensKnown ? close.spend.tokens.output : null),\n usd:\n usdLimit !== null\n ? null\n : w.workerId === undefined\n ? (workerUsdByLabel.get(w.label) ?? null)\n : (workerUsdById.get(w.workerId) ?? null),\n patchBytes: w.patchBytes ?? f?.finishedPatchBytes ?? null,\n passed,\n score: close?.score ?? f?.score ?? null,\n workspaceCaptures: w.workspaceCaptures ?? null,\n }\n })\n const wallDistribution = summarizeNumberSeries(\n perWorker.map((w) => w.wallMs).filter((w): w is number => w !== null),\n )\n\n const brainCalls = parseJsonl(src.brainLog)\n const managerTokenLimit = src.limits.managerTokens\n const economics: EconomicsMetrics = {\n resourceRecords:\n src.journal === null && !tree.resourceRecords?.length\n ? unavailable(journalMissing)\n : (tree.resourceRecords ?? []),\n brain: {\n tokensIn:\n managerTokenLimit !== null\n ? gap('brain.tokensIn', managerTokenLimit)\n : !haveJournal\n ? gap('brain.tokensIn', journalMissing)\n : brainTokensUnreported !== null\n ? gap('brain.tokensIn', brainTokensUnreported)\n : tree.brain.tokensIn,\n tokensOut:\n managerTokenLimit !== null\n ? unavailable(managerTokenLimit)\n : !haveJournal\n ? unavailable(journalMissing)\n : brainTokensUnreported !== null\n ? unavailable(brainTokensUnreported)\n : tree.brain.tokensOut,\n usd:\n usdLimit !== null\n ? unavailable(usdLimit)\n : !haveJournal\n ? unavailable(journalMissing)\n : brainUsdUnreported !== null\n ? unavailable(brainUsdUnreported)\n : round(tree.brain.usd, 6),\n cacheRead:\n managerTokenLimit !== null\n ? unavailable(managerTokenLimit)\n : !haveJournal\n ? unavailable(journalMissing)\n : brainTokensUnreported !== null\n ? unavailable(brainTokensUnreported)\n : !tree.brain.hasCache\n ? unavailable(NO_CACHE_COUNTERS)\n : tree.brain.cacheBreakdownKnown\n ? tree.brain.cacheRead\n : unavailable(NO_CACHE_BREAKDOWN),\n cacheWrite:\n managerTokenLimit !== null\n ? unavailable(managerTokenLimit)\n : !haveJournal\n ? unavailable(journalMissing)\n : brainTokensUnreported !== null\n ? unavailable(brainTokensUnreported)\n : !tree.brain.hasCache\n ? unavailable(NO_CACHE_COUNTERS)\n : tree.brain.cacheBreakdownKnown\n ? tree.brain.cacheWrite\n : unavailable(NO_CACHE_BREAKDOWN),\n source:\n managerTokenLimit ??\n (haveJournal\n ? `journal metered events (n=${tree.brain.meteredCount})${\n tree.brain.usdKnownCount > 0 && tree.brain.usdUnknownCount > 0\n ? ` — ${tree.brain.usdUnknownCount} unpriced`\n : ''\n }`\n : journalMissing),\n },\n brainTruncations:\n src.brainLog === null\n ? gap(\n 'brain.brainTruncations',\n src.brainLogMissingReason ??\n (src.supRunDir === null\n ? 'no Runtime supervisor run directory'\n : 'brain.jsonl absent — this source has no brain-call tap, so truncation cannot be ruled out'),\n )\n : brainCalls.filter((c) => c.finish_reason === 'length').length,\n workers: {\n tokensIn: workerIn,\n tokensOut: workerOut,\n cacheRead:\n workerTokenLimit !== null\n ? unavailable(workerTokenLimit)\n : sq?.cacheRead !== undefined\n ? sq.cacheRead\n : unavailable(NO_CACHE_COUNTERS),\n cacheWrite:\n workerTokenLimit !== null\n ? unavailable(workerTokenLimit)\n : sq?.cacheWrite !== undefined\n ? sq.cacheWrite\n : unavailable(NO_CACHE_COUNTERS),\n usd:\n usdLimit !== null\n ? unavailable(usdLimit)\n : !haveJournal\n ? unavailable(journalMissing)\n : workerUsdUnreported !== null\n ? unavailable(workerUsdUnreported)\n : round(journalWorkerUsd, 6),\n source: `${\n workerTokenLimit !== null\n ? workerTokenLimit\n : sq !== null\n ? `journal settled spend + ${sq.store} sessions (n=${sq.sessions})`\n : `journal settled spend only — ${src.harnessMissingReason ?? 'harness session store unavailable'}`\n }${\n workerUsdUnknownNodes.length > 0 && workerUsdUnknownNodes.length < rootChildSpends.length\n ? ` — ${workerUsdUnknownNodes.length} unpriced`\n : ''\n }`,\n },\n spend,\n totalUsd,\n totalUsdSource:\n usdLimit !== null\n ? usdLimit\n : stateUsd !== null\n ? `state.json result.spentUsd${rootChildCloses.length > 0 && journalWorkerUsd === 0 ? ' — brain-priced only; worker CLI inference is unpriced (see worker token counts)' : ''}`\n : !haveJournal\n ? journalMissing\n : usdUnknownRecords > 0\n ? usdUnreportedReason\n : 'journal metered + settled usd',\n costPerAcceptedPatchUsd: isUnavailable(totalUsd)\n ? unavailable(totalUsd.unavailable)\n : isUnavailable(decision.accepted)\n ? unavailable(decision.accepted.unavailable)\n : decision.accepted === 0\n ? unavailable('no accepted worker patch (cost has no denominator)')\n : round(totalUsd / decision.accepted, 6),\n workerWallMsDistribution:\n wallDistribution === null\n ? unavailable(\n src.workers === null ? workersGapReason : 'no worker start/finish pairs captured',\n )\n : wallDistribution,\n perWorker: src.workers === null ? unavailable(workersGapReason) : perWorker,\n }\n\n // ── outcome ────────────────────────────────────────────────────────────\n const patchStats: Measured<PatchStats> =\n src.patch === null\n ? gap('patch', src.limits.deliverables ?? 'delivered patch file absent')\n : parsePatch(src.patch)\n\n const outcome: OutcomeMetrics = {\n supStatus: isUnavailable(terminal.supStatus)\n ? gap('supStatus', terminal.supStatus.unavailable)\n : terminal.supStatus,\n supStatusSource: terminal.supStatusSource,\n supReason: terminal.supReason,\n failure: terminal.failure,\n supVerdict:\n pickString(state, 'verdict') ??\n pickString(result, 'sup_verdict') ??\n unavailable('no state.json / result.json verdict'),\n delivered:\n typeof stateResult.delivered === 'boolean'\n ? stateResult.delivered\n : typeof result?.delivered === 'boolean'\n ? result.delivered\n : unavailable('no delivered flag in state.json or result.json'),\n judgeResolved:\n judge === null\n ? gap('judge', 'judge.json absent')\n : typeof judge.resolved === 'boolean'\n ? judge.resolved\n : null,\n judgeScore:\n judge === null\n ? unavailable('judge.json absent')\n : typeof judge.score === 'number'\n ? judge.score\n : null,\n judgePassed:\n judge === null\n ? unavailable('judge.json absent')\n : typeof judge.passed === 'number'\n ? judge.passed\n : null,\n judgeTotal:\n judge === null\n ? unavailable('judge.json absent')\n : typeof judge.total === 'number'\n ? judge.total\n : null,\n verifyPass:\n typeof result?.verify_pass === 'boolean'\n ? result.verify_pass\n : gap('verifyPass', 'result.json absent or has no verify_pass'),\n verifyRc:\n typeof result?.verify_rc === 'number'\n ? result.verify_rc\n : unavailable('result.json absent or has no verify_rc'),\n patch: patchStats,\n judgeSource: src.judgeSource,\n }\n\n return {\n schema: SUPERVISOR_RUN_SCHEMA,\n runRef: src.runRef,\n instanceId: src.instanceId,\n arm: src.arm,\n supervisorId: rootId !== null ? rootId : unavailable(journalMissing),\n supervisorProfileDigest:\n rootSpawn?.profileDigest !== null && rootSpawn?.profileDigest !== undefined\n ? rootSpawn.profileDigest\n : gap('supervisorProfileDigest', 'root spawned event has no profile digest'),\n generatedAt: new Date(now()).toISOString(),\n orchestration,\n decision,\n economics,\n outcome,\n rootWorkspaceCaptures: src.rootWorkspaceCaptures ?? null,\n gaps,\n traceCommand:\n src.traceCommand ??\n 'npx --yes @tangle-network/traces@latest analyze --harness opencode --cwd <worker-clone-cwd>',\n }\n}\n\n/** Whether sorted values contain one value in the inclusive interval. */\nfunction hasNumberBetween(sorted: readonly number[], low: number, high: number): boolean {\n let left = 0\n let right = sorted.length\n while (left < right) {\n const middle = left + Math.floor((right - left) / 2)\n if ((sorted[middle] as number) < low) left = middle + 1\n else right = middle\n }\n return left < sorted.length && (sorted[left] as number) <= high\n}\n\n/** `[driver] registered tools: …supervisor_steer…` is a banner, not an invocation. */\nfunction registrationMentions(driverLog: string): number {\n let n = 0\n for (const line of driverLog.split('\\n')) {\n if (line.includes('registered tools:') && line.includes('supervisor_steer')) n += 1\n }\n return n\n}\n\nfunction pickString(rec: Record<string, unknown> | null, key: string): string | null {\n const v = rec?.[key]\n return typeof v === 'string' ? v : null\n}\n\nexport function round(v: number, digits: number): number {\n const f = 10 ** digits\n return Math.round(v * f) / f\n}\n\n/** Unified-diff stats. Counts `+++ b/<path>` targets, body +/- lines, and test-file touches. */\nexport function parsePatch(text: string): PatchStats {\n const files = new Set<string>()\n const testFiles = new Set<string>()\n let added = 0\n let removed = 0\n for (const line of text.split('\\n')) {\n if (line.startsWith('+++ ')) {\n const p = line.slice(4).trim().replace(/^b\\//, '')\n if (p !== '/dev/null') {\n files.add(p)\n if (isTestPath(p)) testFiles.add(p)\n }\n continue\n }\n if (line.startsWith('--- ') || line.startsWith('diff --git') || line.startsWith('index ')) {\n continue\n }\n if (line.startsWith('+')) added += 1\n else if (line.startsWith('-')) removed += 1\n }\n return {\n files: files.size,\n linesAdded: added,\n linesRemoved: removed,\n testFilesTouched: [...testFiles].sort(),\n }\n}\n\nfunction isTestPath(p: string): boolean {\n const base = p.split('/').pop() ?? p\n return (\n /(^|\\/)(tests?|__tests__|testing|spec)(\\/|$)/.test(p) ||\n /\\.(test|spec)\\.[cm]?[jt]sx?$/.test(base) ||\n /^test_.*\\.py$/.test(base) ||\n /_test\\.py$/.test(base)\n )\n}\n\n// ---------------------------------------------------------------------------\n// Rollup across runs.\n// ---------------------------------------------------------------------------\n\n/**\n * Aggregate many supervisor-run reports. A metric no run could measure stays\n * `unavailable` rather than becoming a 0-valued mean, and cells whose steer\n * count was unavailable are counted separately from cells that measured zero.\n */\nexport function rollupSupervisorRuns(reports: readonly SupervisorRunReport[]): SupervisorRunRollup {\n const known = <T>(vals: readonly Measured<T>[]): T[] =>\n vals.filter((v): v is T => !isUnavailable(v))\n const steerVals = known(reports.map((r) => r.orchestration.steers))\n const waveVals = known(reports.map((r) => r.orchestration.waves))\n const concVals = known(reports.map((r) => r.orchestration.maxConcurrency))\n const utilVals = known(reports.map((r) => r.orchestration.workerUtilization))\n const idleVals = known(reports.map((r) => r.orchestration.idlePct))\n const spawnVals = known(reports.map((r) => r.orchestration.workersSpawned))\n const acceptVals = known(reports.map((r) => r.decision.accepted))\n const usdVals = known(reports.map((r) => r.economics.totalUsd))\n const journalSpendVals = known(reports.map((r) => r.economics.spend.journalDerived.usd))\n const closeSpendVals = known(reports.map((r) => r.economics.spend.closeRecord.usd))\n const resolvedVals = known(reports.map((r) => r.outcome.judgeResolved))\n const sum = (xs: readonly number[]): number => xs.reduce((a, b) => a + b, 0)\n const mean = (xs: readonly number[]): Measured<number> =>\n xs.length === 0 ? unavailable('no cell reported this metric') : round(sum(xs) / xs.length, 3)\n\n const perCell: RollupCellRow[] = reports.map((r) => ({\n instanceId: r.instanceId,\n arm: r.arm,\n steers: r.orchestration.steers,\n waves: r.orchestration.waves,\n utilization: r.orchestration.workerUtilization,\n idlePct: r.orchestration.idlePct,\n resolved: r.outcome.judgeResolved,\n usd: r.economics.totalUsd,\n ...(r.economics.resourceRecords === undefined\n ? {}\n : { resourceRecords: r.economics.resourceRecords }),\n }))\n\n return {\n schema: SUPERVISOR_RUN_ROLLUP_SCHEMA,\n cells: reports.length,\n steersTotal:\n steerVals.length === 0 ? unavailable('no cell reported a steer count') : sum(steerVals),\n cellsWithSteers:\n steerVals.length === 0\n ? unavailable('no cell reported a steer count')\n : steerVals.filter((n) => n > 0).length,\n cellsWithUnavailableSteers: reports.filter((r) => isUnavailable(r.orchestration.steers)).length,\n wavesMean: mean(waveVals),\n maxConcurrencyMax:\n concVals.length === 0 ? unavailable('no cell reported concurrency') : Math.max(...concVals),\n utilizationMean: mean(utilVals),\n idlePctMean: mean(idleVals),\n workersSpawnedTotal:\n spawnVals.length === 0 ? unavailable('no cell reported spawns') : sum(spawnVals),\n acceptedTotal:\n acceptVals.length === 0 ? unavailable('no cell reported acceptance') : sum(acceptVals),\n usdTotal: usdVals.length === 0 ? unavailable('no cell reported spend') : round(sum(usdVals), 6),\n spendUsd: {\n journalDerived: {\n value:\n journalSpendVals.length === 0\n ? unavailable('no cell measured journal-derived spend')\n : round(sum(journalSpendVals), 6),\n runs: journalSpendVals.length,\n },\n closeRecord: {\n value:\n closeSpendVals.length === 0\n ? unavailable('no cell carried a close record')\n : round(sum(closeSpendVals), 6),\n runs: closeSpendVals.length,\n },\n },\n resolvedCount:\n resolvedVals.length === 0\n ? unavailable('no cell reported a judge verdict')\n : resolvedVals.filter((v) => v === true).length,\n perCell,\n }\n}\n","/**\n * Human-readable renderings of a supervisor-run report. Zero and unavailable\n * render differently on purpose (`0` vs `unavailable — <reason>`), because the\n * two have driven opposite conclusions about the same architecture.\n */\n\nimport { round } from './analyze'\nimport {\n isUnavailable,\n type Measured,\n type ResourceSpendRecord,\n type SupervisorRunReport,\n type SupervisorRunRollup,\n showMeasured,\n type TerminalFailure,\n} from './types'\n\n/**\n * The block appended to a run log after every run — the answers an operator asks\n * for, in the log tail, with no extra command.\n */\nexport function renderSupervisorRunHeadline(r: SupervisorRunReport): string {\n const o = r.orchestration\n const steerNote = isUnavailable(o.steers)\n ? `unavailable — ${o.steers.unavailable}`\n : o.steers === 0\n ? '0 (spawn→wait→respawn only; no mid-task steering)'\n : `${o.steers} queued / ${showMeasured(o.steersDelivered)} delivered`\n return [\n `RUN-REPORT ${r.instanceId ?? '?'} [${r.arm ?? '?'}]`,\n ` status=${showMeasured(r.outcome.supStatus)} source=${showMeasured(r.outcome.supStatusSource)}` +\n ` reason=${showMeasured(r.outcome.supReason)} failure=${fmtFailure(r.outcome.failure)}`,\n ` steers=${steerNote}`,\n ` waves=${showMeasured(o.waves)} sizes=${isUnavailable(o.waveSizes) ? `unavailable — ${o.waveSizes.unavailable}` : `[${o.waveSizes.join(',')}]`}` +\n ` workers=${showMeasured(o.workersSpawned)} settled=${showMeasured(o.workersSettled)} cancelled=${showMeasured(o.workersCancelled)}`,\n ` concurrency max=${showMeasured(o.maxConcurrency)} utilization=${showMeasured(o.workerUtilization)}` +\n ` idle=${fmtMs(o.idleMs)} (${showMeasured(o.idlePct)}%) wall=${fmtMs(o.supervisorWallMs)}` +\n `${o.supervisorWallSource === 'journal-span' ? ' (journal-span lower bound)' : ''}`,\n ` respawns=${showMeasured(o.respawns)} evidence→respawn=${showMeasured(r.decision.observeThenRespawn)}` +\n ` blind-respawn=${showMeasured(r.decision.respawnWithoutEvidence)} depth=${showMeasured(o.delegationDepth)}`,\n ` accepted=${showMeasured(r.decision.accepted)} rejected=${showMeasured(r.decision.rejected)} empty-pass=${showMeasured(r.decision.emptyPass)}`,\n ` brain=$${showMeasured(r.economics.brain.usd)} total=$${showMeasured(r.economics.totalUsd)}` +\n ` judge.resolved=${showMeasured(r.outcome.judgeResolved)} score=${showMeasured(r.outcome.judgeScore)}` +\n ` verify=${showMeasured(r.outcome.verifyPass)}`,\n r.gaps.length > 0 ? ` gaps(${r.gaps.length}): ${r.gaps.join('; ')}` : ' gaps: none',\n ].join('\\n')\n}\n\n/**\n * The recorded error on one line; `none recorded` and `unavailable` stay\n * distinct, and a throw the run outlived is labeled so it is not read as the\n * outcome of the settled result beside it.\n */\nfunction fmtFailure(v: Measured<TerminalFailure | null>): string {\n if (isUnavailable(v)) return `unavailable — ${v.unavailable}`\n if (v === null) return 'none recorded'\n const name = v.name ?? 'unavailable — record has no error.name'\n const message = v.message ?? 'unavailable — record has no error.message'\n const attempt = v.earlierAttempt ? ', earlier attempt' : ''\n return `${name}: ${message} [${v.source}${v.at === null ? '' : ` at ${v.at}`}${attempt}]`\n}\n\nfunction resourceRows(records: Measured<readonly ResourceSpendRecord[]>): string[] {\n if (isUnavailable(records)) return [`unavailable — ${records.unavailable}`, '']\n const out = [\n 'Receipts are source records, not additive totals.',\n 'A false completeness flag means the amount is a recorded subtotal, not complete usage.',\n '',\n '| Node | Source | Resource | Unit | Amount | Known |',\n '|---|---|---|---|---:|---|',\n ]\n const cell = (value: string) => value.replace(/\\|/g, '\\\\|').replace(/\\r?\\n/g, ' ')\n for (const record of records) {\n const prefix = `| ${cell(record.nodeId ?? 'unavailable')} | ${cell(record.source)} |`\n if (isUnavailable(record.resources)) {\n out.push(`${prefix} ${cell(showMeasured(record.resources))} | — | — | — |`)\n } else if (record.resources.length === 0) {\n out.push(`${prefix} recorded empty map | — | — | — |`)\n } else {\n for (const receipt of record.resources) {\n out.push(\n `${prefix} ${cell(showMeasured(receipt.name))} | ${cell(showMeasured(receipt.unit))} | ${cell(showMeasured(receipt.amount))} | ${cell(showMeasured(receipt.known))} |`,\n )\n }\n }\n }\n if (!records.length) out.push('| — | — | no spend records | — | — | — |')\n out.push('')\n return out\n}\n\nfunction fmtMs(v: Measured<number>): string {\n if (isUnavailable(v)) return `unavailable — ${v.unavailable}`\n if (v < 1000) return `${v}ms`\n const s = v / 1000\n if (s < 120) return `${round(s, 1)}s`\n return `${round(s / 60, 1)}min`\n}\n\nexport function renderSupervisorRunMarkdown(r: SupervisorRunReport): string {\n const o = r.orchestration\n const d = r.decision\n const e = r.economics\n const out: string[] = []\n out.push(`# Run report — ${r.instanceId ?? 'unknown instance'} [${r.arm ?? 'unknown arm'}]`)\n out.push('')\n out.push('```')\n out.push(renderSupervisorRunHeadline(r))\n out.push('```')\n out.push('')\n out.push(`- Run: \\`${r.runRef}\\``)\n out.push(`- Supervisor: \\`${showMeasured(r.supervisorId)}\\``)\n out.push(`- Supervisor profile: \\`${showMeasured(r.supervisorProfileDigest)}\\``)\n out.push(`- Generated: ${r.generatedAt}`)\n out.push('')\n\n out.push('## Orchestration')\n out.push('')\n out.push('| Metric | Value |')\n out.push('|---|---|')\n out.push(`| Workers spawned | ${showMeasured(o.workersSpawned)} |`)\n out.push(`| Workers settled | ${showMeasured(o.workersSettled)} |`)\n out.push(`| Workers cancelled | ${showMeasured(o.workersCancelled)} |`)\n out.push(`| **Steers (mid-task messages to live workers)** | **${showMeasured(o.steers)}** |`)\n out.push(`| Steers delivered | ${showMeasured(o.steersDelivered)} |`)\n out.push(`| Outer-driver \\`supervisor_steer\\` calls | ${showMeasured(o.driverSteerCalls)} |`)\n out.push(`| Spawn waves | ${showMeasured(o.waves)} |`)\n out.push(\n `| Wave sizes | ${isUnavailable(o.waveSizes) ? showMeasured(o.waveSizes) : `[${o.waveSizes.join(', ')}]`} |`,\n )\n out.push(`| Max concurrency | ${showMeasured(o.maxConcurrency)} |`)\n out.push(`| Respawns (after same parent's first settle) | ${showMeasured(o.respawns)} |`)\n out.push(\n `| Repeated labels | ${isUnavailable(o.repeatedLabels) ? showMeasured(o.repeatedLabels) : o.repeatedLabels.length === 0 ? 'none' : o.repeatedLabels.join(', ')} |`,\n )\n out.push(`| Delegation depth | ${showMeasured(o.delegationDepth)} |`)\n out.push(`| Time to first spawn | ${fmtMs(o.timeToFirstSpawnMs)} |`)\n out.push(\n `| Supervisor wall | ${fmtMs(o.supervisorWallMs)}${isUnavailable(o.supervisorWallSource) ? '' : ` (source: ${o.supervisorWallSource}${o.supervisorWallSource === 'journal-span' ? ', lower bound' : ''})`} |`,\n )\n out.push(`| Idle (zero live workers) | ${fmtMs(o.idleMs)} (${showMeasured(o.idlePct)}%) |`)\n out.push(\n `| Worker utilization (Σ worker wall ÷ supervisor wall) | ${showMeasured(o.workerUtilization)} |`,\n )\n out.push('')\n\n if (!isUnavailable(o.steersByWorker) && o.steersByWorker.length > 0) {\n out.push('### Steers per worker')\n out.push('')\n out.push('| Worker id | Label | Queued | Delivered |')\n out.push('|---|---|---:|---:|')\n for (const s of o.steersByWorker) {\n out.push(\n `| ${s.workerId === null ? 'unavailable — worker id absent; label join used' : `\\`${s.workerId}\\``} | \\`${s.worker}\\` | ${s.queued} | ${s.delivered} |`,\n )\n }\n out.push('')\n } else if (isUnavailable(o.steersByWorker)) {\n out.push(`### Steers per worker\\n\\nunavailable — ${o.steersByWorker.unavailable}\\n`)\n }\n\n out.push('## Decision quality')\n out.push('')\n out.push('| Metric | Value |')\n out.push('|---|---|')\n out.push(`| Settled by status | ${fmtCounts(d.settledByStatus)} |`)\n out.push(`| Settled verdicts | ${fmtCounts(d.settledVerdicts)} |`)\n out.push(`| Accepted (verify green + patch bytes) | ${showMeasured(d.accepted)} |`)\n out.push(`| Rejected (verify red) | ${showMeasured(d.rejected)} |`)\n out.push(`| Empty pass (green, no patch) | ${showMeasured(d.emptyPass)} |`)\n out.push(`| Evidence → respawn sequences | ${showMeasured(d.observeThenRespawn)} |`)\n out.push(\n `| Respawn with no same-parent settled evidence in front | ${showMeasured(d.respawnWithoutEvidence)} |`,\n )\n out.push(`| Review actions (steers + worker questions) | ${showMeasured(d.reviewActions)} |`)\n out.push(\n `| Worker evidence returned | ${isUnavailable(d.workerEvidenceBytes) ? showMeasured(d.workerEvidenceBytes) : `${d.workerEvidenceBytes} bytes`} |`,\n )\n out.push('')\n\n out.push('## Economics')\n out.push('')\n out.push('| Role | Tokens in | Tokens out | Cache read | Cache write | USD | Source |')\n out.push('|---|---:|---:|---:|---:|---:|---|')\n out.push(\n `| brain | ${showMeasured(e.brain.tokensIn)} | ${showMeasured(e.brain.tokensOut)} | ${showMeasured(e.brain.cacheRead)} | ${showMeasured(e.brain.cacheWrite)} | ${showMeasured(e.brain.usd)} | ${e.brain.source} |`,\n )\n out.push(\n `| workers | ${showMeasured(e.workers.tokensIn)} | ${showMeasured(e.workers.tokensOut)} | ${showMeasured(e.workers.cacheRead)} | ${showMeasured(e.workers.cacheWrite)} | ${showMeasured(e.workers.usd)} | ${e.workers.source} |`,\n )\n out.push('')\n if (!isUnavailable(e.brainTruncations) && e.brainTruncations > 0) {\n out.push(\n `- **BRAIN OUTPUT TRUNCATED: ${e.brainTruncations} completion(s) hit \\`finish_reason: \"length\"\\`** — the supervisor ` +\n 'acted on a half-written plan. Its output ceiling is too low; see `brain.jsonl` for the per-call `req_max_tokens`.',\n )\n } else {\n out.push(\n `- Brain completions truncated (finish_reason=length): ${showMeasured(e.brainTruncations)}`,\n )\n }\n out.push(`- Total USD: ${showMeasured(e.totalUsd)} (source: ${e.totalUsdSource})`)\n out.push(\n `- Spend measured two ways: journal-derived $${showMeasured(e.spend.journalDerived.usd)} over ${e.spend.journalDerived.records} journal record(s) (execution accounting) · ` +\n `close-record $${showMeasured(e.spend.closeRecord.usd)} over ${e.spend.closeRecord.records} close record(s) (billing-shaped). Divergence is a signal, not an error.`,\n )\n out.push(`- Cost per accepted patch: ${showMeasured(e.costPerAcceptedPatchUsd)}`)\n if (isUnavailable(e.workerWallMsDistribution)) {\n out.push(`- Worker wall distribution: unavailable — ${e.workerWallMsDistribution.unavailable}`)\n } else {\n const w = e.workerWallMsDistribution\n out.push(\n `- Worker wall (n=${w.n}): min ${fmtMs(w.min)} / p50 ${fmtMs(w.p50)} / p90 ${fmtMs(w.p90)} / max ${fmtMs(w.max)} / Σ ${fmtMs(w.sum)}`,\n )\n }\n out.push('')\n if (!isUnavailable(e.perWorker) && e.perWorker.length > 0) {\n out.push(\n '| Worker id | Label | Role | Runtime | Profile digest | Status | Failure | Infra | Wall | Tokens in | Tokens out | Patch bytes | Verify passed | Score |',\n )\n out.push('|---|---|---|---|---|---|---|---|---:|---:|---:|---:|---|---:|')\n for (const w of e.perWorker) {\n out.push(\n `| ${w.workerId === null ? 'unavailable — worker id absent; label join used' : `\\`${w.workerId}\\``} | \\`${w.worker}\\` | ${w.role ?? 'unavailable — source recorded no role'} | ${w.runtime ?? 'unavailable — source recorded no runtime'} | ${w.profileDigest === null ? 'unavailable — source recorded no profile digest' : `\\`${w.profileDigest}\\``} | ${w.status ?? 'unavailable — no terminal event'} | ${w.failure ?? 'none recorded'} | ${w.infra ?? 'unavailable'} | ${w.wallMs === null ? 'unavailable — no spawn/finish pair' : fmtMs(w.wallMs)} | ${w.tokensIn ?? 'unavailable — store does not attribute tokens per worker'} | ${w.tokensOut ?? 'unavailable — store does not attribute tokens per worker'} | ${w.patchBytes ?? 'unavailable — no worker patch file'} | ${w.passed === null ? 'unavailable — no verdict' : String(w.passed)} | ${w.score ?? 'unavailable — no numeric score'} |`,\n )\n }\n out.push('')\n }\n\n if (e.resourceRecords !== undefined) {\n out.push('## Named resource receipts', '', ...resourceRows(e.resourceRecords))\n }\n\n out.push('## Outcome')\n out.push('')\n out.push('| Metric | Value |')\n out.push('|---|---|')\n out.push(`| Supervisor status | ${showMeasured(r.outcome.supStatus)} |`)\n out.push(`| Status source | ${showMeasured(r.outcome.supStatusSource)} |`)\n out.push(`| Terminal reason | ${showMeasured(r.outcome.supReason)} |`)\n out.push(`| Failure | ${fmtFailure(r.outcome.failure)} |`)\n out.push(`| Supervisor verdict | ${showMeasured(r.outcome.supVerdict)} |`)\n out.push(`| Delivered | ${showMeasured(r.outcome.delivered)} |`)\n out.push(`| Judge resolved | ${showMeasured(r.outcome.judgeResolved)} |`)\n out.push(`| Judge score | ${showMeasured(r.outcome.judgeScore)} |`)\n out.push(\n `| Judge passed / total | ${showMeasured(r.outcome.judgePassed)} / ${showMeasured(r.outcome.judgeTotal)} |`,\n )\n out.push(\n `| Judge source | ${r.outcome.judgeSource ?? 'unavailable — no judge.json and no ledger row'} |`,\n )\n out.push(\n `| Verify gate | pass=${showMeasured(r.outcome.verifyPass)} rc=${showMeasured(r.outcome.verifyRc)} |`,\n )\n if (isUnavailable(r.outcome.patch)) {\n out.push(`| Patch | unavailable — ${r.outcome.patch.unavailable} |`)\n } else {\n const p = r.outcome.patch\n out.push(\n `| Patch | ${p.files} file(s), +${p.linesAdded}/-${p.linesRemoved}, test files touched: ${p.testFilesTouched.length === 0 ? 'none' : p.testFilesTouched.join(', ')} |`,\n )\n }\n out.push('')\n out.push('## Gaps')\n out.push('')\n if (r.gaps.length === 0) out.push('None — every metric above is backed by a present artifact.')\n else for (const g of r.gaps) out.push(`- ${g}`)\n out.push('')\n out.push(\n `> Harness-session view of the same run (model calls, stuck loops, tool errors): \\`${r.traceCommand}\\``,\n )\n out.push('')\n return out.join('\\n')\n}\n\nfunction fmtCounts(v: Measured<Record<string, number>>): string {\n if (isUnavailable(v)) return showMeasured(v as unknown as Measured<string>)\n const entries = Object.entries(v)\n return entries.length === 0 ? 'none' : entries.map(([k, n]) => `${k}=${n}`).join(', ')\n}\n\nexport function renderSupervisorRollupMarkdown(\n rollup: SupervisorRunRollup,\n title = 'Round rollup',\n): string {\n const out: string[] = []\n out.push(`# ${title}`)\n out.push('')\n out.push(`- Cells: ${rollup.cells}`)\n out.push(\n `- **Steers across all cells: ${showMeasured(rollup.steersTotal)}** (cells with ≥1 steer: ${showMeasured(rollup.cellsWithSteers)}; cells where the steer count is unavailable: ${rollup.cellsWithUnavailableSteers})`,\n )\n out.push(`- Waves per cell (mean): ${showMeasured(rollup.wavesMean)}`)\n out.push(`- Max concurrency observed: ${showMeasured(rollup.maxConcurrencyMax)}`)\n out.push(`- Worker utilization (mean): ${showMeasured(rollup.utilizationMean)}`)\n out.push(`- Idle share (mean): ${showMeasured(rollup.idlePctMean)}%`)\n out.push(\n `- Workers spawned: ${showMeasured(rollup.workersSpawnedTotal)} · accepted: ${showMeasured(rollup.acceptedTotal)}`,\n )\n out.push(\n `- Spend: $${showMeasured(rollup.usdTotal)} · judged resolved: ${showMeasured(rollup.resolvedCount)}/${rollup.cells}`,\n )\n out.push(\n `- Spend measured two ways: journal-derived $${showMeasured(rollup.spendUsd.journalDerived.value)} over ${rollup.spendUsd.journalDerived.runs}/${rollup.cells} runs (execution accounting) · ` +\n `close-record $${showMeasured(rollup.spendUsd.closeRecord.value)} over ${rollup.spendUsd.closeRecord.runs}/${rollup.cells} runs (billing-shaped)`,\n )\n out.push('')\n out.push('| Instance | Arm | Steers | Waves | Utilization | Idle % | Resolved | USD |')\n out.push('|---|---|---:|---:|---:|---:|---|---:|')\n for (const c of rollup.perCell) {\n out.push(\n `| ${c.instanceId ?? '?'} | ${c.arm ?? '?'} | ${showMeasured(c.steers)} | ${showMeasured(c.waves)} | ${showMeasured(c.utilization)} | ${showMeasured(c.idlePct)} | ${showMeasured(c.resolved)} | ${showMeasured(c.usd)} |`,\n )\n }\n out.push('')\n for (const cell of rollup.perCell) {\n if (cell.resourceRecords !== undefined) {\n out.push(\n `## Resource receipts — ${cell.instanceId ?? '?'} [${cell.arm ?? '?'}]`,\n '',\n ...resourceRows(cell.resourceRecords),\n )\n }\n }\n return out.join('\\n')\n}\n","/**\n * Reader for agent-runtime's file-backed supervision context.\n *\n * Runtime stores multiple recursive trees in one `spawn-journal.jsonl`.\n * Each line is an envelope whose `root` identifies the local tree. A journal\n * can connect a nested tree with `spawned.ownedTreeRoot`. It can also use the\n * spawned child id as the nested root when no owned tree is recorded. Either\n * way the nested tree may repeat its owner's spawn as a parentless marker: the\n * owner's id, not the tree key, identifies it (an owned tree's key is a path\n * such as `root/root:s0`). Descendant spawns must occur in the tree their\n * parent owns. This reader removes a duplicate marker and preserves the other\n * envelopes for the supervisor-run analyzer. Runtime stores profile\n * identity below `identity` and does not emit Eval's role field. This boundary\n * projects those fields without changing Runtime's dialect.\n *\n * Transcripts come from Runtime's own records too: `root-stream.jsonl` is the root's, each\n * worker's turn outputs and native-session receipt are read from the journal, and every blob\n * a record names is checked on disk (see `nodeTranscripts`).\n *\n * The run's terminal record is Runtime's own: `result.json` is the\n * `SupervisedResult` that `supervise()` returned, verbatim, and its `kind`\n * (`winner`, `no-winner`, or whatever a later arm is called) is the status.\n * `failure.json` (`{ runId, pursuitId, at, error: { name, message } }`) is the\n * record Runtime writes when `supervise()` threw before a result landed. Both\n * pass through as bytes; `terminal-record.ts` reads them. The reader does not\n * decide which kinds count: a kind it refuses is a run that recorded its\n * outcome and got reported as having none. The reader does not synthesize status fields. The analyzer names the Runtime\n * record that supplied a status, so status provenance cannot be mislabelled.\n *\n * `usdKnown: false` / `tokensKnown: false` on ONE record is not a limit of this\n * store. The store recorded every other record completely, so the flags travel\n * through to the analyzer per record, which reports the measured nodes and\n * names the unreported ones.\n */\n\nimport { readFile, stat } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { hashCanonical } from '../ledger-core/canonical'\nimport type { RolloutWorkspaceCapture } from '../rollout/schema'\nimport {\n NO_SOURCE_LIMITS,\n type SourceLimits,\n type SupervisorRunReader,\n type SupervisorRunSources,\n type WorkerLogSource,\n type WorkerNativeSession,\n} from './types'\n\nconst JOURNAL_FILE = 'spawn-journal.jsonl'\nconst OBSERVER_FILE = 'observer.jsonl'\nconst ROOT_STREAM_FILE = 'root-stream.jsonl'\nconst BLOB_DIR = 'blobs'\nconst RESULT_FILE = 'result.json'\nconst FAILURE_FILE = 'failure.json'\n\n/**\n * The files only Runtime's durable layer writes. Any one of them marks a\n * Runtime run directory: `supervise()` opens the spawn journal on its first\n * event, and `supervisePursuit` appends the observer's `before` event and, on\n * a throw, the failure record before any spawn.\n *\n * Measured motive (discovery-lab recursive smoke r1, 2026-09-06): the first\n * attempt threw on a caller input error 16 minutes before the corrected attempt\n * opened the spawn journal. At that instant the directory held `observer.jsonl`\n * (2 records) and the failure record and no journal, so a journal-only test\n * routed it to an unrelated reader, which reads neither file, and the recorded\n * throw was reported as no run at all.\n */\nconst RUNTIME_RUN_DIR_MARKERS: readonly string[] = [JOURNAL_FILE, OBSERVER_FILE, FAILURE_FILE]\n\ninterface BeginRecord {\n readonly root: string\n readonly at: string\n readonly line: number\n}\n\ninterface EventRecord {\n readonly root: string\n readonly event: Record<string, unknown>\n readonly line: number\n}\n\ninterface NormalizedRuntimeJournal {\n readonly root: string\n readonly startedAt: string\n readonly journal: string\n readonly events: readonly Record<string, unknown>[]\n}\n\nasync function readMaybe(path: string): Promise<string | null> {\n return readFile(path, 'utf8').catch((error: unknown) => {\n if (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n (error as { code: unknown }).code === 'ENOENT'\n ) {\n return null\n }\n throw error\n })\n}\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null\n}\n\nfunction nonEmptyString(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null\n}\n\nfunction profileDigest(event: Record<string, unknown>): string | null {\n const direct = nonEmptyString(event.profileDigest)\n if (direct !== null) return direct\n const identity = record(event.identity)\n return identity === null ? null : nonEmptyString(identity.profileDigest)\n}\n\nfunction formatError(path: string, line: number, detail: string): Error {\n return new Error(`${path}:${line}: invalid Runtime spawn journal: ${detail}`)\n}\n\nfunction parseEnvelopeJournal(text: string, path: string): NormalizedRuntimeJournal {\n const begins: BeginRecord[] = []\n const events: EventRecord[] = []\n const begun = new Map<string, BeginRecord>()\n\n for (const [index, sourceLine] of text.split('\\n').entries()) {\n const line = index + 1\n const trimmed = sourceLine.trim()\n if (trimmed.length === 0) continue\n let parsed: unknown\n try {\n parsed = JSON.parse(trimmed)\n } catch {\n throw formatError(path, line, 'line is not JSON')\n }\n const envelope = record(parsed)\n if (envelope === null) throw formatError(path, line, 'line is not an object')\n const kind = nonEmptyString(envelope.kind)\n const root = nonEmptyString(envelope.root)\n if (root === null) throw formatError(path, line, 'root must be a non-empty string')\n\n if (kind === 'begin') {\n const at = nonEmptyString(envelope.at)\n if (at === null || !Number.isFinite(Date.parse(at))) {\n throw formatError(path, line, 'begin.at must be an ISO timestamp')\n }\n if (begun.has(root)) throw formatError(path, line, `tree ${JSON.stringify(root)} began twice`)\n const begin = { root, at, line }\n begun.set(root, begin)\n begins.push(begin)\n continue\n }\n\n if (kind !== 'event') {\n throw formatError(path, line, \"kind must be 'begin' or 'event'\")\n }\n if (!begun.has(root)) {\n throw formatError(path, line, `event for tree ${JSON.stringify(root)} precedes begin`)\n }\n const event = record(envelope.event)\n if (event === null) throw formatError(path, line, 'event must be an object')\n if (nonEmptyString(event.kind) === null) {\n throw formatError(path, line, 'event.kind must be a non-empty string')\n }\n events.push({ root, event: { ...event }, line })\n }\n\n if (begins.length === 0) throw formatError(path, 1, 'no begin record')\n\n const parentSpawnsById = new Map<string, EventRecord[]>()\n const parentSpawnsByOwnedTreeRoot = new Map<string, EventRecord[]>()\n for (const entry of events) {\n if (entry.event.kind !== 'spawned') continue\n const id = nonEmptyString(entry.event.id)\n if (id === null) continue\n if (nonEmptyString(entry.event.parent) !== null) {\n const ownedTreeRoot = nonEmptyString(entry.event.ownedTreeRoot)\n if (ownedTreeRoot !== null) {\n const owners = parentSpawnsByOwnedTreeRoot.get(ownedTreeRoot) ?? []\n owners.push(entry)\n parentSpawnsByOwnedTreeRoot.set(ownedTreeRoot, owners)\n } else {\n const matches = parentSpawnsById.get(id) ?? []\n matches.push(entry)\n parentSpawnsById.set(id, matches)\n }\n }\n }\n\n const nestedRoots = new Set<string>()\n const nestedParentSpawns = new Map<string, EventRecord>()\n for (const begin of begins) {\n const parentSpawns = [\n ...new Set([\n ...(parentSpawnsByOwnedTreeRoot.get(begin.root) ?? []),\n ...(parentSpawnsById.get(begin.root) ?? []),\n ]),\n ].filter((entry) => entry.root !== begin.root)\n if (parentSpawns.length > 1) {\n throw formatError(\n path,\n begin.line,\n `tree ${JSON.stringify(begin.root)} has ${parentSpawns.length} parent spawns`,\n )\n }\n if (parentSpawns.length === 1) {\n nestedRoots.add(begin.root)\n nestedParentSpawns.set(begin.root, parentSpawns[0] as EventRecord)\n }\n }\n\n const topRoots = begins.filter((begin) => !nestedRoots.has(begin.root))\n if (topRoots.length !== 1) {\n throw formatError(\n path,\n topRoots[0]?.line ?? 1,\n `expected one top-level tree, found ${topRoots.length}`,\n )\n }\n const top = topRoots[0] as BeginRecord\n\n // A tree's root marker is a parentless spawn of the node that owns the tree: the top root\n // itself, or the parent spawn that owns a nested tree. An owned tree's key is a path, so\n // the owner's id is compared, never the tree key.\n const ownerIdByTree = new Map<string, string>([[top.root, top.root]])\n for (const [nestedRoot, parentSpawn] of nestedParentSpawns) {\n const ownerId = nonEmptyString(parentSpawn.event.id)\n if (ownerId !== null) ownerIdByTree.set(nestedRoot, ownerId)\n }\n const isRootMarker = (entry: EventRecord): boolean =>\n entry.event.kind === 'spawned' &&\n (entry.event.parent === undefined || entry.event.parent === null) &&\n nonEmptyString(entry.event.id) !== null &&\n entry.event.id === ownerIdByTree.get(entry.root)\n const rootMarkersByTree = new Map<string, EventRecord[]>()\n for (const entry of events) {\n if (!isRootMarker(entry)) continue\n const markers = rootMarkersByTree.get(entry.root) ?? []\n markers.push(entry)\n rootMarkersByTree.set(entry.root, markers)\n }\n\n for (const nestedRoot of nestedRoots) {\n const markers = rootMarkersByTree.get(nestedRoot) ?? []\n if (markers.length > 1) {\n throw formatError(\n path,\n begun.get(nestedRoot)?.line ?? 1,\n `nested tree ${JSON.stringify(nestedRoot)} contains ${markers.length} root markers`,\n )\n }\n const parentSpawn = nestedParentSpawns.get(nestedRoot)\n if (parentSpawn === undefined) {\n throw formatError(\n path,\n begun.get(nestedRoot)?.line ?? 1,\n `nested tree ${JSON.stringify(nestedRoot)} has no parent spawn`,\n )\n }\n const markerDigest = profileDigest(markers[0]?.event ?? {})\n const parentDigest = profileDigest(parentSpawn.event)\n if (markerDigest !== null && parentDigest !== null && markerDigest !== parentDigest) {\n throw formatError(\n path,\n markers[0]?.line ?? 1,\n `nested tree ${JSON.stringify(nestedRoot)} disagrees with its parent profile digest`,\n )\n }\n if (parentDigest === null && markerDigest !== null) {\n parentSpawn.event.profileDigest = markerDigest\n }\n }\n\n const ownedTreeBySupervisorId = new Map<string, string>([[top.root, top.root]])\n for (const [nestedRoot, parentSpawn] of nestedParentSpawns) {\n const supervisorId = nonEmptyString(parentSpawn.event.id)\n if (supervisorId === null) continue\n const priorTree = ownedTreeBySupervisorId.get(supervisorId)\n if (priorTree !== undefined && priorTree !== nestedRoot) {\n throw formatError(\n path,\n parentSpawn.line,\n `spawn ${JSON.stringify(supervisorId)} owns both ${JSON.stringify(priorTree)} and ${JSON.stringify(nestedRoot)}`,\n )\n }\n ownedTreeBySupervisorId.set(supervisorId, nestedRoot)\n }\n for (const entry of events) {\n if (entry.event.kind !== 'spawned') continue\n const parentId = nonEmptyString(entry.event.parent)\n if (parentId === null) continue\n const parentTree = ownedTreeBySupervisorId.get(parentId)\n if (parentTree === undefined) {\n throw formatError(\n path,\n entry.line,\n `spawn ${JSON.stringify(entry.event.id)} names parent ${JSON.stringify(parentId)}, which owns no journal tree`,\n )\n }\n if (entry.root !== parentTree) {\n throw formatError(\n path,\n entry.line,\n `spawn ${JSON.stringify(entry.event.id)} is in tree ${JSON.stringify(entry.root)}, but parent ${JSON.stringify(parentId)} owns tree ${JSON.stringify(parentTree)}`,\n )\n }\n }\n\n // Runtime's recursive atom has no supervisor/worker role field. A tree root\n // is a supervisor; a child without its own tree is a worker.\n const supervisorIds = new Set([\n top.root,\n ...[...nestedParentSpawns.values()]\n .map((entry) => nonEmptyString(entry.event.id))\n .filter((id): id is string => id !== null),\n ])\n const normalized = events\n .filter((entry) => !(nestedRoots.has(entry.root) && isRootMarker(entry)))\n .map((entry) => {\n const event = { ...entry.event }\n if (event.kind === 'spawned') {\n const digest = profileDigest(event)\n if (event.profileDigest === undefined && digest !== null) {\n event.profileDigest = digest\n }\n if (event.role === undefined) {\n event.role = supervisorIds.has(nonEmptyString(event.id) ?? '') ? 'supervisor' : 'worker'\n }\n }\n return { root: entry.root, event }\n })\n\n const rootMarkers = rootMarkersByTree.get(top.root) ?? []\n if (rootMarkers.length !== 1) {\n throw formatError(\n path,\n top.line,\n `top-level tree ${JSON.stringify(top.root)} must contain one root marker`,\n )\n }\n\n return {\n root: top.root,\n startedAt: top.at,\n // Keep Runtime's event envelope intact. The pure source parser uses the envelope to\n // distinguish an understood-but-unmodeled Runtime event from an unreadable flat record.\n journal: `${normalized\n .map((entry) => JSON.stringify({ kind: 'event', root: entry.root, event: entry.event }))\n .join('\\n')}\\n`,\n events: normalized.map((entry) => entry.event),\n }\n}\n\nfunction parseOptionalRecord(text: string | null, path: string): Record<string, unknown> | null {\n if (text === null) return null\n let parsed: unknown\n try {\n parsed = JSON.parse(text)\n } catch {\n throw new Error(`${path}: invalid JSON`)\n }\n const value = record(parsed)\n if (value === null) throw new Error(`${path}: expected a JSON object`)\n return value\n}\n\nfunction spendRecord(value: unknown): Record<string, unknown> | null {\n const spend = record(value)\n if (spend === null) return null\n const tokens = record(spend.tokens)\n if (\n tokens === null ||\n typeof tokens.input !== 'number' ||\n !Number.isFinite(tokens.input) ||\n tokens.input < 0 ||\n typeof tokens.output !== 'number' ||\n !Number.isFinite(tokens.output) ||\n tokens.output < 0 ||\n typeof spend.usd !== 'number' ||\n !Number.isFinite(spend.usd) ||\n spend.usd < 0 ||\n (spend.usdKnown !== undefined && typeof spend.usdKnown !== 'boolean')\n ) {\n return null\n }\n return spend\n}\n\nfunction sourceLimits(\n root: string,\n events: readonly Record<string, unknown>[],\n workerIds: ReadonlySet<string>,\n): SourceLimits {\n const rootMeters = events.filter((event) => event.kind === 'metered' && event.id === root)\n const invalidRootMeters = rootMeters.filter((event) => spendRecord(event.spend) === null)\n const rootMeterReason =\n rootMeters.length === 0\n ? 'Runtime journal has no root metered event'\n : invalidRootMeters.length > 0\n ? `${invalidRootMeters.length} root metered event(s) lack complete spend`\n : null\n const closes = events.filter(\n (event) =>\n workerIds.has(nonEmptyString(event.id) ?? '') &&\n (event.kind === 'settled' || event.kind === 'cancelled'),\n )\n const settledById = new Map<string, Record<string, unknown>[]>()\n for (const event of closes) {\n const id = nonEmptyString(event.id)\n if (id === null) continue\n const matches = settledById.get(id) ?? []\n matches.push(event)\n settledById.set(id, matches)\n }\n const incompleteWorkers = [...workerIds].filter((id) => {\n const terminal = settledById.get(id)\n return (\n terminal?.length !== 1 ||\n terminal[0]?.kind !== 'settled' ||\n spendRecord(terminal[0]?.spent) === null\n )\n })\n const missingVerdicts = [...workerIds].filter((id) => {\n const terminal = settledById.get(id)?.[0]\n if (terminal?.kind !== 'settled') return true\n const verdict = record(terminal.verdict)\n return typeof verdict?.valid !== 'boolean'\n })\n\n return {\n managerTokens: rootMeterReason,\n workerTokens:\n incompleteWorkers.length === 0\n ? null\n : `${incompleteWorkers.length}/${workerIds.size} child invocation(s) lack one settled spend record`,\n // `usdKnown: false` on ONE record is not a limit of this store: the store priced every\n // other record, and a limit here discards them all. The analyzer folds the flag per\n // record instead, and reports a partial total with the unpriced nodes named.\n spendUsd:\n rootMeterReason !== null\n ? rootMeterReason\n : incompleteWorkers.length > 0\n ? 'at least one child invocation lacks a settled spend record'\n : null,\n workerVerdicts:\n missingVerdicts.length === 0\n ? null\n : `${missingVerdicts.length}/${workerIds.size} child invocation(s) lack a structured validity verdict`,\n deliverables:\n workerIds.size === 0\n ? null\n : 'Runtime FileRunContext does not retain per-child delivered patches',\n }\n}\n\n/**\n * Refuse a `result.json` that belongs to another run. Runtime's result carries\n * its own `tree.root`; a settled record with a different root is a copied or\n * misplaced file, and reading its status onto this journal misreports the run.\n */\nfunction assertResultMatchesJournal(\n root: string,\n result: Record<string, unknown> | null,\n resultPath: string,\n): void {\n const resultKind = result === null ? null : nonEmptyString(result.kind)\n if (resultKind === null || result === null) return\n const resultRoot = nonEmptyString(record(result.tree)?.root)\n if (resultRoot === null) {\n throw new Error(`${resultPath}: Runtime ${resultKind} result has no tree.root`)\n }\n if (resultRoot !== root) {\n throw new Error(\n `${resultPath}: root ${JSON.stringify(resultRoot)} does not match journal root ${JSON.stringify(root)}`,\n )\n }\n}\n\n/**\n * Refuse a `failure.json` that is not a failure record. Runtime writes\n * `{ runId, pursuitId, at, error: { name, message } }`; a document without an\n * `error` object is not one, and reading it as a failure invents a terminal\n * state the run never recorded. The record carries no tree root, so its\n * identity is not checked against the journal.\n */\nfunction assertFailureRecord(failure: Record<string, unknown> | null, failurePath: string): void {\n if (failure === null) return\n if (record(failure.error) === null) {\n throw new Error(`${failurePath}: Runtime failure record has no error object`)\n }\n}\n\n/**\n * The journal's begin stamp in the analyzer's state-document shape. It carries\n * the run identity and start instant only; the terminal status lives in\n * Runtime's own `result.json` / `failure.json`, which the analyzer reads by\n * name, so no synthetic status field is fabricated here.\n */\nfunction runtimeBeginState(root: string, startedAt: string): string {\n return JSON.stringify({ id: root, startedAt })\n}\n\n/**\n * The file Runtime's `FileResultBlobStore` writes for one content address\n * (`sha256:<hex>` → `blobs/sha256-<hex>.json`), or null for anything that is not one.\n */\nfunction blobFile(runDir: string, ref: unknown): string | null {\n return typeof ref === 'string' && /^sha256:[0-9a-f]{64}$/u.test(ref)\n ? join(runDir, BLOB_DIR, `${ref.replace(':', '-')}.json`)\n : null\n}\n\ntype NodeTranscript = Pick<\n WorkerLogSource,\n 'transcriptRef' | 'turns' | 'nativeSession' | 'workspaceCaptures'\n>\n\ninterface NodeTranscriptFacts {\n dispatched: number\n readonly outputRefs: { value: unknown; turn: boolean }[]\n readonly outputPositions: Map<string, number>\n receipt: Record<string, unknown> | null\n}\n\n/** A later receipt replaces an earlier one, except that an absence never replaces an available one. */\nfunction keepReceipt(fact: NodeTranscriptFacts, receipt: Record<string, unknown> | null): void {\n if (receipt === null) return\n if (fact.receipt?.status === 'available' && receipt.status !== 'available') return\n fact.receipt = receipt\n}\n\n/**\n * The files each harness writes its conversation to. A receipt can be available and complete\n * while holding none of them: on the 2026-10-04 trace proof a Pi worker that never wrote a session\n * stored only `.pi/agent/models-store.json`, and this summary counted it as a transcript.\n */\nconst HARNESS_SESSION_FILE: Readonly<Record<string, RegExp>> = {\n 'claude-code': /(^|\\/)\\.claude\\/projects\\/.+\\.jsonl$/u,\n codex: /(^|\\/)\\.codex\\/sessions\\/.+\\.jsonl$/u,\n pi: /(^|\\/)\\.pi\\/agent\\/sessions\\/.+\\.jsonl$/u,\n opencode:\n /(^|\\/)(\\.local\\/share\\/opencode\\/(opencode\\.db|storage\\/session\\/.+\\.json|export\\/.+\\.json)|\\.opencode\\/sessions\\/.+)$/u,\n}\n\n/** Session files the receipt's transcript blob lists, or undefined when it cannot say. */\nasync function receiptSessionFiles(file: string): Promise<number | undefined> {\n let descriptor: unknown\n try {\n descriptor = JSON.parse(await readFile(file, 'utf8'))\n } catch {\n return undefined\n }\n const harness = record(descriptor)?.harness\n const files = record(descriptor)?.files\n const pattern = typeof harness === 'string' ? HARNESS_SESSION_FILE[harness] : undefined\n if (pattern === undefined || !Array.isArray(files)) return undefined\n return files.filter((entry) => {\n const path = record(entry)?.path\n return typeof path === 'string' && pattern.test(path)\n }).length\n}\n\ntype NativeSessionState = 'complete' | 'partial' | 'no-session-file' | 'unavailable' | 'none'\n\nfunction nativeSessionState(session: WorkerNativeSession | null | undefined): NativeSessionState {\n if (session === null || session === undefined) return 'none'\n if (session.status !== 'available') return 'unavailable'\n if (session.coverageComplete === false) return 'partial'\n if (session.sessionFiles === 0) return 'no-session-file'\n return 'complete'\n}\n\n/**\n * What this reader can say about harness-session traces. Every spawned worker counts, including\n * one that recorded nothing; the root is reported apart because its receipt lives in result.json\n * (`rootHarnessTranscript`), not on a worker. Runtime records the session identity on each\n * receipt, so the sessions are read per node, not through one command. A receipt counts as a\n * session only when its copy is complete and holds a file the harness writes its conversation to.\n */\nfunction nativeTraceSummary(\n workers: readonly WorkerLogSource[],\n root: NodeTranscript | undefined,\n): string {\n const states = workers.map((worker) => nativeSessionState(worker.nativeSession))\n const count = (state: NativeSessionState): number => states.filter((s) => s === state).length\n const rootSession = root?.nativeSession ?? null\n const rootState = nativeSessionState(rootSession)\n const rootText =\n rootSession === null\n ? 'no receipt'\n : rootSession.status === 'unavailable'\n ? `unavailable (${rootSession.reason})`\n : rootState === 'complete'\n ? 'complete'\n : rootState === 'partial'\n ? 'partial copy'\n : 'no session file'\n if (rootSession === null && states.every((state) => state === 'none'))\n return 'unavailable — no node carries a Runtime harness transcript receipt'\n const gaps = [\n count('partial') > 0 ? `${count('partial')} only a partial copy` : null,\n count('no-session-file') > 0\n ? `${count('no-session-file')} a receipt with no session file`\n : null,\n ].filter((gap): gap is string => gap !== null)\n return `per node — ${count('complete')} of ${workers.length} workers carry a complete native session receipt (workers[].nativeSession)${gaps.length > 0 ? `; ${gaps.join('; ')}` : ''}; root: ${rootText} (result.json rootHarnessTranscript)`\n}\n\nasync function workspaceCapturesFromOutput(\n runDir: string,\n ref: unknown,\n): Promise<RolloutWorkspaceCapture[]> {\n const outRef = typeof ref === 'string' ? ref : null\n const blobPath = blobFile(runDir, ref)\n const missing = (projectionGap: string): RolloutWorkspaceCapture => ({\n outRef,\n blobPath,\n receiptPointer: null,\n receipt: null,\n attempts: null,\n coverageComplete: null,\n incompleteReason: null,\n projectionGap,\n })\n if (blobPath === null) return [missing('Runtime output has no valid content address')]\n if (!(await isFile(blobPath))) return [missing('Runtime output blob is missing or not a file')]\n const raw = await readMaybe(blobPath)\n if (raw === null) return [missing('Runtime output blob is missing')]\n let output: unknown\n try {\n output = JSON.parse(raw)\n } catch {\n return [missing('Runtime output blob is not JSON')]\n }\n let addressGap: string | null = null\n try {\n if (hashCanonical(output) !== outRef) {\n addressGap = 'Runtime output content address does not match output blob'\n }\n } catch {\n addressGap = 'Runtime output cannot be canonically hashed'\n }\n const project = (rawReceipt: unknown, receiptPointer: string | null): RolloutWorkspaceCapture => {\n const receipt = record(rawReceipt)\n if (receipt === null) {\n return {\n ...missing(\n `workspaceCapture receipt is absent or malformed${addressGap === null ? '' : `; ${addressGap}`}`,\n ),\n receiptPointer,\n receipt: rawReceipt,\n }\n }\n const provenance = record(receipt.provenance)\n const attempts = Array.isArray(provenance?.attempts) ? provenance.attempts : null\n const coverageComplete =\n typeof receipt.coverageComplete === 'boolean' ? receipt.coverageComplete : null\n const incompleteReason =\n typeof receipt.incompleteReason === 'string' ? receipt.incompleteReason : null\n const gaps: string[] = []\n if (addressGap !== null) gaps.push(addressGap)\n if (coverageComplete === null) gaps.push('workspaceCapture.coverageComplete is absent')\n if (record(receipt.snapshot) === null) gaps.push('workspaceCapture.snapshot is absent')\n if (provenance === null) gaps.push('workspaceCapture.provenance is absent')\n if (attempts === null) gaps.push('workspaceCapture.provenance.attempts is absent')\n else if (attempts.length === 0 || attempts.some((attempt) => record(attempt) === null)) {\n gaps.push('workspaceCapture.provenance.attempts is empty or malformed')\n }\n return {\n outRef,\n blobPath,\n receiptPointer,\n receipt,\n attempts,\n coverageComplete,\n incompleteReason,\n projectionGap: gaps.length > 0 ? gaps.join('; ') : null,\n }\n }\n const result = record(output)\n const captures: RolloutWorkspaceCapture[] = []\n // Use the record's field order and each array's order so every retained source stays ordered.\n for (const key of Object.keys(result ?? {})) {\n if (key === 'workspaceCapture') {\n captures.push(project(result?.[key], '/workspaceCapture'))\n } else if (key === 'workspaceCaptures') {\n const receipts = result?.[key]\n if (Array.isArray(receipts) && receipts.length > 0) {\n for (const [index, receipt] of receipts.entries()) {\n captures.push(project(receipt, `/workspaceCaptures/${index}`))\n }\n } else {\n captures.push({\n ...missing(\n `workspaceCaptures is empty or malformed${addressGap === null ? '' : `; ${addressGap}`}`,\n ),\n receiptPointer: '/workspaceCaptures',\n receipt: receipts ?? null,\n })\n }\n }\n }\n return captures.length > 0 ? captures : [project(null, null)]\n}\n\n/**\n * What Runtime retained of each node's decisions, from its own records.\n *\n * - A turn is one `execution-admitted` event in the `dispatched` phase. Its `execution-result`\n * names an output blob holding that turn's provider event stream (reasoning, tool calls and\n * results as the harness reported them). A dispatched turn with no retained output lost its\n * record, which is how a worker that went down mid-turn shows up.\n * - Every event's `outRef` enters the same collector, once per node and address. Terminal\n * records retain ordinary and steerable results; they are not counted as dispatched turns.\n * - The terminal event's `harnessTranscript` receipt covers the harness's native session files.\n * Those are the only record of the harness's own subagents, so an unavailable receipt is a\n * separate gap from a missing turn, and its reason is Runtime's, verbatim. `settled`,\n * `cancelled` and `reconciled` all carry one; an available receipt is never replaced by a later\n * absence. The root has no terminal event, so its receipt is the settle record's\n * `rootHarnessTranscript`.\n *\n * Blob files are checked on disk: a receipt that names a blob the directory no longer holds is\n * not a retained transcript.\n */\nasync function nodeTranscripts(\n runDir: string,\n events: readonly Record<string, unknown>[],\n nodeIds: ReadonlySet<string>,\n root?: { readonly id: string; readonly receipt: Record<string, unknown> | null },\n): Promise<Map<string, NodeTranscript>> {\n const facts = new Map<string, NodeTranscriptFacts>()\n const entry = (id: string): NodeTranscriptFacts => {\n let found = facts.get(id)\n if (found === undefined) {\n found = { dispatched: 0, outputRefs: [], outputPositions: new Map(), receipt: null }\n facts.set(id, found)\n }\n return found\n }\n for (const event of events) {\n const id = nonEmptyString(event.id)\n if (id === null || !nodeIds.has(id)) continue\n if (Object.hasOwn(event, 'outRef')) {\n const fact = entry(id)\n const ref = event.outRef\n const position = typeof ref === 'string' ? fact.outputPositions.get(ref) : undefined\n if (position !== undefined) {\n if (event.kind === 'execution-result') fact.outputRefs[position]!.turn = true\n } else {\n if (typeof ref === 'string') fact.outputPositions.set(ref, fact.outputRefs.length)\n fact.outputRefs.push({ value: ref, turn: event.kind === 'execution-result' })\n }\n }\n if (event.kind === 'execution-admitted' && record(event.admission)?.phase === 'dispatched') {\n entry(id).dispatched += 1\n } else if (\n event.kind === 'settled' ||\n event.kind === 'cancelled' ||\n event.kind === 'reconciled'\n ) {\n // A reconciled node carries its receipt on `reconciled`, which 15 available transcripts of\n // the 2026-10-04 Discovery archives did and this reader once skipped.\n keepReceipt(entry(id), record(event.harnessTranscript))\n }\n }\n if (root !== undefined && nodeIds.has(root.id)) keepReceipt(entry(root.id), root.receipt)\n const out = new Map<string, NodeTranscript>()\n for (const [id, fact] of facts) {\n const retained: string[] = []\n let retainedTurns = 0\n const workspaceCaptures: RolloutWorkspaceCapture[] = []\n for (const { value: ref, turn } of fact.outputRefs) {\n const file = blobFile(runDir, ref)\n if (file !== null && (await isFile(file))) {\n retained.push(file)\n if (turn) retainedTurns += 1\n }\n workspaceCaptures.push(...(await workspaceCapturesFromOutput(runDir, ref)))\n }\n let nativeSession: WorkerNativeSession | null = null\n if (fact.receipt !== null) {\n if (fact.receipt.status === 'available') {\n const file = blobFile(runDir, fact.receipt.transcriptRef)\n if (file !== null && (await isFile(file))) {\n const sessionFiles = await receiptSessionFiles(file)\n const coverageComplete = fact.receipt.coverageComplete\n nativeSession = {\n status: 'available',\n ref: file,\n ...(typeof coverageComplete === 'boolean' ? { coverageComplete } : {}),\n ...(sessionFiles === undefined ? {} : { sessionFiles }),\n }\n } else {\n nativeSession = { status: 'unavailable', reason: 'receipt-blob-missing' }\n }\n } else {\n nativeSession = {\n status: 'unavailable',\n reason: nonEmptyString(fact.receipt.reason) ?? 'unavailable',\n }\n }\n }\n out.set(id, {\n // The native session is the fuller record; the newest turn output is the next best.\n transcriptRef:\n nativeSession?.status === 'available' ? nativeSession.ref : (retained.at(-1) ?? null),\n turns: { dispatched: fact.dispatched, retained: retainedTurns },\n nativeSession,\n workspaceCaptures: workspaceCaptures.length > 0 ? workspaceCaptures : null,\n })\n }\n return out\n}\n\nexport interface RuntimeReaderOptions {\n /**\n * Throw on a missing spawn journal instead of returning absent-shaped\n * sources. The default (false) models a journal-less run dir — a\n * pre-supervise death, a backfilled zombie — as a readable absence.\n */\n readonly strict?: boolean\n}\n\n/**\n * Sources for a run dir whose spawn journal does not exist. Mirrors the\n * absent shape the reader returns for a missing store: every\n * journal-dependent metric downstream reads `unavailable`, never 0.\n */\n/**\n * The run identity a terminal record names when no journal exists yet: the\n * settle record's `tree.root`, else the failure record's `runId`. Both are\n * Runtime's own `runId`, so the report names the run the record is about\n * instead of `?`.\n */\nfunction recordedRunId(\n result: Record<string, unknown> | null,\n failure: Record<string, unknown> | null,\n): string | null {\n return nonEmptyString(record(result?.tree)?.root) ?? nonEmptyString(failure?.runId)\n}\n\nfunction absentRuntimeSupervisorRun(\n runDir: string,\n resultText: string | null,\n failureText: string | null,\n instanceId: string | null,\n): SupervisorRunSources {\n const reason = `no Runtime spawn journal (${JOURNAL_FILE}) under ${runDir}`\n return {\n runRef: runDir,\n instanceId,\n arm: null,\n supRunDir: null,\n journal: null,\n journalMissingReason: reason,\n brainLog: null,\n brainLogMissingReason:\n 'Runtime FileRunContext records spend but not model completion finish reasons',\n state: null,\n progress: null,\n workers: null,\n workersMissingReason: reason,\n result: resultText,\n failure: failureText,\n judge: null,\n judgeSource: null,\n patch: null,\n driverLog: null,\n harnessWorkerTokens: null,\n harnessMissingReason: 'Runtime FileRunContext has no external worker-token join',\n limits: NO_SOURCE_LIMITS,\n rootTranscriptRef: null,\n rootWorkspaceCaptures: null,\n traceCommand: 'unavailable — Runtime FileRunContext records no provider-session trace identity',\n }\n}\n\n/**\n * Read one agent-runtime `createFileRunContext(dir)` directory.\n *\n * A run dir without `spawn-journal.jsonl` returns the same absent-shaped\n * sources the reader returns for a missing store: `journal` and\n * `workers` null, each with its reason, so every dependent metric reads\n * `unavailable` — never 0 and never a throw. Its `result.json` and\n * `failure.json` are still read, so a run that died before its first spawn\n * reports the failure Runtime recorded. Pass `strict: true` to throw on the\n * missing journal instead. A journal, result, or failure document that exists\n * but cannot be parsed always throws: a corrupt record is a defect, not an\n * absence.\n *\n * The reader translates storage envelopes only. It does not assign research\n * roles, interpret artifacts, or turn process completion into a quality\n * verdict.\n */\nexport async function readRuntimeSupervisorRun(\n runDir: string,\n opts: RuntimeReaderOptions = {},\n): Promise<SupervisorRunSources> {\n const journalPath = join(runDir, JOURNAL_FILE)\n const rawJournal =\n opts.strict === true ? await readFile(journalPath, 'utf8') : await readMaybe(journalPath)\n const resultPath = join(runDir, RESULT_FILE)\n const failurePath = join(runDir, FAILURE_FILE)\n const resultText = await readMaybe(resultPath)\n const failureText = await readMaybe(failurePath)\n const failure = parseOptionalRecord(failureText, failurePath)\n assertFailureRecord(failure, failurePath)\n const result = parseOptionalRecord(resultText, resultPath)\n if (rawJournal === null) {\n return absentRuntimeSupervisorRun(\n runDir,\n resultText,\n failureText,\n recordedRunId(result, failure),\n )\n }\n const normalized = parseEnvelopeJournal(rawJournal, journalPath)\n assertResultMatchesJournal(normalized.root, result, resultPath)\n\n const spawns = normalized.events.filter(\n (event) => event.kind === 'spawned' && nonEmptyString(event.id) !== null,\n )\n const childSpawns = spawns.filter((event) => event.id !== normalized.root)\n const workerIds = new Set(\n childSpawns.map((event) => nonEmptyString(event.id)).filter((id): id is string => id !== null),\n )\n const transcripts = await nodeTranscripts(\n runDir,\n normalized.events,\n new Set([normalized.root, ...workerIds]),\n { id: normalized.root, receipt: record(result?.rootHarnessTranscript) },\n )\n const workers: WorkerLogSource[] = childSpawns.map((event) => {\n const workerId = nonEmptyString(event.id) as string\n const transcript = transcripts.get(workerId)\n return {\n workerId,\n label: nonEmptyString(event.label) ?? String(event.id),\n events: null,\n inbox: null,\n patchBytes: null,\n transcriptRef: transcript?.transcriptRef ?? null,\n turns: transcript?.turns ?? { dispatched: 0, retained: 0 },\n nativeSession: transcript?.nativeSession ?? null,\n workspaceCaptures: transcript?.workspaceCaptures ?? null,\n patchPath: null,\n }\n })\n // Runtime appends every root provider event to the root stream as it arrives.\n const rootStream = join(runDir, ROOT_STREAM_FILE)\n\n return {\n runRef: runDir,\n instanceId: normalized.root,\n arm: null,\n supRunDir: runDir,\n journal: normalized.journal,\n brainLog: null,\n brainLogMissingReason:\n 'Runtime FileRunContext records spend but not model completion finish reasons',\n state: runtimeBeginState(normalized.root, normalized.startedAt),\n progress: null,\n workers,\n workersMissingReason: null,\n result: resultText,\n failure: failureText,\n judge: null,\n judgeSource: null,\n patch: null,\n driverLog: null,\n harnessWorkerTokens: null,\n harnessMissingReason: 'Runtime FileRunContext has no external worker-token join',\n limits: sourceLimits(normalized.root, normalized.events, workerIds),\n rootTranscriptRef: (await isFile(rootStream)) ? rootStream : null,\n rootWorkspaceCaptures: transcripts.get(normalized.root)?.workspaceCaptures ?? null,\n traceCommand: nativeTraceSummary(workers, transcripts.get(normalized.root)),\n }\n}\n\n/** The agent-runtime file-backed layout as a `SupervisorRunReader`. */\nexport function runtimeSupervisorRunReader(\n runDir: string,\n opts: RuntimeReaderOptions = {},\n): SupervisorRunReader {\n return { runRef: runDir, read: () => readRuntimeSupervisorRun(runDir, opts) }\n}\n\n/**\n * True when a directory holds any file only Runtime's durable layer writes:\n * the spawn journal, the observer journal, or the failure record. A run that\n * threw before its first spawn has no journal yet and is still a Runtime run.\n */\nexport async function isRuntimeSupervisorRunDir(runDir: string): Promise<boolean> {\n for (const marker of RUNTIME_RUN_DIR_MARKERS) {\n if (await isFile(join(runDir, marker))) return true\n }\n return false\n}\n\nasync function isFile(path: string): Promise<boolean> {\n return stat(path)\n .then((entry) => entry.isFile())\n .catch((error: unknown) => {\n if (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n ((error as { code: unknown }).code === 'ENOENT' ||\n (error as { code: unknown }).code === 'ENOTDIR')\n ) {\n return false\n }\n throw error\n })\n}\n","/**\n * Runtime supervisor-run reader and report writers.\n *\n * Runtime's file-backed supervision context is the only live on-disk contract.\n * Other stores implement `SupervisorRunReader` and feed the same pure analyzer;\n * this module owns path discovery and report output for Runtime runs.\n */\n\nimport { appendFile, mkdir, readdir, writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { analyzeSupervisorRunSources } from './analyze'\nimport { renderSupervisorRunHeadline, renderSupervisorRunMarkdown } from './render'\nimport { isRuntimeSupervisorRunDir, readRuntimeSupervisorRun } from './runtime-reader'\nimport type { SupervisorRunReader, SupervisorRunReport, SupervisorRunSources } from './types'\n\n/**\n * Analyze a supervisor run. Accepts a Runtime run directory, any\n * `SupervisorRunReader`, or already-read source bytes — so a\n * caller with its own store never has to touch the filesystem layout.\n */\nexport async function analyzeSupervisorRun(\n input: string | SupervisorRunReader | SupervisorRunSources,\n): Promise<SupervisorRunReport> {\n if (typeof input === 'string') {\n return analyzeSupervisorRunSources(await readRuntimeSupervisorRun(input))\n }\n if (isReader(input)) return analyzeSupervisorRunSources(await input.read())\n return analyzeSupervisorRunSources(input)\n}\n\nfunction isReader(input: SupervisorRunReader | SupervisorRunSources): input is SupervisorRunReader {\n return typeof (input as SupervisorRunReader).read === 'function'\n}\n\nexport interface WriteSupervisorRunOptions {\n /** Append the headline block here (the experiment's run log). */\n readonly appendHeadlineTo?: string\n /** Also console.log the headline (default true). */\n readonly echo?: boolean\n /**\n * Write `run-report.{json,md}` here instead of into the run dir. Set when\n * reporting over a run directory that must stay READ-ONLY (a live run, an\n * archived generation).\n */\n readonly reportDir?: string\n}\n\n/**\n * Read a completed run, write `run-report.json` + `run-report.md` beside its\n * artifacts, and append the headline block to the run log. Never throws on a\n * missing artifact — a run that produced nothing still yields a report whose\n * every metric says why.\n */\nexport async function writeSupervisorRunReport(\n runDir: string,\n opts: WriteSupervisorRunOptions = {},\n): Promise<SupervisorRunReport> {\n const sources = await readRuntimeSupervisorRun(runDir)\n const report = analyzeSupervisorRunSources(sources)\n const md = renderSupervisorRunMarkdown(report)\n const dest = opts.reportDir ?? runDir\n const stem = opts.reportDir === undefined ? 'run-report' : supervisorReportStem(runDir)\n if (opts.reportDir !== undefined) await mkdir(opts.reportDir, { recursive: true }).catch(() => {})\n await writeFile(join(dest, `${stem}.json`), JSON.stringify(report, null, 1)).catch(() => {})\n await writeFile(join(dest, `${stem}.md`), md).catch(() => {})\n const headline = renderSupervisorRunHeadline(report)\n if (opts.appendHeadlineTo !== undefined) {\n await appendFile(opts.appendHeadlineTo, `${headline}\\n`).catch(() => {})\n }\n if (opts.echo !== false) console.log(headline)\n return report\n}\n\n/**\n * File stem for out-of-tree reports. Built from the run path's identifying\n * segments — candidate tag (the segment under `arm-runs/`), rep, instance, arm\n * — so two runs of the same instance from different candidates/reps never\n * overwrite each other.\n */\nfunction supervisorReportStem(runDir: string): string {\n const parts = runDir.split('/').filter(Boolean)\n const arm = parts[parts.length - 1] ?? 'cell'\n const iid = parts[parts.length - 2] ?? 'instance'\n const rep = parts.find((p) => /^rep-\\d+$/.test(p))\n const armRunsIdx = parts.indexOf('arm-runs')\n const tag = armRunsIdx >= 0 ? parts[armRunsIdx + 1] : undefined\n return [tag, rep, iid, arm]\n .filter((s): s is string => s !== undefined && s !== 'runs')\n .join('.')\n .replace(/[^A-Za-z0-9._-]/g, '_')\n}\n\n/**\n * Best-effort wrapper for a hot path: a reporting failure must never kill a run\n * that already produced real work. Returns null and logs the reason instead.\n */\nexport async function writeSupervisorRunReportSafe(\n runDir: string,\n opts: WriteSupervisorRunOptions = {},\n): Promise<SupervisorRunReport | null> {\n try {\n return await writeSupervisorRunReport(runDir, opts)\n } catch (err) {\n console.log(\n `RUN-REPORT failed for ${runDir}: ${err instanceof Error ? err.message : String(err)}`,\n )\n return null\n }\n}\n\n/**\n * Every Runtime supervisor run below `root`.\n *\n * When `root` itself is one run, return no children so callers can distinguish\n * a single report from a parent-directory rollup.\n */\nexport async function findSupervisorRunDirs(root: string): Promise<string[]> {\n if (await isRuntimeSupervisorRunDir(root)) {\n return []\n }\n const found: string[] = []\n const walk = async (dir: string, depth: number): Promise<void> => {\n if (depth > 8) return\n const entries = await readdir(dir, { withFileTypes: true }).catch(() => [])\n for (const e of entries) {\n if (!e.isDirectory()) continue\n if (e.name === 'node_modules' || e.name === '.git') continue\n const full = join(dir, e.name)\n if (await isRuntimeSupervisorRunDir(full)) {\n found.push(full)\n continue\n }\n await walk(full, depth + 1)\n }\n }\n await walk(root, 0)\n return found.sort()\n}\n","/**\n * `agent-eval supervisor-run report <runDir>` takes one run directory and\n * prints the report the module already renders. The command reads through\n * `analyzeSupervisorRun`, so a Runtime run directory takes the\n * same path and the status comes from the record `terminal-record.ts` names.\n *\n * Exit codes follow the other self-parsing subcommands: 2 for a usage error,\n * 1 when the directory cannot be read (missing, not a directory, or a corrupt\n * journal or terminal record), 0 after the report was written to stdout.\n */\n\nimport { stat } from 'node:fs/promises'\nimport { resolve } from 'node:path'\nimport { analyzeSupervisorRun } from './reader'\nimport { renderSupervisorRunHeadline, renderSupervisorRunMarkdown } from './render'\n\nexport type SupervisorRunReportFormat = 'headline' | 'markdown' | 'json'\n\nconst FORMATS: readonly SupervisorRunReportFormat[] = ['headline', 'markdown', 'json']\n\nexport const SUPERVISOR_RUN_USAGE =\n 'usage: agent-eval supervisor-run report <runDir> [--format headline|markdown|json]'\n\n/** Output sinks, injectable so tests read the exact bytes a terminal would. */\nexport interface SupervisorRunCommandIo {\n readonly stdout: (text: string) => void\n readonly stderr: (text: string) => void\n}\n\nconst PROCESS_IO: SupervisorRunCommandIo = {\n stdout: (text) => {\n process.stdout.write(text)\n },\n stderr: (text) => {\n process.stderr.write(text)\n },\n}\n\ninterface ReportArgs {\n readonly runDir: string\n readonly format: SupervisorRunReportFormat\n}\n\nfunction isFormat(value: string): value is SupervisorRunReportFormat {\n return (FORMATS as readonly string[]).includes(value)\n}\n\nfunction parseReportArgs(argv: readonly string[]): ReportArgs {\n let runDir: string | null = null\n let format: SupervisorRunReportFormat = 'headline'\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i] as string\n if (arg === '--format') {\n const raw = argv[++i]\n if (raw === undefined || !isFormat(raw)) {\n throw new Error(\n `--format expects one of ${FORMATS.join('|')}, got ${JSON.stringify(raw ?? '')}`,\n )\n }\n format = raw\n } else if (arg.startsWith('--format=')) {\n const raw = arg.slice('--format='.length)\n if (!isFormat(raw)) {\n throw new Error(`--format expects one of ${FORMATS.join('|')}, got ${JSON.stringify(raw)}`)\n }\n format = raw\n } else if (arg.startsWith('--')) {\n throw new Error(`unknown flag \"${arg}\"`)\n } else if (runDir === null) {\n runDir = arg\n } else {\n throw new Error(`unexpected argument \"${arg}\"`)\n }\n }\n if (runDir === null) throw new Error(SUPERVISOR_RUN_USAGE)\n return { runDir, format }\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\n/**\n * CLI driver for `agent-eval supervisor-run`. `argv` is everything after the\n * command name, so `['report', runDir, ...flags]`. Returns the process exit code.\n */\nexport async function runSupervisorRunCommand(\n argv: readonly string[],\n io: SupervisorRunCommandIo = PROCESS_IO,\n): Promise<number> {\n const [verb, ...rest] = argv\n if (verb === undefined || verb === '--help' || verb === '-h' || verb === 'help') {\n io.stdout(`${SUPERVISOR_RUN_USAGE}\\n`)\n return verb === undefined ? 2 : 0\n }\n if (verb !== 'report') {\n io.stderr(`unknown supervisor-run subcommand \"${verb}\"\\n${SUPERVISOR_RUN_USAGE}\\n`)\n return 2\n }\n if (rest.includes('--help') || rest.includes('-h')) {\n io.stdout(`${SUPERVISOR_RUN_USAGE}\\n`)\n return 0\n }\n\n let args: ReportArgs\n try {\n args = parseReportArgs(rest)\n } catch (error) {\n io.stderr(`${errorMessage(error)}\\n`)\n return 2\n }\n\n const runDir = resolve(args.runDir)\n // A path that is not a directory is a caller error, not a run with every\n // measurement missing: reporting an absent-shaped run for a typo would read\n // as evidence about a run that never existed.\n const entry = await stat(runDir).catch(() => null)\n if (entry === null || !entry.isDirectory()) {\n io.stderr(`[agent-eval] supervisor-run report: ${runDir} is not a directory\\n`)\n return 1\n }\n\n try {\n const report = await analyzeSupervisorRun(runDir)\n switch (args.format) {\n case 'headline':\n io.stdout(`${renderSupervisorRunHeadline(report)}\\n`)\n break\n case 'markdown':\n io.stdout(renderSupervisorRunMarkdown(report))\n break\n case 'json':\n io.stdout(`${JSON.stringify(report, null, 2)}\\n`)\n break\n }\n return 0\n } catch (error) {\n io.stderr(`[agent-eval] supervisor-run report failed for ${runDir}: ${errorMessage(error)}\\n`)\n return 1\n }\n}\n"],"mappings":"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"}
|
package/dist/systemone.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"systemone.d.ts","names":[],"sources":["../src/systemone-domain-match.ts","../src/systemone.ts"],"mappings":";;;;;;;YAYY;iBAEK;GACd,cAAc;EACf;EACA;;iBAGe;EACf;EACA;EACA;EACA;EACA;;iBAGe;EACf;EACA;EACA;EACA,YAAY;EACZ,UAAU;EACV,UAAU;EACV,YAAY;;KAGT;EACH;IACE;IACA;IACA;MAAY;MAAe;MAAkB;;;EAE/C;IACE;IACA;IACA,UAAU;;EAEZ;IACE;IACA;IACA,UAAU;;;iBAIG,qCAAqC;EACpD,SAAS,iBAAiB;;EAE1B;;YAGU;iBAUK;EACf;EACA;EACA;EACA;EACA;EACA,UAAU;EACV,QAAQ;EACR;IACE,OAAO;IACP,UAAU;IACV,QAAQ;;EAEV;IACE;IACA;IACA;;EAEF;;;wBAqHc,4BACd,OAAO,4BACN;;wBA+Ca,2BACd,UAAU,8BACV,eACC;;;YCzOS,oBAAoB,iBAAiB;iBAChC;EACf,UAAU;EACV,aAAa,iBAAiB;EAC9B,gBAAgB,iBAAiB;EACjC,UAAU;EACV,WAAW,sBAAsB;EACjC,oBAAoB,OAAO,UAAU;;EAErC,eAAe,mBAAmB;;;wBAIpB,mBAAmB,SAAS,mCA2BtB,UAAU,oBAAkB,SACrC,iBAAiB,IAAE,UAClB,sBACT,QAAQ,iBAAiB,gBAAgB;KAUzC,MAAM,GAAG,UAAU;EAAc,UAAU;EAAG,UAAU;;KACxD,eAAe,GAAG,UAAU,sBAAsB,MAAM,OAAO,MAAM,IAAI,QAAQ;iBACrE,yBAAyB;EACxC;EACA;EACA,WAAW;;iBAEI,sBACf,GACA,UAAU,WAAW,UACrB,UAAU,qBAAqB,4BACvB;EACR;EACA;EACA,WAAW,eAAe,MAAM,GAAG,IAAI;EACvC,cACE,OAAO,MAAM,GAAG,IAChB,SAAS,sBACN,iBAAiB,QAAQ;EAC9B,aAAa,YAAY,GAAG;EAC5B,UAAU;EACV,OAAO,OAAO,gBAAgB,IAAI,OAAO,MAAM,GAAG,OAAO,aAAa,QAAQ;EAC9E,UACE,QAAQ,iBAAiB,gBAAgB,KACzC,OAAO,MAAM,GAAG,cACN;EACZ,aAAa,UAAU;;;wBA0BT,yBACd,QAAQ,iBACR,UAAU,yBACT;;wBAgCa,eACd,GACA,UAAU,WAAW,UACrB,UAAU,qBAAqB,oBAC/B,cAAc,SAAS,sBAAsB,GAAG,GAAG,KAAK,YAAY,GAAG;iBAqDxD,wBAAwB,GAAG,UAAU,qBAAqB,4BACjE;EACR;EACA;EACA,WAAW,QAAQ;EACnB;EACA;EACA,WAAW,MAAM,OAAO,GAAG,SAAS,mBAAmB,IAAI,QAAQ;EACnE,cAAc,OAAO,GAAG,SAAS,mBAAmB,iBAAiB,QAAQ;EAC7E,WACE,OAAO,gBAAgB,IACvB,OAAO,GACP,SAAS,mBACN,mBAAmB,QAAQ;EAChC,UACE,QAAQ,iBAAiB,gBAAgB,KACzC,OAAO,GACP,SAAS,0BACC;;wBAGE,iBAAiB,GAAG,UAAU,qBAAqB,oBACjE,SAAS,wBAAwB,GAAG,KACnC,QAAQ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tool-groups-BKRrtqy4.d.ts","names":[],"sources":["../src/analyst/tool-groups.ts"],"mappings":";;;;KAmBY;;;;;;;;;;;;;;;;;;;;iBAyDI,wBACd,OAAO,oBACP,OAAO,qBACN"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tool-waste-BYt5rdt8.js","names":["prev"],"sources":["../src/statistics/agreement-irr.ts","../src/pipelines/budget-breach.ts","../src/pipelines/failure-cluster.ts","../src/pipelines/judge-agreement.ts","../src/tool-use-metrics.ts","../src/pipelines/tool-waste.ts"],"sourcesContent":["import { ValidationError } from '../errors'\nimport {\n type ContinuousAgreement,\n type ContinuousAgreementOptions,\n continuousAgreement,\n} from '../judge-calibration'\nimport type { JudgeScore } from '../types'\n\n/**\n * Inter-rater reliability — Krippendorff's α under the squared-difference\n * metric, pooled across dimensions.\n *\n * Each inner array is one judge's scores. Items are matched by position\n * WITHIN a dimension: the k-th score a judge supplies carrying dimension\n * `d` is item k of `d`, and the ratings compared against each other are\n * the ones different judges gave to the same item. Every judge that scores\n * a dimension at all must supply the same number of scores for it —\n * ragged input cannot be aligned into items and throws rather than\n * comparing mismatched items.\n *\n * α = 1 − D_observed / D_expected: D_observed averages the squared\n * difference over within-item judge pairs, D_expected over every pair of\n * ratings irrespective of item. α = 1 is perfect agreement, 0 is chance,\n * negative is systematic disagreement.\n */\nexport function interRaterReliability(judgeScores: JudgeScore[][]): number {\n if (judgeScores.length < 2) return 1\n\n // dimension → one score sequence per judge, in that judge's supplied order.\n const perDimension = new Map<string, number[][]>()\n for (let judgeIndex = 0; judgeIndex < judgeScores.length; judgeIndex++) {\n for (const s of judgeScores[judgeIndex]!) {\n let byJudge = perDimension.get(s.dimension)\n if (byJudge === undefined) {\n byJudge = Array.from({ length: judgeScores.length }, () => [] as number[])\n perDimension.set(s.dimension, byJudge)\n }\n byJudge[judgeIndex]!.push(s.score)\n }\n }\n\n const allValues: number[] = []\n const pairDiffs: number[] = []\n\n for (const [dimension, byJudge] of perDimension) {\n const scoring = byJudge.filter((scores) => scores.length > 0)\n if (scoring.length < 2) continue\n const itemCount = scoring[0]!.length\n if (scoring.some((scores) => scores.length !== itemCount)) {\n throw new ValidationError(\n `interRaterReliability: dimension '${dimension}' has judges supplying ` +\n `${scoring.map((scores) => scores.length).join('/')} scores — items cannot be aligned`,\n )\n }\n for (let item = 0; item < itemCount; item++) {\n const ratings = scoring.map((scores) => scores[item]!)\n for (const v of ratings) allValues.push(v)\n for (let i = 0; i < ratings.length; i++) {\n for (let j = i + 1; j < ratings.length; j++) {\n pairDiffs.push((ratings[i]! - ratings[j]!) ** 2)\n }\n }\n }\n }\n\n if (pairDiffs.length === 0 || allValues.length < 2) return 1\n\n const observedDisagreement = pairDiffs.reduce((a, b) => a + b, 0) / pairDiffs.length\n\n // Expected disagreement from all possible pairings of values\n let expectedDisagreement = 0\n let expectedCount = 0\n for (let i = 0; i < allValues.length; i++) {\n for (let j = i + 1; j < allValues.length; j++) {\n expectedDisagreement += (allValues[i]! - allValues[j]!) ** 2\n expectedCount++\n }\n }\n expectedDisagreement = expectedCount > 0 ? expectedDisagreement / expectedCount : 0\n\n if (expectedDisagreement === 0) return 1\n return 1 - observedDisagreement / expectedDisagreement\n}\n\n// ── Corpus-wide inter-rater agreement ──────────────────────────────\n//\n// `interRaterReliability(judgeScores)` computes a within-item\n// Krippendorff α — multiple judges score *the same item* and we ask\n// \"how much do their scores agree on that item?\" Useful for a single\n// scenario, but it cannot answer \"how reliable are these judges across\n// the whole evaluation corpus?\"\n//\n// `corpusInterRaterAgreement` does the corpus-wide question properly.\n// Inputs are flat per-(item, judge, dimension) score records. For each\n// dimension we pivot to a complete [n_items × n_judges] matrix and feed\n// it to the ICC(2,1) + κ_w machinery already validated in\n// `judge-calibration.ts`. An overall pooled metric averages the\n// per-dimension ICC/κ across dimensions.\n\nexport interface CorpusScoreRecord {\n /** Stable identifier for the rated item (scenario, span, turn, …). */\n itemId: string\n /** Identifier for the judge that produced this score. */\n judgeName: string\n /** Dimension name (matches `JudgeScore.dimension`). */\n dimension: string\n /** Numeric score; must be finite. */\n score: number\n}\n\nexport interface CorpusAgreementPerDimension extends ContinuousAgreement {\n dimension: string\n /** Item IDs that contributed to this dimension's matrix (every judge scored them). */\n itemIds: string[]\n /** Judge IDs that contributed to this dimension's matrix. */\n judgeIds: string[]\n}\n\nexport interface CorpusAgreementReport {\n /** Per-dimension ICC(2,1) + κ_w + Pearson + Spearman + bootstrap CIs. */\n perDimension: CorpusAgreementPerDimension[]\n /** Mean ICC across dimensions (NaN if no dimension yielded a finite ICC). */\n overallIcc: number\n /** Mean weighted κ across dimensions (NaN if none finite). */\n overallWeightedKappa: number\n /** Dimensions evaluated (sorted). */\n dimensions: string[]\n /** Judges seen across the corpus (sorted). */\n judgeIds: string[]\n}\n\nexport interface CorpusAgreementOptions extends ContinuousAgreementOptions {\n /**\n * Restrict the audit to these dimensions. Default = every dimension\n * that appears in the input. A dimension named here but absent from\n * the input throws — silent omission would corrupt the overall metric.\n */\n dimensions?: string[]\n /**\n * Restrict the audit to these judges. Default = every judge that\n * appears in the input. A judge named here but absent from a\n * dimension throws (see \"fail loud\" below).\n */\n judges?: string[]\n}\n\n/**\n * Corpus-wide inter-rater agreement across N items × M judges × D dimensions.\n *\n * For each dimension, builds the [n_items][n_judges] matrix of scores\n * (keeping only items every judge rated on that dimension), then runs\n * `continuousAgreement` to get ICC(2,1), κ_w, Pearson, Spearman, and\n * bootstrap CIs. Reports a pooled mean across dimensions as a single\n * \"is this judge panel reliable on this corpus?\" number.\n *\n * Fail-loud contract:\n * - Empty input throws.\n * - Fewer than 2 judges or fewer than 2 items per dimension throws.\n * - A judge present in some dimensions but with zero scored items on\n * another dimension throws (would silently shrink the matrix).\n * - Duplicate (itemId, judgeName, dimension) records throw.\n */\nexport function corpusInterRaterAgreement(\n records: CorpusScoreRecord[],\n opts: CorpusAgreementOptions = {},\n): CorpusAgreementReport {\n if (records.length === 0) {\n throw new ValidationError('corpusInterRaterAgreement: no score records supplied')\n }\n\n const judgesSeen = new Set<string>()\n const dimsSeen = new Set<string>()\n // dimension → judge → itemId → score\n const grid = new Map<string, Map<string, Map<string, number>>>()\n\n for (const r of records) {\n if (!Number.isFinite(r.score)) {\n throw new ValidationError(\n `corpusInterRaterAgreement: non-finite score for (item=${r.itemId}, judge=${r.judgeName}, dim=${r.dimension})`,\n )\n }\n judgesSeen.add(r.judgeName)\n dimsSeen.add(r.dimension)\n const byJudge = grid.get(r.dimension) ?? new Map<string, Map<string, number>>()\n const byItem = byJudge.get(r.judgeName) ?? new Map<string, number>()\n if (byItem.has(r.itemId)) {\n throw new ValidationError(\n `corpusInterRaterAgreement: duplicate record for (item=${r.itemId}, judge=${r.judgeName}, dim=${r.dimension})`,\n )\n }\n byItem.set(r.itemId, r.score)\n byJudge.set(r.judgeName, byItem)\n grid.set(r.dimension, byJudge)\n }\n\n const targetDims = opts.dimensions ?? [...dimsSeen].sort()\n for (const d of targetDims) {\n if (!dimsSeen.has(d)) {\n throw new ValidationError(\n `corpusInterRaterAgreement: dimension '${d}' was requested but no records carry it`,\n )\n }\n }\n const targetJudges = opts.judges ? [...opts.judges] : [...judgesSeen].sort()\n for (const j of targetJudges) {\n if (!judgesSeen.has(j)) {\n throw new ValidationError(\n `corpusInterRaterAgreement: judge '${j}' was requested but produced no records`,\n )\n }\n }\n if (targetJudges.length < 2) {\n throw new ValidationError(\n `corpusInterRaterAgreement: need ≥2 judges, got ${targetJudges.length}`,\n )\n }\n\n const perDimension: CorpusAgreementPerDimension[] = []\n const iccs: number[] = []\n const kappas: number[] = []\n\n for (const dim of targetDims) {\n const byJudge = grid.get(dim)!\n // Fail loud: every requested judge must have scored ≥1 item on this dim.\n const judgeItemCounts: Record<string, number> = {}\n for (const j of targetJudges) {\n const m = byJudge.get(j)\n judgeItemCounts[j] = m?.size ?? 0\n }\n const emptyJudges = targetJudges.filter((j) => judgeItemCounts[j] === 0)\n if (emptyJudges.length > 0) {\n throw new ValidationError(\n `corpusInterRaterAgreement: dimension '${dim}' has no scores from judge(s) ${emptyJudges.join(', ')} (counts: ${JSON.stringify(judgeItemCounts)})`,\n )\n }\n\n // Items rated by *every* requested judge on this dim.\n let commonItems: Set<string> | null = null\n for (const j of targetJudges) {\n const ids = new Set(byJudge.get(j)!.keys())\n if (commonItems === null) {\n commonItems = ids\n } else {\n const prev: Set<string> = commonItems\n commonItems = new Set([...prev].filter((x) => ids.has(x)))\n }\n }\n const sortedItems = [...(commonItems ?? new Set<string>())].sort()\n if (sortedItems.length < 2) {\n throw new ValidationError(\n `corpusInterRaterAgreement: dimension '${dim}' has ${sortedItems.length} item(s) rated by all ${targetJudges.length} judges (need ≥2)`,\n )\n }\n\n const matrix: number[][] = sortedItems.map((itemId) =>\n targetJudges.map((j) => byJudge.get(j)!.get(itemId)!),\n )\n const agreement = continuousAgreement(matrix, opts)\n perDimension.push({\n ...agreement,\n dimension: dim,\n itemIds: sortedItems,\n judgeIds: [...targetJudges],\n })\n if (Number.isFinite(agreement.icc)) iccs.push(agreement.icc)\n if (Number.isFinite(agreement.weightedKappa)) kappas.push(agreement.weightedKappa)\n }\n\n const mean = (xs: number[]) =>\n xs.length === 0 ? Number.NaN : xs.reduce((a, b) => a + b, 0) / xs.length\n return {\n perDimension,\n overallIcc: mean(iccs),\n overallWeightedKappa: mean(kappas),\n dimensions: targetDims,\n judgeIds: targetJudges,\n }\n}\n\n/**\n * Convenience adapter for `JudgeScore[]` data keyed externally by item.\n *\n * Use when you have per-item arrays of `JudgeScore[]` (e.g. one\n * `ScenarioResult.judgeScores` per scenario) and want corpus-wide\n * agreement without manually flattening. `itemId` must be unique per\n * row of `itemsScores`.\n */\nexport function corpusInterRaterAgreementFromJudgeScores(\n itemsScores: Array<{ itemId: string; scores: JudgeScore[] }>,\n opts: CorpusAgreementOptions = {},\n): CorpusAgreementReport {\n const records: CorpusScoreRecord[] = []\n const seen = new Set<string>()\n for (const { itemId, scores } of itemsScores) {\n if (seen.has(itemId)) {\n throw new ValidationError(\n `corpusInterRaterAgreementFromJudgeScores: duplicate itemId '${itemId}'`,\n )\n }\n seen.add(itemId)\n for (const s of scores) {\n records.push({\n itemId,\n judgeName: s.judgeName,\n dimension: s.dimension,\n score: s.score,\n })\n }\n }\n return corpusInterRaterAgreement(records, opts)\n}\n","/**\n * BudgetBreachView — aggregates breach events across the corpus.\n *\n * Answers: which dimensions get hit most often? Which scenarios are\n * underbudgeted? Which variants trigger the most breaches?\n */\n\nimport type { BudgetSpec } from '../trace/schema'\nimport type { TraceStore } from '../trace/store'\n\nexport interface BudgetBreachFinding {\n runId: string\n scenarioId: string\n variantId?: string\n dimension: keyof BudgetSpec\n limit: number\n consumed: number\n excessRatio: number\n timestamp: number\n}\n\nexport interface BudgetBreachReport {\n findings: BudgetBreachFinding[]\n byDimension: Record<string, number>\n byScenario: Record<string, number>\n byVariant: Record<string, number>\n totalRuns: number\n breachedRunRatio: number\n}\n\nexport async function budgetBreachView(\n store: TraceStore,\n options: { scenarioId?: string; variantId?: string } = {},\n): Promise<BudgetBreachReport> {\n const runs = await store.listRuns({\n scenarioId: options.scenarioId,\n variantId: options.variantId,\n })\n const findings: BudgetBreachFinding[] = []\n const byDimension: Record<string, number> = {}\n const byScenario: Record<string, number> = {}\n const byVariant: Record<string, number> = {}\n\n for (const run of runs) {\n const entries = await store.budget(run.runId)\n for (const e of entries) {\n if (!e.breached) continue\n const excessRatio = e.limit > 0 ? e.consumed / e.limit : Infinity\n findings.push({\n runId: run.runId,\n scenarioId: run.scenarioId,\n variantId: run.variantId,\n dimension: e.dimension,\n limit: e.limit,\n consumed: e.consumed,\n excessRatio,\n timestamp: e.timestamp,\n })\n byDimension[e.dimension] = (byDimension[e.dimension] ?? 0) + 1\n byScenario[run.scenarioId] = (byScenario[run.scenarioId] ?? 0) + 1\n if (run.variantId) byVariant[run.variantId] = (byVariant[run.variantId] ?? 0) + 1\n }\n }\n\n const breachedRuns = new Set(findings.map((f) => f.runId))\n return {\n findings,\n byDimension,\n byScenario,\n byVariant,\n totalRuns: runs.length,\n breachedRunRatio: runs.length > 0 ? breachedRuns.size / runs.length : 0,\n }\n}\n","/**\n * FailureClusterView — groups failed runs by (failureClass, triggerTool,\n * argHash-prefix) so weekly reviews can prioritize the top-N clusters.\n *\n * Each cluster includes: N runs, scenarios affected, representative\n * error message, a proposed mitigation hint (rule → action table).\n */\n\nimport { classifyFailure, DEFAULT_RULES, type FailureRule } from '../failure-taxonomy'\nimport { argHash, hasCapturedToolArgs, toolSpans } from '../trace/query'\nimport type { FailureClass, Span } from '../trace/schema'\nimport type { TraceStore } from '../trace/store'\n\nexport interface FailureCluster {\n failureClass: FailureClass\n /** Tool name when the trigger was a tool span, else undefined. */\n toolName?: string\n /** First 16 chars of argHash — clusters similar args. */\n argPrefix?: string\n /**\n * Source dimension when the trigger was a judge span (e.g. `'format'`,\n * `'safety'`, `'correctness'`). Lets cross-template aggregators\n * group failures by the dimension that fired without overloading\n * `argPrefix`. Optional — clusters without this field deserialize cleanly.\n */\n dimension?: string\n runCount: number\n scenarioIds: string[]\n exampleError?: string\n exampleRunId: string\n}\n\nexport interface FailureClusterReport {\n clusters: FailureCluster[]\n totalFailures: number\n totalRuns: number\n}\n\nexport async function failureClusterView(\n store: TraceStore,\n options: { rules?: FailureRule[]; minClusterSize?: number } = {},\n): Promise<FailureClusterReport> {\n const rules = options.rules ?? DEFAULT_RULES\n const minSize = options.minClusterSize ?? 1\n const runs = await store.listRuns()\n\n type Key = string\n const clusters = new Map<Key, FailureCluster>()\n let totalFailures = 0\n\n for (const run of runs) {\n if (run.status === 'completed' && run.outcome?.pass !== false) continue\n totalFailures++\n const spans = await store.spans({ runId: run.runId })\n const events = await store.events({ runId: run.runId })\n const cls = classifyFailure({ run, spans, events }, rules)\n\n let toolName: string | undefined\n let argPrefix: string | undefined\n let dimension: string | undefined\n if (cls.triggerSpanId) {\n const trig = spans.find((s) => s.spanId === cls.triggerSpanId)\n if (trig?.kind === 'tool') {\n toolName = trig.toolName\n if (hasCapturedToolArgs(trig)) argPrefix = argHash(trig.args).slice(0, 16)\n } else if (trig?.kind === 'judge') {\n dimension = trig.dimension\n }\n }\n // Fallback: look at the last errored tool span\n if (!toolName) {\n const ts = await toolSpans(store, run.runId)\n const errored = ts.filter((t) => t.status === 'error').pop()\n if (errored) {\n toolName = errored.toolName\n if (hasCapturedToolArgs(errored)) argPrefix = argHash(errored.args).slice(0, 16)\n }\n }\n // Secondary signal: any judge span on the failed run carries a\n // dimension. Useful when the rule classified by judge score but\n // didn't surface the trigger span (or surfaced a non-judge span).\n if (!dimension) {\n const judge = spans.find((s) => s.kind === 'judge' && typeof s.dimension === 'string')\n if (judge?.kind === 'judge') dimension = judge.dimension\n }\n\n const key = `${cls.failureClass}|${toolName ?? ''}|${argPrefix ?? ''}|${dimension ?? ''}`\n let cluster = clusters.get(key)\n if (!cluster) {\n cluster = {\n failureClass: cls.failureClass,\n toolName,\n argPrefix,\n dimension,\n runCount: 0,\n scenarioIds: [],\n exampleRunId: run.runId,\n exampleError: firstErrorMessage(spans) ?? cls.reason,\n }\n clusters.set(key, cluster)\n }\n cluster.runCount++\n if (!cluster.scenarioIds.includes(run.scenarioId)) cluster.scenarioIds.push(run.scenarioId)\n }\n\n const arr = [...clusters.values()]\n .filter((c) => c.runCount >= minSize)\n .sort((a, b) => b.runCount - a.runCount)\n\n return { clusters: arr, totalFailures, totalRuns: runs.length }\n}\n\nfunction firstErrorMessage(spans: Span[]): string | undefined {\n const errored = spans.find((s) => s.status === 'error')\n return errored?.error\n}\n","/**\n * JudgeAgreementView — pairwise agreement between judges across the\n * corpus, grouped by dimension.\n *\n * Output drives two workflows:\n * - Judge robustness audit: \"does Claude agree with GPT at κ ≥ 0.6?\"\n * - Calibration tracking: κ vs golden human labels over time (by\n * providing a `humanGoldenJudgeId`).\n */\n\nimport { interRaterReliability, pearsonR } from '../statistics'\nimport type { JudgeSpan } from '../trace/schema'\nimport type { TraceStore } from '../trace/store'\n\nexport interface JudgePair {\n judgeA: string\n judgeB: string\n dimension: string\n /** Number of (targetSpanId, dimension) tuples both judges scored. */\n commonItems: number\n pearson: number\n krippendorff: number\n}\n\nexport interface JudgeAgreementReport {\n pairs: JudgePair[]\n dimensions: string[]\n judgeIds: string[]\n}\n\nexport async function judgeAgreementView(store: TraceStore): Promise<JudgeAgreementReport> {\n const all = (await store.spans({ kind: 'judge' })).filter(\n (s): s is JudgeSpan => s.kind === 'judge',\n )\n if (all.length === 0) return { pairs: [], dimensions: [], judgeIds: [] }\n\n const byDimension = new Map<string, JudgeSpan[]>()\n for (const s of all) {\n const arr = byDimension.get(s.dimension) ?? []\n arr.push(s)\n byDimension.set(s.dimension, arr)\n }\n\n const judgeIds = [...new Set(all.map((s) => s.judgeId))].sort()\n const pairs: JudgePair[] = []\n for (const [dim, spans] of byDimension) {\n const byJudge = new Map<string, Map<string, number>>()\n for (const s of spans) {\n const m = byJudge.get(s.judgeId) ?? new Map<string, number>()\n m.set(s.targetSpanId, s.score)\n byJudge.set(s.judgeId, m)\n }\n const judgesHere = [...byJudge.keys()]\n for (let i = 0; i < judgesHere.length; i++) {\n for (let j = i + 1; j < judgesHere.length; j++) {\n const judgeI = judgesHere[i]!\n const judgeJ = judgesHere[j]!\n const a = byJudge.get(judgeI)!\n const b = byJudge.get(judgeJ)!\n const common: Array<[number, number]> = []\n for (const [target, scoreA] of a) {\n const scoreB = b.get(target)\n if (scoreB !== undefined) common.push([scoreA, scoreB])\n }\n if (common.length < 2) continue\n const judgeScores = common.map(\n ([scoreA, scoreB]) =>\n [\n { judgeName: judgeI, dimension: dim, score: scoreA, reasoning: '' },\n { judgeName: judgeJ, dimension: dim, score: scoreB, reasoning: '' },\n ] as const,\n )\n const k = interRaterReliability(\n judgeScores[0]!.map((_, k2) => judgeScores.map((pair) => pair[k2]!)),\n )\n pairs.push({\n judgeA: judgeI,\n judgeB: judgeJ,\n dimension: dim,\n commonItems: common.length,\n pearson: pearsonR(\n common.map((c) => c[0]),\n common.map((c) => c[1]),\n ),\n krippendorff: k,\n })\n }\n }\n }\n\n return {\n pairs: pairs.sort((a, b) => b.commonItems - a.commonItems),\n dimensions: [...byDimension.keys()].sort(),\n judgeIds,\n }\n}\n","/**\n * Tool-use metrics — derived purely from trace data.\n *\n * No scoring assumptions: consumers supply optional ground-truth tool\n * selections per turn + optional \"information used downstream\" signals.\n * Without those, we still compute descriptive metrics (error rate,\n * retry rate, duplicate-call rate) that are useful on their own.\n */\n\nimport { argHash, groupBy, hasCapturedToolArgs, toolSpans } from './trace/query'\nimport type { Span } from './trace/schema'\nimport type { TraceStore } from './trace/store'\n\nexport interface ToolUseMetrics {\n runId: string\n totalCalls: number\n /** Calls whose arguments were captured and can be compared for duplication. */\n callsWithCapturedArgs: number\n byTool: Record<string, ToolStats>\n errorRate: number\n /** Ratio of captured-argument calls already seen with the same tool name and arguments. */\n duplicateRate: number\n /** Ratio of error calls followed by ≥1 retry on same tool. */\n retryRate: number\n /** Optional: of the calls agent made, fraction the evaluator marked as \"correct selection\". */\n selectionAccuracy?: number\n}\n\nexport interface ToolStats {\n calls: number\n callsWithCapturedArgs: number\n errors: number\n avgLatencyMs: number\n duplicates: number\n}\n\nexport interface ToolUseOptions {\n /** Map of spanId → whether the evaluator judged the tool selection correct. Optional. */\n selectionLabels?: Record<string, boolean>\n}\n\nexport async function computeToolUseMetrics(\n store: TraceStore,\n runId: string,\n options: ToolUseOptions = {},\n): Promise<ToolUseMetrics> {\n const tools = await toolSpans(store, runId)\n if (tools.length === 0) {\n return {\n runId,\n totalCalls: 0,\n callsWithCapturedArgs: 0,\n byTool: {},\n errorRate: 0,\n duplicateRate: 0,\n retryRate: 0,\n }\n }\n\n const byTool: Record<string, ToolStats> = {}\n let totalErrors = 0\n let totalDuplicates = 0\n let callsWithCapturedArgs = 0\n const sortedTools = [...tools].sort((a, b) => a.startedAt - b.startedAt)\n const seenSignatures = new Set<string>()\n\n // duplicate detection + per-tool aggregation\n for (const t of sortedTools) {\n byTool[t.toolName] ??= {\n calls: 0,\n callsWithCapturedArgs: 0,\n errors: 0,\n avgLatencyMs: 0,\n duplicates: 0,\n }\n const stat = byTool[t.toolName]!\n stat.calls += 1\n if (t.status === 'error') {\n stat.errors += 1\n totalErrors += 1\n }\n if (typeof t.latencyMs === 'number') stat.avgLatencyMs += t.latencyMs\n if (hasCapturedToolArgs(t)) {\n callsWithCapturedArgs += 1\n stat.callsWithCapturedArgs += 1\n const sig = `${t.toolName}|${argHash(t.args)}`\n if (seenSignatures.has(sig)) {\n stat.duplicates += 1\n totalDuplicates += 1\n }\n seenSignatures.add(sig)\n }\n }\n\n for (const stat of Object.values(byTool)) {\n stat.avgLatencyMs = stat.calls > 0 ? stat.avgLatencyMs / stat.calls : 0\n }\n\n // retry detection: per-tool chronological adjacency where error → next same-tool call\n let retryOpportunities = 0\n let retriesFollowed = 0\n for (const [, arr] of groupBy(sortedTools, (t) => t.toolName)) {\n for (let i = 0; i < arr.length; i++) {\n if (arr[i]!.status !== 'error') continue\n retryOpportunities += 1\n if (arr[i + 1]) retriesFollowed += 1\n }\n }\n const retryRate = retryOpportunities > 0 ? retriesFollowed / retryOpportunities : 0\n\n let selectionAccuracy: number | undefined\n if (options.selectionLabels) {\n const labeled = sortedTools.filter((t) => t.spanId in options.selectionLabels!)\n if (labeled.length > 0) {\n selectionAccuracy =\n labeled.filter((t) => options.selectionLabels![t.spanId]).length / labeled.length\n }\n }\n\n return {\n runId,\n totalCalls: sortedTools.length,\n callsWithCapturedArgs,\n byTool,\n errorRate: totalErrors / sortedTools.length,\n duplicateRate: callsWithCapturedArgs > 0 ? totalDuplicates / callsWithCapturedArgs : 0,\n retryRate,\n selectionAccuracy,\n }\n}\n\nexport type { Span }\n","/**\n * ToolWasteView — fraction of tool calls whose results weren't used\n * downstream. Without a \"used\" signal we fall back to structural\n * proxies: error calls, duplicate calls, and tool calls followed by\n * zero subsequent LLM spans are all considered waste.\n *\n * Consumers can pass a `usageOracle` that inspects a tool span and\n * returns true iff the tool's result appears in a later LLM message,\n * artifact, or state mutation — that's the canonical definition; the\n * default heuristic is a reasonable fallback.\n */\n\nimport { computeToolUseMetrics } from '../tool-use-metrics'\nimport { llmSpans, toolSpans } from '../trace/query'\nimport type { LlmSpan, ToolSpan } from '../trace/schema'\nimport type { TraceStore } from '../trace/store'\n\nexport interface ToolWasteFinding {\n runId: string\n wastedCalls: number\n totalCalls: number\n wasteRate: number\n}\n\nexport interface ToolWasteReport {\n byRun: ToolWasteFinding[]\n overallWasteRate: number\n}\n\nexport interface ToolWasteOptions {\n runId?: string\n usageOracle?: (tool: ToolSpan, later: { llm: Awaited<ReturnType<typeof llmSpans>> }) => boolean\n}\n\nexport async function toolWasteView(\n store: TraceStore,\n options: ToolWasteOptions = {},\n): Promise<ToolWasteReport> {\n const runs = options.runId ? [options.runId] : (await store.listRuns()).map((r) => r.runId)\n\n const byRun: ToolWasteFinding[] = []\n let totalCalls = 0\n let totalWasted = 0\n for (const runId of runs) {\n const tools = await toolSpans(store, runId)\n if (tools.length === 0) {\n byRun.push({ runId, wastedCalls: 0, totalCalls: 0, wasteRate: 0 })\n continue\n }\n const llms = await llmSpans(store, runId)\n // Sort LLM spans once by start time, then build a suffix index of the\n // concatenated message text. `suffixText[i]` is the haystack of every\n // string message content in spans[i..]. Per tool we binary-search the\n // first span started strictly after the tool, then test that one suffix\n // — turning the per-tool O(llms × messages × content) scan into a single\n // O(log llms) lookup over precomputed text.\n const sortedLlm = [...llms].sort((a, b) => a.startedAt - b.startedAt)\n const startTimes = sortedLlm.map((l) => l.startedAt)\n const suffixText = buildSuffixText(sortedLlm)\n let wasted = 0\n for (const t of tools) {\n if (t.status === 'error') {\n wasted++\n continue\n }\n // First LLM span started strictly after this tool (upper-bound search).\n const cutoff = upperBound(startTimes, t.startedAt)\n if (options.usageOracle) {\n if (!options.usageOracle(t, { llm: sortedLlm.slice(cutoff) })) wasted++\n } else {\n // Default heuristic: a tool whose result is NOT mentioned in any\n // later LLM input message is likely wasted. An empty/null result has\n // no payload to propagate downstream — there is nothing to find in a\n // later message, so it is not evidence of waste; skip it.\n const resultStr = stringify(t.result)\n if (resultStr === '') continue\n const haystack = suffixText[cutoff] ?? ''\n const used = haystack.includes(resultStr.slice(0, 120))\n if (!used) wasted++\n }\n }\n const wasteRate = wasted / tools.length\n byRun.push({ runId, wastedCalls: wasted, totalCalls: tools.length, wasteRate })\n totalCalls += tools.length\n totalWasted += wasted\n }\n return { byRun, overallWasteRate: totalCalls > 0 ? totalWasted / totalCalls : 0 }\n}\n\n/**\n * Build per-position suffix haystacks: result[i] is the concatenation of every\n * string message content in spans[i..end]. Built back-to-front so each entry\n * reuses the next one — O(total message text) rather than O(spans²).\n */\nfunction buildSuffixText(spans: LlmSpan[]): string[] {\n const result = new Array<string>(spans.length + 1)\n result[spans.length] = ''\n for (let i = spans.length - 1; i >= 0; i--) {\n const own = spans[i]!.messages.map((m) =>\n typeof m.content === 'string' ? m.content : '',\n ).join('\\n')\n result[i] = `${own}\\n${result[i + 1]}`\n }\n return result\n}\n\n/** Index of the first element strictly greater than `target` in a sorted array. */\nfunction upperBound(sorted: number[], target: number): number {\n let lo = 0\n let hi = sorted.length\n while (lo < hi) {\n const mid = (lo + hi) >>> 1\n if (sorted[mid]! <= target) lo = mid + 1\n else hi = mid\n }\n return lo\n}\n\nfunction stringify(v: unknown): string {\n if (v === null || v === undefined) return ''\n if (typeof v === 'string') return v\n try {\n return JSON.stringify(v)\n } catch {\n return String(v)\n }\n}\n\n// Re-export for convenience in consumers that want both descriptive and usage metrics.\nexport { computeToolUseMetrics }\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types-CW5b90JH.js","names":[],"sources":["../src/analyst/types.ts"],"sourcesContent":["/**\n * Analyst contract — the missing orchestration layer over agent-eval's\n * existing analyzers (analyzeTraces, MultiLayerVerifier,\n * SemanticConceptJudge, JudgeFn, ...).\n *\n * Each existing primitive returns its own output shape. The Analyst\n * contract is the single envelope every primitive lifts into, so a\n * registry can run N analysts against a run and a single renderer can\n * compose findings without knowing which analyzer produced them.\n *\n * The contract is intentionally domain-agnostic: nothing here knows\n * about code, voice, RAG, or any particular agent stack. Analysts\n * declare what INPUT KIND they need (a trace store, an artifact dir,\n * a RunRecord, a JudgeInput, or `custom`), and the registry routes\n * the matching input from `AnalystRunInputs`.\n */\n\nimport { createHash } from 'node:crypto'\nimport type { CostLedgerHandle, CostProvenance } from '../cost-ledger'\nimport type { RunRecord, RunTokenUsage } from '../run-record'\nimport type { TraceAnalysisStore } from '../trace-analyst/store'\nimport type { JudgeInput } from '../types'\nimport type { ChatClient } from './chat-client'\n\n/**\n * Unified envelope every analyst emits. Schema-versioned so renderers\n * and time-series diffs survive future field additions.\n */\nexport interface AnalystFinding {\n schema_version: '1.0.0'\n /**\n * Stable hash over identity-defining fields (analyst_id + canonical\n * claim + area + optional subject). Two findings from two runs that\n * \"are the same finding\" share this id — that's what `diffFindings`\n * uses to compute appeared/disappeared sets across runs.\n */\n finding_id: string\n analyst_id: string\n produced_at: string\n severity: AnalystSeverity\n /**\n * Coarse classification. Renderers group by this. Free-form so\n * domain-specific analysts can introduce categories without a\n * schema change ('agent-reasoning', 'verification', 'cost',\n * 'tool-use', 'safety', 'latency', 'data-quality', ...).\n */\n area: string\n claim: string\n rationale?: string\n evidence_refs: EvidenceRef[]\n recommended_action?: string\n validation_plan?: string\n /** 0..1 — the analyst's own confidence. Not calibrated across analysts. */\n confidence: number\n /**\n * Optional subject the finding is about — leaf id, agent id, request\n * id. Included in finding_id when present so per-subject findings\n * diff cleanly across runs.\n */\n subject?: string\n /** True when this finding was lifted from a judge result rather than observed\n * directly in a trace or artifact. Descriptive only: proposal access is\n * controlled by `ProposalFinding.proposal_origin`. */\n derived_from_judge?: boolean\n /** Analyst-private extras; renderers ignore unless they know the analyst. */\n metadata?: Record<string, unknown>\n}\n\n/** Finding severity. `AnalystSeverity` derives from this array, so the type\n * and the schema that validates a finding cannot name different levels. */\nexport const ANALYST_SEVERITIES = ['critical', 'high', 'medium', 'low', 'info'] as const\n\nexport type AnalystSeverity = (typeof ANALYST_SEVERITIES)[number]\n\n/** Data sources that candidate generation may intentionally learn from. */\nexport type ProposalFindingOrigin = 'search' | 'production'\n\n/** A finding explicitly admitted as candidate-generation input. */\nexport type ProposalFinding = AnalystFinding & {\n readonly proposal_origin: ProposalFindingOrigin\n}\n\nexport interface EvidenceRef {\n /**\n * Where the evidence lives. `span` and `event` refer to OTLP trace\n * elements; `artifact` to a file inside the run's artifact tree;\n * `finding` to another AnalystFinding (cross-analyst chaining);\n * `metric` to a named scalar reading the renderer knows how to read.\n */\n kind: 'span' | 'event' | 'artifact' | 'finding' | 'metric'\n uri: string\n excerpt?: string\n}\n\n// ── Analyst contract ─────────────────────────────────────────────────\n\n/**\n * The discriminator the registry uses to pass the right input.\n * `custom` is the escape hatch — analysts that need something else\n * (e.g. an embedding cache, a partner SDK handle) read it from\n * `AnalystRunInputs.custom[<analyst id>]`.\n */\nexport type AnalystInputKind =\n | 'trace-store'\n | 'artifact-dir'\n | 'run-record'\n | 'judge-input'\n | 'custom'\n\nexport interface AnalystCost {\n /** `deterministic` analysts MUST NOT call the LLM. */\n kind: 'deterministic' | 'llm'\n /** Optional declared upper bound; the registry can enforce a budget. */\n est_usd_per_run?: number\n /** Models the analyst expects to use (informational). */\n models?: string[]\n /** Maximum post-cancellation wait for provider usage. Model analysts default to 5 seconds. */\n settlement_timeout_ms?: number\n}\n\nexport interface AnalystRequirements {\n /** Min number of shots / samples the analyst needs to produce signal. */\n min_shots?: number\n /** Capabilities the runtime must supply (e.g. ['network', 'gpu']). */\n capabilities?: string[]\n}\n\n/**\n * What's passed to every analyst call. The registry resolves which\n * field the analyst's `inputKind` selects and asserts it's present.\n */\nexport interface AnalystRunInputs {\n traceStore?: TraceAnalysisStore\n artifactDir?: string\n runRecord?: RunRecord\n judgeInput?: JudgeInput\n /** Keyed by analyst id; populated by callers that registered custom analysts. */\n custom?: Record<string, unknown>\n}\n\nexport interface AnalystContext {\n runId: string\n /** Stable correlation id so logs from a single registry.run() share a tag. */\n correlationId: string\n /** Enforced wall-clock deadline (epoch ms). */\n deadlineMs?: number\n /** Per-analyst USD budget. Analysts MAY check before issuing LLM calls. */\n budgetUsd?: number\n /** Shared paid-call account when the analyst runs inside a larger campaign. */\n costLedger?: CostLedgerHandle\n /** Attribution phase used when writing to the shared paid-call account. */\n costPhase?: string\n /**\n * Shared chat client. Analysts that call an LLM go through this so\n * the operator picks transport (sandbox-sdk | router | cli-bridge |\n * direct-provider | mock) at the registry boundary without touching\n * analyst code.\n */\n chat?: ChatClient\n /**\n * Findings from a prior run the operator wants the analyst to see as\n * retrieval context. Kinds that take advantage of cross-run memory\n * (failure-mode \"I saw this cluster last run\", knowledge-gap \"the wiki\n * page I asked for is still missing\") render these into the actor's\n * working set. Filtering is the operator's job: pass the slice that\n * matches the analyst's id, or pass everything and let the kind\n * filter. Empty / absent means no cross-run context.\n */\n priorFindings?: ReadonlyArray<AnalystFinding>\n /**\n * Findings emitted by analysts that completed earlier in this registry run.\n * This is separate from `priorFindings`: upstream findings are dependency\n * context for the current pass, while prior findings are cross-run memory.\n * The registry populates this only when `RegistryRunOpts.chainFindings` is on.\n */\n upstreamFindings?: ReadonlyArray<AnalystFinding>\n /**\n * Report metered work independently of findings. This keeps an empty finding\n * set from erasing token/cost telemetry. Multiple receipts are accumulated.\n */\n recordUsage?: (receipt: AnalystUsageReceipt) => void\n /** Free-form runtime tags (env, host, op). Findings can echo these into metadata. */\n tags?: Record<string, string>\n /** Logger callback — analysts SHOULD prefer this over console.* for testability. */\n log?: (msg: string, fields?: Record<string, unknown>) => void\n /** Optional abort signal. Analysts SHOULD pass it through to LLM calls. */\n signal?: AbortSignal\n /**\n * Optional live-execution port. A runtime that owns a sandbox or checkout\n * fills it so an analyst can execute a bounded probe against the run's\n * produced state instead of reasoning about it from the trace alone. This\n * package defines only the port: no field here reaches for an agent loop,\n * and an absent probe means the analyst works from recorded evidence.\n */\n probe?: ExecutionProbe\n}\n\n// ── Live-execution port ─────────────────────────────────────────────\n\n/** One bounded command an analyst asks the probe to run. */\nexport interface ExecutionProbeRequest {\n command: string\n /** Working directory inside the probed environment. */\n cwd?: string\n /** Hard wall-clock deadline for this one execution. */\n timeoutMs: number\n /** Bytes of combined output retained; the prober truncates beyond it. */\n maxOutputBytes?: number\n signal?: AbortSignal\n}\n\n/**\n * Typed outcome of one probe execution. `succeeded: false` is a PROBE failure\n * (the environment could not run the command); a command that ran and exited\n * non-zero is a successful observation with a non-zero `exitCode`.\n */\nexport type ExecutionProbeOutcome =\n | {\n succeeded: true\n exitCode: number\n stdout: string\n stderr: string\n durationMs: number\n /** True when output was cut at `maxOutputBytes`. */\n truncated: boolean\n }\n | { succeeded: false; error: { class: string; message: string } }\n\n/**\n * The seam a runtime fills to let analysts observe produced state live.\n * Implementations own sandboxing, credentials, and cleanup; analysts only\n * submit bounded requests and read typed outcomes.\n */\nexport interface ExecutionProbe {\n /** One plain sentence naming what is being probed (e.g. a sandbox id). */\n readonly description: string\n execute(request: ExecutionProbeRequest): Promise<ExecutionProbeOutcome>\n}\n\n/**\n * The minimal contract. Concrete analysts can refine `TInput` so\n * implementations stay type-safe (e.g. a trace analyst's `TInput` is\n * `TraceAnalysisStore`); the registry passes the right field from\n * `AnalystRunInputs` based on `inputKind`.\n */\nexport interface Analyst<TInput = unknown> {\n /** Stable identifier — appears in finding_id, telemetry, and registry exclusion lists. */\n readonly id: string\n /** Human-readable. One sentence. */\n readonly description: string\n readonly inputKind: AnalystInputKind\n readonly cost: AnalystCost\n readonly requires?: AnalystRequirements\n /** Bump on breaking changes to claim wording or area so old finding_ids don't collide. */\n readonly version: string\n analyze(input: TInput, ctx: AnalystContext): Promise<AnalystFinding[]>\n}\n\n/** Metered work performed by one analyst call. */\nexport interface AnalystUsageReceipt {\n /** Number of model-usage records observed at the provider boundary. */\n calls: number | null\n /** Null when the provider did not return token accounting. */\n tokens: RunTokenUsage | null\n /** Observed, estimated, or explicitly uncaptured dollar cost. */\n cost: CostProvenance\n /** Known lower bound when one or more calls have uncaptured cost. */\n knownCostUsd?: number\n /**\n * Token counts the provider reported on only one side. Present exactly when\n * `tokens` is null and at least one side WAS reported: `RunTokenUsage` has no\n * nullable side, so a one-sided count cannot live in `tokens` without writing\n * a zero nobody measured. Read it as a lower bound, never as a total — the\n * field exists so a null `tokens` cannot hide a real count.\n */\n partialTokens?: { input: number | null; output: number | null }\n /**\n * True when the token counts were DERIVED by the transport (from character\n * lengths, say) rather than measured by the model provider. `cost.kind` is\n * `estimated` both for a rate estimate over exact tokens and for one over\n * derived tokens; this is the field that separates them.\n */\n tokensEstimated?: boolean\n}\n\n// ── finding_id stability ─────────────────────────────────────────────\n\n/**\n * Compute the stable finding_id from the identity-defining fields.\n * Default implementation hashes {analyst_id, area, subject, normalized claim}.\n * Analysts that emit findings whose claim text varies per run (timestamps,\n * counts) SHOULD either: (a) pass an explicit `id_basis` to fix the hash,\n * or (b) move the variable part into `rationale`/`metadata` and keep the\n * `claim` static.\n */\nexport function computeFindingId(input: {\n analyst_id: string\n area: string\n subject?: string\n claim: string\n /** Override the claim for hashing — use when the displayed claim has run-specific bits. */\n id_basis?: string\n}): string {\n const basis = JSON.stringify({\n a: input.analyst_id,\n r: input.area,\n s: input.subject ?? '',\n c: normalizeClaim(input.id_basis ?? input.claim),\n })\n return `f_${createHash('sha256').update(basis).digest('hex').slice(0, 20)}`\n}\n\nfunction normalizeClaim(c: string): string {\n // Lowercase, collapse whitespace, strip trailing punctuation. Goal:\n // \"Leaf X failed install\" and \"Leaf X failed install.\" hash the same.\n return c\n .toLowerCase()\n .replace(/\\s+/g, ' ')\n .replace(/[.!?;:,]+$/g, '')\n .trim()\n}\n\n/**\n * Convenience factory: produce a fully-formed AnalystFinding with the\n * id computed automatically. Analyst code stays terse.\n */\nexport function makeFinding(\n init: Omit<AnalystFinding, 'schema_version' | 'finding_id' | 'produced_at'> & {\n id_basis?: string\n produced_at?: string\n },\n): AnalystFinding {\n const { id_basis, produced_at, ...rest } = init\n return {\n schema_version: '1.0.0',\n finding_id: computeFindingId({\n analyst_id: rest.analyst_id,\n area: rest.area,\n subject: rest.subject,\n claim: rest.claim,\n id_basis,\n }),\n produced_at: produced_at ?? new Date().toISOString(),\n ...rest,\n }\n}\n\n/** Build a finding whose source is explicitly allowed during candidate generation. */\nexport function makeProposalFinding(\n init: Omit<ProposalFinding, 'schema_version' | 'finding_id' | 'produced_at'> & {\n id_basis?: string\n produced_at?: string\n },\n): ProposalFinding {\n const { proposal_origin, ...finding } = init\n return { ...makeFinding(finding), proposal_origin }\n}\n\n// ── Registry result envelope ────────────────────────────────────────\n\nexport interface AnalystRunSummary {\n analyst_id: string\n status: 'ok' | 'skipped' | 'failed'\n /** Why skipped — missing input, budget exceeded, capability unmet. */\n reason?: string\n findings_count: number\n latency_ms: number\n /** Additive model usage and cost provenance for this analyst. */\n usage: AnalystUsageReceipt\n /** When `status='failed'`: the error class + message, never the full stack. */\n error?: { class: string; message: string }\n}\n\nexport interface AnalystRunResult {\n run_id: string\n correlation_id: string\n started_at: string\n ended_at: string\n findings: AnalystFinding[]\n per_analyst: AnalystRunSummary[]\n /** Total LLM cost in USD across all analysts in this registry.run(). */\n total_cost_usd: number\n /**\n * Provenance for `total_cost_usd`. When uncaptured, the numeric field is only\n * the known subtotal and must not be treated as the run's total spend.\n */\n total_cost_provenance?: CostProvenance\n}\n\n// ── Streaming event envelope ────────────────────────────────────────\n\n/**\n * Events emitted by `AnalystRegistry.runStream(...)` in real time as\n * the registry executes. UIs subscribe via `for await (const ev of\n * registry.runStream(...))`; `registry.run(...)` is a thin collector\n * over the same stream, so the two surfaces share their invariants.\n *\n * Per-finding events are intentionally omitted — analyzers are batch\n * operations (a recursive engine returns the full `findings:json[]` at the\n * end of the responder), so streaming inside one analyst would only\n * emit partial JSON consumers can't render. The kind-completion event\n * is the right granularity; subscribers wanting per-finding rendering\n * iterate `event.findings` themselves.\n */\nexport type AnalystRunEvent =\n | {\n type: 'run-started'\n run_id: string\n correlation_id: string\n started_at: string\n /** The ordered list of analyst ids the registry will run. */\n analyst_ids: ReadonlyArray<string>\n }\n | {\n type: 'analyst-skipped'\n summary: AnalystRunSummary\n }\n | {\n type: 'analyst-started'\n analyst_id: string\n started_at: string\n }\n | {\n type: 'analyst-completed'\n /** `summary.status` is `'ok'` for clean completion or `'failed'` for thrown analysts. */\n summary: AnalystRunSummary\n findings: ReadonlyArray<AnalystFinding>\n }\n | {\n type: 'run-completed'\n result: AnalystRunResult\n }\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAsEA,MAAa,qBAAqB;CAAC;CAAY;CAAQ;CAAU;CAAO;AAAM;;;;;;;;;AAiO9E,SAAgB,iBAAiB,OAOtB;CACT,MAAM,QAAQ,KAAK,UAAU;EAC3B,GAAG,MAAM;EACT,GAAG,MAAM;EACT,GAAG,MAAM,WAAW;EACpB,GAAG,eAAe,MAAM,YAAY,MAAM,KAAK;CACjD,CAAC;CACD,OAAO,KAAK,WAAW,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,GAAG,EAAE;AAC1E;AAEA,SAAS,eAAe,GAAmB;CAGzC,OAAO,EACJ,YAAY,CAAC,CACb,QAAQ,QAAQ,GAAG,CAAC,CACpB,QAAQ,eAAe,EAAE,CAAC,CAC1B,KAAK;AACV;;;;;AAMA,SAAgB,YACd,MAIgB;CAChB,MAAM,EAAE,UAAU,aAAa,GAAG,SAAS;CAC3C,OAAO;EACL,gBAAgB;EAChB,YAAY,iBAAiB;GAC3B,YAAY,KAAK;GACjB,MAAM,KAAK;GACX,SAAS,KAAK;GACd,OAAO,KAAK;GACZ;EACF,CAAC;EACD,aAAa,gCAAe,IAAI,KAAK,EAAA,CAAE,YAAY;EACnD,GAAG;CACL;AACF;;AAGA,SAAgB,oBACd,MAIiB;CACjB,MAAM,EAAE,iBAAiB,GAAG,YAAY;CACxC,OAAO;EAAE,GAAG,YAAY,OAAO;EAAG;CAAgB;AACpD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types-DHb5TI36.d.ts","names":[],"sources":["../src/trace-analyst/types.ts","../src/trace-analyst/store-contract.ts","../src/trace-analyst/store-boundary.ts","../src/analyst/types.ts"],"mappings":";;;;;;;;;;;KAsBY,uBAAuB;KAEvB;;;;UAKK;EACf;EACA;EACA;EACA;EACA,MAAM;EACN;EACA;EACA;EACA,QAAQ;EACR;EACA;EACA;EACA;EACA;;;EAGA,YAAY;;UAGG;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;UAGe;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;;EAGA;;;;;;;UAQe;;EAEf;;EAEA;;EAEA;;EAEA;EACA;EACA;;EAEA;;EAEA;;EAEA;;UAGe;EACf;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;IAAU;IAAqB;;;;;;EAK/B,gBAAgB;EAChB;IAAc;IAAkB;;;UAGjB;EACf,QAAQ;EACR;EACA;;;;;UAMe;EACf;EACA,QAAQ;EACR,YAAY;;UAGG;EACf;;EAEA,gBAAgB;;EAEhB;EACA;;UAGe;EACf;EACA,OAAO;;EAEP;;EAEA;;EAEA;;EAEA;;UAGe;EACf;EACA;EACA;EACA,WAAW;;;EAGX;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA,MAAM;EACN;;UAGe;EACf;EACA;EACA,MAAM;EACN;;;UAIe;;;EAGf;;;EAGA;;;EAGA;;;EAGA;;cAGW,+BAA+B;;;cAS/B;;;cC3MA;WACX;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;UAGe;EACf,SAAS;;;UAIM;EACf;EACA;EACA;EACA;EACA;EACA;;KAGU;EAEN;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;IACE;IACA;IACA;IACA;IACA;;;;KAKI,oBACV,OAAO,qBACP,UAAU,8BACP,QAAQ;;;;;;;;UASI;;EAEf,iBAAiB;EAEjB,SAAS,kBAAkB,UAAU,4BAA4B;EAEjE,SACE;IAAS;IAAkB;KAC3B,UAAU,4BACT;EAEH,YACE,UAAU,qBACV,UAAU,4BACT,QAAQ;EAEX,YACE;IAAS,UAAU;IAAqB;IAAe;KACvD,UAAU,4BACT,QAAQ;EAEX,YAAY,UAAU,qBAAqB,UAAU,4BAA4B;EAEjF,UACE;IACE;IACA;KAEF,UAAU,4BACT,QAAQ;EAEX,UACE;IACE;IACA;IACA;KAEF,UAAU,4BACT,QAAQ;EAEX,YACE;IACE;IACA;IACA;KAEF,UAAU,4BACT,QAAQ;EAEX,WACE;IACE;IACA;IACA;IACA;KAEF,UAAU,4BACT,QAAQ;;UAGI;EACf,UAAU,QAAQ;;;;;iBC1GJ,gCACd,QAAQ,oBACR,UAAS,mCACR;;;;;;;UCPc;EACf;;;;;;;EAOA;EACA;EACA;EACA,UAAU;;;;;;;EAOV;EACA;EACA;EACA,eAAe;EACf;EACA;;EAEA;;;;;;EAMA;;;;EAIA;;EAEA,WAAW;;;;cAKA;KAED,0BAA0B;;KAG1B;;KAGA,kBAAkB;WACnB,iBAAiB;;UAGX;;;;;;;EAOf;EACA;EACA;;;;;;;;KAWU;UAOK;;EAEf;;EAEA;;EAEA;;EAEA;;UAGe;;EAEf;;EAEA;;;;;;UAOe;EACf,aAAa;EACb;EACA,YAAY;EACZ,aAAa;;EAEb,SAAS;;UAGM;EACf;;EAEA;;EAEA;;EAEA;;EAEA,aAAa;;EAEb;;;;;;;EAOA,OAAO;;;;;;;;;;EAUP,gBAAgB,cAAc;;;;;;;EAO9B,mBAAmB,cAAc;;;;;EAKjC,eAAe,SAAS;;EAExB,OAAO;;EAEP,OAAO,aAAa,SAAS;;EAE7B,SAAS;;;;;;;;EAQT,QAAQ;;;UAMO;EACf;;EAEA;;EAEA;;EAEA;EACA,SAAS;;;;;;;KAQC;EAEN;EACA;EACA;EACA;EACA;;EAEA;;EAEA;EAAkB;IAAS;IAAe;;;;;;;;UAO/B;;WAEN;EACT,QAAQ,SAAS,wBAAwB,QAAQ;;;;;;;;UASlC,QAAQ;;WAEd;;WAEA;WACA,WAAW;WACX,MAAM;WACN,WAAW;;WAEX;EACT,QAAQ,OAAO,QAAQ,KAAK,iBAAiB,QAAQ;;;UAItC;;EAEf;;EAEA,QAAQ;;EAER,MAAM;;EAEN;;;;;;;;EAQA;IAAkB;IAAsB;;;;;;;;EAOxC;;;;;;;;;;iBAac,iBAAiB;EAC/B;EACA;EACA;EACA;;EAEA;;;;;;iBAyBc,YACd,MAAM,KAAK;EACT;EACA;IAED;;iBAiBa,oBACd,MAAM,KAAK;EACT;EACA;IAED;UAOc;EACf;EACA;;EAEA;EACA;EACA;;EAEA,OAAO;;EAEP;IAAU;IAAe;;;UAGV;EACf;EACA;EACA;EACA;EACA,UAAU;EACV,aAAa;;EAEb;;;;;EAKA,wBAAwB;;;;;;;;;;;;;;;KAkBd;EAEN;EACA;EACA;EACA;;EAEA,aAAa;;EAGb;EACA,SAAS;;EAGT;EACA;EACA;;EAGA;;EAEA,SAAS;EACT,UAAU,cAAc;;EAGxB;EACA,QAAQ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types-DjOMwGY_.d.ts","names":[],"sources":["../src/supervisor-run/types.ts"],"mappings":";;;;UAkCiB;WACN;;;KAIC,SAAS,KAAK,IAAI;iBAEd,YAAY,iBAAiB;iBAI7B,cAAc,aAAa,KAAK;;iBAKhC,aAAa,GAAG;;KAWpB;;UAGK;WACN;WACA;;;KAIC;WAEG;WACA;;;WAGA;;;;WAIA;;WAEA;WAAgC;;;;;;UAM9B;;;;;WAKN;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;;;;;WAMA,QAAQ;;;;;;WAMR,gBAAgB;;WAEhB,6BAA6B;;WAE7B;;WAEA;WACA;WACA;WACA;;;;;;;;;;;;;UAcM;;WAEN;;WAEA;;WAEA;;WAEA;;WAEA;;;cAIE,kBAAkB;;;;;;;;;;UAiBd;;WAEN;WACA;;WAEA;;WAEA;;;;;;WAMA;;;;;;WAMA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA,kBAAkB;;WAElB;;;;WAIA;;;;;;WAMA;;;;;;;WAOA;;WAEA;;WAEA;;WAEA;;;;;WAKA;IACP;IACA;IACA;IACA;;IAEA;IACA;;WAEO;;WAEA,QAAQ;;;;;WAKR;;WAEA,iCAAiC;;;;;WAKjC;;;;;;UAOM;;WAEN;EACT,QAAQ,QAAQ;;cAOL;cACA;UAEI;;WAEN;WACA;;WAEA;;WAEA;;UAGM;WACN,gBAAgB;WAChB,gBAAgB;WAChB,kBAAkB;;WAElB,QAAQ;WACR,iBAAiB;WACjB,gBAAgB,kBAAkB;;WAElC,kBAAkB;;;;;;WAMlB,OAAO;WACP,WAAW;WACX,gBAAgB;;WAEhB,UAAU;;WAEV,gBAAgB;;WAEhB,iBAAiB;WACjB,oBAAoB;WACpB,kBAAkB;;;;;;;;;WASlB,sBAAsB;;WAEtB,QAAQ;WACR,SAAS;;WAET,mBAAmB;;UAGb;WACN,iBAAiB,SAAS;WAC1B,iBAAiB,SAAS;;;;;;;WAO1B,UAAU;;WAEV,UAAU;;WAEV,WAAW;;WAEX,oBAAoB;;WAEpB,wBAAwB;;WAExB,eAAe;WACf,qBAAqB;;UAGf;WACN,UAAU;WACV,WAAW;;;;;;WAMX,WAAW;WACX,YAAY;WACZ,KAAK;WACL;;UAGM;;WAEN;WACA;;WAEA,MAAM;;WAEN;;WAEA;;WAEA;;WAEA;;WAEA;WACA;;WAEA;WACA;WACA;WACA;WACA;;WAEA;;WAEA,4BAA4B;;;;;;;KAQ3B,mBAAmB;;UAGd;WACN,KAAK;;WAEL;;;;;;;WAOA;;WAEA;;WAEA;;;;;;;;;;;;;UAcM;WACN,gBAAgB;WAChB,aAAa;;;UAIP;WACN,MAAM;WACN,MAAM;WACN,QAAQ;WACR,OAAO;;;UAID;WACN;WACA;WACA;WACA,WAAW,kBAAkB;;UAGvB;;WAEN,kBAAkB,kBAAkB;;WAEpC,OAAO;;;;;;;;WAQP,kBAAkB;;WAElB,SAAS;;WAET,OAAO;;;;;;;;WAQP,UAAU;;;;;;WAMV;WACA,yBAAyB;WACzB,0BAA0B,SAAS;WACnC,WAAW,kBAAkB;;UAGvB;WACN;WACA;WACA;WACA;;;KAIC;;;;;;UAOK;;;;;WAKN;;WAEA;;WAEA;;WAEA;;;;;;;;WAQA;;UAGM;;;;;;WAMN,WAAW;WACX,iBAAiB,SAAS;;;;;;WAM1B,WAAW;;;;;;;WAOX,SAAS,SAAS;WAClB,YAAY;WACZ,WAAW;WACX,eAAe;WACf,YAAY;WACZ,aAAa;WACb,YAAY;WACZ,YAAY;WACZ,UAAU;WACV,OAAO,SAAS;;WAEhB;;UAGM;WACN,eAAe;;WAEf;WACA;WACA;WACA,cAAc;WACd,yBAAyB;WACzB;WACA,eAAe;WACf,UAAU;WACV,WAAW;WACX,SAAS;;WAET,gCAAgC;;WAEhC;;WAEA;;UAGM;;WAEN,kBAAkB,kBAAkB;WACpC;WACA;WACA,QAAQ;WACR,OAAO;WACP,aAAa;WACb,SAAS;WACT,UAAU;WACV,KAAK;;UAGC;WACN,eAAe;WACf;WACA,aAAa;WACb,iBAAiB;WACjB;WACA,WAAW;WACX,mBAAmB;WACnB,iBAAiB;WACjB,aAAa;WACb,qBAAqB;WACrB,eAAe;;;;;WAKf,UAAU;;;;;;;WAOV;aACE;eAA2B,OAAO;eAA2B;;aAC7D;eAAwB,OAAO;eAA2B;;;WAE5D,eAAe;WACf,kBAAkB;;;;;;;;UASZ;WACN;WACA,gBAAgB;;WAEhB,eAAe;;;KAId;UAWK;WACN,MAAM;WACN;WACA;WACA"}
|