Commit Graph

5 Commits

Author SHA1 Message Date
Sylpheed port agent
a128642990 port: recover uncommitted GP_SAVE_LOAD.pak addition after restart
Session was OOM-killed mid-edit; this change was already correct and
self-documented in the why-block, just never committed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-04 13:32:49 +00:00
Sylpheed port agent
4c24e06b28 port: name the 14 OPTIONS screens, from the text they render about themselves
Seven clean EN/JP pairs, no leftovers -- which is itself a check on the reading.
Entry 19 is the OPTIONS ROOT (GAME/CONTROL/SOUND/SCREEN SETTINGS + BACK) and is
main_menu ptbtn04's destination.

Identified by CONTENT THE SCREEN STATES ABOUT ITSELF -- rendered at rest and
read. That is deliberately not identification by position, size or ordinal, the
three this project has been burned by: the sweep strips confused by size, the
plate identified by screen position, ptcopyright mistaken for the plate.

⚠️ Recorded as NOT established: which screen the GAME navigates to from which.
The tree is read off content, so 'customize is reached from control settings' is
a reading of a button legend, not a measured transition.

Nothing is reachable yet -- ptbtn04 still has goto null. Wiring is next.
2026-09-03 19:13:33 +00:00
Sylpheed port agent
3efe1cc03e port(exporter): export GP_OPTIONS -- the OPTIONS screens render
authored/screen_names.json export_archives gains dat/GP_OPTIONS.pak, alone.
Adding all four candidate archives at once would land 139 new screens together
and make any regression unattributable.

Result: 14 screen builds, 30-41 sprites each, ZERO missing sprites, 434 PNGs.
All 30 screens (16 title + 14 options) validate against sylpheed.screen/3, and
export/screens/title is BYTE-IDENTICAL to before -- the addition disturbed
nothing existing.

And they render. build_04 is the real CONTROL SETTINGS screen: 43 elements,
1280x720, title, ten labelled rows and the button legend, every sprite resolving.
Element ids carry a po_ prefix, so these are the options builds and not a
coincidence of the detector.

⚠️ One element, po_pad_slider1, has no sprite in the export and is reported as
NOT DRAWN rather than silently skipped.

⚠️ Screens are unnamed (build_NN by entry index) and OPTIONS is not yet reachable
from the menu -- ptbtn04 still has goto=null. Naming and wiring are the next
units, deliberately separate from making the screens exist.
2026-09-03 18:10:58 +00:00
Sylpheed port agent
6cdffd8f77 port: the uncited-why backfill -- 17 was 12, and 12 is now 0
The work my own measurement said was needed: a legacy residue, not a new
discipline. Doing it corrected the number twice.

First, '17 uncited' was inflated by my own extractor. Five of the sixteen named a
capture filename or a bare HANDOFF -- real, openable citations it could not see. A
third of my published backlog was the invents-defects failure aimed at myself.
Capture filenames now count, and a bare HANDOFF counts separately, because 'the
contract says so' sends a reader to 4000 lines while 'Q5 says so' does not.

Then the genuine twelve, all backfilled to zero. The plate-overlay group cites
plate-pulse-measured.md, plate-pulse-phase-lock.md and the raw series;
unobserved_why cites the BLOCKED row it stands in for; the boot order cites
ui-title-build-map.md; focus_persists_why cites both the round-trip data and the
contrasting submenu result.

screen_names.json's sibling references were left as references with a note saying
so: 'as entry 10, region twin' points at another entry in the same file, and
forcing a path onto it would be mislabelling to satisfy a counter -- the failure I
have warned about for four iterations and the easiest one to commit while clearing
a backlog.

Their dialog record layout was wrong and I had copied it. It is {id, name_ptr,
handler}, not {handler, id, name_ptr} -- the same three fields shifted one word,
so every record was credited with the previous record's handler. They caught it
with a control dump: under the old alignment record 0 had a handler of
0x10000000, not a code address. ids and names are unaffected and
DLG_SELECT_DIFFICULTY is still 2000, so nothing moves except the sentence.

Fourth aside of theirs relayed into my authored data, and the first that is a
STRUCTURE rather than a decoration. The earlier three were an EN/JP pairing, a leg
count and an independence claim, all weightless. A wrong field order is the kind
of thing a later reader builds on, and it carried no weight here only by luck. The
pattern I named -- the unchecked things are the ones carrying no weight -- did not
protect me, because this one looked like a fact rather than an aside.

Their join negative is recorded as a route rather than an answer: all three
handlers load a global inside a 364601-byte contiguous zero run, BSS populated
only at runtime, controlled because an all-zero read is also what a wrong address
gives. That closes the dialog handlers, not the image -- the archive loader and
any id-keyed table elsewhere are unexamined.

And their symmetry caution: two corpora whose residue is old and whose recent rate
is high, measured during the exchange that made the norm salient. Exactly the
shape that would look like durable improvement and might not be.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
2026-08-31 03:45:16 +00:00
MechaCat02
65cefa74c3 monorepo: one repository for the decoders, the port and the corpus
Some checks failed
CI / Native — macos-latest (push) Has been cancelled
CI / Native — windows-latest (push) Has been cancelled
CI / WASM — Web (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Native — ubuntu-latest (push) Has been cancelled
Merges the Godot port into the reverse-engineering repository, preserving both
histories -- 1019 commits of corpus plus the port's 31, brought in by subtree
merge and then moved into place so git can follow each file across the rename.

The reason is not tidiness. The two-repo split forced the exporter to depend on
the decoders by pinned revision, and that created a whole class of failure that
now disappears: a sha reachable only from a topic branch, orphaned by a
squash-merge, breaking a fresh checkout silently at build time. It also forced a
live read-only mount of one agent's working tree into another's container, which
is why a contract file could move mid-iteration. With a path dependency, a
decoder change and the exporter change it requires land in the same commit or
not at all.

Canary stays separate: it is a fork tracking upstream.

New structure for the long term:

  docs/game/     how the game is NAVIGATED -- menus, modals, prompts, alerts,
                 and in-game flight. Written so nobody rediscovers it. Mostly
                 open questions on purpose; the in-game tutorials are the
                 resource for the flight half.
  docs/port/MODDING.md
                 modding as a constraint on the exporter TODAY, not a later
                 feature: one logical asset in one file (the disc splits nearly
                 everything, and resolving that is the exporter's job), names a
                 person recognises, PNG/OGG/OGV/JSON only, base-and-overrides so
                 re-exporting is always safe, provenance in every file.
  data/base + data/mods
                 generated tree and drop-in overrides, both gitignored
  exchange/      transient inter-agent files, deliberately outside history
  docs/agents/   the team protocol

Both the README and the navigation doc lead with the correction that cost the
most: the oracle is the real game under Xenia Canary. Reborn's renderer is a
hypothesis under test, it has been wrong, and treating it as ground truth
propagated into three documents and both agents before a human caught it.

Scripted modding stays possible without being built: no screen name is hardcoded
in GDScript and there is no native code in port/, which is what Godot Mod Loader
needs to be able to substitute behaviour later.
2026-08-29 11:34:46 +02:00