BLOCKED said the record-layout change touches five things: pose_at, settle_units, spin_period_units, exit_ramp_units and the plate. I checked two, reported that, and did not work the rest of the list. `spin_period_units` required "the first timed and the second untimed". Under the corrected layout the ring reads t=0 rot=0 and t=120 rot=360 -- both timed -- so the rule returned 0 and THE FOCUS RING STOPPED SPINNING. Nothing reported it: a period of 0 is a legal "this element does not spin". Rewritten to take the SPAN between the two poses: 120 - 0 = 120 units, the same number the old rule produced, which is evidence the corrected layout is self-consistent rather than merely different. Verified the way P5 verified it, by bit-identity one period apart on the ring's own 60x60 box so the ptloop sweeps cannot confound it: 0 at +120 units (twice), 8.61 at a quarter period, 8.88 at half. Three wrong instruments on the way, and the sequence is the lesson. A whole-frame `max` saturates on one rotating edge (adjacent frames scored 131 with a mean of 0.022). A live --menu filmstrip jitters by up to a frame, which is ~3 degrees of ring. And a whole-frame comparison is dominated by the sweeps, which move 480 px over one ring period. `--focus=<id>` was added so a --screen run can draw a focus record deterministically, which is what made the check reproducible. THE PLATE'S PERIOD IS NOW 105, THE DISC'S OWN GROUP LENGTH, and it disagrees with the measurement. The ambiguity the entry carried is gone -- it used to say the cycle might restart at t=6 rather than 0 and that nothing separated them; the group now runs t=0 to t=105, both at alpha 0, and there is one reading. But 105 units is 1.750 s, or 1.906 s scaled by the factor the ring shows between its declared 120 and its measured 2.177 s -- about 17% below all four corpus timings (2.12 / 2.19 / 2.34 / 2.31). The old 129 gave 2.34 s, at the top of the range, which is why it looked right. 129 was the last timed keyframe plus exit_ramp_units, and that constant is deleted. A period built on a constant that no longer exists cannot stay even though it fitted better, so the port ships the disc's number and says it is wrong. Verified bit-identical 105 units apart, 0.83 at 30 units. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
122 lines
6.4 KiB
JSON
122 lines
6.4 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 not needed. A screen's dwell is its OWN keyframe group: the",
|
|
"publisher wordmark reaches its hold at t=235 (3.92 s) and the developer logos",
|
|
"at t=190 (3.17 s), both read from the disc. Adding a hold on top of that would",
|
|
"be inventing a number nobody measured, so the sequencer holds for zero extra",
|
|
"time and the pacing you see is the disc's own.",
|
|
"",
|
|
"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": 105,
|
|
"kind": "chosen",
|
|
"why": [
|
|
"105 units = the element's own group, start to end, under the CORRECTED record",
|
|
"layout: its keyframes now run t=0 (alpha 0x00) through t=105 (alpha 0x00), a",
|
|
"closed cycle with every pose timed.",
|
|
"",
|
|
"IT WAS 129, AND THAT NUMBER IS NOW INDEFENSIBLE: it was the last timed",
|
|
"keyframe (105) plus `exit_ramp_units` (24), and exit_ramp_units has been",
|
|
"DELETED because the untimed final keyframe it stood for does not exist. A",
|
|
"period built from a deleted constant cannot stay.",
|
|
"",
|
|
"GOOD NEWS: the ambiguity this entry used to carry is GONE. It said the cycle",
|
|
"might restart at the group's first keyframe (t=6) rather than at 0, giving 123",
|
|
"units, and that nothing separated them. Under the corrected layout the group",
|
|
"starts at t=0 and ends at t=105, both at alpha 0. There is one reading.",
|
|
"",
|
|
"🔴 BAD NEWS, AND IT IS NOT PAPERED OVER: 105 units DISAGREES WITH THE",
|
|
"MEASUREMENT. The corpus timed the pulse four times at 2.12 / 2.19 / 2.34 /",
|
|
"2.31 s. 105 units is 1.750 s at 60 units/s. Scaling by the same factor the",
|
|
"ring shows between its declared 120 units and its measured 2.177 s (x1.089)",
|
|
"gives 1.906 s -- still about 17% below every measured value. The old 129 gave",
|
|
"2.34 s, at the top of the range, which is why it looked right.",
|
|
"",
|
|
"The port ships the DISC's number and says it is wrong rather than keeping a",
|
|
"number that fitted the measurement but was built on a constant that no longer",
|
|
"exists. WHAT WOULD RESOLVE IT: whether the group loops from its start at all,",
|
|
"or holds at alpha 0 between cycles. Raised with the Decoder 2026-08-29."
|
|
]
|
|
}
|
|
},
|
|
"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."
|
|
]
|
|
}
|