From d113b681be8f2d62a3f92e7ad6e8bacaedf08986 Mon Sep 17 00:00:00 2001 From: Sylpheed port agent Date: Sun, 30 Aug 2026 12:34:45 +0000 Subject: [PATCH] port: score the boot's own end frame against the game -- 0.00% differing --boot --capture= used to write no file: _finish_boot() was reachable only from the overlay-quit branch, and the boot quit first because that branch fires when _overlay_spec.is_empty(), which it is the instant the overlay is raised. Fixed earlier this session by the _overlay_quit_at guard -- and I never went back to check what the fix made possible. The P3/P7 artifact has been available for hours and unused. The boot running unattended and photographing its own end state: RMSE 12.80, 0.00% differing against live-title-press-a.png. The residual is the known capture gamma floor. More useful: verify-capture reaches this frame by a shortcut (--screen=title --overlay=press_start --time=3.95) rather than by booting, and that shortcut has been trusted since it was written and never tested against what it stands in for. It is faithful -- 12.83 / 0.00% against the boot path's 12.80 / 0.00%, agreeing to 0.03 RMSE. Does not show the intervening sequence is right: it is one frame, the last one. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF --- docs/port/DECISIONS.md | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index 13c82420..21eca1dd 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -9,7 +9,7 @@ dies, which is what this file is for. -153 sections. Search this before re-deriving anything. +154 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) @@ -164,6 +164,7 @@ dies, which is what this file is for. * [Correction: those two are the *sound* path, which makes the rule stronger](#correction-those-two-are-the-sound-path-which-makes-the-rule-stronger) * [The two loading screens are no longer black, and it was the paint order](#the-two-loading-screens-are-no-longer-black-and-it-was-the-paint-order) * [Adjudicating the Decoder's `rest()` replacement against the game](#adjudicating-the-decoders-rest-replacement-against-the-game) +* [The boot's own end frame, scored against the game for the first time](#the-boots-own-end-frame-scored-against-the-game-for-the-first-time) ## P0 — the exporter, 2026-08-28 @@ -5942,7 +5943,7 @@ Fixed: with a script, the capture defers to the end of the run, through the same `_capture_to` member the boot path already used. Verified — the two runs now differ at max 235, and the capture lands at t=82 units instead of t=8. -### 2. `--boot --capture=` wrote no file at all +### 2. `--boot --capture=` wrote no file at all — ✅ FIXED, see below `_finish_boot()` is reachable only from the overlay-quit branch, but the boot quit first: line 412 exits when `_film == "" and _overlay_spec.is_empty()`, and @@ -8941,3 +8942,39 @@ in value is unmeasured. And three screens are three screens. 📌 They are right not to change `rest()` on this. I pin their crate, nothing I ship reads `rest`, and a proposal whose evidence comes entirely from the consumer has no business landing in the dependency on that basis alone. + +## The boot's own end frame, scored against the game for the first time + +`--boot --capture=` used to write **no file**: `_finish_boot()` was reachable only +from the overlay-quit branch, and the boot quit first because that branch fires +when `_overlay_spec.is_empty()` — which it is the instant the overlay is raised. +✅ Fixed by the `_overlay_quit_at < 0.0` guard added earlier this session. The +defect entry above is left standing with a pointer here, because the reasoning is +what makes the guard legible. + +⚠️ I fixed it and never went back to check what it made possible. **The whole +P3/P7 artifact — the boot running unattended and photographing its own end +state — has been available for hours and unused.** + +### What it shows + +| | RMSE | differing | +|---|---|---| +| **boot's own end frame**, real sequence, unattended | **12.80** | **0.00 %** | +| `title_plate`, synthetically posed at `--time=3.95` | 12.83 | 0.00 % | + +✅ **Zero pixels over the threshold against the game.** The residual RMSE is the +known capture gamma floor, which every row on this corpus carries and which is not +a target. + +📌 **And the two agree to 0.03 RMSE.** That is the more useful half. `verify-capture` +reaches this frame by a *shortcut* — `--screen=title --overlay=press_start +--time=3.95` — rather than by booting. The shortcut has been trusted since it was +written and never tested against the thing it stands in for. It is faithful: +posing the composite directly and arriving there through publisher logo → +developer logos → `ADV.wmv` → title → plate land on the same frame. + +⚠️ What this does **not** show is that the intervening sequence is right. It is one +frame, the last one; the boot could take a wrong path and still end correctly. +`--shots` walks the sequence, and comparing those against captures needs captures +of the intermediate states, which the corpus does not have for the video handover.