Repository navigation
chamnan 1.32.0
This release makes what chamnan already does behave correctly where people actually use it — your own git setup, your time zone, your machine, very large or very odd files — rather than adding new features.
| What was measured | Before | After |
|---|---|---|
git add beside a hook's git status, 150 tries |
68 failed on index.lock |
0 failed |
Git settings a session opened by chamnan-open inherited from chamnan |
23 overrides (hooks off, credentials refused) | 0 — yours |
| A rule check over one minified 80,000-character line | 34 s at session start, and it said "holds" | 11 ms, "not checked" |
| Redacting a 200 KB base64url value | 16.0 s | 3.2 s |
| A 2-hour scheduled resume after the machine moves from +07:00 to +09:00 | fired after 1 hour | fires after 2 hours |
| Commands the dashboard showed for a busy day | 316 (a log's daily cap) | 1,623 (every Bash call) |
| Tokens counted twice after a rewind | +3.1% | 0 |
chamnan-where on a 1,194-file repository |
3.74 s | 3.13 s |
Bash PreToolUse hook |
246 ms | 153 ms |
Together they say one thing: the plugin stays out of the way of the work beside it, and the numbers it shows you are the real ones.
What you will notice
git push, your hooks and signed commits work in sessions chamnan opens for you. For its own reads chamnan switches off repository-supplied programs — hooks, credential helpers, ssh commands, signing. Sessions started bychamnan-openandchamnan-scheduleused to inherit all of that. They now start with your environment exactly as it was.- Your own
git addandgit commitno longer fail because a hook was reading. A read-onlygit statusstill takesindex.lockfor a moment; chamnan's git reads now skip that optional lock. - A session no longer stalls on a repository with minified or bundled files that a
**Check:**rule covers. - The dashboard is right, and it speaks your time zone. It builds its lesson index itself, counts commands from the session transcripts, counts each request once, puts UTC-stamped events on your local day, keeps history after Claude Code deletes old transcripts, and has a time-zone menu — your browser's zone by default, with half- and quarter-hour zones handled.
- Scheduled resumes keep their time when you travel or the clocks change.
AGENTS.mdmade on Windows keeps its line endings and byte-order mark, and a file with two chamnan regions is refused instead of half-updated.- A
MAP.mdmerge conflict tells you the fix — rebuild withchamnan-map, thengit add. chamnan-where … | headno longer ends inBrokenPipeError.
Most of the rest is deliberately invisible on the happy path; its purpose is to make unusual setups fail less often.
Under the hood
Git, as a guest in your repository
- Every git process chamnan starts runs with
GIT_OPTIONAL_LOCKS=0unless you set it yourself. Measured with a status loop beside 150git adds: 68 failures before, 0 after, andgit statustook the same time. workspacenow snapshots your environment before changing anything for its own reads, and the two places that start a program on your behalf (chamnan-open,chamnan-schedule) hand that snapshot back. Before: 24GIT_*variables reached a scheduled session and 23 reached achamnan-opensession.- The lesson index's new
git ls-filesasks first whether git can speak for the directory, like every other git call. The README's Git paragraph now lists 31 call sites serving 23 read-only purposes.
Performance
- Redactor: each secret word found inside a long identifier re-walked the whole run. A 200 KB base64url value: 16.0 s → 3.2 s; 50 KB: 1.4 s → 1.0 s. Hit spans identical on 3,209 inputs.
- Rule checks: a file with a line over 2,000 characters is not searched. A one-quantifier pattern took 21.2 s on an 80,000-character line; the worst allowed pattern takes 12 ms at 2,000.
chamnan-where: 3.74 s → 3.13 s on 1,194 files, identical answers on 15,772 symbol–file pairs.- Bash
PreToolUsehook: 246 → 153 ms. Redactor import: 41.7 → 15.9 ms.
The dashboard
- The lesson panels read an index nothing in the plugin wrote; it is now built on every dashboard build, from what git lists — including scripts with no file extension, large files and nested repositories, and skipping generated indexes, workspace logs and byte-identical copies.
- Commands are counted from transcripts (a log capped at 300 a day was showing the cap); each request is counted once even when a rewind writes it again (3.1% of tokens were double); UTC stamps land on the local day; feature rates compare counts from one window; bar charts share one track; a deleted transcript keeps its days until the one-year window passes.
- Counts are kept in 15-minute UTC slots and the page adds them up in the chosen zone: in the build zone, 0 of 400 figures differ from the previous per-day numbers.
Reliability and cross-platform
AGENTS.md: CRLF and BOM kept; two regions refused. Schedules: stored as instants with their offset. Every command exits quietly into a closed pipe. Hooks run by hand no longer wait forever on a terminal. A half-written transcript line is read next time, not lost. The atomic writer fsyncs before it renames. Full-width:and=count as separators.*TestCase.javais recognised as a test.
What we noticed on the way
- The biggest defect of the release was found while screening research about output formats, not by the research itself: tracing what a scheduled command receives showed it inherited every guard chamnan sets for its own reads. The sibling that execs a session had the same leak — and both were turned into tests before any code moved.
- The dashboard audit recomputed every figure from the raw logs. Three of its panels were drawing a log's retention cap, a UTC offset or a double count, not the thing they were named for.
- A rule the checker allowed took 34 seconds and then reported success. Bounding the pattern was never enough; the input line is what a backtracking engine pays for.
Research
Rounds screened for this release each end in a verdict per finding — tested, already there, or not worth it — and the tests led to the fixes above. The citations from code back to rounds are in the attached INDEX_CITED_IN_CODE.md; python3 .chamnan/tools/research_citations.py --write regenerates it.
Measured and not adopted: parsing the dashboard's inline data through JSON.parse (3.75 → 3.56 ms, not worth a change); batching git calls at session start (10 spawns, about 0.3 s of a 2 s start); a union merge driver for MAP.md (it would leave a silently wrong map); GPU acceleration (chamnan does no numeric work — its time is text, files and git).
Verification
| Checks | Gotcha |
|---|---|
| 6055/6055 | 16/2,039 — 16 recorded since v1.31.2, 2,039 in total |
6055/6055 on the release gate (macOS), and CI green on all five legs — macOS · Linux · Windows on Python 3.8 and 3.13 — on the same commit. The corpus gate (608 files, 99 extensions, 7 writing systems) planted credentials and found 0 in the index; redaction checks 52/52. The check branch caught one thing on the way, fixed before the tag: on Windows with Python 3.8 a closed pipe is reported as Errno 22, so a command piped into head still exited 120 there.
Why the check count went down
The totals were 6,138 in 1.31.1, 6,104 in 1.31.2 and 6,055 now. Nothing was switched off to get there, and every section that left is accounted for below.
- 1.31.1 → 1.31.2 (−34). The checks that need key-shaped test data moved to chamnan-corpus, because the plugin must not carry fake keys. They still run there.
- 1.31.2 → 1.32.0 (−49). In the source,
check(calls went from 5,024 to 4,983. Twenty-one sections left (−99) and twenty-six new ones arrived (+61). The twenty-one, one by one:- 19 sections tested this project's own development tools, which are not part of the plugin and do not ship. They moved out of the public suite into the development workspace. Each file keeps the same number of checks, and they still run there.
- 1 section did not leave. Its heading was reworded, so the census counts it as one section removed and one added. It still has the same 12 checks.
- 1 section (12 checks) was deleted with the code it tested.
chamnan-recallused to look for two files that exist only in this project's own workspace. That lookup is gone, so there is nothing left for those checks to test.
Known limitations
- The redactor still removes some ordinary identifiers that sit beside a secret word (about 255 of 616 removed spans on the corpus benchmark); fixing it without losing recall is next.
- Windows behaviour is verified on CI only.
- The feature-rate denominators on the dashboard still come from a command log capped at 300 a day on busy days.
Upgrade
/plugin update chamnan. Nothing to do afterwards; the dashboard rescans transcripts once under its new cache key.
This release is about behaving well in other people's setups, and showing numbers that are true.