Repository navigation
chamnan 1.31.2 — counting honestly, and research that earned its way in
Fixes and measured improvements on top of 1.31.1 — the full list is in CHANGELOG.md.
This release is about counting honestly, and about research that had to earn its way into the
code.
The dashboard was counting every token about twice. Claude Code writes one transcript record
per content block, each repeating the response's usage, and the page added them all. It now counts
each response once, reads only the sessions a person worked on the account in use — including
sessions started in a subdirectory, which it used to miss, and leaving out sessions a script
started — and every panel on the first page describes the same period in the same unit. A new
panel ranks the five things that filled the context, and it adds up, to the token, to what was
actually written: on the repository it was built on, the largest row turned out to be context
rewritten after the cache expired, which no transcript shows.
Every finding from outside research now leaves with a verdict — test it, already there, or not
worth it — and the tests found real defects. A property test (scrubbing twice must equal
scrubbing once) found the redactor damaging an ordinary line of code that followed a line ending
in ..._key:. The pointer was naming a thread closed weeks earlier — the most-named entry in its
log, and in 35 of 56 appearances the only thing named. A config value of the wrong type was
silently replaced by the default on the next session, which could start deleting logs. A new
session now hears which files were committed after the old one stopped, and /chamnan:review
names a change too large, or too tangled, to review whole.
The plugin carries no key-shaped test data. The checks that need a credential's shape, and the
recall benchmark with its tables, moved to chamnan-corpus,
where key-shaped data belongs; the checks that stay here use plain values.
Fixed and improved
-
The session block holds still between firings, so it does not cost a cache write. "Last edited" counted minutes when the last change was under an hour old, so the block changed every minute and a second firing of the same session re-wrote the whole cached block. Under an hour it now says
<1h. -
A config value of the wrong type is kept, and named — no longer replaced by the default. Writing
"log_retention_days": "30"(a quoted number) used to be overwritten with 7 on the next session, silently, which began deleting logs the user meant to keep. The file is now left as written, the session says which setting is being ignored and what it wants, and a config that does not parse says the line and column. -
The dashboard's notes are held to a readable line length. On a wide panel a note ran to about 130 characters; measured comprehension peaks near 55 and long lines read slower. Notes stop at 78 characters and source lines at 90, as the headline's sentences already did.
-
/chamnan:reviewchecks the size of a change first. Above about 400 changed lines it says so and reviews in parts: measured defect detection falls from 87% on 1-100 lines to 28% above 1,000, and a review of a large change finds less while reading as complete. A change that mixes a rename or move with a behaviour change is named too, and the behaviour reviewed on its own. -
An ordinary line of code after a line ending in
..._key:is no longer redacted. A Pythonif … != last_user_key:made the redactor treat the NEXT line's assignment as that key's value, sostate["gap_ping_anchor"] = last_user_keyreached the index as<REDACTED>— and a second pass then redacted the dict key too. Found by a property test: scrubbing twice must equal scrubbing once. Recall and precision on the corpus benchmark are unchanged (98/99, 100%, 0/48 damaged). -
A new session is told what moved while it was away. When
chamnan-openstarts fresh, the handoff now names the files committed after the old conversation's last response — by another session or by hand — so the new one does not work from a picture of the repository that is already out of date. Nothing is added when nothing was committed. -
A closed thread is no longer named when you open a file it lists. The pointer treated a finished thread like live knowledge: on the repository it was built on, the most-named entry in 24 days was a thread closed weeks earlier, and in 35 of its 56 appearances it was the only thing named. Threads whose status is closed are skipped; on that repository's 136 plugin files the only change is that thread disappearing.
-
The dashboard counts the sessions you worked, and shows what filled them. Its totals now come from one account's interactive sessions — including sessions started in a subdirectory, which it used to miss — and leave out sessions a script started with
claude -p, which on the repository it was built on were a third of September. A new panel ranks the top five things that went into the context in the chosen period: the model's own output, each tool's results, hook and reminder context, the host's prompt, and what you typed. -
The dashboard counts each response once. Claude Code writes one transcript record per content block — a thinking block, a text block and each tool call of one response are separate lines, each repeating the response's usage — and the dashboard counted every line. On the repository it was built on that was 35,356 requests counted against 17,569 real ones, so every token total was about double. A record repeating the previous response's request id is now skipped, including across an incremental read, and the scan cache is re-read once under a new key.
chamnan-reportalready kept one record per request and was not affected. -
The plugin carries no key-shaped test data. The checks that need a credential's shape, and the recall benchmark with its tables, moved to chamnan-corpus; the checks kept here use plain values.
Verification
6104/6104 checks on the release gate (macOS, with the live workspace), and CI green on all five legs — macOS · Linux · Windows on Python 3.8 and 3.13 — on the same commit. The check branch found seven things on the way, all fixed before this: a session-expiry test that passed only before noon UTC, a bare next(), the dashboard missing every Windows path and any path with a dot or a space, a byte offset shifted by Windows line endings, a concurrency harness decoding as cp1252 with a 30-second timeout, and the session block's "Last edited" line changing every minute — the last one a real cache cost for users.
Install or update: claude plugin marketplace update chamnan && claude plugin install chamnan@chamnan