v0.9.3
Everything since v0.9.1: two new labels, a token-accounting correction, and the documentation catch-up that motivated the extra patch. (v0.9.2 was tagged but never released; this release carries its changes. Saved numbers move in two places, both on purpose: label censuses split, and stats token totals drop.)
New in 0.9.2
- Label
agent.thinking.narration(taxonomy -> 27). Since at least Claude Code 2.1.170 the API can return a SECOND thinking block in an assistant message: a one-sentence, user-language summary of the reasoning beside it, distinguished only by a tag encoded inside the base64 signature (clients 2.1.241+ render it dim under the hint wordsummarized). csift counted these as reasoning. Classification is by signature alone, whole-string decoded, with every failure path degrading to plainagent.thinking; the decode is byte-gated so large-corpus search keeps its previous speed. Hits carry a[narration summary]marker;verbatimnever replays narration;-t agent.thinkingstill selects both leaves, and pure reasoning is-t agent.thinking -T agent.thinking.narration. Historical records re-classify by design (narration exists on disk from 2026-06-10), conserving the label-census sum. - Label
user.unsent(taxonomy -> 28). A message that was sent, esc-recalled into the input box, edited and re-sent leaves the ORIGINAL on disk, sharing the resend's parentUuid - previously collapsed to a bare count. Drafts are now searchable and censusable under their own leaf: a matching draft renders as its own annotated unit (<tok>-draft, JSONsuperseded_draft:true, nullturn_index), turn numbering is untouched, anduser.messagecounts are unchanged. Measured limits documented: a recalled-then-abandoned message has no resend sibling and is undetectable; a QUEUED text edited before dispatch never becomes a user record at all (the bytes survive only in queue-operation lines, csift non-records). statsnarration census:narration_blocksper model (block counts only - the token split is not derivable from the jsonl) andunknown_thinking_tags(a new API tag value surfaces without a csift release).
Fixed in 0.9.2
statstoken sums: Claude Code repeats the identicalmessage.usageobject on every per-block record of one API message, and stats summed per record - an over-report measured at 2.2x to 3.5x per field and model. Sums now dedupe per transcript bymessage.id(per-field MAX, immune to the compaction-replay shape that rewrites an id with zeroed usage); id-less records count individually; the scope TOTAL still sums transcripts. Printed totals drop accordingly.
Fixed in 0.9.3
- The root help's hand-written SUBCOMMANDS block still listed eleven commands, contradicting the generated list one screen below:
statusandwaitjoin it and the span-default enumeration. - The status/wait help described owner-process liveness as a signal-0 probe - a mechanism that never shipped. Corrected to the ps-based probe with the /proc fallback.
- The
--siblingspolicy text gains the narration cap of 1, in the help and every reference document. - README catches up two releases: thirteen subcommands with status and wait rows, a live-status highlight, Quickstart rows for status / wait / user.unsent / the label census, and the 0.8.1+ flags in their rows. SPEC gains per-command sections for status (6.13) and wait (6.14) and rewrites its stats section to the deduped token accounting; SKILL's superseded-draft bullet and JSON reference catch up.
Verification
- 965 unit + 496 e2e; line coverage 95.43% (above the 0.9.1 baseline); a scoped mutation census over the touched files (602 mutants, new code fully killed, residue classified); the narration decode byte-gated back to noise-level cost on a 685MB transcript. 0.9.3 changes no behavior (help strings and documents only); the full suite ran green on each of its three commits.
- All eight platform binaries built at the v0.9.3 tag with the full test suite green on every Linux and Windows lane; macOS binaries built with path-privacy remapping.
Full details: CHANGELOG 0.9.2 + 0.9.3 and the SPEC section 6 ledgers.