mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-09-26 13:33:34 -04:00
docs(phase-34): task 6 addendum — Drew's #ai reply posted; docs/outreach/ untracked and ignored on his decision (sent notes stay local); doc_links DEFAULT, Reference-index row, SETUP rows updated; corpus regenerated
This commit is contained in:
@@ -422,3 +422,8 @@ unsloth_compiled_cache/
|
||||
/.run/P34/c11/*
|
||||
!/.run/P34/c11/*.log
|
||||
!/.run/P34/c11/*.txt
|
||||
|
||||
# Outreach drafts (P34 task 6, Drew's decision 2026-09-08): the notes to neighbouring projects were SENT (the Archipelago issue,
|
||||
# the decomp.me preset request, the tools post, the #ai reply); the drafts stay on the maintainer's machine and leave the tree
|
||||
# from here (no rewrite — they are in the published history). Contents form, R84.
|
||||
/docs/outreach/*
|
||||
|
||||
@@ -200,6 +200,16 @@ PCSX-Redux, then the disc rebuild with recompressed payloads.
|
||||
- **JP (SLPS-01490) and the prototypes as extra versions** — the two prototype executables are already imported
|
||||
programs with tracked annotations (`config/ghidra/ROSTER.md`).
|
||||
- **The decomp.me preset** (E1) and **libs-from-source for the Sony regions** — small and large stretches respectively.
|
||||
- **xsig v2 — the whole knowledge base behind one search (owner's direction, 2026-09-08, P34 task 6).** Today
|
||||
[`tools/xsig/`](../tools/xsig/) answers one question: an exact match on the relocation-masked word stream (the in-tree
|
||||
"normalized" tier), plus a first-difference classifier. Drew's intent for its next form: given a function, find its 1-to-1
|
||||
matches first, then **widen along the best expansion path** — the opcode-sequence tier (registers and immediates masked; the
|
||||
in-tree `h_seq`), the structural family (`family_sweep` / `family_remap`), then cousins by the atlas's similarity scoring —
|
||||
and return the best available result WITH its context: which tier matched, what differs (constant flip, register, length),
|
||||
which banked sibling's spelling to port (R71), and how far the expansion had to go. The pieces exist in-tree
|
||||
(`sig_image.py`'s tiers, the family engine, `atlas.py`); the work is a portable, game-free re-cut of them behind xsig's
|
||||
interface, with fixtures built from our own C as the xsig tests are (R74). Sequenced after the readability phases; the
|
||||
measured cross-game numbers in xsig's README are the baseline it must beat.
|
||||
|
||||
## 8. Governance for Gen3
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ DEFAULT = ["README.md", "THIRD_PARTY.md", "CLAUDE.md", "src/NOTICE.md", "tools/R
|
||||
"docs/story.md", "docs/story-timeline.md", "docs/retrospective.md", "phase-ends/README.md", "phase-ends/DIGEST.md",
|
||||
"docs/gcc-2.7.2-map/README.md", "tools/xsig/README.md",
|
||||
"docs/permuter-ils.md", "docs/matching-drafter-pipeline.md",
|
||||
"docs/gen3-handoff.md", "docs/decompme-preset.md", "docs/outreach/archipelago.md", "docs/outreach/tools-announcement.md",
|
||||
"docs/gen3-handoff.md", "docs/decompme-preset.md", # docs/outreach/ left the tree at P34 task 6 (Drew, 2026-09-08)
|
||||
"docs/gen3-standards.md", "docs/phase34-seed.md",
|
||||
"decomp-architect/README.md"] # P33.5 task 11: the kit's README is public-facing
|
||||
# whole directories in the default set (P33 F3): the wiki pages and the how-to chapters — every file, so a new page is
|
||||
|
||||
+3
-3
@@ -790,8 +790,8 @@ Every script under `tools/` (plus the two report make-targets), grouped by purpo
|
||||
| | `tools/verbatim_target_s.py --binary B --fn F [--out DIR] [--gas] \| --all [--gas]` | **(P31 S75)** Regenerates the splat-format target `.s` (the `/* off vaddr word */` word oracle) for a §265 verbatim body from the EXTRACTED IMAGE — a listing, never assembled by anything here. **(P34 task 2, 2026-09-08) `--gas`** writes `<fn>.gas.s`, the ASSEMBLABLE form: `$`-registers, `.L<addr>` labels for in-function branch/jump targets, symbol names (or `func_<ADDR>`) for external `j`/`jal`, `.set noat` + `.set noreorder` (the listing carries its delay-slot nops), no `.include`; the comment column is kept so the word oracle reads either form. This is what a decomp.me scratch takes as its target (the listing fails there: `invalid operands 'li a2,2'`); proven per function by `decompme_replica.sh` step D. |
|
||||
| | `tools/decompme_replica.sh` | **(P33 E1)** Runs a function through decomp.me's EXACT PS1 `gcc2.7.2-psx` toolchain locally — old-gcc 0.13 (tarball sha256-checked into `.run/decompme/`) + maspsx `86ccd7d8` (from the submodule's object store) behind the image's two-line `as` wrapper, driven by the backend's own two commands — and compares the code words to the ROM-derived target (`verbatim_target_s.py`); our Makefile pipeline on the same TU is the control (exit 3 if IT fails), then cc1 and maspsx are swapped one at a time so a difference names its producer. Default probe `func_80018F20`; `--src TU --fn NAME [--binary B] [--flags "…"]`; `--upstream` compares decomp.me's current Dockerfile pins with the script's constants. Trailing gas padding is reported, never counted. Exit 0 = the preset reproduces the function byte-identically on decomp.me's toolchain. **(P34 task 2, 2026-09-08)** Two more steps: **D** proves the target in the form Drew PASTES (`verbatim_target_s.py --gas`) through decomp.me's own `as` wrapper (fed on STDIN — a file argument blocks it), linked at the function's address and compared word for word; **E** writes Drew's bundle `.run/decompme/drew_bundle/` (1–4) from the proven run. PASS now needs A AND D (exit 4 = compile matches but the paste does not round-trip). Why: the splat-format listing §5 used to name is the word ORACLE — nothing assembles it — and it failed on decomp.me with `invalid operands 'li a2,2'`. |
|
||||
| | `docs/decompme-preset.md` | **(P33 E1)** The decomp.me preset (fields, name, flags), why each flag, the measured decomp.me-vs-ours toolchain table (0.13 vs 0.17 cc1; maspsx `86ccd7d8` vs `874855c5` — 4 commits, both behavioural ones gated on aspsx < 2.30), the recorded `decompme_replica.sh` PASS + its two negative controls, and Drew's post-flip browser session (scratch → 100% → the preset-request issue on decompme/decomp.me → the manual search closing ledger row 14). |
|
||||
| | `docs/outreach/archipelago.md` | **(P33 E2)** The Archipelago outreach: what AP and the BFM world are (v0.8.1, BizHawk, US+JP, 342 polled addresses, runtime-injected MIPS patches), the table of what our source says about their data (the day-of-week byte CONFIRMED and our memory map corrected; their four patch sites and the Time-Sanity hook resolved to shared engine functions; the town-ID patch retired as historic; the version-check string offset), what we ask (their unpublished US RAM notes; attribution consent), the ready-to-send GitHub issue + a Discord short form (plain style; send only after the flip), and the G5 procedure for the reply. |
|
||||
| | `docs/outreach/tools-announcement.md` | **(P33 S89)** The post-flip announcement of xsig for the decomp community (Discord tools channel / a Decompedia tools-page row), written in a developer's voice, with the facts it rests on. |
|
||||
| | `docs/outreach/archipelago.md` (local only — untracked at P34 task 6, Drew 2026-09-08, after the note was sent) | **(P33 E2)** The Archipelago outreach: what AP and the BFM world are (v0.8.1, BizHawk, US+JP, 342 polled addresses, runtime-injected MIPS patches), the table of what our source says about their data (the day-of-week byte CONFIRMED and our memory map corrected; their four patch sites and the Time-Sanity hook resolved to shared engine functions; the town-ID patch retired as historic; the version-check string offset), what we ask (their unpublished US RAM notes; attribution consent), the ready-to-send GitHub issue + a Discord short form (plain style; send only after the flip), and the G5 procedure for the reply. |
|
||||
| | `docs/outreach/tools-announcement.md` (local only — untracked at P34 task 6 after the posts went out) | **(P33 S89)** The post-flip announcement of xsig for the decomp community (Discord tools channel / a Decompedia tools-page row), written in a developer's voice, with the facts it rests on. |
|
||||
| | `docs/wiki/Tools-from-this-project.md` | **(P33 S89)** The wiki page mirroring the README's "Tools from this project" section: xsig, the permuter driver (upstream as a pinned unmodified submodule + our class swap; offered upstream and declined), the codegen map, the decomp.me replica, the drafter write-up, the how-to. Linked from the sidebar and the Home table. |
|
||||
| | `docs/gen3-standards.md` | **(P33 S89)** The charter for Gen3 and the project's public standard: §1 accuracy (met; whole-binary SHA1 every build, no NON_MATCHING, clean rebuild per batch — stricter than the field), §2 readability (sotn STYLE.md adopted as baseline + four rules of our own: names only with evidence, every pin off or `// !FAKE:`, shared bodies as C not macros, types from code / names from observation), §3 the use of AI — conduct (byte gate as the only claim; no guessed names; outward text written by a person; no automated traffic to decomp.me; target projects' AI policies followed), §4 the measured gap and the order of work + a proposed definition of done. |
|
||||
| | `docs/phase34-seed.md` | **(P33 S89)** The seed for Phase 34 (re-charter, Drew 2026-09-07): Phase 33 closes on what is done (v1.32.0); the flip-gated remainder — probe, C10, E1/E2/D3/F3 outward, tool discoverability, C11, the v2.0.0 PhaseEnd = Gen2 EXIT — becomes Phase 34 with every task's actor, effort and carrying document, the full inventory of what Phase 33 delivered, and the milestone (Phase 33's original items 2–4). Gen3 opens at Phase 35. |
|
||||
@@ -1171,7 +1171,7 @@ fills fast). Nothing is leaking — but the host does not get the memory back on
|
||||
[PROG]`); Makefile `GHIDRA_PROJ := $(or $(BFM_GHIDRA_PROJ),$(CURDIR)/ghidra)`.
|
||||
|
||||
### P33 E2 (S89, 2026-09-07) — the Archipelago outreach note, with our source's answers to their addresses
|
||||
- `docs/outreach/archipelago.md` (NEW; in `doc_links`' default set). Read from `AegeusEvander/Brave-Fencer-Musashi-AP-World`
|
||||
- `docs/outreach/archipelago.md` (NEW; in `doc_links`' default set until P34 task 6 untracked the folder — sent, local only). Read from `AegeusEvander/Brave-Fencer-Musashi-AP-World`
|
||||
(v0.8.1, last push 2026-09-07; `client.py` 5,522 lines / 342 addresses; runtime code injection `patch/en/*c.bin` + `*Hooks.bin`;
|
||||
no license). **Derived for them and banked in `docs/memory-map.md` (G5/code-derived):** their day-of-week read `0x078eba` is
|
||||
CORRECT — `func_8014B084` (shared) does `day = day+1` (u16 0x80078EAC, wraps to 1 at 0x16E) and `dow = (dow+1) % 7` (u8
|
||||
|
||||
@@ -1,114 +0,0 @@
|
||||
# Outreach: the Brave Fencer Musashi Archipelago world (P33 E2)
|
||||
|
||||
> **What this is (2026-09-07).** The note Drew sends to the author of the BFM Archipelago world after the public flip, the
|
||||
> facts behind every sentence in it, and what we do with the reply. Everything numeric below was read from the world's
|
||||
> repository on 2026-09-07 (as data, X2) or derived from our own source and disc.
|
||||
|
||||
## 1. What Archipelago is, and what the BFM world is
|
||||
|
||||
**Archipelago** (archipelago.gg, `ArchipelagoMW/Archipelago`) is a multi-game *multiworld randomizer*: several players play
|
||||
several different games at once; each game's items are shuffled into the item locations of all the games in the session,
|
||||
so finding a chest in one game may send an item to another player's game. Each supported game is a **world** (an
|
||||
`.apworld` plugin): the randomization logic (items, locations, regions, rules) plus a **client** that reads and writes the
|
||||
running game's memory to detect checks and grant items. Console games are driven through an emulator connector; for
|
||||
PlayStation that is BizHawk's Lua bridge, which exposes `MAIN_RAM` (the 2 MB of PS1 RAM, offset 0 = `0x80000000`).
|
||||
|
||||
**The BFM world** — `github.com/AegeusEvander/Brave-Fencer-Musashi-AP-World`, author AegeusEvander, world version **0.8.1**,
|
||||
`minimum_ap_version 0.6.7`, BizHawk 2.7+ only, **US and JP discs** (a `jp_version` flag applies per-block deltas), no license
|
||||
file, actively developed (commits 2026-05-20 → **2026-09-07**), 2 stars. Randomization: *which Bincho holds which NPC* is
|
||||
shuffled; the goal is rescuing every NPC; castle NPCs can sit in other players' worlds; options include Time Sanity and a
|
||||
BP Sanity mode. Technically it is a RAM-driven world: `client.py` (5,522 lines) polls **342 distinct addresses**, and since
|
||||
v0.3.0 it needs no disc patch — it **injects code at runtime**: compiled MIPS blobs (`patch/en/*c.bin`, e.g. `setTimec.bin`,
|
||||
`fixBinchoIDc.bin`, `writeBinchoc.bin`) written into RAM plus one-word `*Hooks.bin` jumps patched into the game's own
|
||||
functions. That is exactly the surface a matching decompilation serves: every hook site and every polled address now has a
|
||||
named function or variable behind it, in C.
|
||||
|
||||
**Why they matter to us:** `client.py` was our richest US RAM source in Phase 3 (memory-map §3.4–§3.6 and §4.2 cite it in
|
||||
14 rows, region-tagged per G5); the README's Special-thanks section credits the world. `PROJECT_CONTEXT.md`'s parking lot
|
||||
asked for this contact at Gen2 ("their BFM world has unpublished US RAM research").
|
||||
|
||||
## 2. What we can hand them (derived today, each with its evidence)
|
||||
|
||||
| Their datum (`client.py` v0.8.1, MAIN_RAM offsets) | What our source says | Evidence |
|
||||
|---|---|---|
|
||||
| `0x078eba` "#32 day of the week" | **Correct.** The shared rollover function `func_8014B084` does `day = day + 1` (u16 at `0x078eac`, wraps to 1 at 0x16E = 366) and `dow = (dow + 1) % 7` (u8 at `0x078eba`). Our memory map had listed the day counter as a u8 and "dow not yet separable" — corrected by this reading. | `src/shared/engine_core.h` `DEFINE_func_8014B084` (line ≈114752); memory-map §3.4 rows 0x80078EAC / 0x80078EBA |
|
||||
| max-BP patch: nop the `addu $v0,$a1` at `0x14bcf8` | Inside `func_8014BCEC(a0, a1)`, 14 instructions: `bp_max (u16 at 0x078eb6) += a1`, clamped to `0x662`. The nop removes the increase. | `engine_core.h` line ≈115082; sig registry: the site falls in `func_8014bcec` in all 141 location-overlay images scanned |
|
||||
| scroll-cursor patch site `0x13f430` | Inside `func_8013F350` (490 ins) | same scan, 141/141 |
|
||||
| town-ID check `andi $v0,$s0,0x4000` at `0x15a7e4` | Inside `func_8015A3C8` (493 ins). **No longer in client.py v0.8.1** (town/portal handling now writes portal-table entries via `fix_town_id`), which also retires our memory map's "JP delta +0x2A8 vs +0x33C" inconsistency as historic. | same scan; `grep 15a7e4 client.py` = 0 hits |
|
||||
| Time-Sanity hook: `0x146280` (`time_hook`, JP +0x2D0) | Inside `func_80146128` (142 ins): a jump rewritten to the injected `setTimec.bin` routine | sig scan |
|
||||
| entrance byte `0x18e096` (1 → 0 "to prevent softlock") | Per-map code: seven location overlays carry code there, seven different functions — a byte inside an instruction immediate, not a shared body | sig scan (7 hits, 7 names) |
|
||||
| version check: `SLUS-00726MUSASHI` at `0x00ba94`, fallbacks `0x009f9a`, `0x072e02`, then `SLUS_007.26;1` at eight addresses, then JP `SLPS_014.90;1` | The game's own copy is the product-code string **`BASLUS-00726MUSASHI` at `0x072dfc`** (EXE `.data`; disc Track 1 sector 222). So the `0x072e02` fallback reads from the string's 5th character and can never match on the US disc — harmless, the kernel-area check (a BIOS/emulator-dependent copy of the disc ID) hits first. This closes our memory-map open question #13. | `extracted/retail/SLUS_007.26` fileoff 0x635FC; the disc scan |
|
||||
|
||||
The three shared sites (`func_8013F350`, `func_8014BCEC`, `func_8015A3C8`) and the hook function `func_80146128` are engine
|
||||
bodies that are byte-identical in every location overlay — one C definition in `src/shared/engine_core.h` covers every map.
|
||||
The scan behind the "141/141" rows: for each `.run/sig.ov_*.jsonl`, the function whose `[addr, addr+nbytes)` contains the
|
||||
site (`tools/…` one-off in the S89 log; re-run from the registries, never from memory).
|
||||
|
||||
## 3. What we ask them
|
||||
|
||||
1. **US RAM research beyond `client.py`** — notes, spreadsheets, refuted addresses. We record each datum as a memory-map row
|
||||
with provenance (G5: source, region, confidence `reported` until verified in Ghidra or live) and name our symbols after
|
||||
their findings where they are the discoverer.
|
||||
2. **Attribution consent** — their repository has no license file. We already cite `client.py` addresses as facts with
|
||||
attribution; the note asks whether that is fine and offers a link back (already in the README).
|
||||
3. Nothing else. No request to change their code; the version-check offset is offered as information.
|
||||
|
||||
## 4. The message (Drew sends; GitHub issue on their repo, which has issues enabled)
|
||||
|
||||
> **Authorship rule (Drew, S89, 2026-09-07):** written the way a developer writes an issue, short and plain, no code spans, no bullet
|
||||
> walls, no "evidence" scaffolding. Rewritten from the §2 facts, not a model draft with the tells taken out (the permuter maintainer
|
||||
> spotted the de-telled version at once; the dense backtick formatting was the likely giveaway). No AI acknowledgement. Edit freely.
|
||||
|
||||
**Title:** Decomp of BFM (US) is public, might be useful for the AP world
|
||||
|
||||
**Body:**
|
||||
|
||||
```
|
||||
Hey, I've been working on a matching decompilation of Brave Fencer Musashi (USA) and it's public
|
||||
now: https://github.com/Druthulu/BFM-decomp. The whole exe and all the streamed modules rebuild
|
||||
byte for byte from C, so basically every address your client pokes at has a function or a
|
||||
variable behind it now.
|
||||
|
||||
Your client.py was a big help early on for US RAM addresses (you're in the README credits), so a
|
||||
few things I found going back through it against the source:
|
||||
|
||||
- day of week at 0x078eba is correct. The rollover function bumps the day counter (u16 at
|
||||
0x078eac, wraps back to 1 at 366) and does dow = (dow + 1) % 7.
|
||||
- the max BP patch at 0x14bcf8 is in a tiny 14 instruction function that does
|
||||
bp_max (u16 at 0x078eb6) += arg and clamps at 0x662. Nopping the addu just kills the increase,
|
||||
so that all checks out.
|
||||
- the scroll cursor site (0x13f430), the old town id check (0x15a7e4) and your time sanity hook
|
||||
(0x146280) are all in shared engine code that's identical in every location overlay, so one C
|
||||
file covers all of them. The entrance byte at 0x18e096 is different per map though.
|
||||
- minor: the exe's copy of the id string is actually "BASLUS-00726MUSASHI" starting at 0x072dfc,
|
||||
so the fallback read at 0x072e02 starts 4 bytes into it and won't ever match on US. Doesn't
|
||||
matter since the 0xba94 check hits first, just thought you'd want to know.
|
||||
|
||||
If you've got US RAM notes beyond what's in client.py I'd be glad to fold them in with credit, and
|
||||
if you want any address resolved to its function just ask. Also wanted to check you're ok with us
|
||||
citing client.py addresses in our memory map (the repo has no license so figured I'd ask).
|
||||
|
||||
Function names are still func_XXXXXXXX style for now, naming is the next big job.
|
||||
```
|
||||
|
||||
**Short form** (Archipelago Discord, the game's channel, if preferred): "BFM (USA) has a full matching decomp now:
|
||||
https://github.com/Druthulu/BFM-decomp. Went through client.py against the source, your day of week address checks out, the
|
||||
max BP patch is in a 14 instruction function, every hook site has a named function now. Happy to look up any address."
|
||||
|
||||
**Send only after the flip** (the message links the public repository).
|
||||
|
||||
## 5. After the reply
|
||||
|
||||
- Every address or note they share → a memory-map row with `Source/Provenance` = "AP-world (AegeusEvander), <date>,
|
||||
<where>" and `Confidence` = `reported`, promoted to `verified` only by Ghidra or a live datapoint (R10/G5). Names they
|
||||
coined go into `config/symbols.us.txt` (R15) and Ghidra via `tools/ghidra_apply_symbols.sh`.
|
||||
- If they decline attribution, the AP-sourced rows keep their facts (addresses are facts) but drop the citation text; the
|
||||
README thanks line stays unless they ask otherwise.
|
||||
- Record the issue URL and the outcome in the phase log and in `docs/SETUP.md`'s P33 E2 section; if no reply within a month,
|
||||
note that and move on — the deliverable is the offer, not the answer (P9).
|
||||
|
||||
## 6. Related
|
||||
|
||||
`docs/memory-map.md` §3.4 (player state block), §4.2 (overlay-resident addresses, the patch sites), "Region deltas" and
|
||||
"Address-base conversion" (their MAIN_RAM convention), open question #13 · `README.md` Special thanks · `PROJECT_CONTEXT.md`
|
||||
parking lot ("Randomizer / Archipelago collaboration") · `docs/decompme-preset.md` (the other post-flip outreach, E1).
|
||||
@@ -1,54 +0,0 @@
|
||||
# Outreach: the tools announcement (post-flip)
|
||||
|
||||
> **Where:** the decomp community Discord's tools channel, and/or a row on the Decompedia (decomp.wiki) tools page.
|
||||
> **When:** after the flip, once `github.com/Druthulu/xsig` has its topics and the README's "Tools from this project" section is
|
||||
> live. **Who:** Drew, in his own voice; edit freely. Written the way a developer posts, no code spans, no AI acknowledgement
|
||||
> (rule candidate (j), S89).
|
||||
|
||||
**Discord post:**
|
||||
|
||||
```
|
||||
I made a small tool while doing the Brave Fencer Musashi decomp that might be useful to other PS1 projects: xsig (https://github.com/Druthulu/xsig). It hashes functions with the relocated fields masked out, so the same function at two different link addresses gets the same signature. I used it to find shared code across overlays (2,220 groups in BFM) and to check other games: against Xenogears, Vagrant Story and Tomba it found 103 shared functions, all PsyQ library code, so mostly it's good for spotting library functions and shared overlay code. Stdlib only, MIT, has tests. The full decomp is at https://github.com/Druthulu/BFM-decomp if anyone's curious, everything's matched.
|
||||
|
||||
Next step for it is going past exact matches: try the 1:1 first, then widen to same-shape functions (registers and immediates masked, then same structure) and eport which tier matched and what differs, so it also finds near-copies across overlays and across games, not just library code. That's the v2 I'm starting on.
|
||||
```
|
||||
|
||||
**Decompedia tools-page row (if the page takes rows):** name xsig, language Python (stdlib), license MIT, platform MIPS /
|
||||
PlayStation-era, one line: "relocation-masked function signatures for finding shared code across overlays and across games",
|
||||
link to the repo.
|
||||
|
||||
**The v2 sentence rests on** `docs/gen3-handoff.md` §7 (xsig v2, recorded 2026-09-08): 1-to-1 first, then the sequence tier, the
|
||||
structural family and atlas cousins, returning the matched tier and the difference — the in-tree pieces exist; the port is the work.
|
||||
No date is promised in the post.
|
||||
|
||||
**Facts the post rests on:** `tools/xsig/README.md` (the worked example: 103 hits across three games, all library; 126 against
|
||||
Tomba with one 19-instruction non-library HIGH), `config/dedup.us.yaml` (2,220 groups), the E4 log entry (8/8 tests).
|
||||
|
||||
## The decomp.me Discord `#ai` channel reply (Drew, 2026-09-08 — drafted from the record, his words to edit)
|
||||
|
||||
> Context: people in that channel were describing the trouble of keeping an AI assistant on track. Facts the draft rests on:
|
||||
> `docs/verification.md` (218/218 from a clean rebuild), `docs/gen3-standards.md` (the definition of matched; names only with
|
||||
> evidence; sotn's style guide adopted), `docs/how-to-ai-decomp/` ch.01 (governance), ch.04 (oracles), ch.12 (the failure museum),
|
||||
> `docs/retrospective.md`. No number in it is typed from memory. Linked: the how-to index, the governance chapter, the kit page.
|
||||
|
||||
```
|
||||
I ran into the same thing doing Brave Fencer Musashi (PS1). Ended up at 218 binaries rebuilding byte for byte
|
||||
from C, and honestly the model was never the hard part, the setup around it was. What kept it on track:
|
||||
|
||||
The only definition of done is the community one: instruction-identical including register allocation, and
|
||||
the whole-binary hash equal to the original, checked on every build. Nothing "functionally equivalent" ever
|
||||
counted, so the assistant can't talk its way to a match. What isn't ours is said plainly (1,256 Sony library
|
||||
objects linked, five hand-written asm routines kept verbatim).
|
||||
|
||||
Names only with evidence. If nothing proves what a function is, it stays func_XXXXXXXX. Wrong names are
|
||||
worse than none, so we adopted the sotn style guide for the cleanup rather than inventing one.
|
||||
|
||||
The rules grew from actual failures, not from a prompt. Every session starts by re-reading them, every
|
||||
session ends with a checkpoint file the next one replays word for word, and one task closes before the
|
||||
next opens. The compiler quirks got solved by reading the gcc 2.7.2 source, not by guessing.
|
||||
|
||||
I wrote all of it up, including what went wrong, which is the more useful half:
|
||||
https://github.com/Druthulu/BFM-decomp/wiki/How-to-AI-decomp
|
||||
Chapter 1 is the on-track part, chapter 12 is the failure list. If you're starting a project from zero
|
||||
there's a starter kit page too: https://github.com/Druthulu/BFM-decomp/wiki/Start-a-new-decomp-project
|
||||
```
|
||||
@@ -67,7 +67,7 @@ in the Archive index, not here. The conventions behind this page: [Docs and scra
|
||||
| [`gen2-mips-matching-model.md`](../gen2-mips-matching-model.md) | The design and every measurement behind that write-up. | By section. | authored |
|
||||
| [`community-matching-model-plan.md`](../community-matching-model-plan.md) | The parked plan to publish the drafter's weights and dataset (waits on a licensing decision). | Read whole. | authored |
|
||||
| [`decompme-preset.md`](../decompme-preset.md) | The decomp.me preset for the pinned compiler, its local proof, and the post-flip request procedure. | §5 for the procedure. | authored |
|
||||
| [`outreach/`](../outreach/) | The notes to neighbouring projects, written for the maintainer to send after the flip. | Read whole. | authored |
|
||||
| outreach notes (not in the tree since 2026-09-08) | The notes to neighbouring projects were sent in Phase 34 — the Archipelago issue, the decomp.me preset request, the tools announcement; the drafts stay on the maintainer's machine. | The outcomes and URLs are in `SETUP.md` §6.5 and its P33 E2 / D1–D3 sections. | authored |
|
||||
|
||||
## The record
|
||||
|
||||
|
||||
@@ -196,6 +196,13 @@ output) · `.run/P34/c11/` (the prune listing with sizes, `git worktree list`, t
|
||||
unauthenticated (`.run/P34/outward/decompedia_verify.txt`): both pages carry the links; the first project row reads Brave Fencer Musashi.
|
||||
- Task 6 CLOSED: xsig topics + homepage (Claude), the fork already gone, the post + two Decompedia rows (Drew). Milestone item 2's "the
|
||||
xsig topics, the fork deletion, the tools post" lines are MET.
|
||||
- **Addendum (2026-09-08):** Drew also replied in the decomp.me Discord's `#ai` channel (people describing the trouble of keeping an
|
||||
assistant on track) with **his own version** of a note drafted from the record (`19c676f47`: the byte-identical definition of done,
|
||||
names only with evidence, rules from failures, the checkpoint replay; links to the how-to index, ch.01, ch.12 and the kit page).
|
||||
Then, Drew's decision: **`docs/outreach/` leaves the tree** — the notes were sent; the drafts stay on his machine (`git rm --cached`,
|
||||
`.gitignore` contents-form rule; no rewrite, they are in the published history). Referrers fixed: `tools/doc_links.py` DEFAULT
|
||||
list, the Reference-index row (now a no-link row pointing at SETUP's outcome sections), the two SETUP inventory rows; historical
|
||||
citations in the seed/runbook/logs stay (untracked citations are allowed outside wiki pages). The wiki page changed → the C11 re-sync.
|
||||
|
||||
## 🛑 SESSION CHECKPOINT — PHASE 34 OPEN (S93, 2026-09-08): tasks 0a, 0–6 ✓ (every outward action done or pending by name: frogress, the preset creation, the AP reply); NEXT = task 7 (C11 aftercare — Claude), then 8 (G2 — Tier 1, Max)
|
||||
|
||||
|
||||
+1
-1
@@ -40,7 +40,7 @@ DEFAULT = ["README.md", "THIRD_PARTY.md", "CLAUDE.md", "src/NOTICE.md", "tools/R
|
||||
"docs/story.md", "docs/story-timeline.md", "docs/retrospective.md", "phase-ends/README.md", "phase-ends/DIGEST.md",
|
||||
"docs/gcc-2.7.2-map/README.md", "tools/xsig/README.md",
|
||||
"docs/permuter-ils.md", "docs/matching-drafter-pipeline.md",
|
||||
"docs/gen3-handoff.md", "docs/decompme-preset.md", "docs/outreach/archipelago.md", "docs/outreach/tools-announcement.md",
|
||||
"docs/gen3-handoff.md", "docs/decompme-preset.md", # docs/outreach/ left the tree at P34 task 6 (Drew, 2026-09-08)
|
||||
"docs/gen3-standards.md", "docs/phase34-seed.md",
|
||||
"decomp-architect/README.md"] # P33.5 task 11: the kit's README is public-facing
|
||||
# whole directories in the default set (P33 F3): the wiki pages and the how-to chapters — every file, so a new page is
|
||||
|
||||
Reference in New Issue
Block a user