port: end the boot when BOTH builds have arrived, not when the plate lands

Moving the plate onto the shared clock moved the boot's exit with it: the run
quit at the overlay's settle (t=238) while build 4's own fade-in from black runs
to t=261. pteff00 is still ~7 % opaque there, so the capture came out visibly
darker than the previous one -- with nothing failing, no warning, and no line in
the log to say why. Caught only because there was an earlier capture beside it.

The boot now ends at max(view.settle_time(), overlay.settle_time()) and prints
the unit it is waiting for.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WM5XL4HfrHuxz8RiMWdCMC
This commit is contained in:
Sylpheed port agent
2026-08-29 12:58:28 +00:00
parent c225852fb3
commit 1f1fe647f2
2 changed files with 33 additions and 2 deletions

View File

@@ -1901,3 +1901,26 @@ declared 120 units at 60 units/s = **2.000 s of port time**, which is the
true-30 Hz value both readings agree the disc means. This is a corpus
consistency problem, not a port one — which is why it is filed rather than
worked around.
### The corrected boot ended one build too early, and the capture showed it
Moving the plate onto the shared clock also moved the boot's exit, and the first
capture taken afterwards was **visibly darker** than the one before it. The cause
is `pteff00`, the title's black fade quad: it ramps `0xff000000``0x00000000`
over t=16…261, so at t=243 — where the run was quitting, `overlay.settle_time()`
after the overlay was raised — the frame is still ~7 % black.
The plate arrives at t=238; **build 4 is not finished until t=261**. The boot now
ends at the later of the two, and says which in the log:
```
-> title at 145.79 s
overlay press_start raised at 145.79 s, 1 element(s), settles at t=238
boot ends at 150.14 s, once both builds have arrived (t=261)
```
Worth recording because of how it presented: nothing failed, no warning was
printed, and the only symptom was a frame slightly darker than the previous
run's. A gate artifact that silently drifts is the failure mode this project
keeps meeting — and it was caught only because there was a previous capture to
compare against.

View File

@@ -798,8 +798,16 @@ func _raise_overlay(name: String) -> void:
120 units after build 4's last build-in ramp at t=118"
% [int(overlay.settle_time()), visible_at])
if not _play and _film == "":
_overlay_quit_at = _elapsed + visible_at
print(" boot ends at %.2f s, once the plate has arrived" % _overlay_quit_at)
# The LATER of the two, not the overlay's alone. The plate arrives at
# t=238 and build 4 is still fading up from black until t=261 -- its
# `pteff00` quad is 7 % opaque at 243 -- so quitting when the plate
# lands photographs a title that has not finished presenting. The first
# capture taken this way was visibly darker than the one before it, and
# nothing in the log said why.
var ends_at := maxf(view.settle_time(), overlay.settle_time()) / view.units_per_second
_overlay_quit_at = _elapsed - (view.time_units / view.units_per_second) + ends_at
print(" boot ends at %.2f s, once both builds have arrived (t=%d)"
% [_overlay_quit_at, int(maxf(view.settle_time(), overlay.settle_time()))])
# `spec` is read only for the log; the reasoning lives in flow.json where a
# reader looking for a decision will find it.
if spec.has("why"):