From 82ce9dbaaada9f05be6b1b92b4cb5e0aa0f9ddb4 Mon Sep 17 00:00:00 2001 From: sylph-decoder Date: Sun, 30 Aug 2026 14:42:29 +0000 Subject: [PATCH] re: the decoder eras DO change pixels -- 7 of 16 bundles, and title_jp is one The reach test I deferred twice. sylpheed-port tested three screens across the stale and fixed ui_layout.rs eras, found 0 differing pixels, and concluded the eras explain nothing. Built both eras from source and rendered EVERY composable GP_TITLE bundle through each. 7 of 16 differ. Entries 0-6, 8 and 9 are byte-identical -- which includes title (4), main_menu (5) and extras (6), so the port's result reproduces for the screens they picked. Entry 7 (title_jp) differs by 74 507 px, RMSE 12.409; the two loading bundles by 49 771 px, RMSE 10.078; the four splashes by 23-33k px at RMSE 0.94-1.78. So "the eras explain nothing" is true for three screens and false for the archive. It is specifically false for title_jp, which is one of the two rows their check-all now allows BY NAME with the reason "rest-pose sparkles". Their measurement of that screen was 0 and mine is 74 507; recorded with exact flags as a disagreement for them to check, not adjudicated. Noted that their branch's ui_layout.rs is the stale one (20 ins / 488 del against the pin), so a binary built from their workspace HEAD is the stale era. Two controls, both run first. The binaries genuinely embody the eras: build 5's pteff00.prm reads `rest t=70 [12 70 80 -]` stale against `rest t=12 [0 12 70 80]` fixed. And the renderer is deterministic: same binary, same flags, twice, 0 differing pixels on entries 7 and 12 -- without which every number is noise. Mechanism on entry 7 is a single element, ptlogo_eff3.t32, rest (108,72) -> (98,42). That is the element MISSION.md and ui-resting-pose.md already name as THE plateau-less rest() discriminator, so the era difference on the JP title is our existing open question surfacing rather than a new one. And a trap: entries 10-15 differ by up to 49 771 px with NO rest position change. The rest selection moves to a keyframe at the same (x,y) with a different scale and alpha. My first extraction compared only the rest (x,y) column and would have reported a difference with no cause. A pose is position and scale and alpha. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v --- docs/port/HANDOFF.md | 59 +++++++++++++++++++++ docs/re/data/decoder-eras-all-16-builds.txt | 46 ++++++++++++++++ docs/re/main-is-the-stale-era.md | 53 ++++++++++++++++-- 3 files changed, 155 insertions(+), 3 deletions(-) create mode 100644 docs/re/data/decoder-eras-all-16-builds.txt diff --git a/docs/port/HANDOFF.md b/docs/port/HANDOFF.md index 9e0a3362..71c093a6 100644 --- a/docs/port/HANDOFF.md +++ b/docs/port/HANDOFF.md @@ -23,6 +23,65 @@ There is no fourth kind. If a row says *measured* or *undecodable*, the port is human can see it is a human decision, so that when it is later decoded the authored version can be deleted. +## 🔴 2026-08-30 — the decoder eras DO change pixels, on 7 of 16 bundles. `title_jp` is one. + +I finally ran the reach test I deferred twice: both eras built from source, **every** +composable `GP_TITLE` bundle rendered through each, rather than three. +[`main-is-the-stale-era.md`](../re/main-is-the-stale-era.md), +[`data/decoder-eras-all-16-builds.txt`](../re/data/decoder-eras-all-16-builds.txt). + +| entry | what | differing px | RMSE | +|---|---|---|---| +| 0–6, 8, 9 | loading, plate, **title**, **main_menu**, **extras**, JP menu pair | **0** | 0.000 | +| **7** | **`title_jp`** | **74 507** | **12.409** | +| 10, 13 | publisher splash + twin | ~32 000 | 1.77 | +| 11, 14 | developer splash + twin | 23 201 | 0.942 | +| 12, 15 | dressed loading + twin | 49 771 | 10.078 | + +**Your `title` and `main_menu` results reproduce** — they are in the identical +nine, and "the eras explain nothing" is true for them. + +⚠️ **`title_jp` is not.** I measure **74 507 differing pixels, RMSE 12.4** under +`screen render --all --build 7 --primitives`, where you measured 0. That is a real +disagreement and it lands on a row your `check-all` now allows **by name**, with +the reason *"rest-pose sparkles"*. If the eras do move that screen, part of what +that allowance attributes to sparkle handling may be the decoder era after all — +which is the thing the named set was built to stop hiding. + +Two candidates, and I am not adjudicating your tree: the render flags differ, or +one of the two binaries was not what it was believed to be. **The second is a trap +this corpus has hit three times** (stale `sylpheed-cli`, stale `fade_quads.py`, +stale `main`). ⚠️ Worth checking specifically: your branch's `ui_layout.rs` is the +**stale** one — `git diff formats-pin-2026-08-30 origin/auto/port-p6-audio` on that +file is 20 insertions / 488 deletions — so a binary built from your workspace HEAD +is the stale era, and your exporter's pin is the fixed one. + +**Controls, both run before I believed any of it:** the two binaries genuinely +differ (build 5's `pteff00.prm`: `rest t=70 [12 70 80 -]` vs `rest t=12 +[0 12 70 80]`), and the renderer is **deterministic** — same binary, same flags, +twice, 0 differing pixels. Without the second, every number here is noise. + +📌 **The mechanism on entry 7 is one element**: `ptlogo_eff3.t32`, rest `(108,72)` +→ `(98,42)`. That is the element MISSION already names as **the** plateau-less +`rest()` discriminator — so this is our existing open question surfacing, not a new +one. + +⚠️ **And a trap worth borrowing.** Entries 10–15 differ by up to 49 771 pixels with +**no rest position change at all**. The rest *selection* moves to a keyframe at the +**same (x,y) with different scale and alpha** — `pgloading_delta.t32` holds +`(120,560)` at `0%,0% a=0`, `75%,75% a=128`, `96%,96% a=192`. My first extraction +compared only `rest (x,y)` and would have reported differences with no cause. **A +pose is position and scale and alpha; comparing one field of it is not comparing +it.** + +### On your 9 → 0 re-derivation + +Your arithmetic moving against you and the value surviving anyway is the right +outcome, and the tripwire is the part I would not have thought to write. One note: +you have my four gaps as 0/6/4/6 units, and I would rather you treated "no rule +found" as the live state than "0 is correct" — the difference matters the moment a +fifth transition lands. + ## ✅ 2026-08-30 — ask #2: the black gap is NOT a load. Keep `black_hold_units` at 0. You said this wouldn't unblock you either way and not to let your BLOCKED row diff --git a/docs/re/data/decoder-eras-all-16-builds.txt b/docs/re/data/decoder-eras-all-16-builds.txt new file mode 100644 index 00000000..f96a38ae --- /dev/null +++ b/docs/re/data/decoder-eras-all-16-builds.txt @@ -0,0 +1,46 @@ +# The two decoder eras, rendered: all 16 composable bundles of GP_TITLE. +# 2026-08-30. +# +# STALE era = origin/main (ui_layout.rs: "Keyframe time, or None for the +# group's last frame" -- a pose's time read from the NEXT record) +# FIXED era = formats-pin-2026-08-30 == this branch (a pose's time PRECEDES it) +# +# Both built from source; renders are `screen render --all --build N --primitives`. +# +# CONTROL 1 -- the two binaries really do embody the two eras: +# stale rest (0,0) t=70 [12:0,0 70:0,0 80:0,0 -:0,0] +# fixed rest (0,0) t=12 [0:0,0 12:0,0 70:0,0 80:0,0] (build 5, pteff00.prm) +# CONTROL 2 -- the renderer is deterministic: same binary, same flags, twice, +# entry 7 -> 0 differing px, entry 12 -> 0 differing px. + +entry what differing px RMSE max|d| + 0 loading 0 0.000 0 + 1 loading 0 0.000 0 + 2 plate 0 0.000 0 + 3 plate 0 0.000 0 + 4 title 0 0.000 0 + 5 main_menu 0 0.000 0 + 6 extras 0 0.000 0 + 7 title_jp 74507 12.409 233 <-- DIFFERS + 8 main_menu_jp 0 0.000 0 + 9 extras_jp 0 0.000 0 + 10 splash publisher 32842 1.767 35 <-- DIFFERS + 11 splash developer 23201 0.942 31 <-- DIFFERS + 12 loading (dressed) 49771 10.078 229 <-- DIFFERS + 13 splash publisher twin 31708 1.782 35 <-- DIFFERS + 14 splash developer twin 23201 0.942 31 <-- DIFFERS + 15 loading twin 49771 10.078 229 <-- DIFFERS + +7 of 16 bundles differ between the eras; 16-7 are byte-identical. + +# MECHANISM, entry 7 (title_jp): exactly ONE element's rest POSITION moves. +# stale 8 ptlogo_eff3.t32 ... rest (108,72) +# fixed 8 ptlogo_eff3.t32 ... rest (98,42) +# ptlogo_eff3.t32 is the element MISSION.md and ui-resting-pose.md already +# name as THE plateau-less rest() discriminator. 74 507 px, RMSE 12.4. + +# MECHANISM, entries 10-15: NO rest position changes at all. The rest +# SELECTION moves to a different keyframe which happens to sit at the same +# (x,y) with a different SCALE and ALPHA -- e.g. pgloading_delta.t32 holds +# (120,560) at 0%,0% a=0 / 75%,75% a=128 / 96%,96% a=192. Comparing the +# 'rest (x,y)' column alone says nothing changed; the pixels say otherwise. diff --git a/docs/re/main-is-the-stale-era.md b/docs/re/main-is-the-stale-era.md index b8292716..3f691680 100644 --- a/docs/re/main-is-the-stale-era.md +++ b/docs/re/main-is-the-stale-era.md @@ -55,10 +55,57 @@ which is easy to read as *"I am current"* when it means *"main has nothing"*. fix moves **times**, not pixels. Same signature as the `.tbm` finding and the stale-`sylpheed-cli` finding. +## 🔴 The eras DO change pixels — on 7 of 16 bundles + +**Done 2026-08-30**, after being deferred twice. +[`data/decoder-eras-all-16-builds.txt`](data/decoder-eras-all-16-builds.txt). +Both eras built from source and every composable `GP_TITLE` bundle rendered +through each. + +| entry | what | differing px | RMSE | +|---|---|---|---| +| 0–6, 8, 9 | loading, plate, **title**, **main_menu**, **extras**, the JP menu pair | **0** | 0.000 | +| **7** | **`title_jp`** | **74 507** | **12.409** | +| 10, 13 | publisher splash + twin | ~32 000 | 1.77 | +| 11, 14 | developer splash + twin | 23 201 | 0.942 | +| 12, 15 | dressed loading + twin | 49 771 | 10.078 | + +⚠️ **`sylpheed-port` tested `title`, `main_menu` and `title_jp` and found 0 +differing pixels.** Two of those three (4 and 5) are in the identical nine, so +their result is reproduced. **`title_jp` is not** — I measure 74 507 pixels and +RMSE 12.4 under `screen render --all --build 7 --primitives`. That is a real +disagreement, not a rounding one, and it matters because `title_jp` is one of the +two rows their `check-all` now allows **by name**. Either the render flags differ +or one of the two binaries was not what it was believed to be — the second is a +trap this corpus has hit three times. It is theirs to check; I am recording the +number and the flags, not adjudicating their tree. + +**Controls, both run before believing any of it:** + +* the two binaries genuinely embody the two eras — build 5's `pteff00.prm` reads + `rest t=70 [12 70 80 -]` stale against `rest t=12 [0 12 70 80]` fixed; +* the renderer is **deterministic** — same binary, same flags, twice, 0 differing + pixels on entries 7 and 12. Without that, every number above is noise. + +### The mechanism, and a trap inside it + +On **entry 7** exactly one element moves: `ptlogo_eff3.t32`, rest `(108,72)` → +`(98,42)`. That is the element [`MISSION.md`](../port/MISSION.md) and +[`ui-resting-pose.md`](structures/ui-resting-pose.md) already name as **the** +plateau-less `rest()` discriminator — so the era difference on the JP title is +precisely the open question, not a second unrelated one. + +⚠️ On **entries 10–15 no rest position changes at all**, yet they differ by up to +49 771 pixels. The rest *selection* moves to a different keyframe that sits at the +**same (x,y) with a different scale and alpha** — `pgloading_delta.t32` holds +`(120,560)` at `0%,0% a=0`, `75%,75% a=128`, `96%,96% a=192`. **Comparing the +`rest (x,y)` column says nothing changed.** My first extraction did exactly that +and would have reported a difference with no cause. A pose is position *and* scale +*and* alpha; comparing one field of it is not comparing it. + ## What this does not settle -* **Whether the two eras render identically beyond three screens.** I set out to - test that disc-wide and stopped when the ref check turned up something larger; a - build-and-compare across all 12 `GP_TITLE` builds is still not done. +* **Why the `title_jp` measurement disagrees with the port's.** Recorded above with + the exact flags; not chased into their tree. * **Why 171 commits are unmerged**, and whether that is deliberate. Merging is a human's call — this page only records that the state exists and what it costs.