diff --git a/docs/defect-shapes-773.md b/docs/defect-shapes-773.md index e73966f69..8e1c342e0 100644 --- a/docs/defect-shapes-773.md +++ b/docs/defect-shapes-773.md @@ -210,9 +210,10 @@ it was satisfied against a snapshot that stops being true."* ### 3.6 The partition, stated exactly -An earlier draft of this document counted several records in two families at once — twin-missed -records claimed by both Family A and Family C. That is the very error §3 Family A is about, so the -assignment is now given as an explicit partition and **verified to cover all 69 records exactly once**: +The families overlap conceptually — a twin-missed record can be read as "another member of a +population" or as "a second copy" — so membership is given as an explicit partition, **mechanically +verified to cover all 69 records exactly once**. Read a family's n as a disjoint count, not a tally +of everything the family's description could fit: Family letters A–E are the ones §4 names detectors for, and those letters correspond. **This table assigns no letters below E.** §4's detectors F and G address fail-open and destructive-replace, @@ -285,17 +286,12 @@ the text under review. **Two limits on this section, since it is the one making a claim about its own production.** -- **The first version of this table said 18, and was wrong by nearly half.** It was built by - pattern-matching a regex I invented against the corpus — sampling the population instead of - enumerating it, in the section arguing against exactly that. Worse, the hedge attached to it blamed - "records that ran rounds without narrating them", which misdescribed the failure: the 15 missing - records narrate their rounds in the same words as the counted ones, and one of them (#706) is named - as a Family D member three paragraphs earlier in this document, so the table contradicted its own §3. - A cold reviewer caught it. The correction was to read all 69 rather than write a better pattern — - detector A, applied to the paragraph that proposes detector A. -- Even now, 33 is a floor rather than a total: it counts records that *state* a round count, and a - record that ran four rounds without saying so is invisible here. That limit is real; it is just not - what was wrong the first time. +- **33 is a floor, not a total.** It counts records that *state* a round count; a record that ran + four rounds without narrating them is invisible here. Do not read the 36 remaining records as + single-round work. +- **Counting this by pattern rather than by enumeration under-reports it by roughly half.** A regex + over the corpus finds 18 of these 33 — the misses narrate their rounds in the same words as the + hits. If you re-derive this number, read all 69. - **#767 — the case #773 describes as taking eight review rounds — is excluded by snapshot timing, not by absence.** The corpus was drawn at 19:45 on 2026-08-13; #767 closed at 20:04, nineteen minutes later, and now carries a full `## Closing record`. So the worst instance of the phenomenon @@ -449,9 +445,8 @@ Measured over the session transcript corpus (811 files under The zero for `LSP` is verified rather than assumed: the same query shape returns 23,661 `Bash` calls and 5,102 `Read` calls over the same corpus, so the search was demonstrably capable of finding hits. -*(The first attempt at this count returned 0 for `Bash` as well — a `rg -c` output-format slip that -summed the file path instead of the count. A zero without a positive control is exactly the vacuous -verification this document is about.)* +**Re-derive it with that positive control**, not on its own — `rg -c` over multiple files prints +`path:count`, so the obvious way to total it sums the paths and returns zero for everything. **Hooks are the good news.** All 13 scripts in `.claude/hooks/` are wired from either `.claude/settings.json` or `.husky/*`, and no settings entry points at a missing path — there are @@ -479,9 +474,8 @@ row in that table from inference to measurement, and it is cheap. ### 5.5 Tools we do *not* have that would address a named class -#773 asked for this explicitly and an earlier draft of this document skipped it. Each is justified -against specific issues, not general merit; anything I could not tie to recorded instances is left -out rather than padded in. +Each is justified against specific issues, not general merit; anything that could not be tied to +recorded instances is left out rather than padded in. | Tool | Class it addresses | Justification | |---|---|---| @@ -496,14 +490,13 @@ be the symptom-keyed mistake. Nothing in the corpus suggests a tool we lack woul for Family A — the four in-repo reinventions show the convention works when applied; the failure is that it was never written down once. -**Evidence status of these rows, stated exactly, because an earlier draft of this paragraph -overclaimed it.** Only the shellcheck row was *executed* — which is why it is struck through, and it -was struck through *because* running it refuted the reason it had been proposed. The three surviving -rows are **reasoned from precedent**: each names issues whose recorded mechanism the tool addresses, -but none has been run against this repo to confirm it fires. That is a weaker warrant and should be -discharged before any of them is adopted — a tool justified by "it plausibly catches this class" is -the same species of claim as the guards this document criticises. Treat these three as candidates to -test, not findings. +**Evidence status of these rows, which differs and matters.** Only the shellcheck row was +*executed* — and running it refuted the reason it had been proposed, which is why it is struck +through. The three surviving rows are **reasoned from precedent**: each names issues whose recorded +mechanism the tool addresses, but none has been run against this repo to confirm it fires. That is a +weaker warrant and should be discharged before any of them is adopted — a tool justified by "it +plausibly catches this class" is the same species of claim as the guards this document criticises. +Treat these three as candidates to test, not findings. **On MemPalace**, the 19-day gap deserves care rather than a verdict: `CLAUDE.md` makes it the documented discovery path for decisions, so either sessions are skipping the documented path, or