docs(773): strip session narrative — the reader never saw the earlier drafts
PR Gates / CI image pin matches docker/ci (pull_request) Successful in 7s
PR Gates / Docs update reminder (pull_request) Successful in 12s
PR Gates / decisions lifecycle (pull_request) Successful in 16s
Review verdict / Set review-verdict status (pull_request_target) Successful in 29s
PR Gates / Script tests (pytest) (pull_request) Successful in 2m15s
review-verdict/h10 Review-verdict: MERGEABLE @ 1a2afd2 (base: main)
Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 9m20s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 6m44s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Skipped
Build ErsatzTV Image / Functional E2E (curl + UI contracts) (pull_request) Successful in 6m31s
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (pull_request) Successful in 7s
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (pull_request) Successful in 5s

Six places narrated this document's own revision history ("an earlier draft
counted...", "the first version of this table said 18", "the first attempt
returned 0 for Bash"). A reader coming to this cold never saw those drafts, so
the confessions carry no information they can act on — it is session narrative
leaking into a reference artifact.

Each was rewritten to keep what a reader needs and drop what only the author
knows:

- 3.6: was "an earlier draft double-counted" → now states why the families
  overlap conceptually and that membership is a mechanically verified partition,
  so an n is read as disjoint.
- 3.7: was "the first version said 18 and was wrong by half" → now two reusable
  limits: 33 is a floor (it counts records that STATE a count), and re-deriving
  it by pattern under-reports by roughly half, so read all 69.
- 5.3: was "my first attempt returned 0 for Bash too" → now the actionable form:
  re-derive the zero WITH the positive control, because `rg -c` over multiple
  files prints path:count and the obvious total sums the paths.
- 5.5 x2 and 5.5's evidence paragraph: dropped "an earlier draft skipped this"
  and "because an earlier draft overclaimed"; the evidence-status distinction
  itself is what matters and stays.

Deliberately KEPT, because these are findings rather than history: the struck-
through shellcheck row (a tool tested and rejected, so nobody re-proposes it),
the dated measurement stamps, and the 19:45 corpus-snapshot boundary.

The revision narrative is not lost — it lives in these commit messages and in
the closing record, which is where per-issue provenance belongs.

Refs #773

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-13 20:53:22 +02:00
co-authored by Claude Opus 5
parent 9fc334e6e6
commit 1a2afd2f0f
+21 -28
View File
@@ -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