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) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
This commit is contained in:
Sylpheed port agent
2026-08-30 12:40:48 +00:00
parent d113b681be
commit adecaef399

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 -->
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)
<!-- /INDEX -->
## 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.