diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index 9319e824..7ba8f45e 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -9,7 +9,7 @@ dies, which is what this file is for. -181 sections. Search this before re-deriving anything. +182 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) @@ -192,6 +192,7 @@ dies, which is what this file is for. * [Their masking rule, implemented — and it does not transfer to my screens](#their-masking-rule-implemented--and-it-does-not-transfer-to-my-screens) * [Their "the game may not draw these leaves" hypothesis — my curves say *sometimes*](#their-the-game-may-not-draw-these-leaves-hypothesis--my-curves-say-sometimes) * [Using the clean splash rows to measure the tone curve — and repeating a documented mistake](#using-the-clean-splash-rows-to-measure-the-tone-curve--and-repeating-a-documented-mistake) +* [Localising the 1.92 splash floor: it is glyph edges, and off them the port is ~1 RMSE from the game](#localising-the-192-splash-floor-it-is-glyph-edges-and-off-them-the-port-is-1-rmse-from-the-game) ## P0 — the exporter, 2026-08-28 @@ -10333,3 +10334,51 @@ residual bottoms at **1.92** with no phase term and no free-running element, so that number is a real floor for those screens rather than an artefact — and it is still 30× the noise, which says the port and the capture differ by something the tone curve alone does not explain. + +## Localising the 1.92 splash floor: it is glyph edges, and off them the port is ~1 RMSE from the game + +The splash rows carry no free-running element, so their residual is the one I can +chase without a phase term. It is **not tonal** — max **255** with only +**0.012–0.017 %** of pixels over 8/255. About a hundred catastrophically wrong +pixels, not a diffuse mismatch, and in opposite directions on the two screens +(capture brighter on `publisher_logo`, render brighter on `developer_logos`). + +That is the signature of edge antialiasing, so I tested it against an edge mask +from the **capture** — with the mask's coverage checked first, because my earlier +edge attempt on `title` failed exactly by classifying 92 % of the frame as edge: + +| | edge mask covers | residual **on** edges | residual **off** edges | +|---|---|---|---| +| `publisher_logo` | **0.67 %** | 18.30 | **1.42** | +| `developer_logos` | **1.44 %** | 12.66 | **0.82** | + +✅ Non-degenerate masks, and a **13–15× concentration** on edges. The 1.92 +whole-frame floor is glyph-edge antialiasing. + +📌 **Off the edges, the port matches the game at 0.82–1.42 RMSE.** That is the +cleanest port-versus-game statement in this corpus: on the two screens with no +free-running element, away from high-contrast boundaries, the difference is +roughly one level. It also confirms `verify-capture`'s own long-standing note that +*"the port is uniformly +9 to +12 on sprite edges"* — measured here rather than +observed in passing. + +⚠️ Not everything is explained. 0.82–1.42 is still 15–25× the 0.06 rasterisation +floor. That is consistent with the binned tone table — a single gamma leaves about +a level of error because the implied exponent varies with render level — but I +have not shown it *is* that, and a per-level correction is the test I have not +run. + +### Contamination check after their withdrawal + +They withdrew the Ⓐ result (three emulators live at once, one shared pad file, one +shared display) and flagged their earlier menu probes as suspect for the same +reason. ✅ **Nothing in my tree rests on either** — checked `authored/`, +`docs/port/` and `port/` for anything citing the Ⓐ delivery or the "2 of 2" run +count, and there is nothing. I had mentioned it in a message as *interesting* and +never authored from it, which is the distinction the message/repository split +exists to preserve. + +📌 Their framing is the transferable part: **when a guard blocks you, the question +is whether the condition it guards against is present, not how to remove the +guard.** `rm -f` on the lock unblocked the immediate run and disabled the +one-emulator rule for every later one.