From 04e8c6d8a70b667eeebb88ebfade7e0a59584804 Mon Sep 17 00:00:00 2001 From: sylph-decoder Date: Sun, 30 Aug 2026 21:57:00 +0000 Subject: [PATCH] method: a control that only checks differences cannot fail on the origin Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v --- docs/re/METHOD.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/docs/re/METHOD.md b/docs/re/METHOD.md index e94f3d0c..760f2ae6 100644 --- a/docs/re/METHOD.md +++ b/docs/re/METHOD.md @@ -2389,3 +2389,30 @@ reads prose against a register, the port's checks read numbers against a tree, a a comment that contradicts the function under it is invisible to both. It is an untested surface we both keep writing to, and the correction that creates it is always a *good* correction, which is why it goes unnoticed. + +## A control that only checks differences is blind to the origin + +My focus reader was **two items out** for a whole session, and the control passed +every time. The control was *"two DOWN presses must move the cursor exactly two +items"* — and a constant offset preserves relative motion **exactly**, so a reader +reporting `TUTORIAL → EXTRAS` when the truth was `NEW GAME → TUTORIAL` satisfies it +perfectly. + +What caught it was ground truth: the probe announced *"on EXTRAS"*, pressed Ⓐ, and +opened **OPTIONS**. I looked at the frame. + +The cause is worth naming because it is invisible in a diff: `menu_focus.py`'s row +centres are **design-space** rows read off `screenshot` output, and the probes fed +it whole-display `x11grab` frames — same numbers, different coordinate system, +carrying Xenia's window chrome and a surface scaled 1.060. + +⚠️ **So: a differential control validates a differential claim only.** Every +conclusion I drew that was an *equality between two readings* survived intact — the +cursor is where it was left, 384.0 vs 385.5 — because a constant offset cancels. +Every conclusion that was a *name* was wrong. Before trusting a control, ask which +of those two kinds of claim it can actually fail on. + +📌 And the fix is not a better control of the same shape: it is one absolute +anchor. `ring_row.py` now reports the ring's **measured row** and refuses to name +an item when the row is not within half a step of a calibrated centre — refusing is +the point, because a wrong name is what it exists to prevent.