port: black_hold_units 9 -> 0, and not the value that fits best

The Decoder measured the black gap on three transitions: menu->title 0 units,
title->menu 4, EXTRAS->menu 6. Not a constant, and 9 was outside the range
entirely -- wrong for all three by up to a sixth of a second of black the game
does not show.

Did not take the best-fitting value. A uniform 4 minimises total error (6 against
0's 10); that is fitting three samples. 0 has a reason that is not a fit -- it
adds no black the game does not have, the tie-breaker input_during_transition
already uses, and it is measured-correct for one real transition. The error is now
a missing gap of at most 6 units on two transitions rather than an invented one of
up to 9 on all three. Boot artifact unchanged at 0.0009% differing.

Their EXTRAS run vindicates the earlier refusal: B from EXTRAS goes black for two
completely empty frames, so the two-line change I declined would have been wrong
for two of three transitions.

Also: the declared final ramp is confirmed from my side (title 8, main_menu 10,
extras 10 -- their exact multiset), needing no constant. And exit_ramp_units
defaults to 24.0, the number HANDOFF told me to author and I refused, on a branch
that cannot execute: 866 keyframes across 16 screens, 0 untimed.

And origin/main is the stale era -- verified 0 145 left-right, tip 2026-08-29,
still carrying the pre-fix association. The per-iteration merge has been a no-op
for days, its 'Already up to date' reading as 'I am current' while meaning 'main
has nothing'.

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 14:21:37 +00:00
parent ecd5e56e0c
commit 5e7bc368f7
2 changed files with 239 additions and 195 deletions

View File

@@ -1,199 +1,171 @@
{
"format": "sylpheed.timing/1",
"keyframe_units_per_second": 60,
"why": [
"HANDOFF Q1. The disc says a keyframe is at `t=30`; it does not say what a",
"`t` is. The unit was MEASURED off the running game, not decoded: a declared",
"15-unit fade lands on round(255*k/15) for all seven of its samples with k",
"stepping 2,4,6,8,10,12,14 on seven consecutive submitted frames -- so 2",
"units per rendered frame -- and the idle title presents at 28.3-28.8 fps,",
"a 30 Hz game, giving 60 units per second. A second line agrees: the",
"transition quad is declared black for 12 units, and a capture measured the",
"pure-black plateau at 0.17-0.23 s, where 12/60 = 0.20 s.",
"",
"Expressed as units-per-second rather than seconds-per-unit so the value is",
"exact rather than a repeating decimal a reader has to recognise.",
"",
"DELETE THIS FILE when a field on the disc is found that states the unit.",
"Nothing here is on the disc.",
"",
"🔴 DO NOT 'CORRECT' THIS AGAINST AN EMULATOR FRAME RATE. A draw-stream",
"measurement on 2026-08-29 found the presented units-per-frame rising 33 % over",
"a single boot (1.765 early, 2.357 late) and three independent readings of one",
"container's rate disagreeing with each other. That is the EMULATOR's",
"presentation pacing drifting, and no single units-per-frame figure describes a",
"run there.",
"",
"60 is a different quantity: the GAME's logical unit rate, measured off the",
"running game as HANDOFF Q1 (a declared t=30 landing on the linear value at",
"every one of seven sampled frames). The port renders at its own frame rate and",
"converts through this constant, so guest pacing cannot reach it. The two",
"numbers are not comparable and one is not evidence about the other."
],
"kind": "measured",
"source": "/reborn docs/port/HANDOFF.md Q1, docs/re/ui-keyframe-time-unit.md",
"ramp": "linear",
"ramp_why": [
"Also HANDOFF Q1, and part of the same measurement: the fade lands on the",
"linear value at every one of the seven sampled frames, so there is no ease."
],
"dwell_seconds": null,
"dwell_why": [
"NOT SET -- because the dwell is DECLARED, and the port already plays it.",
"",
"This key has now been wrong in two opposite directions, and the second was",
"mine, so both are recorded.",
"",
"It first said 'a screen's dwell is its OWN keyframe group'. Then GP_TITLE",
"build 4 was measured dwelling ~1100 presented frames against a declared ~120,",
"and I generalised that into 'the boot is KNOWN TOO FAST on both splashes'.",
"🔴 THAT WAS AN OVER-CORRECTION and it is withdrawn. Build 4 is the title: its",
"exit is caused by something outside its timeline, so it holds. A splash's exit",
"is caused by nothing, so it plays its declared timeline and leaves. The title",
"is the exception, not the rule, and one screen was never enough to overturn",
"the other two.",
"",
"MEASURED 2026-08-29 by the Decoder over 3 cold boots",
"(docs/re/structures/boot-splash-dwells-are-declared.md):",
"",
" publisher declared t=0..255 = 4.250 s corpus 4.30 / 4.60 / 4.37",
" developer declared t=0..210 = 3.500 s corpus 3.51 / 3.50 / 3.37",
"",
"The developer agrees to 1.1 %, two of its three runs to 0.3 %. The port emits",
"4.400 s and 3.650 s -- each declared value plus the 9-unit black hold, exactly.",
"So the pacing was right all along and nothing changes in the code.",
"",
"🔴 AND THE UNIT STAYS UNITS, NOT SECONDS. The same two dwells timed in the",
"Decoder's own container came out 15-20 % LONGER than both the declared values",
"and the corpus -- same disc, same timeline -- and three independent readings",
"of that container's rate disagree with each other. A seconds figure records",
"one emulator's pacing on one run. The units are on the disc. If anything ever",
"goes in `dwell` it is an extra hold in UNITS, and only for a screen that is",
"measured to wait beyond its group."
],
"looping_focus_records": {
"_": [
"WHICH focus records the port draws, unconditionally and on a loop, OVER the",
"element's own sprite rather than instead of it.",
"",
"RESTORED 2026-08-30 on a MEASUREMENT, having been deleted on 2026-08-29 for",
"a real defect that was in the RENDERER, not in this table. The old entry made",
"`_draw` substitute the glow for the plate's own bright sprite, so the plate",
"was invisible at every instant (max 0 against max 252.5). `ScreenView` now",
"draws the base and the record over it, and the entry comes back."
"format": "sylpheed.timing/1",
"keyframe_units_per_second": 60,
"why": [
"HANDOFF Q1. The disc says a keyframe is at `t=30`; it does not say what a",
"`t` is. The unit was MEASURED off the running game, not decoded: a declared",
"15-unit fade lands on round(255*k/15) for all seven of its samples with k",
"stepping 2,4,6,8,10,12,14 on seven consecutive submitted frames -- so 2",
"units per rendered frame -- and the idle title presents at 28.3-28.8 fps,",
"a 30 Hz game, giving 60 units per second. A second line agrees: the",
"transition quad is declared black for 12 units, and a capture measured the",
"pure-black plateau at 0.17-0.23 s, where 12/60 = 0.20 s.",
"",
"Expressed as units-per-second rather than seconds-per-unit so the value is",
"exact rather than a repeating decimal a reader has to recognise.",
"",
"DELETE THIS FILE when a field on the disc is found that states the unit.",
"Nothing here is on the disc.",
"",
"🔴 DO NOT 'CORRECT' THIS AGAINST AN EMULATOR FRAME RATE. A draw-stream",
"measurement on 2026-08-29 found the presented units-per-frame rising 33 % over",
"a single boot (1.765 early, 2.357 late) and three independent readings of one",
"container's rate disagreeing with each other. That is the EMULATOR's",
"presentation pacing drifting, and no single units-per-frame figure describes a",
"run there.",
"",
"60 is a different quantity: the GAME's logical unit rate, measured off the",
"running game as HANDOFF Q1 (a declared t=30 landing on the linear value at",
"every one of seven sampled frames). The port renders at its own frame rate and",
"converts through this constant, so guest pacing cannot reach it. The two",
"numbers are not comparable and one is not evidence about the other."
],
"press_start/ptbtn00": {
"record_element": "ptbtn00f",
"period_units": 120,
"kind": "measured",
"source": "docs/re/structures/plate-pulse-measured.md, RE agent 2026-08-30",
"why": [
"MEASURED off the running game, held at the title with NO INPUT: the plate",
"oscillates continuously -- two windows in one boot of 58 s and 57 s, about",
"23 cycles each, with no decay and no settling.",
"kind": "measured",
"source": "/reborn docs/port/HANDOFF.md Q1, docs/re/ui-keyframe-time-unit.md",
"ramp": "linear",
"ramp_why": [
"Also HANDOFF Q1, and part of the same measurement: the fade lands on the",
"linear value at every one of the seven sampled frames, so there is no ease."
],
"dwell_seconds": null,
"dwell_why": [
"NOT SET -- because the dwell is DECLARED, and the port already plays it.",
"",
"🔴 IT NEVER GOES OFF. The plate-absent floor is 159 thresholded green",
"pixels -- the title art's own, measured on live-title-build4-no-plate.png --",
"and the pulse bottoms at 714, four and a half times that. So `ptbtn00`",
"going transparent at t=244 is not the end of the plate; that is its EXIT",
"ramp, which plays when the screen leaves. While the screen is held the base",
"sits at its own hold (alpha 255 at t=238) and `ptbtn00f`'s cycle runs over",
"it. Base-only and base-plus-glow are what the 714 and the 1520 are.",
"This key has now been wrong in two opposite directions, and the second was",
"mine, so both are recorded.",
"",
"⚠️ 120 UNITS, NOT SECONDS, and that is the RE agent's own instruction. Their",
"run measured 2.530 and 2.540 s; an earlier corpus run measured 2.24 s. Same",
"declared number, different emulator pacing -- x1.27 and x1.12 against a",
"nominal 2.000 s, which IS 120 units at 60 units/s. Hardcoding 2.5 s would",
"author one loaded container's clock."
],
"limits": [
"ONE BOOT. Two windows inside it are not two boots.",
"It does NOT distinguish the boot title from an attract-loop title: run 1",
"opens at t~255 s against Q9's ~193 s no-input baseline, so it may already",
"be the attract title. Both are 'the title, held, no input' -- which is what",
"was asked -- but it is not proof about the first appearance.",
"🔴 714/1520 IS NOT AN ALPHA RATIO. The counter is thresholded pixels, so dim",
"pixels drop out first. No duty cycle and no ramp shape may be read off it;",
"the port draws the record's own declared alpha ramp and infers nothing."
]
}
},
"exit_ramp_deleted_why": [
"DELETED 2026-08-29, and the deletion is the point.",
"",
"`exit_ramp_seconds` (~0.4 s) and `exit_ramp_units` (24) were AUTHORED because",
"the disc had no time slot on a group's final keyframe, so the ramp into it was",
"the one unknown duration per screen. Under the corrected record layout",
"(formats-pin-2026-08-29c onward) there IS no untimed keyframe -- a group is an",
"8-byte header then frames x {u32 time; 36-byte pose}, so every pose is timed",
"including the last. The unknown the constant stood in for does not exist.",
"",
"MISSION section 3: 'When the RE agent later decodes something you had",
"authored, delete the authored entry and let the exporter emit it. That",
"deletion is the measure of progress.'",
"",
"VERIFIED DEAD BEFORE DELETING, not assumed: setting it to 9999 (166 seconds)",
"changed the boot's transitions by 0.04 s -- wall-clock jitter, not a 166 s",
"ramp. Both of its uses in ScreenView were gated on `not last_frame.has('t')`,",
"which no longer fires on any of the export's 866 keyframes.",
"",
"The measurement it recorded is not lost: HANDOFF Q7's ~0.4 s fade-out and the",
"0.17-0.23 s black hold are still measured facts, and the hold is still used --",
"`tools/port/verify-dwell` compares a transition INTERVAL against the oracle's",
"visible SPAN plus that hold. What is deleted is the port's need to invent a",
"duration the disc now states."
],
"black_hold_units": 9,
"black_hold_why": [
"MEASURED IN THE DRAW STREAM, 9 units — and 🟡 SOFTER THAN IT LOOKS. Read the",
"audit below before quoting it. The VALUE IS UNCHANGED because changing it",
"would be my arithmetic on somebody else's instrument; the change is what may",
"be claimed for it.",
"",
"AUDIT 2026-08-29, prompted by the Decoder disclosing that `ARM=early` silently",
"loses its trigger ~40 % of the time, so their draw-stream runs are n = 1 each.",
"Three things this constant rests on have moved since it was authored:",
"",
"1. 🔴 THE CONVERSION USED A FRAME COUNT THEY HAVE SINCE CORRECTED. 9 came from",
" 2.284 units/frame = `palogo_sqex`'s declared span over 105 drawn frames.",
" Their batched-draw truncation fix revised that span to frames 6…119 = 114,",
" which gives 2.096 — the same declared 239 units over 9 more frames.",
"2. 🔴 ITS SECOND CORROBORATION WAS WITHDRAWN. '2.231 from the title capture'",
" is the figure behind their retracted 114-unit plate period: it was",
" regressed over the build-in, where the top-level clock advances, and does",
" not describe the transition.",
"3. 🔴 NO SINGLE UNITS-PER-FRAME FIGURE DESCRIBES A RUN. The presented rate",
" rises 33 % across one boot (1.765 → 2.357). A run-average conversion is",
" the wrong shape for a 3-4 frame event; the LOCAL rate is what applies.",
"",
"Redone with their corrected segments (publisher-late 2.165, developer-early",
"2.308 bracket the gap):",
"",
" 4-frame gap (their 1st run) -> 8.66 - 9.23 units (mid 8.95)",
" 3-frame gap (their 2nd run) -> 6.50 - 6.92 units (mid 6.71)",
"",
"⚠️ Those two runs were reconciled as 'the 3-frame gap replicates the 4-frame",
"one within the ±1 both are quantised to, so ~9 stands'. OVERLAPPING ERROR BARS",
"ARE NOT AGREEING CENTRAL VALUES: one frame is a third of this quantity, and",
"the midpoints are 8.95 and 6.71. The honest range is ~6.5-9.2 units and the",
"port sits at the TOP of it.",
"",
"What is NOT in doubt, and is why 9 is still better than what preceded it: the",
"hold is REAL and was missing entirely until 2026-08-29. Filmed at 0.05 s the",
"port had NO BLACK FRAME AT ALL where the oracle measures a plateau. A value",
"at the top of a plausible range beats a fifth of a second of missing black.",
"",
"Both boundary frames still carry picture — alpha 7 and 34 — and are counted as",
"black, so the true hold is shorter than whatever number this lands on.",
"",
"PRIOR REASONING, kept: the draw stream beats luminance here because luminance",
"cannot separate the outgoing fade's tail from true black. It disagrees with",
"HANDOFF Q7's 0.17-0.23 s plateau (12 units), which is a different screen's",
"transition quad on a different path -- the boot splashes carry none, since",
"`palogo_eff0` is one static keyframe. A number that fits by analogy loses to",
"one measured in place, and that reasoning survives this audit intact.",
"",
"Delete this the day a screen's own transition quad supplies it on the boot",
"path too."
]
"It first said 'a screen's dwell is its OWN keyframe group'. Then GP_TITLE",
"build 4 was measured dwelling ~1100 presented frames against a declared ~120,",
"and I generalised that into 'the boot is KNOWN TOO FAST on both splashes'.",
"🔴 THAT WAS AN OVER-CORRECTION and it is withdrawn. Build 4 is the title: its",
"exit is caused by something outside its timeline, so it holds. A splash's exit",
"is caused by nothing, so it plays its declared timeline and leaves. The title",
"is the exception, not the rule, and one screen was never enough to overturn",
"the other two.",
"",
"MEASURED 2026-08-29 by the Decoder over 3 cold boots",
"(docs/re/structures/boot-splash-dwells-are-declared.md):",
"",
" publisher declared t=0..255 = 4.250 s corpus 4.30 / 4.60 / 4.37",
" developer declared t=0..210 = 3.500 s corpus 3.51 / 3.50 / 3.37",
"",
"The developer agrees to 1.1 %, two of its three runs to 0.3 %. The port emits",
"4.400 s and 3.650 s -- each declared value plus the 9-unit black hold, exactly.",
"So the pacing was right all along and nothing changes in the code.",
"",
"🔴 AND THE UNIT STAYS UNITS, NOT SECONDS. The same two dwells timed in the",
"Decoder's own container came out 15-20 % LONGER than both the declared values",
"and the corpus -- same disc, same timeline -- and three independent readings",
"of that container's rate disagree with each other. A seconds figure records",
"one emulator's pacing on one run. The units are on the disc. If anything ever",
"goes in `dwell` it is an extra hold in UNITS, and only for a screen that is",
"measured to wait beyond its group."
],
"looping_focus_records": {
"_": [
"WHICH focus records the port draws, unconditionally and on a loop, OVER the",
"element's own sprite rather than instead of it.",
"",
"RESTORED 2026-08-30 on a MEASUREMENT, having been deleted on 2026-08-29 for",
"a real defect that was in the RENDERER, not in this table. The old entry made",
"`_draw` substitute the glow for the plate's own bright sprite, so the plate",
"was invisible at every instant (max 0 against max 252.5). `ScreenView` now",
"draws the base and the record over it, and the entry comes back."
],
"press_start/ptbtn00": {
"record_element": "ptbtn00f",
"period_units": 120,
"kind": "measured",
"source": "docs/re/structures/plate-pulse-measured.md, RE agent 2026-08-30",
"why": [
"MEASURED off the running game, held at the title with NO INPUT: the plate",
"oscillates continuously -- two windows in one boot of 58 s and 57 s, about",
"23 cycles each, with no decay and no settling.",
"",
"🔴 IT NEVER GOES OFF. The plate-absent floor is 159 thresholded green",
"pixels -- the title art's own, measured on live-title-build4-no-plate.png --",
"and the pulse bottoms at 714, four and a half times that. So `ptbtn00`",
"going transparent at t=244 is not the end of the plate; that is its EXIT",
"ramp, which plays when the screen leaves. While the screen is held the base",
"sits at its own hold (alpha 255 at t=238) and `ptbtn00f`'s cycle runs over",
"it. Base-only and base-plus-glow are what the 714 and the 1520 are.",
"",
"⚠️ 120 UNITS, NOT SECONDS, and that is the RE agent's own instruction. Their",
"run measured 2.530 and 2.540 s; an earlier corpus run measured 2.24 s. Same",
"declared number, different emulator pacing -- x1.27 and x1.12 against a",
"nominal 2.000 s, which IS 120 units at 60 units/s. Hardcoding 2.5 s would",
"author one loaded container's clock."
],
"limits": [
"ONE BOOT. Two windows inside it are not two boots.",
"It does NOT distinguish the boot title from an attract-loop title: run 1",
"opens at t~255 s against Q9's ~193 s no-input baseline, so it may already",
"be the attract title. Both are 'the title, held, no input' -- which is what",
"was asked -- but it is not proof about the first appearance.",
"🔴 714/1520 IS NOT AN ALPHA RATIO. The counter is thresholded pixels, so dim",
"pixels drop out first. No duty cycle and no ramp shape may be read off it;",
"the port draws the record's own declared alpha ramp and infers nothing."
]
}
},
"exit_ramp_deleted_why": [
"DELETED 2026-08-29, and the deletion is the point.",
"",
"`exit_ramp_seconds` (~0.4 s) and `exit_ramp_units` (24) were AUTHORED because",
"the disc had no time slot on a group's final keyframe, so the ramp into it was",
"the one unknown duration per screen. Under the corrected record layout",
"(formats-pin-2026-08-29c onward) there IS no untimed keyframe -- a group is an",
"8-byte header then frames x {u32 time; 36-byte pose}, so every pose is timed",
"including the last. The unknown the constant stood in for does not exist.",
"",
"MISSION section 3: 'When the RE agent later decodes something you had",
"authored, delete the authored entry and let the exporter emit it. That",
"deletion is the measure of progress.'",
"",
"VERIFIED DEAD BEFORE DELETING, not assumed: setting it to 9999 (166 seconds)",
"changed the boot's transitions by 0.04 s -- wall-clock jitter, not a 166 s",
"ramp. Both of its uses in ScreenView were gated on `not last_frame.has('t')`,",
"which no longer fires on any of the export's 866 keyframes.",
"",
"The measurement it recorded is not lost: HANDOFF Q7's ~0.4 s fade-out and the",
"0.17-0.23 s black hold are still measured facts, and the hold is still used --",
"`tools/port/verify-dwell` compares a transition INTERVAL against the oracle's",
"visible SPAN plus that hold. What is deleted is the port's need to invent a",
"duration the disc now states."
],
"black_hold_units": 0,
"black_hold_why": [
"0, AND THAT IS NOT 'RIGHT' -- IT IS THE VALUE THAT INVENTS NOTHING.",
"",
"This was 9 units, measured in the draw stream. The Decoder has now measured",
"the black gap on THREE transitions off the running game and it is not a",
"constant: menu->title 0 units, title->menu 4, EXTRAS->menu 6. Not a",
"per-button property, not a per-direction property. Their recommendation is to",
"treat this as unauthored rather than uniform-at-9.",
"",
"9 was outside the measured range entirely -- wrong for all three, by +9, +5",
"and +3, i.e. up to a sixth of a second of black the game does not show.",
"",
"WHY 0 AND NOT 4. A uniform 4 minimises total error across the three samples",
"(6 units against 0's 10). That is FITTING THREE SAMPLES, and a fit chosen for",
"its residual is the thing this corpus keeps having to withdraw. 0 has a",
"reason that is not a fit: it adds no black the game does not have, which is",
"the same tie-breaker `input_during_transition` already uses in this file --",
"the choice that invents the least. It is also measured-CORRECT for one real",
"transition, which no other uniform value beats on principle.",
"",
"The error is now a MISSING gap of at most 6 units on two transitions rather",
"than an INVENTED one of up to 9 on all three. Delete this entry the day the",
"rule is known; the Decoder cannot state it yet and neither can I."
]
}

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 -->
164 sections. Search this before re-deriving anything.
166 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)
@@ -175,6 +175,8 @@ dies, which is what this file is for.
* [`check-all` passes — after an hour-long hang that was the suite's own fault](#check-all-passes--after-an-hour-long-hang-that-was-the-suites-own-fault)
* [Ⓐ and Ⓑ are not the same shape, and my `black_hold` treats them as if they were](#and--are-not-the-same-shape-and-my-black_hold-treats-them-as-if-they-were)
* [🔴 `check-all` excused two failing rows with a reason that is measurably false](#check-all-excused-two-failing-rows-with-a-reason-that-is-measurably-false)
* [`black_hold_units` 9 → 0, and why not the value that fits best](#black_hold_units-9--0-and-why-not-the-value-that-fits-best)
* ["Already up to date" is not evidence that I am current](#already-up-to-date-is-not-evidence-that-i-am-current)
<!-- /INDEX -->
## P0 — the exporter, 2026-08-28
@@ -9465,3 +9467,73 @@ The pin reminder survives as its own line, and now reads the tag **out of
This one had been true once — the monorepo merge made the exporter and the
reference share a decoder, and the tag pin quietly unmade that — and it kept being
printed long after it stopped describing the tree.
## `black_hold_units` 9 → 0, and why not the value that fits best
The Decoder measured the black gap on **three** transitions off the running game.
It is not a constant:
| transition | measured gap | my hold of 9 |
|---|---|---|
| menu → title | **0 units** | +9 |
| title → menu | 4 | +5 |
| EXTRAS → menu | 6 | +3 |
🔴 **9 was outside the measured range entirely** — wrong for all three, by up to a
sixth of a second of black the game does not show. Their recommendation is to
treat it as unauthored rather than uniform-at-9.
⚠️ **I did not take the value that fits best.** A uniform **4** minimises total
error (6 units against 0's 10). That is fitting three samples, and a constant
chosen for its residual is exactly what this corpus keeps having to withdraw. **0
has a reason that is not a fit:** it adds no black the game does not have — the
same tie-breaker `input_during_transition` already uses in this file — and it is
measured-*correct* for one real transition. The error becomes a **missing** gap of
at most 6 units on two transitions rather than an **invented** one of up to 9 on
all three.
✅ The verified boot artifact survives: the end frame is still **0.0009 %**
differing against the oracle, unchanged within printing precision.
📌 And their EXTRAS run vindicates the refusal. "Ⓑ has no black" was one run of one
transition; Ⓑ from EXTRAS goes black for **two completely empty frames** — harder
black than either earlier capture. Had I made the two-line change when I had the
evidence for it, I would have shipped a rule that is wrong for two of the three
transitions now measured.
### The declared final ramp, confirmed from my side
They report the outgoing ramp is the declared final ramp **three for three**
against three different values. My export gives `title` **8**, `main_menu` **10**,
`extras` **10** — the same multiset they measured (10u/5f, 8u/4f, 10u/5f). ✅ The
port already plays each group to its own end, so this needs no constant and no
change.
### 🔴 `exit_ramp_units` is dead code carrying the number I refused to author
`ScreenView.exit_ramp_units` defaults to **24.0** — the very constant HANDOFF ask
2 told me to author and that I declined. It synthesises a time for a group's
*untimed* final keyframe.
**There are no untimed keyframes.** 866 across all 16 screens, **0** untimed. The
corrected record layout times every pose, so this branch cannot execute. It is a
stale default holding a refuted value, waiting for a reader to mistake it for a
decision.
## "Already up to date" is not evidence that I am current
The Decoder found `origin/main` is the **stale** era. Verified here rather than
taken: `git rev-list --left-right --count origin/main...HEAD` gives **0 145** —
main has nothing I lack — its tip is dated **2026-08-29**, and its
`ui_layout.rs` still reads *"Keyframe time, or `None` for the group's last
frame"*, the pre-fix association my tree no longer has.
🔴 So the per-iteration `git merge origin/main` has been a **no-op for days**, and
its "Already up to date" reads as *I am current* while meaning *main has nothing*.
That is the same shape as reading `check-all`'s silence as progress: **an absence
of signal taken as a positive one.**
⚠️ The sync stays — the reason it exists (tooling and protocol revisions landing on
main) is sound and will apply again. What changes is that its output is not
reassurance. And my `Cargo.toml` pin is on a tag whose commit is **unmerged**:
correct today, fragile, because nothing protects it.