port: the plate's lateness is the unit, not our clock -- and the splash blur is an asset we already draw
H3, the PRESS (A) plate. Established which half it is, as the brief asked, and
the answer moved once during the iteration -- both readings are recorded because
the first one was confident and wrong.
Eliminated, ours:
rest.t not in the causal path. The plate's ARRIVAL is a declared keyframe
(transparent to t=214, opaque at t=236); rest.t=236 only picks
where `holding` parks it, and 236 is that ramp's own peak.
clock origin the two builds share one clock exactly -- 85 of 85 filmed title
frames have view_units == overlay_units to 3 dp.
NOT eliminated, the Decoder's: the unit->seconds constant. I first ruled it out
"by sign" using the emulator's 28.1 fps presentation rate. That conflates a
wall-clock conversion with units-per-game-frame; the correction is written down
rather than edited away. The Decoder's splash draw capture (3cc1b51) then gave
an independent handle on it, from a screen with nothing to do with the plate:
three intervals of the publisher splash all read 5 units per guest frame against
the declared 2. At 30 fps the plate would land at 1.57 s rather than 3.93 s --
this port ~2.4 s late, the right magnitude for what the human saw. It collides
with title-plate-delay-measured.md (~55 units/s) by a factor of 2.7. Both are
oracle measurements; asked in BLOCKED.md H3, not picked between.
Finding 4, the splash blur. The Decoder found no post-process pass; the human
says the logos go blurred -> sharp in about a second. Those resolve each other:
every logo ships a pre-blurred copy ~21x20 px larger and concentric, drawn alone
first and crossfaded out as the sharp logo fades in.
🔴 So "the port applies no blur at all" -- in BLOCKED.md H2 and in the
play-test -- is FALSE, and it came from our side. The port draws all seven
quads of the developer splash, companions included, and always has. Shown by a
frozen sweep 3 units a step: companions alone at u=3..15, all seven at
u=18..42, sharp only from u=45.
The instrument had to be fixed before any of this counted. `--film` scheduled
frame n for n*interval and reported nothing; one 1280x720 save_png costs ~0.24 s
under llvmpipe, so a request for 0.05 s delivered 247 frames in 60 s where 1200
were asked for -- an achieved 4.1 fps against a requested 20 -- and the deficit
accumulated silently into the frame index. It now writes <film>_frames.tsv with
the second each frame was ACTUALLY taken at, and prints achieved against
requested. The schedule is deliberately not rebased onto _elapsed: catching up
would hide the shortfall.
check-all now reimports the Godot project first. `port/.godot/` is gitignored, so
merging a commit that adds a `class_name` leaves a stale class cache and the
whole project fails to parse -- which is exactly what merging the human's
gamepad.gd did in this container.
Refutation attempts, four:
survived the title's settle window [160, 236] -- our exporter still computes
[160, 236, 198] under the corrected record layout
survived the Decoder's Q0/Q7 quad mapping -- this export's declared rects
reproduce the guest's vertex stream to ~2 px and ~4 px
refuted "ptlogo1 rests at t=251 and stops moving at t=42" -- rest.t is now
42. The record-layout fix repaired the very element that was the
headline evidence for rest.t != settle. The conclusion survives on
other elements; the example does not
refuted ours: "ptbtn00 reaches a=255 at t=238" (it is 236, so 118 units not
120) and "pteff00 is 7 % opaque at 243" (it is 0 %; that quad clears
by t=16 and 261..269 is the fade-OUT, not a fade-in)
Not settled: which of the two oracle rates is right; whether the t=118 or the
t=160 anchor is what the glyph counter saw; whether the game holds the blurred
companion longer than we do.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018AHUQvXGyNcKonSEWsgWcX
This commit is contained in:
@@ -36,6 +36,35 @@ step() { # name, expectation, command...
|
||||
esac
|
||||
}
|
||||
|
||||
# 🔴 GODOT'S SCRIPT CLASS LIST IS A BUILD CACHE, AND IT IS GITIGNORED.
|
||||
#
|
||||
# `port/.godot/global_script_class_cache.cfg` is what resolves a `class_name`,
|
||||
# and `.gitignore` excludes `port/.godot/` -- correctly, it is derived. So a
|
||||
# checkout that MERGES a commit adding a new `class_name` keeps a cache that
|
||||
# does not list it, and every script referencing the new class fails to parse:
|
||||
#
|
||||
# SCRIPT ERROR: Parse Error: Identifier "Gamepad" not declared in the current scope.
|
||||
# ERROR: Failed to load script "res://scripts/boot.gd" with error "Parse error".
|
||||
#
|
||||
# The whole project then refuses to load, from `--screen` to `--boot`, and the
|
||||
# error names the symbol rather than the cache -- so it reads as a missing file
|
||||
# or a bad merge. This is exactly what merging the human's input fix did on
|
||||
# 2026-09-01: `gamepad.gd` arrived with `class_name Gamepad`, the cache in this
|
||||
# container was warm and predated it, and the port did not run at all.
|
||||
#
|
||||
# A fresh clone has no `.godot/` and Godot builds one on first run, so nobody
|
||||
# hits this until they merge into a working tree -- which is every iteration of
|
||||
# this loop. Reimporting is cheap and idempotent, so it runs unconditionally
|
||||
# rather than behind a staleness test that would itself need to be right.
|
||||
echo "godot: reimporting so class_name resolves against a fresh cache"
|
||||
DISPLAY="$DISPLAY" godot --headless --path port --import >"$OUT/godot-import.log" 2>&1 \
|
||||
|| { echo " 🔴 godot --import FAILED -- see $OUT/godot-import.log"; fail=1; }
|
||||
for c in $(grep -ho '^class_name [A-Za-z_][A-Za-z0-9_]*' port/scripts/*.gd | awk '{print $2}'); do
|
||||
grep -q "\"$c\"" port/.godot/global_script_class_cache.cfg 2>/dev/null \
|
||||
|| { printf ' %-24s 🔴 class_name %s is not in the class cache\n' class-cache "$c"; fail=1; }
|
||||
done
|
||||
echo
|
||||
|
||||
echo "asserting checks:"
|
||||
step format-validator must-pass "$BIN" check
|
||||
# The contract lives on a branch this checkout does not merge: HANDOFF on `main`
|
||||
|
||||
Reference in New Issue
Block a user