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
172 lines
9.7 KiB
JSON
172 lines
9.7 KiB
JSON
{
|
|
"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."
|
|
],
|
|
"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."
|
|
]
|
|
}
|