Files
Sylpheed/authored/timing.json
Sylpheed port agent 7844bf5681 port: audit what rests on a single draw-stream run; black_hold_units=9 sits at the top of its range
Their ARM=early disclosure (~40% silent trigger loss) makes every draw-stream
figure n=1. Exactly one port constant depends on one: the black hold. Three of
its supports have moved -- the 105-frame count they revised to 114, the 2.231
corroboration they retracted, and a run-average rate now known to drift 33%.

Redone on their corrected segments the two runs give 8.95 and 6.71 units, not
one number: overlapping +/-1 error bars are not agreeing central values when one
frame is a third of the quantity. Range ~6.5-9.2, port at the top.

Value UNCHANGED and proposed rather than adopted -- it would be my arithmetic on
their instrument. Filed with the single run that would settle it.

Also checks their statistics: per-boot excesses reproduce exactly, and their
2.3 sigma uses population SD where sample SD gives 1.89 -- cutting against their
own concession. Neither framing reaches significance.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
2026-08-29 21:43:02 +00:00

223 lines
12 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 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 — 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."
]
}