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) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
This commit is contained in:
Sylpheed port agent
2026-08-30 07:57:23 +00:00
parent aa6be8e809
commit 19acff7a41
2 changed files with 76 additions and 2 deletions

View File

@@ -9,7 +9,7 @@ dies, which is what this file is for.
<!-- INDEX: generated by tools/port/index-decisions -- do not hand-edit -->
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)
<!-- /INDEX -->
## 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 35× 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.410.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.

View File

@@ -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