From 6f161ab981567a78ee2a8f736f32c0b94b20df81 Mon Sep 17 00:00:00 2001 From: Sylpheed port agent Date: Sun, 30 Aug 2026 10:57:21 +0000 Subject: [PATCH] port: confirm no screen of mine carries a .tbm, and guard verify-screen anyway The Decoder found that sylpheed-cli screen render silently omits the background of any .tbm-bearing build, and stated that none of my screens has one. That is a claim about my tree and it decides whether my regression baseline is sound, so I tested it: zero .tbm across all 16 builds in my manifest -- wider than the five they said. Both controls fired (GP_TUTORIAL build 0 -> pubase.tbm; GP_TITLE build 5 -> none); my first attempt's control printed nothing and I nearly read that as agreement. verify-screen now names the omission on any .tbm-bearing row. It cannot fire on a screen I ship -- which is how a guard goes dead -- so its expression is controlled directly in both directions. No verdict or bar changes. Regression unchanged: title max 6 / over3 790, main_menu max 4 / over3 0. Their identification (reading TUTORIAL off the framebuffer) and my edge correlation (run before their message, blind to the text) agree on GP_TUTORIAL build 0 from no shared assumption. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF --- docs/port/DECISIONS.md | 56 ++++++++++++++++++++++++++++++++++++++++ tools/port/verify-screen | 27 +++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index 2668750a..3f4a7724 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -8263,3 +8263,59 @@ would call build 0 the better fit and not a determination. *what* the background is, which is the point, but it is also insensitive to a missing element that has no edges. It answers "which screen", not "is our render complete". + +### Refutation attempt: "`screen render` omits every `.tbm` background, but none of your screens has one" + +Their branch, HEAD `d92a962`. The first half is theirs to prove and they proved +it against a capture. **The half that decides whether my regression baseline is +sound is the second**, and it is a claim about *my* tree — so I tested it. + +`screen info --all`, grepped for `.tbm`, across all **16** builds in my manifest: +zero references. ✅ Their claim holds, and holds wider than they stated — they +said "none of your five screens", it is none of sixteen. + +**Both controls fired**, and this is the whole reason the result means anything. +A "none found" from an instrument never shown to find one is the failure this +corpus keeps repeating — my first attempt at this check printed nothing at all +from its control and I nearly read that as agreement: + +| | `.tbm` mentions | +|---|---| +| positive — `GP_TUTORIAL` build 0 | **1** (`pubase.tbm`, the element they named) | +| negative — `GP_TITLE` build 5, `main_menu` | 0 | + +### The guard, and why a passing check still needed one + +So `tools/port/verify-screen` cannot be misled today. ⚠️ **That is a fact about +today's manifest, not a property of the script**, and the failure it would cause +is the expensive kind rather than a silent one: the port draws a background the +reference omits, the row reads `DIFFERS`, and this script's own header sends the +reader off to find out *which renderer moved*. Neither did. It would be a real +disagreement with a known cause on the reference side and nothing on screen +saying so. + +The row now says so. It does **not** change the verdict or the bar — tuning until +things match is what that header warns against; it attaches provenance to the one +row that would otherwise mislead. + +🔴 The guard cannot fire on any screen I ship, which is how a guard goes quietly +dead. Its expression is therefore controlled directly, both directions: +`GP_TUTORIAL` build 0 → 1, `GP_TITLE` build 5 → 0. + +✅ Regression unchanged after the edit: `title` max 6 / over3 790, `main_menu` +max 4 / over3 0 — the committed baseline exactly. + +### Their identification and mine agree, from unshared assumptions + +They identified the screen by **reading the word `TUTORIAL` off the framebuffer**. +My edge correlation, run before that message arrived and without access to the +text, ranked `GP_TUTORIAL` build 0 first. Two methods with no assumption in +common, one answer. + +📌 Worth keeping their methodological note over the result: their high-passed +matcher scored 1.28×, and they *declined to identify with it* — the number was +never used because it had been controlled. My 1.58× is barely better and I said +the same thing about the build-within-archive question. **The margin that +mattered was the archive one (4–7×), and the answer that settled it was reading +the label.** Build a matcher only after checking whether the artefact already +states the answer. diff --git a/tools/port/verify-screen b/tools/port/verify-screen index e06f3add..3bca02d6 100755 --- a/tools/port/verify-screen +++ b/tools/port/verify-screen @@ -114,6 +114,30 @@ print(json.load(open("export/"+f))["source"]["build"])' "$name") "$CLI" screen render "$DISC/dat/GP_TITLE.pak" "$OUT/$name.ref.png" \ --build "$build" --all --black --primitives --animated >/dev/null + # 🔴 THE REFERENCE RENDERER SILENTLY OMITS A `.tbm` BACKGROUND. + # + # The Decoder reached and captured the TUTORIAL screen and found that + # `screen render` draws every OTHER element of a `.tbm`-bearing build and + # leaves the background out, with no diagnostic: their render of GP_TUTORIAL + # build 0 is the correct layout on pure black, 6.0-6.4 % inked against the + # game's 99.7 %. `docs/re/structures/tbm-submenu-not-reached.md`, their branch. + # + # I confirmed the shape of it here with both controls: `screen info` reports + # `pubase.tbm` on GP_TUTORIAL build 0 and no `.tbm` on any of the 16 builds in + # my manifest. So this trap CANNOT fire today. + # + # ⚠️ That is a fact about today's manifest, not a property of this script, and + # the failure it would cause is the expensive kind: the port draws a + # background the reference does not, the row reads DIFFERS, and the header + # above tells the reader to go find out which renderer moved. Neither did. + # The row would be a real disagreement caused by a KNOWN omission on the + # reference side, and nothing on screen would say so. + # + # So the row says so. This does not change the verdict or the bar -- it + # attaches the provenance to the one row that would otherwise mislead. + tbm=$("$CLI" screen info "$DISC/dat/GP_TITLE.pak" --build "$build" --all 2>/dev/null \ + | grep -ioc '\.tbm' || true) + godot --path port --resolution 1280x720 -- \ "--screen=$name" --pose=rest "--capture=$OUT/$name.godot.png" >"$OUT/$name.log" 2>&1 @@ -176,6 +200,9 @@ print(json.load(open("export/"+f))["source"]["build"])' "$name") verdict="ROUNDING -- max $max but NO pixel over the bar" fi fi + if [ "${tbm:-0}" -gt 0 ]; then + verdict="$verdict [build carries a .tbm: the REFERENCE omits that background, so a DIFFERS here is likely theirs]" + fi printf '%-17s build %-3s max %-5s mean %-8s over3 %-7s %s\n' \ "$name" "$build" "$max" "${mean:0:6}" "$over" "$verdict" done