Files
Sylpheed/docs/port/RUNNING.md
Sylpheed port agent e30b336879 port: write the runbook P5's gate needs, and correct a misreport of a corrected row
P5's gate is 'a human clicks through it' and no document told a human how. The
commands existed in boot.gd's header and scattered through a twelve-thousand-line
DECISIONS.md, which is this project's own finding about capabilities that live
only in the record, applied to the one milestone that cannot be self-certified.

docs/port/RUNNING.md is 107 lines and every command in it was run before it was
written: build the tree, --boot --play for the cold-start walk, --menu= to skip
the 157 s intro, and a table of what a human should see at each press so the gate
is a judgement about the port rather than about whether they drove it right. It
does not claim P5 is met; it removes the excuse that the gate was hard to attempt.

Three sections exist because a reader would otherwise report the container as a
defect: what is knowingly missing (four of five destinations measured but in other
archives, each printing what it would have opened; NEW GAME's skipped chain as a
stated gap), what this container distorts (720p decodes +6.7-6.9% slow, the dummy
audio driver means you hear nothing, the exit leak line is engine-side at 8 to 8),
and how mod overrides report themselves.

The Decoder reported BLOCKED.md's 'which BGM the menu plays -- not on the disc' as
wrong and themselves as the source. The row has been struck and corrected for
days, and I am telling them rather than silently fixing a live row -- their own
asymmetry, that a wrongly-superseded row removes a live question from both views.

The correction already contains the diagnosis they have just made. It says the
negative is bounded -- the TABLES name no screen -- cites li r5 1103 and the
byte-for-byte wave match, and ends: a row here must quote the reach of a negative,
because a negative summarised without its bound reads as a bigger negative than it
is. Their message reports arriving at the same thing independently. Fourth
instance of the connection failure and the sharpest yet: the three before were an
answer sitting unread, this one was an answer sitting ADDRESSED.

Their method note inverts my own v1-to-v3 story and is the transferable part: my
'a report with a standing false positive is one nobody reads' nearly made them
filter a 40-candidate sweep. Instead they measured what the false positives were
-- guessed infrastructural nouns, 5 of 40; the real category was 'not on the disc'
used as a classification legend -- and reading those found the one that was not.
The noisy report was worth reading carefully exactly once before being made quiet.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
2026-08-31 02:25:19 +00:00

4.2 KiB

Running the port

P5's gate is "a human clicks through it", and until now there was no page telling a human how. The commands existed — in boot.gd's header comment and scattered through a twelve-thousand-line DECISIONS.md. A capability that lives only in the record is, to the person who needs it, absent.

Everything below has been run. Where a number is quoted it was measured in this container, and where the container distorts it that is said rather than left for the reader to discover.

1. Build the asset tree

The Godot project reads export/, never the disc.

cargo run --release -p sylpheed-export -- export --disc /disc --out export

Roughly four minutes, most of it transcoding two movies. It rewrites export/ wholesale — never hand-edit anything in there; hand-written decisions live in authored/ beside it, and survive a re-export.

2. The P5 walk, from a cold start

godot --path port -- --boot --play

This is the one a human should judge. It boots the way the game does — two splashes, the ADV intro, the title — hands over to the menu on Ⓐ, and then stays live and waits for input.

you press what should happen
Ⓐ on the title the main menu opens on NEW GAME
⬆ / ⬇ one item, wrapping at both ends
⬅ / ➡ nothing — measured, and implemented as an explicit no-op
Ⓐ on EXTRAS the EXTRAS submenu, opening on MISSION SELECT
Ⓑ in EXTRAS back to the main menu, on the item you left
Ⓑ on the main menu back to the title
Ⓐ on the title again the menu, still on the item you left

That last row is the one worth checking deliberately: the main menu remembers its cursor, and every submenu resets to its own opening item. Both are measured, and they disagree on purpose.

The intro is ~157 s. To skip straight to the menu:

godot --path port -- --menu=main_menu

and to drive it unattended:

godot --path port -- --menu=main_menu --script=down,down,accept,cancel

🔴 --script without --play or --menu refuses and says so. It used to parse, be stored, and do nothing.

3. What is knowingly missing — not bugs

Four of the five main-menu destinations are measured but not in this export: they live in other archives (GP_SAVE_LOAD, GP_OPTIONS, …). Pressing Ⓐ on them prints what it would have opened and why it cannot:

(LOAD GAME) opens a screen this export does not carry:
   The save-slot list is GP_SAVE_LOAD, not in this export. Destination MEASURED.

EXTRAS is the only Ⓐ-into-a-submenu this milestone can walk, which is why the P5 gate rests on it.

NEW GAME is a deliberate gap of a different kind: the real chain is NEW GAME → DIFFICULTY → SELECT DATA → the S00A movie, and the port jumps to the movie, printing the two screens it skipped. That is a gap, stated out loud; nobody should read the port's behaviour there as the game's.

4. What this container distorts

  • No GPU. 720p Theora decodes +6.7 % … +6.9 % slower than real time here (5 runs, both movies, on a quiet box). The boot's printed seconds carry that deficit. It is a property of the machine, not of the port.
  • No sound card. Godot falls back to a dummy driver, so you will hear nothing. The audio is present and measurable — docs/port/AUDIO-VERIFICATION.md answers every audio question without a device, and tools/port/verify-menu-audio asserts it — but "I heard it" is not available in here.
  • A leaked-object warning at exit is engine-side, not the port's. Measured: releasing every reference the port owns moves the count from 8 to 8.

5. Modding

data/mods/ shadows export/ by path. Each override is announced as it is read, and at the end of a run any file that can never apply is listed:

mod:   sprites/title/main_menu/ptbase.png  <-  data/mods/...
mods:  1 file(s) in data/mods can shadow NOTHING -- no such path in the export:
  inert: sprites/title/TYPO_menu/pteff05.png

A file whose path exists in the export but was simply not read this run is not listed. See docs/port/MODDING.md for the five rules the asset tree keeps.