port: the title's sweeps loop, the black hold is 9 units, and one claim refuted

THREE THINGS FROM THE DECODER, one of which I am not taking.

REFUTED: "the developer splash is one composited quad, the bounding box of the
three logos". The observed quad is 525x259 at (378,155). The three logos'
bounding box is 500x421 at (390,164) -- a 259-tall quad CANNOT contain them, and
palogo_anima alone starts at y=449, thirty-five pixels below that quad's bottom
edge. The observed quad matches the union of gamearts_eff and seta_eff, 521x261
at (379,154), to about four pixels in every dimension -- and both of those are
TRANSIENTS my own census flagged, dark by t=45, so a frame containing that quad
is a build-in frame rather than the settled screen. I cannot see their draw
stream, so I sent the arithmetic rather than a verdict, and the port keeps
drawing three: I will not stop drawing an element on a claim whose stated
identification excludes that element from its own bounding box.

THE BLACK HOLD IS 9 UNITS, NOT 12. I authored 12 from Q7's luminance plateau of
0.17-0.23 s, supported by the menus' transition quad. The Decoder counted
SUBMITTED QUADS instead -- luminance cannot separate the outgoing fade's tail
from true black. Four frames with no sprite quad at all, at 2.284 units/frame
derived from the disc as its own clock, gives 9.1 units = 0.152 s (6.9-11.4).
That overlaps the luminance figure only at the top, and the true black is SHORTER
still since both boundary frames carry picture. My 12 was supported by analogy --
a different screen's quad on a different path -- and a number that fits by
analogy loses to one measured in place. verify-dwell's bound moved with it; both
screens still agree.

THE TITLE'S SWEEPS LOOP. The oracle shows the quad oscillating over its whole x
range and resetting hard, one reset in the first title dwell and two in the
second. The loop-length field could NOT have settled it, correcting a hope I had
stated: both records declare exactly their last keyframe time, slack zero, and
"loops at 600" and "runs once for 600 and stops" write the identical header.
Verified on the two sweeps' LCM, since their periods differ: 600 and 720 realign
at 3600 units, mean diff 0, against 0.438 at half that.

Scoped to the title. The menus declare the same lengths but the oracle
measurement is of the title, and my own weak evidence points the other way there
-- best match with the sweeps off-screen, three times worse mid-screen, against a
73% on-screen duty cycle if they looped. Two weak signals in opposite directions
is a reason to scope, not to pick.

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:44:56 +00:00
parent 8fb5ac8743
commit 39209eab05
6 changed files with 176 additions and 3 deletions

View File

@@ -205,6 +205,7 @@ func _ready() -> void:
# Which decoded rules apply where. See `authored/rendering.json`.
var rendering: Variant = export_tree.authored("rendering.json")
_draw_leaf_for = [] if rendering == null else rendering.get("draw_leaf_for", [])
_loop_leaf_screens = [] if rendering == null else rendering.get("loop_leaf_on_screens", [])
# `--no-hold` plays a screen's groups PAST their rest instead of clamping each
# element at its own `rest.t`. A diagnostic, not a mode: `rest.t` is the last
# HOLD keyframe before the exit, not the settled state, and the only way to
@@ -221,6 +222,7 @@ func _ready() -> void:
view.looping_focus = _looping_for(name)
view.draw_leaf_for = _draw_leaf_for
view.loop_leaf = _loop_leaf_screens.has(name)
view.focused_id = _force_focus
if not view.load_screen(export_tree, name):
push_error(export_tree.error)
@@ -287,6 +289,8 @@ var _pending: Variant = null
var _looping: Dictionary = {}
## `authored/rendering.json` `draw_leaf_for`.
var _draw_leaf_for: Array = []
## `authored/rendering.json` `loop_leaf_on_screens`.
var _loop_leaf_screens: Array = []
var _script: PackedStringArray = PackedStringArray()
var _shots := ""
## `--skip-at=SECONDS`: when to send a synthetic (A) during a movie, or 0.
@@ -404,6 +408,7 @@ func _advance() -> void:
view.time_units = 0.0
view.looping_focus = _looping_for(name)
view.draw_leaf_for = _draw_leaf_for
view.loop_leaf = _loop_leaf_screens.has(name)
if not view.load_screen(view.tree, name):
push_error(view.tree.error)
get_tree().quit(2)
@@ -607,6 +612,7 @@ func _menu_arrive() -> void:
view.time_units = 0.0
view.looping_focus = _looping_for(name)
view.draw_leaf_for = _draw_leaf_for
view.loop_leaf = _loop_leaf_screens.has(name)
if not view.load_screen(view.tree, name):
push_error(view.tree.error)
get_tree().quit(2)
@@ -922,6 +928,7 @@ func _raise_overlay(name: String) -> void:
overlay.exit_ramp_units = view.exit_ramp_units
overlay.looping_focus = _looping_for(name)
overlay.draw_leaf_for = _draw_leaf_for
overlay.loop_leaf = _loop_leaf_screens.has(name)
overlay.holding = true
overlay.time_units = 0.0
if not overlay.load_screen(view.tree, name):