sylpheed-port's caveat on the ninth transition: the destination is identified after the fact by draw signature, which establishes THAT the two screens differ but not WHICH either is, so the gap is attributed to a pair whose second member is known only as "not the other one". Worth trying to remove. Both runs saved a screenshot of the destination. Scored against the archives the menu's non-EXTRAS buttons plausibly reach: m2o best GP_OPTIONS 43.30, margin 5.88 m2o2 best GP_SYSTEM 45.74, margin 2.28 REJECTED against this corpus's own calibration. which_title_screen.py's control puts a true match at RMSE ~18-20 with margin ~10, and a "neither" at ~34 with margin under 1. These best fits are roughly double a real match. Accepting "m2o is GP_OPTIONS" on a margin of 5.88 would be the same weak-margin acceptance that a threshold was added to the navigation search to prevent three iterations ago. Reach of the negative: one build per archive was rendered -- the default, which is the largest -- and the screen a button opens need not be the largest build. So this fails to identify rather than refuting those archives, which is a different statement. The port's caveat stands and the ninth pair keeps it. METHOD: a calibrated instrument can reject its own answer, and should. Without the calibration, "best match, margin 5.88" reads like an identification -- a ranked list always has a winner, and nothing in the ranking says whether the winner is good enough. Any nearest-match report needs a known-good score beside it or it will name something every time it is asked. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v
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.