WHAT I WANTED FROM IT: 56cc7ac, "a RATC child's name is stated, not inferred".
A child was named by scanning backwards for the last printable run of bytes
before its magic. For `pteff05.t32` the three trailing payload bytes are
38 41 58 = `8AX`, which beat the real name, so the child registered under a name
no element declares and resolved to no sprite.
`pteff05.t32` is the full-resolution background of all five menu screens.
Every menu render this port has produced has been missing its background, and
P1 wrote that up as a fact about the disc -- "the bundle carries zero RATC
children for either, so there is no texture on the disc to export". That is
retracted in docs/DECISIONS.md rather than edited away.
The re-export is contained: six new sprites and nothing else. pteff05 on
main_menu/extras and their JP twins, pteff04 on both titles. Each gains a
`sprite` line and moves `layer_source` from "implied" to "sprite" -- the layer
key is now read from the file instead of the decoders' table of keys measured
off the running game, which is the ratchet turning the right way.
pteff05.png is 1280x720; ptbase.png, which had been carrying the background
alone, is 640x360 drawn at 200 %.
Measured against the live capture rather than the other renderer: settled
main_menu RMSE 8.05 % -> 5.92 %. The reference renderer was missing the same
element for the same reason, so no renderer-vs-renderer diff could have found
this -- the third time a capture has caught something both renderers agreed on.
What I wanted from it: `ui_layout::rest()`. At 8b6dbcf a trailing run of
identical keyframes was always treated as the exit, so an element with no exit
animation rested at its invisible pre-roll -- `ptframe1`/`ptframe2`, the main
menu's circuit bracket, which a capture of the running game plainly shows.
Pinned at 5414db3 rather than 4bc9706 where the fix was written, because
5414db3 is where it carries its disc-wide check: 30 of 13 991 elements move, 4
become visible, 0 become invisible. The rule shipped is the RE agent's, not the
condition this port proposed -- mine was too loose and would have erased the
word PAUSE on `pgptitle.rat`, whose trailing run is two identical TRANSPARENT
frames. A trailing run is the hold exactly when it is VISIBLE.
The re-export shows the change was contained: two files differ, and within them
exactly four `rest` blocks -- ptframe1/ptframe2 on both main menus, t=16 alpha
0x00 at the pre-roll position becoming t=62 alpha 0xff at the arrived one.
Every diff line pairs. The other ten screens are byte-identical, no sprite
changed, and `pteff02` correctly did not move.
`loose` exited 126 with "File name too long": the entrypoint ended in
`exec "$@"`, so the whole loop-task.md prompt was handed to exec as a command
and the markdown was tried as a filename.
The launcher was modelled on the RE container's but the entrypoint was written
fresh and simpler, and it left out the half that matters -- the block that turns
a `/loop ...` argument into a Claude Code invocation. Ported it over, with the
two gates that make an unattended run possible: seeding ~/.claude.json so the
first-run wizard does not stop on the theme picker, and claude-autonomous, which
answers the Bypass Permissions disclaimer that has no config key to skip it.
Also mounts the host's Claude credentials, which the container had no way to
reach, and passes SYLPH_AUTONOMOUS=1 from `loose`.
Verified: container stays up, display :97 ready, /reborn mounted read-only,
Remote Control registered, Claude Code started in /work.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>