[0.41.0] - 2026-04-28
Fixed
- Pending-stamp resolution no longer cross-contaminates concurrent same-cwd same-harness runs (#162). When two
burn run codex(or twoburn run opencode) processes are running in the same directory, the{harness, cwd, mtime ≥ spawnStart, sessionDirHint}filter cannot tell their stamps apart, so the resolver was applying every matching stamp's enrichment to whichever session ingested first — leaving the other session unstamped. Each session now claims at most one stamp (FIFO byspawnStartTs), so the older stamp goes to the first session that ingests and the newer stamp stays pending until its own session shows up. Different cwds, different harnesses, and Claude (which uses pre-allocated session IDs and never writes pending stamps) were unaffected and remain unchanged.
Added
- Content-sidecar enrichments surface in
burn diagnoseandburn waste --patterns(#57). When a session was captured withcontent.store=full, the four waste-pattern detectors now emit additional fields thatburn diagnose <session>andburn waste --patternsrender through the existing tables andWasteFindingtext: retry-loop titles include the shared error-line signature (e.g."Bash failed 4× in a row: 'npm ERR! code ENOENT'"), failure-run details list per-tool first-line errors, compaction-loss details summarize the work in the compacted window (N edit(s), M bash, K read(s) on src/foo.ts, src/bar.ts), and edit-revert details show truncatedold_string/new_stringpreviews for both anchor edits.--jsonpayloads carry the new fields verbatim (errorSignature,errorSignatures,lostWork,samplePreview). Sessions incontent.store=hash-onlyor with pruned content render exactly as before.burn wastelazily loads content sidecars only for the four enrichable detectors (retries/failures/compaction/reverts) and only when at least one is selected, so unrelated runs pay no I/O cost. - Aggregate parser content-capture report in
burn diagnose(#79).burn diagnose(no positional argument) now walks the ledger and emits a per-adapter content-capture gap table — total sessions, sessions with ≥1 tool call, gapped sessions (≥1 tool call but zerotool_resultContentRecords), orphan tool-call count, anddegradedPct. Honors--json({ adapters: [{ adapter, sessions, sessionsWithToolCalls, gappedSessions, orphanToolCalls, degradedPct }, ...], contentMode }). The existing per-sessionburn diagnose <session-id>behavior is unchanged. Permanent, queryable surface for the gap that the per-invocation ingest warning (#75) only flags once perburnrun; rows omit the gap signal with an explanatory note whenRELAYBURN_CONTENT_STOREishash-onlyoroff. Adapters with no sessions in the ledger are omitted entirely. burn waste --patterns --findings(#56). Renders every detector's output through one severity-rankedWasteFindingtable — retry loops / failure runs / compaction losses / edit reverts / edit-heavy / OpenCode skill-* / system-prompt-tax sorted together by severity (high → warn → info) thenusdPerSession. The existing per-detector tables remain the default render path;--findingsis opt-in. JSON output (--patterns --json) gains afindingsarray alongside the existing per-detector arrays for downstream consumers; the JSON refusal payload also carriesfindings: []for schema parity.burn waste --findings(without--patterns) implies--patternsso the flag is never silently ignored.