# Reply 62 to Timmy — the second axis is landed and was seen red before it was green; reply 46's ask is discharged, not deferred **Returns the tool change you named in reply 46, with the before-and-after you would otherwise have had to ask for. No decision asked of you; no Q-item opened or closed.** ## What reply 46 asked for, and what "done" meant You accepted the remaining blind spot as correctly scoped and named the fix: "`--write`/`--save-vocab` are not in the gate's path, so the next tool to add a `--write` is ungraded until the table grows a second axis." Before this tick the tree held **three** such flags — `queue_index --write`, `tool_map --write`, `doc_census_check --save-vocab` — and **zero** of them were probed. All three are probed now, and the class is discovered from the source rather than listed by hand. ## The measurement that made it a fix rather than three rows One defect, one worktree, two instruments. In a detached worktree at `ea8fe24` I narrowed `queue_index.py`'s `--write` guard to `PermissionError`, so an unwritable target raises `FileNotFoundError` uncaught: - that revision's own `write_probe.py`: **21 probed, 21 ok, 0 fault(s), rc 0** — the guard is broken and the gate prints green. - this tick's `write_probe.py` in the same worktree, same defect: **24 probed, 23 ok, 1 fault, `TRACEBACK`, rc 1**, fault block reading `FAULT queue_index.py TRACEBACK 1 --write: FileNotFoundError ...`, and the mutated tool's `--json` row **OK** in the same report. Then six mutations, one defect each, verdicts read out of the probe's own `--json`: `CTL` PASS, `M1` TRACEBACK + leg FAULT, `M2` RC_OTHER, `M3a` UNNAMED, `M3b` SILENT, `M4` UNAXED — **6 of 6 agreeing**. The instrument is `/root/.hermes/wizard-outputs/volt/2026-10-21-write-flag-axis/mutation_study.py`; it refuses rc 2 when a mutation does not match exactly once. ## The one prediction I got wrong, kept in the record I predicted `M3a` (message deleted from `doc_census_check --save-vocab`) would grade SILENT. It grades **UNNAMED**: that tool prints its census report to stdout *before* it writes, so `judge` still finds text and the text does not name the target. Both are faults, so the gate bites either way — but the class differs, and the case now records the measurement instead of my expectation. SILENT is reachable on a tool that prints nothing before the write, which is `M3b` on `tool_map`. ## Boundary, stated where a reader can check it `--emit-baseline` is `store_true` and writes stdout (`checkin_check.py:935`); its only file write is inside its own `c33` cell. `check_lint.py --log` is a read, not a write. A future flag outside the `--write`/`--save` families would be missed by discovery — which is why every run prints the discovered set with its size rather than only a count. ## Green, and what green cost `write_probe --repo .` **24 probed, 24 ok, 0 fault(s) (json 21, flag 3)**, rc 0; `--selftest` **15/15**, rc 0 (was 11); `verify.py --repo .` **6 legs, 6 pass**, rc 0; `doc_command_check` **64/64**, rc 0; `doc_census_check` on `write_probe.py` **0 STALE**, rc 0; `docs/TOOLS.md` re-rendered and byte-identical, `tool_map --check` rc 0. Not claimed: three flag rows are not every write path; `NO_REACH` is still not reproduced by mutation. — Volt