The Decoder measured build 4's top-level clock stopping inside [160,236]. The exporter computes title's settle window as [160,236,198] from the file alone. Same interval, two independent methods -- the first evidence for the settle instant that does not come from our own renderer. ptcopyright reaching alpha 255 exactly at t=160 agrees from a third direction. Corrects a claim in three places: timing.json, flow.json and boot.gd all said a screen's dwell IS its keyframe group and the port reproduced 'the disc's own pacing'. Build 4 declares ~120 presented frames and dwelled ~1100. The decision to hold zero extra stands; the claim that it was faithful does not. Checks their two declared spans against the file: both exact, with a 106-vs-105 interval-convention quibble that changes nothing. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
209 lines
11 KiB
JSON
209 lines
11 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."
|
|
],
|
|
"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 -- and the reason is no longer the one this key used to give.",
|
|
"",
|
|
"🔴 It used to say \"a screen's dwell is its OWN keyframe group\". That is",
|
|
"REFUTED, measured in the draw stream by the Decoder on 2026-08-29",
|
|
"(docs/re/structures/ui-clock-freezes-at-settle.md): GP_TITLE build 4 declares",
|
|
"t = 0..269, about 120 presented frames at that capture's pacing, and the real",
|
|
"dwell lasted ~1100 -- roughly NINE TIMES its own timeline. The top-level clock",
|
|
"advances through the build-in, STOPS inside the settle window, and holds. The",
|
|
"exit ramp is not on a timer; it plays when something makes the screen leave.",
|
|
"",
|
|
"So the group is not the dwell, and a port that leaves when the group ends is",
|
|
"not reproducing the disc's pacing -- it is leaving at the moment the game",
|
|
"starts waiting.",
|
|
"",
|
|
"The DECISION is unchanged and still right: hold zero extra rather than invent",
|
|
"a number. What changes is what may be claimed for it. The boot is KNOWN TOO",
|
|
"FAST on every screen it plays out, by an amount nobody has measured. It is not",
|
|
"'the disc's own pacing'; that phrasing said the port was faithful here, and it",
|
|
"is not.",
|
|
"",
|
|
"⚠️ Only build 4 has been measured, and build 4 is the one screen where the port",
|
|
"is unaffected -- it is the boot's end state and holds indefinitely anyway. The",
|
|
"two screens this actually governs, publisher_logo and developer_logos, are",
|
|
"UNMEASURED. Nothing here may be read as a number for them.",
|
|
"",
|
|
"If a capture ever times the real boot, this is where that number goes."
|
|
],
|
|
"looping_focus_records": {
|
|
"_": [
|
|
"WHICH focus records the port draws unconditionally, and loops. CHOSEN, and",
|
|
"deliberately a LOOKUP rather than a rule -- delete an entry the day the disc",
|
|
"or a capture states it.",
|
|
"",
|
|
"THE PRESS (A) PLATE GLOWS AND PULSES. Measured on the running game:",
|
|
"`ptbtn00f`, the plate's focus record, ramps alpha 0x00->0x50 and back, and",
|
|
"its period was timed four times at 2.12 / 2.19 / 2.34 / 2.31 s. You cannot",
|
|
"measure a period unless the thing repeats, so THAT IT LOOPS IS MEASURED. The",
|
|
"port drew nothing at all here, because press_start has no `buttons` and",
|
|
"nothing is focused.",
|
|
"",
|
|
"WHY A LOOKUP AND NOT A RULE, which is the part worth keeping. The spinning",
|
|
"ring is a RULE in the renderer (`spin_period_units`) because it has a",
|
|
"disc-wide check: 16 of 212 elements match its shape and all 16 are focus",
|
|
"rings, zero false positives. The obvious rule for a pulse -- a group whose",
|
|
"keyframes vary only in alpha and whose first and last alpha are equal -- was",
|
|
"CENSUSED BEFORE BEING WRITTEN and it fails: 82 OF 212 ELEMENTS MATCH,",
|
|
"including ptcopyright, palogo_sqex, ptmsg and every _eff fade-in. A renderer",
|
|
"rule on that shape would make the copyright notice pulse.",
|
|
"",
|
|
"Narrowing to focus records leaves exactly ONE distinct element (ptbtn00f,",
|
|
"plus its JP twin), and a rule justified by n=1 is a special case wearing a",
|
|
"rule's clothes. So it is written here, per element, by name."
|
|
],
|
|
"press_start/ptbtn00": {
|
|
"record_element": "ptbtn00f",
|
|
"period_units": 120,
|
|
"kind": "chosen",
|
|
"why": [
|
|
"120 units, and it is DECODED rather than chosen -- but it is still written",
|
|
"here because the field is not in the pinned crate yet. DELETE THIS the day a",
|
|
"tag exposes it and the exporter can emit it.",
|
|
"",
|
|
"A nested record is itself a RATC bundle with its own header, and that header's",
|
|
"+0x08 IS THE LOOP LENGTH -- the same field `ui_header_time_disc` already tests",
|
|
"as an animation length at the top level. A record's keyframes need not fill",
|
|
"it, and the slack is a hold at the final pose. `ptbtn00f` is 105 UNITS OF RAMP",
|
|
"INSIDE A 120-UNIT CYCLE, so the glow rests dark for 15 units before repeating.",
|
|
"The five `ptbtn0Nf` records on the main menu fill their 120 exactly, which is",
|
|
"what shows the slack belongs to this record and not to the format.",
|
|
"",
|
|
"Disc-wide over 1781 timed nested records: 92.3% declare exactly their last",
|
|
"keyframe time, 7.7% declare more, and 0 DECLARE LESS. That last row is the",
|
|
"falsifier -- a cycle cannot restart before its own last pose -- and it never",
|
|
"fires.",
|
|
"",
|
|
"AND IT SURVIVES THE OBJECTION THIS ENTRY RAISED, using THIS PORT's number.",
|
|
"Both candidate periods need the same emulator pacing factor, and the ring",
|
|
"measures it independently: declared 120 units -> 2.177 s = 1.0885.",
|
|
"",
|
|
" 105 units = 1.750 s nominal, needs a factor of 1.211-1.337 -> EXCLUDES it",
|
|
" 120 units = 2.000 s nominal, needs a factor of 1.060-1.170 -> CONTAINS it",
|
|
"",
|
|
"So 105 cannot reach the corpus's measured 2.12-2.34 s under any pacing the",
|
|
"ring also satisfies. At 120 the prediction is 2.177 s. Different elements,",
|
|
"different bundles, separate runs, tied only by both declaring 120.",
|
|
"",
|
|
"HISTORY, because the sequence is what makes this checkable: this entry read",
|
|
"129 (last keyframe 105 + the since-deleted exit_ramp_units), then 105 (the",
|
|
"group length under the corrected layout, which I shipped knowing it was 17%",
|
|
"short of every measurement). The 123-vs-129 pair I once called unseparable",
|
|
"STRADDLED the right answer without containing it.",
|
|
"",
|
|
"The ~3% between 2.177 and the corpus's 2.24 mean is four wall-clock samples of",
|
|
"a 2 s period; the Decoder looked for a further declared hold and found none."
|
|
]
|
|
}
|
|
},
|
|
"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. Not on the disc for these screens, so",
|
|
"it is authored with a why.",
|
|
"",
|
|
"The Decoder counted submitted quads rather than luminance, which is the better",
|
|
"instrument here: luminance cannot separate the outgoing fade's tail from true",
|
|
"black, and the draw stream can. Frames 21-125 submit `palogo_sqex` fading to",
|
|
"alpha 7; frames 126-129 submit NO SPRITE QUAD AT ALL; frames 130-153 fade the",
|
|
"developer splash in from alpha 34. Four presented frames, the only such run in",
|
|
"the sequence.",
|
|
"",
|
|
"Converted with the disc as its own clock, because that run's frame rate is",
|
|
"useless (13.1 fps against 28 elsewhere): `palogo_sqex` declares alpha >= 1 for",
|
|
"239.8 units and is drawn in 105 frames -> 2.284 units/frame, corroborated",
|
|
"independently at 2.231 by the title capture. Four frames = 9.1 units = 0.152 s,",
|
|
"with a +/-1 frame range of 6.9-11.4 units.",
|
|
"",
|
|
"⚠️ IT DISAGREES WITH THE LUMINANCE FIGURE AND THE DISAGREEMENT IS THE POINT.",
|
|
"HANDOFF Q7's pure-black plateau was measured at 0.17-0.23 s and I authored 12",
|
|
"units (0.200 s) from it. The draw-stream range is 0.114-0.190 s, overlapping",
|
|
"only at the top. And the true black is SHORTER than 9 even so: both boundary",
|
|
"frames still carry picture, at alpha 7 and 34, and are counted as black.",
|
|
"",
|
|
"12 was also supported by the menus' transition quad declaring black for 12",
|
|
"units -- but that is a different screen's quad on a different path, and the",
|
|
"boot splashes carry no such quad at all (`palogo_eff0` is one static",
|
|
"keyframe). A number that fits by analogy loses to one measured in place.",
|
|
"",
|
|
"🔴 It had never been implemented at ALL until 2026-08-29 -- see the entry",
|
|
"below, kept because the way it stayed hidden matters more than the value.",
|
|
"",
|
|
"PREVIOUS ENTRY, kept:",
|
|
"MEASURED, not on the disc for these screens, so it is authored with a why.",
|
|
"",
|
|
"HANDOFF Q7: a screen transition is a fade THROUGH BLACK, and the pure-black",
|
|
"plateau between one screen leaving and the next arriving was measured at",
|
|
"0.17-0.23 s. The transition quad on the menus declares black for 12 units, and",
|
|
"12/60 = 0.200 s sits in the middle of that range -- so 12 units is the number,",
|
|
"and it is the disc's own where a screen carries such a quad.",
|
|
"",
|
|
"THE BOOT SPLASHES DO NOT CARRY ONE. `publisher_logo` and `developer_logos`",
|
|
"each hold a single `palogo_eff0`, a 1280x720 primitive with ONE keyframe at",
|
|
"t=0 -- static, not a transition ramp. So on the boot path the hold is",
|
|
"sequencer behaviour and there is nothing to read it from.",
|
|
"",
|
|
"🔴 IT HAD NEVER BEEN IMPLEMENTED, and this is what the publisher_logo residual",
|
|
"was. Filmed at 0.05 s, the port fades the publisher out to a mean of 0.317 at",
|
|
"t=4.20 s and the developer logos are already at 5.65 by t=4.25 -- NO BLACK",
|
|
"FRAME AT ALL. The oracle measures a 0.17-0.23 s plateau there. I had recorded",
|
|
"the miss as '0.03 s, probably an artefact of the bound I composed', and the",
|
|
"Decoder agreed; we were both wrong. The bound was fine and the port was",
|
|
"missing a fifth of a second of black.",
|
|
"",
|
|
"Delete this the day a screen's own transition quad supplies it on the boot",
|
|
"path too."
|
|
]
|
|
}
|