Closes the two items the play-test left after the fix landed. 1. tools/port/verify-motion, wired into check-all with its control. It films a REAL boot -- no --time, no pinning -- and hands it to tools/motion-census. The window is the DECLARED build-in (publisher t=0..45, 0.75 s at 60 units/s), so it asks about the interval the disc says is animating and nothing else. 🔴 BOTH SIDES MEASURED, not one measured and one assumed. I reverted the single operator in pose_at, ran this check against the defect, and restored it: broken (ASSIGNS the settle instant) 40 % and it FAILED fixed (clamps to it) 86 % and it passed The bar of 60 sits mid-gap: 20 points above the defect, 26 below the fix. 🔴 AND MY FIRST VERSION OF THAT BAR WAS JUSTIFIED BY A NUMBER I HAD NOT MEASURED. It claimed "~40 points of clearance on both sides"; with a 1.0 s window the real clearance was 5 points, because that window includes 0.25 s of legitimate hold and dilutes the signal. A bar defended by an unmeasured number is this whole check's own defect, one level up. Corrected with the measurements and the sequence stated. The control runs FIRST and is not optional: motion-census --selftest drives a fade, a switch and a frozen film through the same loader and floor. If it cannot separate those three, every number the check reports is decoration. Then the --control mode builds a frozen film from the port's own pixels -- one real boot frame repeated -- and requires it to FAIL. It scores 0 %. One defect in the check itself, caught by running it: `ls | head` under `set -o pipefail` exits 141 before asserting anything, and a check that dies before checking looks a lot like a check that passed. 2. BLOCKED.md H2 corrected from ✅ to 🟡, against myself. The MECHANISM half stands -- no post-process pass, the blur is a baked companion texture. The BEHAVIOUR half was false and the row asserted it: I wrote "the port draws all seven quads -- verified by a frozen sweep". True, and it did not mean what I used it for. A frozen sweep drives the clock BY HAND. It proves the renderer can draw pose N and says nothing about the poses being drawn in sequence while running. All three of my instruments passed the defect -- frozen sweep, a 0.01 % settled comparison (a frozen screen matches a settled reference PERFECTLY), and an achieved-fps counter (identical pixels 25x/s score like animating). Every one measured throughput or a pose; none measured CHANGE. Same shape as InputEventAction bypassing the input map. Not settled: the ~1.0-1.2 menu residual; findings 3 and 4's remaining halves. Both were explicitly deferred by the human until this was fixed, and it now is. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018AHUQvXGyNcKonSEWsgWcX
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
-- and RUNNING.md, which is how you actually start it
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.