Two milestones' known-wrong bits, both now answered by the RE agent, both taken. P5 -- the focus ring. It was drawn at 0 with a comment saying so. The period is now measured (continuous spin, eight evenly spaced autocorrelation peaks over nine revolutions, no angle estimated anywhere) and it needs NO authored constant: the period is the element's own declared t=120, and what the measurement adds is only that the turn repeats rather than stopping -- which "groups hold" could not decide, because 0 and 360 are the same pose. `spin_period_units` is structural and narrow on purpose: two keyframes, differing in nothing but rotation_deg, by a full 360, first timed and second untimed. 16 of 212 elements in this export match and all 16 are focus rings, zero false positives. That check is the point -- the measurement was taken on ONE button of ONE screen, and a rule that caught anything else would be extrapolating it to elements nobody watched. Verified on the port's own render with the RE agent's own control: bit-identical one period apart across the whole frame, 3.6/255 inside the ring's box at quarter-period steps, and box luminance conserved to 0.027 % over eight phases -- which is the observable they used to separate rotation from a pulse. Not claimed: direction (no signed angle was ever measured) and phase across a focus change (their run held focus throughout). P3 -- the plate. Last iteration I refuted their authoring instruction and shipped it anyway rather than pick between two of their numbers. The refutation held and the answer came back better than either option I offered: AUTHOR NOTHING. Both builds run on one clock started together and the plate arrives at its own declared t=238. The 2.13 s constant is deleted. The premise that failed was mine: rest.t IS NOT WHEN A SCREEN SETTLES. It is the last hold keyframe before the exit. ptlogo1 stops MOVING at t=42 and then creeps 5 px and 31 alpha steps to t=251. Reading rest.t put build 4's arrival at 4.350 s instead of 1.967 s, and the "2.51 s, which is not a landmark of anything" I sent them is that error wearing a decimal point. 238 - 118 = 120 units = 2.000 s against a measured 2.135 s at 28.1 fps presentation. Checked against my own export before touching anything. `ScreenView.settle_time()` still uses rest.t, and so the boot sequencer paces every screen off the wrong landmark. NOT changed here: "visible arrival" is a heuristic and getting it wrong re-paces everything. Filed, and asked for a timed boot instead now that their oracle is live. REFUTATION: two of their pages measure the same declared 120 units of wall clock during a static hold and disagree by 2 % -- plate 2.135 s (28.10 fps implied), ring 2.177 s (27.56 fps). That is seven times the plate page's own 6 ms run-to-run agreement, and it lands on the argument that page uses to justify itself: "the build-in is where frames are dropped; the static hold is not". Also the ring page's band, 27.6-28.8 fps, does not contain its own measurement -- the mean needs 27.56 and four of seven spacings are outside. Filed, not worked around: my port uses the declared 120 units either way. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WM5XL4HfrHuxz8RiMWdCMC
179 lines
13 KiB
JSON
179 lines
13 KiB
JSON
{
|
|
"format": "sylpheed.flow/1",
|
|
"_": [
|
|
"The boot sequence. AUTHORED, and it has to be: HANDOFF Q6 closed this with a",
|
|
"negative -- the order is in none of the four places it could have been. It is",
|
|
"not in config.ini's empty [SYSTEM], not in the movie manifest (which carries",
|
|
"assets, not transitions), not in a persistent GamePart field (the requested id",
|
|
"lives only as a stack argument in flight), and `GP_ADVERTISE_DEMO` has zero",
|
|
"xrefs of any kind. A transition is a call with a name argument, chosen by code.",
|
|
"",
|
|
"So this file REPRODUCES AN OBSERVATION. The sequence below is what the RE",
|
|
"agent watched the game do, not what any file on the disc says it does. Nothing",
|
|
"here may be presented as decoded."
|
|
],
|
|
"boot": [
|
|
{
|
|
"screen": "publisher_logo",
|
|
"why": "The SQUARE ENIX wordmark is the first thing the boot shows -- RE agent, 2026-08-29. Entry 10 of the pair; 13 is its region twin and the port shows one, not both."
|
|
},
|
|
{
|
|
"screen": "developer_logos",
|
|
"why": "GAME ARTS / SETA / studio anima, after the publisher wordmark. HANDOFF Q2."
|
|
},
|
|
{
|
|
"video": "ADV",
|
|
"why": "HANDOFF Q9, DECODED from the movie manifest: ADVERTISE_MOVIE -> ADV.wmv, and the boot intro and the attract movie are the SAME asset -- there is no separate boot slot. Its POSITION here (after the developer logos, before the title) is measured, not decoded: it is the order the RE agent watched the game boot in.",
|
|
"skippable": true,
|
|
"skippable_why": "HANDOFF Q9: one (A) press skips a movie -- measured, title reached at 57 s against a 193 s baseline."
|
|
},
|
|
{
|
|
"screen": "title",
|
|
"overlay": {
|
|
"screen": "press_start",
|
|
"clock": "shared",
|
|
"why": "MEASURED, 2026-08-29, docs/re/title-plate-delay-measured.md on branch auto/no-disc-and-menu-captures at 5b0a6e6 (NOT on main when this was written). The boot title shows build 4 ALONE and the `PRESS (A) BUTTON` plate -- build 2 -- arrives later. This is the ONE case in the port where two builds are drawn at once.",
|
|
"no_constant_why": "THERE IS NO AUTHORED DELAY HERE, AND THERE WAS ONE FOR ONE ITERATION. The first version of this block carried `after_settle_seconds: 2.13`, taken from the RE agent's instruction. The port refuted that instruction with arithmetic off the disc -- build 2 has a group of its own, and starting it at settle put the plate 3.97 s late -- and the corrected answer needs no constant at all: BOTH BUILDS RUN ON ONE CLOCK, STARTED TOGETHER, and the plate arrives at its own declared t=238. `clock: \"shared\"` is that, spelled out rather than implied by the absence of a delay field.",
|
|
"arithmetic_why": "Why one clock reproduces the measurement, checked against this export rather than taken on trust: build 4's visible build-in ends at t=118, where `pteff01`, `pteff02` and `ptlogoall_eff` finish together; `ptbtn00` reaches alpha 255 at t=238; the difference is 120 units = 2.000 s at 60 units/s. The oracle measured 2.138 s and 2.132 s. The gap is presentation rate: 120 units in 2.135 s is 56.2 units/s, i.e. the emulator presenting at 28.1 fps against a nominal 30, and the corpus had independently measured the idle title at 28.5 fps before these runs.",
|
|
"the_premise_that_failed_why": "The port's own, and it is worth keeping because it will bite again: `rest.t` IS NOT WHEN A SCREEN SETTLES. It is the last hold keyframe before the exit. `ptlogo1` has rest.t=251 and stops MOVING at t=42, then creeps 5 px and 31 alpha steps over the next 209 units. Reading rest.t as the settle put build 4's arrival at 4.35 s instead of 1.97 s, and every reconciliation computed from it came out wrong by exactly that error. `ScreenView.settle_time()` still uses rest.t -- see docs/port/BLOCKED.md.",
|
|
"scope_why": "Attached to the BOOT STEP, not to the `title` screen, and that is deliberate. What was measured is the boot title. Whether the title shows the plate when it is REACHED AGAIN -- by (B) from the main menu, or after the attract movie -- is not measured, and putting the overlay on the screen would quietly claim it is.",
|
|
"no_pulse_why": "The port draws the plate arriving and then holding. It does not pulse it. The RE agent identifies the pulse as the plate's FOCUS RECORD `ptbtn00f` -- a glow ramping 0x00 to 0x50 and back, t=6..105 -- not as a loop of `ptbtn00`'s own group, which was the port's earlier reading and was wrong. Looping that record is a candidate the port has NOT taken: its group is 105 timed units plus an AUTHORED 24-unit exit ramp, and hitting the measured 2.24 s mean requires composing that authored constant with a loop assumption, which is tuning rather than measuring. Filed in BLOCKED.md."
|
|
},
|
|
"why": "HANDOFF Q2/Q6: the boot reaches the title after the intro movie. This is the LAST step, and a last step is where the sequence stops rather than fading out -- a boot that ends by fading to black looks like a boot that crashed. P5 gave the title somewhere to go, but that is a HANDOVER and not another boot step: `--boot` still stops here, and `--boot --play` hands the same held title to the menu flow, where (A) opens TITLE_MENU. Kept as a stop rather than folded into `screens` because what the boot does is authored from a measured sequence, and what (A) does is a separate measurement."
|
|
}
|
|
],
|
|
"dwell": {
|
|
"_": [
|
|
"DELIBERATELY EMPTY. Each 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. Holding beyond that would",
|
|
"be a number nobody has measured, so the sequencer holds for zero extra time",
|
|
"and the pacing is the disc's own.",
|
|
"",
|
|
"When a capture times the real boot, the extra hold per screen goes here."
|
|
]
|
|
},
|
|
"navigation": {
|
|
"_": [
|
|
"MEASURED off the running game, HANDOFF Q5 -- none of it is on the disc.",
|
|
"It lives here rather than in GDScript so that a reader can see it is a",
|
|
"measurement and delete it the day a field on the disc states it."
|
|
],
|
|
"wrap": true,
|
|
"wrap_why": "HANDOFF Q5: up/down move one item and WRAP at both ends. Measured on the 5-item main menu AND the 3-item EXTRAS, so it is a menu rule and not a per-screen one (docs/game/navigation.md, branch auto/no-disc-and-menu-captures 3a87a26).",
|
|
"left_right": "nothing",
|
|
"left_right_why": "HANDOFF Q5: left/right do nothing. Measured. Implemented as an explicit no-op rather than by omission, so that 'we never wired it' and 'the game ignores it' are distinguishable in the code.",
|
|
"input_during_transition": "ignored",
|
|
"input_during_transition_why": "AUTHORED, and NOT measured -- nobody has watched what the game does with a button pressed mid-fade. Ignoring is the choice that invents the least: it cannot queue a press the game might have dropped. Ask the RE agent before relying on it."
|
|
},
|
|
"screens": {
|
|
"_": [
|
|
"What each button does. The NAVIGATION ORDER is not here -- it is derived,",
|
|
"in each screen file's `buttons` (button-role elements sorted by resting Y).",
|
|
"Only the destinations, the initial focus and the cancel target are",
|
|
"authored, because only those are measurements or decisions.",
|
|
"",
|
|
"`goto` is an EXPORTED SCREEN NAME or null. `goto_name` is the game's own",
|
|
"screen vocabulary from the decoded transition lookup -- carried so the",
|
|
"binding is not lost, and marked below as the NAME MATCH it is, never as a",
|
|
"measurement (HANDOFF: the strings are what the call sites reference, not",
|
|
"proven arguments, and the same list mixes in TEXT_FONT and GAMMA_RGB).",
|
|
"",
|
|
"`goto: null` with a `blocked` note means the destination screen is real and",
|
|
"measured but is NOT IN THIS EXPORT -- it lives in another archive. That is a",
|
|
"milestone boundary, not an unknown."
|
|
],
|
|
"title": {
|
|
"on_accept": {
|
|
"goto": "main_menu",
|
|
"goto_name": "TITLE_MENU",
|
|
"goto_name_kind": "name match, not measured",
|
|
"why": "MEASURED, HANDOFF: (A) on the title opens the main menu, with (A) on the boot title as the control in the same run."
|
|
},
|
|
"on_cancel": null,
|
|
"on_cancel_why": "MEASURED, HANDOFF Q5: (B) on the title does nothing."
|
|
},
|
|
"main_menu": {
|
|
"initial_focus": "ptbtn01",
|
|
"initial_focus_kind": "authored",
|
|
"initial_focus_why": "AUTHORED, standing in for HANDOFF Q5, which measured that initial focus is NOT STABLE: four boots of the same harness opened on TUTORIAL, TUTORIAL, NEW GAME, NEW GAME. A port has to open on something. ptbtn01 (NEW GAME) is picked because it is one of the two states actually observed and it is the top item, so a reader can predict it. It is a CHOICE. Delete this the day the RE agent finds what selects it.",
|
|
"on_cancel": {
|
|
"goto": "title",
|
|
"goto_name": "TITLE_SCREEN",
|
|
"goto_name_kind": "name match, not measured",
|
|
"kind": "authored -- likely but UNPROVEN",
|
|
"why": "HANDOFF Q5 states (B) on the main menu returns to the title. That is the ONE navigation rule on this screen with no capture behind it: it was seen once, without a capture, and the title also returns on its own after ~8-10 s idle, so an observer could not have told the two apart (docs/re/menu-navigation-semantics.md). Independently, the main menu is the ONLY screen whose footer does not advertise (B) -- confirmed here from the disc art, see docs/port/DECISIONS.md. The port implements it because a menu with no way out is worse than a menu with a plausible one, and records that it is authored."
|
|
},
|
|
"buttons": {
|
|
"ptbtn01": {
|
|
"label": "NEW GAME",
|
|
"goto": null,
|
|
"goto_name": "DIFFICULTY",
|
|
"goto_name_kind": "name match, not measured",
|
|
"blocked": "DIFFICULTY is not in this export. MEASURED destination (EASY/NORMAL/HARD/BACK, opening on NORMAL, then SELECT DATA) but it is not a GP_TITLE build, so there is no screen file to go to yet."
|
|
},
|
|
"ptbtn02": {
|
|
"label": "LOAD GAME",
|
|
"goto": null,
|
|
"goto_name": null,
|
|
"blocked": "The save-slot list is GP_SAVE_LOAD, not in this export. Destination MEASURED."
|
|
},
|
|
"ptbtn03": {
|
|
"label": "TUTORIAL",
|
|
"goto": null,
|
|
"goto_name": "TUTORIAL_MENU",
|
|
"goto_name_kind": "name match, not measured",
|
|
"blocked": "The lesson list is not a GP_TITLE build. Destination MEASURED."
|
|
},
|
|
"ptbtn04": {
|
|
"label": "OPTIONS",
|
|
"goto": null,
|
|
"goto_name": null,
|
|
"blocked": "The settings menu is GP_OPTIONS, not in this export. Destination MEASURED."
|
|
},
|
|
"ptbtn05": {
|
|
"label": "EXTRAS",
|
|
"goto": "extras",
|
|
"goto_name": "EXTRA_MENU",
|
|
"goto_name_kind": "name match, not measured",
|
|
"why": "MEASURED, HANDOFF Q4: EXTRAS opens GP_TITLE build 6. It is the ONLY main-menu destination inside this archive, and therefore the only (A)-into-a-submenu the P5 gate can actually walk."
|
|
}
|
|
},
|
|
"labels_why": "The five labels are read off live-main-menu.png, a capture of the running game (docs/game/navigation.md, branch auto/no-disc-and-menu-captures 3a87a26). They are carried for logs and for a human reading this file; nothing draws them -- the button sprite already has its own text."
|
|
},
|
|
"extras": {
|
|
"initial_focus": "ptbtn11",
|
|
"initial_focus_kind": "measured",
|
|
"initial_focus_why": "MEASURED, unlike the main menu's: EXTRAS opens focused on MISSION SELECT (live-extras.png). It is authored here only because there is nowhere else to put a measurement -- it is not a choice.",
|
|
"on_cancel": {
|
|
"goto": "main_menu",
|
|
"goto_name": "TITLE_MENU",
|
|
"goto_name_kind": "name match, not measured",
|
|
"why": "MEASURED, HANDOFF Q5: (B) goes up one level and RESTORES FOCUS to the item you came from. EXTRAS advertises (B) in its own footer -- the red glyph is in ptmsg2.png and absent from the main menu's ptmsg.png."
|
|
},
|
|
"buttons": {
|
|
"ptbtn11": {
|
|
"label": "MISSION SELECT",
|
|
"goto": null,
|
|
"goto_name": null,
|
|
"blocked": "The stage list is GP_MISSION_SELECT, not in this export. Destination MEASURED."
|
|
},
|
|
"ptbtn12": {
|
|
"label": "MOVIE THEATER",
|
|
"goto": null,
|
|
"goto_name": null,
|
|
"blocked": "NEVER OPENED. docs/game/navigation.md marks this one unknown -- not merely unexported. Do not assume it opens GP_MOVIE_THEATER; that would be a name match dressed as a destination."
|
|
},
|
|
"ptbtn13": {
|
|
"label": "BACK",
|
|
"goto": "main_menu",
|
|
"goto_name": "TITLE_MENU",
|
|
"goto_name_kind": "name match, not measured",
|
|
"same_as_cancel": true,
|
|
"why": "MEASURED: EXTRAS' third item is BACK (live-extras.png). Treated as (B): it pops the stack, so focus is restored on the main menu exactly as (B) does. Whether the game distinguishes them is untested and there is no reason here to invent a difference."
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|