[0.33.0] - 2026-04-27
Added
burn planshonors per-cycle fidelity (#108). The list view continues to render every plan even when the cycle slice containspartial/aggregate-only/cost-onlyturns (no fidelity-based filter —plans, likelimits, is permissive), but now flags low-confidence cycles so a "looks under budget" plan isn't read as authoritative. The text table grows aconfidencecolumn when at least one plan has any contributing turn missing per-turn input/output token data, markedlow (partial token data), and a footer note names the affected plan + lower-bound caveat (e.g.note: claude-pro: 3 of 412 turns this cycle lack per-turn token data — totals are a lower bound.). Full-fidelity cycles render exactly as before — no extra column, no footer.--jsongains a per-planusage.fidelity: { confidence, summary }block carrying the sameFidelitySummaryshape the analyze package emits elsewhere, so machine consumers can render exact counts without re-walking the ledger.cost-onlysource contributions count towardspentUsdand mark the cycle low-confidence on the token-coverage axis.burn wastehonors fidelity (#100). The attribution path (and the--patterns retries|failures|revertsdetectors) now hard-filters the input slice against the coverage flags each detector requires —attributeWaste/aggregateBy*needhasToolCalls+hasToolResultEvents;revertsadditionally needshasRawContent(foreditPreHash/editPostHash);compactionis unchanged because its sidecar is independent ofTurnRecord.fidelity. When all turns fall below the prereq,burn wasteexits non-zero with a message naming the missing prerequisite and the source kinds responsible (burn waste: 142/142 turns lack tool-call/tool-result coverage required for waste attribution. Sources: codex (per-session-aggregate, missing tool-call records, tool-result events). No waste analysis was performed.). When some turns survive, the text and JSON output gain an "analyzed N of M" coverage notice that names the gap per source.--jsonnow carries afidelityblock ({ analyzed, excluded, summary, refused }) mirroringsummary --json;--patternsJSON additionally exposes aperDetectorarray with each detector'srequiredflags andexcludedBySourcebreakdown. Whencompactionis in the selection it always runs — its sidecar has no per-turn fidelity requirement — so--patterns retries,compactionagainst an aggregate-only slice produces partial output rather than refusing.
Changed
burn plans(list view) reads spend from the archive (#91). The list path now issues oneSUM(...) GROUP BY (source, model)aggregate per plan againstarchive.sqliteinstead of walking the full ledger once per plan. Output is byte-identical to the legacyqueryAll()reduce path on the parity fixture (text and--json);limitedDataflagging, reset-day boundaries, multi-plan ordering, and built-in presets all carry over. Pass--no-archive(or setRELAYBURN_ARCHIVE=0) to opt back into the in-memory reduce while the migration shakes out.