REPEAT_DELAY = 0.402, REPEAT_INTERVAL = 0.134, from docs/re/f1-repeat-measured-via-driver-patch.md -- 12 and 4 frames at the run's achieved 29.87 fps guest rate, converted to seconds because this port does not run at the guest's rate and it is the cadence that was measured. The mechanism has been here since 2026-09-02 and inert on purpose. The instruction it was waiting on is now vindicated in the most awkward way: the draft it refused to ship had 0.40 / 0.20, so the guessed delay was nearly right and the guessed interval was off by 50 %. The half that was wrong would have been protected by the half that was right. The delay and the interval are NOT equally well evidenced, and the code says so at the constants. No physical controller exists in the Decoder's container, so the measurement fed Canary's file driver the SDL driver's own 400/100 ms constants: the 402 ms that came back is the constant that went in, and confirms the instrument. The 133 ms interval against a fed-in 100 ms is the new fact -- the game paces repeats to its own frame consumption. One run; the two-run minimum is not met and the finding says so itself. Also: the prediction that this would turn verify-input's "a held stick is ONE step, not six" red was wrong. It stayed green, because steps() never advances a clock and so had never called repeat_due() at all -- the rate was about to ship into a harness with no coverage of the feature, with a green line that would have been read as coverage. So verify-input gains a `repeat` subject: nothing before the delay, the first repeat on the delay, the steady interval, cadence independent of frame rate (the code claims this in a comment, so it is now asserted), and a direction change restarting the delay. Each asserts THESE numbers, not the shape -- a shape-only check would have passed on 0.40 / 0.20. The control removes the premise, a held direction, and every controllable row inverts. The first-repeat row measures from the arming tick, not from t=0: that tick is the frame the press is handled, which is the origin the finding measures its 12 frames from. Measured from zero it read 0.433 vs 0.402 and the tolerance would have had to be widened to hide a units mismatch. Closes #2 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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.