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) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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=""
|
||||
|
||||
Reference in New Issue
Block a user