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:
@@ -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."
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user