Commit Graph

1387 Commits

Author SHA1 Message Date
sylph-decoder
2ea27122ba re: enumerate an element's records; focus_link is a misnomer
Adds examples/element_records.rs, which lists leaf AND focus_link records
for an element, plus a disc-wide census. Built because I claimed alpha 80
was undeclared after reading one of ptbtn00's two records -- and focus_link
was already parsed, with ui_layout.rs:424 already documenting the focus
record. The format was known and I did not consult it.

Census: 1467 of 15493 elements (9.5%) across 815 builds carry a second
record whose keyframes are invisible to a by-name leaf lookup.

Refutes our own parser's description of the field. It is documented as "the
focused state of a button", but GP_TITLE has pgloading_loop1 -> loop3 ->
loop4, a chain of three loop animations, and ptloop01 -> ptloop02, the two
sweeps. Neither is a focused state. Naming defect only -- behaviour is right
where it is read -- so not renamed here.

🟡 Notes a better candidate for why the two sweeps share one indices=8 draw:
they are linked, not merely co-textured. Testable on the pgloading chain,
which needs a loading-screen capture I do not have. Named, not claimed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-03 20:55:12 +00:00
sylph-decoder
374a8e2523 re: RETRACT the alpha-80 refutation -- it is declared, in ptbtn00f.rat
I claimed ptbtn00f's peak alpha of 80 was capture-only and refuted the
port's audit with it. Verified on the disc myself: ptbtn00f.rat, loop 120,
eight keyframes 0:0 6:6 29:74 35:80 50:80 58:74 97:6 105:0. ptbtn00 carries
TWO child records -- the leaf ptbtn00.rat (flat 255, which I read and
described correctly) and the focus record ptbtn00f.rat, which holds the
pulse. My "nothing declares 80" said only that nothing reached my
enumeration. METHOD.md has five entries on exactly this class.

Resolves the 🟡 with it: the corpus line attributing the 120-unit loop to
ptbtn00f is correct as written.

Turns the retraction into a stronger check. The amplitude is declared, so
check_labels.py now verifies the SHAPE: mean |alpha| error 1.14 levels (f6)
and 0.35 (f6b) against the declared 8-key curve. The first version assumed
the onset frame was t=0 and f6b FAILED at 3.24; the fix was aligning by
content rather than loosening the tolerance, since the 6->74 segment climbs
~6 levels per frame. Best lag is ~1 frame in both runs -- the element is not
drawn while its curve sits at alpha 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-03 20:31:58 +00:00
sylph-decoder
9999a77e03 tools+re: a check that reads the label, and the alpha-80 refutation
Three of my errors were the label rather than the measurement, and a
correction in one document did not reach the next page I wrote. The port
built check-authored-vs-declared for values the disc can arbitrate and named
the gap: capture-only values that name an element rest entirely on my label.
check_labels.py closes that for the cases where the identification was
itself made by matching a declared quantity -- 8 checks over two captures,
all passing, with a --selftest that points the plate label at ptcopyright
(the real error) and must fail. It does, at 82-83% against a 5% tolerance,
with the other checks still passing so the failure is localised.

Refutation of the port's "all five figures are also declared": lands for
one. ptbtn00f's peak alpha of 80 is not declared anywhere -- ptbtn00.rat's
parent peaks at 255 and its leaf is one keyframe at 255 flat, with the
120-unit loop declared but no amplitude. The period checks out; the
amplitude is capture-only and their check cannot see it.

Opens a 🟡 not mine originally: the corpus attributes the 120-unit loop to
ptbtn00f, but it belongs to ptbtn00.rat whose leaf is ptbtn00.t32. Left
uncorrected since the identification rests on the period, which holds under
either name.

Adds examples/leaf_keyframes.rs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-03 20:28:37 +00:00
sylph-decoder
874c82900e re+handoff: correct F6's separation -- it was measured against ptcopyright
The F6 page measured the sweep-to-plate separation against ptcopyright and
called it the plate. I had already established, on another page, that
ptcopyright is NOT the plate -- ptbtn00f is. Against the real plate the lead
is 83 and 165 frames, i.e. 0.138 and 0.141 of a sweep loop (2.2% apart),
against the 0.057 I published and sent to the port.

The conclusion is unchanged and stronger: with no input the glow precedes
the plate by 2.4x more than reported, and with A it still collapses to
essentially zero (-1 frame). Gating the sweep on the plate is a worse fit
than I made it sound.

Third instance of a label being the error rather than the measurement, and
this one is the same label I had already corrected elsewhere -- the
correction did not propagate to a page written after it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-03 20:24:00 +00:00
sylph-decoder
6fbe9e7f6b handoff: F5 code route attempted and not settled; no literal snap target
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-03 19:54:21 +00:00
sylph-decoder
a274eb0d8a re: F5 code route -- not settled, plus a bounded negative on literal targets
The brief asks for two routes and I had only run the capture. This runs the
code route far enough to record an honest failure: the title's phase 2 and 3
handlers dispatch through vtables on nearly every branch, so finding the
clock write statically needs indirect-call resolution this container does
not do cheaply.

What the scan does establish: over 0x821C4000-0x821CD000 there is no
`li rN,<v>` for any v in 160..250, against a control of 684 li instructions
in the same range. So the snap target is computed or data-derived, not a
literal in the title's code.

Refutation aimed at my own capture result: a literal would have NAMED the
target and refuted "unpinnable from any capture". None exists, so that claim
survives and gains a second reason.

Names the instrument that would settle it: a write-watch on the clock field
in Canary, which would also close "which function advances the clock".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-03 19:54:10 +00:00
sylph-decoder
e60d600999 re: record the failed refutation, and that the batched-draw trap recurred
The refutation aimed at the port did not land -- they already run two
timelines, measured on their side (72.6/552.6 against declared 73/553 over
17748 samples), the right instrument for a question about their own
renderer. Recorded as an attempt that failed; still worth making, since they
report they would otherwise have asserted it from the code.

Also notes in METHOD.md that the batched-draw trap produced a THIRD wrong
finding with the entry already written. Two sections of that file and a
REFUTED.md line already said a draw carries more than one quad. The lesson
is not the fact but that a reader written before consulting the file
reproduces the bug the file exists to prevent.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-03 19:40:00 +00:00
sylph-decoder
8c0f7a897f handoff: two sweeps loop 720:600; the open period is closed
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-03 19:24:06 +00:00
sylph-decoder
e3f665d391 re: confirm the two sweeps loop at 720:600, and close the open period
Pre-registered 1.2000 from the declared leaf loops before measuring.
Measured 1.1967 (0.28%) in f6b and 1.1841 (1.33%) in f6, as a ratio inside
each capture so no clock enters -- which is why runs differing 2x in frames
agree. f6b happens to pace at one frame per leaf unit: 600 frames for 600
declared units, 718 for 720.

First test pteff03a's declared timeline has ever had. It could have failed
against me: the flattering reading of unit 11's batched draw is one
traveller driving both quads, which gives equal periods. It does not.

Also closes "one wrap per capture, period not obtained", which has been open
all week -- both leaves give a complete boundary-to-boundary cycle in both
existing logs. The truncating reader saw one quad, so it could see only one
of the four cycles already on disk.

Refutation aimed at the port: running both leaves at one rate leaves the
strips locked and drifting ~118 units per cycle from the game.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-03 19:23:55 +00:00
sylph-decoder
a0be4ed012 re: pre-register the two-leaf period ratio before measuring
pteff03a's declared timeline has never been checked against a capture. The
leaves declare 600 and 720 units, so the periods must differ by 1.200 within
a single capture. Equal periods is the flattering-but-wrong outcome the
batched-draw reading could have produced.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-03 19:22:37 +00:00
sylph-decoder
b9051e37e8 handoff: 0x3003 is 0x3002 parented; kind bit 0 decoded disc-wide
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-03 19:19:54 +00:00
sylph-decoder
040008244f re: decode kind bit 0 as "has a parent" -- 0x3003 IS 0x3002, parented
The port is blocked on what 0x3003 is, having only 0x3002 in its menu-item
rule. The two differ in bit 0 alone. Disc-wide over every .pak: kind&1 ==
has_parent agrees on 15493 elements with 0 counterexamples -- 192/192 for
0x3003, 778/778 for 0x3002, and the same for every other kind. The flag is
exactly redundant with the +32 parent field.

So the bit that differs carries no role information: 0x3003 is a 0x3002
button record that is parented. That replaces the port's circumstantial case
with the field, which is what they asked for rather than a widened rule.

Flags what this does NOT license: it is not a decode of "is a menu item",
and 0x73002/0x73003 (160 elements) carry an undecoded 0x70000 that any
mask-based rule silently decides about.

Adds examples/kind_bit0_census.rs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-03 19:19:44 +00:00
sylph-decoder
a8b58dfdb1 handoff: F6 closed -- do not gate the sweep on the plate
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-03 19:13:06 +00:00
sylph-decoder
eea55b9900 re: F6 -- the human is watching their own A press, not a declared keyframe
The brief asked which of two declared events the human sees. Neither. With no
input the sweep pair enters 34 frames (f6b) and 67 frames (f6) before
ptcopyright -- 0.057 of a sweep loop in both, agreeing to 1.2% across runs
that differ 2x in frames. With A pressed during the build-in the separation
is 2 frames.

A reveals the plate and restarts both sweep leaves at t=0 in the same frame,
so a player who presses A sees them start together and reports exactly that.
The control that makes it an explanation: in the late-press run A landed
after the sweep had already started naturally and the two are 29 frames
apart -- same input, opposite result, decided by when the press falls.

Consequence for the port: do NOT start the sweep with the plate. That fits
one boot and breaks the other. The declared gate plus the snap restarting
leaves produces both observations with nothing authored.

Refutation attempt: looked for a case where the port's current behaviour
fails against these four captures; found none.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-03 19:12:55 +00:00
sylph-decoder
f7a30548cc handoff: F5 snap target undecidable within [160,238); the port's 236 is free
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 21:37:29 +00:00
sylph-decoder
b991a3f611 re: F5 snap target is [160,238) and cannot be pinned from any capture
ptcopyright goes absent -> 255 in one frame at the snap, skipping its
declared 138->160 ramp, so t>=160; the sweeps are still at 255 so t<238.
Its identification is measured: in the control it first draws at t~143 and
reaches 255 at t~164 against a declared 138->160.

It stops there for a reason worth recording. Every build-4 element with a
key past t=100 holds a constant pose across [160,238) -- their intersection
is exactly that window -- so the game draws a bit-identical frame at t=160
and t=236.

Refutation attempt on the port's 236.0: not merely survives, it can never be
confirmed or refuted by capture. Every value in the window is
observationally identical, and it stays that way because the clock freezes
at settle and the exit ramp plays on leave rather than on a timer.

Classified undecodable-with-reach so nobody spends another run on it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 21:37:19 +00:00
sylph-decoder
8fda94c43f handoff+re: correct unit 10's quoted range; pulse ratio verified
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 21:10:45 +00:00
sylph-decoder
8cc38ee16e re: re-run the two findings resting on the truncating reader
Pulse ratio HOLDS: 0.1000 (f6b, 16 clean cycles) and 0.0993 (f6). 60 leaf
units = 120 title units = ptbtn00f's declared loop. The independent leg
under leaf/title = 0.5 stands.

Unit 10's conclusion survives but MY NUMBERS WERE WRONG. I quoted
254.0-256.9 / 253.9-254.9 as the implied parent's range; those were the rows
I had printed, every 20th frame, not the series. Real first-cycle figures
are 250.9-260.5 (f6, n=1128) and 253.1-255.0 (f6b, n=560).

Post-wrap the spread widens to 237-283, but only in f6 -- the run with
dropped frames -- while f6b holds at median 254.3. That is my linear phase
model drifting, not the parent varying; a parent that varied would degrade
in both.

Same shape as an error already in my record: a printed subset doing the work
of the population.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 21:10:31 +00:00
sylph-decoder
cc86a536f2 handoff: F5 verified with the full-quad reader; snap restarts both leaves
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 21:07:07 +00:00
sylph-decoder
e3d76fe397 re: F5 survives the full-quad reader, measured rather than asserted
Last iteration I asserted F5 was unaffected by the truncating-reader bug
because it compared like with like. Asserting that is the move that produced
the bug, so this measures it. The new reader sees 9.7 quads/frame vs ~7.5.

Scalar that needs no element identification: quads mid-ramp (0<a<250) per
frame goes 6,4,4,4,2,1,4,3 -> 0 at f436, while the control never reaches 0
anywhere in 48 frames of build-in. One frame with nothing part-way through a
ramp is the cut.

Bonus the old reader could not show: both sweeps enter at f436-438 at their
declared opening alphas -- pteff03 at 255, pteff03a at 1,2,3,4,6,11,17 from
its declared 0.

Refutation attempt on the port's "clock jumps to 236.0": tried and failed.
My bound is [100,238), which contains 236 -- consistent, not independent
confirmation.

Adds tools/re-capture/read_draws.py so the truncating regex is not re-rolled.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 21:06:55 +00:00
sylph-decoder
1acdb004b6 handoff: pteff03a IS drawn -- keep both sweeps; units 5 and 6 refuted
Also notes that REFUTED.md L170 already recorded a draw carrying two rotated
parallelograms, so the general fact was written down before my reader
contradicted it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 20:39:00 +00:00
sylph-decoder
33e3c40a2d re: REFUTE my own units 5 and 6 -- pteff03a IS drawn, the reader was truncating
The two sweeps are batched into ONE additive indices=8 draw, two quads, and
my parser took the first v: match per line and discarded the rest. Every
analysis saw quad A and never quad B. No new capture was needed -- the same
logs units 5 and 6 used already contained it.

Both strips measured: opposite directions matching the declared -639->1521
and 1721->-839, and a size ratio of 1.301 against the declared sy ratio
800/600 = 1.333.

Unit 5 recorded that the PORT's renderer draws pteff03a and treated that as
the port being wrong. The port was right.

Third instance of this class in the corpus (palogo_anima and the six-quad
dump are the others): a truncating reader yields a clean, complete-looking
negative. Reading one raw draw line in full would have caught it -- indices=8
was printed on every line and says two quads outright.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 20:38:29 +00:00
sylph-decoder
adc7fe647c handoff: clock conflict resolved -- ptcopyright not the plate; rate 0.5 x3
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 20:20:05 +00:00
sylph-decoder
79c5b7f99f re: the pulsing element IS ptbtn00f, and the 1.7x clock conflict was mine
Phase-free: the pulse is exactly 1/10 of the sweep's 600-unit loop -- f6b
gives 60.0 frames over 16 cycles with zero variance against a 600-frame
sweep. 60 leaf units x the independently measured leaf/title = 0.5 gives 120
title units, ptbtn00f's declared loop exactly. That is also a third
independent route to the 0.5 ratio, from an unrelated declared quantity.

And it resolves the conflict I have been flagging on three pages. The quad I
called "the plate" at x=-0.54 is ptcopyright: its fade-in is 21-22 title
units under both agreeing calibrations, matching ptcopyright's declared
22-unit ramp, not the plate's 12. The plate is the pulsing element. Two
elements, one label, and I checked the label -- there was never a clock
conflict. Retires the 🟡 on every title-unit figure across three pages.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 20:19:53 +00:00
sylph-decoder
b514bfc06d handoff: correct F5 -- keep clock:"shared", A advances it to the settle
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 20:11:12 +00:00
sylph-decoder
630a4a2af8 re: CORRECT F5 -- A snaps the whole title, not just the plate
The pre-registered wider test refuted my own claim. Pressing A at the
sweep's gate instead of 40 frames later leaves ~40 frames of artwork
animating: three elements mid-fade-in vanish in one frame and the settled
set appears at 255. The sweep enters at 255 with NO ramp where the control
ramps it 17->255 over ~15 frames, so the title clock jumped past t=100 --
and not past 250, since ptloop01's exit would have hidden the sweep.

So clock:"shared" is NOT refuted. I told the port the opposite and must
correct it.

Cause: the press takes 11-12 frames to take effect (f445->f456, f424->f436)
and my 5-frame artwork window sat entirely inside that gap. It matched the
control because the input had not been acted on yet. The window was not just
short, it was positioned where the effect cannot appear.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 20:10:59 +00:00
sylph-decoder
42f64acc27 re: pre-register the widened F5 artwork test before reading the capture
F5's artwork half rests on 5 frames. This run presses A at the sweep's gate
instead of 40 frames later, giving ~40 frames of still-animating artwork,
and states the prediction for both outcomes before the log is opened.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 20:09:04 +00:00
sylph-decoder
b5c29aa299 handoff: F5 -- A cuts the plate to final; clock:"shared" refuted
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 20:07:53 +00:00
sylph-decoder
0a2ff9f09d re: F5 -- A snaps the plate, and does NOT advance the artwork's clock
Three captures, aligned by the sweep's position rather than by frame number.
The plate's alpha goes 23,46,69,92,115,139 over ~11 frames with no input,
and 255 in a single frame when A is pressed: zero intermediate values
against eleven. A cuts, it does not accelerate -- the human's prior holds.

The control is what makes it readable. Four elements ramp out right around
the press and I could have reported that as the effect; at sweep x=-1.42 all
three runs agree quad for quad, so those exits are the ordinary build-in.

Refutes clock:"shared" on F4's own discriminator: the artwork keeps
animating across the press, frame for frame identical to the control. Reach
stated -- that half rests on a 5-frame window, since everything else on
screen is already at 255 and cannot discriminate.

Also records the first attempt's miss: blind wall-clock timing put the press
after the settle, where A is accepted instead. The probe now gates on the
sweep appearing, which is the parent's declared t=70..100 gate.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 20:07:42 +00:00
sylph-decoder
1f86df6836 handoff: F6 -- sweep gated at t=70/100, and reinstate rate 0.5
Gives the port the declared parent ramp and corrects my withdrawal of the
0.514 rate: the frames-based expression was the error, not the ratio.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 19:39:35 +00:00
sylph-decoder
fa99b5f042 re: F6 unit 10 -- the parent's declared alpha gates the sweep, and it multiplies
Build 4 declares ptloop01/02 alpha 0 until t=70, full at t=100, with 238..250
an EXIT ramp -- which answers the brief's "is 238..250 an entry or an exit"
for these elements. Builds 5/6 declare the same records flat 255, so the
build must be named before the question has an answer.

Control ran in the direction that could have flattered the hypothesis and
did not: the leaf's own alpha FALLS 255->128 where the capture RISES 8->255.
Decomposing against the leaf's declared curve leaves an implied parent that
pins at 255.0 +/-1.5 across hundreds of frames while the drawn alpha swings
242->132->145. Parent alpha is multiplied in; closes that standing 🟡.

Restores unit 8's 0.514: leaf/title = 0.4795 and 0.4667 across two runs that
differ 2x in frames. I over-withdrew it last iteration by discarding the
ratio along with the frames it had been quoted in.

Adds examples/ptloop_parent_keyframes.rs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 19:39:21 +00:00
sylph-decoder
15670f4a59 re: F6 -- correct the onset, the sweep starts MIDWAY not just before the plate
The port challenged two statements of mine as mutually inconsistent and
refused to guess which I meant. They were right to. Answering with the
clock-free quantity they proposed:

  (onset - title start) / (plate - title start) = 0.489 / 0.507  (3.7% apart)

So the onset is at the MIDPOINT. That refutes the port's implemented 0.2 and
my own summary's "shortly before the plate" (~0.85) alike.

Root cause of my error: the ratio measurement was right, but I converted it
to title units through the plate's declared 12-unit ramp and wrote the
summary from the conversion. That calibration makes title-start..plate 75
units where the data declares the plate at t=238 -- 3.2x out, not the 1.75x
this page reported. All title-unit figures withdrawn; the ratios never
needed a clock.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 19:32:01 +00:00
sylph-decoder
89b3852406 handoff: F6 -- start the sweep just before the plate, and drop my frames-based rates
Delivers the two numbers the port needs (lead 0.79-0.80 baselines, period
13.93 baselines, each reproduced across two captures) and withdraws unit 8's
0.514 units/frame: captured frames differ 1.947x between runs, which is the
size of the port-vs-decoder disagreement we had left standing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 19:21:41 +00:00
sylph-decoder
ad83664d80 re: index F6 unit 9, which closes the sweeps' unmeasured period
ui-clock-freezes-at-settle.md left the sweep period  because a validated
estimator disagreed between two dwells (515 vs 452 frames). The cause is now
measured: captured frame counts are not comparable across runs at all --
1.947x between two captures of the same animation, with the baseline moving
1.953x alongside. As a ratio the period reproduces to 0.35%.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 19:21:09 +00:00
sylph-decoder
c614f908e0 re: F6 unit 9 -- sweep period and onset, as ratios reproduced across two runs
Two captures of the same animation disagree on frame counts by 1.947x, so
frames are not comparable across runs. Expressed as ratios to a long
in-capture baseline, both runs agree: loop period = 13.93 baselines (0.35%
apart), and the sweep starts 0.79-0.80 baselines BEFORE the plate (0.9%).

This answers F6: the sweep does not start at t=0 as the port has it, nor
exactly with the plate -- it leads the plate by about 40 title units, under
a second, which is consistent with what the human reported seeing.

Surfaces a conflict rather than smoothing it: unit 8's title rate of 1.0
units/frame (from ptcopyright) and the plate's 0.571 units/frame are 1.75x
apart in the SAME capture. Either an element's declared ramp is misread or
the two are not on one clock -- the port's clock:"shared" premise. The
ratios stand without a clock; the title-unit conversions are 🟡 pending F4.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 19:20:30 +00:00
sylph-decoder
fbca63c87b re: F6 unit 9 -- wrap-to-wrap period NOT obtained, two harness failures
Unit 8's rate (0.514 units/frame) rests on one wrap, a start-to-wrap span
rather than a period. Hardening it needs a longer capture with two or more
wraps. Two attempts, both failed on the harness rather than the game.

First launch never started: the pgrep && echo || { } guard took the wrong
branch, no output directory was created and no process ran, while a stale
emulator from the previous iteration was still up. It looked like a running
capture for several minutes.

Second launch started, armed, pressed A and wrote no draw log at all --
canary.stdout stayed at 0 bytes and no xenia_re_ui_draws log appeared,
despite the script printing "armed at 8s". Likely a race with the orphaned
emulator from the first failure, not confirmed.

Unit 8's numbers are unaffected; they came from the intact f6 capture,
which is still on disk. The offset has two independent supports; the rate
still rests on a single wrap and the port should not ship on it.

The lesson, and it is the second harness failure of this shape: "armed at
8s" printed while nothing was being logged. The arming step reports success
on SENDING the keystroke, not on the logger responding -- the same silent
failure that cost the first F1 probe a run, which I "fixed" by making the
window lookup fatal. That fix was too narrow: the window was found, the key
was sent, and the log still never appeared. The check that would have
caught both is to wait for the draw log to exist and be non-empty after
arming, and abort loudly otherwise. A probe that cannot confirm its own
instrument is recording is a probe whose negatives mean nothing, and I have
now written that bug twice.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 19:09:59 +00:00
sylph-decoder
dfe8e9c1a1 re: F6 unit 8 -- the leaf's clock in title units: offset +40, rate ~1/2
The two numbers the port asked for, both from one capture so nothing
crosses runs.

Title rate, which unit 4 flagged as an assumption and is now measured:
ptcopyright declares alpha 0->255 across t=138..160, 22 units, and the
rising run is 22 frames. So 1.0000 title units per frame, with the step
agreeing independently (255/22 = 11.6 against a measured modal 12). That
also confirms the splash's 1 unit/present on a second screen, which it had
never been checked against.

Leaf rate, anchored on the wrap rather than the endpoint: first drawn at
frame 746, wraps at 1914, so 1168 frames for the declared 600-unit loop =
0.5137 units/frame. This SUPERSEDES unit 3's 0.463, which divided 540 units
by 1167 frames -- but the declared track is stationary from t=540 to t=600,
so that endpoint is where motion stops, not where the loop ends.

So: offset +40 title units (confirmed, and the title rate being 1.000 makes
frames and units interchangeable there), rate 0.514x the title's, within 3%
of exactly one half. leaf_t = 0.514 x (title_t - 40).

Flagging rather than smoothing, as they asked: the port runs the leaf
unscaled at 1.0x where this measures 0.514x, so their sweep should cross
twice too fast -- which a viewer ought to notice alongside the early start,
yet the human reports the animation looks correct. Either "looks correct"
is about the effect rather than its speed, or one of the two measurements
is wrong. My rate rests on a single wrap; a longer title capture giving a
wrap-to-wrap period would settle it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 19:06:11 +00:00
sylph-decoder
fd3d936427 re: F6 unit 7 -- the title has exactly ONE moving quad; the lights are in the texture
The port raised a real caveat: my earlier scans filtered on height (>1.2
NDC) and sample count (>=20), so a population of many small lights would
have been invisible to both by construction. Dropping both filters, over
the whole title era: 59 distinct shapes, 2 moving, 57 static, and ZERO
small moving shapes. The two moving keys are the rounding-split halves of
one element, pteff03.

So there is exactly one moving quad on the title, 883x1134 px.

That answers the human's actual uncertainty -- whether the game renders one
light per line or one light covering several close lines. It is the second:
the multiple lights are painted INTO the texture of a single large sweeping
sprite, not drawn as separate moving objects. A port reproducing "several
lights" as several elements would be modelling the wrong thing.

The port's caveat was right to raise and the check excludes the population
it warned about -- third time in this exchange that asking was worth it
even when the specific worry did not apply.

What I have NOT done, and it was the literal ask: the human asked for
screenshots and I have taken none. I answered the counting question from
the draw stream because it is the stronger instrument for how-many and
how-big -- it reads the guest's vertex buffer rather than pixels and cannot
miss a faint light. But "what do the lights look like" is a question about
an image and the draw stream cannot answer it. That remains open.

Reach: one boot, one window, every quad in the stream. Static elements are
not counted as lights -- 57 exist and some may pulse in place; this unit
counts motion, not brightness.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 18:57:07 +00:00
sylph-decoder
fb811fe0e4 re: F6 unit 6 -- pteff03a is not submitted at any size; the collapsed-scale candidate dies
Unit 5 filtered on height, so a collapsed quad would have been invisible to
it by construction. Dropping that filter: across the whole title era,
frames >=700, every quad regardless of size --

  RIGHT->LEFT travellers (pteff03a's direction):  0
  LEFT->RIGHT travellers:                         2  (both pteff03)
  static shapes:                                 10
  degenerate/collapsed quads:                     0

Not one quad travels right-to-left in the entire title era at any size, and
nothing is submitted collapsed. So pteff03a is absent from the draw stream
-- not drawn invisibly, not drawn at zero scale. That strengthens unit 5
from "no tall quad of that size" to "no quad of that motion at all".

All three candidate mechanisms are now dead: the zero-alpha skip is weak on
its own terms (explains opening frames, not a whole run), the focus/variant
link was eliminated by the port's wider survey (linked targets chain across
unrelated element kinds -- on one menu a sweep points at a button, so the
field is a chain pointer rather than a variant selector), and collapsed
scale dies here.

Recording that as the state rather than proposing a fourth candidate.
Three have been named and three have failed, two by checks that took
minutes. A fourth guess before the human's "one streak or two" look would
be guessing against an answer about to arrive for free.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 18:46:22 +00:00
sylph-decoder
3b61884d0a re: F6 unit 5 -- pteff03a is never drawn; the game shows ONE sweep, not two
Every quad taller than 1.2 NDC in the whole capture, frames 1..2499:
h=3.15 travelling left-to-right over 1754 samples (pteff03), and h=2.00
static for 54 frames (not a sweep). Nothing in pteff03a's expected band
above 3.4, and only one travelling quad in the capture at all.

pteff03a declares 800% scale against pteff03's 600%, so its AABB is ~1303
px ~ 3.62 NDC, travelling right-to-left. It is absent.

Not a windowing artefact: ptloop02's leaf reaches alpha 128 at its t=150,
which at the unit-3 leaf rate is ~324 frames after its start, well inside
the 1754 frames captured.

For the port: their renderer draws pteff03a, confirmed on their side at
three instants. An extra light streak the game never shows, appearing
partway through the build-in, looks exactly like "the sweep starts too
early" -- and unlike the alpha question it does not depend on unit 2.

One capture, one boot, one window. The scan was over every tall quad in the
whole stream rather than a filtered subset, so the absence is strong, but
it is still absence in one observation. The five-second human check the
port is arranging (one streak or two) settles it faster than another
capture and should come before anyone deletes an element.

The disc declares ptloop02.rat as element 12 beside ptloop01.rat as 11,
identical pivots and keyframe times, so why one is submitted and not the
other moves to my side. Untested candidates: its leaf alpha starts at 0
where pteff03's starts at 255; or a focus/variant link means only one of
the pair is ever active.

Refutation: the port's own challenge to my by-size identification -- that
both sprites are byte-identical in size -- they withdrew themselves and
correctly. The sprites are both 399x180 but the LEAVES declare different
scales, so the drawn quads differ by a third in height. Second time in this
exchange a challenge was right to raise and wrong in its stated reason, and
both times the check still found something real. The value was in asking.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 18:43:18 +00:00
sylph-decoder
f3f4d5834c re: F6 unit 4 -- the sweep is on screen 41 frames after the title starts, not at the plate
Same capture, counts only. Title's first drawn element is frame 706; the
sweep is first submitted at 746 and first ON SCREEN at 747, so +41 frames.
For scale, the plate's declared t=236 is frame ~942 at 1 unit/present --
195 frames after the sweep is already visible geometrically.

Named rather than folded in: that comparison assumes the title's first
drawn frame is its t=0 and that its clock runs at 1 unit/present. The 41 is
a raw frame count and carries neither.

What it settles: POSITION does not gate the sweep late. So if a human sees
it start when the plate appears, the gate cannot be where the quad is -- it
has to be how opaque it is. That puts the whole of F6 on unit 2, which is
amber: does the parent's alpha multiply into the leaf? The parent ramps
0->255 across t=70..100, so if it multiplies the sweep is invisible until
~70 and dim to 100 (a real early gate); if it does not, the sweep is fully
lit from +41 frames and the human's report has no mechanism yet.

The disagreement has narrowed usefully: before this unit "starts when the
plate appears" had two candidate mechanisms, position or alpha. Position is
now excluded by measurement.

Refutes my own unit 1 framing. I wrote that a quad can be "fully opaque and
entirely off-screen" and offered the travel as the likely explanation. It
is not -- the sweep is on screen at +41 frames, nowhere near the plate. The
travel explanation is dead, and I record it because I proposed it and it
steered the port's reading of their own renderer.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 18:37:21 +00:00
sylph-decoder
3b6e065e17 re: F6 unit 3 -- the sweep's POSITION fits the declared track, origin at leaf t=0
Took the port's point and dropped the alpha line. Three exchanges had gone
on alpha -- a bound, a refutation, a downgrade -- over 14 usable samples of
1754, when the position travels 2160 px monotonically in the same capture.

pteff03's declared leaf track is linear at 4.000 px/unit: -639 at t=0, -39
at t=150, 1521 at t=540. The capture's first clean segment runs frames
746..1913 with x from -641.1 to +1522.1. Both endpoints land within ~2 px
on a 2160 px travel, 0.1%. Two independent checks rather than one fitted
parameter. A single wrap at frame 1914 confirms the declared 600-unit loop
and falls after the segment.

Answers the clock origin: the leaf's t=0 is its first drawn frame, so the
game does not carry the leaf forward from the title's clock. That CONFIRMS
the port's own correction -- they had attributed ~135 units of earliness to
the leaf starting at title t=0 and withdrew it on two relayed numbers; the
full series says the withdrawal was right.

Rate here is 540 units in 1167 presents = 0.463 units/present, flagged as
the weak half: one run, in presents, and it does NOT match the 1
unit/present the splash work established. Either the leaf runs a slower
clock or one of the two is not what I think. The origin does not depend on
it.

And the useful negative: a linear fit across all 1754 samples gives max
residual 1108 px on 1402 px of travel, 79%, because the trajectory wraps
and a straight line through a sawtooth is meaningless. A fit not checked
for residual would have reported a slope and a plausible origin from that
same data -- which is exactly why the port's tool selftest must reject a
wrong-shape series, and why I segmented before fitting.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 18:35:54 +00:00
sylph-decoder
7b952feca9 re: CORRECT F6 unit 2 -- identification wrong, presentation misleading, claim downgraded to amber
The port challenged the by-size identification: both sweep sprites are the
same size, so size cannot separate pteff03 from pteff03a, and the two
leaves floor at 128 and 0. They were right, and it is broken a third way.

Their discriminator -- the leaves travel in opposite directions -- is in
the capture I already had. Both rows drift +2.19 and +2.18 in x, i.e. BOTH
LEFT TO RIGHT, so both are pteff03. The 0.7% size difference is per-frame
rounding splitting one element across two keys, not two elements. pteff03a
does not appear in this capture at all.

And my own presentation misled. The "alphas 8 24 33 50 58" I quoted were
sorted(set(...))[:9] -- the nine LOWEST DISTINCT values, not the series.
Read as a trajectory they look like a ramp from 8. They are a tail. The
counts: 9 of 1140 and 5 of 614 samples below 128, so 14 sub-floor samples
out of 1754.

The bound argument survives in shape and collapses in weight. A sample
below 128 is still unexplainable by a leaf flooring at 128, but 14 of 1754
is a thin tail and a tail is where a vertex-grouping slip or a partial
frame would show up. Downgraded to amber: not refuted, not established.

Settling it needs the same capture read as a SERIES rather than a set --
alpha against frame across t=70..100, where a multiplying parent must
produce a monotone ramp on nearly every frame rather than 14 stragglers.
One more read of data already on disk.

The port was right to hold the renderer. Adopting this would have changed a
rendering rule on every screen with a leaf, on 14 samples I had presented
as a trajectory.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 18:27:21 +00:00
sylph-decoder
0c21bc9fb5 re: F6 unit 2 -- the parent's alpha IS multiplied into the sweep leaf
Question, look-at and not-covered written before the work, per PROTOCOL's
units section.

One boot, one A to skip the attract video, then no input so the title
builds in undisturbed. The sweeps are the two rotated 600%-scaled strips,
identified by size: NDC 1.38x3.15 and 1.39x3.15, matching the corpus's own
independently measured AABB height of 1134 px (2*1134/720 = 3.15).

Drawn alphas run 8, 24, 33, 50, 58, 74, 83, 100, 107 and 16, 41, 67, 91,
116, 128... pteff03's LEAF alpha is bounded below by 128 (keys 0:255
150:128 540:255 600:255). 8 < 128, so the leaf cannot produce it alone.
The parent's alpha is multiplied in.

That refutes the port's screen_view.gd decode that "the leaf runs on its
OWN timeline and the parent's alpha is NOT multiplied in" -- which is
exactly what that file asked for. It flagged honestly that every
observation behind it had parent alpha 0, so "the leaf wins" and "the
parent is ignored because it draws nothing" were never separated, and named
t=100..238 as the separating interval. This capture is in that interval.

Bears on F6's original report: the parent ramps 0->255 across t=70..100, so
if it multiplies in the sweep is invisible before ~70 and dim until 100. A
human reporting it starts late is seeing a real gate -- the parent's ENTRY
ramp, not the 238 cluster, which unit 1 showed is an exit.

Reach: one boot; quads identified by size against a previously measured
AABB, not by name, since the draw stream carries no names. The bound
argument needs only that the leaf minimum is 128, which is from the disc.
It does NOT establish the combination is plain leaf x parent rather than
some other one that also dips below 128 -- only that the parent
participates.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 18:23:49 +00:00
sylph-decoder
f2d3f35cb9 re: F6 unit 1 -- 238..250 on the sweep is an EXIT, not a start
One unit, per the new PROTOCOL section. Question, look-at, and
not-covered written before the work.

pteff03 and pteff03a -- the sweep parents behind ptloop01/ptloop02 --
declare 0:a=0 70:a=0 100:a=255 238:a=255 250:a=0. So they rise 70->100 and
fall 238->250. The brief's own warning was right: 238..250 is a fade-out,
the same shape ptcopyright uses, and ptcopyright starts nothing.

The sweep is declared visible from t=100, which is 136 units BEFORE the
plate reaches full alpha at 236, and is fading out by 238.

That contradicts the human's report that the sweep only starts when the
plate appears -- and the reason both can be true is the next unit.
ptloop01/ptloop02 are .rat leaves whose own timeline is a TRANSLATION:
ptloop01 runs x = -639 -> 1521 over a 600-unit loop, so at its own t=0 the
sweep sits off the left edge of a 1280-wide screen. The parent's alpha says
"drawn"; the leaf's position says "where". A quad can be fully opaque and
entirely off-screen.

Explicitly not actionable alone: this says 238 is not a start. It does not
say the port should show the sweep from t=100, because if the leaf is
off-screen there then both renderers can be correct on alpha and differ
entirely in what is visible.

Refutation of the brief's own lead that "236-238 is a synchronisation point
and a human reported a behaviour change there": the synchronisation is
real -- pteff02 at 236, ptlogo_back2eff and ptcopyright at 238 -- but the
reading is refuted. For the sweep it is where things END. A cluster of
keyframes marks a moment; it does not say which direction anything moves
through it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 18:19:21 +00:00
sylph-decoder
f3d77d5fbf re: F3 -- the title plays BGM cues 1102 and 1103, from seven sites in its GamePart
A human says something is missing on the title. Something is: it plays BGM,
and two different cues.

Method with the control built in rather than bolted on. R4 wants a negative
to show the method finding the menu's cue first; this method cannot produce
a false negative for one screen because it does not look at one screen. It
finds every call of the play function in the image and reads the cue each
passes: 34 callers, cue ids 1103 x24, 1102 x3, 1107 x2, 1108, 1106, 1104,
category 4 on every one. 1103 is the cue the corpus already attributes to
the menu, and the method finds it 24 times.

GamePart_Title's neighbourhood is 0x821C4xxx-0x821C7xxx per the registry
page, and seven play sites fall inside it: 1103 at 0x821C52D0, 0x821C5620
(inside the phase handler sub_821C5580), 0x821C6188 and 0x821C6294; 1102 at
0x821C53B0, 0x821C5BA0 and 0x821C6DE0.

So the title plays BGM_103 and BGM_102, and 1103 is the SAME cue as the
menu's -- which is why a port playing nothing on the title sounds like
something is missing rather than merely quieter.

The sting is NOT answered and the page says exactly why: this play function
carries ids in the 1102-1108 BGM range, the UI stings are SE_* cues with
ids 1-322, and not one of the 34 sites passes an id in that range. SE goes
through a different call and this method is blind to it by construction.
That is a bounded negative about the instrument, not the game, and reading
it as "no sting" would be the third time this corpus mistook a blind spot
for a fact.

Reach: exhaustive over every bl to 0x8217ACF8, so complete for that
function. The GamePart attribution is by address neighbourhood and carries
the registry page's own "by position and convention, not proven" caveat.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 18:16:55 +00:00
sylph-decoder
11d46dd799 Merge remote-tracking branch 'origin/main' into auto/frame-blend-draw-path 2026-09-02 18:15:33 +00:00
MechaCat02
fee2e4278a agents: one item only -- the title's animation timing -- and split work into human-checkable units
Some checks failed
CI / Native — ubuntu-latest (push) Failing after 7m49s
CI / WASM — Web (push) Failing after 6m37s
CI / Formatting (push) Failing after 53s
CI / Native — macos-latest (push) Has been cancelled
CI / Native — windows-latest (push) Has been cancelled
Two new findings from the human, both about WHEN a title animation starts, and
both handed over rather than guessed:

F5 Does (A) SNAP the title to finished, or ACCELERATE it? The human says they
   cannot tell and is right that they cannot -- a three-frame acceleration and a
   one-frame cut look identical to an eye. Two routes that should agree: a
   per-frame capture (acceleration shows intermediate alphas, a cut shows none)
   and the code (assigning a target time and raising a rate multiplier are
   different instructions). Their "looks more like a snap on multiple attempts"
   is recorded as a PRIOR, not a result.

F6 The title's sweeping white glow -- ptloop01/ptloop02, the blue PCB-like lines
   -- starts only when the plate appears in the real game, and starts earlier in
   the port. A lead from the exported declaration, mine and unverified: those
   elements are keyed at t = 0, 70, 100, 238, 250 while the plate reaches full
   alpha at 236, with pteff02 keyed at exactly 236 and ptlogo_back2eff and
   ptcopyright at 238. 236-238 is a synchronisation point in the declared data
   and a human just reported a behaviour change there. Flagged AGAINST itself
   too: 238...250 looks equally like an exit ramp -- ptcopyright uses that shape
   and starts nothing -- and the sweep lives in a nested .rat leaf with its own
   timeline.

F6 bears on clock: "shared" and on F4: if a title element does not move until
the plate arrives, either the declared data says so and our keyframe reading is
wrong, or something at the plate's arrival STARTS it, which is a mechanism
nobody has proposed.

And the process change, which is the human's and outlives this item:

  "attacking the 'whole' mission was too big for them to handle. Split the given
   missions and tasks into even smaller tasks which they can tackle and give to
   a human for feedback."

PROTOCOL.md gains "Work in units a human can check in a minute". A milestone is
not a unit of work, it is a bag of them. A unit is right-sized when it ends in
something a person can judge in under a minute WITHOUT READING ANYTHING, and
each one states its question, what the human looks at, and what it does NOT
cover. Do one, hand it over, stop -- an unverified fix under a second change
makes a regression two-variable.

The evidence for the rule is this week: the splash sat through a whole milestone
and took one day once scoped to "does it animate?". The bar is a HUMAN check,
not a green tool -- three instruments passed a frozen screen.
2026-09-02 20:14:46 +02:00
sylph-decoder
5bd3492c7f handoff: F2 closed -- no per-cue gain on the disc, the port authors the mix knowingly
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 18:06:52 +00:00
sylph-decoder
7535cfa3fe re: F2 CLOSED -- undecodable with reach, all three sites checked
Third and last site: the executable's play path. sub_821C5580's cue-1103
site is li r5,1103 / li r4,4 / lwz r3,0(r29) / bl 0x8217ACF8, i.e.
play(this, category, cue_id). No volume is passed and no float argument is
set up by the caller at all; the callee's prologue confirms r5 is the cue
id with -2 and -1 sentinels.

Honest limit stated: the callee saves f30/f31 so it uses floats internally
and could look a level up for itself. "No gain is passed" is not "no gain
exists" -- but there is nothing at this site for the port to transcribe.

So F2 closes as undecodable-with-reach with all three sites checked:
tables.pak cue records (exhaustive, passing control, and numbers carry
names there so a gain would have had one), sound.pak bank headers (all 9519
entries, no readable header), and the play path (category, not level).

The port authors the mix and now knows it is authoring, which is what this
question existed to make explicit rather than accidental. The one authored
value the game exposes is the user-facing sound options screen -- a runtime
master, not a per-cue table.

Refutation of the play-test's premise that "a cue record commonly carries a
volume beside its wave index": REFUTED for this game across all three sites
where it could live. Recorded because it was a good prior -- it is what
sent me to the right three places -- and being wrong about where a value
lives is different from being wrong to look.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-02 18:06:36 +00:00