port: correct a check that asserted an absence of measurement as a finding

The pair I shipped this iteration -- focus_persists on for main_menu, off
everywhere else -- reported both halves as agreement with the contract. Nothing
measured that extras does not persist. The corpus has EXTRAS' opening item from
one entry and (B) restoring the PARENT's focus 4/4; neither says what a submenu's
own cursor does on re-entry. Caught by the Decoder.

It is the mirror of the trap it was written to avoid. I refused to let a derived
menu-wide rule overwrite a measured value, then let 'not measured here' become a
positive assertion of the negative. Both treat a gap in the corpus as if it
carried information and differ only in which direction they fill it. And the
failure mode was the bad one: if the game does persist EXTRAS, the check holds
the port to the wrong behaviour and passes while doing it.

check_focus_persists now asserts only the measured half. The scope became a
separate guard with its own outcome word -- 'only main_menu, AUTHORED DEFAULT,
unmeasured elsewhere' -- which still fails if widened, since that should be a
deliberate edit, but can no longer be read as the game being known to reset.
focus_persists_why records the correction rather than being rewritten.

It also weakens a label. EXTRAS' initial_focus is marked measured and was taken
on a single entry; now that the main menu is known to remember its cursor, a
one-entry reading of any screen may be measuring history rather than what the
screen opens on -- the same objection that reframed the TUTORIAL/NEW GAME
disagreement. The observation stands, its reading as an initial focus does not.
Caveat attached, kind left as measured with a note that it changes if EXTRAS
turns out to persist.

Not building on the non-persistence half until their EXTRAS re-entry run returns.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
This commit is contained in:
Sylpheed port agent
2026-08-30 21:39:08 +00:00
parent 6e3347a338
commit b3da5c1d48
3 changed files with 127 additions and 12 deletions

View File

@@ -9,7 +9,7 @@ dies, which is what this file is for.
<!-- INDEX: generated by tools/port/index-decisions -- do not hand-edit -->
241 sections. Search this before re-deriving anything.
242 sections. Search this before re-deriving anything.
* [P0 — the exporter, 2026-08-28](#p0--the-exporter-2026-08-28)
* [P1 — Godot draws the screen, 2026-08-28](#p1--godot-draws-the-screen-2026-08-28)
@@ -252,6 +252,7 @@ dies, which is what this file is for.
* [The `+0x08` ask came back answered — and is not consumable yet](#the-0x08-ask-came-back-answered--and-is-not-consumable-yet)
* [The pin moves to `formats-pin-2026-08-30b`, and the port stops owning `+0x08`](#the-pin-moves-to-formats-pin-2026-08-30b-and-the-port-stops-owning-0x08)
* [The menu remembers its cursor — a measured P5 defect, fixed and scoped](#the-menu-remembers-its-cursor--a-measured-p5-defect-fixed-and-scoped)
* [🔴 Correction, same day: I encoded an absence of measurement as a finding](#correction-same-day-i-encoded-an-absence-of-measurement-as-a-finding)
<!-- /INDEX -->
## P0 — the exporter, 2026-08-28
@@ -12577,3 +12578,58 @@ settling it.** If focus persists, an "initial focus" reading not taken on a fres
boot's first menu entry is measuring history — so the records that disagreed need
not disagree about the game. My `NEW GAME` stays **authored**, on its own
reasoning. Nothing here confirms it.
## 🔴 Correction, same day: I encoded an absence of measurement as a finding
The check I shipped this iteration asserted a **pair** — `focus_persists` on for
`main_menu`, off everywhere else — and called both halves agreement with the
contract. The Decoder caught it: **nothing measured that `extras` does not
persist.** The corpus has EXTRAS' opening item from *one entry* and Ⓑ restoring
the *parent's* focus 4/4. Neither says what a submenu's own cursor does on
re-entry.
📌 **It is the exact mirror of the trap I had just congratulated myself on
avoiding.** I refused to let a derived menu-wide rule overwrite a measured value
— and then let *"not measured here"* become a positive assertion of the negative.
Both errors treat a gap in the corpus as if it carried information; they only
differ in which direction they fill it.
And the failure mode was the bad one: **if the game does persist EXTRAS, the
check holds the port to the wrong behaviour and passes while doing it.** A wrong
assertion that fails is a nuisance; a wrong assertion that passes is a
manufactured fact.
### What changed
* `check_focus_persists` now asserts **only the measured half** against the
contract.
* The scope is a separate **`guard`** with its own outcome word, printing
`only main_menu -- AUTHORED DEFAULT, unmeasured elsewhere`. It still fails if
someone widens it, because that should be a deliberate edit with a `why` — but
a passing run can no longer be read as the game being known to reset.
* `focus_persists_why` records the correction rather than being rewritten, and
says the non-persistence half is **the port's default, not the game's
behaviour**.
### And it weakens a `kind` label I had been leaning on
EXTRAS' `initial_focus: ptbtn11` is marked `measured`, and the same objection
applies to it: **it was taken on a single entry.** Now that the main menu is known
to remember its cursor, a one-entry reading of any screen may be measuring
*history* rather than what the screen opens on — the same argument that reframed
the main menu's TUTORIAL-versus-NEW-GAME disagreement this morning.
The observation stands; its *reading* as an initial focus does not. Left as
`measured` with the caveat attached, because the frame really does show MISSION
SELECT focused and it is the only reading there is — flagged so that if EXTRAS
turns out to persist, the label changes with it.
⚠️ **Not building further on the non-persistence half** until their EXTRAS
re-entry run comes back.
📌 Their sharpening of the pins point is the general form of all of this: **the
disciplines that fail this way are the ones that never visibly failed.**
Delivery-confirmation went to Ⓐ and Ⓑ because those broke once; the d-pad had
always quietly worked, so nothing directed attention at it. `kind: "measured"` is
the same shape — it has never visibly failed, so nothing has been checking what
each instance of it actually rests on.