Sylpheed port agent 170d255e82 port: the port never reported its own frame rate, and the menu draws at 9.7 fps
TEMPORAL-VERIFICATION §1 requires every instrument to state its achieved rate
against its requested one. That has been applied to --film (which I fixed for
exactly this), to the Decoder's harnesses and to the oracle. It had never once
been applied to the thing being shipped. The port had no idea what rate it drew
at and no way to say.

It matters now because the splashes are the focus and the open complaint is that
ours is LESS PRONOUNCED than the game's. A fade drawn in 45 frames and the same
fade drawn in 12 are different animations, and nothing here could tell them
apart.

boot.gd now counts frames per screen and reports at every boot transition, at the
end of the boot, and at every menu arrival. `worst gap` sits beside the mean
because a hitch is what reads as wrong and a mean hides one by construction.

Measured in this container, three boots:

  publisher_logo   17.3 / 19.6 / 25.0 fps    worst gap 100-115 ms
  developer_logos  16.7 / 21.9 / 22.8 fps    worst gap 103-138 ms
  title            17.2 / 14.2 / 12.7 fps    worst gap 150 ms, all three
  main_menu         9.7 fps                  worst gap 150 ms

🟡 A LIVE CANDIDATE FOR PLAY-TEST FINDING 4, and the first one that is not dead.
The timeline is delta-driven so durations stay correct at any rate; what changes
is how many alphas the fade is DRAWN at. At the measured rates the 45-unit
build-in gets 12-17 distinct alphas instead of 45, and the pre-blurred companion
glow -- the thing that IS the splash's blur -- rises over 15 units and is drawn
at FOUR TO SIX steps instead of fifteen.

⚠️ It is a candidate, not a cause: this is llvmpipe under Xvfb and not the
human's hardware. The point is that the line now prints on every boot, so the
next play-test answers it for free. Every other candidate for finding 4 is
already dead -- keyframes vindicated against the vertex stream, companion quads
drawn, blend space matching, settled pose at 0.01 % against the capture, no
post-process pass to add.

✅ And nothing published is invalidated, which was worth checking rather than
assuming: every timing result here comes from `_elapsed` (+= delta) or
`time_units` (the same sum scaled), so all are correct at any frame rate. The
splash dwells were measured across runs whose rates differed by 2x and agreed to
±0.03 s. Had the timeline been frame-counted, every number in this corpus would
have been wrong by a factor that changed between runs -- which is precisely the
failure the Decoder found in the emulator's rate and withdrew a finding over.

Two defects in the instrument itself, both caught and fixed before it was
trusted:
  - its first version printed "-9223372036854775808 requested".
    DisplayServer.screen_get_refresh_rate() returns a FLOAT and is -1.0 when the
    display cannot say, which Xvfb cannot, and %d underflows to INT64_MIN. It
    now names the cap or says `uncapped`.
  - it was BOOT-ONLY and said so nowhere -- `--menu` arrives through
    _menu_arrive, not _advance, so the mode a human spends time in reported
    nothing. That is the shape this port keeps finding in other people's work,
    and it lasted one measurement here.

Refutation attempt: I checked whether the port re-decodes PNGs per frame, which
would have been a real defect. It does not -- _load_textures caches at
load_screen. Hypothesis dead, cheaply, and recorded.

Not settled: what rate the human's machine manages; whether 9.7 fps on the menu
is llvmpipe or something in our draw path; H6's +0x04 exposure; H1 (the Decoder
is taking it this iteration).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018AHUQvXGyNcKonSEWsgWcX
2026-09-01 18:15:38 +00:00

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-cli and 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

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.

Description
No description provided
Readme MIT 820 MiB
Languages
Rust 57.6%
Python 27.7%
Shell 10.6%
GDScript 3.5%
Dockerfile 0.4%
Other 0.1%