From 1f1fe647f22c39354580347a1c0496d541d36407 Mon Sep 17 00:00:00 2001 From: Sylpheed port agent Date: Sat, 29 Aug 2026 12:58:28 +0000 Subject: [PATCH] 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) Claude-Session: https://claude.ai/code/session_01WM5XL4HfrHuxz8RiMWdCMC --- docs/port/DECISIONS.md | 23 +++++++++++++++++++++++ port/scripts/boot.gd | 12 ++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index 85d14a4a..30958881 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -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. diff --git a/port/scripts/boot.gd b/port/scripts/boot.gd index ea10ca6c..978b1600 100644 --- a/port/scripts/boot.gd +++ b/port/scripts/boot.gd @@ -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"):