@tangle-network/agent-eval 0.133.0 → 0.133.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 +17 -0
- package/README.md +1 -1
- package/dist/agent-profile-cell-OhuTee9n.js +335 -0
- package/dist/agent-profile-cell-OhuTee9n.js.map +1 -0
- package/dist/{analyze-runs-BjPn_fOS.js → analyze-runs-B-afTpCv.js} +6 -19
- package/dist/analyze-runs-B-afTpCv.js.map +1 -0
- package/dist/{analyze-runs-DZr7JW-m.d.ts → analyze-runs-BmX-h_yn.d.ts} +3 -3
- package/dist/{analyze-runs-DZr7JW-m.d.ts.map → analyze-runs-BmX-h_yn.d.ts.map} +1 -1
- package/dist/{baseline-HsBvw_dk.js → baseline-DcX5hQDv.js} +2 -70
- package/dist/{baseline-HsBvw_dk.js.map → baseline-DcX5hQDv.js.map} +1 -1
- package/dist/baseline-hG3K85h4.d.ts.map +1 -1
- package/dist/benchmarks/index.d.ts +1 -1
- package/dist/benchmarks/index.js +1 -1
- package/dist/{benchmarks-DncrVrSr.js → benchmarks-CJr1H1_a.js} +3 -3
- package/dist/{benchmarks-DncrVrSr.js.map → benchmarks-CJr1H1_a.js.map} +1 -1
- package/dist/builder-eval/index.js +1 -1
- package/dist/campaign/index.d.ts +3 -3
- package/dist/campaign/index.js +2 -2
- package/dist/{campaign-CyQMCCEU.js → campaign-BJjn1rhw.js} +19 -13
- package/dist/{campaign-CyQMCCEU.js.map → campaign-BJjn1rhw.js.map} +1 -1
- package/dist/{client-D4F9hdzR.d.ts → client-COvaLoQG.d.ts} +2 -2
- package/dist/{client-D4F9hdzR.d.ts.map → client-COvaLoQG.d.ts.map} +1 -1
- package/dist/contract/index.d.ts +3 -3
- package/dist/contract/index.js +5 -5
- package/dist/control.js +1 -1
- package/dist/{eval-campaign-CYkUME2T.js → eval-campaign-DXhpZghy.js} +4 -5
- package/dist/{eval-campaign-CYkUME2T.js.map → eval-campaign-DXhpZghy.js.map} +1 -1
- package/dist/hosted/index.d.ts +1 -1
- package/dist/index-3cdlURSk.d.ts.map +1 -1
- package/dist/{index-CiP2DRCj.d.ts → index-BREtv3ZZ.d.ts} +3 -3
- package/dist/{index-CiP2DRCj.d.ts.map → index-BREtv3ZZ.d.ts.map} +1 -1
- package/dist/{index-B_eUhU9K.d.ts → index-C7Wue8R6.d.ts} +28 -5
- package/dist/{index-B_eUhU9K.d.ts.map → index-C7Wue8R6.d.ts.map} +1 -1
- package/dist/{index-BAvgST_9.d.ts → index-nhIYz9hn.d.ts} +67 -9
- package/dist/index-nhIYz9hn.d.ts.map +1 -0
- package/dist/index.d.ts +7 -7
- package/dist/index.js +25 -18
- package/dist/index.js.map +1 -1
- package/dist/ledger-core/index.d.ts +2 -2
- package/dist/ledger-core/index.js +2 -2
- package/dist/ledger-core-CPZfcrC2.js +620 -0
- package/dist/ledger-core-CPZfcrC2.js.map +1 -0
- package/dist/meta-eval/index.js +2 -2
- package/dist/{mint-D5_87M5L.js → mint-BvkwcYZU.js} +2 -2
- package/dist/{mint-D5_87M5L.js.map → mint-BvkwcYZU.js.map} +1 -1
- package/dist/openapi.json +1 -1
- package/dist/{opencode-sqlite-BGrHeDu3.js → opencode-sqlite-8r6WUfHc.js} +2 -3
- package/dist/opencode-sqlite-8r6WUfHc.js.map +1 -0
- package/dist/{paired-arms-D9D0wXj2.js → paired-arms-6XItKzd1.js} +2 -2
- package/dist/{paired-arms-D9D0wXj2.js.map → paired-arms-6XItKzd1.js.map} +1 -1
- package/dist/pipelines/index.js +2 -2
- package/dist/profile-cell.js +1 -242
- package/dist/{propose-review-control-Bqb7daEJ.js → propose-review-control-SQ-n9-We.js} +2 -2
- package/dist/{propose-review-control-Bqb7daEJ.js.map → propose-review-control-SQ-n9-We.js.map} +1 -1
- package/dist/{release-report-DfmKSIEE.d.ts → release-report-CjHWa8Ia.d.ts} +2 -2
- package/dist/{release-report-DfmKSIEE.d.ts.map → release-report-CjHWa8Ia.d.ts.map} +1 -1
- package/dist/{release-report-oWt9f2k-.js → release-report-wuilQkvK.js} +3 -3
- package/dist/{release-report-oWt9f2k-.js.map → release-report-wuilQkvK.js.map} +1 -1
- package/dist/{replay-BMR4TEYY.js → replay-CJfGLdx4.js} +3 -3
- package/dist/{replay-BMR4TEYY.js.map → replay-CJfGLdx4.js.map} +1 -1
- package/dist/reporting.d.ts +2 -2
- package/dist/reporting.js +4 -4
- package/dist/{researcher-DMimgHtN.d.ts → researcher-CbSKhK8z.d.ts} +2 -2
- package/dist/{researcher-DMimgHtN.d.ts.map → researcher-CbSKhK8z.d.ts.map} +1 -1
- package/dist/{reward-hacking-BEvjdUtD.js → reward-hacking-Dl2UBzej.js} +3 -3
- package/dist/{reward-hacking-BEvjdUtD.js.map → reward-hacking-Dl2UBzej.js.map} +1 -1
- package/dist/rl.d.ts +1 -1
- package/dist/rl.js +6 -6
- package/dist/rollout/index.js +3 -3
- package/dist/{rollout-VEo41J0N.js → rollout-CreDz__7.js} +3 -3
- package/dist/{rollout-VEo41J0N.js.map → rollout-CreDz__7.js.map} +1 -1
- package/dist/{rubric-predictive-validity-B3xmbmS1.js → rubric-predictive-validity-QG7ydk0s.js} +2 -2
- package/dist/{rubric-predictive-validity-B3xmbmS1.js.map → rubric-predictive-validity-QG7ydk0s.js.map} +1 -1
- package/dist/{run-record-CN8Zd21B.js → run-record-BIwU2wdV.js} +2 -2
- package/dist/{run-record-CN8Zd21B.js.map → run-record-BIwU2wdV.js.map} +1 -1
- package/dist/{skillopt-optimization-method-DgN7U9iR.js → skillopt-optimization-method-CF6a327Q.js} +8 -4
- package/dist/{skillopt-optimization-method-DgN7U9iR.js.map → skillopt-optimization-method-CF6a327Q.js.map} +1 -1
- package/dist/{skillopt-optimization-method-CAASpcS3.d.ts → skillopt-optimization-method-wHF5xsUv.d.ts} +2 -2
- package/dist/{skillopt-optimization-method-CAASpcS3.d.ts.map → skillopt-optimization-method-wHF5xsUv.d.ts.map} +1 -1
- package/dist/{statistics-CnnxdpOg.js → statistics-DWM_AyLe.js} +90 -76
- package/dist/statistics-DWM_AyLe.js.map +1 -0
- package/dist/statistics-DbvkkDPa.d.ts.map +1 -1
- package/dist/{summary-report-DnUcjVpV.d.ts → summary-report-CFnQgNfg.d.ts} +2 -2
- package/dist/{summary-report-DnUcjVpV.d.ts.map → summary-report-CFnQgNfg.d.ts.map} +1 -1
- package/dist/{summary-report-BNs5nmXI.js → summary-report-Ci17nIdU.js} +4 -4
- package/dist/{summary-report-BNs5nmXI.js.map → summary-report-Ci17nIdU.js.map} +1 -1
- package/dist/supervisor-run/index.js +1 -1
- package/dist/{supervisor-run-_lnTLM3z.js → supervisor-run-B7lUGoyZ.js} +2 -2
- package/dist/{supervisor-run-_lnTLM3z.js.map → supervisor-run-B7lUGoyZ.js.map} +1 -1
- package/dist/traces.js +1 -1
- package/package.json +1 -1
- package/dist/analyze-runs-BjPn_fOS.js.map +0 -1
- package/dist/index-BAvgST_9.d.ts.map +0 -1
- package/dist/ledger-core-eqaI3PCD.js +0 -388
- package/dist/ledger-core-eqaI3PCD.js.map +0 -1
- package/dist/opencode-sqlite-BGrHeDu3.js.map +0 -1
- package/dist/pre-registration-DakwTRXk.js +0 -96
- package/dist/pre-registration-DakwTRXk.js.map +0 -1
- package/dist/profile-cell.js.map +0 -1
- package/dist/statistics-CnnxdpOg.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supervisor-run-_lnTLM3z.js","names":[],"sources":["../src/supervisor-run/types.ts","../src/supervisor-run/analyze.ts","../src/supervisor-run/claude-code-reader.ts","../src/supervisor-run/render.ts","../src/supervisor-run/loops-reader.ts","../src/supervisor-run/rollout-nodes.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 } from '../rollout/schema'\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/** One worker's logs, as read. `null` = the artifact did not exist. */\nexport interface WorkerLogSource {\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 /** 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 * loops-shaped 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 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 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 * (an on-disk loops run, an object-store archive, a database, a test fixture)\n * is a valid source; `loopsSupervisorRunReader` 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 /** Supervision journal — spawned / settled / cancelled / metered events (JSONL). */\n readonly journal: string | null\n /** Per-brain-call tap (JSONL): finish_reason, completion tokens, requested max tokens. */\n readonly brainLog: string | null\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 /** Run result document (JSON). */\n readonly result: 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 * 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. Undefined lets the rollout\n * minter fall back to the loops layout (`<supRunDir>/journal.jsonl`); any\n * other store must say, or the row points at a path that never existed.\n */\n readonly rootTranscriptRef?: string | 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 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 /** Worker spawns issued after the first settlement — the retry/respawn tail. */\n readonly respawns: Measured<number>\n /** Labels spawned more than once (a literal retry of the same subtask). */\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 /** 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 /** Worker verified its own work green AND produced a patch. */\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 /** Settlements the brain observed before issuing its next spawn (evidence→respawn). */\n readonly observeThenRespawn: Measured<number>\n /** Respawns with no settled evidence 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 readonly worker: string\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}\n\nexport interface WallDistribution {\n readonly n: number\n readonly min: number\n readonly p50: number\n readonly p90: number\n readonly max: number\n readonly sum: number\n}\n\nexport interface EconomicsMetrics {\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 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\nexport interface OutcomeMetrics {\n readonly supStatus: Measured<string>\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 generatedAt: string\n readonly orchestration: OrchestrationMetrics\n readonly decision: DecisionMetrics\n readonly economics: EconomicsMetrics\n readonly outcome: OutcomeMetrics\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 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 readonly usdTotal: Measured<number>\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'`; every spawned worker carries `role: 'worker'`\n * with the root as its parent.\n */\nexport interface SupervisorRunTree {\n readonly rootId: string | null\n readonly nodes: readonly RolloutLine[]\n /** Why a node could not be recovered, in read order. */\n readonly gaps: readonly string[]\n}\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 * (`loops-reader.ts` is one).\n */\n\nimport {\n type DecisionMetrics,\n type EconomicsMetrics,\n isUnavailable,\n type Measured,\n type OrchestrationMetrics,\n type OutcomeMetrics,\n type PatchStats,\n type PerWorkerRow,\n type RollupCellRow,\n type SteerBreakdown,\n SUPERVISOR_RUN_ROLLUP_SCHEMA,\n SUPERVISOR_RUN_SCHEMA,\n type SupervisorRunReport,\n type SupervisorRunRollup,\n type SupervisorRunSources,\n type Unavailable,\n unavailable,\n} from './types'\n\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 status?: unknown\n verdict?: unknown\n reason?: 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\ninterface SpendLike {\n tokens: Tokens\n usd: number\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 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 },\n usd: num(rec.usd),\n }\n}\n\nconst NO_CACHE_COUNTERS = 'the journal carries no cache-token counters for this role'\n\nexport function parseJsonl(text: string | null): Record<string, unknown>[] {\n if (text === null) return []\n const out: Record<string, unknown>[] = []\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) out.push(parsed as Record<string, unknown>)\n } catch {\n // A torn last line (writer killed mid-append) is skipped, never fatal.\n }\n }\n return out\n}\n\nexport function parseJson(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 id: string\n parent: string | null\n label: string\n at: number | null\n}\n\nexport interface CloseRow {\n id: string\n kind: 'settled' | 'cancelled'\n status: string | null\n verdict: string | 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 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 /** `patchBytes` as reported by the finished event (not the patch file's size). */\n finishedPatchBytes: number | null\n evidenceBytes: number\n steersQueued: number\n steersDelivered: number\n questions: 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 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 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 usd: number\n meteredCount: number\n }\n readonly workerLogs: ReadonlyMap<string, WorkerLogFacts>\n readonly startedAt: number | null\n readonly completedAt: number | null\n}\n\nexport function parseSupervisorTree(src: SupervisorRunSources): SupervisorTreeFacts {\n const events = parseJsonl(src.journal)\n const state = parseJson(src.state)\n\n const spawns: SpawnRow[] = []\n const closes: CloseRow[] = []\n let brainIn = 0\n let brainOut = 0\n let brainCacheRead = 0\n let brainCacheWrite = 0\n let brainHasCache = false\n let brainUsd = 0\n let meteredCount = 0\n let rootId: string | null = null\n for (const ev of events as JournalEvent[]) {\n const kind = typeof ev.kind === 'string' ? ev.kind : ''\n const id = typeof ev.id === 'string' ? ev.id : ''\n if (kind === 'spawned') {\n const parent = typeof ev.parent === 'string' ? ev.parent : null\n const label = typeof ev.label === 'string' ? ev.label : ''\n if (parent === null && rootId === null) rootId = id\n spawns.push({ id, parent, label, at: ms(ev.at) })\n } else if (kind === 'settled') {\n closes.push({\n id,\n kind: 'settled',\n status: typeof ev.status === 'string' ? ev.status : null,\n verdict: typeof ev.verdict === 'string' ? ev.verdict : null,\n at: ms(ev.at),\n spend: readSpend(ev.spent),\n hasSpend: asRecord(ev.spent).tokens !== undefined,\n })\n } else if (kind === 'cancelled') {\n closes.push({\n id,\n kind: 'cancelled',\n status: 'cancelled',\n verdict: typeof ev.reason === 'string' ? ev.reason : null,\n at: ms(ev.at),\n spend: {\n tokens: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, hasCache: false },\n usd: 0,\n },\n hasSpend: false,\n })\n } else if (kind === 'metered') {\n const s = readSpend(ev.spend)\n brainIn += s.tokens.input\n brainOut += s.tokens.output\n brainCacheRead += s.tokens.cacheRead\n brainCacheWrite += s.tokens.cacheWrite\n brainHasCache = brainHasCache || s.tokens.hasCache\n brainUsd += s.usd\n meteredCount += 1\n }\n }\n\n const workerSpawns = spawns.filter((s) => 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 for (const w of src.workers ?? []) {\n const facts: WorkerLogFacts = {\n started: null,\n finished: false,\n finishedAt: null,\n passed: null,\n finishedPatchBytes: null,\n evidenceBytes: 0,\n steersQueued: 0,\n steersDelivered: 0,\n questions: 0,\n }\n for (const req of parseJsonl(w.inbox)) {\n if (typeof req.message === 'string' && req.message.trim().length > 0) facts.steersQueued += 1\n }\n for (const ev of parseJsonl(w.events)) {\n const kind = ev.kind\n if (kind === 'message') {\n if (ev.direction === 'up') {\n facts.questions += 1\n continue\n }\n // A down-leg message not backed by an inbox line (in-process steer) still counts.\n if (typeof ev.requestId !== 'string') facts.steersQueued += 1\n if (ev.delivered === true) facts.steersDelivered += 1\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.finishedPatchBytes = typeof ev.patchBytes === 'number' ? ev.patchBytes : null\n facts.evidenceBytes = typeof ev.evidence === 'string' ? ev.evidence.length : 0\n }\n }\n workerLogs.set(w.label, facts)\n }\n\n const startedAt = ms(state?.startedAt) ?? spawns[0]?.at ?? null\n const completedAt =\n ms(state?.completedAt) ??\n [...spawns.map((s) => s.at), ...closes.map((c) => c.at)].reduce<number | null>(\n (acc, t) => (t === null ? acc : acc === null ? t : Math.max(acc, t)),\n null,\n )\n\n return {\n rootId,\n spawns,\n closes,\n workerSpawns,\n workerCloses,\n brain: {\n tokensIn: brainIn,\n tokensOut: brainOut,\n cacheRead: brainCacheRead,\n cacheWrite: brainCacheWrite,\n hasCache: brainHasCache,\n usd: brainUsd,\n meteredCount,\n },\n workerLogs,\n startedAt,\n completedAt,\n }\n}\n\n// ---------------------------------------------------------------------------\n// The analyzer.\n// ---------------------------------------------------------------------------\n\n/**\n * Analyze already-read supervisor-run bytes. Pure and synchronous: same bytes\n * in, same report out (modulo `generatedAt`, which `now` pins in tests).\n */\nexport function analyzeSupervisorRunSources(\n src: SupervisorRunSources,\n now: () => number = Date.now,\n): SupervisorRunReport {\n const gaps: string[] = []\n const gap = (what: string, reason: string): Unavailable => {\n gaps.push(`${what}: ${reason}`)\n return unavailable(reason)\n }\n\n const journalMissing =\n src.supRunDir === null\n ? 'no supervisor run dir under <ws>/.loops/supervisor'\n : 'journal.jsonl absent'\n const haveJournal = src.journal !== null\n const state = parseJson(src.state)\n const result = parseJson(src.result)\n const judge = parseJson(src.judge)\n const tree = parseSupervisorTree(src)\n const { rootId, workerSpawns, workerCloses, startedAt, completedAt } = tree\n\n const supervisorWallMs: Measured<number> =\n startedAt !== null && completedAt !== null && completedAt >= startedAt\n ? completedAt - startedAt\n : !haveJournal\n ? gap('supervisorWallMs', journalMissing)\n : gap('supervisorWallMs', 'no parseable start/complete timestamps in state.json or journal')\n\n // ── steers (worker inbox + control events) ─────────────────────────────\n const steerRows: SteerBreakdown[] = []\n let steerQueuedTotal = 0\n let steerDeliveredTotal = 0\n let upLegMessages = 0\n if (src.workers !== null) {\n for (const w of src.workers) {\n const facts = tree.workerLogs.get(w.label)\n const queued = facts?.steersQueued ?? 0\n const delivered = facts?.steersDelivered ?? 0\n upLegMessages += facts?.questions ?? 0\n steerRows.push({ worker: w.label, queued, delivered })\n steerQueuedTotal += queued\n steerDeliveredTotal += delivered\n }\n }\n const workersGapReason = src.workersMissingReason ?? 'workers/ directory absent'\n const steers: Measured<number> =\n src.workers === null ? gap('steers', workersGapReason) : steerQueuedTotal\n const steersDelivered: Measured<number> =\n src.workers === null ? unavailable(workersGapReason) : steerDeliveredTotal\n const steersByWorker: Measured<readonly SteerBreakdown[]> =\n src.workers === null ? unavailable(workersGapReason) : steerRows\n\n // The `[driver] registered tools: …supervisor_steer…` banner names the verb without\n // invoking it, so banner lines are subtracted from the raw mention count.\n const driverSteerCalls: Measured<number> =\n src.driverLog === null\n ? gap('driverSteerCalls', 'driver.log absent')\n : Math.max(\n 0,\n (src.driverLog.match(/supervisor_steer/g) ?? []).length -\n registrationMentions(src.driverLog),\n )\n\n // ── waves / concurrency / idle ─────────────────────────────────────────\n const timeline: { at: number; delta: 1 | -1 }[] = []\n for (const s of workerSpawns) if (s.at !== null) timeline.push({ at: s.at, delta: 1 })\n for (const c of workerCloses) if (c.at !== null) timeline.push({ at: c.at, delta: -1 })\n timeline.sort((a, b) => a.at - b.at || a.delta - b.delta)\n\n let waves = 0\n const waveSizes: number[] = []\n let closedSinceWaveStart = true\n for (const step of timeline) {\n if (step.delta === 1) {\n if (closedSinceWaveStart) {\n waves += 1\n waveSizes.push(0)\n closedSinceWaveStart = false\n }\n waveSizes[waveSizes.length - 1] = (waveSizes[waveSizes.length - 1] ?? 0) + 1\n } else {\n closedSinceWaveStart = true\n }\n }\n\n let live = 0\n let maxConcurrency = 0\n let idleMs = 0\n let sumWorkerWallMs = 0\n let prev = startedAt\n for (const step of timeline) {\n if (prev !== null && step.at >= prev) {\n const span = step.at - prev\n if (live === 0) idleMs += span\n sumWorkerWallMs += span * live\n }\n live += step.delta\n if (live > maxConcurrency) maxConcurrency = live\n prev = step.at\n }\n if (prev !== null && completedAt !== null && completedAt >= prev) {\n const span = completedAt - prev\n if (live === 0) idleMs += span\n sumWorkerWallMs += span * live\n }\n\n const firstWorkerSpawnAt = workerSpawns.reduce<number | null>(\n (acc, s) => (s.at === null ? acc : acc === null ? s.at : Math.min(acc, s.at)),\n null,\n )\n const firstSettleAt = workerCloses.reduce<number | null>(\n (acc, c) => (c.at === null ? acc : acc === null ? c.at : Math.min(acc, c.at)),\n null,\n )\n const respawns =\n firstSettleAt === null\n ? 0\n : workerSpawns.filter((s) => s.at !== null && s.at > firstSettleAt).length\n\n const labelCounts = new Map<string, number>()\n for (const s of workerSpawns) labelCounts.set(s.label, (labelCounts.get(s.label) ?? 0) + 1)\n const repeatedLabels = [...labelCounts.entries()].filter(([, n]) => n > 1).map(([l]) => l)\n\n const parentOf = new Map(tree.spawns.map((s) => [s.id, s.parent]))\n let delegationDepth = 0\n for (const s of workerSpawns) {\n let d = 0\n let cur: string | null = s.id\n const seen = new Set<string>()\n while (cur !== null && cur !== rootId && !seen.has(cur)) {\n seen.add(cur)\n d += 1\n cur = parentOf.get(cur) ?? null\n }\n if (d > delegationDepth) delegationDepth = d\n }\n\n const orchestration: OrchestrationMetrics = {\n workersSpawned: haveJournal ? workerSpawns.length : gap('workersSpawned', journalMissing),\n workersSettled: haveJournal\n ? workerCloses.filter((c) => c.kind === 'settled').length\n : unavailable(journalMissing),\n workersCancelled: haveJournal\n ? workerCloses.filter((c) => c.kind === 'cancelled').length\n : unavailable(journalMissing),\n steers,\n steersDelivered,\n steersByWorker,\n driverSteerCalls,\n waves: haveJournal ? waves : unavailable(journalMissing),\n waveSizes: haveJournal ? waveSizes : unavailable(journalMissing),\n maxConcurrency: haveJournal ? maxConcurrency : unavailable(journalMissing),\n respawns: haveJournal ? respawns : unavailable(journalMissing),\n repeatedLabels: haveJournal ? repeatedLabels : unavailable(journalMissing),\n delegationDepth: haveJournal ? delegationDepth : unavailable(journalMissing),\n timeToFirstSpawnMs:\n startedAt !== null && firstWorkerSpawnAt !== null\n ? firstWorkerSpawnAt - startedAt\n : haveJournal\n ? unavailable('no worker spawn timestamps')\n : unavailable(journalMissing),\n supervisorWallMs,\n idleMs: isUnavailable(supervisorWallMs) ? unavailable(supervisorWallMs.unavailable) : idleMs,\n idlePct:\n isUnavailable(supervisorWallMs) || supervisorWallMs === 0\n ? isUnavailable(supervisorWallMs)\n ? unavailable(supervisorWallMs.unavailable)\n : unavailable('supervisor wall is 0ms')\n : round((idleMs / supervisorWallMs) * 100, 1),\n workerUtilization:\n isUnavailable(supervisorWallMs) || supervisorWallMs === 0\n ? isUnavailable(supervisorWallMs)\n ? unavailable(supervisorWallMs.unavailable)\n : unavailable('supervisor wall is 0ms')\n : round(sumWorkerWallMs / supervisorWallMs, 3),\n }\n\n // ── decision quality ───────────────────────────────────────────────────\n const settledByStatus: Record<string, number> = {}\n const settledVerdicts: Record<string, number> = {}\n for (const c of workerCloses) {\n const key = c.status ?? 'unknown'\n settledByStatus[key] = (settledByStatus[key] ?? 0) + 1\n if (c.verdict !== null) settledVerdicts[c.verdict] = (settledVerdicts[c.verdict] ?? 0) + 1\n }\n\n // A store with no verify step never says pass or fail. Counting its silent\n // workers as `rejected: 0 / accepted: 0` would read as \"nothing was accepted\".\n const verdictLimit = src.limits.workerVerdicts\n let accepted = 0\n let rejected = 0\n let emptyPass = 0\n let evidenceBytes = 0\n for (const w of src.workers ?? []) {\n const f = tree.workerLogs.get(w.label)\n if (f === undefined || !f.finished) continue\n evidenceBytes += f.evidenceBytes\n if (f.passed === true) {\n if ((f.finishedPatchBytes ?? 0) > 0) accepted += 1\n else emptyPass += 1\n } else if (f.passed === false) rejected += 1\n }\n\n // Evidence→respawn: for each worker spawn issued after some settlement, did a\n // settlement land strictly between the previous spawn and this one?\n let observeThenRespawn = 0\n let respawnWithoutEvidence = 0\n const spawnTimes = workerSpawns\n .map((s) => s.at)\n .filter((t): t is number => t !== null)\n .sort((a, b) => a - b)\n const closeTimes = workerCloses\n .map((c) => c.at)\n .filter((t): t is number => t !== null)\n .sort((a, b) => a - b)\n for (let i = 1; i < spawnTimes.length; i += 1) {\n const prevSpawn = spawnTimes[i - 1] as number\n const thisSpawn = spawnTimes[i] as number\n const sawEvidence = closeTimes.some((t) => t >= prevSpawn && t <= thisSpawn)\n if (firstSettleAt !== null && thisSpawn > firstSettleAt) {\n if (sawEvidence) observeThenRespawn += 1\n else respawnWithoutEvidence += 1\n }\n }\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:\n verdictLimit !== null\n ? unavailable(verdictLimit)\n : src.workers === null\n ? unavailable(workersGapReason)\n : rejected,\n emptyPass:\n verdictLimit !== null || src.limits.deliverables !== null\n ? unavailable(verdictLimit ?? (src.limits.deliverables as string))\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 ? unavailable(workersGapReason) : steerQueuedTotal + upLegMessages,\n workerEvidenceBytes: src.workers === null ? unavailable(workersGapReason) : evidenceBytes,\n }\n\n // ── economics ──────────────────────────────────────────────────────────\n const journalWorkerIn = workerCloses.reduce((a, c) => a + c.spend.tokens.input, 0)\n const journalWorkerOut = workerCloses.reduce((a, c) => a + c.spend.tokens.output, 0)\n const journalWorkerUsd = workerCloses.reduce((a, c) => a + c.spend.usd, 0)\n const labelById = new Map(tree.workerSpawns.map((s) => [s.id, s.label]))\n const workerUsdByLabel = new Map<string, number>()\n for (const c of workerCloses) {\n const label = labelById.get(c.id)\n if (label === undefined) continue\n workerUsdByLabel.set(label, (workerUsdByLabel.get(label) ?? 0) + c.spend.usd)\n }\n const sq = src.harnessWorkerTokens\n const harnessGapReason =\n src.harnessMissingReason ?? 'harness session store unavailable and journal settled spend is 0'\n const workerIn: Measured<number> =\n sq !== null\n ? journalWorkerIn + sq.input\n : journalWorkerIn > 0\n ? journalWorkerIn\n : gap('workers.tokensIn', harnessGapReason)\n const workerOut: Measured<number> =\n sq !== null\n ? journalWorkerOut + sq.output\n : journalWorkerOut > 0\n ? journalWorkerOut\n : unavailable(harnessGapReason)\n\n const stateResult = asRecord(state?.result)\n const stateUsd = typeof stateResult.spentUsd === 'number' ? stateResult.spentUsd : null\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 const totalUsd: Measured<number> =\n usdLimit !== null\n ? gap('totalUsd', usdLimit)\n : stateUsd !== null\n ? round(stateUsd, 6)\n : haveJournal\n ? round(tree.brain.usd + journalWorkerUsd, 6)\n : gap('totalUsd', journalMissing)\n\n const perWorker: PerWorkerRow[] = (src.workers ?? []).map((w) => {\n const f = tree.workerLogs.get(w.label)\n return {\n worker: w.label,\n wallMs: f?.started != null && f.finishedAt != null ? f.finishedAt - f.started : null,\n tokensIn: w.tokensIn ?? null,\n tokensOut: w.tokensOut ?? null,\n usd: usdLimit !== null ? null : (workerUsdByLabel.get(w.label) ?? null),\n patchBytes: w.patchBytes ?? f?.finishedPatchBytes ?? null,\n passed: f?.passed ?? null,\n }\n })\n const walls = perWorker\n .map((w) => w.wallMs)\n .filter((w): w is number => w !== null)\n .sort((a, b) => a - b)\n\n const brainCalls = parseJsonl(src.brainLog)\n const economics: EconomicsMetrics = {\n brain: {\n tokensIn: haveJournal ? tree.brain.tokensIn : gap('brain.tokensIn', journalMissing),\n tokensOut: haveJournal ? tree.brain.tokensOut : unavailable(journalMissing),\n usd:\n usdLimit !== null\n ? unavailable(usdLimit)\n : haveJournal\n ? round(tree.brain.usd, 6)\n : unavailable(journalMissing),\n cacheRead: !haveJournal\n ? unavailable(journalMissing)\n : tree.brain.hasCache\n ? tree.brain.cacheRead\n : unavailable(NO_CACHE_COUNTERS),\n cacheWrite: !haveJournal\n ? unavailable(journalMissing)\n : tree.brain.hasCache\n ? tree.brain.cacheWrite\n : unavailable(NO_CACHE_COUNTERS),\n source: haveJournal\n ? `journal metered events (n=${tree.brain.meteredCount})`\n : journalMissing,\n },\n brainTruncations:\n src.brainLog === null\n ? gap(\n 'brain.brainTruncations',\n src.supRunDir === null\n ? 'no supervisor run dir under <ws>/.loops/supervisor'\n : 'brain.jsonl absent — loops predates the brain-call tap, so truncation cannot be ruled out',\n )\n : brainCalls.filter((c) => c.finish_reason === 'length').length,\n workers: {\n tokensIn: workerIn,\n tokensOut: workerOut,\n cacheRead: sq?.cacheRead !== undefined ? sq.cacheRead : unavailable(NO_CACHE_COUNTERS),\n cacheWrite: sq?.cacheWrite !== undefined ? sq.cacheWrite : unavailable(NO_CACHE_COUNTERS),\n usd:\n usdLimit !== null\n ? unavailable(usdLimit)\n : haveJournal\n ? round(journalWorkerUsd, 6)\n : unavailable(journalMissing),\n source:\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 totalUsd,\n totalUsdSource:\n usdLimit !== null\n ? usdLimit\n : stateUsd !== null\n ? `state.json result.spentUsd${journalWorkerUsd === 0 ? ' — brain-priced only; worker CLI inference is unpriced (see worker token counts)' : ''}`\n : haveJournal\n ? 'journal metered + settled usd'\n : journalMissing,\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 walls.length === 0\n ? unavailable(\n src.workers === null ? workersGapReason : 'no worker start/finish pairs captured',\n )\n : {\n n: walls.length,\n min: walls[0] as number,\n p50: quantile(walls, 0.5),\n p90: quantile(walls, 0.9),\n max: walls[walls.length - 1] as number,\n sum: walls.reduce((a, b) => a + b, 0),\n },\n perWorker: src.workers === null ? unavailable(workersGapReason) : perWorker,\n }\n\n // ── outcome ────────────────────────────────────────────────────────────\n const patchStats: Measured<PatchStats> =\n src.patch === null\n ? gap('patch', src.limits.deliverables ?? 'delivered patch file absent')\n : parsePatch(src.patch)\n\n const outcome: OutcomeMetrics = {\n supStatus:\n pickString(state, 'status') ??\n pickString(result, 'sup_status') ??\n gap('supStatus', 'no state.json / result.json status'),\n supVerdict:\n pickString(state, 'verdict') ??\n pickString(result, 'sup_verdict') ??\n unavailable('no state.json / result.json verdict'),\n delivered:\n typeof stateResult.delivered === 'boolean'\n ? stateResult.delivered\n : typeof result?.delivered === 'boolean'\n ? result.delivered\n : unavailable('no delivered flag in state.json or result.json'),\n judgeResolved:\n judge === null\n ? gap('judge', 'judge.json absent')\n : typeof judge.resolved === 'boolean'\n ? judge.resolved\n : null,\n judgeScore:\n judge === null\n ? unavailable('judge.json absent')\n : typeof judge.score === 'number'\n ? judge.score\n : null,\n judgePassed:\n judge === null\n ? unavailable('judge.json absent')\n : typeof judge.passed === 'number'\n ? judge.passed\n : null,\n judgeTotal:\n judge === null\n ? unavailable('judge.json absent')\n : typeof judge.total === 'number'\n ? judge.total\n : null,\n verifyPass:\n typeof result?.verify_pass === 'boolean'\n ? result.verify_pass\n : gap('verifyPass', 'result.json absent or has no verify_pass'),\n verifyRc:\n typeof result?.verify_rc === 'number'\n ? result.verify_rc\n : unavailable('result.json absent or has no verify_rc'),\n patch: patchStats,\n judgeSource: src.judgeSource,\n }\n\n return {\n schema: SUPERVISOR_RUN_SCHEMA,\n runRef: src.runRef,\n instanceId: src.instanceId,\n arm: src.arm,\n supervisorId: rootId !== null ? rootId : unavailable(journalMissing),\n generatedAt: new Date(now()).toISOString(),\n orchestration,\n decision,\n economics,\n outcome,\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/** `[driver] registered tools: …supervisor_steer…` is a banner, not an invocation. */\nfunction registrationMentions(driverLog: string): number {\n let n = 0\n for (const line of driverLog.split('\\n')) {\n if (line.includes('registered tools:') && line.includes('supervisor_steer')) n += 1\n }\n return n\n}\n\nfunction pickString(rec: Record<string, unknown> | null, key: string): string | null {\n const v = rec?.[key]\n return typeof v === 'string' ? v : null\n}\n\nexport function round(v: number, digits: number): number {\n const f = 10 ** digits\n return Math.round(v * f) / f\n}\n\nfunction quantile(sorted: readonly number[], q: number): number {\n if (sorted.length === 0) return 0\n const idx = Math.min(sorted.length - 1, Math.max(0, Math.ceil(q * sorted.length) - 1))\n return sorted[idx] as number\n}\n\n/** Unified-diff stats. Counts `+++ b/<path>` targets, body +/- lines, and test-file touches. */\nexport function parsePatch(text: string): PatchStats {\n const files = new Set<string>()\n const testFiles = new Set<string>()\n let added = 0\n let removed = 0\n for (const line of text.split('\\n')) {\n if (line.startsWith('+++ ')) {\n const p = line.slice(4).trim().replace(/^b\\//, '')\n if (p !== '/dev/null') {\n files.add(p)\n if (isTestPath(p)) testFiles.add(p)\n }\n continue\n }\n if (line.startsWith('--- ') || line.startsWith('diff --git') || line.startsWith('index ')) {\n continue\n }\n if (line.startsWith('+')) added += 1\n else if (line.startsWith('-')) removed += 1\n }\n return {\n files: files.size,\n linesAdded: added,\n linesRemoved: removed,\n testFilesTouched: [...testFiles].sort(),\n }\n}\n\nfunction isTestPath(p: string): boolean {\n const base = p.split('/').pop() ?? p\n return (\n /(^|\\/)(tests?|__tests__|testing|spec)(\\/|$)/.test(p) ||\n /\\.(test|spec)\\.[cm]?[jt]sx?$/.test(base) ||\n /^test_.*\\.py$/.test(base) ||\n /_test\\.py$/.test(base)\n )\n}\n\n// ---------------------------------------------------------------------------\n// Rollup across runs.\n// ---------------------------------------------------------------------------\n\n/**\n * Aggregate many supervisor-run reports. A metric no run could measure stays\n * `unavailable` rather than becoming a 0-valued mean, and cells whose steer\n * count was unavailable are counted separately from cells that measured zero.\n */\nexport function rollupSupervisorRuns(reports: readonly SupervisorRunReport[]): SupervisorRunRollup {\n const known = <T>(vals: readonly Measured<T>[]): T[] =>\n vals.filter((v): v is T => !isUnavailable(v))\n const steerVals = known(reports.map((r) => r.orchestration.steers))\n const waveVals = known(reports.map((r) => r.orchestration.waves))\n const concVals = known(reports.map((r) => r.orchestration.maxConcurrency))\n const utilVals = known(reports.map((r) => r.orchestration.workerUtilization))\n const idleVals = known(reports.map((r) => r.orchestration.idlePct))\n const spawnVals = known(reports.map((r) => r.orchestration.workersSpawned))\n const acceptVals = known(reports.map((r) => r.decision.accepted))\n const usdVals = known(reports.map((r) => r.economics.totalUsd))\n const resolvedVals = known(reports.map((r) => r.outcome.judgeResolved))\n const sum = (xs: readonly number[]): number => xs.reduce((a, b) => a + b, 0)\n const mean = (xs: readonly number[]): Measured<number> =>\n xs.length === 0 ? unavailable('no cell reported this metric') : round(sum(xs) / xs.length, 3)\n\n const perCell: RollupCellRow[] = reports.map((r) => ({\n instanceId: r.instanceId,\n arm: r.arm,\n steers: r.orchestration.steers,\n waves: r.orchestration.waves,\n utilization: r.orchestration.workerUtilization,\n idlePct: r.orchestration.idlePct,\n resolved: r.outcome.judgeResolved,\n usd: r.economics.totalUsd,\n }))\n\n return {\n schema: SUPERVISOR_RUN_ROLLUP_SCHEMA,\n cells: reports.length,\n steersTotal:\n steerVals.length === 0 ? unavailable('no cell reported a steer count') : sum(steerVals),\n cellsWithSteers:\n steerVals.length === 0\n ? unavailable('no cell reported a steer count')\n : steerVals.filter((n) => n > 0).length,\n cellsWithUnavailableSteers: reports.filter((r) => isUnavailable(r.orchestration.steers)).length,\n wavesMean: mean(waveVals),\n maxConcurrencyMax:\n concVals.length === 0 ? unavailable('no cell reported concurrency') : Math.max(...concVals),\n utilizationMean: mean(utilVals),\n idlePctMean: mean(idleVals),\n workersSpawnedTotal:\n spawnVals.length === 0 ? unavailable('no cell reported spawns') : sum(spawnVals),\n acceptedTotal:\n acceptVals.length === 0 ? unavailable('no cell reported acceptance') : sum(acceptVals),\n usdTotal: usdVals.length === 0 ? unavailable('no cell reported spend') : round(sum(usdVals), 6),\n resolvedCount:\n resolvedVals.length === 0\n ? unavailable('no cell reported a judge verdict')\n : resolvedVals.filter((v) => v === true).length,\n perCell,\n }\n}\n","/**\n * Supervision-tree reader over a THIRD-PARTY harness: Claude Code.\n *\n * `loops-reader.ts` reads a supervisor we wrote, whose journal was designed\n * for this analysis. This reader reads a harness we do not control, whose\n * transcript was designed for replaying a chat — and recovers the same tree\n * from it. If both produce a `SupervisorRunSources`, the tree model is a\n * property of multi-agent runs, not of our journal format.\n *\n * ## Where the tree hides in a Claude Code transcript\n *\n * | Tree fact | Claude Code evidence |\n * |---|---|\n * | spawn | assistant `tool_use` (`Agent` / `Task`), answered by a `tool_result` whose `toolUseResult.agentId` names the child |\n * | settle | a `<task-notification>` block in a later user line: `<task-id>` = agentId, `<status>` |\n * | steer | assistant `tool_use` (`SendMessage`) with `input.to` = agentId — mid-task, to a LIVE child |\n * | delivered | that steer's `tool_result` carrying `success` / `resumedAgentId` |\n * | cancel | assistant `tool_use` (`TaskStop`) targeting an agentId |\n * | brain spend| `message.usage` on the main thread's assistant lines |\n * | worker spend| `message.usage` inside `<session>/subagents/agent-<id>.jsonl` |\n * | depth | a child transcript that itself contains `Agent` tool_use lines |\n *\n * Every one of those is read through `parseClaudeEntries` — the SAME line\n * parser `src/rollout/readers/claude-jsonl.ts` uses for solo rollouts. There\n * is no second transcript parser.\n *\n * ## What Claude Code cannot say\n *\n * It records tokens but never a price, runs no per-worker verify, and keeps no\n * per-worker patch. Those are declared once in `limits`, so the analyzer\n * reports `unavailable — <reason>` instead of the $0 / 0-accepted that summing\n * an empty field would produce. See `SourceLimits`.\n *\n * ## Metric coverage vs the loops journal\n *\n * Measured on a real 52-agent session (fixture:\n * `tests/fixtures/supervisor-run/claude-code-session-*`).\n *\n * | Metric | loops | Claude Code | Why |\n * |---|---|---|---|\n * | workersSpawned / Settled / Cancelled | full | full | spawn tool_use + task-notification + TaskStop |\n * | steers / steersDelivered / steersByWorker | full | full | `SendMessage`; delivery from its tool_result |\n * | waves / waveSizes / maxConcurrency | full | full | derived from spawn/settle instants |\n * | respawns / repeatedLabels | full | full | same derivation |\n * | delegationDepth | full | full | a child transcript's own spawn calls |\n * | timeToFirstSpawn / supervisorWall | full | full | transcript instants |\n * | idleMs / idlePct / workerUtilization | full | PARTIAL | an agent that never notifies is counted live to the end of the transcript |\n * | observeThenRespawn / respawnWithoutEvidence | full | full | ordering of spawn vs settle instants |\n * | workerEvidenceBytes | full | PARTIAL | the child's closing message; 0 for pruned transcripts |\n * | brain tokens in/out + cache | full | full | main-thread `message.usage` |\n * | worker tokens in/out + cache | via harness join | PARTIAL | only for retained subagent transcripts |\n * | perWorker wall | full | full | spawn → settle instants |\n * | accepted / rejected / emptyPass / settledVerdicts | full | NONE | no per-worker verify step exists |\n * | brain/worker/total usd, costPerAcceptedPatch | full | NONE | transcripts carry no price |\n * | patch stats, delivered, verifyPass/Rc | full | NONE | no diff is handed back |\n * | judgeResolved / Score / Passed / Total | full | NONE | no judge in the loop |\n * | driverSteerCalls, brainTruncations | full | NONE | no outer driver log, no per-call finish_reason tap |\n */\n\nimport { readdir, readFile } from 'node:fs/promises'\nimport { basename, dirname, join } from 'node:path'\nimport {\n type ClaudeEntry,\n parseClaudeEntries,\n transcriptFromEntries,\n} from '../rollout/readers/claude-jsonl'\nimport type { SupervisorRunReader, SupervisorRunSources, WorkerLogSource } from './types'\n\n/** Tool names that spawn a child agent. `Task` is the older name for `Agent`. */\nexport const DEFAULT_SPAWN_TOOLS = ['Agent', 'Task'] as const\n/** Tool names that deliver a message to an ALREADY-RUNNING child agent. */\nexport const DEFAULT_STEER_TOOLS = ['SendMessage'] as const\n/** Tool names that stop a running child agent. */\nexport const DEFAULT_CANCEL_TOOLS = ['TaskStop', 'KillAgent'] as const\n\nconst SPEND_UNPRICED =\n 'Claude Code transcripts record token usage but never a price — usd is not in the store'\nconst NO_VERDICTS =\n 'Claude Code runs no per-worker verify step — a subagent reports prose, not pass/fail'\nconst NO_DELIVERABLES =\n 'Claude Code retains no per-worker patch — subagents commit to git, they do not hand back a diff'\n\nexport interface ClaudeCodeReaderOptions {\n /** The main session transcript: `~/.claude/projects/<slug>/<sessionId>.jsonl`. */\n readonly transcriptPath: string\n /**\n * Directory of child transcripts. Defaults to `<transcript-dir>/<sessionId>/subagents`.\n * `null` skips the join, and every per-worker token count becomes unavailable.\n */\n readonly subagentsDir?: string | null\n readonly runRef?: string\n readonly instanceId?: string | null\n readonly arm?: string | null\n readonly spawnTools?: readonly string[]\n readonly steerTools?: readonly string[]\n readonly cancelTools?: readonly string[]\n}\n\nconst isRecord = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null && !Array.isArray(v)\n\nconst str = (v: unknown): string | null => (typeof v === 'string' ? v : null)\n\ninterface ToolUse {\n readonly id: string\n readonly name: string\n readonly input: Record<string, unknown>\n readonly at: string | null\n}\n\ninterface ToolResult {\n readonly id: string\n readonly at: string | null\n readonly structured: unknown\n readonly text: string\n}\n\n/** Every tool call and tool result on one thread, in order, with instants. */\ninterface ThreadCalls {\n readonly uses: ToolUse[]\n readonly results: Map<string, ToolResult>\n readonly notifications: TaskNotification[]\n readonly firstAt: string | null\n readonly lastAt: string | null\n}\n\ninterface TaskNotification {\n readonly taskId: string\n readonly toolUseId: string | null\n readonly status: string\n readonly summary: string | null\n readonly at: string | null\n}\n\nfunction blockText(content: unknown): string {\n if (typeof content === 'string') return content\n if (!Array.isArray(content)) return ''\n const parts: string[] = []\n for (const b of content) {\n if (isRecord(b) && b.type === 'text' && typeof b.text === 'string') parts.push(b.text)\n }\n return parts.join('\\n')\n}\n\nconst tag = (xml: string, name: string): string | null => {\n const m = xml.match(new RegExp(`<${name}>([\\\\s\\\\S]*?)</${name}>`))\n return m === null ? null : (m[1] as string)\n}\n\n/**\n * Task notifications are the settle instants. A notification fires each time an\n * agent stops, so a resumed agent produces several — they are kept in order and\n * the LAST one is the settle the analyzer sees, with the earlier ones acting as\n * the intermediate stops they actually were.\n */\nfunction parseNotifications(text: string, at: string | null): TaskNotification[] {\n const out: TaskNotification[] = []\n for (const m of text.matchAll(/<task-notification>[\\s\\S]*?<\\/task-notification>/g)) {\n const xml = m[0]\n const taskId = tag(xml, 'task-id')\n if (taskId === null) continue\n out.push({\n taskId: taskId.trim(),\n toolUseId: tag(xml, 'tool-use-id')?.trim() ?? null,\n status: tag(xml, 'status')?.trim() ?? 'unknown',\n summary: tag(xml, 'summary')?.trim() ?? null,\n at,\n })\n }\n return out\n}\n\n/** Project entries of ONE thread (main or a single sidechain) into tool traffic. */\nfunction threadCalls(entries: readonly ClaudeEntry[]): ThreadCalls {\n const uses: ToolUse[] = []\n const results = new Map<string, ToolResult>()\n const notifications: TaskNotification[] = []\n let firstAt: string | null = null\n let lastAt: string | null = null\n\n for (const entry of entries) {\n if (entry.timestamp !== null) {\n if (firstAt === null) firstAt = entry.timestamp\n lastAt = entry.timestamp\n }\n const content = entry.message.content\n if (entry.type === 'assistant') {\n if (!Array.isArray(content)) continue\n for (const block of content) {\n if (!isRecord(block) || block.type !== 'tool_use') continue\n const id = str(block.id)\n const name = str(block.name)\n if (id === null || name === null) continue\n uses.push({\n id,\n name,\n input: isRecord(block.input) ? block.input : {},\n at: entry.timestamp,\n })\n }\n continue\n }\n if (typeof content === 'string') {\n notifications.push(...parseNotifications(content, entry.timestamp))\n continue\n }\n if (!Array.isArray(content)) continue\n for (const block of content) {\n if (!isRecord(block)) continue\n if (block.type === 'tool_result' && typeof block.tool_use_id === 'string') {\n results.set(block.tool_use_id, {\n id: block.tool_use_id,\n at: entry.timestamp,\n structured: entry.toolUseResult,\n text: blockText(block.content),\n })\n } else if (block.type === 'text' && typeof block.text === 'string') {\n notifications.push(...parseNotifications(block.text, entry.timestamp))\n }\n }\n }\n return { uses, results, notifications, firstAt, lastAt }\n}\n\n/**\n * The agent id a spawn produced. Claude Code puts it in the structured\n * `toolUseResult`; the same id is echoed in the result text for transcripts\n * written before that field existed, so both are tried before giving up.\n */\nfunction spawnedAgentId(result: ToolResult | undefined): string | null {\n if (result === undefined) return null\n if (isRecord(result.structured)) {\n const id = str(result.structured.agentId)\n if (id !== null) return id\n }\n return result.text.match(/agentId:\\s*([A-Za-z0-9_-]+)/)?.[1] ?? null\n}\n\ninterface ChildTranscript {\n readonly agentId: string\n readonly path: string\n readonly description: string | null\n readonly spawnToolUseId: string | null\n readonly spawnDepth: number | null\n readonly entries: ClaudeEntry[]\n readonly tokensIn: number\n readonly tokensOut: number\n readonly cacheRead: number\n readonly cacheWrite: number\n readonly firstAt: string | null\n readonly lastAt: string | null\n readonly model: string | null\n /**\n * The child's closing assistant message — what it actually handed back. This\n * is the Claude Code analogue of a worker's `evidence` blob.\n */\n readonly finalReport: string | null\n}\n\nasync function readChildren(dir: string): Promise<ChildTranscript[]> {\n const names = await readdir(dir).catch(() => null)\n if (names === null) return []\n const out: ChildTranscript[] = []\n for (const name of names.filter((n) => n.endsWith('.jsonl')).sort()) {\n const path = join(dir, name)\n const raw = await readFile(path, 'utf8').catch(() => null)\n if (raw === null) continue\n const entries = parseClaudeEntries(raw)\n // A subagent transcript is sidechain end to end — that flag is what marks it\n // a separate invocation rather than a turn of the parent.\n const projected = transcriptFromEntries(entries, { includeSidechain: true })\n const metaRaw = await readFile(path.replace(/\\.jsonl$/, '.meta.json'), 'utf8').catch(() => null)\n let meta: Record<string, unknown> = {}\n if (metaRaw !== null) {\n try {\n const parsed: unknown = JSON.parse(metaRaw)\n if (isRecord(parsed)) meta = parsed\n } catch {\n meta = {}\n }\n }\n const agentId =\n entries.find((e) => e.agentId !== null)?.agentId ??\n name.replace(/^agent-/, '').replace(/\\.jsonl$/, '')\n out.push({\n agentId,\n path,\n description: str(meta.description),\n spawnToolUseId: str(meta.toolUseId),\n spawnDepth: typeof meta.spawnDepth === 'number' ? meta.spawnDepth : null,\n entries,\n tokensIn: projected.usage.tokensIn,\n tokensOut: projected.usage.tokensOut,\n cacheRead: projected.usage.cacheRead,\n cacheWrite: projected.usage.cacheWrite,\n firstAt: projected.startedAt,\n lastAt: projected.endedAt,\n model: projected.model,\n finalReport:\n [...projected.messages]\n .reverse()\n .find((m) => m.role === 'assistant' && typeof m.content === 'string')?.content ?? null,\n })\n }\n return out\n}\n\ninterface SpawnFact {\n readonly agentId: string\n readonly parentId: string\n readonly label: string\n readonly at: string | null\n readonly model: string | null\n}\n\n/** A journal line in the dialect `parseSupervisorTree` reads. */\nconst line = (obj: Record<string, unknown>): string => JSON.stringify(obj)\n\n/**\n * Read a Claude Code session (plus its subagent transcripts) as supervision-tree\n * source bytes. Never throws on a missing artifact.\n */\nexport async function readClaudeCodeSupervisorRun(\n opts: ClaudeCodeReaderOptions,\n): Promise<SupervisorRunSources> {\n const spawnTools = new Set(opts.spawnTools ?? DEFAULT_SPAWN_TOOLS)\n const steerTools = new Set(opts.steerTools ?? DEFAULT_STEER_TOOLS)\n const cancelTools = new Set(opts.cancelTools ?? DEFAULT_CANCEL_TOOLS)\n\n const raw = await readFile(opts.transcriptPath, 'utf8').catch(() => null)\n const sessionId = basename(opts.transcriptPath).replace(/\\.jsonl$/, '')\n const runRef = opts.runRef ?? opts.transcriptPath\n const limits = { spendUsd: SPEND_UNPRICED, workerVerdicts: NO_VERDICTS, deliverables: null }\n const traceCommand = `npx --yes @tangle-network/traces@latest analyze --harness claude-code --session ${sessionId}`\n\n if (raw === null) {\n return {\n runRef,\n instanceId: opts.instanceId ?? sessionId,\n arm: opts.arm ?? null,\n supRunDir: null,\n journal: null,\n brainLog: null,\n state: null,\n progress: null,\n workers: null,\n workersMissingReason: `session transcript unreadable at ${opts.transcriptPath}`,\n result: null,\n judge: null,\n judgeSource: null,\n patch: null,\n driverLog: null,\n harnessWorkerTokens: null,\n harnessMissingReason: `session transcript unreadable at ${opts.transcriptPath}`,\n limits: { ...limits, deliverables: NO_DELIVERABLES },\n traceCommand,\n }\n }\n\n const allEntries = parseClaudeEntries(raw)\n const main = threadCalls(allEntries.filter((e) => !e.isSidechain))\n const mainTranscript = transcriptFromEntries(allEntries)\n\n const subagentsDir =\n opts.subagentsDir === undefined\n ? join(dirname(opts.transcriptPath), sessionId, 'subagents')\n : opts.subagentsDir\n const children = subagentsDir === null ? [] : await readChildren(subagentsDir)\n const childByAgentId = new Map(children.map((c) => [c.agentId, c]))\n const childBySpawnToolUseId = new Map(\n children.filter((c) => c.spawnToolUseId !== null).map((c) => [c.spawnToolUseId as string, c]),\n )\n\n // Every thread that can spawn: the session itself, plus each child transcript\n // (a child that calls the spawn tool is a second delegation level).\n const threads: Array<{ id: string; calls: ThreadCalls }> = [{ id: sessionId, calls: main }]\n for (const child of children) {\n threads.push({ id: child.agentId, calls: threadCalls(child.entries) })\n }\n\n const spawns: SpawnFact[] = []\n const steersByTarget = new Map<string, Array<{ at: string | null; delivered: boolean }>>()\n const cancels: Array<{ agentId: string; at: string | null }> = []\n const settles: TaskNotification[] = []\n\n for (const thread of threads) {\n for (const use of thread.calls.uses) {\n if (spawnTools.has(use.name)) {\n const result = thread.calls.results.get(use.id)\n const agentId = spawnedAgentId(result) ?? childBySpawnToolUseId.get(use.id)?.agentId ?? null\n if (agentId === null) continue\n const label =\n str(use.input.description) ?? childByAgentId.get(agentId)?.description ?? agentId\n spawns.push({\n agentId,\n parentId: thread.id,\n label,\n // The spawn is complete when the launch call is answered; the tool_use\n // instant is the fallback for a call that never got a result line.\n at: result?.at ?? use.at,\n model: isRecord(result?.structured) ? str(result.structured.resolvedModel) : null,\n })\n continue\n }\n if (steerTools.has(use.name)) {\n const target = str(use.input.to) ?? str(use.input.recipient)\n if (target === null) continue\n const result = thread.calls.results.get(use.id)\n const structured = isRecord(result?.structured) ? result.structured : null\n // `success` is the harness confirming the message reached a live agent;\n // absent, the steer is counted queued but not delivered.\n const delivered = structured?.success === true || str(structured?.resumedAgentId) === target\n const rows = steersByTarget.get(target) ?? []\n rows.push({ at: use.at, delivered })\n steersByTarget.set(target, rows)\n continue\n }\n if (cancelTools.has(use.name)) {\n const target = str(use.input.agentId) ?? str(use.input.to) ?? str(use.input.taskId)\n if (target !== null) cancels.push({ agentId: target, at: use.at })\n }\n }\n settles.push(...thread.calls.notifications)\n }\n\n const spawnedIds = new Set(spawns.map((s) => s.agentId))\n const cancelledIds = new Set(\n cancels.filter((c) => spawnedIds.has(c.agentId)).map((c) => c.agentId),\n )\n const startedAt = main.firstAt\n const completedAt = main.lastAt\n\n const journalLines: string[] = [\n line({\n kind: 'spawned',\n id: sessionId,\n parent: null,\n label: `session:${sessionId}`,\n at: startedAt,\n }),\n ]\n for (const s of spawns) {\n journalLines.push(\n line({ kind: 'spawned', id: s.agentId, parent: s.parentId, label: s.label, at: s.at }),\n )\n }\n\n // Only the LAST notification per agent is its settle; an earlier one is a stop\n // the supervisor resumed from, which the steer count already records.\n const lastNotification = new Map<string, TaskNotification>()\n for (const n of settles) {\n if (!spawnedIds.has(n.taskId)) continue\n lastNotification.set(n.taskId, n)\n }\n for (const [agentId, n] of lastNotification) {\n if (cancelledIds.has(agentId)) continue\n journalLines.push(\n line({\n kind: 'settled',\n id: agentId,\n status: n.status,\n verdict: n.summary,\n at: n.at,\n // No `spent` key: Claude Code prices nothing, and a zeroed spend object\n // would read as a $0 worker. `limits.spendUsd` carries the reason.\n }),\n )\n }\n // One cancel per agent: Claude Code can emit a stop then a retry-stop for the\n // same agentId, and each raw entry would otherwise mint a duplicate `cancelled`\n // line that double-counts in `workersCancelled`. Keep the last, mirroring the\n // last-notification dedup the settle path already does.\n const lastCancel = new Map<string, { agentId: string; at: string | null }>()\n for (const c of cancels) {\n if (!spawnedIds.has(c.agentId)) continue\n lastCancel.set(c.agentId, c)\n }\n for (const c of lastCancel.values()) {\n journalLines.push(\n line({ kind: 'cancelled', id: c.agentId, reason: 'stopped by supervisor', at: c.at }),\n )\n }\n // `metered` carries the brain's own inference. The token counts are real; the\n // usd stays absent and `limits.spendUsd` explains why.\n journalLines.push(\n line({\n kind: 'metered',\n id: sessionId,\n spend: {\n tokens: {\n input: mainTranscript.usage.tokensIn,\n output: mainTranscript.usage.tokensOut,\n cacheRead: mainTranscript.usage.cacheRead,\n cacheWrite: mainTranscript.usage.cacheWrite,\n },\n },\n at: completedAt,\n }),\n )\n\n const settleAtByAgent = new Map(\n [...lastNotification.entries()].map(([id, n]) => [id, n.at] as const),\n )\n const spawnAtByAgent = new Map(spawns.map((s) => [s.agentId, s.at] as const))\n\n // Worker logs are keyed by LABEL (the analyzer's join), so agents that share a\n // description merge — the same collision loops has for a retried subtask.\n const byLabel = new Map<string, string[]>()\n for (const s of spawns) {\n const ids = byLabel.get(s.label) ?? []\n ids.push(s.agentId)\n byLabel.set(s.label, ids)\n }\n\n const workers: WorkerLogSource[] = []\n for (const [label, agentIds] of byLabel) {\n const events: string[] = []\n const inbox: string[] = []\n let tokensIn: number | null = null\n let tokensOut: number | null = null\n let cacheRead: number | null = null\n let cacheWrite: number | null = null\n let transcriptRef: string | null = null\n for (const agentId of agentIds) {\n const child = childByAgentId.get(agentId) ?? null\n const startAt = child?.firstAt ?? spawnAtByAgent.get(agentId) ?? null\n const endAt = settleAtByAgent.get(agentId) ?? child?.lastAt ?? null\n if (startAt !== null) events.push(line({ kind: 'started', label, at: startAt, agentId }))\n for (const steer of steersByTarget.get(agentId) ?? []) {\n inbox.push(\n line({ id: `${agentId}:${steer.at}`, at: steer.at, worker: label, message: 'steer' }),\n )\n events.push(\n line({\n kind: 'message',\n label,\n direction: 'down',\n at: steer.at,\n requestId: `${agentId}:${steer.at}`,\n delivered: steer.delivered,\n }),\n )\n }\n if (endAt !== null) {\n events.push(\n line({\n kind: 'finished',\n label,\n at: endAt,\n agentId,\n // No `passed` / `patchBytes`: this harness has neither. Emitting\n // `passed: false` here would invent a failed worker.\n // `evidence` is the child's closing message — what it handed back.\n ...(child?.finalReport === null || child?.finalReport === undefined\n ? {}\n : { evidence: child.finalReport }),\n }),\n )\n }\n if (child !== null) {\n tokensIn = (tokensIn ?? 0) + child.tokensIn\n tokensOut = (tokensOut ?? 0) + child.tokensOut\n cacheRead = (cacheRead ?? 0) + child.cacheRead\n cacheWrite = (cacheWrite ?? 0) + child.cacheWrite\n transcriptRef = child.path\n }\n }\n workers.push({\n label,\n events: events.length === 0 ? null : `${events.join('\\n')}\\n`,\n inbox: inbox.length === 0 ? null : `${inbox.join('\\n')}\\n`,\n patchBytes: null,\n transcriptRef,\n patchPath: null,\n tokensIn,\n tokensOut,\n cacheRead,\n cacheWrite,\n })\n }\n\n const joined = children.length\n const harnessWorkerTokens =\n joined === 0\n ? null\n : {\n store: 'claude-code subagent transcripts',\n sessions: joined,\n input: children.reduce((a, c) => a + c.tokensIn, 0),\n output: children.reduce((a, c) => a + c.tokensOut, 0),\n cacheRead: children.reduce((a, c) => a + c.cacheRead, 0),\n cacheWrite: children.reduce((a, c) => a + c.cacheWrite, 0),\n }\n\n const missingChildren = spawns.filter((s) => !childByAgentId.has(s.agentId)).length\n const harnessMissingReason =\n subagentsDir === null\n ? 'subagent transcript join disabled'\n : joined === 0\n ? `no subagent transcripts under ${subagentsDir}`\n : missingChildren === 0\n ? null\n : `${missingChildren}/${spawns.length} spawned agents have no retained transcript under ${subagentsDir} (Claude Code prunes them; their tokens are unrecoverable)`\n\n const liveWorkers = spawns.filter(\n (s) => !lastNotification.has(s.agentId) && !cancelledIds.has(s.agentId),\n ).length\n const state = JSON.stringify({\n id: sessionId,\n // Derived, not asserted: a spawned agent with no notification and no stop\n // is still running, which is exactly what a live transcript looks like.\n status: liveWorkers > 0 ? 'running' : 'idle',\n startedAt,\n completedAt,\n result: { delivered: null },\n })\n\n return {\n runRef,\n instanceId: opts.instanceId ?? sessionId,\n arm: opts.arm ?? null,\n supRunDir: subagentsDir,\n journal: `${journalLines.join('\\n')}\\n`,\n brainLog: null,\n state,\n progress: null,\n workers,\n workersMissingReason: null,\n result: null,\n judge: null,\n judgeSource: null,\n patch: null,\n driverLog: null,\n harnessWorkerTokens,\n harnessMissingReason,\n limits: { ...limits, deliverables: NO_DELIVERABLES },\n rootTranscriptRef: opts.transcriptPath,\n traceCommand,\n }\n}\n\n/** A `SupervisorRunReader` over a Claude Code session — the same contract loops implements. */\nexport function claudeCodeSupervisorRunReader(opts: ClaudeCodeReaderOptions): SupervisorRunReader {\n return {\n runRef: opts.runRef ?? opts.transcriptPath,\n read: () => readClaudeCodeSupervisorRun(opts),\n }\n}\n","/**\n * Human-readable renderings of a supervisor-run report. Zero and unavailable\n * render differently on purpose (`0` vs `unavailable — <reason>`), because the\n * two have driven opposite conclusions about the same architecture.\n */\n\nimport { round } from './analyze'\nimport {\n isUnavailable,\n type Measured,\n type SupervisorRunReport,\n type SupervisorRunRollup,\n showMeasured,\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 ` 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 ` 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\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(`- 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 (spawns after 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(`| Supervisor wall | ${fmtMs(o.supervisorWallMs)} |`)\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 | Queued | Delivered |')\n out.push('|---|---:|---:|')\n for (const s of o.steersByWorker) out.push(`| \\`${s.worker}\\` | ${s.queued} | ${s.delivered} |`)\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 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(`- 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('| Worker | Wall | Tokens in | Tokens out | Patch bytes | Verify passed |')\n out.push('|---|---:|---:|---:|---:|---|')\n for (const w of e.perWorker) {\n out.push(\n `| \\`${w.worker}\\` | ${w.wallMs === null ? 'unavailable — no start/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 finished event' : String(w.passed)} |`,\n )\n }\n out.push('')\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(`| 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 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 return out.join('\\n')\n}\n","/**\n * ONE implementation of `SupervisorRunReader`: the on-disk layout the loops\n * supervisor writes — `<runDir>/ws/.loops/supervisor/<id>/{journal.jsonl,\n * state.json, progress.ndjson, workers/*.ndjson}` alongside the run's\n * `result.json` / `judge.json` / `driver.log` / delivered patch.\n *\n * Nothing in `analyze.ts` knows this layout exists. A different store (an\n * archive, an object bucket, a database) implements the same interface and\n * gets the same report.\n *\n * Worker token recovery reuses the rollout module's opencode reader rather\n * than opening a second sqlite path — one store client, one corruption policy.\n */\n\nimport { appendFile, mkdir, readdir, readFile, writeFile } from 'node:fs/promises'\nimport { basename, join } from 'node:path'\nimport {\n DEFAULT_OPENCODE_DB,\n findOpencodeSessionsByDirectory,\n openOpencodeDb,\n} from '../rollout/readers/opencode-sqlite'\nimport { analyzeSupervisorRunSources, parseJson, parseJsonl, rollupSupervisorRuns } from './analyze'\nimport {\n renderSupervisorRollupMarkdown,\n renderSupervisorRunHeadline,\n renderSupervisorRunMarkdown,\n} from './render'\nimport {\n NO_SOURCE_LIMITS,\n type SupervisorRunReader,\n type SupervisorRunReport,\n type SupervisorRunRollup,\n type SupervisorRunSources,\n type WorkerLogSource,\n} from './types'\n\nasync function readMaybe(path: string): Promise<string | null> {\n return readFile(path, 'utf8').catch(() => null)\n}\n\n/** Locate the (single) supervisor run dir under `<ws>/.loops/supervisor`. */\nexport async function findSupervisorRunDirIn(ws: string): Promise<string | null> {\n const root = join(ws, '.loops', 'supervisor')\n const entries = await readdir(root, { withFileTypes: true }).catch(() => [])\n const dirs = entries.filter((e) => e.isDirectory()).map((e) => join(root, e.name))\n return dirs[0] ?? null\n}\n\nexport interface LoopsReaderOptions {\n /** Override the workspace dir (default `<runDir>/ws`). */\n readonly ws?: string\n /** Delivered patch path (default: `patchPath` from result.json). */\n readonly patchPath?: string\n /** opencode sqlite store; set to `null` to skip the worker-token join entirely. */\n readonly opencodeDb?: string | null\n /** Ledger to fall back to when the run has no `judge.json` (matched on iid + arm + runDir). */\n readonly ledgerPath?: string\n}\n\n/**\n * Read a loops supervisor run directory into source bytes. Never throws on a\n * missing artifact — an absent file becomes a `null` field, which is what makes\n * the dependent metric `unavailable` instead of 0.\n */\nexport async function readLoopsSupervisorRun(\n runDir: string,\n opts: LoopsReaderOptions = {},\n): Promise<SupervisorRunSources> {\n const ws = opts.ws ?? join(runDir, 'ws')\n const supRunDir = await findSupervisorRunDirIn(ws)\n const result = await readMaybe(join(runDir, 'result.json'))\n const resultObj = parseJson(result)\n\n let workers: WorkerLogSource[] | null = null\n let workersMissingReason: string | null = null\n const workerCwds: string[] = []\n if (supRunDir === null) {\n workersMissingReason = `no supervisor run dir under ${join(ws, '.loops', 'supervisor')}`\n } else {\n const workersDir = join(supRunDir, 'workers')\n const entries = await readdir(workersDir).catch(() => null)\n if (entries === null) {\n workersMissingReason = `workers/ directory absent under ${supRunDir}`\n } else {\n const labels = [\n ...new Set(\n entries\n .filter((f) => f.endsWith('.ndjson'))\n .map((f) => f.replace(/\\.inbox\\.ndjson$/, '').replace(/\\.ndjson$/, '')),\n ),\n ].sort()\n workers = []\n for (const label of labels) {\n const events = await readMaybe(join(workersDir, `${label}.ndjson`))\n const inbox = await readMaybe(join(workersDir, `${label}.inbox.ndjson`))\n const patch = await readMaybe(join(workersDir, `${label}.patch`))\n workers.push({\n label,\n events,\n inbox,\n patchBytes: patch === null ? null : Buffer.byteLength(patch),\n })\n for (const ev of parseJsonl(events)) {\n if (ev.kind === 'started' && typeof ev.cwd === 'string') workerCwds.push(ev.cwd)\n }\n }\n }\n }\n\n let harnessWorkerTokens: SupervisorRunSources['harnessWorkerTokens'] = null\n let harnessMissingReason: string | null = null\n if (opts.opencodeDb === null) {\n harnessMissingReason = 'opencode join disabled'\n } else if (workerCwds.length === 0) {\n harnessMissingReason = 'no worker clone cwds in workers/*.ndjson (nothing to join)'\n } else {\n const db = await openOpencodeDb(opts.opencodeDb ?? DEFAULT_OPENCODE_DB)\n if (db === null) {\n harnessMissingReason = `opencode session store unreadable at ${opts.opencodeDb ?? DEFAULT_OPENCODE_DB}`\n } else {\n try {\n const seen = new Set<string>()\n let sessions = 0\n let input = 0\n let output = 0\n for (const cwd of new Set(workerCwds)) {\n for (const row of findOpencodeSessionsByDirectory(db, cwd)) {\n if (seen.has(row.id)) continue\n seen.add(row.id)\n sessions += 1\n input += row.tokensInput\n output += row.tokensOutput + row.tokensReasoning\n }\n }\n harnessWorkerTokens = { store: 'opencode', sessions, input, output }\n } finally {\n db.close()\n }\n }\n }\n\n const patchPath =\n opts.patchPath ?? (typeof resultObj?.patchPath === 'string' ? resultObj.patchPath : null)\n\n let judge = await readMaybe(join(runDir, 'judge.json'))\n let judgeSource = judge === null ? null : join(runDir, 'judge.json')\n if (judge === null && opts.ledgerPath !== undefined) {\n const row = await findLedgerRow(opts.ledgerPath, runDir)\n if (row !== null) {\n judge = JSON.stringify(row)\n judgeSource = `${opts.ledgerPath} (ledger row)`\n }\n }\n\n return {\n runRef: runDir,\n instanceId: typeof resultObj?.iid === 'string' ? resultObj.iid : instanceIdFromPath(runDir),\n arm: typeof resultObj?.arm === 'string' ? resultObj.arm : basename(runDir),\n supRunDir,\n journal: supRunDir === null ? null : await readMaybe(join(supRunDir, 'journal.jsonl')),\n brainLog: supRunDir === null ? null : await readMaybe(join(supRunDir, 'brain.jsonl')),\n state: supRunDir === null ? null : await readMaybe(join(supRunDir, 'state.json')),\n progress: supRunDir === null ? null : await readMaybe(join(supRunDir, 'progress.ndjson')),\n workers,\n workersMissingReason,\n result,\n judge,\n judgeSource,\n patch: patchPath === null ? null : await readMaybe(patchPath),\n driverLog: await readMaybe(join(runDir, 'driver.log')),\n harnessWorkerTokens,\n harnessMissingReason,\n // loops prices its own inference, runs a verify per worker, and keeps each\n // worker's patch — every fact the analyzer can use is expressible here.\n limits: NO_SOURCE_LIMITS,\n traceCommand: null,\n }\n}\n\n/** The loops on-disk layout, as a `SupervisorRunReader`. */\nexport function loopsSupervisorRunReader(\n runDir: string,\n opts: LoopsReaderOptions = {},\n): SupervisorRunReader {\n return { runRef: runDir, read: () => readLoopsSupervisorRun(runDir, opts) }\n}\n\n/** The ledger row whose `runDir` is this run (falling back to iid + arm match). */\nasync function findLedgerRow(\n ledgerPath: string,\n runDir: string,\n): Promise<Record<string, unknown> | null> {\n const rows = parseJsonl(await readMaybe(ledgerPath))\n const exact = rows.find((r) => r.runDir === runDir)\n if (exact !== undefined) return exact\n const iid = instanceIdFromPath(runDir)\n const arm = basename(runDir)\n return rows.find((r) => r.iid === iid && r.arm === arm) ?? null\n}\n\n/** `<outDir>/runs/<iid>/<arm>` → `<iid>`. */\nfunction instanceIdFromPath(runDir: string): string | null {\n const parts = runDir.split('/').filter(Boolean)\n const armIdx = parts.length - 1\n const iid = parts[armIdx - 1]\n return parts[armIdx - 2] === 'runs' && iid !== undefined ? iid : null\n}\n\n// ---------------------------------------------------------------------------\n// Entry point + write helpers.\n// ---------------------------------------------------------------------------\n\n/**\n * Analyze a supervisor run. Accepts a run directory (read through the loops\n * reader), any `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 opts: LoopsReaderOptions = {},\n): Promise<SupervisorRunReport> {\n if (typeof input === 'string') {\n return analyzeSupervisorRunSources(await readLoopsSupervisorRun(input, opts))\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 extends LoopsReaderOptions {\n /** Append the headline block here (the experiment's run log). */\n readonly appendHeadlineTo?: string\n /** Also console.log the headline (default true). */\n readonly echo?: boolean\n /**\n * Write `run-report.{json,md}` here instead of into the run dir. Set when\n * reporting over a run directory that must stay READ-ONLY (a live run, an\n * archived generation).\n */\n readonly reportDir?: string\n}\n\n/**\n * Read a completed run, write `run-report.json` + `run-report.md` beside its\n * artifacts, and append the headline block to the run log. Never throws on a\n * missing artifact — a run that produced nothing still yields a report whose\n * every metric says why.\n */\nexport async function writeSupervisorRunReport(\n runDir: string,\n opts: WriteSupervisorRunOptions = {},\n): Promise<SupervisorRunReport> {\n const sources = await readLoopsSupervisorRun(runDir, opts)\n const report = analyzeSupervisorRunSources(sources)\n const md = renderSupervisorRunMarkdown(report)\n const dest = opts.reportDir ?? runDir\n const stem = opts.reportDir === undefined ? 'run-report' : supervisorReportStem(runDir)\n if (opts.reportDir !== undefined) await mkdir(opts.reportDir, { recursive: true }).catch(() => {})\n await writeFile(join(dest, `${stem}.json`), JSON.stringify(report, null, 1)).catch(() => {})\n await writeFile(join(dest, `${stem}.md`), md).catch(() => {})\n const headline = renderSupervisorRunHeadline(report)\n if (opts.appendHeadlineTo !== undefined) {\n await appendFile(opts.appendHeadlineTo, `${headline}\\n`).catch(() => {})\n }\n if (opts.echo !== false) console.log(headline)\n return report\n}\n\n/**\n * File stem for out-of-tree reports. Built from the run path's identifying\n * segments — candidate tag (the segment under `arm-runs/`), rep, instance, arm\n * — so two runs of the same instance from different candidates/reps never\n * overwrite each other.\n */\nexport function supervisorReportStem(runDir: string): string {\n const parts = runDir.split('/').filter(Boolean)\n const arm = parts[parts.length - 1] ?? 'cell'\n const iid = parts[parts.length - 2] ?? 'instance'\n const rep = parts.find((p) => /^rep-\\d+$/.test(p))\n const armRunsIdx = parts.indexOf('arm-runs')\n const tag = armRunsIdx >= 0 ? parts[armRunsIdx + 1] : undefined\n return [tag, rep, iid, arm]\n .filter((s): s is string => s !== undefined && s !== 'runs')\n .join('.')\n .replace(/[^A-Za-z0-9._-]/g, '_')\n}\n\n/**\n * Best-effort wrapper for a hot path: a reporting failure must never kill a run\n * that already produced real work. Returns null and logs the reason instead.\n */\nexport async function writeSupervisorRunReportSafe(\n runDir: string,\n opts: WriteSupervisorRunOptions = {},\n): Promise<SupervisorRunReport | null> {\n try {\n return await writeSupervisorRunReport(runDir, opts)\n } catch (err) {\n console.log(\n `RUN-REPORT failed for ${runDir}: ${err instanceof Error ? err.message : String(err)}`,\n )\n return null\n }\n}\n\n/**\n * Report every run under an experiment `outDir` (any depth of\n * `runs/<iid>/<arm>`), write each run's report, and write the rollup at\n * `<outDir>/run-report-round.{json,md}`.\n */\nexport async function reportSupervisorRound(\n outDir: string,\n opts: WriteSupervisorRunOptions & { title?: string } = {},\n): Promise<SupervisorRunRollup> {\n const runDirs = await findSupervisorRunDirs(outDir)\n const reports: SupervisorRunReport[] = []\n for (const runDir of runDirs) {\n const r = await writeSupervisorRunReportSafe(runDir, { ...opts, echo: opts.echo ?? false })\n if (r !== null) reports.push(r)\n }\n const rollup = rollupSupervisorRuns(reports)\n const md = renderSupervisorRollupMarkdown(\n rollup,\n opts.title ?? `Round rollup — ${basename(outDir)}`,\n )\n const dest = opts.reportDir ?? outDir\n if (opts.reportDir !== undefined) await mkdir(opts.reportDir, { recursive: true }).catch(() => {})\n await writeFile(join(dest, 'run-report-round.json'), JSON.stringify(rollup, null, 1)).catch(\n () => {},\n )\n await writeFile(join(dest, 'run-report-round.md'), md).catch(() => {})\n if (opts.appendHeadlineTo !== undefined) {\n await appendFile(opts.appendHeadlineTo, `${md}\\n`).catch(() => {})\n }\n if (opts.echo !== false) console.log(md)\n return rollup\n}\n\n/** Every `<...>/runs/<iid>/<arm>` directory under `root`. */\nexport async function findSupervisorRunDirs(root: string): Promise<string[]> {\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 (e.name === 'runs') {\n const iids = await readdir(full, { withFileTypes: true }).catch(() => [])\n for (const iid of iids) {\n if (!iid.isDirectory()) continue\n const arms = await readdir(join(full, iid.name), { withFileTypes: true }).catch(() => [])\n for (const arm of arms) if (arm.isDirectory()) found.push(join(full, iid.name, arm.name))\n }\n continue\n }\n await walk(full, depth + 1)\n }\n }\n await walk(root, 0)\n return found.sort()\n}\n","/**\n * The supervision tree as `tangle.rollout.v1` rows.\n *\n * A supervisor run IS a tree of rollouts, so its nodes are not a new shape:\n * the root becomes one `RolloutLine` with `role: 'supervisor'`, every spawned\n * worker becomes a `RolloutLine` with `role: 'worker'` and\n * `parent_rollout_id` pointing at its spawner. The rows append to the same\n * ledger as solo-agent rollouts and join to them with the same keys.\n *\n * What the journal CANNOT supply is the transcript: a worker's messages live\n * in its harness store (opencode sqlite, Claude Code jsonl), which the\n * `src/rollout/readers/*` intake readers own. Rows minted here are therefore\n * GAP lines (`messages: []`, `provenance.gap` set) carrying identity,\n * structure, outcome and cost; hydrating them with messages is the readers'\n * job, keyed on `artifacts.transcript_ref`.\n *\n * Timing lives in `outcome.metrics` (`spawned_at` / `settled_at` / `wall_ms`)\n * rather than a schema field: `tangle.rollout.v1` describes ONE invocation,\n * and the inter-invocation event timeline — which is what waves, concurrency,\n * idle and utilization are computed from — is a property of the journal, not\n * of any single row. The analyzer reads that timeline; these rows carry the\n * per-node facts.\n */\n\nimport { unscreenedRewardFields } from '../rollout/reward'\nimport {\n isRolloutLine,\n ROLLOUT_SCHEMA,\n type RolloutLine,\n type RolloutSplit,\n} from '../rollout/schema'\nimport { asRecord, parseJson, parseSupervisorTree } from './analyze'\nimport type { SupervisorRunSources, SupervisorRunTree } from './types'\n\nexport interface SupervisorRolloutOptions {\n /** Benchmark/suite id for `task.suite`. Defaults to `'supervisor-run'`. */\n readonly suite?: string\n /** `task.split`. Defaults to `'search'` (the trainable pool). */\n readonly split?: RolloutSplit\n /** Replicate index. Defaults to 0. */\n readonly rep?: number\n /** Sampling seed the campaign pinned. Defaults to null (not recorded). */\n readonly seed?: number | null\n /** `run_id` for every node. Defaults to the supervisor root id, else `runRef`. */\n readonly runId?: string\n /** Harness that drove the supervisor. */\n readonly supervisorHarness?: string | null\n /** Harness that drove the workers. */\n readonly workerHarness?: string | null\n /** Model the supervisor ran on. */\n readonly supervisorModel?: string | null\n /** Model the workers ran on. */\n readonly workerModel?: string | null\n readonly experimentId?: string | null\n readonly candidateId?: string | null\n readonly generation?: number | null\n readonly candidateIndex?: number | null\n /** Pins `provenance.captured_at`; defaults to now. */\n readonly capturedAt?: string\n}\n\nconst EMPTY_COST = {\n usd: null,\n tokens_in: null,\n tokens_out: null,\n tokens_reasoning: null,\n cache_read: null,\n cache_write: null,\n wall_s: null,\n} as const\n\n/**\n * Mint the supervision tree as rollout rows. Returns the rows plus the gaps\n * that made any of them incomplete — same unavailable-vs-zero discipline as\n * the report: a row with no transcript says WHY, it never pretends to be empty.\n */\nexport function supervisorRunRolloutLines(\n src: SupervisorRunSources,\n opts: SupervisorRolloutOptions = {},\n): SupervisorRunTree {\n const gaps: string[] = []\n const tree = parseSupervisorTree(src)\n if (src.journal === null) {\n gaps.push(\n `tree: ${src.supRunDir === null ? 'no supervisor run dir' : 'journal absent'} — no nodes recoverable`,\n )\n return { rootId: null, nodes: [], gaps }\n }\n\n const state = parseJson(src.state)\n const result = parseJson(src.result)\n const judge = parseJson(src.judge)\n const stateResult = asRecord(state?.result)\n\n const rootId = tree.rootId\n const runId = opts.runId ?? rootId ?? src.runRef\n const suite = opts.suite ?? 'supervisor-run'\n const instanceId = src.instanceId ?? src.runRef\n const split: RolloutSplit = opts.split ?? 'search'\n const capturedAt = opts.capturedAt ?? new Date().toISOString()\n\n const base = {\n schema: ROLLOUT_SCHEMA,\n run_id: runId,\n experiment_id: opts.experimentId ?? null,\n candidate_id: opts.candidateId ?? null,\n generation: opts.generation ?? null,\n candidate_index: opts.candidateIndex ?? null,\n task: {\n suite,\n instance_id: instanceId,\n split,\n seed: opts.seed ?? null,\n rep: opts.rep ?? 0,\n },\n messages: [] as RolloutLine['messages'],\n tool_defs: [] as RolloutLine['tool_defs'],\n } satisfies Partial<RolloutLine> & Record<string, unknown>\n\n const nodes: RolloutLine[] = []\n\n // ── root: the supervisor invocation ────────────────────────────────────\n if (rootId !== null) {\n const judgeResolved = typeof judge?.resolved === 'boolean' ? judge.resolved : null\n const judgeScore = typeof judge?.score === 'number' ? judge.score : null\n const reward = judgeScore ?? (judgeResolved === null ? null : judgeResolved ? 1 : 0)\n if (reward === null) gaps.push('root.outcome.reward: no judge verdict for this run')\n const wallMs =\n tree.startedAt !== null && tree.completedAt !== null && tree.completedAt >= tree.startedAt\n ? tree.completedAt - tree.startedAt\n : null\n nodes.push({\n ...base,\n rollout_id: rootId,\n parent_rollout_id: null,\n role: 'supervisor',\n policy: {\n harness: opts.supervisorHarness ?? null,\n harness_version: null,\n model: opts.supervisorModel ?? null,\n provider: null,\n profile_commit: null,\n sampling: null,\n },\n outcome: {\n // `reward` and `realness_gated` are written by one call, in the module\n // that owns the gate. This is the SECOND producer of rollout rewards —\n // the judge verdict in the supervision run dir, not `mintRolloutRows` —\n // and it wrote `reward` by hand while never stating the flag, so\n // `isLineRealnessGated` was structurally false for every supervisor and\n // worker row ever emitted here. `unscreenedRewardFields` is the honest\n // name for what this producer can claim: a supervision journal carries\n // no `RunRecord.outcome.realness`, so no authenticity gate has run on\n // this score, and `realness_gated: false` states that rather than\n // implying it by omission. These rows stay plain `RolloutLine`s, so a\n // caller feeding them to a training exporter must `assertMinted` first.\n ...unscreenedRewardFields(reward),\n reward_source: src.judgeSource,\n verdict: judge ?? null,\n metrics: {\n arm: src.arm,\n sup_status: typeof state?.status === 'string' ? state.status : null,\n sup_verdict: typeof state?.verdict === 'string' ? state.verdict : null,\n delivered: typeof stateResult.delivered === 'boolean' ? stateResult.delivered : null,\n verify_pass: typeof result?.verify_pass === 'boolean' ? result.verify_pass : null,\n started_at: tree.startedAt,\n completed_at: tree.completedAt,\n workers_spawned: tree.workerSpawns.length,\n brain_metered_events: tree.brain.meteredCount,\n },\n is_completed: state?.status === 'completed',\n is_truncated: false,\n error: null,\n realness_gated: false,\n },\n cost: {\n ...EMPTY_COST,\n usd:\n src.limits.spendUsd !== null\n ? null\n : typeof stateResult.spentUsd === 'number'\n ? stateResult.spentUsd\n : tree.brain.usd,\n tokens_in: tree.brain.tokensIn,\n tokens_out: tree.brain.tokensOut,\n cache_read: tree.brain.hasCache ? tree.brain.cacheRead : null,\n cache_write: tree.brain.hasCache ? tree.brain.cacheWrite : null,\n wall_s: wallMs === null ? null : wallMs / 1000,\n },\n artifacts: {\n patch_path: typeof result?.patchPath === 'string' ? result.patchPath : null,\n run_dir: src.supRunDir,\n transcript_ref:\n src.rootTranscriptRef !== undefined\n ? src.rootTranscriptRef\n : src.supRunDir === null\n ? null\n : `${src.supRunDir}/journal.jsonl`,\n },\n provenance: {\n captured_at: capturedAt,\n capture: 'backfill',\n gap: 'supervision journal carries structure and spend, not the brain transcript',\n },\n })\n } else {\n gaps.push('tree.root: no parentless `spawned` event in the journal')\n }\n\n // ── workers: one node per spawn, keyed to its spawner ───────────────────\n const closeById = new Map(tree.closes.map((c) => [c.id, c]))\n const sourceByLabel = new Map((src.workers ?? []).map((w) => [w.label, w]))\n // Worker logs are keyed by label, the journal by id — the label is the only\n // join available. A repeated label is a literal retry of the same subtask, so\n // both attempts see the same log facts; the journal ids keep them distinct\n // rows and `outcome.metrics.spawned_at` separates the attempts.\n for (const spawn of tree.workerSpawns) {\n const close = closeById.get(spawn.id) ?? null\n const facts = tree.workerLogs.get(spawn.label) ?? null\n const workerSource = sourceByLabel.get(spawn.label) ?? null\n const wallMs =\n facts?.started != null && facts.finishedAt != null ? facts.finishedAt - facts.started : null\n const reward = facts?.passed === null || facts === null ? null : facts.passed ? 1 : 0\n if (reward === null) {\n gaps.push(`worker ${spawn.label}: no verify verdict (worker logs absent or unfinished)`)\n }\n nodes.push({\n ...base,\n rollout_id: spawn.id,\n parent_rollout_id: spawn.parent,\n role: 'worker',\n policy: {\n harness: opts.workerHarness ?? null,\n harness_version: null,\n model: opts.workerModel ?? null,\n provider: null,\n profile_commit: null,\n sampling: null,\n },\n outcome: {\n // Same producer, same claim: a worker reward is a self-verify verdict\n // from the journal that no realness gate has seen.\n ...unscreenedRewardFields(reward),\n reward_source: reward === null ? null : 'worker-self-verify',\n verdict:\n close === null\n ? null\n : { kind: close.kind, status: close.status, verdict: close.verdict },\n metrics: {\n label: spawn.label,\n spawned_at: spawn.at,\n settled_at: close?.at ?? null,\n started_at: facts?.started ?? null,\n finished_at: facts?.finishedAt ?? null,\n wall_ms: wallMs,\n patch_bytes: facts?.finishedPatchBytes ?? null,\n evidence_bytes: facts?.evidenceBytes ?? null,\n steers_queued: facts?.steersQueued ?? null,\n steers_delivered: facts?.steersDelivered ?? null,\n questions: facts?.questions ?? null,\n },\n is_completed: close?.kind === 'settled',\n is_truncated: close?.kind === 'cancelled',\n error: close?.kind === 'cancelled' ? (close.verdict ?? 'cancelled') : null,\n realness_gated: false,\n },\n // `close.spend` is only a measurement when the close event carried one;\n // a store that never priced this worker must leave null, not 0.\n cost: {\n ...EMPTY_COST,\n usd: src.limits.spendUsd !== null || !close?.hasSpend ? null : close.spend.usd,\n tokens_in: workerSource?.tokensIn ?? (close?.hasSpend ? close.spend.tokens.input : null),\n tokens_out: workerSource?.tokensOut ?? (close?.hasSpend ? close.spend.tokens.output : null),\n // Mirror the tokens_in/out journal fallback so a loops-shaped store whose\n // `settled` spend carries cache counters is not reported as null cache\n // beside real tokens. Gate on `hasCache` — a spend object without cache\n // counters must stay null, not a fabricated 0.\n cache_read:\n workerSource?.cacheRead ??\n (close?.hasSpend && close.spend.tokens.hasCache ? close.spend.tokens.cacheRead : null),\n cache_write:\n workerSource?.cacheWrite ??\n (close?.hasSpend && close.spend.tokens.hasCache ? close.spend.tokens.cacheWrite : null),\n wall_s: wallMs === null ? null : wallMs / 1000,\n },\n // A reader that knows where its worker artifacts live says so; only the\n // loops layout is derivable from `supRunDir`, so guessing it for another\n // store would mint rows pointing at paths that never existed.\n artifacts: {\n patch_path:\n workerSource?.patchPath !== undefined\n ? workerSource.patchPath\n : src.supRunDir === null\n ? null\n : `${src.supRunDir}/workers/${spawn.label}.patch`,\n run_dir: src.supRunDir,\n transcript_ref:\n workerSource?.transcriptRef !== undefined\n ? workerSource.transcriptRef\n : src.supRunDir === null\n ? null\n : `${src.supRunDir}/workers/${spawn.label}.ndjson`,\n },\n provenance: {\n captured_at: capturedAt,\n capture: 'backfill',\n gap:\n workerSource?.transcriptRef == null\n ? 'worker transcript lives in the harness session store — hydrate via src/rollout/readers'\n : 'worker transcript recorded by the harness; messages not inlined into this row',\n },\n })\n }\n\n const invalid = nodes.filter((n) => !isRolloutLine(n))\n if (invalid.length > 0) {\n gaps.push(`${invalid.length} node(s) failed tangle.rollout.v1 validation`)\n }\n return { rootId, nodes, gaps }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"supervisor-run-B7lUGoyZ.js","names":[],"sources":["../src/supervisor-run/types.ts","../src/supervisor-run/analyze.ts","../src/supervisor-run/claude-code-reader.ts","../src/supervisor-run/render.ts","../src/supervisor-run/loops-reader.ts","../src/supervisor-run/rollout-nodes.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 } from '../rollout/schema'\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/** One worker's logs, as read. `null` = the artifact did not exist. */\nexport interface WorkerLogSource {\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 /** 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 * loops-shaped 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 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 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 * (an on-disk loops run, an object-store archive, a database, a test fixture)\n * is a valid source; `loopsSupervisorRunReader` 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 /** Supervision journal — spawned / settled / cancelled / metered events (JSONL). */\n readonly journal: string | null\n /** Per-brain-call tap (JSONL): finish_reason, completion tokens, requested max tokens. */\n readonly brainLog: string | null\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 /** Run result document (JSON). */\n readonly result: 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 * 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. Undefined lets the rollout\n * minter fall back to the loops layout (`<supRunDir>/journal.jsonl`); any\n * other store must say, or the row points at a path that never existed.\n */\n readonly rootTranscriptRef?: string | 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 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 /** Worker spawns issued after the first settlement — the retry/respawn tail. */\n readonly respawns: Measured<number>\n /** Labels spawned more than once (a literal retry of the same subtask). */\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 /** 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 /** Worker verified its own work green AND produced a patch. */\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 /** Settlements the brain observed before issuing its next spawn (evidence→respawn). */\n readonly observeThenRespawn: Measured<number>\n /** Respawns with no settled evidence 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 readonly worker: string\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}\n\nexport interface WallDistribution {\n readonly n: number\n readonly min: number\n readonly p50: number\n readonly p90: number\n readonly max: number\n readonly sum: number\n}\n\nexport interface EconomicsMetrics {\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 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\nexport interface OutcomeMetrics {\n readonly supStatus: Measured<string>\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 generatedAt: string\n readonly orchestration: OrchestrationMetrics\n readonly decision: DecisionMetrics\n readonly economics: EconomicsMetrics\n readonly outcome: OutcomeMetrics\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 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 readonly usdTotal: Measured<number>\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'`; every spawned worker carries `role: 'worker'`\n * with the root as its parent.\n */\nexport interface SupervisorRunTree {\n readonly rootId: string | null\n readonly nodes: readonly RolloutLine[]\n /** Why a node could not be recovered, in read order. */\n readonly gaps: readonly string[]\n}\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 * (`loops-reader.ts` is one).\n */\n\nimport {\n type DecisionMetrics,\n type EconomicsMetrics,\n isUnavailable,\n type Measured,\n type OrchestrationMetrics,\n type OutcomeMetrics,\n type PatchStats,\n type PerWorkerRow,\n type RollupCellRow,\n type SteerBreakdown,\n SUPERVISOR_RUN_ROLLUP_SCHEMA,\n SUPERVISOR_RUN_SCHEMA,\n type SupervisorRunReport,\n type SupervisorRunRollup,\n type SupervisorRunSources,\n type Unavailable,\n unavailable,\n} from './types'\n\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 status?: unknown\n verdict?: unknown\n reason?: 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\ninterface SpendLike {\n tokens: Tokens\n usd: number\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 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 },\n usd: num(rec.usd),\n }\n}\n\nconst NO_CACHE_COUNTERS = 'the journal carries no cache-token counters for this role'\n\nexport function parseJsonl(text: string | null): Record<string, unknown>[] {\n if (text === null) return []\n const out: Record<string, unknown>[] = []\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) out.push(parsed as Record<string, unknown>)\n } catch {\n // A torn last line (writer killed mid-append) is skipped, never fatal.\n }\n }\n return out\n}\n\nexport function parseJson(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 id: string\n parent: string | null\n label: string\n at: number | null\n}\n\nexport interface CloseRow {\n id: string\n kind: 'settled' | 'cancelled'\n status: string | null\n verdict: string | 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 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 /** `patchBytes` as reported by the finished event (not the patch file's size). */\n finishedPatchBytes: number | null\n evidenceBytes: number\n steersQueued: number\n steersDelivered: number\n questions: 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 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 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 usd: number\n meteredCount: number\n }\n readonly workerLogs: ReadonlyMap<string, WorkerLogFacts>\n readonly startedAt: number | null\n readonly completedAt: number | null\n}\n\nexport function parseSupervisorTree(src: SupervisorRunSources): SupervisorTreeFacts {\n const events = parseJsonl(src.journal)\n const state = parseJson(src.state)\n\n const spawns: SpawnRow[] = []\n const closes: CloseRow[] = []\n let brainIn = 0\n let brainOut = 0\n let brainCacheRead = 0\n let brainCacheWrite = 0\n let brainHasCache = false\n let brainUsd = 0\n let meteredCount = 0\n let rootId: string | null = null\n for (const ev of events as JournalEvent[]) {\n const kind = typeof ev.kind === 'string' ? ev.kind : ''\n const id = typeof ev.id === 'string' ? ev.id : ''\n if (kind === 'spawned') {\n const parent = typeof ev.parent === 'string' ? ev.parent : null\n const label = typeof ev.label === 'string' ? ev.label : ''\n if (parent === null && rootId === null) rootId = id\n spawns.push({ id, parent, label, at: ms(ev.at) })\n } else if (kind === 'settled') {\n closes.push({\n id,\n kind: 'settled',\n status: typeof ev.status === 'string' ? ev.status : null,\n verdict: typeof ev.verdict === 'string' ? ev.verdict : null,\n at: ms(ev.at),\n spend: readSpend(ev.spent),\n hasSpend: asRecord(ev.spent).tokens !== undefined,\n })\n } else if (kind === 'cancelled') {\n closes.push({\n id,\n kind: 'cancelled',\n status: 'cancelled',\n verdict: typeof ev.reason === 'string' ? ev.reason : null,\n at: ms(ev.at),\n spend: {\n tokens: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, hasCache: false },\n usd: 0,\n },\n hasSpend: false,\n })\n } else if (kind === 'metered') {\n const s = readSpend(ev.spend)\n brainIn += s.tokens.input\n brainOut += s.tokens.output\n brainCacheRead += s.tokens.cacheRead\n brainCacheWrite += s.tokens.cacheWrite\n brainHasCache = brainHasCache || s.tokens.hasCache\n brainUsd += s.usd\n meteredCount += 1\n }\n }\n\n const workerSpawns = spawns.filter((s) => 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 for (const w of src.workers ?? []) {\n const facts: WorkerLogFacts = {\n started: null,\n finished: false,\n finishedAt: null,\n passed: null,\n finishedPatchBytes: null,\n evidenceBytes: 0,\n steersQueued: 0,\n steersDelivered: 0,\n questions: 0,\n }\n for (const req of parseJsonl(w.inbox)) {\n if (typeof req.message === 'string' && req.message.trim().length > 0) facts.steersQueued += 1\n }\n for (const ev of parseJsonl(w.events)) {\n const kind = ev.kind\n if (kind === 'message') {\n if (ev.direction === 'up') {\n facts.questions += 1\n continue\n }\n // A down-leg message not backed by an inbox line (in-process steer) still counts.\n if (typeof ev.requestId !== 'string') facts.steersQueued += 1\n if (ev.delivered === true) facts.steersDelivered += 1\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.finishedPatchBytes = typeof ev.patchBytes === 'number' ? ev.patchBytes : null\n facts.evidenceBytes = typeof ev.evidence === 'string' ? ev.evidence.length : 0\n }\n }\n workerLogs.set(w.label, facts)\n }\n\n const startedAt = ms(state?.startedAt) ?? spawns[0]?.at ?? null\n const completedAt =\n ms(state?.completedAt) ??\n [...spawns.map((s) => s.at), ...closes.map((c) => c.at)].reduce<number | null>(\n (acc, t) => (t === null ? acc : acc === null ? t : Math.max(acc, t)),\n null,\n )\n\n return {\n rootId,\n spawns,\n closes,\n workerSpawns,\n workerCloses,\n brain: {\n tokensIn: brainIn,\n tokensOut: brainOut,\n cacheRead: brainCacheRead,\n cacheWrite: brainCacheWrite,\n hasCache: brainHasCache,\n usd: brainUsd,\n meteredCount,\n },\n workerLogs,\n startedAt,\n completedAt,\n }\n}\n\n// ---------------------------------------------------------------------------\n// The analyzer.\n// ---------------------------------------------------------------------------\n\n/**\n * Analyze already-read supervisor-run bytes. Pure and synchronous: same bytes\n * in, same report out (modulo `generatedAt`, which `now` pins in tests).\n */\nexport function analyzeSupervisorRunSources(\n src: SupervisorRunSources,\n now: () => number = Date.now,\n): SupervisorRunReport {\n const gaps: string[] = []\n const gap = (what: string, reason: string): Unavailable => {\n gaps.push(`${what}: ${reason}`)\n return unavailable(reason)\n }\n\n const journalMissing =\n src.supRunDir === null\n ? 'no supervisor run dir under <ws>/.loops/supervisor'\n : 'journal.jsonl absent'\n const haveJournal = src.journal !== null\n const state = parseJson(src.state)\n const result = parseJson(src.result)\n const judge = parseJson(src.judge)\n const tree = parseSupervisorTree(src)\n const { rootId, workerSpawns, workerCloses, startedAt, completedAt } = tree\n\n const supervisorWallMs: Measured<number> =\n startedAt !== null && completedAt !== null && completedAt >= startedAt\n ? completedAt - startedAt\n : !haveJournal\n ? gap('supervisorWallMs', journalMissing)\n : gap('supervisorWallMs', 'no parseable start/complete timestamps in state.json or journal')\n\n // ── steers (worker inbox + control events) ─────────────────────────────\n const steerRows: SteerBreakdown[] = []\n let steerQueuedTotal = 0\n let steerDeliveredTotal = 0\n let upLegMessages = 0\n if (src.workers !== null) {\n for (const w of src.workers) {\n const facts = tree.workerLogs.get(w.label)\n const queued = facts?.steersQueued ?? 0\n const delivered = facts?.steersDelivered ?? 0\n upLegMessages += facts?.questions ?? 0\n steerRows.push({ worker: w.label, queued, delivered })\n steerQueuedTotal += queued\n steerDeliveredTotal += delivered\n }\n }\n const workersGapReason = src.workersMissingReason ?? 'workers/ directory absent'\n const steers: Measured<number> =\n src.workers === null ? gap('steers', workersGapReason) : steerQueuedTotal\n const steersDelivered: Measured<number> =\n src.workers === null ? unavailable(workersGapReason) : steerDeliveredTotal\n const steersByWorker: Measured<readonly SteerBreakdown[]> =\n src.workers === null ? unavailable(workersGapReason) : steerRows\n\n // The `[driver] registered tools: …supervisor_steer…` banner names the verb without\n // invoking it, so banner lines are subtracted from the raw mention count.\n const driverSteerCalls: Measured<number> =\n src.driverLog === null\n ? gap('driverSteerCalls', 'driver.log absent')\n : Math.max(\n 0,\n (src.driverLog.match(/supervisor_steer/g) ?? []).length -\n registrationMentions(src.driverLog),\n )\n\n // ── waves / concurrency / idle ─────────────────────────────────────────\n const timeline: { at: number; delta: 1 | -1 }[] = []\n for (const s of workerSpawns) if (s.at !== null) timeline.push({ at: s.at, delta: 1 })\n for (const c of workerCloses) if (c.at !== null) timeline.push({ at: c.at, delta: -1 })\n timeline.sort((a, b) => a.at - b.at || a.delta - b.delta)\n\n let waves = 0\n const waveSizes: number[] = []\n let closedSinceWaveStart = true\n for (const step of timeline) {\n if (step.delta === 1) {\n if (closedSinceWaveStart) {\n waves += 1\n waveSizes.push(0)\n closedSinceWaveStart = false\n }\n waveSizes[waveSizes.length - 1] = (waveSizes[waveSizes.length - 1] ?? 0) + 1\n } else {\n closedSinceWaveStart = true\n }\n }\n\n let live = 0\n let maxConcurrency = 0\n let idleMs = 0\n let sumWorkerWallMs = 0\n let prev = startedAt\n for (const step of timeline) {\n if (prev !== null && step.at >= prev) {\n const span = step.at - prev\n if (live === 0) idleMs += span\n sumWorkerWallMs += span * live\n }\n live += step.delta\n if (live > maxConcurrency) maxConcurrency = live\n prev = step.at\n }\n if (prev !== null && completedAt !== null && completedAt >= prev) {\n const span = completedAt - prev\n if (live === 0) idleMs += span\n sumWorkerWallMs += span * live\n }\n\n const firstWorkerSpawnAt = workerSpawns.reduce<number | null>(\n (acc, s) => (s.at === null ? acc : acc === null ? s.at : Math.min(acc, s.at)),\n null,\n )\n const firstSettleAt = workerCloses.reduce<number | null>(\n (acc, c) => (c.at === null ? acc : acc === null ? c.at : Math.min(acc, c.at)),\n null,\n )\n const respawns =\n firstSettleAt === null\n ? 0\n : workerSpawns.filter((s) => s.at !== null && s.at > firstSettleAt).length\n\n const labelCounts = new Map<string, number>()\n for (const s of workerSpawns) labelCounts.set(s.label, (labelCounts.get(s.label) ?? 0) + 1)\n const repeatedLabels = [...labelCounts.entries()].filter(([, n]) => n > 1).map(([l]) => l)\n\n const parentOf = new Map(tree.spawns.map((s) => [s.id, s.parent]))\n let delegationDepth = 0\n for (const s of workerSpawns) {\n let d = 0\n let cur: string | null = s.id\n const seen = new Set<string>()\n while (cur !== null && cur !== rootId && !seen.has(cur)) {\n seen.add(cur)\n d += 1\n cur = parentOf.get(cur) ?? null\n }\n if (d > delegationDepth) delegationDepth = d\n }\n\n const orchestration: OrchestrationMetrics = {\n workersSpawned: haveJournal ? workerSpawns.length : gap('workersSpawned', journalMissing),\n workersSettled: haveJournal\n ? workerCloses.filter((c) => c.kind === 'settled').length\n : unavailable(journalMissing),\n workersCancelled: haveJournal\n ? workerCloses.filter((c) => c.kind === 'cancelled').length\n : unavailable(journalMissing),\n steers,\n steersDelivered,\n steersByWorker,\n driverSteerCalls,\n waves: haveJournal ? waves : unavailable(journalMissing),\n waveSizes: haveJournal ? waveSizes : unavailable(journalMissing),\n maxConcurrency: haveJournal ? maxConcurrency : unavailable(journalMissing),\n respawns: haveJournal ? respawns : unavailable(journalMissing),\n repeatedLabels: haveJournal ? repeatedLabels : unavailable(journalMissing),\n delegationDepth: haveJournal ? delegationDepth : unavailable(journalMissing),\n timeToFirstSpawnMs:\n startedAt !== null && firstWorkerSpawnAt !== null\n ? firstWorkerSpawnAt - startedAt\n : haveJournal\n ? unavailable('no worker spawn timestamps')\n : unavailable(journalMissing),\n supervisorWallMs,\n idleMs: isUnavailable(supervisorWallMs) ? unavailable(supervisorWallMs.unavailable) : idleMs,\n idlePct:\n isUnavailable(supervisorWallMs) || supervisorWallMs === 0\n ? isUnavailable(supervisorWallMs)\n ? unavailable(supervisorWallMs.unavailable)\n : unavailable('supervisor wall is 0ms')\n : round((idleMs / supervisorWallMs) * 100, 1),\n workerUtilization:\n isUnavailable(supervisorWallMs) || supervisorWallMs === 0\n ? isUnavailable(supervisorWallMs)\n ? unavailable(supervisorWallMs.unavailable)\n : unavailable('supervisor wall is 0ms')\n : round(sumWorkerWallMs / supervisorWallMs, 3),\n }\n\n // ── decision quality ───────────────────────────────────────────────────\n const settledByStatus: Record<string, number> = {}\n const settledVerdicts: Record<string, number> = {}\n for (const c of workerCloses) {\n const key = c.status ?? 'unknown'\n settledByStatus[key] = (settledByStatus[key] ?? 0) + 1\n if (c.verdict !== null) settledVerdicts[c.verdict] = (settledVerdicts[c.verdict] ?? 0) + 1\n }\n\n // A store with no verify step never says pass or fail. Counting its silent\n // workers as `rejected: 0 / accepted: 0` would read as \"nothing was accepted\".\n const verdictLimit = src.limits.workerVerdicts\n let accepted = 0\n let rejected = 0\n let emptyPass = 0\n let evidenceBytes = 0\n for (const w of src.workers ?? []) {\n const f = tree.workerLogs.get(w.label)\n if (f === undefined || !f.finished) continue\n evidenceBytes += f.evidenceBytes\n if (f.passed === true) {\n if ((f.finishedPatchBytes ?? 0) > 0) accepted += 1\n else emptyPass += 1\n } else if (f.passed === false) rejected += 1\n }\n\n // Evidence→respawn: for each worker spawn issued after some settlement, did a\n // settlement land strictly between the previous spawn and this one?\n let observeThenRespawn = 0\n let respawnWithoutEvidence = 0\n const spawnTimes = workerSpawns\n .map((s) => s.at)\n .filter((t): t is number => t !== null)\n .sort((a, b) => a - b)\n const closeTimes = workerCloses\n .map((c) => c.at)\n .filter((t): t is number => t !== null)\n .sort((a, b) => a - b)\n for (let i = 1; i < spawnTimes.length; i += 1) {\n const prevSpawn = spawnTimes[i - 1] as number\n const thisSpawn = spawnTimes[i] as number\n const sawEvidence = closeTimes.some((t) => t >= prevSpawn && t <= thisSpawn)\n if (firstSettleAt !== null && thisSpawn > firstSettleAt) {\n if (sawEvidence) observeThenRespawn += 1\n else respawnWithoutEvidence += 1\n }\n }\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:\n verdictLimit !== null\n ? unavailable(verdictLimit)\n : src.workers === null\n ? unavailable(workersGapReason)\n : rejected,\n emptyPass:\n verdictLimit !== null || src.limits.deliverables !== null\n ? unavailable(verdictLimit ?? (src.limits.deliverables as string))\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 ? unavailable(workersGapReason) : steerQueuedTotal + upLegMessages,\n workerEvidenceBytes: src.workers === null ? unavailable(workersGapReason) : evidenceBytes,\n }\n\n // ── economics ──────────────────────────────────────────────────────────\n const journalWorkerIn = workerCloses.reduce((a, c) => a + c.spend.tokens.input, 0)\n const journalWorkerOut = workerCloses.reduce((a, c) => a + c.spend.tokens.output, 0)\n const journalWorkerUsd = workerCloses.reduce((a, c) => a + c.spend.usd, 0)\n const labelById = new Map(tree.workerSpawns.map((s) => [s.id, s.label]))\n const workerUsdByLabel = new Map<string, number>()\n for (const c of workerCloses) {\n const label = labelById.get(c.id)\n if (label === undefined) continue\n workerUsdByLabel.set(label, (workerUsdByLabel.get(label) ?? 0) + c.spend.usd)\n }\n const sq = src.harnessWorkerTokens\n const harnessGapReason =\n src.harnessMissingReason ?? 'harness session store unavailable and journal settled spend is 0'\n const workerIn: Measured<number> =\n sq !== null\n ? journalWorkerIn + sq.input\n : journalWorkerIn > 0\n ? journalWorkerIn\n : gap('workers.tokensIn', harnessGapReason)\n const workerOut: Measured<number> =\n sq !== null\n ? journalWorkerOut + sq.output\n : journalWorkerOut > 0\n ? journalWorkerOut\n : unavailable(harnessGapReason)\n\n const stateResult = asRecord(state?.result)\n const stateUsd = typeof stateResult.spentUsd === 'number' ? stateResult.spentUsd : null\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 const totalUsd: Measured<number> =\n usdLimit !== null\n ? gap('totalUsd', usdLimit)\n : stateUsd !== null\n ? round(stateUsd, 6)\n : haveJournal\n ? round(tree.brain.usd + journalWorkerUsd, 6)\n : gap('totalUsd', journalMissing)\n\n const perWorker: PerWorkerRow[] = (src.workers ?? []).map((w) => {\n const f = tree.workerLogs.get(w.label)\n return {\n worker: w.label,\n wallMs: f?.started != null && f.finishedAt != null ? f.finishedAt - f.started : null,\n tokensIn: w.tokensIn ?? null,\n tokensOut: w.tokensOut ?? null,\n usd: usdLimit !== null ? null : (workerUsdByLabel.get(w.label) ?? null),\n patchBytes: w.patchBytes ?? f?.finishedPatchBytes ?? null,\n passed: f?.passed ?? null,\n }\n })\n const walls = perWorker\n .map((w) => w.wallMs)\n .filter((w): w is number => w !== null)\n .sort((a, b) => a - b)\n\n const brainCalls = parseJsonl(src.brainLog)\n const economics: EconomicsMetrics = {\n brain: {\n tokensIn: haveJournal ? tree.brain.tokensIn : gap('brain.tokensIn', journalMissing),\n tokensOut: haveJournal ? tree.brain.tokensOut : unavailable(journalMissing),\n usd:\n usdLimit !== null\n ? unavailable(usdLimit)\n : haveJournal\n ? round(tree.brain.usd, 6)\n : unavailable(journalMissing),\n cacheRead: !haveJournal\n ? unavailable(journalMissing)\n : tree.brain.hasCache\n ? tree.brain.cacheRead\n : unavailable(NO_CACHE_COUNTERS),\n cacheWrite: !haveJournal\n ? unavailable(journalMissing)\n : tree.brain.hasCache\n ? tree.brain.cacheWrite\n : unavailable(NO_CACHE_COUNTERS),\n source: haveJournal\n ? `journal metered events (n=${tree.brain.meteredCount})`\n : journalMissing,\n },\n brainTruncations:\n src.brainLog === null\n ? gap(\n 'brain.brainTruncations',\n src.supRunDir === null\n ? 'no supervisor run dir under <ws>/.loops/supervisor'\n : 'brain.jsonl absent — loops predates the brain-call tap, so truncation cannot be ruled out',\n )\n : brainCalls.filter((c) => c.finish_reason === 'length').length,\n workers: {\n tokensIn: workerIn,\n tokensOut: workerOut,\n cacheRead: sq?.cacheRead !== undefined ? sq.cacheRead : unavailable(NO_CACHE_COUNTERS),\n cacheWrite: sq?.cacheWrite !== undefined ? sq.cacheWrite : unavailable(NO_CACHE_COUNTERS),\n usd:\n usdLimit !== null\n ? unavailable(usdLimit)\n : haveJournal\n ? round(journalWorkerUsd, 6)\n : unavailable(journalMissing),\n source:\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 totalUsd,\n totalUsdSource:\n usdLimit !== null\n ? usdLimit\n : stateUsd !== null\n ? `state.json result.spentUsd${journalWorkerUsd === 0 ? ' — brain-priced only; worker CLI inference is unpriced (see worker token counts)' : ''}`\n : haveJournal\n ? 'journal metered + settled usd'\n : journalMissing,\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 walls.length === 0\n ? unavailable(\n src.workers === null ? workersGapReason : 'no worker start/finish pairs captured',\n )\n : {\n n: walls.length,\n min: walls[0] as number,\n p50: quantile(walls, 0.5),\n p90: quantile(walls, 0.9),\n max: walls[walls.length - 1] as number,\n sum: walls.reduce((a, b) => a + b, 0),\n },\n perWorker: src.workers === null ? unavailable(workersGapReason) : perWorker,\n }\n\n // ── outcome ────────────────────────────────────────────────────────────\n const patchStats: Measured<PatchStats> =\n src.patch === null\n ? gap('patch', src.limits.deliverables ?? 'delivered patch file absent')\n : parsePatch(src.patch)\n\n const outcome: OutcomeMetrics = {\n supStatus:\n pickString(state, 'status') ??\n pickString(result, 'sup_status') ??\n gap('supStatus', 'no state.json / result.json status'),\n supVerdict:\n pickString(state, 'verdict') ??\n pickString(result, 'sup_verdict') ??\n unavailable('no state.json / result.json verdict'),\n delivered:\n typeof stateResult.delivered === 'boolean'\n ? stateResult.delivered\n : typeof result?.delivered === 'boolean'\n ? result.delivered\n : unavailable('no delivered flag in state.json or result.json'),\n judgeResolved:\n judge === null\n ? gap('judge', 'judge.json absent')\n : typeof judge.resolved === 'boolean'\n ? judge.resolved\n : null,\n judgeScore:\n judge === null\n ? unavailable('judge.json absent')\n : typeof judge.score === 'number'\n ? judge.score\n : null,\n judgePassed:\n judge === null\n ? unavailable('judge.json absent')\n : typeof judge.passed === 'number'\n ? judge.passed\n : null,\n judgeTotal:\n judge === null\n ? unavailable('judge.json absent')\n : typeof judge.total === 'number'\n ? judge.total\n : null,\n verifyPass:\n typeof result?.verify_pass === 'boolean'\n ? result.verify_pass\n : gap('verifyPass', 'result.json absent or has no verify_pass'),\n verifyRc:\n typeof result?.verify_rc === 'number'\n ? result.verify_rc\n : unavailable('result.json absent or has no verify_rc'),\n patch: patchStats,\n judgeSource: src.judgeSource,\n }\n\n return {\n schema: SUPERVISOR_RUN_SCHEMA,\n runRef: src.runRef,\n instanceId: src.instanceId,\n arm: src.arm,\n supervisorId: rootId !== null ? rootId : unavailable(journalMissing),\n generatedAt: new Date(now()).toISOString(),\n orchestration,\n decision,\n economics,\n outcome,\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/** `[driver] registered tools: …supervisor_steer…` is a banner, not an invocation. */\nfunction registrationMentions(driverLog: string): number {\n let n = 0\n for (const line of driverLog.split('\\n')) {\n if (line.includes('registered tools:') && line.includes('supervisor_steer')) n += 1\n }\n return n\n}\n\nfunction pickString(rec: Record<string, unknown> | null, key: string): string | null {\n const v = rec?.[key]\n return typeof v === 'string' ? v : null\n}\n\nexport function round(v: number, digits: number): number {\n const f = 10 ** digits\n return Math.round(v * f) / f\n}\n\nfunction quantile(sorted: readonly number[], q: number): number {\n if (sorted.length === 0) return 0\n const idx = Math.min(sorted.length - 1, Math.max(0, Math.ceil(q * sorted.length) - 1))\n return sorted[idx] as number\n}\n\n/** Unified-diff stats. Counts `+++ b/<path>` targets, body +/- lines, and test-file touches. */\nexport function parsePatch(text: string): PatchStats {\n const files = new Set<string>()\n const testFiles = new Set<string>()\n let added = 0\n let removed = 0\n for (const line of text.split('\\n')) {\n if (line.startsWith('+++ ')) {\n const p = line.slice(4).trim().replace(/^b\\//, '')\n if (p !== '/dev/null') {\n files.add(p)\n if (isTestPath(p)) testFiles.add(p)\n }\n continue\n }\n if (line.startsWith('--- ') || line.startsWith('diff --git') || line.startsWith('index ')) {\n continue\n }\n if (line.startsWith('+')) added += 1\n else if (line.startsWith('-')) removed += 1\n }\n return {\n files: files.size,\n linesAdded: added,\n linesRemoved: removed,\n testFilesTouched: [...testFiles].sort(),\n }\n}\n\nfunction isTestPath(p: string): boolean {\n const base = p.split('/').pop() ?? p\n return (\n /(^|\\/)(tests?|__tests__|testing|spec)(\\/|$)/.test(p) ||\n /\\.(test|spec)\\.[cm]?[jt]sx?$/.test(base) ||\n /^test_.*\\.py$/.test(base) ||\n /_test\\.py$/.test(base)\n )\n}\n\n// ---------------------------------------------------------------------------\n// Rollup across runs.\n// ---------------------------------------------------------------------------\n\n/**\n * Aggregate many supervisor-run reports. A metric no run could measure stays\n * `unavailable` rather than becoming a 0-valued mean, and cells whose steer\n * count was unavailable are counted separately from cells that measured zero.\n */\nexport function rollupSupervisorRuns(reports: readonly SupervisorRunReport[]): SupervisorRunRollup {\n const known = <T>(vals: readonly Measured<T>[]): T[] =>\n vals.filter((v): v is T => !isUnavailable(v))\n const steerVals = known(reports.map((r) => r.orchestration.steers))\n const waveVals = known(reports.map((r) => r.orchestration.waves))\n const concVals = known(reports.map((r) => r.orchestration.maxConcurrency))\n const utilVals = known(reports.map((r) => r.orchestration.workerUtilization))\n const idleVals = known(reports.map((r) => r.orchestration.idlePct))\n const spawnVals = known(reports.map((r) => r.orchestration.workersSpawned))\n const acceptVals = known(reports.map((r) => r.decision.accepted))\n const usdVals = known(reports.map((r) => r.economics.totalUsd))\n const resolvedVals = known(reports.map((r) => r.outcome.judgeResolved))\n const sum = (xs: readonly number[]): number => xs.reduce((a, b) => a + b, 0)\n const mean = (xs: readonly number[]): Measured<number> =>\n xs.length === 0 ? unavailable('no cell reported this metric') : round(sum(xs) / xs.length, 3)\n\n const perCell: RollupCellRow[] = reports.map((r) => ({\n instanceId: r.instanceId,\n arm: r.arm,\n steers: r.orchestration.steers,\n waves: r.orchestration.waves,\n utilization: r.orchestration.workerUtilization,\n idlePct: r.orchestration.idlePct,\n resolved: r.outcome.judgeResolved,\n usd: r.economics.totalUsd,\n }))\n\n return {\n schema: SUPERVISOR_RUN_ROLLUP_SCHEMA,\n cells: reports.length,\n steersTotal:\n steerVals.length === 0 ? unavailable('no cell reported a steer count') : sum(steerVals),\n cellsWithSteers:\n steerVals.length === 0\n ? unavailable('no cell reported a steer count')\n : steerVals.filter((n) => n > 0).length,\n cellsWithUnavailableSteers: reports.filter((r) => isUnavailable(r.orchestration.steers)).length,\n wavesMean: mean(waveVals),\n maxConcurrencyMax:\n concVals.length === 0 ? unavailable('no cell reported concurrency') : Math.max(...concVals),\n utilizationMean: mean(utilVals),\n idlePctMean: mean(idleVals),\n workersSpawnedTotal:\n spawnVals.length === 0 ? unavailable('no cell reported spawns') : sum(spawnVals),\n acceptedTotal:\n acceptVals.length === 0 ? unavailable('no cell reported acceptance') : sum(acceptVals),\n usdTotal: usdVals.length === 0 ? unavailable('no cell reported spend') : round(sum(usdVals), 6),\n resolvedCount:\n resolvedVals.length === 0\n ? unavailable('no cell reported a judge verdict')\n : resolvedVals.filter((v) => v === true).length,\n perCell,\n }\n}\n","/**\n * Supervision-tree reader over a THIRD-PARTY harness: Claude Code.\n *\n * `loops-reader.ts` reads a supervisor we wrote, whose journal was designed\n * for this analysis. This reader reads a harness we do not control, whose\n * transcript was designed for replaying a chat — and recovers the same tree\n * from it. If both produce a `SupervisorRunSources`, the tree model is a\n * property of multi-agent runs, not of our journal format.\n *\n * ## Where the tree hides in a Claude Code transcript\n *\n * | Tree fact | Claude Code evidence |\n * |---|---|\n * | spawn | assistant `tool_use` (`Agent` / `Task`), answered by a `tool_result` whose `toolUseResult.agentId` names the child |\n * | settle | a `<task-notification>` block in a later user line: `<task-id>` = agentId, `<status>` |\n * | steer | assistant `tool_use` (`SendMessage`) with `input.to` = agentId — mid-task, to a LIVE child |\n * | delivered | that steer's `tool_result` carrying `success` / `resumedAgentId` |\n * | cancel | assistant `tool_use` (`TaskStop`) targeting an agentId |\n * | brain spend| `message.usage` on the main thread's assistant lines |\n * | worker spend| `message.usage` inside `<session>/subagents/agent-<id>.jsonl` |\n * | depth | a child transcript that itself contains `Agent` tool_use lines |\n *\n * Every one of those is read through `parseClaudeEntries` — the SAME line\n * parser `src/rollout/readers/claude-jsonl.ts` uses for solo rollouts. There\n * is no second transcript parser.\n *\n * ## What Claude Code cannot say\n *\n * It records tokens but never a price, runs no per-worker verify, and keeps no\n * per-worker patch. Those are declared once in `limits`, so the analyzer\n * reports `unavailable — <reason>` instead of the $0 / 0-accepted that summing\n * an empty field would produce. See `SourceLimits`.\n *\n * ## Metric coverage vs the loops journal\n *\n * Measured on a real 52-agent session (fixture:\n * `tests/fixtures/supervisor-run/claude-code-session-*`).\n *\n * | Metric | loops | Claude Code | Why |\n * |---|---|---|---|\n * | workersSpawned / Settled / Cancelled | full | full | spawn tool_use + task-notification + TaskStop |\n * | steers / steersDelivered / steersByWorker | full | full | `SendMessage`; delivery from its tool_result |\n * | waves / waveSizes / maxConcurrency | full | full | derived from spawn/settle instants |\n * | respawns / repeatedLabels | full | full | same derivation |\n * | delegationDepth | full | full | a child transcript's own spawn calls |\n * | timeToFirstSpawn / supervisorWall | full | full | transcript instants |\n * | idleMs / idlePct / workerUtilization | full | PARTIAL | an agent that never notifies is counted live to the end of the transcript |\n * | observeThenRespawn / respawnWithoutEvidence | full | full | ordering of spawn vs settle instants |\n * | workerEvidenceBytes | full | PARTIAL | the child's closing message; 0 for pruned transcripts |\n * | brain tokens in/out + cache | full | full | main-thread `message.usage` |\n * | worker tokens in/out + cache | via harness join | PARTIAL | only for retained subagent transcripts |\n * | perWorker wall | full | full | spawn → settle instants |\n * | accepted / rejected / emptyPass / settledVerdicts | full | NONE | no per-worker verify step exists |\n * | brain/worker/total usd, costPerAcceptedPatch | full | NONE | transcripts carry no price |\n * | patch stats, delivered, verifyPass/Rc | full | NONE | no diff is handed back |\n * | judgeResolved / Score / Passed / Total | full | NONE | no judge in the loop |\n * | driverSteerCalls, brainTruncations | full | NONE | no outer driver log, no per-call finish_reason tap |\n */\n\nimport { readdir, readFile } from 'node:fs/promises'\nimport { basename, dirname, join } from 'node:path'\nimport {\n type ClaudeEntry,\n parseClaudeEntries,\n transcriptFromEntries,\n} from '../rollout/readers/claude-jsonl'\nimport type { SupervisorRunReader, SupervisorRunSources, WorkerLogSource } from './types'\n\n/** Tool names that spawn a child agent. `Task` is the older name for `Agent`. */\nexport const DEFAULT_SPAWN_TOOLS = ['Agent', 'Task'] as const\n/** Tool names that deliver a message to an ALREADY-RUNNING child agent. */\nexport const DEFAULT_STEER_TOOLS = ['SendMessage'] as const\n/** Tool names that stop a running child agent. */\nexport const DEFAULT_CANCEL_TOOLS = ['TaskStop', 'KillAgent'] as const\n\nconst SPEND_UNPRICED =\n 'Claude Code transcripts record token usage but never a price — usd is not in the store'\nconst NO_VERDICTS =\n 'Claude Code runs no per-worker verify step — a subagent reports prose, not pass/fail'\nconst NO_DELIVERABLES =\n 'Claude Code retains no per-worker patch — subagents commit to git, they do not hand back a diff'\n\nexport interface ClaudeCodeReaderOptions {\n /** The main session transcript: `~/.claude/projects/<slug>/<sessionId>.jsonl`. */\n readonly transcriptPath: string\n /**\n * Directory of child transcripts. Defaults to `<transcript-dir>/<sessionId>/subagents`.\n * `null` skips the join, and every per-worker token count becomes unavailable.\n */\n readonly subagentsDir?: string | null\n readonly runRef?: string\n readonly instanceId?: string | null\n readonly arm?: string | null\n readonly spawnTools?: readonly string[]\n readonly steerTools?: readonly string[]\n readonly cancelTools?: readonly string[]\n}\n\nconst isRecord = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null && !Array.isArray(v)\n\nconst str = (v: unknown): string | null => (typeof v === 'string' ? v : null)\n\ninterface ToolUse {\n readonly id: string\n readonly name: string\n readonly input: Record<string, unknown>\n readonly at: string | null\n}\n\ninterface ToolResult {\n readonly id: string\n readonly at: string | null\n readonly structured: unknown\n readonly text: string\n}\n\n/** Every tool call and tool result on one thread, in order, with instants. */\ninterface ThreadCalls {\n readonly uses: ToolUse[]\n readonly results: Map<string, ToolResult>\n readonly notifications: TaskNotification[]\n readonly firstAt: string | null\n readonly lastAt: string | null\n}\n\ninterface TaskNotification {\n readonly taskId: string\n readonly toolUseId: string | null\n readonly status: string\n readonly summary: string | null\n readonly at: string | null\n}\n\nfunction blockText(content: unknown): string {\n if (typeof content === 'string') return content\n if (!Array.isArray(content)) return ''\n const parts: string[] = []\n for (const b of content) {\n if (isRecord(b) && b.type === 'text' && typeof b.text === 'string') parts.push(b.text)\n }\n return parts.join('\\n')\n}\n\nconst tag = (xml: string, name: string): string | null => {\n const m = xml.match(new RegExp(`<${name}>([\\\\s\\\\S]*?)</${name}>`))\n return m === null ? null : (m[1] as string)\n}\n\n/**\n * Task notifications are the settle instants. A notification fires each time an\n * agent stops, so a resumed agent produces several — they are kept in order and\n * the LAST one is the settle the analyzer sees, with the earlier ones acting as\n * the intermediate stops they actually were.\n */\nfunction parseNotifications(text: string, at: string | null): TaskNotification[] {\n const out: TaskNotification[] = []\n for (const m of text.matchAll(/<task-notification>[\\s\\S]*?<\\/task-notification>/g)) {\n const xml = m[0]\n const taskId = tag(xml, 'task-id')\n if (taskId === null) continue\n out.push({\n taskId: taskId.trim(),\n toolUseId: tag(xml, 'tool-use-id')?.trim() ?? null,\n status: tag(xml, 'status')?.trim() ?? 'unknown',\n summary: tag(xml, 'summary')?.trim() ?? null,\n at,\n })\n }\n return out\n}\n\n/** Project entries of ONE thread (main or a single sidechain) into tool traffic. */\nfunction threadCalls(entries: readonly ClaudeEntry[]): ThreadCalls {\n const uses: ToolUse[] = []\n const results = new Map<string, ToolResult>()\n const notifications: TaskNotification[] = []\n let firstAt: string | null = null\n let lastAt: string | null = null\n\n for (const entry of entries) {\n if (entry.timestamp !== null) {\n if (firstAt === null) firstAt = entry.timestamp\n lastAt = entry.timestamp\n }\n const content = entry.message.content\n if (entry.type === 'assistant') {\n if (!Array.isArray(content)) continue\n for (const block of content) {\n if (!isRecord(block) || block.type !== 'tool_use') continue\n const id = str(block.id)\n const name = str(block.name)\n if (id === null || name === null) continue\n uses.push({\n id,\n name,\n input: isRecord(block.input) ? block.input : {},\n at: entry.timestamp,\n })\n }\n continue\n }\n if (typeof content === 'string') {\n notifications.push(...parseNotifications(content, entry.timestamp))\n continue\n }\n if (!Array.isArray(content)) continue\n for (const block of content) {\n if (!isRecord(block)) continue\n if (block.type === 'tool_result' && typeof block.tool_use_id === 'string') {\n results.set(block.tool_use_id, {\n id: block.tool_use_id,\n at: entry.timestamp,\n structured: entry.toolUseResult,\n text: blockText(block.content),\n })\n } else if (block.type === 'text' && typeof block.text === 'string') {\n notifications.push(...parseNotifications(block.text, entry.timestamp))\n }\n }\n }\n return { uses, results, notifications, firstAt, lastAt }\n}\n\n/**\n * The agent id a spawn produced. Claude Code puts it in the structured\n * `toolUseResult`; the same id is echoed in the result text for transcripts\n * written before that field existed, so both are tried before giving up.\n */\nfunction spawnedAgentId(result: ToolResult | undefined): string | null {\n if (result === undefined) return null\n if (isRecord(result.structured)) {\n const id = str(result.structured.agentId)\n if (id !== null) return id\n }\n return result.text.match(/agentId:\\s*([A-Za-z0-9_-]+)/)?.[1] ?? null\n}\n\ninterface ChildTranscript {\n readonly agentId: string\n readonly path: string\n readonly description: string | null\n readonly spawnToolUseId: string | null\n readonly spawnDepth: number | null\n readonly entries: ClaudeEntry[]\n readonly tokensIn: number\n readonly tokensOut: number\n readonly cacheRead: number\n readonly cacheWrite: number\n readonly firstAt: string | null\n readonly lastAt: string | null\n readonly model: string | null\n /**\n * The child's closing assistant message — what it actually handed back. This\n * is the Claude Code analogue of a worker's `evidence` blob.\n */\n readonly finalReport: string | null\n}\n\nasync function readChildren(dir: string): Promise<ChildTranscript[]> {\n const names = await readdir(dir).catch(() => null)\n if (names === null) return []\n const out: ChildTranscript[] = []\n for (const name of names.filter((n) => n.endsWith('.jsonl')).sort()) {\n const path = join(dir, name)\n const raw = await readFile(path, 'utf8').catch(() => null)\n if (raw === null) continue\n const entries = parseClaudeEntries(raw)\n // A subagent transcript is sidechain end to end — that flag is what marks it\n // a separate invocation rather than a turn of the parent.\n const projected = transcriptFromEntries(entries, { includeSidechain: true })\n const metaRaw = await readFile(path.replace(/\\.jsonl$/, '.meta.json'), 'utf8').catch(() => null)\n let meta: Record<string, unknown> = {}\n if (metaRaw !== null) {\n try {\n const parsed: unknown = JSON.parse(metaRaw)\n if (isRecord(parsed)) meta = parsed\n } catch {\n meta = {}\n }\n }\n const agentId =\n entries.find((e) => e.agentId !== null)?.agentId ??\n name.replace(/^agent-/, '').replace(/\\.jsonl$/, '')\n out.push({\n agentId,\n path,\n description: str(meta.description),\n spawnToolUseId: str(meta.toolUseId),\n spawnDepth: typeof meta.spawnDepth === 'number' ? meta.spawnDepth : null,\n entries,\n tokensIn: projected.usage.tokensIn,\n tokensOut: projected.usage.tokensOut,\n cacheRead: projected.usage.cacheRead,\n cacheWrite: projected.usage.cacheWrite,\n firstAt: projected.startedAt,\n lastAt: projected.endedAt,\n model: projected.model,\n finalReport:\n [...projected.messages]\n .reverse()\n .find((m) => m.role === 'assistant' && typeof m.content === 'string')?.content ?? null,\n })\n }\n return out\n}\n\ninterface SpawnFact {\n readonly agentId: string\n readonly parentId: string\n readonly label: string\n readonly at: string | null\n readonly model: string | null\n}\n\n/** A journal line in the dialect `parseSupervisorTree` reads. */\nconst line = (obj: Record<string, unknown>): string => JSON.stringify(obj)\n\n/**\n * Read a Claude Code session (plus its subagent transcripts) as supervision-tree\n * source bytes. Never throws on a missing artifact.\n */\nexport async function readClaudeCodeSupervisorRun(\n opts: ClaudeCodeReaderOptions,\n): Promise<SupervisorRunSources> {\n const spawnTools = new Set(opts.spawnTools ?? DEFAULT_SPAWN_TOOLS)\n const steerTools = new Set(opts.steerTools ?? DEFAULT_STEER_TOOLS)\n const cancelTools = new Set(opts.cancelTools ?? DEFAULT_CANCEL_TOOLS)\n\n const raw = await readFile(opts.transcriptPath, 'utf8').catch(() => null)\n const sessionId = basename(opts.transcriptPath).replace(/\\.jsonl$/, '')\n const runRef = opts.runRef ?? opts.transcriptPath\n const limits = { spendUsd: SPEND_UNPRICED, workerVerdicts: NO_VERDICTS, deliverables: null }\n const traceCommand = `npx --yes @tangle-network/traces@latest analyze --harness claude-code --session ${sessionId}`\n\n if (raw === null) {\n return {\n runRef,\n instanceId: opts.instanceId ?? sessionId,\n arm: opts.arm ?? null,\n supRunDir: null,\n journal: null,\n brainLog: null,\n state: null,\n progress: null,\n workers: null,\n workersMissingReason: `session transcript unreadable at ${opts.transcriptPath}`,\n result: null,\n judge: null,\n judgeSource: null,\n patch: null,\n driverLog: null,\n harnessWorkerTokens: null,\n harnessMissingReason: `session transcript unreadable at ${opts.transcriptPath}`,\n limits: { ...limits, deliverables: NO_DELIVERABLES },\n traceCommand,\n }\n }\n\n const allEntries = parseClaudeEntries(raw)\n const main = threadCalls(allEntries.filter((e) => !e.isSidechain))\n const mainTranscript = transcriptFromEntries(allEntries)\n\n const subagentsDir =\n opts.subagentsDir === undefined\n ? join(dirname(opts.transcriptPath), sessionId, 'subagents')\n : opts.subagentsDir\n const children = subagentsDir === null ? [] : await readChildren(subagentsDir)\n const childByAgentId = new Map(children.map((c) => [c.agentId, c]))\n const childBySpawnToolUseId = new Map(\n children.filter((c) => c.spawnToolUseId !== null).map((c) => [c.spawnToolUseId as string, c]),\n )\n\n // Every thread that can spawn: the session itself, plus each child transcript\n // (a child that calls the spawn tool is a second delegation level).\n const threads: Array<{ id: string; calls: ThreadCalls }> = [{ id: sessionId, calls: main }]\n for (const child of children) {\n threads.push({ id: child.agentId, calls: threadCalls(child.entries) })\n }\n\n const spawns: SpawnFact[] = []\n const steersByTarget = new Map<string, Array<{ at: string | null; delivered: boolean }>>()\n const cancels: Array<{ agentId: string; at: string | null }> = []\n const settles: TaskNotification[] = []\n\n for (const thread of threads) {\n for (const use of thread.calls.uses) {\n if (spawnTools.has(use.name)) {\n const result = thread.calls.results.get(use.id)\n const agentId = spawnedAgentId(result) ?? childBySpawnToolUseId.get(use.id)?.agentId ?? null\n if (agentId === null) continue\n const label =\n str(use.input.description) ?? childByAgentId.get(agentId)?.description ?? agentId\n spawns.push({\n agentId,\n parentId: thread.id,\n label,\n // The spawn is complete when the launch call is answered; the tool_use\n // instant is the fallback for a call that never got a result line.\n at: result?.at ?? use.at,\n model: isRecord(result?.structured) ? str(result.structured.resolvedModel) : null,\n })\n continue\n }\n if (steerTools.has(use.name)) {\n const target = str(use.input.to) ?? str(use.input.recipient)\n if (target === null) continue\n const result = thread.calls.results.get(use.id)\n const structured = isRecord(result?.structured) ? result.structured : null\n // `success` is the harness confirming the message reached a live agent;\n // absent, the steer is counted queued but not delivered.\n const delivered = structured?.success === true || str(structured?.resumedAgentId) === target\n const rows = steersByTarget.get(target) ?? []\n rows.push({ at: use.at, delivered })\n steersByTarget.set(target, rows)\n continue\n }\n if (cancelTools.has(use.name)) {\n const target = str(use.input.agentId) ?? str(use.input.to) ?? str(use.input.taskId)\n if (target !== null) cancels.push({ agentId: target, at: use.at })\n }\n }\n settles.push(...thread.calls.notifications)\n }\n\n const spawnedIds = new Set(spawns.map((s) => s.agentId))\n const cancelledIds = new Set(\n cancels.filter((c) => spawnedIds.has(c.agentId)).map((c) => c.agentId),\n )\n const startedAt = main.firstAt\n const completedAt = main.lastAt\n\n const journalLines: string[] = [\n line({\n kind: 'spawned',\n id: sessionId,\n parent: null,\n label: `session:${sessionId}`,\n at: startedAt,\n }),\n ]\n for (const s of spawns) {\n journalLines.push(\n line({ kind: 'spawned', id: s.agentId, parent: s.parentId, label: s.label, at: s.at }),\n )\n }\n\n // Only the LAST notification per agent is its settle; an earlier one is a stop\n // the supervisor resumed from, which the steer count already records.\n const lastNotification = new Map<string, TaskNotification>()\n for (const n of settles) {\n if (!spawnedIds.has(n.taskId)) continue\n lastNotification.set(n.taskId, n)\n }\n for (const [agentId, n] of lastNotification) {\n if (cancelledIds.has(agentId)) continue\n journalLines.push(\n line({\n kind: 'settled',\n id: agentId,\n status: n.status,\n verdict: n.summary,\n at: n.at,\n // No `spent` key: Claude Code prices nothing, and a zeroed spend object\n // would read as a $0 worker. `limits.spendUsd` carries the reason.\n }),\n )\n }\n // One cancel per agent: Claude Code can emit a stop then a retry-stop for the\n // same agentId, and each raw entry would otherwise mint a duplicate `cancelled`\n // line that double-counts in `workersCancelled`. Keep the last, mirroring the\n // last-notification dedup the settle path already does.\n const lastCancel = new Map<string, { agentId: string; at: string | null }>()\n for (const c of cancels) {\n if (!spawnedIds.has(c.agentId)) continue\n lastCancel.set(c.agentId, c)\n }\n for (const c of lastCancel.values()) {\n journalLines.push(\n line({ kind: 'cancelled', id: c.agentId, reason: 'stopped by supervisor', at: c.at }),\n )\n }\n // `metered` carries the brain's own inference. The token counts are real; the\n // usd stays absent and `limits.spendUsd` explains why.\n journalLines.push(\n line({\n kind: 'metered',\n id: sessionId,\n spend: {\n tokens: {\n input: mainTranscript.usage.tokensIn,\n output: mainTranscript.usage.tokensOut,\n cacheRead: mainTranscript.usage.cacheRead,\n cacheWrite: mainTranscript.usage.cacheWrite,\n },\n },\n at: completedAt,\n }),\n )\n\n const settleAtByAgent = new Map(\n [...lastNotification.entries()].map(([id, n]) => [id, n.at] as const),\n )\n const spawnAtByAgent = new Map(spawns.map((s) => [s.agentId, s.at] as const))\n\n // Worker logs are keyed by LABEL (the analyzer's join), so agents that share a\n // description merge — the same collision loops has for a retried subtask.\n const byLabel = new Map<string, string[]>()\n for (const s of spawns) {\n const ids = byLabel.get(s.label) ?? []\n ids.push(s.agentId)\n byLabel.set(s.label, ids)\n }\n\n const workers: WorkerLogSource[] = []\n for (const [label, agentIds] of byLabel) {\n const events: string[] = []\n const inbox: string[] = []\n let tokensIn: number | null = null\n let tokensOut: number | null = null\n let cacheRead: number | null = null\n let cacheWrite: number | null = null\n let transcriptRef: string | null = null\n for (const agentId of agentIds) {\n const child = childByAgentId.get(agentId) ?? null\n const startAt = child?.firstAt ?? spawnAtByAgent.get(agentId) ?? null\n const endAt = settleAtByAgent.get(agentId) ?? child?.lastAt ?? null\n if (startAt !== null) events.push(line({ kind: 'started', label, at: startAt, agentId }))\n for (const steer of steersByTarget.get(agentId) ?? []) {\n inbox.push(\n line({ id: `${agentId}:${steer.at}`, at: steer.at, worker: label, message: 'steer' }),\n )\n events.push(\n line({\n kind: 'message',\n label,\n direction: 'down',\n at: steer.at,\n requestId: `${agentId}:${steer.at}`,\n delivered: steer.delivered,\n }),\n )\n }\n if (endAt !== null) {\n events.push(\n line({\n kind: 'finished',\n label,\n at: endAt,\n agentId,\n // No `passed` / `patchBytes`: this harness has neither. Emitting\n // `passed: false` here would invent a failed worker.\n // `evidence` is the child's closing message — what it handed back.\n ...(child?.finalReport === null || child?.finalReport === undefined\n ? {}\n : { evidence: child.finalReport }),\n }),\n )\n }\n if (child !== null) {\n tokensIn = (tokensIn ?? 0) + child.tokensIn\n tokensOut = (tokensOut ?? 0) + child.tokensOut\n cacheRead = (cacheRead ?? 0) + child.cacheRead\n cacheWrite = (cacheWrite ?? 0) + child.cacheWrite\n transcriptRef = child.path\n }\n }\n workers.push({\n label,\n events: events.length === 0 ? null : `${events.join('\\n')}\\n`,\n inbox: inbox.length === 0 ? null : `${inbox.join('\\n')}\\n`,\n patchBytes: null,\n transcriptRef,\n patchPath: null,\n tokensIn,\n tokensOut,\n cacheRead,\n cacheWrite,\n })\n }\n\n const joined = children.length\n const harnessWorkerTokens =\n joined === 0\n ? null\n : {\n store: 'claude-code subagent transcripts',\n sessions: joined,\n input: children.reduce((a, c) => a + c.tokensIn, 0),\n output: children.reduce((a, c) => a + c.tokensOut, 0),\n cacheRead: children.reduce((a, c) => a + c.cacheRead, 0),\n cacheWrite: children.reduce((a, c) => a + c.cacheWrite, 0),\n }\n\n const missingChildren = spawns.filter((s) => !childByAgentId.has(s.agentId)).length\n const harnessMissingReason =\n subagentsDir === null\n ? 'subagent transcript join disabled'\n : joined === 0\n ? `no subagent transcripts under ${subagentsDir}`\n : missingChildren === 0\n ? null\n : `${missingChildren}/${spawns.length} spawned agents have no retained transcript under ${subagentsDir} (Claude Code prunes them; their tokens are unrecoverable)`\n\n const liveWorkers = spawns.filter(\n (s) => !lastNotification.has(s.agentId) && !cancelledIds.has(s.agentId),\n ).length\n const state = JSON.stringify({\n id: sessionId,\n // Derived, not asserted: a spawned agent with no notification and no stop\n // is still running, which is exactly what a live transcript looks like.\n status: liveWorkers > 0 ? 'running' : 'idle',\n startedAt,\n completedAt,\n result: { delivered: null },\n })\n\n return {\n runRef,\n instanceId: opts.instanceId ?? sessionId,\n arm: opts.arm ?? null,\n supRunDir: subagentsDir,\n journal: `${journalLines.join('\\n')}\\n`,\n brainLog: null,\n state,\n progress: null,\n workers,\n workersMissingReason: null,\n result: null,\n judge: null,\n judgeSource: null,\n patch: null,\n driverLog: null,\n harnessWorkerTokens,\n harnessMissingReason,\n limits: { ...limits, deliverables: NO_DELIVERABLES },\n rootTranscriptRef: opts.transcriptPath,\n traceCommand,\n }\n}\n\n/** A `SupervisorRunReader` over a Claude Code session — the same contract loops implements. */\nexport function claudeCodeSupervisorRunReader(opts: ClaudeCodeReaderOptions): SupervisorRunReader {\n return {\n runRef: opts.runRef ?? opts.transcriptPath,\n read: () => readClaudeCodeSupervisorRun(opts),\n }\n}\n","/**\n * Human-readable renderings of a supervisor-run report. Zero and unavailable\n * render differently on purpose (`0` vs `unavailable — <reason>`), because the\n * two have driven opposite conclusions about the same architecture.\n */\n\nimport { round } from './analyze'\nimport {\n isUnavailable,\n type Measured,\n type SupervisorRunReport,\n type SupervisorRunRollup,\n showMeasured,\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 ` 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 ` 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\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(`- 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 (spawns after 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(`| Supervisor wall | ${fmtMs(o.supervisorWallMs)} |`)\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 | Queued | Delivered |')\n out.push('|---|---:|---:|')\n for (const s of o.steersByWorker) out.push(`| \\`${s.worker}\\` | ${s.queued} | ${s.delivered} |`)\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 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(`- 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('| Worker | Wall | Tokens in | Tokens out | Patch bytes | Verify passed |')\n out.push('|---|---:|---:|---:|---:|---|')\n for (const w of e.perWorker) {\n out.push(\n `| \\`${w.worker}\\` | ${w.wallMs === null ? 'unavailable — no start/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 finished event' : String(w.passed)} |`,\n )\n }\n out.push('')\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(`| 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 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 return out.join('\\n')\n}\n","/**\n * ONE implementation of `SupervisorRunReader`: the on-disk layout the loops\n * supervisor writes — `<runDir>/ws/.loops/supervisor/<id>/{journal.jsonl,\n * state.json, progress.ndjson, workers/*.ndjson}` alongside the run's\n * `result.json` / `judge.json` / `driver.log` / delivered patch.\n *\n * Nothing in `analyze.ts` knows this layout exists. A different store (an\n * archive, an object bucket, a database) implements the same interface and\n * gets the same report.\n *\n * Worker token recovery reuses the rollout module's opencode reader rather\n * than opening a second sqlite path — one store client, one corruption policy.\n */\n\nimport { appendFile, mkdir, readdir, readFile, writeFile } from 'node:fs/promises'\nimport { basename, join } from 'node:path'\nimport {\n DEFAULT_OPENCODE_DB,\n findOpencodeSessionsByDirectory,\n openOpencodeDb,\n} from '../rollout/readers/opencode-sqlite'\nimport { analyzeSupervisorRunSources, parseJson, parseJsonl, rollupSupervisorRuns } from './analyze'\nimport {\n renderSupervisorRollupMarkdown,\n renderSupervisorRunHeadline,\n renderSupervisorRunMarkdown,\n} from './render'\nimport {\n NO_SOURCE_LIMITS,\n type SupervisorRunReader,\n type SupervisorRunReport,\n type SupervisorRunRollup,\n type SupervisorRunSources,\n type WorkerLogSource,\n} from './types'\n\nasync function readMaybe(path: string): Promise<string | null> {\n return readFile(path, 'utf8').catch(() => null)\n}\n\n/** Locate the (single) supervisor run dir under `<ws>/.loops/supervisor`. */\nexport async function findSupervisorRunDirIn(ws: string): Promise<string | null> {\n const root = join(ws, '.loops', 'supervisor')\n const entries = await readdir(root, { withFileTypes: true }).catch(() => [])\n const dirs = entries.filter((e) => e.isDirectory()).map((e) => join(root, e.name))\n return dirs[0] ?? null\n}\n\nexport interface LoopsReaderOptions {\n /** Override the workspace dir (default `<runDir>/ws`). */\n readonly ws?: string\n /** Delivered patch path (default: `patchPath` from result.json). */\n readonly patchPath?: string\n /** opencode sqlite store; set to `null` to skip the worker-token join entirely. */\n readonly opencodeDb?: string | null\n /** Ledger to fall back to when the run has no `judge.json` (matched on iid + arm + runDir). */\n readonly ledgerPath?: string\n}\n\n/**\n * Read a loops supervisor run directory into source bytes. Never throws on a\n * missing artifact — an absent file becomes a `null` field, which is what makes\n * the dependent metric `unavailable` instead of 0.\n */\nexport async function readLoopsSupervisorRun(\n runDir: string,\n opts: LoopsReaderOptions = {},\n): Promise<SupervisorRunSources> {\n const ws = opts.ws ?? join(runDir, 'ws')\n const supRunDir = await findSupervisorRunDirIn(ws)\n const result = await readMaybe(join(runDir, 'result.json'))\n const resultObj = parseJson(result)\n\n let workers: WorkerLogSource[] | null = null\n let workersMissingReason: string | null = null\n const workerCwds: string[] = []\n if (supRunDir === null) {\n workersMissingReason = `no supervisor run dir under ${join(ws, '.loops', 'supervisor')}`\n } else {\n const workersDir = join(supRunDir, 'workers')\n const entries = await readdir(workersDir).catch(() => null)\n if (entries === null) {\n workersMissingReason = `workers/ directory absent under ${supRunDir}`\n } else {\n const labels = [\n ...new Set(\n entries\n .filter((f) => f.endsWith('.ndjson'))\n .map((f) => f.replace(/\\.inbox\\.ndjson$/, '').replace(/\\.ndjson$/, '')),\n ),\n ].sort()\n workers = []\n for (const label of labels) {\n const events = await readMaybe(join(workersDir, `${label}.ndjson`))\n const inbox = await readMaybe(join(workersDir, `${label}.inbox.ndjson`))\n const patch = await readMaybe(join(workersDir, `${label}.patch`))\n workers.push({\n label,\n events,\n inbox,\n patchBytes: patch === null ? null : Buffer.byteLength(patch),\n })\n for (const ev of parseJsonl(events)) {\n if (ev.kind === 'started' && typeof ev.cwd === 'string') workerCwds.push(ev.cwd)\n }\n }\n }\n }\n\n let harnessWorkerTokens: SupervisorRunSources['harnessWorkerTokens'] = null\n let harnessMissingReason: string | null = null\n if (opts.opencodeDb === null) {\n harnessMissingReason = 'opencode join disabled'\n } else if (workerCwds.length === 0) {\n harnessMissingReason = 'no worker clone cwds in workers/*.ndjson (nothing to join)'\n } else {\n const db = await openOpencodeDb(opts.opencodeDb ?? DEFAULT_OPENCODE_DB)\n if (db === null) {\n harnessMissingReason = `opencode session store unreadable at ${opts.opencodeDb ?? DEFAULT_OPENCODE_DB}`\n } else {\n try {\n const seen = new Set<string>()\n let sessions = 0\n let input = 0\n let output = 0\n for (const cwd of new Set(workerCwds)) {\n for (const row of findOpencodeSessionsByDirectory(db, cwd)) {\n if (seen.has(row.id)) continue\n seen.add(row.id)\n sessions += 1\n input += row.tokensInput\n output += row.tokensOutput + row.tokensReasoning\n }\n }\n harnessWorkerTokens = { store: 'opencode', sessions, input, output }\n } finally {\n db.close()\n }\n }\n }\n\n const patchPath =\n opts.patchPath ?? (typeof resultObj?.patchPath === 'string' ? resultObj.patchPath : null)\n\n let judge = await readMaybe(join(runDir, 'judge.json'))\n let judgeSource = judge === null ? null : join(runDir, 'judge.json')\n if (judge === null && opts.ledgerPath !== undefined) {\n const row = await findLedgerRow(opts.ledgerPath, runDir)\n if (row !== null) {\n judge = JSON.stringify(row)\n judgeSource = `${opts.ledgerPath} (ledger row)`\n }\n }\n\n return {\n runRef: runDir,\n instanceId: typeof resultObj?.iid === 'string' ? resultObj.iid : instanceIdFromPath(runDir),\n arm: typeof resultObj?.arm === 'string' ? resultObj.arm : basename(runDir),\n supRunDir,\n journal: supRunDir === null ? null : await readMaybe(join(supRunDir, 'journal.jsonl')),\n brainLog: supRunDir === null ? null : await readMaybe(join(supRunDir, 'brain.jsonl')),\n state: supRunDir === null ? null : await readMaybe(join(supRunDir, 'state.json')),\n progress: supRunDir === null ? null : await readMaybe(join(supRunDir, 'progress.ndjson')),\n workers,\n workersMissingReason,\n result,\n judge,\n judgeSource,\n patch: patchPath === null ? null : await readMaybe(patchPath),\n driverLog: await readMaybe(join(runDir, 'driver.log')),\n harnessWorkerTokens,\n harnessMissingReason,\n // loops prices its own inference, runs a verify per worker, and keeps each\n // worker's patch — every fact the analyzer can use is expressible here.\n limits: NO_SOURCE_LIMITS,\n traceCommand: null,\n }\n}\n\n/** The loops on-disk layout, as a `SupervisorRunReader`. */\nexport function loopsSupervisorRunReader(\n runDir: string,\n opts: LoopsReaderOptions = {},\n): SupervisorRunReader {\n return { runRef: runDir, read: () => readLoopsSupervisorRun(runDir, opts) }\n}\n\n/** The ledger row whose `runDir` is this run (falling back to iid + arm match). */\nasync function findLedgerRow(\n ledgerPath: string,\n runDir: string,\n): Promise<Record<string, unknown> | null> {\n const rows = parseJsonl(await readMaybe(ledgerPath))\n const exact = rows.find((r) => r.runDir === runDir)\n if (exact !== undefined) return exact\n const iid = instanceIdFromPath(runDir)\n const arm = basename(runDir)\n return rows.find((r) => r.iid === iid && r.arm === arm) ?? null\n}\n\n/** `<outDir>/runs/<iid>/<arm>` → `<iid>`. */\nfunction instanceIdFromPath(runDir: string): string | null {\n const parts = runDir.split('/').filter(Boolean)\n const armIdx = parts.length - 1\n const iid = parts[armIdx - 1]\n return parts[armIdx - 2] === 'runs' && iid !== undefined ? iid : null\n}\n\n// ---------------------------------------------------------------------------\n// Entry point + write helpers.\n// ---------------------------------------------------------------------------\n\n/**\n * Analyze a supervisor run. Accepts a run directory (read through the loops\n * reader), any `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 opts: LoopsReaderOptions = {},\n): Promise<SupervisorRunReport> {\n if (typeof input === 'string') {\n return analyzeSupervisorRunSources(await readLoopsSupervisorRun(input, opts))\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 extends LoopsReaderOptions {\n /** Append the headline block here (the experiment's run log). */\n readonly appendHeadlineTo?: string\n /** Also console.log the headline (default true). */\n readonly echo?: boolean\n /**\n * Write `run-report.{json,md}` here instead of into the run dir. Set when\n * reporting over a run directory that must stay READ-ONLY (a live run, an\n * archived generation).\n */\n readonly reportDir?: string\n}\n\n/**\n * Read a completed run, write `run-report.json` + `run-report.md` beside its\n * artifacts, and append the headline block to the run log. Never throws on a\n * missing artifact — a run that produced nothing still yields a report whose\n * every metric says why.\n */\nexport async function writeSupervisorRunReport(\n runDir: string,\n opts: WriteSupervisorRunOptions = {},\n): Promise<SupervisorRunReport> {\n const sources = await readLoopsSupervisorRun(runDir, opts)\n const report = analyzeSupervisorRunSources(sources)\n const md = renderSupervisorRunMarkdown(report)\n const dest = opts.reportDir ?? runDir\n const stem = opts.reportDir === undefined ? 'run-report' : supervisorReportStem(runDir)\n if (opts.reportDir !== undefined) await mkdir(opts.reportDir, { recursive: true }).catch(() => {})\n await writeFile(join(dest, `${stem}.json`), JSON.stringify(report, null, 1)).catch(() => {})\n await writeFile(join(dest, `${stem}.md`), md).catch(() => {})\n const headline = renderSupervisorRunHeadline(report)\n if (opts.appendHeadlineTo !== undefined) {\n await appendFile(opts.appendHeadlineTo, `${headline}\\n`).catch(() => {})\n }\n if (opts.echo !== false) console.log(headline)\n return report\n}\n\n/**\n * File stem for out-of-tree reports. Built from the run path's identifying\n * segments — candidate tag (the segment under `arm-runs/`), rep, instance, arm\n * — so two runs of the same instance from different candidates/reps never\n * overwrite each other.\n */\nexport function supervisorReportStem(runDir: string): string {\n const parts = runDir.split('/').filter(Boolean)\n const arm = parts[parts.length - 1] ?? 'cell'\n const iid = parts[parts.length - 2] ?? 'instance'\n const rep = parts.find((p) => /^rep-\\d+$/.test(p))\n const armRunsIdx = parts.indexOf('arm-runs')\n const tag = armRunsIdx >= 0 ? parts[armRunsIdx + 1] : undefined\n return [tag, rep, iid, arm]\n .filter((s): s is string => s !== undefined && s !== 'runs')\n .join('.')\n .replace(/[^A-Za-z0-9._-]/g, '_')\n}\n\n/**\n * Best-effort wrapper for a hot path: a reporting failure must never kill a run\n * that already produced real work. Returns null and logs the reason instead.\n */\nexport async function writeSupervisorRunReportSafe(\n runDir: string,\n opts: WriteSupervisorRunOptions = {},\n): Promise<SupervisorRunReport | null> {\n try {\n return await writeSupervisorRunReport(runDir, opts)\n } catch (err) {\n console.log(\n `RUN-REPORT failed for ${runDir}: ${err instanceof Error ? err.message : String(err)}`,\n )\n return null\n }\n}\n\n/**\n * Report every run under an experiment `outDir` (any depth of\n * `runs/<iid>/<arm>`), write each run's report, and write the rollup at\n * `<outDir>/run-report-round.{json,md}`.\n */\nexport async function reportSupervisorRound(\n outDir: string,\n opts: WriteSupervisorRunOptions & { title?: string } = {},\n): Promise<SupervisorRunRollup> {\n const runDirs = await findSupervisorRunDirs(outDir)\n const reports: SupervisorRunReport[] = []\n for (const runDir of runDirs) {\n const r = await writeSupervisorRunReportSafe(runDir, { ...opts, echo: opts.echo ?? false })\n if (r !== null) reports.push(r)\n }\n const rollup = rollupSupervisorRuns(reports)\n const md = renderSupervisorRollupMarkdown(\n rollup,\n opts.title ?? `Round rollup — ${basename(outDir)}`,\n )\n const dest = opts.reportDir ?? outDir\n if (opts.reportDir !== undefined) await mkdir(opts.reportDir, { recursive: true }).catch(() => {})\n await writeFile(join(dest, 'run-report-round.json'), JSON.stringify(rollup, null, 1)).catch(\n () => {},\n )\n await writeFile(join(dest, 'run-report-round.md'), md).catch(() => {})\n if (opts.appendHeadlineTo !== undefined) {\n await appendFile(opts.appendHeadlineTo, `${md}\\n`).catch(() => {})\n }\n if (opts.echo !== false) console.log(md)\n return rollup\n}\n\n/** Every `<...>/runs/<iid>/<arm>` directory under `root`. */\nexport async function findSupervisorRunDirs(root: string): Promise<string[]> {\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 (e.name === 'runs') {\n const iids = await readdir(full, { withFileTypes: true }).catch(() => [])\n for (const iid of iids) {\n if (!iid.isDirectory()) continue\n const arms = await readdir(join(full, iid.name), { withFileTypes: true }).catch(() => [])\n for (const arm of arms) if (arm.isDirectory()) found.push(join(full, iid.name, arm.name))\n }\n continue\n }\n await walk(full, depth + 1)\n }\n }\n await walk(root, 0)\n return found.sort()\n}\n","/**\n * The supervision tree as `tangle.rollout.v1` rows.\n *\n * A supervisor run IS a tree of rollouts, so its nodes are not a new shape:\n * the root becomes one `RolloutLine` with `role: 'supervisor'`, every spawned\n * worker becomes a `RolloutLine` with `role: 'worker'` and\n * `parent_rollout_id` pointing at its spawner. The rows append to the same\n * ledger as solo-agent rollouts and join to them with the same keys.\n *\n * What the journal CANNOT supply is the transcript: a worker's messages live\n * in its harness store (opencode sqlite, Claude Code jsonl), which the\n * `src/rollout/readers/*` intake readers own. Rows minted here are therefore\n * GAP lines (`messages: []`, `provenance.gap` set) carrying identity,\n * structure, outcome and cost; hydrating them with messages is the readers'\n * job, keyed on `artifacts.transcript_ref`.\n *\n * Timing lives in `outcome.metrics` (`spawned_at` / `settled_at` / `wall_ms`)\n * rather than a schema field: `tangle.rollout.v1` describes ONE invocation,\n * and the inter-invocation event timeline — which is what waves, concurrency,\n * idle and utilization are computed from — is a property of the journal, not\n * of any single row. The analyzer reads that timeline; these rows carry the\n * per-node facts.\n */\n\nimport { unscreenedRewardFields } from '../rollout/reward'\nimport {\n isRolloutLine,\n ROLLOUT_SCHEMA,\n type RolloutLine,\n type RolloutSplit,\n} from '../rollout/schema'\nimport { asRecord, parseJson, parseSupervisorTree } from './analyze'\nimport type { SupervisorRunSources, SupervisorRunTree } from './types'\n\nexport interface SupervisorRolloutOptions {\n /** Benchmark/suite id for `task.suite`. Defaults to `'supervisor-run'`. */\n readonly suite?: string\n /** `task.split`. Defaults to `'search'` (the trainable pool). */\n readonly split?: RolloutSplit\n /** Replicate index. Defaults to 0. */\n readonly rep?: number\n /** Sampling seed the campaign pinned. Defaults to null (not recorded). */\n readonly seed?: number | null\n /** `run_id` for every node. Defaults to the supervisor root id, else `runRef`. */\n readonly runId?: string\n /** Harness that drove the supervisor. */\n readonly supervisorHarness?: string | null\n /** Harness that drove the workers. */\n readonly workerHarness?: string | null\n /** Model the supervisor ran on. */\n readonly supervisorModel?: string | null\n /** Model the workers ran on. */\n readonly workerModel?: string | null\n readonly experimentId?: string | null\n readonly candidateId?: string | null\n readonly generation?: number | null\n readonly candidateIndex?: number | null\n /** Pins `provenance.captured_at`; defaults to now. */\n readonly capturedAt?: string\n}\n\nconst EMPTY_COST = {\n usd: null,\n tokens_in: null,\n tokens_out: null,\n tokens_reasoning: null,\n cache_read: null,\n cache_write: null,\n wall_s: null,\n} as const\n\n/**\n * Mint the supervision tree as rollout rows. Returns the rows plus the gaps\n * that made any of them incomplete — same unavailable-vs-zero discipline as\n * the report: a row with no transcript says WHY, it never pretends to be empty.\n */\nexport function supervisorRunRolloutLines(\n src: SupervisorRunSources,\n opts: SupervisorRolloutOptions = {},\n): SupervisorRunTree {\n const gaps: string[] = []\n const tree = parseSupervisorTree(src)\n if (src.journal === null) {\n gaps.push(\n `tree: ${src.supRunDir === null ? 'no supervisor run dir' : 'journal absent'} — no nodes recoverable`,\n )\n return { rootId: null, nodes: [], gaps }\n }\n\n const state = parseJson(src.state)\n const result = parseJson(src.result)\n const judge = parseJson(src.judge)\n const stateResult = asRecord(state?.result)\n\n const rootId = tree.rootId\n const runId = opts.runId ?? rootId ?? src.runRef\n const suite = opts.suite ?? 'supervisor-run'\n const instanceId = src.instanceId ?? src.runRef\n const split: RolloutSplit = opts.split ?? 'search'\n const capturedAt = opts.capturedAt ?? new Date().toISOString()\n\n const base = {\n schema: ROLLOUT_SCHEMA,\n run_id: runId,\n experiment_id: opts.experimentId ?? null,\n candidate_id: opts.candidateId ?? null,\n generation: opts.generation ?? null,\n candidate_index: opts.candidateIndex ?? null,\n task: {\n suite,\n instance_id: instanceId,\n split,\n seed: opts.seed ?? null,\n rep: opts.rep ?? 0,\n },\n messages: [] as RolloutLine['messages'],\n tool_defs: [] as RolloutLine['tool_defs'],\n } satisfies Partial<RolloutLine> & Record<string, unknown>\n\n const nodes: RolloutLine[] = []\n\n // ── root: the supervisor invocation ────────────────────────────────────\n if (rootId !== null) {\n const judgeResolved = typeof judge?.resolved === 'boolean' ? judge.resolved : null\n const judgeScore = typeof judge?.score === 'number' ? judge.score : null\n const reward = judgeScore ?? (judgeResolved === null ? null : judgeResolved ? 1 : 0)\n if (reward === null) gaps.push('root.outcome.reward: no judge verdict for this run')\n const wallMs =\n tree.startedAt !== null && tree.completedAt !== null && tree.completedAt >= tree.startedAt\n ? tree.completedAt - tree.startedAt\n : null\n nodes.push({\n ...base,\n rollout_id: rootId,\n parent_rollout_id: null,\n role: 'supervisor',\n policy: {\n harness: opts.supervisorHarness ?? null,\n harness_version: null,\n model: opts.supervisorModel ?? null,\n provider: null,\n profile_commit: null,\n sampling: null,\n },\n outcome: {\n // `reward` and `realness_gated` are written by one call, in the module\n // that owns the gate. This is the SECOND producer of rollout rewards —\n // the judge verdict in the supervision run dir, not `mintRolloutRows` —\n // and it wrote `reward` by hand while never stating the flag, so\n // `isLineRealnessGated` was structurally false for every supervisor and\n // worker row ever emitted here. `unscreenedRewardFields` is the honest\n // name for what this producer can claim: a supervision journal carries\n // no `RunRecord.outcome.realness`, so no authenticity gate has run on\n // this score, and `realness_gated: false` states that rather than\n // implying it by omission. These rows stay plain `RolloutLine`s, so a\n // caller feeding them to a training exporter must `assertMinted` first.\n ...unscreenedRewardFields(reward),\n reward_source: src.judgeSource,\n verdict: judge ?? null,\n metrics: {\n arm: src.arm,\n sup_status: typeof state?.status === 'string' ? state.status : null,\n sup_verdict: typeof state?.verdict === 'string' ? state.verdict : null,\n delivered: typeof stateResult.delivered === 'boolean' ? stateResult.delivered : null,\n verify_pass: typeof result?.verify_pass === 'boolean' ? result.verify_pass : null,\n started_at: tree.startedAt,\n completed_at: tree.completedAt,\n workers_spawned: tree.workerSpawns.length,\n brain_metered_events: tree.brain.meteredCount,\n },\n is_completed: state?.status === 'completed',\n is_truncated: false,\n error: null,\n realness_gated: false,\n },\n cost: {\n ...EMPTY_COST,\n usd:\n src.limits.spendUsd !== null\n ? null\n : typeof stateResult.spentUsd === 'number'\n ? stateResult.spentUsd\n : tree.brain.usd,\n tokens_in: tree.brain.tokensIn,\n tokens_out: tree.brain.tokensOut,\n cache_read: tree.brain.hasCache ? tree.brain.cacheRead : null,\n cache_write: tree.brain.hasCache ? tree.brain.cacheWrite : null,\n wall_s: wallMs === null ? null : wallMs / 1000,\n },\n artifacts: {\n patch_path: typeof result?.patchPath === 'string' ? result.patchPath : null,\n run_dir: src.supRunDir,\n transcript_ref:\n src.rootTranscriptRef !== undefined\n ? src.rootTranscriptRef\n : src.supRunDir === null\n ? null\n : `${src.supRunDir}/journal.jsonl`,\n },\n provenance: {\n captured_at: capturedAt,\n capture: 'backfill',\n gap: 'supervision journal carries structure and spend, not the brain transcript',\n },\n })\n } else {\n gaps.push('tree.root: no parentless `spawned` event in the journal')\n }\n\n // ── workers: one node per spawn, keyed to its spawner ───────────────────\n const closeById = new Map(tree.closes.map((c) => [c.id, c]))\n const sourceByLabel = new Map((src.workers ?? []).map((w) => [w.label, w]))\n // Worker logs are keyed by label, the journal by id — the label is the only\n // join available. A repeated label is a literal retry of the same subtask, so\n // both attempts see the same log facts; the journal ids keep them distinct\n // rows and `outcome.metrics.spawned_at` separates the attempts.\n for (const spawn of tree.workerSpawns) {\n const close = closeById.get(spawn.id) ?? null\n const facts = tree.workerLogs.get(spawn.label) ?? null\n const workerSource = sourceByLabel.get(spawn.label) ?? null\n const wallMs =\n facts?.started != null && facts.finishedAt != null ? facts.finishedAt - facts.started : null\n const reward = facts?.passed === null || facts === null ? null : facts.passed ? 1 : 0\n if (reward === null) {\n gaps.push(`worker ${spawn.label}: no verify verdict (worker logs absent or unfinished)`)\n }\n nodes.push({\n ...base,\n rollout_id: spawn.id,\n parent_rollout_id: spawn.parent,\n role: 'worker',\n policy: {\n harness: opts.workerHarness ?? null,\n harness_version: null,\n model: opts.workerModel ?? null,\n provider: null,\n profile_commit: null,\n sampling: null,\n },\n outcome: {\n // Same producer, same claim: a worker reward is a self-verify verdict\n // from the journal that no realness gate has seen.\n ...unscreenedRewardFields(reward),\n reward_source: reward === null ? null : 'worker-self-verify',\n verdict:\n close === null\n ? null\n : { kind: close.kind, status: close.status, verdict: close.verdict },\n metrics: {\n label: spawn.label,\n spawned_at: spawn.at,\n settled_at: close?.at ?? null,\n started_at: facts?.started ?? null,\n finished_at: facts?.finishedAt ?? null,\n wall_ms: wallMs,\n patch_bytes: facts?.finishedPatchBytes ?? null,\n evidence_bytes: facts?.evidenceBytes ?? null,\n steers_queued: facts?.steersQueued ?? null,\n steers_delivered: facts?.steersDelivered ?? null,\n questions: facts?.questions ?? null,\n },\n is_completed: close?.kind === 'settled',\n is_truncated: close?.kind === 'cancelled',\n error: close?.kind === 'cancelled' ? (close.verdict ?? 'cancelled') : null,\n realness_gated: false,\n },\n // `close.spend` is only a measurement when the close event carried one;\n // a store that never priced this worker must leave null, not 0.\n cost: {\n ...EMPTY_COST,\n usd: src.limits.spendUsd !== null || !close?.hasSpend ? null : close.spend.usd,\n tokens_in: workerSource?.tokensIn ?? (close?.hasSpend ? close.spend.tokens.input : null),\n tokens_out: workerSource?.tokensOut ?? (close?.hasSpend ? close.spend.tokens.output : null),\n // Mirror the tokens_in/out journal fallback so a loops-shaped store whose\n // `settled` spend carries cache counters is not reported as null cache\n // beside real tokens. Gate on `hasCache` — a spend object without cache\n // counters must stay null, not a fabricated 0.\n cache_read:\n workerSource?.cacheRead ??\n (close?.hasSpend && close.spend.tokens.hasCache ? close.spend.tokens.cacheRead : null),\n cache_write:\n workerSource?.cacheWrite ??\n (close?.hasSpend && close.spend.tokens.hasCache ? close.spend.tokens.cacheWrite : null),\n wall_s: wallMs === null ? null : wallMs / 1000,\n },\n // A reader that knows where its worker artifacts live says so; only the\n // loops layout is derivable from `supRunDir`, so guessing it for another\n // store would mint rows pointing at paths that never existed.\n artifacts: {\n patch_path:\n workerSource?.patchPath !== undefined\n ? workerSource.patchPath\n : src.supRunDir === null\n ? null\n : `${src.supRunDir}/workers/${spawn.label}.patch`,\n run_dir: src.supRunDir,\n transcript_ref:\n workerSource?.transcriptRef !== undefined\n ? workerSource.transcriptRef\n : src.supRunDir === null\n ? null\n : `${src.supRunDir}/workers/${spawn.label}.ndjson`,\n },\n provenance: {\n captured_at: capturedAt,\n capture: 'backfill',\n gap:\n workerSource?.transcriptRef == null\n ? 'worker transcript lives in the harness session store — hydrate via src/rollout/readers'\n : 'worker transcript recorded by the harness; messages not inlined into this row',\n },\n })\n }\n\n const invalid = nodes.filter((n) => !isRolloutLine(n))\n if (invalid.length > 0) {\n gaps.push(`${invalid.length} node(s) failed tangle.rollout.v1 validation`)\n }\n return { rootId, nodes, gaps }\n}\n"],"mappings":"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"}
|