From b810d7c19ec349ac51dd7699fc9f735456124438 Mon Sep 17 00:00:00 2001 From: Jonathan Borduas Date: Mon, 7 Sep 2026 23:21:51 +0100 Subject: [PATCH 1/2] handoff: four of five KNOWN-BROKEN rows were stale, in the file a successor reads first MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Attempting #451's close condition — "every workaround is in a durable artifact, or recorded as deliberately left" — turned up one unrecorded item and, on the way, a table that had outlived its defects. ⇒ THE AUDIT: 7 of 8 §1–§2 items ARE durable (merge-guard's three legs are in the tool, the two-dot trap is in leg 4's comment, `git cherry`'s patch-id collapse is in stranded-branches, the SUBJ_DIR form is in gate-selftests itself). ONE was not. ⛔ THE UNRECORDED ONE, and the only place it lived was a QUARANTINED file. #451 §1 records "reading a pane's context % needs `lines: 4` on terminal.getStatus — 1 and 2 omit it". The sole match in the tree is `tools/teamlead/boxwatch.sh`, which sits under QUARANTINE.txt with its belonging an open question. ⇒ A fact recorded only in a quarantined file is not recorded. ⚠ AND THE NUMBER IS WRONG. Re-measured against a live pane, one call per value: lines 1 -> no % · lines 2 -> no % · lines 3 -> 76% PRESENT · lines 4 -> present The boundary is 3, not 4. The `[re-verified]` tag travelled with a figure one too high. ★ And a fixed number is the wrong thing to record: the % lives in the status BLOCK, whose height depends on what the pane renders. So the entry says "ask for >= 3 and CHECK the % is in recentOutput", not a constant — a constant rots silently, because a short read returns a well-formed status object with the percentage simply absent. ⛔ FOUR OF FIVE KNOWN-BROKEN ROWS WERE STALE. Each said "⛔ live on main": index-watch --self-test hangs -> exits 0 in 13.3s 24 of 48 controls establish nothing -> 48 passed · 0 UNESTABLISHED · 1 UNVERIFIABLE bootstrap-audit's control FAILS -> 0 FAILED, its own control block passes use-not-mention is UNVERIFIABLE -> exits 2, not 0 Struck rather than deleted; the fifth (estate vocabulary is a closed list) still holds, and the real UNVERIFIABLE is now pretooluse-guard.py, which the gate names. ★ AND THE BARE COMMAND WAS THE WRONG COMMAND — #451 §1's own warning, applied to my own measurement mid-audit. `bash scripts/gate-selftests.sh` reports `ran 6 subject(s)`; `SUBJ_DIR=tools ./scripts/gate-selftests.sh`, the form CI runs, reports `ran 63`. Same minute. A row citing the bare form measures a tenth of the population it claims to. Co-Authored-By: Claude Opus 5 (1M context) --- docs/HANDOFF.md | 54 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 405d933..811ae06 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -125,11 +125,55 @@ construction; **neither is "the" number** and both name their predicate. | what | reproduce | status | |---|---|---| -| `tools/index-watch.py --self-test` **hangs** | `python3 tools/index-watch.py --self-test` → never returns | ⛔ live on main | -| **24 of 48 controls establish nothing** | `bash scripts/gate-selftests.sh` → `15 UNESTABLISHED · 9 UNVERIFIABLE` | ⛔ live | -| `bootstrap-audit.py`'s control **FAILS** | same command → `⛔ CONTROL FAILED` | ⛔ blocks #444 | -| `use-not-mention.py` is **UNVERIFIABLE** | accepts `--zzz-not-a-flag`, exits 0 | ⛔ the mention/use instrument cannot verify itself | -| estate vocabulary is a **closed list** | `scripts/check-tools-index.py:158` | ⛔ a novel estate reads as LOCAL (#348) | +| ~~`tools/index-watch.py --self-test` **hangs**~~ | `python3 tools/index-watch.py --self-test` | ✅ **FIXED** — exits 0 in 13.3s, re-measured 2026-09-07 | +| ~~**24 of 48 controls establish nothing**~~ | `SUBJ_DIR=tools ./scripts/gate-selftests.sh` | ✅ **FIXED** — `63 subjects · 48 passed · 0 FAILED · 0 UNESTABLISHED · 1 UNVERIFIABLE` | +| ~~`bootstrap-audit.py`'s control **FAILS**~~ | same command | ✅ **FIXED** — `0 FAILED`; its own `--self-test` exits 0 and the control block passes | +| ~~`use-not-mention.py` is **UNVERIFIABLE**~~ | `python3 tools/use-not-mention.py --zzz-not-a-flag` | ✅ **FIXED** — exits **2**, not 0 | +| `pretooluse-guard.py` is **UNVERIFIABLE** | `python3 tools/pretooluse-guard.py --zzz-not-a-flag` → exits **0** | ⛔ live — the gate names it, and it is the only one | +| estate vocabulary is a **closed list** | `scripts/check-tools-index.py:158` | ⛔ live — a novel estate reads as LOCAL (#348) | + +⛔ **FOUR OF THE FIVE ROWS ABOVE WERE STALE, in the file a successor is pointed at FIRST.** Struck +rather than deleted, because the drift is the point: each said `⛔ live on main` about a defect that +had been fixed, and #451 §5 says *"point a successor at `docs/HANDOFF.md` before anything else"* — +so a successor inherited four defects that no longer existed. Re-measured 2026-09-07, every row by +its own command. + +★ **AND THE BARE COMMAND WAS THE WRONG COMMAND, which #451 §1 warned about in this file's own +lineage.** `bash scripts/gate-selftests.sh` reports `ran 6 subject(s)`; `SUBJ_DIR=tools +./scripts/gate-selftests.sh` — the form CI runs — reports `ran 63`. Measured in the same minute. +⇒ *The reproduction command is not the script name*, and a row citing the bare form measures a +tenth of the population it claims to. + +## ⚠ Reading a pane's context % — the default `lines` does not reach it + +⛔ **The only place this was written down was a QUARANTINED script.** #451 §1 recorded it as a +workaround *"written nowhere else"* — `terminal.getStatus` needs `lines: 4`, *"1 and 2 omit it"* — +and an audit on 2026-09-07 found 7 of its 8 §1–§2 items durable and this one not: the sole match in +the tree was `tools/teamlead/boxwatch.sh`, which sits under `tools/QUARANTINE.txt` and whose +belonging is an open question. **A fact recorded only in a quarantined file is not recorded.** + +⇒ **AND THE RECORDED NUMBER IS WRONG.** Re-measured 2026-09-07 against a live pane, one call per +value: + +``` +lines: 1 ⏵⏵ bypass permissions on · 1 monitor … ⛔ no context % +lines: 2 ⊘ codex-1 │ ⊘ codex-2 │ … + the bar ⛔ no context % +lines: 3 Opus 5 │ … ███████░░░ 76% (756K) │ … ✅ present +lines: 4 a ─── separator, then the same three ✅ present +``` + +**The boundary is 3, not 4.** The `[re-verified]` tag in #451 travelled with a figure that was one +too high. + +★ **AND A FIXED NUMBER IS THE WRONG THING TO RECORD, which is why this entry is phrased as it is.** +The percentage lives in the pane's status BLOCK, and how many lines that block occupies depends on +what the pane is rendering — this one showed a separator at 4 and none at 3. ⇒ **Ask for `lines` ≥ 3 +and CHECK the `%` is in `recentOutput`; do not trust a constant.** A number recorded here would rot +the same way `4` did, and rot silently: a short read returns a well-formed status object with the +percentage simply absent. + +⚠ Measured on one pane, one moment. It establishes the default is too small and that 3 sufficed +there — not a floor that holds for every pane. ## ⛔ Numbers WITHDRAWN tonight, and why — this section is the point of the file From 6e6610dd9f7e2140af69493001423912790f6c64 Mon Sep 17 00:00:00 2001 From: Jonathan Borduas Date: Mon, 7 Sep 2026 23:27:39 +0100 Subject: [PATCH 2/2] =?UTF-8?q?handoff:=20name=20which=20rows=20the=20"fou?= =?UTF-8?q?r=20of=20five"=20counts=20=E2=80=94=20the=20table=20now=20has?= =?UTF-8?q?=20six?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review finding, and it is right: my edit ADDED a row (pretooluse-guard.py, replacing the struck use-not-mention.py), so "FOUR OF THE FIVE ROWS ABOVE" describes a table the reader can no longer see. The sentence now says four of the five the table held BEFORE 2026-09-07, and names all six of what stands: four struck, one replacement, and `estate vocabulary` — the one of the original five that still holds. DECLINED — MD040, a language identifier on the fence. Measured: 26 fences in this file, 0 with a tag. Same ruling as #636 on the same file: tagging one of twenty-six makes it less consistent, not more, and markdownlint does not gate here. If the house style should be `text` everywhere, that is a whole-file change with its own PR. Co-Authored-By: Claude Opus 5 (1M context) --- docs/HANDOFF.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 811ae06..205453d 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -132,7 +132,10 @@ construction; **neither is "the" number** and both name their predicate. | `pretooluse-guard.py` is **UNVERIFIABLE** | `python3 tools/pretooluse-guard.py --zzz-not-a-flag` → exits **0** | ⛔ live — the gate names it, and it is the only one | | estate vocabulary is a **closed list** | `scripts/check-tools-index.py:158` | ⛔ live — a novel estate reads as LOCAL (#348) | -⛔ **FOUR OF THE FIVE ROWS ABOVE WERE STALE, in the file a successor is pointed at FIRST.** Struck +⛔ **FOUR OF THE FIVE ROWS THIS TABLE HELD BEFORE 2026-09-07 WERE STALE, in the file a successor +is pointed at FIRST.** The table now shows SIX rows — the four struck ones, the `pretooluse-guard.py` +row that replaced `use-not-mention.py`, and `estate vocabulary`, which was the one of the original +five that still holds. Struck rather than deleted, because the drift is the point: each said `⛔ live on main` about a defect that had been fixed, and #451 §5 says *"point a successor at `docs/HANDOFF.md` before anything else"* — so a successor inherited four defects that no longer existed. Re-measured 2026-09-07, every row by