Merge pull request 'chore: retire the last dead paths and names from the consolidation' (#47) from chore/retire-leftover-names into main
Reviewed-on: #47
This commit was merged in pull request #47.
This commit is contained in:
@@ -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.
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
---
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user