Files
Sylpheed/authored/timing.json
Sylpheed port agent b366e404ee port: the clock freezes at settle -- my window is the game's, and the boot is known too fast
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
2026-08-29 21:24:10 +00:00

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."
]
}