port: EXTRAS resets, measured -- and being right by luck is not evidence

Ring at 347.5 on entry (MISSION SELECT), 427.5 after one delivery-confirmed DOWN,
347.5 on re-entry with the frame 0.0% different from first entry, screen
confirmed by eye because an earlier run was fooled about which screen it was on.

Two things settle here. The caveat on extras/initial_focus comes off: MISSION
SELECT is a genuine initial focus, because a screen that RESETS cannot have a
single-entry reading that is measuring history -- that objection was live only
while persistence here was unknown. And focus_persists: false for extras is now
written explicitly with kind: measured. Nothing changes at runtime, since the
port already defaulted to false; the point is that an absent key and a measured
false behave identically and mean opposite things -- 'nobody looked' versus 'the
game was watched doing it' -- and only the second is visible to audit-kinds.

It does not vindicate how it got there and is not recorded as if it did. For one
iteration contract-check ASSERTED extras non-persistence with nothing behind it,
the Decoder flagged it, and the measurement then agreed. Their separation is
sharper than my own account was: declining to generalise the memory was correct,
on the evidence then and on measurement now, since the two screens genuinely
disagree -- but encoding 'not measured here' as a positive assertion of the
negative was a different move that happened to land. Being right by luck does not
retroactively make it evidence. The check is rewritten to rest on the
measurement rather than left in place looking vindicated.

guard_focus_scope no longer polices 'only main_menu': there is no menu-wide rule
to state, since two measured screens disagree. It now states both measured values
and counts the screens that say nothing, printing UNMEASURED, not 'resets'.

Untested and not built on: OPTIONS, LOAD GAME, TUTORIAL. And nobody can separate
'resets to MISSION SELECT' from 'resets to the top item' -- they coincide, since
ptbtn11 is both. The port's value is right under either reading and the reason is
not established, which matters the day a screen is authored whose opening item is
not its first.

16 kind labels audited clean, 14 controls firing, every asserting check passes.
The P5 walk artifact now matches a measurement on both halves rather than one
measurement and one default.

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 22:14:10 +00:00
parent 5ff278a5ca
commit 1ca90bfbd6
3 changed files with 150 additions and 25 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 -->
245 sections. Search this before re-deriving anything.
246 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)
@@ -256,6 +256,7 @@ dies, which is what this file is for.
* [The `kind` sweep I said I owed: 15 labels, and 7 rested on a neighbour's argument](#the-kind-sweep-i-said-i-owed-15-labels-and-7-rested-on-a-neighbours-argument)
* [A refutation attempt on Q2's map of `GP_TITLE` — the count is right, the list is short](#a-refutation-attempt-on-q2s-map-of-gp_title--the-count-is-right-the-list-is-short)
* [An authored value became a measured one, and a difference-only check got an origin](#an-authored-value-became-a-measured-one-and-a-difference-only-check-got-an-origin)
* [EXTRAS resets — measured. The assertion was right and that does not make it evidence.](#extras-resets--measured-the-assertion-was-right-and-that-does-not-make-it-evidence)
<!-- /INDEX -->
## P0 — the exporter, 2026-08-28
@@ -12767,3 +12768,64 @@ class of error these checks exist to catch.** Thirteen controls now, all firing.
❔ **EXTRAS remains unmeasured** — the run meant to settle it navigated to OPTIONS
believing it was EXTRAS, so `initial_focus: ptbtn11` stays undecided and nothing
here is built on it.
## EXTRAS resets — measured. The assertion was right and that does not make it evidence.
Ring at **347.5** on entry (`MISSION SELECT`), **427.5** after one
delivery-confirmed DOWN, **347.5** on re-entry, with the frame **0.0 %**
different from the first entry — and the screen confirmed by eye as EXTRAS,
because an earlier run was fooled about which screen it was on.
Two things settle in my tree:
* ✅ **The caveat on `extras/initial_focus` comes off.** `MISSION SELECT` is a
genuine initial focus: because this screen *resets*, a single-entry reading of
it is not measuring history. That objection was live only while persistence
here was unknown.
* ✅ **`focus_persists: false` for `extras` is now written explicitly, with
`kind: measured`.** The port already defaulted to false, so nothing changes at
runtime. 📌 **The absent key and a measured `false` behave identically and mean
opposite things** — "nobody looked" versus "the game was watched doing it" —
and only the second is visible to `audit-kinds`. That is the whole reason to
spend a key on it.
### 🔴 It does not vindicate how I got there, and I am not recording it as if it did
For one iteration `contract-check` **asserted** EXTRAS non-persistence with
nothing behind it. The Decoder flagged it; the measurement then agreed with it.
Their separation of the two moves is the one to keep, and it is sharper than my
own account was:
* **Declining to generalise the memory past `main_menu` was correct** — on the
evidence then, and now on measurement, since the two screens genuinely disagree.
* **Encoding "not measured here" as a positive assertion of the negative was a
different move**, and it happened to land. **Being right by luck does not
retroactively make it evidence.** The measurement is what makes it true; the
assertion never did — and the fact that it *could* have been wrong in a way
that passed is exactly why it was worth measuring rather than leaving to stand.
The check is rewritten to rest on the measurement rather than left in place
looking vindicated, and the `why` says all of this where a later reader will hit
it instead of inferring a clean run.
### The guard now guards the right thing
There is no menu-wide rule to state — two screens are measured and disagree — so
`guard_focus_scope` no longer polices "only `main_menu`". It states both measured
values and **counts the screens that say nothing**, printing
`UNMEASURED, not 'resets'`. The silent ones are the port defaulting, not a
finding.
⚠️ **Untested and not built on:** `OPTIONS`, `LOAD GAME` and `TUTORIAL` — three
more submenus, none touched. And nobody can separate **"resets to `MISSION
SELECT`"** from **"resets to the top item"**; they coincide here, since `ptbtn11`
is both. The port's value is right under either reading and **the reason is not
established** — which matters the day a screen is authored whose opening item is
not its first.
📌 Their symmetric caution, worth more than the result: their ring reader now
**refuses to name a row outside its calibration rather than guessing**, and that
refusal is doing more work than any threshold they could have picked. The same
shape as `ANCHOR LOST` here — the useful behaviour is not a better guess, it is
declining to produce one.