Three findings, one of them a withdrawal of my own fix. The ObjectDB leak line on every run is engine-side. The leaked objects are the Ogg streams and playbacks of exactly the cues that sounded, which reads as MenuAudio holding references past teardown. It does not: releasing every reference the port owns -- stop each player, null every stream, clear _players, clear cues/beds/voices -- moved the count not at all, 8 before and 8 after, with a debug print confirming _exit_tree runs. The cleanup is REVERTED rather than kept, because code that changes nothing under a comment claiming to fix a leak is worse than none: the next reader sees it handled and stops looking. Filed as a negative result so nobody re-investigates. check_focus_persists gets a SECOND NARROW ANCHOR, repairing a weakness I recorded last iteration and did not act on. It anchored on the heading -- the conclusion -- so when the Decoder corrected the run's item names it sailed past, surviving by luck rather than design. It now also rests on the evidence, the ring at y 384.0 before the round trip and 385.5 after, which is the geometry-free equality the conclusion stands on. The two anchors are checked AGAINST EACH OTHER: if one matches and the other does not it reports ANCHOR SPLIT. The second anchor has its own known negative, perturbing only the evidence line -- without that it would be decorative and the check would still rest on the conclusion alone. And their skippability rule recovers a result I had over-withdrawn. Frames can be skipped, bytes consumed cannot; that is why my withdrawal reaches my test and not their read-offset one. Applied backwards: the OVERRUN IS the evidence nothing was skipped. A player that drops frames finishes on schedule; mine took 146.6 s for 137.44 s of media, so ADV +6.7% and S00A -0.5% are time-to-consume measurements after all. The withdrawal stands for the pacing-audit use; the load-starvation result is recovered. Standing caveat recorded: every timing this port publishes is frame-derived, and the only reason those seconds mean anything is that this player demonstrably does not skip -- an empirical property, not a guarantee, and nothing checks it. Reported: the 'do not hardcode the menu's initial focus' HANDOFF section still reads as live while two later sections have overtaken both its claims. Every asserting check passes; 14 controls fire. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
Sylpheed
A clean-room reverse engineering and port project for Project Sylpheed: Arc of Deception (Xbox 360, 2007).
Three things live here, in one repository so that a change spanning them lands as one commit:
| The decoders | crates/sylpheed-formats — the disc's formats, read and verified disc-wide |
| The port | port/ — a Godot 4 project, plus crates/sylpheed-export which converts a disc into the open asset tree it reads |
| The corpus | docs/re/ — what has been reverse engineered, with its evidence, its retractions and its dead ends |
You need your own copy of the game. No game content is in this repository and none ever will be. The exporter reads the disc you supply.
The oracle is the real game
sylpheed-cliand the Explorer are tools for verifying our decoding. They are hypotheses under test and they have been wrong. When something must be checked against the truth, the truth is the game running in Xenia Canary, captured — not any renderer of ours.
This is stated first because getting it backwards is the most expensive mistake this project has made.
Layout
crates/
sylpheed-formats/ the decoders. Disc-wide verified; the corpus is its spec
sylpheed-cli/ headless tools -- render a screen, dump a table, probe audio
sylpheed-viewer/ the Explorer: a human's window onto the disc. STATIC data only
sylpheed-export/ disc -> the open, moddable asset tree
port/ the Godot 4 project. Reads open formats ONLY
authored/ decisions that are NOT on the disc, each with its reason
data/
base/ generated by the exporter. Gitignored, never hand-edited
mods/ drop-in overrides. Yours
docs/
re/ the corpus: findings, refutations, method traps
game/ how the game is navigated -- menus, modals, flight
port/ the port's mission, its handoff contract, modding rules
agents/ how the agent team works together
tools/ capture harnesses, probes, the share tool
exchange/ transient inter-agent files. NOT in git
docker/ the agent containers
Where to start
docs/re/INDEX.md— what is decodeddocs/re/REFUTED.md— what has been tested and dieddocs/re/METHOD.md— traps this project has already paid fordocs/game/navigation.md— how the game is navigateddocs/port/MODDING.md— why the asset tree looks the way it does
Xenia Canary is a separate repository: it is a fork tracking upstream, and it carries our instrumentation.
Conventions
Confidence is per claim, never per document: ✅ CONFIRMED · 🟡 PROBABLE ·
❔ HYPOTHESIS · ❌ REFUTED. A withdrawn result is kept with its reasoning
rather than deleted — that is why the numbers here can be trusted.