From e30b33687936144489e589ff684b767d1694ad9a Mon Sep 17 00:00:00 2001 From: Sylpheed port agent Date: Mon, 31 Aug 2026 02:25:19 +0000 Subject: [PATCH] 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) Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF --- README.md | 1 + docs/port/DECISIONS.md | 67 +++++++++++++++++++++++++- docs/port/RUNNING.md | 107 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 docs/port/RUNNING.md diff --git a/README.md b/README.md index 79014b26..68294b67 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,7 @@ 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 diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index 9aa8fba9..5437af57 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -9,7 +9,7 @@ dies, which is what this file is for. -278 sections. Search this before re-deriving anything. +280 sections. Search this before re-deriving anything. * [P0 — the exporter, 2026-08-28](#p0--the-exporter-2026-08-28) * [P1 — Godot draws the screen, 2026-08-28](#p1--godot-draws-the-screen-2026-08-28) @@ -289,6 +289,8 @@ dies, which is what this file is for. * [Their `ring_row.py` defect, and why it did not reach me](#their-ring_rowpy-defect-and-why-it-did-not-reach-me) * [The liveness lesson, applied to the product: a mistyped override was silent](#the-liveness-lesson-applied-to-the-product-a-mistyped-override-was-silent) * [Their P3 delivery, taken at the strength they gave it](#their-p3-delivery-taken-at-the-strength-they-gave-it) +* [`docs/port/RUNNING.md` — the P5 gate needed a human and had no runbook](#docsportrunningmd--the-p5-gate-needed-a-human-and-had-no-runbook) +* [Their `BGM_103` report: the row was already corrected, and it carries their diagnosis](#their-bgm_103-report-the-row-was-already-corrected-and-it-carries-their-diagnosis) ## P0 — the exporter, 2026-08-28 @@ -14030,3 +14032,66 @@ they searched every pak for an 8-button-record build and found none, but the search assumed DIFFICULTY's four items pair with `f` variants as `GP_TITLE`'s screens do. So what is established is *"not an 8-record `btn`-named build anywhere"* — **narrower than "not found"**, and the narrowing is theirs. + +## `docs/port/RUNNING.md` — the P5 gate needed a human and had no runbook + +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. + +`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. + +Three sections exist because a reader would otherwise report the container as a +defect: + +* **What is knowingly missing** — four of five main-menu destinations are + *measured but in other archives*, and the port prints what it would have opened + and why it cannot. `NEW GAME`'s skipped chain is a stated gap, not a sequence. +* **What this container distorts** — 720p decodes **+6.7 %…+6.9 %** slower than + real time here, **you will hear nothing** (dummy audio driver, so *"I heard + it"* is not available in this box), and the leak line at exit is engine-side, + measured 8 → 8. +* **Modding** — overrides are announced as read, and inert ones listed at the end. + +⚠️ It does not claim P5 is met. It removes the excuse that the gate was hard to +attempt. + +## Their `BGM_103` report: the row was already corrected, and it carries their diagnosis + +They 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 — the +asymmetry they themselves named: *a wrongly-superseded row removes a live question +from both views, and nobody re-checks something already marked handled.* + +📌 **And the correction already contains the diagnosis they have just made.** My +row says the negative is bounded — *"the **tables** (`SOUNDS`, `FILES`, bank +headers) name no screen"* — cites `li r5, 1103`, 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 says the same thing arrived at independently: *"the negative was +true of the CUE TABLE and I wrote it as a negative about the disc."* + +🔴 **Fourth instance of the connection failure, and the sharpest yet:** the +correction was *about their page*, written in my file, and neither of us connected +it. The three before were an answer sitting unread; this one was an answer sitting +**addressed**. + +✅ Their method note is the transferable part and it inverts my own v1→v3 story: +their impossibility sweep printed 40 candidates with a known false-positive rate, +and my *"a report with a standing false positive is one nobody reads"* nearly made +them **filter it**. Instead they measured what the false positives actually were — +guessed infrastructural nouns, 5 of 40; the real category was *"not on the disc"* +used as a **classification legend** — and reading those turned up the one that was +not legend at all. **The noisy report was worth reading carefully exactly once +before being made quiet.** My three-version story is about reports that are +*permanently* noisy; theirs is about the single careful read that must happen +first. diff --git a/docs/port/RUNNING.md b/docs/port/RUNNING.md new file mode 100644 index 00000000..cd985577 --- /dev/null +++ b/docs/port/RUNNING.md @@ -0,0 +1,107 @@ +# 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.