@tangle-network/agent-eval 0.220.0 → 0.220.2
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 +11 -0
- package/dist/analyst/index.js +2 -2
- package/dist/{benchmark-command-BzmMTnvC.js → benchmark-command-Dx0E4a6z.js} +2 -2
- package/dist/{benchmark-command-BzmMTnvC.js.map → benchmark-command-Dx0E4a6z.js.map} +1 -1
- package/dist/cli.js +2 -2
- package/dist/contract/index.js +1 -1
- package/dist/{default-registry-BrKmT01n.js → default-registry-ovrIBGmH.js} +2 -2
- package/dist/{default-registry-BrKmT01n.js.map → default-registry-ovrIBGmH.js.map} +1 -1
- package/dist/index.js +1 -1
- package/dist/{integrity-C8oUeB0g.js → integrity-D-s2iHiT.js} +2 -2
- package/dist/{integrity-C8oUeB0g.js.map → integrity-D-s2iHiT.js.map} +1 -1
- package/dist/openapi.json +1 -1
- package/dist/{render-Cs34y0iX.js → render-BhJqXoBH.js} +15 -11
- package/dist/render-BhJqXoBH.js.map +1 -0
- package/dist/supervisor-run/index.d.ts +6 -5
- package/dist/supervisor-run/index.d.ts.map +1 -1
- package/dist/supervisor-run/index.js +3 -3
- package/dist/{terminal-record-D4Rv-j1W.js → terminal-record-CB9BFtjS.js} +77 -29
- package/dist/terminal-record-CB9BFtjS.js.map +1 -0
- package/docs/rollout.md +9 -0
- package/package.json +1 -1
- package/dist/render-Cs34y0iX.js.map +0 -1
- package/dist/terminal-record-D4Rv-j1W.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"render-Cs34y0iX.js","names":["round","round","round","record","record","round"],"sources":["../src/supervisor-run/analyze-context.ts","../src/supervisor-run/analyze-decision.ts","../src/supervisor-run/analyze-economics.ts","../src/supervisor-run/analyze-orchestration.ts","../src/supervisor-run/patch-stats.ts","../src/supervisor-run/analyze-outcome.ts","../src/supervisor-run/analyze-spend.ts","../src/supervisor-run/analyze.ts","../src/supervisor-run/coordination-reader.ts","../src/supervisor-run/runtime-source-limits.ts","../src/supervisor-run/runtime-reader.ts","../src/supervisor-run/reader.ts","../src/supervisor-run/render.ts"],"sourcesContent":["import { parseJsonRecord, parseSupervisorTree, type SpawnRow } from './source-facts'\nimport { readTerminalRecord } from './terminal-record'\nimport { type SupervisorRunSources, type Unavailable, unavailable } from './types'\n\n/** The parsed sources and shared lookups every metric group reads. `gap` records an unavailable measurement on the report. */\nexport function createAnalysis(src: SupervisorRunSources) {\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 = parseJsonRecord(src.result)\n const judge = parseJsonRecord(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 : parseJsonRecord(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 const closeById = new Map(workerCloses.map((close) => [close.id, close]))\n const workersGapReason = src.workersMissingReason ?? 'workers/ directory absent'\n return {\n src,\n gaps,\n gap,\n journalMissing,\n haveJournal,\n tree,\n state,\n result,\n judge,\n terminal,\n rootId,\n rootSpawn,\n workerSpawns,\n workerCloses,\n startedAt,\n completedAt,\n spawnsForSource,\n spawnForSource,\n closeById,\n workersGapReason,\n }\n}\n\nexport type Analysis = ReturnType<typeof createAnalysis>\n","import type { Analysis } from './analyze-context'\nimport type { StepFacts } from './analyze-orchestration'\nimport { workerSourceKey } from './source-facts'\nimport { type DecisionMetrics, unavailable } from './types'\n\n/** Settled verdicts, acceptance and review effort, with a named gap wherever the store never said. */\nexport function measureDecision(a: Analysis, m: StepFacts): DecisionMetrics {\n const {\n src,\n gap,\n journalMissing,\n haveJournal,\n tree,\n workerCloses,\n spawnForSource,\n closeById,\n workersGapReason,\n } = a\n const {\n steerQueuedTotal,\n upLegMessages,\n queuedGapReason,\n workerEventsGapReason,\n observeThenRespawn,\n respawnWithoutEvidence,\n } = m\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 return decision\n}\n","import { roundDecimal as round } from '../math/round-decimal'\nimport { summarizeNumberSeries } from '../statistics'\nimport type { Analysis } from './analyze-context'\nimport type { SpendFacts, TotalUsd, WorkerTokens } from './analyze-spend'\nimport { parseJsonl, workerSourceKey } from './source-facts'\nimport {\n type DecisionMetrics,\n type EconomicsMetrics,\n isUnavailable,\n type PerWorkerRow,\n type SpendMeasurements,\n type SupervisorRunSources,\n unavailable,\n} from './types'\n\nconst NO_CACHE_COUNTERS = 'the journal carries no cache-token counters for this role'\n\nconst NO_CACHE_BREAKDOWN =\n 'Runtime recorded cacheBreakdownKnown:false — the provider reported a total without splitting cache reads from writes'\n\n/** One row per worker log, plus the capture gaps of the root and every worker. */\nexport function buildPerWorker(a: Analysis, f: SpendFacts, t: TotalUsd): PerWorkerRow[] {\n const { src, gaps, tree, rootId, spawnsForSource, spawnForSource, closeById } = a\n const { workerUsdById, workerUsdByLabel } = f\n const { usdLimit } = t\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 return perWorker\n}\n\n/** The supervisor brain's tokens, cache and USD. */\nfunction buildBrainSpend(\n a: Analysis,\n f: SpendFacts,\n t: TotalUsd,\n): EconomicsMetrics['brain'] {\n const { src, gap, journalMissing, haveJournal, tree } = a\n const { brainTokensUnreported, brainUsdUnreported } = f\n const { usdLimit } = t\n const managerTokenLimit = src.limits.managerTokens\n return {\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}\n\n/** The workers' tokens, cache and USD. */\nfunction buildWorkerSpend(\n a: Analysis,\n f: SpendFacts,\n t: TotalUsd,\n w: WorkerTokens,\n): EconomicsMetrics['workers'] {\n const { src, journalMissing, haveJournal } = a\n const { rootChildSpends, workerUsdUnknownNodes, journalWorkerUsd, workerUsdUnreported } = f\n const { usdLimit } = t\n const { sq, workerTokenLimit, workerIn, workerOut } = w\n return {\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}\n\nexport function buildEconomics(\n a: Analysis,\n f: SpendFacts,\n t: TotalUsd,\n w: WorkerTokens,\n e: EconomicsParts,\n): EconomicsMetrics {\n const { src, gap, journalMissing, haveJournal, tree, workersGapReason } = a\n const { rootChildCloses, journalWorkerUsd, usdUnknownRecords } = f\n const { stateUsd, usdLimit, totalUsd, usdUnreportedReason } = t\n const { decision, spend, perWorker } = e\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 return {\n resourceRecords:\n src.journal === null && !tree.resourceRecords?.length\n ? unavailable(journalMissing)\n : (tree.resourceRecords ?? []),\n brain: buildBrainSpend(a, f, t),\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: buildWorkerSpend(a, f, t, w),\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\nexport interface EconomicsParts {\n decision: DecisionMetrics\n spend: SpendMeasurements\n perWorker: PerWorkerRow[]\n}\n","import { roundDecimal as round } from '../math/round-decimal'\nimport type { Analysis } from './analyze-context'\nimport { type SpawnRow, type WorkerLogFacts, workerSourceKey } from './source-facts'\nimport {\n isUnavailable,\n type Measured,\n type OrchestrationMetrics,\n type SteerBreakdown,\n unavailable,\n} from './types'\n\n/** Supervisor wall time and where it ends. Explicit stamps win; the journal span is a lower bound; an inverted stamp pair stays unavailable. */\nexport function measureWall(a: Analysis) {\n const { gap, journalMissing, haveJournal, tree, startedAt, completedAt } = a\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 return { supervisorWallMs, supervisorWallSource, wallEndAt }\n}\n\n/** Steer counts from worker inboxes and the driver log. */\nexport function measureSteers(a: Analysis) {\n const { src, gap, tree, workersGapReason } = a\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 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 return {\n steers,\n steersDelivered,\n steersByWorker,\n driverSteerCalls,\n steerQueuedTotal,\n upLegMessages,\n queuedGapReason,\n workerEventsGapReason,\n }\n}\n\n/** Waves, peak concurrency, idle time and summed worker wall from the spawn/close timeline. */\nexport function measureConcurrency(a: Analysis, wallEndAt: number | null) {\n const { workerSpawns, workerCloses, startedAt } = a\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 return { waves, waveSizes, maxConcurrency, idleMs, sumWorkerWallMs }\n}\n\n/** Respawn counts per parent, split by whether a sibling closed in between. */\nexport function measureRespawns(a: Analysis) {\n const { workerSpawns, closeById } = a\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 return { respawns, observeThenRespawn, respawnWithoutEvidence, repeatedLabels }\n}\n\n/** The deepest chain of spawns below the root. */\nexport function measureDelegationDepth(a: Analysis) {\n const { tree, rootId, workerSpawns } = a\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 return delegationDepth\n}\n\nexport function buildOrchestration(a: Analysis, m: StepFacts): OrchestrationMetrics {\n const { gap, journalMissing, haveJournal, workerSpawns, workerCloses, startedAt } = a\n const {\n supervisorWallMs,\n supervisorWallSource,\n steers,\n steersDelivered,\n steersByWorker,\n driverSteerCalls,\n waves,\n waveSizes,\n maxConcurrency,\n idleMs,\n sumWorkerWallMs,\n respawns,\n repeatedLabels,\n delegationDepth,\n } = m\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\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 return orchestration\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\nexport type StepFacts = ReturnType<typeof measureWall> &\n ReturnType<typeof measureSteers> &\n ReturnType<typeof measureConcurrency> &\n ReturnType<typeof measureRespawns> & { delegationDepth: number }\n","/** Unified-diff target, line, and test-file touch counts. */\nimport type { PatchStats } from './types'\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","import type { Analysis } from './analyze-context'\nimport type { TotalUsd } from './analyze-spend'\nimport { parsePatch } from './patch-stats'\nimport {\n isUnavailable,\n type Measured,\n type OutcomeMetrics,\n type PatchStats,\n unavailable,\n} from './types'\n\n/** Terminal status, verdicts, judge result and the delivered patch. */\nexport function buildOutcome(a: Analysis, t: TotalUsd): OutcomeMetrics {\n const { src, gap, state, result, judge, terminal } = a\n const { stateResult } = t\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 return outcome\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","import { roundDecimal as round } from '../math/round-decimal'\nimport type { Analysis } from './analyze-context'\nimport { asRecord } from './source-facts'\nimport { type Measured, type SpendMeasurements, unavailable } from './types'\n\n/** Spend records of the root and its children, split into reporting and unreporting. */\nexport function collectSpendFacts(a: Analysis) {\n const { tree, rootId, workerSpawns, workerCloses } = a\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 return {\n rootChildCloses,\n rootChildSpends,\n workerUsdUnknownNodes,\n workerTokensUnknownNodes,\n journalWorkerIn,\n journalWorkerOut,\n journalWorkerUsd,\n workerUsdById,\n workerUsdByLabel,\n usdKnownRecords,\n usdUnknownRecords,\n usdUnknownNodes,\n brainUsdUnknownNodes,\n brainTokensUnknownNodes,\n unpriced,\n unreportedTokens,\n usdPartial,\n usdAllUnknown,\n brainTokensUnreported,\n brainUsdUnreported,\n workerUsdUnreported,\n }\n}\n\n/** Worker token totals: journal spend plus harness session counts, or the reason they are absent. */\nexport function measureWorkerTokens(a: Analysis, f: SpendFacts) {\n const { src, gap, haveJournal } = a\n const {\n rootChildSpends,\n workerTokensUnknownNodes,\n journalWorkerIn,\n journalWorkerOut,\n unreportedTokens,\n } = f\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 return { sq, workerTokenLimit, workerIn, workerOut }\n}\n\n/** Total USD and the close record it is read against. */\nexport function measureTotalUsd(a: Analysis, f: SpendFacts) {\n const { src, gap, journalMissing, haveJournal, tree, state, result } = a\n const { journalWorkerUsd, usdKnownRecords, usdUnknownRecords, usdUnknownNodes, unpriced } = f\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 return {\n stateResult,\n stateUsd,\n usdLimit,\n totalUsd,\n closeUsd,\n closeUsdUnreported,\n usdUnreportedReason,\n }\n}\n\nexport function buildSpend(a: Analysis, f: SpendFacts, t: TotalUsd): SpendMeasurements {\n const { journalMissing, haveJournal, tree, rootId } = a\n const {\n journalWorkerUsd,\n usdKnownRecords,\n usdUnknownRecords,\n usdUnknownNodes,\n usdPartial,\n usdAllUnknown,\n } = f\n const { usdLimit, closeUsd, closeUsdUnreported, usdUnreportedReason } = t\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 return spend\n}\n\nexport type SpendFacts = ReturnType<typeof collectSpendFacts>\nexport type WorkerTokens = ReturnType<typeof measureWorkerTokens>\nexport type TotalUsd = ReturnType<typeof measureTotalUsd>\n","/**\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 * The metric groups live in `analyze-*.ts`; this file only runs them in the\n * order the report's `gaps` list is written.\n */\n\nimport { createAnalysis } from './analyze-context'\nimport { measureDecision } from './analyze-decision'\nimport { buildEconomics, buildPerWorker } from './analyze-economics'\nimport {\n buildOrchestration,\n measureConcurrency,\n measureDelegationDepth,\n measureRespawns,\n measureSteers,\n measureWall,\n} from './analyze-orchestration'\nimport { buildOutcome } from './analyze-outcome'\nimport {\n buildSpend,\n collectSpendFacts,\n measureTotalUsd,\n measureWorkerTokens,\n} from './analyze-spend'\nimport {\n SUPERVISOR_RUN_SCHEMA,\n type SupervisorRunReport,\n type SupervisorRunSources,\n unavailable,\n} from './types'\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 a = createAnalysis(src)\n const { gap, gaps, rootId, rootSpawn, journalMissing } = a\n // Measurements record their gaps as they run, so the order below is the order of `report.gaps`.\n const wall = measureWall(a)\n const steerFacts = measureSteers(a)\n const concurrency = measureConcurrency(a, wall.wallEndAt)\n const respawns = measureRespawns(a)\n const steps = {\n ...wall,\n ...steerFacts,\n ...concurrency,\n ...respawns,\n delegationDepth: measureDelegationDepth(a),\n }\n const orchestration = buildOrchestration(a, steps)\n const decision = measureDecision(a, steps)\n const spendFacts = collectSpendFacts(a)\n const tokens = measureWorkerTokens(a, spendFacts)\n const totals = measureTotalUsd(a, spendFacts)\n const spend = buildSpend(a, spendFacts, totals)\n const perWorker = buildPerWorker(a, spendFacts, totals)\n const economics = buildEconomics(a, spendFacts, totals, tokens, { decision, spend, perWorker })\n const outcome = buildOutcome(a, totals)\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 * Optional Runtime run-dir files, read as bytes.\n *\n * `coordination-log.jsonl` is Runtime's JSONL of `{ runId, seq, at, event }`:\n * questions, steers, answers and peer mail between nodes. The `team-shape`\n * analyst reads communication and steer edges from it.\n */\n\nimport { readFile } from 'node:fs/promises'\nimport { join } from 'node:path'\n\nconst COORDINATION_FILE = 'coordination-log.jsonl'\n\n/** File text, or null when the file does not exist. Any other read error throws. */\nexport async 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\n/** The run's coordination log, or null when Runtime wrote none. */\nexport function readCoordinationLog(runDir: string): Promise<string | null> {\n return readMaybe(join(runDir, COORDINATION_FILE))\n}\n","import { nonEmptyString, recordOrNull as record } from './source-facts'\nimport type { SourceLimits } from './types'\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\nexport function 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 * 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 { readCoordinationLog, readMaybe } from './coordination-reader'\nimport { sourceLimits } from './runtime-source-limits'\nimport { nonEmptyString, recordOrNull as record } from './source-facts'\nimport {\n NO_SOURCE_LIMITS,\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\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\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 coordinationLog: await readCoordinationLog(runDir),\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\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 { readdir } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { analyzeSupervisorRunSources } from './analyze'\n\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\n\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 * 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 { roundDecimal as round } from '../math/round-decimal'\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"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-record-D4Rv-j1W.js","names":["unhandled","str"],"sources":["../src/supervisor-run/types.ts","../src/supervisor-run/source-facts.ts","../src/supervisor-run/terminal-record.ts"],"sourcesContent":["/**\n * Supervisor-run analysis — the multi-agent analogue of single-rollout trace\n * analysis. A solo rollout is one invocation with a transcript; a supervisor\n * run is a TREE of invocations (a brain that spawns, steers, and settles\n * workers) plus the event timeline that connects them. `src/trace-analyst`\n * answers \"what happened inside one session\"; this module answers \"what did\n * the tree do\" — did the brain steer anyone mid-task, how many spawn waves,\n * how concurrent, how idle, what did each role cost, what came back.\n *\n * The nodes of that tree are NOT a new shape: they are `tangle.rollout.v1`\n * rows (`src/rollout`), keyed by `parent_rollout_id`, with `role` already\n * spanning `supervisor` / `worker`. `supervisorRunRolloutLines` mints them.\n * What rollout rows deliberately do NOT carry is the inter-invocation event\n * timeline (spawn/settle/steer instants), which is what every structural\n * metric here is computed from — so the reader consumes the journal event\n * stream and emits rollout rows, rather than maintaining a parallel node type.\n *\n * ## UNAVAILABLE ≠ ZERO\n *\n * Every metric whose backing artifact can be missing is typed\n * `Measured<T> = T | { unavailable: reason }`. A supervisor that steered\n * nobody reports `steers: 0`; a supervisor whose worker logs were never\n * written reports `steers: unavailable — <reason>`. The two have driven\n * opposite conclusions about the same architecture, so they never collapse.\n */\n\nimport type { RolloutLine, RolloutWorkspaceCapture } from '../rollout/schema'\nimport type { SeriesDistribution } from '../statistics'\n\n// ---------------------------------------------------------------------------\n// Unavailable-aware metric type.\n// ---------------------------------------------------------------------------\n\n/** A metric that could not be computed, with the reason its artifact was missing. */\nexport interface Unavailable {\n readonly unavailable: string\n}\n\n/** A metric value, or the reason it is unknown. NEVER collapse `unavailable` to 0. */\nexport type Measured<T> = T | Unavailable\n\nexport function unavailable(reason: string): Unavailable {\n return { unavailable: reason }\n}\n\nexport function isUnavailable(v: unknown): v is Unavailable {\n return typeof v === 'object' && v !== null && typeof (v as Unavailable).unavailable === 'string'\n}\n\n/** Render a measured scalar for the markdown/headline: `0` and `unavailable` stay distinct. */\nexport function showMeasured(v: Measured<number | string | boolean | null>): string {\n if (isUnavailable(v)) return `unavailable — ${v.unavailable}`\n if (v === null) return 'null'\n return String(v)\n}\n\n// ---------------------------------------------------------------------------\n// Source contract — deliberately source-agnostic.\n// ---------------------------------------------------------------------------\n\n/** The two invocation roles a recursive supervision tree can contain. */\nexport type SupervisorRunNodeRole = 'supervisor' | 'worker'\n\n/** Turn-level transcript coverage for one worker. */\nexport interface WorkerTurnCoverage {\n readonly dispatched: number\n readonly retained: number\n}\n\n/** A native harness session receipt: the retained artifact, or the store's reason there is none. */\nexport type WorkerNativeSession =\n | {\n readonly status: 'available'\n readonly ref: string\n /** False when Runtime stored a partial copy (the session may continue past it). Absent on\n * receipts that do not say. */\n readonly coverageComplete?: boolean\n /** Stored files the harness writes its conversation to. Zero means the receipt holds other\n * native files only (a model cache, a config). Absent when the descriptor does not list\n * files or the harness has no known session layout. */\n readonly sessionFiles?: number\n }\n | { readonly status: 'unavailable'; readonly reason: string }\n\n/**\n * One worker's logs, as read. `null` means the artifact did not exist; `''`\n * means the artifact was captured and contained no rows.\n */\nexport interface WorkerLogSource {\n /**\n * Stable journal node id. Readers should set this whenever their source has\n * one; `label` remains the compatibility join for older stores.\n */\n readonly workerId?: string\n /** Human-readable task label. It is not required to be unique. */\n readonly label: string\n /** Worker event stream — started / progress / finished / message events (JSONL). */\n readonly events: string | null\n /** The durable steer queue — one line per steer request (JSONL). */\n readonly inbox: string | null\n /** Worker patch byte length, or null when absent. */\n readonly patchBytes: number | null\n /** Where this worker's transcript lives, for the rollout row. Null = no such artifact. */\n readonly transcriptRef?: string | null\n /**\n * Harness turns this worker dispatched, and how many left a retained output (the turn's own\n * event stream). A settled worker with fewer retained than dispatched lost those turns' record.\n * Null or absent = the store does not record turns.\n */\n readonly turns?: WorkerTurnCoverage | null\n /**\n * The store's receipt for this worker's native harness session: the harness's own session\n * files, which are the only record of what its native subagents did. Null or absent = the\n * store kept no receipt for this worker.\n */\n readonly nativeSession?: WorkerNativeSession | null\n /** Capture receipts in output order. Null means none were retained; absent means this reader has no channel. */\n readonly workspaceCaptures?: readonly RolloutWorkspaceCapture[] | null\n /** Where this worker's delivered patch lives. Null = the store keeps no patch per worker. */\n readonly patchPath?: string | null\n /** This worker's own inference tokens, when the store records them per worker. */\n readonly tokensIn?: number | null\n readonly tokensOut?: number | null\n readonly cacheRead?: number | null\n readonly cacheWrite?: number | null\n}\n\n/**\n * Facts a SOURCE structurally cannot express, each with the reason.\n *\n * The difference between \"the artifact is missing\" and \"this store never\n * records that fact\" is the difference between a run that spent $0 and a\n * harness that does not price inference — and the second harness is where a\n * store-specific assumption becomes a fabricated zero. A reader declares its\n * limits once; the analyzer reports `unavailable` for everything downstream.\n *\n * `null` on a field means the source DOES carry that fact.\n */\nexport interface SourceLimits {\n /** Reason manager input/output token totals are unavailable (null = recorded). */\n readonly managerTokens: string | null\n /** Reason worker input/output token totals are unavailable (null = recorded). */\n readonly workerTokens: string | null\n /** Reason inference spend has no price in this store (null = the store prices it). */\n readonly spendUsd: string | null\n /** Reason workers carry no pass/fail verdict (null = verdicts are recorded). */\n readonly workerVerdicts: string | null\n /** Reason no delivered artifact (patch/diff) is retained per worker (null = retained). */\n readonly deliverables: string | null\n}\n\n/** A source that carries every fact the analyzer can use. */\nexport const NO_SOURCE_LIMITS: SourceLimits = {\n managerTokens: null,\n workerTokens: null,\n spendUsd: null,\n workerVerdicts: null,\n deliverables: null,\n}\n\n/**\n * Everything the pure analyzer reads — already-read bytes, never paths. Each\n * field is `null` when its artifact was absent, which is what turns the\n * dependent metrics into `unavailable` rather than 0.\n *\n * This is the whole input contract. Any store that can produce these strings\n * (a Runtime run, an object-store archive, a database, or a test fixture) is a\n * valid source; the Runtime reader is one implementation.\n */\nexport interface SupervisorRunSources {\n /** Stable identity of the run being analyzed (a directory, a run id, a URL). */\n readonly runRef: string\n readonly instanceId: string | null\n /** Which arm/variant of a comparison this run is, when the run belongs to one. */\n readonly arm: string | null\n /** Identity of the supervision-tree store this was read from; null = none found. */\n readonly supRunDir: string | null\n /**\n * Supervision journal — spawned / settled / cancelled / metered events (JSONL).\n * Recursive readers put `role: 'supervisor' | 'worker'` on spawned rows;\n * settled `verdict` may be a string or `{ valid, score, ... }`.\n */\n readonly journal: string | null\n /**\n * Source-specific reason `journal` is null. The analyzer uses it verbatim as\n * the `unavailable` reason on every journal-dependent metric, so another\n * layout names its own journal file instead of inheriting a path assumption.\n */\n readonly journalMissingReason?: string\n /** Per-brain-call tap (JSONL): finish_reason, completion tokens, requested max tokens. */\n readonly brainLog: string | null\n /** Source-specific reason `brainLog` is absent. */\n readonly brainLogMissingReason?: string\n /** Supervisor state document (JSON). */\n readonly state: string | null\n /** Supervisor progress stream (JSONL). */\n readonly progress: string | null\n /** Per-worker logs; `null` = the worker log store itself was missing. */\n readonly workers: readonly WorkerLogSource[] | null\n /** Why `workers` is null (only set when it is). */\n readonly workersMissingReason: string | null\n /**\n * Runtime `result.json`, the `SupervisedResult` returned by `supervise()`.\n */\n readonly result: string | null\n /**\n * Runtime's terminal failure record (`failure.json`), written when\n * `supervise()` threw before a result landed. `null` = the store was read and\n * holds no such record; `undefined` = the store has no failure document.\n */\n readonly failure?: string | null\n /**\n * Judge verdict document (JSON), or the matching ledger row re-encoded as\n * one. Runners that write the verdict straight to a ledger leave no judge\n * document, so the ledger row is the same fact from the same run — not a\n * substitute measurement.\n */\n readonly judge: string | null\n /** Where `judge` came from, for the report's provenance line. */\n readonly judgeSource: string | null\n /** Delivered unified-diff patch text. */\n readonly patch: string | null\n /** Outer-driver log (used for the driver's steer verbs + deadline evidence). */\n readonly driverLog: string | null\n /**\n * Runtime `coordination-log.jsonl` (JSONL of `{ runId, seq, at, event }`):\n * questions, steers, answers and peer mail between nodes. Absent for stores\n * that keep no coordination log; null when the Runtime run dir has none.\n */\n readonly coordinationLog?: string | null\n /**\n * Worker tokens recovered from a harness session store; null = store unavailable.\n * `store` names the store in the report's provenance line (e.g. `opencode`).\n */\n readonly harnessWorkerTokens: {\n store: string\n sessions: number\n input: number\n output: number\n /** Cached prompt tokens, when the store counts them separately. */\n cacheRead?: number\n cacheWrite?: number\n } | null\n readonly harnessMissingReason: string | null\n /** What this store structurally cannot record. See `SourceLimits`. */\n readonly limits: SourceLimits\n /**\n * Where the ROOT invocation's transcript lives. Any store that does not\n * retain one must set this to `null`, or omit the path entirely.\n */\n readonly rootTranscriptRef?: string | null\n /** Root capture receipts in output order; null means no retained receipt. */\n readonly rootWorkspaceCaptures?: readonly RolloutWorkspaceCapture[] | null\n /**\n * The `traces` CLI command that covers this run's harness-session layer.\n * Null falls back to the analyzer's default (an opencode worker fleet).\n */\n readonly traceCommand: string | null\n}\n\n/**\n * A source of supervisor-run bytes. Implementations own their storage layout;\n * the analyzer only ever sees `SupervisorRunSources`.\n */\nexport interface SupervisorRunReader {\n /** Stable identity of what this reader points at (for logs and report labels). */\n readonly runRef: string\n read(): Promise<SupervisorRunSources>\n}\n\n// ---------------------------------------------------------------------------\n// Report shape.\n// ---------------------------------------------------------------------------\n\nexport const SUPERVISOR_RUN_SCHEMA = 'tangle.supervisor-run@1'\nexport const SUPERVISOR_RUN_ROLLUP_SCHEMA = 'tangle.supervisor-run-rollup@1'\n\nexport interface SteerBreakdown {\n /** Stable journal node id when the reader retained one. */\n readonly workerId: string | null\n readonly worker: string\n /** Steer requests durably queued to this worker's inbox. */\n readonly queued: number\n /** Steers the worker's executor actually accepted (control event `delivered:true`). */\n readonly delivered: number\n}\n\nexport interface OrchestrationMetrics {\n readonly workersSpawned: Measured<number>\n readonly workersSettled: Measured<number>\n readonly workersCancelled: Measured<number>\n /** THE HEADLINE: mid-task steers the brain sent to live workers. 0 ≠ unavailable. */\n readonly steers: Measured<number>\n readonly steersDelivered: Measured<number>\n readonly steersByWorker: Measured<readonly SteerBreakdown[]>\n /** Outer-driver `supervisor_steer` tool calls seen in the driver log (a second steer path). */\n readonly driverSteerCalls: Measured<number>\n /**\n * Spawn waves. A wave is a maximal run of worker spawns with no settle/cancel between\n * them: wave N+1 begins at the first spawn issued after at least one worker from an\n * earlier wave has settled. Structural, not a time threshold — no tunable constant.\n */\n readonly waves: Measured<number>\n readonly waveSizes: Measured<readonly number[]>\n readonly maxConcurrency: Measured<number>\n /** Direct-child spawns issued after that parent's first direct-child settlement. */\n readonly respawns: Measured<number>\n /** Labels spawned more than once by the same parent. */\n readonly repeatedLabels: Measured<readonly string[]>\n /** Longest parent chain below the root, in worker hops. */\n readonly delegationDepth: Measured<number>\n readonly timeToFirstSpawnMs: Measured<number>\n readonly supervisorWallMs: Measured<number>\n /**\n * Which measurement `supervisorWallMs` holds — never a silent substitution.\n * `stamps`: explicit start and completion stamps. `journal-span`: the start\n * stamp (or first stamped event) to the last stamped journal event — a\n * lower bound, derived when the store wrote no completion stamp. `idleMs`,\n * `idlePct`, and `workerUtilization` cover the same span. Unavailable\n * exactly when `supervisorWallMs` is, with the same reason.\n */\n readonly supervisorWallSource: Measured<'stamps' | 'journal-span'>\n /** Wall time inside the supervisor run with ZERO live workers. */\n readonly idleMs: Measured<number>\n readonly idlePct: Measured<number>\n /** sum(worker wall) / supervisor wall. >1 means real parallelism. */\n readonly workerUtilization: Measured<number>\n}\n\nexport interface DecisionMetrics {\n readonly settledByStatus: Measured<Record<string, number>>\n readonly settledVerdicts: Measured<Record<string, number>>\n /**\n * Workers whose recorded verdict was green. A store that retains a delivered patch also\n * requires patch bytes; a store that retains none accepts the verdict alone, because the\n * verdict IS the acceptance decision that store recorded. `emptyPass` — the split that\n * needs patch bytes — is what reads unavailable there.\n */\n readonly accepted: Measured<number>\n /** Worker settled with a failing verify. */\n readonly rejected: Measured<number>\n /** Worker verified green but delivered no patch bytes — output with nothing to accept. */\n readonly emptyPass: Measured<number>\n /** Direct-child settlements a parent observed before issuing its next direct-child spawn. */\n readonly observeThenRespawn: Measured<number>\n /** Parent-local respawns with no direct-child settlement in front of them. */\n readonly respawnWithoutEvidence: Measured<number>\n /** Steer + question traffic on the live down/up legs — the only \"review while running\" signal. */\n readonly reviewActions: Measured<number>\n readonly workerEvidenceBytes: Measured<number>\n}\n\nexport interface RoleSpend {\n readonly tokensIn: Measured<number>\n readonly tokensOut: Measured<number>\n /**\n * Cached prompt tokens read/written. On a harness that caches aggressively\n * these dwarf `tokensIn`, so a report that omits them understates the context\n * each invocation actually consumed. `unavailable` = the store has no such counter.\n */\n readonly cacheRead: Measured<number>\n readonly cacheWrite: Measured<number>\n readonly usd: Measured<number>\n readonly source: string\n}\n\nexport interface PerWorkerRow {\n /** Stable journal node id when the reader retained one. */\n readonly workerId: string | null\n readonly worker: string\n /** Explicit journal role after the worker source was joined to its spawn. */\n readonly role: SupervisorRunNodeRole | null\n /** Exact execution runtime tag from the spawn event. */\n readonly runtime: string | null\n /** Exact canonical AgentProfile digest from the spawn event. */\n readonly profileDigest: string | null\n /** Terminal lifecycle status exactly as recorded. */\n readonly status: string | null\n /** Terminal failure detail exactly as recorded. */\n readonly failure: string | null\n /** Runtime infrastructure classification, when recorded. */\n readonly infra: boolean | null\n readonly wallMs: number | null\n /** `null` = this store does not attribute tokens per worker (NOT \"zero tokens\"). */\n readonly tokensIn: number | null\n readonly tokensOut: number | null\n readonly usd: number | null\n readonly patchBytes: number | null\n readonly passed: boolean | null\n /** Numeric verdict score exactly as recorded; null means no score was recorded. */\n readonly score: number | null\n /** Exact Runtime capture receipts in journal order; null means capture evidence is unknown. */\n readonly workspaceCaptures: readonly RolloutWorkspaceCapture[] | null\n}\n\n/**\n * `SeriesDistribution` (from `../statistics`) over per-worker wall\n * milliseconds. The fold itself is `summarizeNumberSeries`, exported for any\n * series — fleet wall medians, tokens-per-claim spreads — not only wall.\n */\nexport type WallDistribution = SeriesDistribution\n\n/** One spend measurement and the number of source records behind it. */\nexport interface SpendMeasurement {\n readonly usd: Measured<number>\n /** Source records folded into `usd`; 0 when the measurement is unavailable. */\n readonly records: number\n /**\n * Records the store wrote with `usdKnown: false` — work that HAPPENED at a price the\n * provider never reported. Those records are NOT folded into `usd`, so a run with any\n * of them has a `usd` that is a floor on real spend, never the measured total. Dropping\n * the whole channel instead would discard the records that DID carry a price.\n */\n readonly unknownRecords: number\n /** True exactly when `unknownRecords > 0`: `usd` covers some of the run, not all of it. */\n readonly partial: boolean\n /** Node ids behind `unknownRecords`, in journal order. Empty when none. */\n readonly unknownNodes: readonly string[]\n}\n\n/**\n * The run's total inference spend, measured two ways.\n *\n * `closeRecord` is the spend the store recorded as settled when the run\n * closed (`result.json` `spentTotal.usd`) — the billing-shaped answer. `journalDerived` is the\n * spend execution observably consumed (journal `metered` + `settled` rows) —\n * the execution-accounting answer. Neither is canonical for the other's\n * question. The two cover different records at different moments, so\n * divergence between them is itself a signal (a dropped settlement, a\n * double meter, spend after the close) — read it, never average it away.\n */\nexport interface SpendMeasurements {\n readonly journalDerived: SpendMeasurement\n readonly closeRecord: SpendMeasurement\n}\n\n/** One source receipt; unknown amounts remain lower bounds when known is false. */\nexport interface NamedResourceReceipt {\n readonly name: Measured<string>\n readonly unit: Measured<string>\n readonly amount: Measured<number>\n readonly known: Measured<boolean>\n}\n\n/** Recorded spend evidence. Inclusive parent and child records must not be summed together. */\nexport interface ResourceSpendRecord {\n readonly nodeId: string | null\n readonly source: string\n readonly kind: 'metered' | 'settled' | 'cancelled' | 'result'\n readonly resources: Measured<readonly NamedResourceReceipt[]>\n}\n\nexport interface EconomicsMetrics {\n /** Per-journal-record resource receipts, without cross-node aggregation. */\n readonly resourceRecords?: Measured<readonly ResourceSpendRecord[]>\n /** Driver/brain inference — journal `metered` events. */\n readonly brain: RoleSpend\n /**\n * Brain completions that came back `finish_reason: \"length\"` — output TRUNCATED. Any value\n * above 0 means the supervisor planned into a wall and then acted on the half-written plan,\n * which is a defect and not a cost figure. The journal's `metered` rows carry token counts\n * but no finish reason, so this reads the per-call brain tap; a run whose supervisor\n * predates that tap reports `unavailable`, never 0.\n */\n readonly brainTruncations: Measured<number>\n /** Worker inference — journal `settled` spend plus the harness session join. */\n readonly workers: RoleSpend\n /** Both total-spend measurements, each with its own record count. */\n readonly spend: SpendMeasurements\n /**\n * One collapsed number kept for existing consumers: the close record when\n * the store wrote one, else the journal-derived sum. `totalUsdSource` names\n * the pick, and says so when the number is a partial floor because some\n * records carried `usdKnown: false`. Prefer `spend` — the collapse hides\n * which accounting question the number answers and how much of it is priced.\n */\n readonly totalUsd: Measured<number>\n /**\n * Where `totalUsd` came from. CLI-backend workers never price their own inference into\n * the journal, so on those arms the total is BRAIN-ONLY and the worker row's token\n * counts (recovered from the harness store) are the honest worker-side figure.\n */\n readonly totalUsdSource: string\n readonly costPerAcceptedPatchUsd: Measured<number>\n readonly workerWallMsDistribution: Measured<WallDistribution>\n readonly perWorker: Measured<readonly PerWorkerRow[]>\n}\n\nexport interface PatchStats {\n readonly files: number\n readonly linesAdded: number\n readonly linesRemoved: number\n readonly testFilesTouched: readonly string[]\n}\n\n/** Which record a run's terminal status was read from, so no source is a silent substitution. */\nexport type SupervisorStatusSource =\n /** Runtime's `result.json` `kind`: the `SupervisedResult` discriminant, read verbatim. */\n | 'runtime-result'\n /** Runtime's `failure.json`: `supervise()` threw before a result landed. */\n | 'runtime-failure'\n\n/** The error a run directory recorded. */\nexport interface TerminalFailure {\n /**\n * Which record carried the error: Runtime's `failure.json`, or the driver\n * rejection inside a `driver-failed` no-winner `result.json`.\n */\n readonly source: 'runtime-failure' | 'runtime-result'\n /** `error.name` exactly as recorded; null when the record has none. */\n readonly name: string | null\n /** `error.message` exactly as recorded; null when the record has none. */\n readonly message: string | null\n /** ISO timestamp the record carries; null when it carries none. */\n readonly at: string | null\n /**\n * True when the directory also holds a settled `result.json`. Runtime writes\n * `failure.json` only when `supervise()` threw, never after a settle, and\n * refuses to re-enter a settled directory, so a failure beside a result is\n * the throw of an earlier attempt that a later attempt outlived. The status\n * is the settled result's; this record explains the retry, not the outcome.\n */\n readonly earlierAttempt: boolean\n}\n\nexport interface OutcomeMetrics {\n /**\n * The run's terminal status, exactly as its Runtime record spells it:\n * `winner` / `no-winner`, or `failed` for a Runtime failure record.\n * `supStatusSource` names the record it came from.\n */\n readonly supStatus: Measured<string>\n readonly supStatusSource: Measured<SupervisorStatusSource>\n /**\n * Runtime's `reason` on a `no-winner` result (`all-children-down`,\n * `budget-exhausted`, `aborted`, `driver-failed`). `null` = the terminal\n * record carries no reason (a winner or a failure record).\n */\n readonly supReason: Measured<string | null>\n /**\n * The recorded error: Runtime's `failure.json`, or the driver rejection a\n * `driver-failed` no-winner carries. `null` = the run recorded a result and\n * no error. A `failure.json` beside a settled result is reported with\n * `earlierAttempt: true`. Unavailable when the store has no terminal record.\n */\n readonly failure: Measured<TerminalFailure | null>\n readonly supVerdict: Measured<string>\n readonly delivered: Measured<boolean>\n readonly judgeResolved: Measured<boolean | null>\n readonly judgeScore: Measured<number | null>\n readonly judgePassed: Measured<number | null>\n readonly judgeTotal: Measured<number | null>\n readonly verifyPass: Measured<boolean>\n readonly verifyRc: Measured<number>\n readonly patch: Measured<PatchStats>\n /** Which document the judge fields came from (a judge file, a ledger row, or nothing). */\n readonly judgeSource: string | null\n}\n\nexport interface SupervisorRunReport {\n readonly schema: typeof SUPERVISOR_RUN_SCHEMA\n /** The `runRef` of the sources this report was computed from. */\n readonly runRef: string\n readonly instanceId: string | null\n readonly arm: string | null\n readonly supervisorId: Measured<string>\n readonly supervisorProfileDigest: Measured<string>\n readonly generatedAt: string\n readonly orchestration: OrchestrationMetrics\n readonly decision: DecisionMetrics\n readonly economics: EconomicsMetrics\n readonly outcome: OutcomeMetrics\n /** Exact root capture receipts; null means capture evidence is unknown. */\n readonly rootWorkspaceCaptures: readonly RolloutWorkspaceCapture[] | null\n /** Artifacts that were missing, in read order — the provenance of every `unavailable`. */\n readonly gaps: readonly string[]\n /** The `traces` CLI command that covers the harness-session layer for this run. */\n readonly traceCommand: string\n}\n\nexport interface RollupCellRow {\n /** Per-source receipts remain attached to their comparison cell. */\n readonly resourceRecords?: Measured<readonly ResourceSpendRecord[]>\n readonly instanceId: string | null\n readonly arm: string | null\n readonly steers: Measured<number>\n readonly waves: Measured<number>\n readonly utilization: Measured<number>\n readonly idlePct: Measured<number>\n readonly resolved: Measured<boolean | null>\n readonly usd: Measured<number>\n}\n\nexport interface SupervisorRunRollup {\n readonly schema: typeof SUPERVISOR_RUN_ROLLUP_SCHEMA\n readonly cells: number\n readonly steersTotal: Measured<number>\n readonly cellsWithSteers: Measured<number>\n readonly cellsWithUnavailableSteers: number\n readonly wavesMean: Measured<number>\n readonly maxConcurrencyMax: Measured<number>\n readonly utilizationMean: Measured<number>\n readonly idlePctMean: Measured<number>\n readonly workersSpawnedTotal: Measured<number>\n readonly acceptedTotal: Measured<number>\n /**\n * Sum of the per-run collapsed `totalUsd`. Prefer `spendUsd`: this total\n * mixes close-record and journal-derived cells without saying which.\n */\n readonly usdTotal: Measured<number>\n /**\n * Fleet spend measured two ways. `runs` is each measurement's own\n * denominator — the cells where that measurement was available. The two\n * sums cover different run sets, so comparing the values without their\n * denominators manufactures a phantom divergence.\n */\n readonly spendUsd: {\n readonly journalDerived: { readonly value: Measured<number>; readonly runs: number }\n readonly closeRecord: { readonly value: Measured<number>; readonly runs: number }\n }\n readonly resolvedCount: Measured<number>\n readonly perCell: readonly RollupCellRow[]\n}\n\n/**\n * A supervision tree expressed in the canonical rollout row type: one\n * `RolloutLine` per invocation, joined by `parent_rollout_id`. The root row\n * carries `role: 'supervisor'`; nested supervisors retain that role and leaf\n * invocations carry `role: 'worker'`.\n */\nexport interface SupervisorRunTree {\n readonly rootId: string | null\n readonly nodes: readonly RolloutLine[]\n /** Typed reasons a rollout field could not be recovered, in read order. */\n readonly gaps: readonly SupervisorRunTreeGap[]\n}\n\n/** Stable machine-readable reasons emitted while minting a supervisor tree. */\nexport type SupervisorRunTreeGapCode =\n | 'journal-unavailable'\n | 'source-row-malformed'\n | 'root-spawn-unavailable'\n | 'root-reward-unavailable'\n | 'child-reward-unavailable'\n | 'node-role-unavailable'\n | 'workspace-capture-unavailable'\n | 'workspace-capture-incomplete'\n | 'node-schema-invalid'\n\nexport interface SupervisorRunTreeGap {\n readonly code: SupervisorRunTreeGapCode\n readonly message: string\n readonly nodeId?: string\n readonly count?: number\n}\n","import {\n type Measured,\n type NamedResourceReceipt,\n type ResourceSpendRecord,\n type SupervisorRunNodeRole,\n type SupervisorRunSources,\n unavailable,\n} from './types'\n\n// ---------------------------------------------------------------------------\n// Journal shapes — structurally parsed. The journal is the contract, not the type.\n// ---------------------------------------------------------------------------\n\ninterface JournalEvent {\n kind?: unknown\n id?: unknown\n parent?: unknown\n label?: unknown\n role?: unknown\n profileDigest?: unknown\n runtime?: unknown\n status?: unknown\n verdict?: unknown\n reason?: unknown\n infra?: unknown\n seq?: unknown\n at?: unknown\n spend?: unknown\n spent?: unknown\n}\n\ninterface Tokens {\n input: number\n output: number\n cacheRead: number\n cacheWrite: number\n /** False when the event carried no cache counters at all — not \"zero cached\". */\n hasCache: boolean\n /**\n * False only when the record carried `cacheBreakdownKnown: false` — Runtime's mark for a\n * provider that reported a total without splitting cache reads from cache writes. The\n * counters that ARE present are then a partial split, never a measured \"zero cached\".\n */\n breakdownKnown: boolean\n}\n\ninterface SpendLike {\n readonly resources?: Measured<readonly NamedResourceReceipt[]>\n tokens: Tokens\n /**\n * False only when the record carried `tokensKnown: false` — Runtime's mark for work that\n * HAPPENED with an unreported token count. `tokens` then holds the known subtotal (often\n * zero), never the measured total. An absent flag means the record is complete.\n */\n tokensKnown: boolean\n usd: number\n /**\n * False only when the record carried `usdKnown: false` — work that HAPPENED at a price the\n * provider never reported. `usd` then holds a catalog estimate or zero, never a measured\n * price. An absent flag means the record is complete.\n */\n usdKnown: boolean\n}\n\nexport function asRecord(v: unknown): Record<string, unknown> {\n return typeof v === 'object' && v !== null ? (v as Record<string, unknown>) : {}\n}\n\nfunction num(v: unknown): number {\n return typeof v === 'number' && Number.isFinite(v) ? v : 0\n}\n\nfunction readResources(value: unknown): Measured<readonly NamedResourceReceipt[]> {\n if (value === undefined) return unavailable('resource map not recorded')\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n return unavailable('resource map is malformed')\n }\n return Object.entries(value).map(([name, raw]) => {\n const entry = asRecord(raw)\n return {\n name: name.trim() ? name : unavailable('resource name is empty'),\n unit:\n typeof entry.unit === 'string' && entry.unit.trim()\n ? entry.unit\n : unavailable('resource unit is missing or invalid'),\n amount:\n typeof entry.amount === 'number' && Number.isFinite(entry.amount) && entry.amount >= 0\n ? entry.amount\n : unavailable('resource amount is missing or invalid'),\n known:\n typeof entry.known === 'boolean'\n ? entry.known\n : unavailable('resource completeness is missing or invalid'),\n }\n })\n}\n\nfunction readSpend(v: unknown): SpendLike {\n const rec = asRecord(v)\n const tok = asRecord(rec.tokens)\n const cacheRead = tok.cacheRead ?? tok.cache_read\n const cacheWrite = tok.cacheWrite ?? tok.cache_write\n return {\n tokens: {\n input: num(tok.input),\n output: num(tok.output),\n cacheRead: num(cacheRead),\n cacheWrite: num(cacheWrite),\n hasCache: cacheRead !== undefined || cacheWrite !== undefined,\n breakdownKnown: tok.cacheBreakdownKnown !== false,\n },\n resources: readResources(rec.resources),\n tokensKnown: rec.tokensKnown !== false,\n usd: num(rec.usd),\n usdKnown: rec.usdKnown !== false,\n }\n}\n\nexport function parseJsonl(text: string | null): Record<string, unknown>[] {\n return parseJsonlWithDiagnostics(text).rows\n}\n\ninterface ParsedJsonl {\n readonly rows: Record<string, unknown>[]\n readonly invalidRows: number\n}\n\nfunction parseJsonlWithDiagnostics(text: string | null): ParsedJsonl {\n if (text === null) return { rows: [], invalidRows: 0 }\n const out: Record<string, unknown>[] = []\n let invalidRows = 0\n for (const line of text.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed) continue\n try {\n const parsed: unknown = JSON.parse(trimmed)\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n out.push(parsed as Record<string, unknown>)\n } else {\n invalidRows += 1\n }\n } catch {\n invalidRows += 1\n }\n }\n return { rows: out, invalidRows }\n}\n\nexport function parseJsonRecord(text: string | null): Record<string, unknown> | null {\n if (text === null) return null\n try {\n const parsed: unknown = JSON.parse(text)\n return typeof parsed === 'object' && parsed !== null\n ? (parsed as Record<string, unknown>)\n : null\n } catch {\n return null\n }\n}\n\nfunction ms(at: unknown): number | null {\n if (typeof at !== 'string') return null\n const t = Date.parse(at)\n return Number.isFinite(t) ? t : null\n}\n\n// ---------------------------------------------------------------------------\n// The supervision tree, as parsed from the journal event stream.\n// ---------------------------------------------------------------------------\n\nexport interface SpawnRow {\n /** Zero-based row among parsed journal objects. */\n sourceRow: number\n id: string\n parent: string | null\n label: string\n /** Null when the source did not explicitly record a role. */\n role: SupervisorRunNodeRole | null\n /** Exact canonical AgentProfile digest, when the source recorded one. */\n profileDigest: string | null\n /** Exact execution runtime tag, when the source recorded one. */\n runtime: string | null\n at: number | null\n /** False when identity, parentage, label, or role was malformed. */\n valid: boolean\n invalidFields: readonly string[]\n}\n\nexport interface CloseRow {\n id: string\n kind: 'settled' | 'cancelled'\n status: string | null\n /** String verdict from flat journals, or valid/invalid for a structured verdict. */\n verdict: string | null\n /** Structured verdict validity, when recorded. */\n valid: boolean | null\n /** Structured verdict score, preserved without boolean coercion. */\n score: number | null\n /** The verdict exactly as the journal carried it. */\n rawVerdict: unknown | null\n /** Terminal failure detail exactly as recorded. */\n reason: string | null\n /** Whether Runtime classified the failure as infrastructure-caused. */\n infra: boolean | null\n at: number | null\n spend: SpendLike\n /** False when the close event carried no spend object — not \"spent nothing\". */\n hasSpend: boolean\n}\n\nexport interface WorkerLogFacts {\n /** Position in `SupervisorRunSources.workers`, retained for exact evidence paths. */\n sourceIndex: number\n workerId: string | null\n label: string\n /** `false` means the artifact was missing; a captured empty artifact is `true`. */\n inboxCaptured: boolean\n eventsCaptured: boolean\n inboxInvalidRows: number\n eventsInvalidRows: number\n started: number | null\n /** True once a `finished` event was seen — independent of whether its `at` parsed. */\n finished: boolean\n finishedAt: number | null\n passed: boolean | null\n /** Numeric score exactly as the finished event recorded it. */\n score: number | null\n /** `patchBytes` as reported by the finished event (not the patch file's size). */\n finishedPatchBytes: number | null\n evidenceBytes: number\n /** Unique queued request ids, or null when exact accounting is unavailable. */\n steersQueued: number | null\n /** Unique matched request ids acknowledged as delivered, or null when unavailable. */\n steersDelivered: number | null\n steersQueuedUnavailable: string | null\n steersDeliveredUnavailable: string | null\n questions: number\n steerRequests: SteerRequestFact[]\n steerAcknowledgements: SteerAcknowledgementFact[]\n}\n\nexport interface SteerRequestFact {\n /** Durable inbox request id; null when the row did not retain one. */\n requestId: string | null\n row: number\n}\n\nexport interface SteerAcknowledgementFact {\n /** Worker event request id; null when the event cannot be correlated. */\n requestId: string | null\n /** `null` means the acknowledgement omitted delivery status. */\n delivered: boolean | null\n row: number\n}\n\n/**\n * The tree + timeline the report is computed from, exposed because the rollout-row\n * minter needs exactly the same parse (one parser, two consumers).\n */\nexport interface SupervisorTreeFacts {\n readonly resourceRecords?: readonly ResourceSpendRecord[]\n readonly rootId: string | null\n readonly spawns: readonly SpawnRow[]\n readonly closes: readonly CloseRow[]\n readonly workerSpawns: readonly SpawnRow[]\n readonly workerCloses: readonly CloseRow[]\n readonly brain: {\n /**\n * Summed over the root's metered rows that reported a token count. A row Runtime marked\n * `tokensKnown: false` is EXCLUDED and counted in `tokensUnknownCount` instead, because\n * its `tokens` field holds a known subtotal — folding it in would price unreported work\n * at zero tokens.\n */\n tokensIn: number\n tokensOut: number\n cacheRead: number\n cacheWrite: number\n /** False when no metered event carried cache counters — not \"nothing cached\". */\n hasCache: boolean\n /** False when any folded metered row declared `cacheBreakdownKnown: false`. */\n cacheBreakdownKnown: boolean\n /** Root metered rows that reported a token count, and rows that did not. */\n tokensKnownCount: number\n tokensUnknownCount: number\n /** Summed over the root's metered rows that reported a price, on the same rule. */\n usd: number\n /** Root metered rows that reported a price, and rows Runtime marked `usdKnown: false`. */\n usdKnownCount: number\n usdUnknownCount: number\n /** Root-attributed metered events only — every row this object folded or counted. */\n meteredCount: number\n }\n readonly workerLogs: ReadonlyMap<string, WorkerLogFacts>\n /** Every worker source row, including duplicate identities that a map cannot retain. */\n readonly workerLogRows: readonly WorkerLogFacts[]\n /** Every non-empty journal line, whatever shape it turned out to have. */\n readonly journalRows: number\n /**\n * Journal lines this parser could not interpret at all: invalid JSON, non-objects, and\n * JSON objects carrying no record shape it recognizes.\n *\n * This count is what separates \"the run was empty\" from \"the input was unreadable\".\n * Zero spawns with zero invalid rows is a positive claim that nothing happened; it must\n * only ever be made about bytes the parser actually understood.\n */\n readonly journalInvalidRows: number\n /** The `journalInvalidRows` subset that was not valid JSON, or not a JSON object. */\n readonly journalMalformedJsonRows: number\n /**\n * Records recognized but deliberately not folded into the tree, counted by kind — the\n * runtime envelope's `begin` header and the `waiting` / `woken` wait-node events. Kept\n * separate from `journalInvalidRows` because these rows were understood, not rejected.\n */\n readonly journalIgnoredRowsByKind: Readonly<Record<string, number>>\n /**\n * Every metered row read, root-attributed or not. `brain.meteredCount` covers only the\n * root's own spend; a nested driver's metered rows are understood but reach this tree\n * through that driver's settled close, so this total is what keeps row accounting exact:\n * journalRows = spawns + closes + journalMeteredRows + ignored + journalInvalidRows.\n */\n readonly journalMeteredRows: number\n /** Which dialect(s) the journal's rows were actually written in. */\n readonly journalDialect: SupervisorJournalDialect\n /** Parsed once with the journal and worker artifacts. */\n readonly state: Record<string, unknown> | null\n readonly startedAt: number | null\n readonly completedAt: number | null\n /**\n * First and last stamped tree events (spawned / settled / cancelled /\n * metered) in the journal — the bounds of observed activity. They derive a\n * lower-bound wall for a store that writes no completion stamp.\n */\n readonly firstEventAt: number | null\n readonly lastEventAt: number | null\n}\n\ninterface VerdictFacts {\n label: string | null\n valid: boolean | null\n score: number | null\n raw: unknown | null\n}\n\nfunction readVerdict(v: unknown): VerdictFacts {\n if (typeof v === 'string') return { label: v, valid: null, score: null, raw: v }\n if (typeof v !== 'object' || v === null) {\n return { label: null, valid: null, score: null, raw: null }\n }\n const rec = v as Record<string, unknown>\n const valid = typeof rec.valid === 'boolean' ? rec.valid : null\n return {\n label: valid === null ? null : valid ? 'valid' : 'invalid',\n valid,\n score: typeof rec.score === 'number' && Number.isFinite(rec.score) ? rec.score : null,\n raw: v,\n }\n}\n\nexport function workerSourceKey(\n worker: NonNullable<SupervisorRunSources['workers']>[number],\n): string {\n return worker.workerId ?? worker.label\n}\n\n// ---------------------------------------------------------------------------\n// Journal dialects — the two shapes a supervision journal is actually written in.\n// ---------------------------------------------------------------------------\n\n/**\n * How a journal's rows were shaped on disk.\n *\n * `flat` — one event object per line (`{kind:'spawned', id, ...}`). Claude Code\n * and other adapters may synthesize this shape for the pure analyzer.\n *\n * `runtime-envelope` — the records `agent-runtime`'s `FileSpawnJournal` writes:\n * a `{kind:'begin', root, at}` header followed by `{kind:'event', root, event}`\n * envelopes (`agent-runtime/src/durable/spawn-journal.ts`, `appendRecord`). It is\n * the layout `createFileRunContext(dir)` produces at `<dir>/spawn-journal.jsonl`.\n * This dialect is READ, not tolerated: agent-runtime is the writer, so a reader\n * that could not interpret it was the defect, and `journalDialect` records which\n * shape the bytes actually had so an unexpected one is never invisible.\n *\n * `mixed` — rows of both shapes in one file. `none` — no interpretable row at all.\n */\nexport type SupervisorJournalDialect = 'none' | 'flat' | 'runtime-envelope' | 'mixed'\n\ntype JournalRowDialect = 'flat' | 'runtime-envelope'\n\n/** Event kinds this parser folds into the tree. */\nconst TREE_EVENT_KINDS = ['spawned', 'settled', 'cancelled', 'metered'] as const\ntype TreeEventKind = (typeof TREE_EVENT_KINDS)[number]\n\n/**\n * Event kinds `agent-runtime` journals that this parser recognizes but does not model as\n * tree nodes: `waiting` arms a wait node and `woken` settles it. They are counted by kind\n * rather than dropped, so \"understood, not modeled\" can never be mistaken for \"absent\".\n */\nconst UNMODELLED_EVENT_KINDS: readonly string[] = ['waiting', 'woken']\n\nfunction treeEventKind(value: unknown): TreeEventKind | null {\n return (TREE_EVENT_KINDS as readonly unknown[]).includes(value) ? (value as TreeEventKind) : null\n}\n\ntype JournalRowReading =\n | {\n outcome: 'event'\n dialect: JournalRowDialect\n kind: TreeEventKind\n event: JournalEvent\n }\n | { outcome: 'ignored'; dialect: JournalRowDialect; kind: string }\n | { outcome: 'unreadable' }\n\n/**\n * Classify one parsed journal row. Every row lands in exactly one outcome — interpreted,\n * recognized-but-not-modeled, or unreadable — because a row that falls through silently is\n * how a run with events reads as a run with none.\n */\nfunction readJournalRow(row: Record<string, unknown>): JournalRowReading {\n const kind = row.kind\n if (typeof kind !== 'string') return { outcome: 'unreadable' }\n\n // agent-runtime's FileSpawnJournal record header. It carries no event.\n if (kind === 'begin' && typeof row.root === 'string') {\n return { outcome: 'ignored', dialect: 'runtime-envelope', kind: 'begin' }\n }\n if (kind === 'event') {\n const inner = row.event\n if (typeof inner !== 'object' || inner === null || Array.isArray(inner)) {\n return { outcome: 'unreadable' }\n }\n const innerKind = (inner as Record<string, unknown>).kind\n if (typeof innerKind !== 'string') return { outcome: 'unreadable' }\n const tree = treeEventKind(innerKind)\n if (tree !== null) {\n return {\n outcome: 'event',\n dialect: 'runtime-envelope',\n kind: tree,\n event: inner as JournalEvent,\n }\n }\n // The envelope proves this IS a journaled event, so an unmodelled kind is recorded by\n // name rather than called unreadable — the caller sees exactly what went uncounted.\n return { outcome: 'ignored', dialect: 'runtime-envelope', kind: innerKind }\n }\n\n const tree = treeEventKind(kind)\n if (tree !== null) {\n return { outcome: 'event', dialect: 'flat', kind: tree, event: row as JournalEvent }\n }\n if (UNMODELLED_EVENT_KINDS.includes(kind)) {\n return { outcome: 'ignored', dialect: 'flat', kind }\n }\n // A bare object with an unknown `kind` could be any record at all — unlike the envelope\n // case there is no evidence it is a journal event, so it counts as unreadable (fail closed).\n return { outcome: 'unreadable' }\n}\n\nfunction summarizeDialect(seen: ReadonlySet<JournalRowDialect>): SupervisorJournalDialect {\n if (seen.size === 0) return 'none'\n if (seen.size > 1) return 'mixed'\n return seen.has('runtime-envelope') ? 'runtime-envelope' : 'flat'\n}\n\n/** One spawned event as a row; a field that is present but unusable marks the row invalid. */\nfunction spawnRowOf(\n ev: JournalEvent,\n id: string,\n sourceRow: number,\n rootId: string | null,\n): SpawnRow {\n const parent = typeof ev.parent === 'string' && ev.parent.length > 0 ? ev.parent : null\n const label = typeof ev.label === 'string' ? ev.label : ''\n const invalidFields: string[] = []\n if (id.length === 0) invalidFields.push('id')\n const parentOmittedForFirstRoot = ev.parent === undefined && rootId === null\n if (\n ev.parent !== null &&\n !parentOmittedForFirstRoot &&\n !(typeof ev.parent === 'string' && ev.parent.length > 0)\n ) {\n invalidFields.push('parent')\n }\n if (label.length === 0) invalidFields.push('label')\n if (ev.role !== undefined && ev.role !== 'supervisor' && ev.role !== 'worker') {\n invalidFields.push('role')\n }\n if (\n ev.profileDigest !== undefined &&\n !(typeof ev.profileDigest === 'string' && ev.profileDigest.length > 0)\n ) {\n invalidFields.push('profileDigest')\n }\n if (ev.runtime !== undefined && !(typeof ev.runtime === 'string' && ev.runtime.length > 0)) {\n invalidFields.push('runtime')\n }\n const role: SupervisorRunNodeRole | null =\n ev.role === 'supervisor' || ev.role === 'worker' ? ev.role : null\n const valid = invalidFields.length === 0\n if (valid && parent === null && rootId === null) rootId = id\n return {\n sourceRow,\n id,\n parent,\n label,\n role,\n profileDigest:\n typeof ev.profileDigest === 'string' && ev.profileDigest.length > 0 ? ev.profileDigest : null,\n runtime: typeof ev.runtime === 'string' && ev.runtime.length > 0 ? ev.runtime : null,\n at: ms(ev.at),\n valid,\n invalidFields,\n }\n}\n\n/** A settled event as a close row, with its verdict and spend. */\nfunction settledCloseOf(ev: JournalEvent, id: string): CloseRow {\n const verdict = readVerdict(ev.verdict)\n return {\n id,\n kind: 'settled',\n status: typeof ev.status === 'string' ? ev.status : null,\n verdict: verdict.label,\n valid: verdict.valid,\n score: verdict.score,\n rawVerdict: verdict.raw,\n reason: typeof ev.reason === 'string' ? ev.reason : null,\n infra: typeof ev.infra === 'boolean' ? ev.infra : null,\n at: ms(ev.at),\n spend: readSpend(ev.spent),\n hasSpend: asRecord(ev.spent).tokens !== undefined,\n }\n}\n\n/** A cancelled event as a close row: it carries no verdict and no spend. */\nfunction cancelledCloseOf(ev: JournalEvent, id: string): CloseRow {\n return {\n id,\n kind: 'cancelled',\n status: 'cancelled',\n verdict: typeof ev.reason === 'string' ? ev.reason : null,\n valid: null,\n score: null,\n rawVerdict: typeof ev.reason === 'string' ? ev.reason : null,\n reason: typeof ev.reason === 'string' ? ev.reason : null,\n infra: null,\n at: ms(ev.at),\n spend: {\n tokens: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n hasCache: false,\n breakdownKnown: true,\n },\n tokensKnown: true,\n usd: 0,\n usdKnown: true,\n },\n hasSpend: false,\n }\n}\n\n/** What the journal rows add up to: spawn and close rows, the root, and the rows set aside. */\ninterface JournalReading {\n spawns: SpawnRow[]\n closes: CloseRow[]\n rootId: string | null\n unreadableRows: number\n ignoredByKind: Map<string, number>\n dialectsSeen: Set<JournalRowDialect>\n resourceRecords: ResourceSpendRecord[]\n meteredRows: Array<{ id: string; spend: SpendLike; at: number | null }>\n}\n\nfunction readJournal(events: Record<string, unknown>[]): JournalReading {\n const spawns: SpawnRow[] = []\n const closes: CloseRow[] = []\n let rootId: string | null = null\n let unreadableRows = 0\n const ignoredByKind = new Map<string, number>()\n const dialectsSeen = new Set<JournalRowDialect>()\n const resourceRecords: ResourceSpendRecord[] = []\n const meteredRows: Array<{ id: string; spend: SpendLike; at: number | null }> = []\n for (const [sourceRow, row] of events.entries()) {\n const reading = readJournalRow(row)\n if (reading.outcome === 'unreadable') {\n unreadableRows += 1\n continue\n }\n dialectsSeen.add(reading.dialect)\n if (reading.outcome === 'ignored') {\n ignoredByKind.set(reading.kind, (ignoredByKind.get(reading.kind) ?? 0) + 1)\n continue\n }\n const { kind, event: ev } = reading\n const id = typeof ev.id === 'string' ? ev.id : ''\n if (kind === 'metered' || kind === 'settled' || kind === 'cancelled') {\n const field = kind === 'metered' ? 'spend' : 'spent'\n resourceRecords.push({\n nodeId: id || null,\n kind,\n source: `journal.rows[${sourceRow}].${reading.dialect === 'runtime-envelope' ? 'event.' : ''}${field}.resources`,\n resources: readResources(asRecord(kind === 'metered' ? ev.spend : ev.spent).resources),\n })\n }\n if (kind === 'spawned') {\n const spawn = spawnRowOf(ev, id, sourceRow, rootId)\n if (spawn.valid && spawn.parent === null && rootId === null) rootId = id\n spawns.push(spawn)\n } else if (kind === 'settled') {\n closes.push(settledCloseOf(ev, id))\n } else if (kind === 'cancelled') {\n closes.push(cancelledCloseOf(ev, id))\n } else if (kind === 'metered') {\n // Deferred: rows are attributed after the loop, once the root is known, so a metered\n // event that precedes the root spawn is never misattributed.\n meteredRows.push({ id, spend: readSpend(ev.spend), at: ms(ev.at) })\n } else {\n // `TREE_EVENT_KINDS` and these branches are one contract: adding a kind to the set\n // without a branch here would silently drop its rows, which is the defect this\n // accounting exists to prevent. The compiler refuses the omission.\n const unhandled: never = kind\n throw new Error(`unhandled journal event kind ${JSON.stringify(unhandled)}`)\n }\n }\n return {\n spawns,\n closes,\n rootId,\n unreadableRows,\n ignoredByKind,\n dialectsSeen,\n resourceRecords,\n meteredRows,\n }\n}\n\n/** Only root-attributed metered events are the supervisor brain's own spend. A nested driver meters under its own id; its spend reaches this tree through its settled close, so folding it into the brain here would count the same tokens twice. */\nfunction foldBrainSpend(\n meteredRows: JournalReading['meteredRows'],\n rootId: string | null,\n): SupervisorTreeFacts['brain'] {\n let brainIn = 0\n let brainOut = 0\n let brainCacheRead = 0\n let brainCacheWrite = 0\n let brainHasCache = false\n let brainCacheBreakdownKnown = true\n let brainTokensKnownCount = 0\n let brainTokensUnknownCount = 0\n let brainUsd = 0\n let brainUsdKnownCount = 0\n let brainUsdUnknownCount = 0\n let meteredCount = 0\n for (const row of meteredRows) {\n if (rootId === null || row.id !== rootId) continue\n if (row.spend.tokensKnown) {\n brainIn += row.spend.tokens.input\n brainOut += row.spend.tokens.output\n brainCacheRead += row.spend.tokens.cacheRead\n brainCacheWrite += row.spend.tokens.cacheWrite\n brainHasCache = brainHasCache || row.spend.tokens.hasCache\n brainCacheBreakdownKnown = brainCacheBreakdownKnown && row.spend.tokens.breakdownKnown\n brainTokensKnownCount += 1\n } else {\n brainTokensUnknownCount += 1\n }\n if (row.spend.usdKnown) {\n brainUsd += row.spend.usd\n brainUsdKnownCount += 1\n } else {\n brainUsdUnknownCount += 1\n }\n meteredCount += 1\n }\n return {\n tokensIn: brainIn,\n tokensOut: brainOut,\n cacheRead: brainCacheRead,\n cacheWrite: brainCacheWrite,\n hasCache: brainHasCache,\n cacheBreakdownKnown: brainCacheBreakdownKnown,\n tokensKnownCount: brainTokensKnownCount,\n tokensUnknownCount: brainTokensUnknownCount,\n usd: brainUsd,\n usdKnownCount: brainUsdKnownCount,\n usdUnknownCount: brainUsdUnknownCount,\n meteredCount,\n }\n}\n\n/** Steer counts from a worker's inbox and acknowledgements, or the reason they cannot be stated exactly. */\nfunction accountSteers(facts: WorkerLogFacts): void {\n const requestsById = new Map<string, number>()\n for (const request of facts.steerRequests) {\n if (request.requestId === null) continue\n requestsById.set(request.requestId, (requestsById.get(request.requestId) ?? 0) + 1)\n }\n const acknowledgementsById = new Map<string, SteerAcknowledgementFact[]>()\n for (const acknowledgement of facts.steerAcknowledgements) {\n if (acknowledgement.requestId === null) continue\n const matches = acknowledgementsById.get(acknowledgement.requestId) ?? []\n matches.push(acknowledgement)\n acknowledgementsById.set(acknowledgement.requestId, matches)\n }\n const queueProblems: string[] = []\n if (!facts.inboxCaptured) queueProblems.push('inbox absent')\n if (!facts.eventsCaptured) queueProblems.push('events absent')\n if (facts.inboxInvalidRows > 0) queueProblems.push('inbox contains malformed rows')\n if (facts.eventsInvalidRows > 0) queueProblems.push('events contain malformed rows')\n if (facts.steerRequests.some((request) => request.requestId === null)) {\n queueProblems.push('queued request id missing')\n }\n if ([...requestsById.values()].some((count) => count > 1)) {\n queueProblems.push('queued request id duplicated')\n }\n if (facts.steerAcknowledgements.some((acknowledgement) => acknowledgement.requestId === null)) {\n queueProblems.push('acknowledgement request id missing')\n }\n if ([...acknowledgementsById.keys()].some((id) => !requestsById.has(id))) {\n queueProblems.push('acknowledgement has no queued request')\n }\n if (queueProblems.length === 0) {\n facts.steersQueued = requestsById.size\n } else {\n facts.steersQueuedUnavailable = [...new Set(queueProblems)].join('; ')\n }\n\n const deliveryProblems = [...queueProblems]\n if ([...acknowledgementsById.values()].some((rows) => rows.length > 1)) {\n deliveryProblems.push('acknowledgement request id duplicated')\n }\n if (facts.steerAcknowledgements.some((acknowledgement) => acknowledgement.delivered === null)) {\n deliveryProblems.push('acknowledgement delivery status missing')\n }\n if (deliveryProblems.length === 0) {\n facts.steersDelivered = [...requestsById.keys()].filter((id) => {\n const acknowledgement = acknowledgementsById.get(id)\n return acknowledgement?.length === 1 && acknowledgement[0]?.delivered === true\n }).length\n } else {\n facts.steersDeliveredUnavailable = [...new Set(deliveryProblems)].join('; ')\n }\n}\n\n/** Everything one worker's inbox and event log say: timing, verdict, questions and steer accounting. */\nfunction readWorkerLog(\n w: NonNullable<SupervisorRunSources['workers']>[number],\n sourceIndex: number,\n): WorkerLogFacts {\n const facts: WorkerLogFacts = {\n sourceIndex,\n workerId: w.workerId ?? null,\n label: w.label,\n inboxCaptured: w.inbox !== null,\n eventsCaptured: w.events !== null,\n inboxInvalidRows: 0,\n eventsInvalidRows: 0,\n started: null,\n finished: false,\n finishedAt: null,\n passed: null,\n score: null,\n finishedPatchBytes: null,\n evidenceBytes: 0,\n steersQueued: null,\n steersDelivered: null,\n steersQueuedUnavailable: null,\n steersDeliveredUnavailable: null,\n questions: 0,\n steerRequests: [],\n steerAcknowledgements: [],\n }\n const parsedInbox = parseJsonlWithDiagnostics(w.inbox)\n const parsedEvents = parseJsonlWithDiagnostics(w.events)\n facts.inboxInvalidRows = parsedInbox.invalidRows\n facts.eventsInvalidRows = parsedEvents.invalidRows\n for (const [row, req] of parsedInbox.rows.entries()) {\n if (typeof req.message !== 'string' || req.message.trim().length === 0) continue\n facts.steerRequests.push({\n requestId: typeof req.id === 'string' && req.id.length > 0 ? req.id : null,\n row,\n })\n }\n for (const [row, ev] of parsedEvents.rows.entries()) {\n const kind = ev.kind\n if (kind === 'message') {\n if (ev.direction === 'up') {\n facts.questions += 1\n continue\n }\n facts.steerAcknowledgements.push({\n requestId:\n typeof ev.requestId === 'string' && ev.requestId.length > 0 ? ev.requestId : null,\n delivered: typeof ev.delivered === 'boolean' ? ev.delivered : null,\n row,\n })\n } else if (kind === 'started') {\n facts.started = ms(ev.at)\n } else if (kind === 'finished') {\n facts.finished = true\n facts.finishedAt = ms(ev.at)\n facts.passed = typeof ev.passed === 'boolean' ? ev.passed : null\n facts.score = typeof ev.score === 'number' && Number.isFinite(ev.score) ? ev.score : null\n facts.finishedPatchBytes = typeof ev.patchBytes === 'number' ? ev.patchBytes : null\n facts.evidenceBytes = typeof ev.evidence === 'string' ? ev.evidence.length : 0\n }\n }\n accountSteers(facts)\n return facts\n}\n\n/** The earliest and latest stamped event across spawns, closes and metered rows. */\nfunction eventSpan(\n spawns: SpawnRow[],\n closes: CloseRow[],\n meteredRows: JournalReading['meteredRows'],\n): { firstEventAt: number | null; lastEventAt: number | null } {\n let firstEventAt: number | null = null\n let lastEventAt: number | null = null\n const widenEventSpan = (at: number | null): void => {\n if (at === null) return\n if (firstEventAt === null || at < firstEventAt) firstEventAt = at\n if (lastEventAt === null || at > lastEventAt) lastEventAt = at\n }\n for (const spawn of spawns) widenEventSpan(spawn.at)\n for (const close of closes) widenEventSpan(close.at)\n for (const metered of meteredRows) widenEventSpan(metered.at)\n return { firstEventAt, lastEventAt }\n}\n\nexport function parseSupervisorTree(src: SupervisorRunSources): SupervisorTreeFacts {\n const parsedJournal = parseJsonlWithDiagnostics(src.journal)\n const events = parsedJournal.rows\n const state = parseJsonRecord(src.state)\n\n const {\n spawns,\n closes,\n rootId,\n unreadableRows,\n ignoredByKind,\n dialectsSeen,\n resourceRecords,\n meteredRows,\n } = readJournal(events)\n const brain = foldBrainSpend(meteredRows, rootId)\n\n const workerSpawns = spawns.filter((s) => s.valid && s.id !== rootId)\n const workerIds = new Set(workerSpawns.map((s) => s.id))\n const workerCloses = closes.filter((c) => workerIds.has(c.id))\n\n const workerLogs = new Map<string, WorkerLogFacts>()\n const workerLogRows: WorkerLogFacts[] = []\n for (const [sourceIndex, w] of (src.workers ?? []).entries()) {\n const facts = readWorkerLog(w, sourceIndex)\n workerLogRows.push(facts)\n workerLogs.set(workerSourceKey(w), facts)\n }\n\n const startedAt = ms(state?.startedAt) ?? spawns[0]?.at ?? null\n const rootClose = rootId === null ? null : closes.find((close) => close.id === rootId)\n const completedAt = ms(state?.completedAt) ?? rootClose?.at ?? null\n\n const { firstEventAt, lastEventAt } = eventSpan(spawns, closes, meteredRows)\n\n const result = parseJsonRecord(src.result)\n if (result && Object.hasOwn(result, 'spentTotal')) {\n resourceRecords.push({\n nodeId: rootId,\n kind: 'result',\n source: 'result.spentTotal.resources',\n resources: readResources(asRecord(result.spentTotal).resources),\n })\n }\n\n return {\n resourceRecords,\n rootId,\n spawns,\n closes,\n workerSpawns,\n workerCloses,\n brain,\n workerLogs,\n workerLogRows,\n journalRows: events.length + parsedJournal.invalidRows,\n journalInvalidRows: parsedJournal.invalidRows + unreadableRows,\n journalMalformedJsonRows: parsedJournal.invalidRows,\n journalIgnoredRowsByKind: Object.fromEntries(ignoredByKind),\n journalMeteredRows: meteredRows.length,\n journalDialect: summarizeDialect(dialectsSeen),\n state,\n startedAt,\n completedAt,\n firstEventAt,\n lastEventAt,\n }\n}\n\n/** A recorded non-empty string; whitespace is retained as source evidence. */\nexport function nonEmptyString(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null\n}\n\nexport function recordOrNull(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","/**\n * The run's terminal record, read from the documents the store wrote when the\n * run ended. Runtime's own record outranks every other source: `result.json` is\n * the `SupervisedResult` that `supervise()` returned, verbatim, and its `kind`\n * is the run's status. `failure.json` is the record Runtime writes when\n * `supervise()` threw before a result landed. Runtime's result and failure\n * records are the only terminal status contract; state is timing metadata.\n *\n * Pure: takes already-parsed documents and returns `Measured` values. The\n * analyzer and the rollout minter share it so a run never has two statuses.\n */\n\nimport { asRecord, nonEmptyString as str } from './source-facts'\nimport {\n type Measured,\n type SupervisorStatusSource,\n type TerminalFailure,\n unavailable,\n} from './types'\n\n/** The reason every terminal field reads `unavailable` when no store wrote one. */\nexport const NO_TERMINAL_RECORD =\n 'no terminal record: Runtime result.json kind or Runtime failure.json'\n\n/** The status reported for a run whose directory holds Runtime's failure record and no result. */\nexport const RUNTIME_FAILED_STATUS = 'failed'\n\nexport interface TerminalRecordInput {\n /** Runtime state document, parsed; null when absent. */\n readonly state: Record<string, unknown> | null\n /** Runtime `result.json`, parsed; null when absent. */\n readonly result: Record<string, unknown> | null\n /**\n * Runtime's `failure.json`, parsed. `null` when the store was read and holds\n * none; `undefined` when the store has no such document type.\n */\n readonly failure: Record<string, unknown> | null | undefined\n}\n\nexport interface TerminalRecord {\n readonly supStatus: Measured<string>\n readonly supStatusSource: Measured<SupervisorStatusSource>\n /**\n * Runtime's `reason` on a `no-winner` result. `null` when the record carries\n * none (a winner or a failure record).\n */\n readonly supReason: Measured<string | null>\n /** The recorded error. `null` when the run recorded a result and no error. */\n readonly failure: Measured<TerminalFailure | null>\n /**\n * True when the run recorded a delivered Runtime `winner`; false on every\n * other recorded terminal state; null when no terminal record exists.\n */\n readonly completed: boolean | null\n}\n\nfunction errorRecord(\n doc: Record<string, unknown>,\n source: TerminalFailure['source'],\n earlierAttempt: boolean,\n): TerminalFailure | null {\n if (typeof doc.error !== 'object' || doc.error === null) return null\n const error = asRecord(doc.error)\n return {\n source,\n name: str(error.name),\n message: str(error.message),\n at: str(doc.at),\n earlierAttempt,\n }\n}\n\nexport function readTerminalRecord(input: TerminalRecordInput): TerminalRecord {\n const { result } = input\n const resultKind = str(result?.kind)\n const settled = resultKind !== null && result !== null\n const failureRecord =\n input.failure === null || input.failure === undefined\n ? null\n : errorRecord(input.failure, 'runtime-failure', settled)\n\n if (settled) {\n // Runtime's settle record is the status. A failure record beside it is an\n // earlier attempt's throw (Runtime never writes one after a settle), kept\n // as the recorded error with `earlierAttempt` set; a `driver-failed`\n // no-winner carries its own rejection instead.\n return {\n supStatus: resultKind,\n supStatusSource: 'runtime-result',\n supReason: str(result.reason),\n failure: failureRecord ?? errorRecord(result, 'runtime-result', false),\n completed: resultKind === 'winner',\n }\n }\n\n if (failureRecord !== null) {\n return {\n supStatus: RUNTIME_FAILED_STATUS,\n supStatusSource: 'runtime-failure',\n supReason: null,\n failure: failureRecord,\n completed: false,\n }\n }\n if (input.failure !== null && input.failure !== undefined) {\n // The document exists but carries no `error` object. The run still ended in\n // a failure; only the detail is missing, and it says so.\n return {\n supStatus: RUNTIME_FAILED_STATUS,\n supStatusSource: 'runtime-failure',\n supReason: null,\n failure: unavailable('Runtime failure.json carries no error record'),\n completed: false,\n }\n }\n\n return {\n supStatus: unavailable(NO_TERMINAL_RECORD),\n supStatusSource: unavailable(NO_TERMINAL_RECORD),\n supReason: unavailable(NO_TERMINAL_RECORD),\n failure: unavailable(NO_TERMINAL_RECORD),\n completed: null,\n }\n}\n"],"mappings":"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"}
|