port: the PRESS (A) plate could not be drawn at any instant -- four faults, and a misquoted number

1. --time= was silently ignored on any screen with a settle window >= 30 units:
   pose_at overwrote the requested instant with settle_instant. ScreenView.frozen
   now marks an explicit instant and skips both clamps.

2. press_start's settle window was [0,214] -- the dead stretch BEFORE the plate
   exists -- so its settle instant was t=107, where the element is alpha 0. The
   exporter now rejects intervals in which nothing is visible. title keeps
   [160,236], the interval the Decoder's draw stream confirmed.

3. My authored looping_focus_records entry for press_start/ptbtn00 drew a dim
   focus record INSTEAD of the plate's own sprite: max 0 vs max 252.5. Deleted --
   an authored guess that overrides a decode with a worse answer is removed.

4. verify-capture passed --time=5.9617 for the title and it was never applied.
   Every title figure it has printed, including the 0.26% quoted to the Decoder,
   was measured at the settle instant under a note claiming t=357.7. Both rows now
   pose by omission and the note matches. title is 0.21% honestly; splashes
   unchanged at 0.01%.

The boot's end artifact now contains the plate (region mean 95.7 vs 33.6).
Corrects last iteration's BLOCKED row, which had the entry's effect backwards.

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 00:24:33 +00:00
parent 09188ccbb2
commit 3c71962698
7 changed files with 210 additions and 71 deletions

View File

@@ -536,6 +536,14 @@ pulses on a period (`authored/timing.json` already carries a *speculative*
what a pulse would need); or it genuinely blinks once and vanishes, in which case
the port is right and this closes ✅.
⚠️ Note the port already draws a looping focus record for this element. If the
answer is "blinks once", **that entry is wrong and should be deleted**, not kept
as harmless — it is the only thing making the plate reappear at all.
🔴 **Correction, 2026-08-30.** This row previously said the looping focus record
was "the only thing making the plate reappear at all". The opposite was true: the
entry was the only thing making it **disappear** — it drew a dim glow *instead of*
the plate's own sprite, max 0 against max 252.5. It has been deleted, and the port
now draws the plate from its own decoded fade. See `DECISIONS.md`.
⚠️ So the question narrows rather than closes. The port shows the plate at its
declared instants and holds it. What a capture would still settle is whether the
real plate **pulses** after that, and whether `ptbtn00f.rat` — the focus record,
which the port now draws not at all — is a glow layered *over* the plate. Drawing
both would be a rendering rule nobody has measured.

View File

@@ -5828,3 +5828,95 @@ did not match the flag I passed, and that was visible in my first `ls`.** A
verbatim re-run produces six correctly-named per-step shots. I do not know where
those 410 files came from, which is itself the point: I drew a conclusion from a
file set whose provenance I never checked.
## The `PRESS Ⓐ` plate: four bugs in a row, and a number I have been misquoting
Last iteration I filed that the plate was visible for 8 units and simply missed by
the boot's capture instant. That was wrong in the direction that matters: **the
plate could not be drawn at any instant at all**, and three separate faults had to
be removed before it appeared. The fourth is a correction to figures I have quoted
to the Decoder repeatedly.
### 1. `--time=` was silently ignored on half the screens
`pose_at` did `if holding: t = settle_instant`. The requested instant was
**discarded** on every screen with a settle window ≥ 30 units — `title`,
`press_start`. The flag parsed, the log printed the time asked for, and the pose
came from somewhere else entirely.
`ScreenView.frozen` now marks an explicitly pinned instant and skips both clamps.
### 2. The settle window picked an interval where nothing is visible
`press_start`'s keyframes are 0, 214, 236, 238, 244. The widest keyframe-free gap
is **0…214** — the dead stretch *before* the plate exists, where `ptbtn00` is
alpha 0 throughout — so its settle instant was **t=107**, and every question about
that screen was answered there.
🔴 **A gap in which nothing is visible is not a settled state.** The exporter now
rejects those intervals. `press_start` becomes [214, 236] — 22 units, under the
runtime's 30-unit bar — so it falls back to each element's own hold, which is the
plate, opaque, as the disc declares it.
⚠️ It disturbs no window the settle instant was measured on: `title` keeps
[160, 236], the interval the Decoder's draw stream independently found the game's
clock freezing in.
### 3. An authored entry of mine was suppressing the decode
Even then the plate stayed dark, because `authored/timing.json`'s
`looping_focus_records` entry for `press_start/ptbtn00` made `_draw` take the
focus path — which draws the focus record **instead of** the base sprite:
| | with the entry | without |
|---|---|---|
| `press_start` t=236 | max **0** | max **252.5** |
| t=240 | max 0 | max 252.5 |
| t=250 | max 15.3 | max 252.5 |
I authored that entry to give the plate a glow. It substituted a dim glow at the
wrong phase for the element's own bright sprite, on the screen whose entire
content is that sprite. **Deleted** — an authored guess that overrides decoded
data with a worse answer is removed, not tuned. The glow is not claimed either
way; drawing both would be a rendering rule nobody has measured.
✅ The boot's end artifact now contains the plate: mean **95.7** in its region
against **33.6** for the title art alone, and the overlay reports `drew 1:
ptbtn00` where it reported `drew 0`.
### 4. 🔴 `verify-capture` has been measuring a different pose than it reported
It passed `--time=5.9617` for the title — t=357.7 units, the Decoder's refined
sweep fit — and **that value was never applied**, because of fault 1. Every title
figure this tool has printed, including the **0.26 %** I have quoted to the
Decoder more than once, was measured at the **settle instant, t=198**, under a
note claiming t=357.7.
Honouring the flag made it visible: t=357.7 is past the title's own group, which
ends at t=269, so the whole screen posed at its faded-out final keyframes and the
disagreement went to **30.97 %**. The instant was only ever meant for the `ptloop`
leaf, which runs to t=600 and is looped separately by `loop_leaf`. Applying it to
the whole screen was always wrong and was harmless only while it was ignored.
The splashes had the same shape: `--time=99` was an idiom for "settled" that
worked only because it was discarded. Both rows now pose by omission, and the
tool's note says what it does.
| | before | now |
|---|---|---|
| `title` | 0.26 % *(labelled t=357.7, actually t=198)* | **0.21 %** at t=198, labelled t=198 |
| `publisher_logo` | 0.01 % | 0.01 % |
| `developer_logos` | 0.01 % | 0.01 % |
| `main_menu` | 0.07 % | 0.08 % |
| `extras` | 0.19 % | 0.19 % |
The agreements were real; the **stated pose was not**. Corrected with the
Decoder, since they have those numbers.
### The flag audit that started it
All 16 flags `boot.gd` parses were exercised for an observable effect after last
iteration's two silent ones. `--pose=rest` (max 111 against the timeline),
`--play` (enters the menu), `--no-hold` (max 255 on two screens) all pass. `--time`
was the one that did not, and it took a screen whose content is a single late
spike to make the failure visible.