Merge pull request 'chore: retire the last dead paths and names from the consolidation' (#47) from chore/retire-leftover-names into main
Some checks failed
CI / Native — linux (push) Has been cancelled
CI / WASM — Web (push) Has been cancelled
CI / Formatting (push) Has been cancelled

Reviewed-on: #47
This commit was merged in pull request #47.
This commit is contained in:
2026-09-17 05:11:31 +00:00
60 changed files with 199 additions and 113 deletions

View File

@@ -27,6 +27,30 @@ that is the correct reading: **each unresolved path here is work outstanding.**
---
## ✅ Closed 2026-09-16
**The end state is reached: two live repositories.** `Syplheed-Reborn`,
`Sylpheed-Godot`, `xenia-rs` and `xex2tractor` are archived read-only on Gitea
(by the human, 2026-09-16), not deleted. The harvests are on `main`: the DuckDB
tool (`crates/sylpheed-xexdb`, #32), the import-thunk naming (#35, re-landed as
#39), the xex2tractor reference files (#30) and the orphan assets (#34). The last
reference files from the project root follow in #46. `sylpheed.db` lives in this
repository's root and was rebuilt from scratch.
| phase | outcome |
|---|---|
| **5** archive | ✅ the four repos archived; `xenia-rs` and `sylpheed-reborn` clones deleted from this machine (the other two never had one here) |
| **7** drops | ✅ `Sylpheed/target/` deleted; `agent-backups/`, `stock-oracle/`, `texcompare/`, `ship_render/`, the `pi/*` branches and the root Canary logs are not on this machine |
| fork | ✅ Canary's default branch is `sylpheed-re`, no longer `xenia-rs` |
Still the human's, unchanged: the **retention** question (all repositories are
public; `docs/re/captures/` holds game screenshots) and the **history rewrite**,
recommended against in Phase 5.
The rest of this page is the working record as it stood during the move. Its
paths into the retired repositories no longer resolve because those clones are
gone, not because work is outstanding.
## Where things stand
| repo | server | local tree | tracked | disposition |
@@ -127,7 +151,7 @@ Four things exist only there.
| take | why |
|---|---|
| **XEX2 devkit + XEX1 retail master keys** | `xenia-xex` hardcodes retail only; devkit is present but `#[allow(dead_code)]` and XEX1 is absent. xex2tractor tries all three in a validating loop. |
| ~~**XEX2 devkit + XEX1 retail master keys**~~ | `xenia-xex` hardcodes retail only; devkit is present but `#[allow(dead_code)]` and XEX1 is absent. xex2tractor tries all three in a validating loop.**Not taken, by decision (human, 2026-09-16):** Project Sylpheed is a retail XEX2, so the retail key is the only one needed — the dead devkit key was removed from `sylpheed-xex` instead. |
| ~~**`extract -r`**~~ | 🔴 **RUN, AND THE INFERENCE WAS WRONG** — see the gate below. Optional, and dangerous if it is ever mistaken for the `.pe`. |
| **`doc/xex2_format.md`** (39 KB) and **`doc/xbox360_exports.json`** (938 KB, 2,913 exports across xboxkrnl / xam / xbdm) | byte-identical to untracked loose copies in the project root. Tracked by **no repo**. |
| **`LICENSE`** (MIT) | Sylpheed has none. |
@@ -413,7 +437,7 @@ citations" turn out to be one.)
is a deletion on the human's disk, and rebuilding it is hours, so it stays until
asked for.
## Phase 5 — Verify the invariant, then archive **NOT STARTED**
## Phase 5 — Verify the invariant, then archive **DONE 2026-09-16**
For each of `Syplheed-Reborn`, `Sylpheed-Godot`, `xenia-rs`, `xex2tractor`:
re-run the containment check **at that moment** — not from this page's ledger,
@@ -472,7 +496,7 @@ Tracked by nobody today, and tools or references by the two-repo rule:
| `scratch/xbg7/extract.py` — clean-room XBG7 scanner | superseded by `sylpheed_formats::mesh`; keep as history or drop |
| `Sylpheed-try/…/examples/_voice_span.rs` — 46-line untracked probe | keep or drop |
## Phase 7 — Intended drops **NOT STARTED**
## Phase 7 — Intended drops **DONE 2026-09-16**
Stated so that nothing is dropped by omission.
@@ -490,7 +514,7 @@ Stated so that nothing is dropped by omission.
---
# ▶️ STATUS 2026-09-13 — paused here, for the other machine to finish
# STATUS 2026-09-13 — paused here, for the other machine to finish (superseded: see ✅ Closed 2026-09-16 at the top)
**Six of eight phases are done and pushed.** Everything below is committed;
nothing is left in a working tree. Five pull requests are open and **none has
@@ -506,8 +530,8 @@ been merged** — merging is the human's, and #32 contains #30 and #31.
| **4** captures + the missing check | ✅ done | **PR #33** `fix/capture-citations` |
| **6** adopt the orphan assets | ✅ done | **PR #34** `chore/adopt-orphan-assets`, + Canary `99cc72662` |
| — containers and agents | ✅ done | **PR #31** `docs/containers-setup` |
| **5** archive the four repos | **open — needs the human** | |
| **7** intended drops | **open — partly needs the human** | |
| **5** archive the four repos | ✅ done 2026-09-16 | archived by the human |
| **7** intended drops | ✅ done 2026-09-16 | |
## 🔴 Five claims on this page were wrong. Read these before trusting the rest.

View File

@@ -60,7 +60,7 @@ dialogue folds into L/R, so this changes how speech sits against music — an
aesthetic judgement, not a container detail. Pin it explicitly and record it,
exactly as MISSION §6 requires of the transcode command itself.
[mac]: https://git.mc02.dev/fabi/Syplheed-Reborn/src/branch/main/docs/re/structures/movie-audio-channels.md
[mac]: ../re/structures/movie-audio-channels.md
## 2. Engine routing — Godot writes a WAV instead of a device

View File

@@ -3579,8 +3579,8 @@ matches build 4. The conclusions are unchanged, the indices are not.
**So the next step is the guest code**, not the file: the splash draw path from
the emulator-era work (`sub_821CC7A0`, item vtable `0x820b30b4`) submits with
exactly the PS hash `E59B2B3D` this capture sees, and `xenia-rs/sylpheed.db` is
available in the container.
exactly the PS hash `E59B2B3D` this capture sees, and `sylpheed.db` (repository
root, queried with `tools/zq.py`) is available.
**And a second screen is NO LONGER BLOCKED, but it is not routine either.** The
main menu has been reached (screenshot in

View File

@@ -101,13 +101,14 @@ XEX load, identical across our emulator and canary.
`--dump-addr`) went with that emulator when it was retired on 2026-09-16. For static
`.rdata` reads that `--dump-addr` served, read the `.pe` directly: it is a flat VA dump,
file offset = `VA 0x82000000`.
- **Oracle (correctness ground truth):** canary — the **Wine cross-build**
`xenia-canary/build-cross/bin/Windows/Debug/xenia_canary.exe` (the native Linux ELF
**crashes / does not run** — do not use it). This is the only emulator that reaches the
in-game menu; our retired `xenia-rs` never got past the intro video. Use canary to *observe output*
(capture its framebuffer for texture colours), not usually to instrument code — though its
`build-cross` toolchain does compile, so small C++ probes + rebuild are possible when needed.
Run **muted, one emulator process at a time**, point it at the real ISO (not the symlink).
- **Oracle (correctness ground truth):** canary, in either of two builds — the **Wine
cross-build** in `xenia-canary/build-cross/bin/Windows/Debug/` (launched by
`run-canary-safe.sh`) or the **native Linux build** in `xenia-canary-native/` (launched by
`run-canary-native-safe.sh`). This is the only emulator that reaches the in-game menu; our
retired `xenia-rs` never got past the intro video. Use canary to *observe output*
(capture its framebuffer for texture colours), not usually to instrument code — though both
builds compile, so small C++ probes + rebuild are possible when needed.
Run **muted, one emulator process at a time**, point it at the real ISO.
> ⚠️ **VA-equality caveat:** join **code** by PC (fixed), but **never** assume a data VA
> holds the same bytes across emulators — allocators differ. Compare data by content/layout.

View File

@@ -115,7 +115,7 @@ extraction limit.
field registrations (`name → offset`) and default-init stores
(`offset → value`), join them — heavy, and offset↔name correlation is
error-prone. (B, runtime) dump a loaded craft object's registry
(`obj+64`) / struct from xenia-rs or Canary — a fully-loaded craft already
(`obj+64`) / struct from Canary — a fully-loaded craft already
holds every default; one dump yields `name → value`. **B is the efficient
finish** given the framework is generic; A's framework map above is the
prerequisite either way.

View File

@@ -172,7 +172,7 @@ in guest memory that never changes.
The question is now narrow: **which guest PC is the spinning thread executing?**
Canary knows every `XThread`'s PPC context, so a diagnostic that dumps each
thread's guest PC on demand (or after N seconds without a frame) would name the
loop, and `xenia-rs/sylpheed.db` can then say what function it is in. That is a
loop, and `sylpheed.db` (`tools/zq.py fn <pc>`) can then say what function it is in. That is a
`build-canary` run plus a reproduction — the cost is worth stating up front, and
it is the only avenue that does not involve guessing.

View File

@@ -1251,7 +1251,7 @@ and it is worth recording rather than re-attempting the same way.
(`%rsi` here, given `mov 0x110(%rsi),%rbx`), so the **guest PC is recoverable
from the context block** at the moment of the write. Reading the right offset out
of `$rsi` would name the guest instruction. That needs Xenia's context layout —
which is in the xenia-rs sources on this box — and is a separate, tractable
`PPCContext` in Canary's `src/xenia/cpu/ppc/ppc_context.h` — and is a separate, tractable
piece of work rather than another blind run.
## 🟡 `sub_8226E458` is a splice — but I have not shown it touches the trigger queue

View File

@@ -379,7 +379,7 @@ nothing rises above chance.
**What would actually settle it** is the code — find what reads a `REGN`
object in the executable and watch which fields it dereferences. That is static
PE work (`/work/*.pe`, offset = VA 0x82000000) of the same kind that cracked
PE work (the flat `.pe` in the project root, offset = VA 0x82000000) of the same kind that cracked
the `.slb` packing phase, and it is the honest next step rather than a
twenty-first correlation.
---

View File

@@ -322,7 +322,7 @@ self-describing.
`game:\dat\sound.pak+` and `SETTINGS.PARAM` is `Pj_Silph.xgs`, so there is code
that opens a bank by name and seeks to its data; the constant, or the table it
indexes, should be visible there. That is static PE work
(`/work/*.pe`, offset = VA 0x82000000), not another pass over the archive —
(the flat `.pe` in the project root, offset = VA 0x82000000), not another pass over the archive —
this page has taken the byte-level evidence about as far as it goes.

View File

@@ -244,7 +244,7 @@ that gets adopted as a rule if only the agreeing five are counted.
## A foothold in the guest code, and what it is not
The remaining avenue is the code, and `xenia-rs/sylpheed.db` is in the container.
The remaining avenue is the code, and `sylpheed.db` is in the repository root (`tools/zq.py`).
What is established so far is small, and stated so it is not mistaken for more:
* **The item class from the splash-era work is real.** Vtable `0x820b30b4` is