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.