diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index 0a91c90b..3817ec29 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -9,7 +9,7 @@ dies, which is what this file is for. -167 sections. Search this before re-deriving anything. +168 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) @@ -178,6 +178,7 @@ dies, which is what this file is for. * [`black_hold_units` 9 → 0, and why not the value that fits best](#black_hold_units-9--0-and-why-not-the-value-that-fits-best) * ["Already up to date" is not evidence that I am current](#already-up-to-date-is-not-evidence-that-i-am-current) * [Re-deriving `black_hold_units` against four measurements, not three](#re-deriving-black_hold_units-against-four-measurements-not-three) +* [🔴 CORRECTION: my "the eras render identically" measurement was void](#correction-my-the-eras-render-identically-measurement-was-void) ## P0 — the exporter, 2026-08-28 @@ -9587,3 +9588,55 @@ measure 10u/5f, 8u/4f, 10u/5f. ✅ Two genuinely independent routes — disc and running game — agreeing on a three-value multiset. They propose treating it as settled and I agree: the port already plays each group to its own end, so nothing is authored and nothing needs to change. + +## 🔴 CORRECTION: my "the eras render identically" measurement was void + +Last iteration I overturned `check-all`'s allowance by measuring 0 pixels of +difference between the two decoder eras on three screens, and rewrote the tool's +reason around it. **The measurement was worthless: the two binaries had the same +md5.** + +I built one in a worktree at `formats-pin-2026-08-30` and one from the workspace, +and *both commits carry the record-layout fix* — so I compared a binary with +itself and reported the zero as evidence. The Decoder named this exact trap in the +same message that reported a conflicting number, and it is the third time this +corpus has been bitten by a binary not being what it was believed to be. + +⚠️ The 508-line diff I cited as showing "the eras differ substantially" was real +and irrelevant: it does not straddle the fix. **Line count is not era.** + +### Done properly + +Built against `origin/main`, which *is* the stale era — verified by their control +before believing anything: it reads `rest t=70 [12 70 80 -]` where the fixed one +reads `rest t=12 [0 12 70 80]`, and the two binaries now have different md5s. + +| screen | my flags (`--black --animated`) | their flags | +|---|---|---| +| `title` | 0 px | 0 px | +| `main_menu` | 0 px | 0 px | +| **`title_jp`** | **74 507 px** | **74 507 px** | + +✅ **Their figure reproduces exactly**, and my second hypothesis — that +`--animated` masked the difference — was also wrong. The eras *do* change pixels, +and `title_jp` is one of the bundles where they do. + +### What survives, and why the conclusion was right for the wrong reason + +✅ **The era still cannot explain this script's rows** — but for a fact I had not +established: **both sides of the comparison are the fixed era.** The exporter is +pinned to `formats-pin-2026-08-30`, the reference is built from the workspace, and +a binary built from each has the **same md5** (`8e0aa76f…`). There is no era +mismatch in the harness to explain anything. + +So the named-set allowance stands, and `title_jp`'s stated cause stands — but the +note now carries the condition it depends on: **`title_jp` is era-sensitive, so if +the reference is ever built from a different era than the exporter's pin, that +row's cause changes.** Check the md5s before trusting it. + +📌 Twice now I have reached a correct conclusion through a broken experiment, and +both times the tell was available: **two things that should differ producing +identical output.** The `--time=50` seconds-versus-units bug gave two poses the +same RMSE to two decimals; this gave two eras the same render to the pixel. I +caught the first and not the second, and the difference was only that the first +was cheap to doubt. diff --git a/tools/port/check-all b/tools/port/check-all index d020556a..7148aec9 100755 --- a/tools/port/check-all +++ b/tools/port/check-all @@ -64,18 +64,31 @@ differs=$(grep -c DIFFERS "$OUT/verify-screen.log" || true) unexpected=$(grep DIFFERS "$OUT/verify-screen.log" | awk '{print $1}' \ | grep -vx -e title -e title_jp || true) -# 🔴 THE OLD ALLOWANCE WAS FALSE, AND IT EXCUSED TWO ROWS WITH A REASON THAT IS -# NOT THE REASON. +# 🔴 THE OLD ALLOWANCE WAS FALSE, AND MY FIRST REPLACEMENT REASON WAS ALSO +# WRONG. Both are recorded because the second error is the more instructive. # -# It said: "the pin is not on main, so this compares two decoder eras". Measured -# 2026-08-30 by building `sylpheed-cli` at `formats-pin-2026-08-30` and at the -# workspace HEAD and rendering both: `title`, `title_jp` and `main_menu` come out -# **0 pixels different**, despite 508 lines of difference in `ui_layout.rs`. The -# eras are not the cause of anything here. +# It said: "the pin is not on main, so this compares two decoder eras". I +# replaced that with "the eras render identically -- 0 pixels different on three +# screens". 🔴 **That measurement was void**: the two binaries I compared had the +# same md5. I built one in a worktree at the pinned tag and one from the +# workspace, and both commits carry the record-layout fix, so I compared a +# binary with itself and reported the zero as evidence. # -# 🔴 And its expiry tested `formats-pin-2026-08-29d` while `Cargo.toml` pins -# `formats-pin-2026-08-30` -- so the allowance would have expired on a tag this -# tree does not use, in either direction, silently. +# Rebuilt properly against `origin/main`, which is the genuinely stale era +# (`rest t=70 [12 70 80 -]` against the fixed `rest t=12 [0 12 70 80]`): +# +# title 0 px main_menu 0 px title_jp 74 507 px +# +# ✅ The eras DO change pixels, and `title_jp` is one of the seven bundles where +# they do -- reproducing the Decoder's figure exactly, under their flags and +# mine. My "--animated masks it" hypothesis was wrong too. +# +# ✅ BUT THE ERA STILL CANNOT EXPLAIN THIS SCRIPT'S ROWS, for a reason I had not +# established: BOTH SIDES OF THIS COMPARISON ARE THE FIXED ERA. The exporter is +# pinned to `formats-pin-2026-08-30` and this reference is built from the +# workspace, and a binary built from each has the SAME md5. There is no era +# mismatch here to explain anything. Right answer, wrong evidence, and the wrong +# evidence was a broken experiment. # # The real reasons are per-screen and already documented: # title -- the ptloop SWEEP PHASE residual, max 6 / over3 790, unchanged @@ -83,8 +96,10 @@ unexpected=$(grep DIFFERS "$OUT/verify-screen.log" | awk '{print $1}' \ # title_jp -- the `--pose=rest` sparkle handling. Adjudicated against the # oracle: the port's SHIPPED pose scores r +0.9994 against the # game where the reference scores +0.8727, and `--pose=rest` is -# what this script compares. The port is closer to the game on the -# row this script calls a disagreement. +# what this script compares. +# ⚠️ title_jp is ALSO an era-sensitive bundle, so if this reference is ever +# built from a different era than the exporter's pin, that row's cause changes +# and this note stops applying. Check the md5s before trusting it again. # # So the allowance is now a NAMED SET, not a count with an excuse. A DIFFERS on # any other screen fails the run, which a count never could.