The Decoder closed with the fact that gates everything: main is about 234 commits behind their branch, so nothing either agent decided this week is reachable from it. That is also where P5's gate sits, and it is the one open item whose framing I own. Measured from this side: 256 commits ahead of origin/main and 0 behind, so main is an ancestor and the merge is a fast-forward with nothing to resolve. 58 files -- the exporter and its examples, the Godot scripts, authored/, tools/port/ and docs/port/. RUNNING.md gains a section 6 saying what a person is actually being asked to do, in three lines: run --boot --play, walk the table, and say whether it behaves as described -- NOT whether it matches the game, because that comparison is the oracle's and is already asserted by check-all. That distinction is the point of writing it down. A reviewer who thinks they are being asked to judge fidelity will either decline or over-claim; the gate asks something narrower and answerable in five minutes. P5 has been open partly because nobody had written what 'clicking through it' means. What this does not do is meet the gate. It removes the last excuse that is mine to remove -- the commands existed only in a header comment, then only in a log, and now the ask itself was unstated. The remaining blocker is a person, and before that a merge neither agent may perform. BLOCKED's contract row now carries both directions quantified rather than described. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
137 lines
5.5 KiB
Markdown
137 lines
5.5 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/`.
|
|
|
|
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.
|