From 19acff7a41ff25801abde4a83f6e82c090f52e71 Mon Sep 17 00:00:00 2001 From: Sylpheed port agent Date: Sun, 30 Aug 2026 07:57:23 +0000 Subject: [PATCH] port: a static overlay advances instead of freezing; and their pulse floor is unreproducible --screen=X animates X but froze an overlaid Y -- my earlier fix overshooting, replacing a frozen-too-early overlay with a frozen-at-arrival one. The plate pulse made it visible: oscillating on the boot path, flat here. Now offset, not pinned: the overlay starts at its settle and takes the main view's delta. Static path now pulses 95.85 -> 115.41 against the boot's 95.68 -> 115.52; still frames unaffected and title_plate holds at 0.00%. Both halves were mine a week apart, and the over-correction was invisible until a third change gave it something to be wrong about. Refutation attempt on their pulse floor: 159/714/1520 is NOT reproducible from the published description. My counts on the same capture are 3-5x theirs at every threshold, so their region must be a tighter crop; neither region nor threshold is stated. The RATIO survives robustly -- 1:10.4-10.9 across a wide band, bracketing their 1:9.6 -- so 'steady base plus pulsing glow' stands, which is all the port's implementation rests on. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF --- docs/port/DECISIONS.md | 58 +++++++++++++++++++++++++++++++++++++++++- port/scripts/boot.gd | 20 ++++++++++++++- 2 files changed, 76 insertions(+), 2 deletions(-) diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index e73370db..484083fc 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -9,7 +9,7 @@ dies, which is what this file is for. -122 sections. Search this before re-deriving anything. +123 sections. Search this before re-deriving anything. * [P0 — the exporter, 2026-08-28](#p0--the-exporter-2026-08-28) * [P1 — Godot draws the screen, 2026-08-28](#p1--godot-draws-the-screen-2026-08-28) @@ -133,6 +133,7 @@ dies, which is what this file is for. * [The sweep discriminator resolves: different frames, and a sweep position cannot date one](#the-sweep-discriminator-resolves-different-frames-and-a-sweep-position-cannot-date-one) * [Their trap, run against my tree — and I found its mirror instead](#their-trap-run-against-my-tree--and-i-found-its-mirror-instead) * [The plate pulses — measured, and the port was wrong on the boot's end state](#the-plate-pulses--measured-and-the-port-was-wrong-on-the-boots-end-state) +* [A static overlay now advances, and a refutation attempt on the pulse floor](#a-static-overlay-now-advances-and-a-refutation-attempt-on-the-pulse-floor) ## P0 — the exporter, 2026-08-28 @@ -7178,3 +7179,58 @@ thresholded pixels, so no duty cycle or ramp shape may be read from it. The port draws the record's own declared ramp and infers nothing about its shape. Oracle rows unmoved; every asserting check passes. + +## A static overlay now advances, and a refutation attempt on the pulse floor + +### The static overlay was frozen at its arrival, which was my fix overshooting + +`--screen=X` animates X. `--screen=X --overlay=Y` **froze** Y, because the fix for +the original defect — the raw elapsed clock pushed in, 9 units at capture, plate +drawing nothing — replaced a frozen-too-early overlay with a frozen-at-arrival +one. One command animating one build and freezing the other is an inconsistency, +and the plate pulse is what made it visible: the plate oscillated on the boot path +and sat flat here, which reads as a regression and is not one. + +Now **offset, not pinned**: the overlay begins at its own settle and takes the same +delta the main view takes. Verified — the static path pulses over the same range as +the boot path, 95.85 → 115.41 against 95.68 → 115.52. Still frames are unaffected +(`--time` freezes both) and `title_plate` holds at **0.00 %**. + +📌 Both halves of this were mine, a week apart: the original bug, then the +over-correction for it. The over-correction was invisible until a *third* change — +the pulse — gave it something to be wrong about. A fix that overshoots leaves no +symptom until something else needs the part it disabled. + +### 🟡 Refutation attempt — their pulse floor of 159 green pixels + +Their measurement gives a plate-absent floor of **159** thresholded green pixels, +a pulse minimum of **714** and a peak of **1520**, the floor measured on +`live-title-build4-no-plate.png` — a capture I hold. So it is checkable. + +**It is not reproducible from the published description.** Across the plate region +(513×48 at +383+551) my counts are 3–5× theirs at every threshold: + +| green > | no-plate | press-a | ratio | +|---|---|---|---| +| 100 | 676 | 9 369 | 1 : 13.9 | +| 150 | 528 | 5 732 | 1 : 10.9 | +| 180 | 462 | 4 908 | 1 : 10.6 | +| 200 | 411 | 4 272 | 1 : 10.4 | +| **theirs** | **159** | **1 520** | **1 : 9.6** | + +No threshold produces both numbers, so their region must be a tighter crop than +mine. Neither the region nor the threshold is stated on the page. + +✅ **The finding survives in the part that matters.** The *ratio* is stable at +1 : 10.4–10.9 across a wide threshold band and brackets their 1 : 9.6, so "the +plate-present frame carries about ten times the green of the plate-absent one" is +robust to how it is counted. What cannot be checked is the absolute figures — and +those are what the "never goes off" conclusion is stated in. + +⚠️ This is the convention we agreed two iterations ago, applied to their own new +page: **a cross-renderer pixel figure needs its region and its threshold named.** +I raised it there about *my* numbers drifting between two files; the same rule +makes a published measurement unverifiable when a reader has the capture and not +the crop. Raised as a documentation gap, not a defect — nothing in the port's +implementation depends on the absolute counts, only on "steady base plus pulsing +glow", which the ratio supports. diff --git a/port/scripts/boot.gd b/port/scripts/boot.gd index 3e820e7d..7c74360f 100644 --- a/port/scripts/boot.gd +++ b/port/scripts/boot.gd @@ -1036,6 +1036,9 @@ func _exit_tree() -> void: ## The overlay the current boot step owes, if it has not been raised yet. var _overlay_spec: Dictionary = {} +## Where a STATIC overlay's own clock starts, and the main view's clock then. +var _overlay_t0 := 0.0 +var _overlay_view_t0 := 0.0 ## Wall-clock second at which it is raised, measured from the screen's settle. var _overlay_due: float = 0.0 @@ -1065,7 +1068,20 @@ func _overlay_process(delta: float) -> void: # units between build 4's last ramp and the plate's a=255 is a fixed # interval on ONE timeline -- so that path is untouched. if _sequence.is_empty(): - overlay.time_units = overlay.settle_time() + # 🔴 A static overlay STARTS at its arrival and then ADVANCES. It used + # to be pinned there on every frame, which was this fix overshooting. + # + # Pinning fixed the original defect -- `--screen=X --overlay=Y` pushed + # the raw elapsed clock in, 9 units at capture, and `press_start` drew + # nothing -- but it replaced a frozen-too-early overlay with a + # frozen-at-arrival one. `--screen=X` animates X; freezing Y while + # animating X is an inconsistency in one command, and the plate pulse + # is what made it visible: the plate oscillates on the boot path and + # sat flat here, which reads as a regression and is not one. + # + # Offset, not pinned: the overlay begins at its own settle and takes + # the same delta the main view takes. + overlay.time_units = _overlay_t0 + (view.time_units - _overlay_view_t0) else: overlay.time_units = view.time_units overlay.queue_redraw() @@ -1111,6 +1127,8 @@ func _raise_overlay(name: String) -> void: # After `view`, so it draws over it: Node2D siblings paint in tree order and # the export's own `paint_order` only orders WITHIN a build. viewport.add_child(overlay) + _overlay_t0 = overlay.settle_time() + _overlay_view_t0 = view.time_units print(" overlay %s raised at %.2f s, %d element(s), settles at t=%d" % [name, _elapsed, overlay.screen.get("elements", []).size(), int(overlay.settle_time())]) # A boot with no menu to hand over to has now finished: it was held open for