re: the rest() fallback -- its example dissolved, the question got bigger

ui-resting-pose.md built its dwell-fallback section on GP_TITLE build 7's
ptlogo_eff3.t32, listing keyframes [46, 61, 103, -] -- the STALE PARSER's output.
Corrected they are [0, 46, 61, 103], the longest gap moves from 61->103 to 0->46,
and BOTH ends of the new longest gap are a=0. The element no longer selects a
visible pose under either indexing, and build 7 renders byte-identical under the
corrected and legacy readings (0 px differ). MISSION lists this element as the one
case a Japanese capture was needed to discriminate; it is not.

But losing an example is not closing a question, so: disc-wide census. The
fallback fires on 2 305 of 13 991 elements and returns a VISIBLE pose in 1 697 of
them -- 74 %.

GP_TITLE is 5 fires, 4 visible, and all four are on the SPLASH screens:
palogo_sqex_eff and palogo_anima_eff, each [0:a0 15:a255 30:a212 45:a0], a flash
peaking at 15 and dead by 45 where the fallback returns t=30 a=212.

Independently converged on from the other side: the port, working from the JP
capture and knowing nothing of this census, found ptlogo_back2eff1's rest.t at the
peak of its own 4-unit sparkle with six staggered across the logo, so --pose=rest
fires every sparkle at once -- a frame the game never shows.

Consequence recorded as a rule: a render posed at rest is a legitimate common
reference for comparing two DECODERS and is not a frame to score against a
capture of the game.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v
This commit is contained in:
sylph-decoder
2026-08-30 11:50:07 +00:00
parent 3b52240d83
commit cae2f7596e
4 changed files with 204 additions and 2 deletions

View File

@@ -268,15 +268,40 @@ no pose is held, and the rule is choosing an endpoint of a movement.**
### The element that exposed it
`GP_TITLE` build 7, `ptlogo_eff3.t32` — a transient bloom:
🔴 **This listing is the STALE PARSER's, and the example it supports is dead
(2026-08-30).** The times below are shifted by one with an untimed final pose —
the pre-record-layout-fix reading. See
[CONTAINER-NOTES](../../agents/CONTAINER-NOTES.md) for the trap.
`GP_TITLE` build 7, `ptlogo_eff3.t32` — a transient bloom, **as it was printed**:
```
46: (98,42) 100%,100% a=0
61: (108,72) 0%,0% a=0
103: (108,72) 200%,200% a=255 r=80
-: (108,72) 0%,0% a=0 r=150
-: (108,72) 0%,0% a=0 r=150 ← stale: shifted, final pose untimed
```
**and as it actually reads:**
```
0: (98,42) 100%,100% a=0
46: (108,72) 0%,0% a=0
61: (108,72) 200%,200% a=255 r=80
103: (108,72) 0%,0% a=0 r=150
```
| | gaps | longest | its two ends |
|---|---|---|---|
| stale | 15, 42 | 61→103 | one is **a=255 at 200 %** — the screen-filling bloom |
| **fresh** | **46, 15, 42** | **0→46** | **both a=0** |
**So this element no longer discriminates.** `rest()` returns `(98,42) a=0`
invisible — and build 7 renders **byte-identical** under the corrected and legacy
readings (0 pixels differ, max Δ 0). ⚠️ `MISSION.md` lists this element as the one
case a **Japanese-locale capture** was needed to settle. It is not; that capture was
still worth taking, for the port's `title_jp` question, but not for this.
No two adjacent poses are equal, so there is no plateau. The longest gap is
`61 → 103` (42 units), during which the sprite grows from nothing to **200 %** at
full alpha while rotating 80°, then collapses again. The rule returns whichever
@@ -294,6 +319,32 @@ units brighter.
**The element has no resting pose.** It is a flash; after it plays there is
nothing. Neither answer is *derived* — one of them is merely harmless.
### 🔴 Losing the example did not close the question — it is larger than one element
Disc-wide ([`../data/rest-fallback-census.txt`](../data/rest-fallback-census.txt)):
| | |
|---|---|
| elements with ≥ 2 keyframes | 13 991 |
| have a plateau — the fallback never runs | 11 686 |
| **have none — the fallback decides** | **2 305** |
| **of those, it returns a VISIBLE pose** | **1 697 (74 %)** |
**`GP_TITLE`: 5 fires, 4 visible** — and all four are on the **splash screens**,
`palogo_sqex_eff.t32` / `palogo_anima_eff.t32` on entries 10/11/13/14. Each reads
`[0:a0 15:a255 30:a212 45:a0]`: a flash peaking at t=15, dead by t=45, and the
fallback returns **t=30, a=212** — near the peak of a transient.
**Independently converged on from the other side.** The port agent, working from
the Japanese title capture and knowing nothing of this census, found
`ptlogo_back2eff1`'s `rest.t` sitting at the peak of its own **4-unit** sparkle,
with six staggered across the logo — so `--pose=rest` fires every sparkle at once,
a frame the game never shows.
⚠️ **The consequence, and it is a rule about how a rest render may be used:** a
render posed at `rest` is a legitimate **common reference for comparing two
decoders**, and is **not** a frame to score against a capture of the game.
### 🔴 What this retracts
Last iteration I reported the build 7 render difference as evidence **against**