diff --git a/docs/agents/CONTAINER-NOTES.md b/docs/agents/CONTAINER-NOTES.md index 82335c9b..0ae5fca5 100644 --- a/docs/agents/CONTAINER-NOTES.md +++ b/docs/agents/CONTAINER-NOTES.md @@ -95,6 +95,28 @@ indirect_dispatch_candidates 1 827 297 dispatch_pc, vtable_address, method_addr `instructions.raw` is an **INT, not hex** — a trap this corpus has already paid for. Query with `python3 -c 'import duckdb'`; it is not SQLite. +### ⚠️ It is derived data, and it is wrong in places + +The image is **primary** — those are the bytes the console executed. The database +is **an analysis of them**, produced by a disassembler that had to guess, and it +fails the way disassemblers fail: + +* **misdecoded mnemonics** — data read as code, or a decoder-table gap, produces + a plausible instruction that was never executed as one; +* **wrong function boundaries** — `end_address` short or long, neighbours merged, + one function split in two; +* **incomplete coverage** — code reached only through indirect dispatch may be + absent entirely; the 1.8 M `indirect_dispatch_candidates` are *candidates*; +* **invented names** — largely derived rather than symbols, so a name is a + hypothesis wearing a label. + +**A finding resting on a database row is not established until the bytes agree.** +Read the same address out of the `.pe` and check. Where they disagree the image +wins, and the disagreement is worth recording — it tells the next reader which +parts of the database to distrust. + +It is a fast index into 9.2 MB of machine code. It is not a source of truth. + ### These mounts are reference material, not a deliverable They are read-only and they come from outside the repository, which means a diff --git a/docs/agents/decoder-loop.md b/docs/agents/decoder-loop.md index 06a95213..a71515d3 100644 --- a/docs/agents/decoder-loop.md +++ b/docs/agents/decoder-loop.md @@ -38,6 +38,52 @@ If the merge conflicts, resolve it, say so in your reply, and carry on. 6. `docs/re/INDEX.md` — what is decoded. Re-deriving a ✅ row is not a finding. 7. `docs/game/navigation.md` — how the game is navigated, **from the player's side**. Fill it in as you go: you are the one who sees the real screens. +8. `docs/agents/CONTAINER-NOTES.md` — the container's tooling, and the reference + assets described below. + +## Reference assets you may not know you have + +Your session is new each time the container restarts, so this is repeated here +rather than left in a document you might not reach. + +| path | what | env | +|---|---|---| +| `/image/sylpheed.pe` | the decompressed executable image | `SYLPHEED_PE` | +| `/xenia-rs/sylpheed.db` | a disassembly database, 586 MB | `SYLPHEED_DB` | +| `/disc` | the extracted disc | `SYLPHEED_DISC` | +| `/iso/game.iso` | the retail ISO Canary boots | `SYLPH_ISO` | +| `/canary` | the Canary source, read-write | `XENIA_SRC` | + +**The `.pe` is a flat VA dump**: file offset = `VA - 0x82000000`. Reading +`0x820A1630` is `seek(0xA1630)`. No XEX decrypt, no LZX, **no booted emulator** — +dumping guest memory works but makes the whole static corpus depend on a running +game, and it does not have to. An earlier claim that this file was *stale* was +tested and **refuted**; it is current. + +The database holds 25 481 functions, 851 classes with RTTI, EH tables, imports, +1 526 function-pointer arrays and 1.8 M indirect-dispatch candidates. Query it +with `duckdb` — it is not SQLite. `instructions.raw` is an **INT, not hex**. + +### ⚠️ The database is derived, and it can be wrong + +The image is **primary**: those are the bytes the console executed. The database +is **somebody's analysis of them**, produced by a disassembler that had to guess, +and it is wrong in the ways disassemblers are wrong: + +* **Mnemonics can be misdecoded** — data read as code, or a decoder-table gap, + yields a plausible instruction that was never executed as one. +* **Function boundaries can be wrong.** `end_address` may be short or long; + neighbouring functions may be merged, or one split in two. +* **Coverage is incomplete.** Code reached only through indirect dispatch may not + appear at all — the 1.8 M `indirect_dispatch_candidates` are *candidates*. +* **Names are largely derived, not symbols.** A name is a hypothesis with a label. + +So: **a finding that rests on a database row is not established until the bytes +agree.** Read the same address out of the `.pe` and check. Where they disagree, +the image wins and the disagreement is itself worth recording — it tells the next +reader which parts of the database to distrust. + +Treat it as a fast index into 9.2 MB of machine code, not as a source of truth. ## The oracle