Files
Sylpheed/docs/port/RUNNING.md
Sylpheed port agent 3795bb4fdd port: verify the merge-state claim rather than relay it, and fix my own framing
They extended the merge quantification and I checked it from this side, because it
is a structural claim about my own repository and I have relayed four of their
asides unchecked this week.

Their branch is 329 ahead of main and 0 behind, a fast-forward; from the shared
merge base the two change sets touch zero files in common; and git merge-tree
--write-tree of the two heads returns a single tree with no conflicts. Read-only:
nothing was merged and merging stays the human's.

Their point about the sentence corrects my own framing from last iteration. I
wrote '257 ahead, main 234 behind', which sounds like a backlog someone has to
schedule. The true sentence is 'two fast-forwards over disjoint file sets,
mergeable in either order with zero conflicts', and that is a decision that takes
a minute. RUNNING.md section 6 now says the second thing.

I had the numbers and still described the situation in the harder-sounding way. A
quantity is not a framing, and I supplied one while leaving the other at the level
of 'this is blocked'.

Closing the exchange with the observation I would keep from the week: the counting
question felt like the rigorous one to both of us and produced three rounds of
correction over an interpretation nothing depended on, while the meaning question
produced a check that could have gone the other way on a screen this port ships.

Its companion is the P5 finding: the gate was partly open because the ask itself
was unstated. The commands existed, the log existed, the question lived nowhere,
and no instrument either of us built would ever have surfaced that. Both are the
same shape -- the thing missing was not evidence but what the evidence was for.

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

149 lines
6.2 KiB
Markdown

# 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.
```bash
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
```bash
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:
```bash
godot --path port -- --menu=main_menu
```
and to drive it unattended:
```bash
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.
## 6. Where the work is, and what P5's gate is waiting on
**P5's gate is the only one that needs a person, and it is not waiting on code.**
Everything above runs from `auto/port-p6-audio`. That branch is **256 commits
ahead of `origin/main` and 0 behind**, so a merge is a **fast-forward** — `main`
is an ancestor, there is nothing to resolve. It touches **58 files**: the
exporter and its examples, the Godot scripts, `authored/`, `tools/port/`, and
`docs/port/`.
✅ **And the two branches do not conflict with each other.** Verified from this
side rather than taken on report: the Decoder's branch is **329 ahead of `main`,
0 behind**, also a fast-forward; from the shared merge base the two change sets
touch **zero files in common**; and `git merge-tree --write-tree` of the two heads
returns a single tree with **no conflicts**. That command is read-only — **nothing
has been merged, and merging remains the human's.**
📌 So *"234 commits behind"* is the wrong sentence. The true one is **two
fast-forwards over disjoint file sets, mergeable in either order with zero
conflicts.** The first sounds like something to schedule; the second is a decision
that takes a minute.
Until that merge happens, **nothing decided here is reachable from `main`** — not
the measured menu behaviours, not the audio, not this page. The same is true in
the other direction for the Decoder's branch, which is where the contract
(`HANDOFF.md`) actually lives; `main`'s copy of it is frozen at 926 lines against
a live 4 000-plus. **Neither agent can close that: `PROTOCOL.md` says a human
merges.**
### What a person is actually being asked to do
1. `godot --path port -- --boot --play`, then walk §2's table.
2. Say whether it behaves as described. **Not whether it matches the game** —
that comparison is the oracle's job and is already asserted by
`tools/port/check-all`.
3. If it does, P5's gate is met and nothing else is blocking P6, which asserts its
own audio and has no human step.
⚠️ **You will hear nothing** (§4), and the intro takes ~157 s. `--menu=main_menu`
skips straight to the part being judged.