port: the publisher residual was a missing black hold -- we had both dismissed it

I carried this as "0.03 s outside a composite bound, probably a property of the
bound rather than the game", and the Decoder agreed. Both wrong, and the way it
was settled is the point: I stopped reasoning about the bound and filmed the
transition.

At 0.05 s the port fell straight out of the publisher's fade into the developer
logos -- mean 5.06 -> 0.32 at t=4.20, then 5.65 at t=4.25. NO BLACK FRAME AT ALL,
where the oracle measures a 0.17-0.23 s pure-black plateau (HANDOFF Q7). The
bound was fine; the port was missing a fifth of a second of black, and had been
since P3.

Authored at 12 units because the boot path has nothing to read it from:
publisher_logo and developer_logos each carry a single palogo_eff0, a 1280x720
primitive with ONE keyframe at t=0 -- static, not a transition ramp. The menus'
quad declares black for 12 units and 12/60 = 0.200 s sits mid-range, so the
number is the disc's where a screen has one.

Filmed after: t=4.25, 4.30, 4.35, 4.40 all at mean 0, then the developer logos at
4.45. publisher interval 4.26 DIFFERS -> 4.47 agrees; developer 3.62 -> 3.73,
still agrees. Settled-frame comparisons untouched, as they should be.

THE LESSON IS THE SHAPE OF THE DISMISSAL, NOT THE NUMBER. "A 0.03 s miss against
a bound composed from two measured ranges plus jitter slack is more likely a
property of the bound" is plausible, was accepted by both of us, and was wrong.
The composite bound is why the miss looked small -- the underlying gap was 0.2 s
-- and a plausible explanation for a small number is how a real defect stays
hidden. The film cost one command.

Also recorded: the Decoder has reproduced across two build-ins that the console
NEVER draws ptlogo_back2eff3 (0 draws against ~5 expected), with sampling phase,
invisible draws and position error all ruled out -- but WHY is not established,
and nothing in eff3's record differs from its neighbours. The port keeps drawing
it, deliberately: dropping an element the disc declares on a measurement with no
mechanism is authoring a behaviour neither agent can derive, and nothing this
port gates on would notice, since the flashes live only in the build-in and
verify-capture compares the settled frame.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
This commit is contained in:
Sylpheed port agent
2026-08-29 20:27:41 +00:00
parent a9812186e3
commit 6c78b3cda9
3 changed files with 103 additions and 1 deletions

View File

@@ -197,6 +197,7 @@ func _ready() -> void:
# authored, and both of ScreenView's uses are dead branches kept only so an
# older export still loads.
view.exit_ramp_units = float(timing.get("exit_ramp_units", 24.0))
_black_hold = float(timing.get("black_hold_units", 0.0))
# Which focus records draw unconditionally and loop. Kept out of ScreenView's
# own logic on purpose -- see `looping_focus` there for the census that says
# this cannot be a rule.
@@ -290,6 +291,8 @@ var _script: PackedStringArray = PackedStringArray()
var _shots := ""
## `--skip-at=SECONDS`: when to send a synthetic (A) during a movie, or 0.
var _skip_at := 0.0
## Units of pure black between one screen leaving and the next arriving.
var _black_hold := 0.0
## `--focus=<id>`: draw this element's focus record in a `--screen` run.
var _force_focus := ""
var _skip_sent := false
@@ -374,7 +377,17 @@ func _process(delta: float) -> void:
_menu_enter(String(_sequence[_step].get("screen", "")), true)
elif _film == "" and _overlay_spec.is_empty():
get_tree().quit(0)
elif not view.holding and view.time_units >= view.exit_time():
elif not view.holding and view.time_units >= view.exit_time() + _black_hold:
# 🔴 THE BLACK HOLD, which this port had never implemented. A transition
# is a fade THROUGH black (HANDOFF Q7), and the pure-black plateau
# between one screen leaving and the next arriving was measured at
# 0.17-0.23 s. Filmed at 0.05 s the port fell straight from the
# publisher's fade-out into the developer logos with NO BLACK FRAME.
#
# The menus' transition quad declares black for 12 units and 12/60 =
# 0.200 s sits in the middle of the measured range -- but the boot
# splashes carry no such quad (`palogo_eff0` is one static keyframe), so
# on this path it is authored. See `authored/timing.json`.
_advance()