From adecaef399f84cfc75ef64ba3d28e98e7530127a Mon Sep 17 00:00:00 2001 From: Sylpheed port agent Date: Sun, 30 Aug 2026 12:40:48 +0000 Subject: [PATCH] port: the settle-instant candidate is not uniformly better -- the menus arrive late Their symmetry-breaking property is testable on the two screens my earlier table marked confounded, and it turns up a class where their candidate loses. ptmsg is [0:a0 44:a0 56:a255 58:a255 64:a0] and main_menu's settle window is [44,56] with instant 50 -- so the footer is at alpha 127.5, half-drawn, at the instant their candidate poses everything. Same on extras. The settle instant is the midpoint of the longest keyframe-free interval, and on both menus that interval ends exactly as the footer starts to arrive. Measured with focus absent from both sides so the earlier confound cancels: t=50 gives 0.30% differing, t=58 (the footer's own hold) gives 0.25%. Small and real. It does not overturn the proposal, which wins 9x-75x where rest() returns a transient's peak. It identifies a failure mode of its own: an element arriving after the settle window closes is caught mid-fade. Both poses are approximations to a settled screen; neither is the settled screen. Also: my first run asked --time=50 meaning units and got 50 SECONDS, past the end of everything. Both poses returned RMSE 56.02 / 9.15%, identical to two decimals, which is what made me look -- two different inputs giving the same output is the instrument saying it ignored the input. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF --- docs/port/DECISIONS.md | 51 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index 21eca1dd..6ef54504 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -9,7 +9,7 @@ dies, which is what this file is for. -154 sections. Search this before re-deriving anything. +155 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) @@ -165,6 +165,7 @@ dies, which is what this file is for. * [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) +* [Refutation attempt: the settle-instant candidate is **not** uniformly better](#refutation-attempt-the-settle-instant-candidate-is-not-uniformly-better) ## P0 — the exporter, 2026-08-28 @@ -8978,3 +8979,51 @@ developer logos → `ADV.wmv` → title → plate land on the same frame. 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. + +## Refutation attempt: the settle-instant candidate is **not** uniformly better + +Their symmetry-breaking property attributes every `rest()` disagreement to the +chosen plateau not covering the settle instant. That is testable from my side on +the two screens my earlier table had to mark **confounded** — and it turns up a +screen class where their candidate is *worse*. + +🔴 **At `main_menu`'s settle instant the footer is half-drawn.** + +| screen | settle window | settle instant | `ptmsg` alpha there | +|---|---|---|---| +| `main_menu` | [44, 56] | **50** | **127.5** of 255 | +| `extras` | [38, 50] | **44** | **127.5** of 255 | + +`ptmsg` is `[0:a0 44:a0 56:a255 58:a255 64:a0]` — it finishes arriving at t=56, +*after* the settle window has closed at 56 and well after its midpoint at 50. The +settle instant is the midpoint of the longest keyframe-free interval, and on both +menus **that interval ends exactly as the footer starts to arrive.** + +Measured against the game, with focus absent from both renders so the confound +that voided my earlier rows cancels: + +| pose | RMSE | differing | +|---|---|---| +| t=50 — the screen's settle instant | 14.98 | **0.30 %** | +| t=58 — the footer's own hold | 14.83 | **0.25 %** | + +⚠️ **Small, and real.** This does not overturn their proposal — it wins by 9× to +75× on `title` and both splashes, and by 4.6× on their own `title` measurement. +What it shows is that "pose everything at the screen's settle instant" has a +**failure mode of its own**: an element that arrives after the settle window +closes is caught mid-fade. The port's hold-based pose does not have it, because it +parks each element at its own hold. + +📌 So the honest summary of this whole thread is narrower than either of us has +been writing: **the screen-settle pose beats per-element `rest()` decisively where +`rest()` returns a transient's peak, and loses slightly where an element arrives +late.** Both are approximations to a settled screen; neither is the settled screen. + +### And a unit bug, caught by two identical numbers + +My first run of this asked for `--time=50` meaning 50 *units* and got **50 +seconds** — 3000 units, past the end of everything. Both poses returned RMSE 56.02 +/ 9.15 %, **identical to two decimal places**, which is what made me look. Two +different inputs producing exactly the same output is not a result; it is the +instrument saying it ignored the input. Same tell as the two `--script` runs that +came out bit-identical because the capture fired before the first press.