From 17c28fd8eb2c80c07eb8ba4535b9f4680911eb29 Mon Sep 17 00:00:00 2001 From: Sylpheed port agent Date: Sun, 30 Aug 2026 02:15:00 +0000 Subject: [PATCH] port: place the last unused capture; its residual is oracle-to-oracle, not the port's live-attract-title-press-a-band.png is 1279x120 and the harness could not compare a band. Placed by sliding: y=520, a 25x drop over five pixels, and it fits at t=236-238, the plate's own window. Its 0.354% is not the port's error. The port reproduces the same band of live-title-press-a EXACTLY (0.000%), and the two captures differ from each other by 0.301% -- two thin strips, 248x5 and 206x1, the shape of a sub-pixel edge difference. The row's job is to stay near the oracle-to-oracle gap, not reach zero, and it says so. I had begun writing that the attract-returned title differs from the boot title. It is two hairlines. The connected-component breakdown stopped it. All eight live captures are now used. The three that were idle were each blocked by the harness, not the capture. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF --- docs/port/DECISIONS.md | 57 +++++++++++++++++++++++++++++++++++++++ tools/port/verify-capture | 28 +++++++++++++++++-- 2 files changed, 83 insertions(+), 2 deletions(-) diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index f7e97e7d..898038ca 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -6104,3 +6104,60 @@ having to withdraw. ⚠️ Still unused: `live-attract-title-press-a-band.png`, a 1279×**120** strip rather than a full frame. It needs a banded comparison the harness does not do, so it is named here rather than quietly left out. + +## The last unused capture, placed — and its residual is the oracle's, not the port's + +`live-attract-title-press-a-band.png` was the one live capture nothing consumed. +Following last iteration's rule — *an unused capture is a signal about the +harness* — it turned out the same way as the previous two: nothing about the +capture was unusable, the harness simply could not compare a **band**. It is +1279×**120**, not a full frame. + +### Placing it + +Sliding it down the render, structural difference against the port: + +| y | differing | +|---|---| +| 300 | 51.99 % | +| 500 | 19.61 % | +| 515 | 9.14 % | +| **520** | **0.354 %** | +| 525 | 8.87 % | +| 555 | 24.02 % | + +**y = 520**, a 25× drop over five pixels. Measured, not guessed. Sweeping the +instant at that offset puts it at **t = 236–238** — the plate's own opaque +window, the same instant the full-frame `title_plate` row fits. + +### 🔴 The 0.354 % is not the port's error + +Three comparisons separate it: + +| | differing | +|---|---| +| port's band vs `live-title-press-a`'s same band | **0.000 %** | +| `live-title-press-a`'s band vs the attract band *(oracle vs oracle)* | **0.301 %** | +| port's band vs the attract band | 0.354 % | + +The port reproduces one capture's band **exactly**. The two captures differ from +*each other* by 0.301 %, which is nearly the whole residual. + +And that oracle-to-oracle difference is two thin horizontal strips — **248×5 px** +and **206×1 px** — which is the shape of a sub-pixel edge difference or capture +noise, not of a state difference. + +⚠️ I had started writing that the *attract-returned* title differs from the boot +title, which would have been a finding about the game inferred from 0.3 % of a +band. It is two hairlines. The connected-component breakdown is what stopped it, +and I would not have run it if the number alone had looked small enough to +dismiss or large enough to report — it was in the range where you have to look. + +So `title_band` joins the harness at 0.35 %, and its job is to **stay near the +oracle-to-oracle gap**, not to reach zero. A row whose target is not zero has to +say so, or the next person tunes toward it. + +✅ **All eight live captures in the corpus are now used.** Three were sitting idle +and all three were blocked by the harness, not by the capture: an overlay posed at +t=9 that drew nothing, a `--focus=` overwritten on every menu entry, and a banded +comparison that did not exist. diff --git a/tools/port/verify-capture b/tools/port/verify-capture index 6b608cba..97afed4b 100755 --- a/tools/port/verify-capture +++ b/tools/port/verify-capture @@ -100,6 +100,21 @@ MAP=( # no-plate one at ~400 -- and both to 0.01 % or better. A geometry error in how # the sweeps are drawn would leave a floor in both. Neither has one. "title_plate:$CAPS/live-title-press-a.png:plate" + # A BANDED row -- the capture is 1279x120, not a full frame, and the harness + # could not compare one until now. That was the only reason this capture sat + # unused; nothing about it was unusable. + # + # Its y offset is MEASURED, not guessed: sliding it down the render, the + # structural difference is 0.354 % at y=520 against 8.9-9.1 % five pixels + # either side and 17-52 % further out. A 25x drop over five pixels. + # + # ⚠️ Its residual is NOT the port's error. The port reproduces the same band of + # `live-title-press-a.png` EXACTLY (0.000 %), and the two captures differ from + # each other by 0.301 % -- two thin horizontal strips, 248x5 px and 206x1 px, + # the shape of a sub-pixel edge difference rather than a state difference. So + # 0.354 % is very nearly the oracle-to-oracle gap and this row's job is to stay + # near it, not to reach zero. + "title_band:$CAPS/live-attract-title-press-a-band.png:band" "publisher_logo:$CAPS/live-splash-publisher.png:screen" "developer_logos:$CAPS/live-splash-developer.png:screen" ) @@ -115,7 +130,12 @@ for row in "${MAP[@]}"; do IFS=: read -r name cap pose forced <<<"$row" if [ ${#want[@]} -gt 0 ] && ! printf '%s\n' "${want[@]}" | grep -qx "$name"; then continue; fi [ -f "$cap" ] || { printf '%-17s %s\n' "$name" "no capture"; continue; } - if [ "$pose" = focus ]; then + if [ "$pose" = band ]; then + godot --path port --resolution 1280x720 -- "--screen=title" --overlay=press_start \ + --time=3.95 "--capture=$OUT/$name.full.png" >"$OUT/$name.log" 2>&1 || true + [ -f "$OUT/$name.full.png" ] && convert "$OUT/$name.full.png" \ + -crop 1279x120+0+520 +repage "$OUT/$name.render.png" + elif [ "$pose" = focus ]; then godot --path port --resolution 1280x720 -- "--menu=main_menu" "--focus=$forced" \ --script=wait "--shots=$OUT/$name" >"$OUT/$name.log" 2>&1 || true [ -f "$OUT/${name}_00_start.png" ] && cp "$OUT/${name}_00_start.png" "$OUT/$name.render.png" @@ -161,7 +181,11 @@ for row in "${MAP[@]}"; do fi [ -f "$OUT/$name.render.png" ] || { printf '%-17s %s\n' "$name" "render failed"; continue; } # Crop the render to the capture's frame. The capture is the crop, not a scale. - convert "$OUT/$name.render.png" -crop 1279x675+0+0 +repage "$OUT/$name.crop.png" + if [ "$pose" = band ]; then + cp "$OUT/$name.render.png" "$OUT/$name.crop.png" + else + convert "$OUT/$name.render.png" -crop 1279x675+0+0 +repage "$OUT/$name.crop.png" + fi raw=$(convert "$OUT/$name.crop.png" "$cap" -metric RMSE -compare -format "%[distortion]" info: 2>&1 | tail -1) raw=$(python3 -c "print('%.2f' % (float('$raw')*255))" 2>/dev/null || echo "?") note=""