From 81e84d6ec63d16c1643c7c8d64e580e24a8d09b9 Mon Sep 17 00:00:00 2001 From: sylph-decoder Date: Sun, 30 Aug 2026 20:02:21 +0000 Subject: [PATCH] re: the refuted register ignored the deaths I just wrote, and two false positives shared a cause Three refutations written as prose under ### headings never entered the register: check_refuted.py parses * "claim" lines, so the count stayed at 188. Registered them properly (188 -> 192). A register that parses one syntax silently ignores every other, and it is invisible from the author's side -- ask the register what it holds, do not re-read what you wrote. Both standing false positives were bullets under a header that retracts the whole list, with no marker in the +-4-line window: scope marks them, not proximity. The scan now includes the nearest preceding header and matches markers case-insensitively ('An earlier version' was missed by the marker 'an earlier version'). Controlled by planting a real revival and confirming it is still caught; register now runs clean at 0. Also records sylpheed-port's diagnosis of the phase-lock fallout: a number can be inapplicable rather than wrong, and a tension built on one is manufactured. Plus their point that some claims are not registrable in a substring register at all. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v --- docs/re/METHOD.md | 45 +++++++++++++++++++++++++++++++ docs/re/REFUTED.md | 6 +++++ tools/re-capture/check_refuted.py | 17 +++++++++--- 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/docs/re/METHOD.md b/docs/re/METHOD.md index 33d53aca..60e87753 100644 --- a/docs/re/METHOD.md +++ b/docs/re/METHOD.md @@ -2232,3 +2232,48 @@ the gate, and it is cheap: fire at gate + k frames for a few k. Note which results survive this and why: a **margin between two candidates scored on one capture** was unaffected, because correlated noise moves both scores together and cancels. Prefer margins to absolute scores when the shutter is gated. + +## Publishing a death is not registering it — the register has a *form* + +I wrote three refutations this iteration as prose under `###` headings and +considered them published. `check_refuted.py` parses `* "claim"` lines, so **none +of the three entered the register**: 188 claims before, 188 after. The deaths were +readable and unenforceable, which is the exact hole I had been carrying as "I have +a checker; knowing is still manual" — and I widened it while writing the checker's +own supporting docs. + +⚠️ **A register that parses one syntax silently ignores every other syntax.** The +failure is invisible from the author's side, because the prose looks finished. The +only way to see it is to *ask the register what it holds* after writing, not to +re-read what you wrote. Do that: the count must go up. + +Two false positives in the same run had one shared cause worth keeping: both were +bullets under `## 🔴 What this retracts`, each bullet a claim being killed, with no +marker within the ±4-line window. **Scope marks them, not proximity** — the scan now +includes the nearest preceding header, and matches markers case-insensitively +(`An earlier version` had been missed by the marker `an earlier version`). Both +changes were controlled by planting a real revival and confirming it is still +caught. + +## A number can be inapplicable rather than wrong + +`sylpheed-port`'s diagnosis of the fallout from the phase-lock finding, and it is a +distinct failure mode from anything else on this page. They had recorded a tension +they could not adjudicate: my 0.32 argued *absent*, their curve argued *present*. +The 0.32 was not a wrong measurement — it was a **correct measurement of something +that carried no information about the question**, because a phase-locked shutter +shows identical content in the sweep band whether or not the sweep is drawn. + +⚠️ **The tension was manufactured entirely by treating an inapplicable number as +evidence.** It presented as a conflict between two measurements; it was one +measurement and one artefact. Before recording two results as in tension, check +that both are *about* the question — a number that would read the same under both +hypotheses cannot discriminate them, however carefully it was measured. + +📌 And a limit they surfaced rather than papered over: **some claims are not +registrable in a substring register.** Their `0.32` collides with an unrelated +measurement of their own, so registering it would produce a permanent false hit and +train the check to be ignored. Mine avoids that collision only by accident — a +25-character minimum excludes bare numbers by construction, which is the same limit +from the other side. A short claim cannot be enforced by substring; say so instead +of forcing a row in. diff --git a/docs/re/REFUTED.md b/docs/re/REFUTED.md index 3a36c898..ea7f6412 100644 --- a/docs/re/REFUTED.md +++ b/docs/re/REFUTED.md @@ -718,6 +718,9 @@ reachable by the person about to repeat it. ### The JP title might not draw the sweep leaves at rest — ❌ REFUTED (2026-08-30, mine) +* ~~"the JP title does not draw the sweep leaves at rest"~~ — refuted, see below. +* ~~"build 7's denser logo stack occludes the sweep leaves"~~ — refuted, see below. + I hypothesised that build 7's denser logo stack (katakana + crystalline burst) **occludes** the two sweep leaves, to explain why two JP title captures differ by RMSE 0.32 inside the adjudication box while two EN captures a plateau-phase apart @@ -730,6 +733,9 @@ The 0.32 had a different cause: **my own gate**. See below. ### "Two sessions sample a free-running clock" — ❌ REFUTED (2026-08-30, mine) +* ~~"a free-running clock lands somewhere else on a fresh boot"~~ — refuted, the gate phase-locks it. +* ~~"the in-box capture noise of 0.32 between sessions"~~ — refuted as a noise floor; it measures the trigger. + `jp-title-at-rest.txt` justified a second capture as probing the between-run axis "where a free-running clock lands somewhere else on a fresh boot", and reported its in-box **0.32 as capture noise**. Measured at the shutter instant, the sweep diff --git a/tools/re-capture/check_refuted.py b/tools/re-capture/check_refuted.py index 6d9a377b..ab003d1c 100755 --- a/tools/re-capture/check_refuted.py +++ b/tools/re-capture/check_refuted.py @@ -25,7 +25,7 @@ from pathlib import Path MARKERS = ("refuted", "REFUTED", "withdrawn", "WITHDRAWN", "retracted", "RETRACTED", "🔴", "~~", "used to say", "used to read", "was wrong", "is wrong", - "no longer", "superseded", "corrected", + "no longer", "superseded", "corrected", "retracts", "an earlier version", # text explicitly DECLINING to revive a claim reads as an assertion to # a neighbourhood scan; two real hits were exactly this. "does **not** revive", "does not revive") @@ -61,8 +61,19 @@ for c in claims: for i, l in enumerate(lines): if needle in l: lo, hi = max(0, i - CTX), min(len(lines), i + CTX + 1) - near = "\n".join(lines[lo:hi]) - if not any(m in near for m in MARKERS) and (f, i) not in seen_report: + # ⚠️ A +-CTX neighbourhood misses the commonest real marker: a + # SECTION HEADER that retracts a whole list. Two false positives + # were exactly this -- bullets under "## 🔴 What this retracts", + # each bullet a claim being killed, no marker within 4 lines. + # Scope, not proximity, is what marks them, so include the + # nearest preceding header in the scan. + hdr = "" + for j in range(i, -1, -1): + if re.match(r"#{1,4} ", lines[j]): + hdr = lines[j] + break + near = "\n".join(lines[lo:hi]) + "\n" + hdr + if not any(m.lower() in near.lower() for m in MARKERS) and (f, i) not in seen_report: seen_report.add((f, i)) hits += 1 print(f"🔴 {f}:{i+1}")