mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-10-05 17:03:23 -04:00
docs(phase-33): Drew's decision on outward text — no AI acknowledgement; write the way a developer writes (rewritten from the facts, not de-telled model prose; the dense code-span formatting was the likely giveaway): E1 preset request + E2 Archipelago message rewritten in a developer's voice; rule candidate (j), decision log P33 S89, failure museum row 37, how-to §11 and the checklist reworded
This commit is contained in:
+13
-15
@@ -112,28 +112,26 @@ decomp.me but matches locally is a toolchain question first: run the replica wit
|
||||
the three typedefs the function needs (`u8`, `u32`, `s32`, as in `include/common.h`). Source = the function's body from
|
||||
`src/800.c`. Set the compiler flags to the §1 string. Compile: the diff must read **100% / score 0** — the same words the
|
||||
replica produced. If it does not, stop and run `tools/decompme_replica.sh --upstream` (a moved pin) before anything else.
|
||||
3. **Request the preset** — open an issue on `decompme/decomp.me` with the preset template. **Write it in your own words** (the block
|
||||
below is the model-drafted list of what it must contain; keep the five template fields and the scratch link; an upstream maintainer
|
||||
closed our permuter PR on 2026-09-07 partly because the text read as LLM-generated — decision log P33 S89) or say the draft was model-written.
|
||||
Template (FAQ → "compiler preset issue
|
||||
template"), title `[PRESET] Create Compiler Preset Brave Fencer Musashi (SLUS-00726)`, body:
|
||||
3. **Request the preset** — open an issue on `decompme/decomp.me` with their "Create or update a compiler preset" template
|
||||
(their bullet format is theirs; keep it). Written the way a developer writes, no AI acknowledgement (Drew's rule, S89):
|
||||
|
||||
Title: `[PRESET] Create Compiler Preset Brave Fencer Musashi (SLUS-00726)`
|
||||
|
||||
```
|
||||
I would like to create a compiler preset on decomp.me.
|
||||
Preset request for Brave Fencer Musashi (USA). Scratch that matches 100% with these settings: <scratch URL>
|
||||
|
||||
- **Preset Name:** `Brave Fencer Musashi (SLUS-00726)`
|
||||
- **Platform:** `ps1`
|
||||
- **Compiler ID:** `gcc2.7.2-psx`
|
||||
- **Compiler Flags:** `-O2 -G0 -mips1 -mcpu=3000 -mgas -msoft-float -fgnu-linker -Wa,--aspsx-version=2.56,--expand-div`
|
||||
- **Preset Name:** Brave Fencer Musashi (SLUS-00726)
|
||||
- **Platform:** ps1
|
||||
- **Compiler ID:** gcc2.7.2-psx
|
||||
- **Compiler Flags:** -O2 -G0 -mips1 -mcpu=3000 -mgas -msoft-float -fgnu-linker -Wa,--aspsx-version=2.56,--expand-div
|
||||
- **Libraries (if applicable):** none
|
||||
|
||||
Evidence: this scratch matches 100% with exactly these flags: <scratch URL>.
|
||||
Project: https://github.com/Druthulu/BFM-decomp (218 binaries byte-identical from source with this triple;
|
||||
docs/decompme-preset.md explains the flags and the local proof through decomp.me's own toolchain).
|
||||
These are the flags the full matching decomp uses (https://github.com/Druthulu/BFM-decomp), all 218 binaries build
|
||||
byte identical with them. The -Wa part matters, without --expand-div nothing with a division matches.
|
||||
```
|
||||
|
||||
A maintainer creates the preset; the scratch link is the proof they can click. Check the name's spelling in the issue —
|
||||
it is immutable once created.
|
||||
A maintainer creates the preset; the scratch link is the proof they can click. Check the name's spelling, it is immutable
|
||||
once created.
|
||||
4. **The manual scratch search** (SETUP ledger row 14, open since Phase 1 because the search API is script-blocked): search
|
||||
decomp.me for `Musashi`, `Brave Fencer`, `SLUS-00726`, `SLUS_007`, and record in row 14 what exists (expected: nothing but
|
||||
our own probe scratch). That closes the row and completes the greenfield claim's last check.
|
||||
|
||||
@@ -102,7 +102,7 @@ tracked, and the phase cannot close while any entry remains.
|
||||
## Releases worth separating
|
||||
|
||||
The codegen map with its citation audit; a cross-project signature tool with a fixture that contains no game bytes; the
|
||||
masked-scorer improvement offered upstream to the permuter (declined: the maintainer keeps the wildcard rule and prefers symbol renames in the asm, and he read the model-drafted text as LLM-written — write outward text in your own words or disclose; failure museum row 37); the drafter-pipeline write-up (the paired dataset of
|
||||
masked-scorer improvement offered upstream to the permuter (declined: the maintainer keeps the wildcard rule and prefers symbol renames in the asm, and he read the model-drafted text as LLM-written — write outward text the way a developer writes an issue, short and plain, rewritten from the facts rather than a model draft with the tells removed; failure museum row 37); the drafter-pipeline write-up (the paired dataset of
|
||||
disassembly and matched C is ROM-derived and stays private); a decomp.me preset for the pinned compiler; a note to the
|
||||
neighbouring community project whose RAM map cited yours.
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ the third: **why it looked right**. A failure that looks wrong gets fixed the sa
|
||||
| 34 | The permuter plateaued; the ILS logs are quiet | Empty logs for 20 minutes: never started | Quiet looks like working | R55: an unattended lane leaves evidence |
|
||||
| 35 | The rate limit is ~95 req/min | A launch burst; the steady state was far higher | The first measurement was a real number | Measure the steady state, bucketed over time |
|
||||
| 36 | An agent's "no draft" after a rate limit | One sat three instructions from a match with its candidate history on disk | The verdict said no draft | R40: exonerate the instrument; read the scratch directory |
|
||||
| 37 | An upstream PR + issue drafted by the model, then given a "plain contributor-style" pass to remove AI tells | The maintainer read it as LLM-generated anyway, said it felt disrespectful of his time, and closed both; his technical answer (fix symbol names in the asm; nonzero floors are fine interactively) was reasonable for his tool | The content was byte-proven and the style pass looked like courtesy | A closed PR, a lost goodwill margin, and the rule: outward text in the owner's own words or with disclosure — the model supplies the facts list |
|
||||
| 37 | An upstream PR + issue drafted by the model, then given a "plain contributor-style" pass to remove AI tells | The maintainer read it as LLM-generated anyway, said it felt disrespectful of his time, and closed both; his technical answer (fix symbol names in the asm; nonzero floors are fine interactively) was reasonable for his tool | The content was byte-proven and the style pass looked like courtesy | A closed PR, a lost goodwill margin, and the rule: outward text is written the way a developer writes it (short, plain, no backtick-bracketing, no bullet walls), rewritten from the facts rather than de-telled |
|
||||
|
||||
## The pattern, stated once
|
||||
|
||||
|
||||
@@ -55,54 +55,47 @@ site (`tools/…` one-off in the S89 log; re-run from the registries, never from
|
||||
|
||||
## 4. The message (Drew sends; GitHub issue on their repo, which has issues enabled)
|
||||
|
||||
> **Authorship (S89, 2026-09-07):** the text below is a model-drafted list of the facts in §2 in message form. **Rewrite it in your own
|
||||
> words, shorter if you like, or say plainly that a model drafted it.** The permuter maintainer closed our PR and issue the same day
|
||||
> partly because the text read as LLM-generated ("kinda similar to getting a robocall") — decision log P33 S89, failure museum. The
|
||||
> facts and offsets are what matter; the wording is yours.
|
||||
> **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:** `Matching decompilation of BFM (USA) is public: source and symbols behind your patch sites and RAM addresses`
|
||||
**Title:** Decomp of BFM (US) is public, might be useful for the AP world
|
||||
|
||||
**Body:**
|
||||
|
||||
```
|
||||
Hi. I run a matching decompilation of Brave Fencer Musashi (SLUS-00726):
|
||||
https://github.com/Druthulu/BFM-decomp. The main executable and all 217 streamed code modules
|
||||
rebuild byte-for-byte from C, so every RAM address your client touches now has a function or a
|
||||
variable behind it that you can read.
|
||||
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 world helped us early on (client.py was our richest US RAM source and is credited in the
|
||||
README), so here is some of it coming back. Offsets below are BizHawk MAIN_RAM offsets like yours.
|
||||
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: your read at 0x078eba is right. The rollover function (func_8014B084, present in
|
||||
every location overlay) does day = day + 1 (u16 at 0x078eac, wraps to 1 at 366) and
|
||||
dow = (dow + 1) % 7 (u8 at 0x078eba).
|
||||
- Your max-BP patch at 0x14bcf8 sits in a 14-instruction function, func_8014BCEC(a0, a1):
|
||||
bp_max (u16 at 0x078eb6) += a1, clamped to 0x662. The nop removes the increase.
|
||||
- The scroll-cursor site 0x13f430 is inside func_8013F350; the old town-ID site 0x15a7e4 was
|
||||
inside func_8015A3C8; your Time Sanity hook at 0x146280 rewrites a jump inside func_80146128.
|
||||
All of these are shared engine bodies, byte-identical in every location overlay, so one C
|
||||
definition in src/shared/engine_core.h covers every map. The entrance byte at 0x18e096 is
|
||||
per-map code (seven maps, seven different functions).
|
||||
- One small thing in the version check: the EXE's copy of the ID string is "BASLUS-00726MUSASHI"
|
||||
starting at 0x072dfc, so the fallback read at 0x072e02 starts at the string's fifth character
|
||||
and can never match on the US disc. Harmless, since the kernel-area check hits first.
|
||||
- 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 it helps, I can resolve any address in your client to its function or struct field, and we
|
||||
would like to name our symbols after your findings where you found them first. Two questions:
|
||||
is there US RAM research beyond client.py you would be willing to share, and are you fine with
|
||||
us continuing to cite client.py addresses in our memory map with attribution (your repo has no
|
||||
license file, so I wanted to ask)?
|
||||
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).
|
||||
|
||||
Everything is under docs/memory-map.md and src/ in the repo. Thanks for building the world.
|
||||
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) now has a complete matching
|
||||
decompilation: https://github.com/Druthulu/BFM-decomp. Your dow read at 0x078eba is confirmed by the source
|
||||
(func_8014B084: dow = (dow+1) % 7), your max-BP patch site is func_8014BCEC (bp_max at 0x078eb6 += a1, clamp 0x662), and
|
||||
every hook site has a named function now. Happy to resolve any address; details in an issue on your repo."
|
||||
**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."
|
||||
|
||||
Style rules kept: plain prose, no em-dashes, no marketing, every number from §2, nothing promised that is not already in the
|
||||
repo. **Send only after the flip** (the message links the public repository).
|
||||
**Send only after the flip** (the message links the public repository).
|
||||
|
||||
## 5. After the reply
|
||||
|
||||
|
||||
@@ -674,10 +674,16 @@ Mid-phase rules check after every 4 completed tasks (P6). Commit banked artifact
|
||||
Commit: see below.
|
||||
- **2026-09-07 (S89) — E5 outcome: PR #213 and issue #214 CLOSED unmerged by the permuter maintainer** — the maintainer closed PR #213 and issue #214 on 2026-09-07 without merge: `field_matches_any_symbol` is intentional (it covers temporary `.text+0x…` names), a name mismatch between C and asm should be fixed by renaming the symbol in the target asm (splat's symbol files), and a nonzero optimal score is acceptable in the interactive workflow; he also said the issue text read as LLM-generated and felt disrespectful of his time. Assessment: right on
|
||||
the merits for his interactive tool (ours stays a local tool for unattended ILS; his symbol-rename alternative recorded, untested); right
|
||||
without qualification on authorship — the "plain-style pass" was a de-tell pass, not disclosure. **Binding from now (rule candidate (j)):
|
||||
outward text in Drew's own words or disclosed; the model supplies facts.** Applied to the pending E1/E2 texts (re-labelled in both docs +
|
||||
without qualification on authorship — the "plain-style pass" was a de-tell pass, not disclosure. **Binding from now (rule candidate (j), Drew's decision after this entry: NO AI acknowledgement):** outward text to third parties (issues, PRs, outreach) is written the way a developer writes — short, plain, few or no code spans, no exhaustive bullet walls, no evidence scaffolding — REWRITTEN from the facts, never a model draft with the tells removed; no AI disclosure (Drew's decision, 2026-09-07); check the target project for an AI-contribution policy first. Applied to the pending E1/E2 texts (re-labelled in both docs +
|
||||
the bundle), checkpoint §0b, `docs/permuter-ils.md` §2/§3, the SETUP patch row, decision log P33 S89, failure museum row 37, how-to §11.
|
||||
Drew: pushed; both Actions green (S89). Commit: see below.
|
||||
- **2026-09-07 (S89) — Drew's decision on outward text: no model-draft acknowledgement, ever; everything outward is written the way a
|
||||
developer writes it.** His diagnosis of the giveaway, which I share: the "plain-style pass" ran an anti-AI filter over model prose
|
||||
(dense backtick-bracketing of every term, exhaustive bullets, evidence scaffolding, length) instead of rewriting like a person would.
|
||||
Applied: the E1 preset request and the E2 Archipelago message REWRITTEN in a developer's voice (short, no code spans, casual
|
||||
register; the decomp.me template's own bullets kept); the bundle file replaced; rule candidate (j), the decision log P33 S89, the
|
||||
failure museum row 37 and how-to §11 reworded to the decision. Also: check a target project for an AI-contribution policy before
|
||||
submitting (the permuter had none; we checked). Commit: see below.
|
||||
|
||||
## 🛑 SESSION CHECKPOINT — A1–A5 ✓, B1–B9/C3 ✓, C1–C9 ✓, D1–D5 ✓, F1–F3 ✓, E1–E6 ✓, G1 ✓ (36 of 41); C10 = SUPPORT TICKET #4736982 FILED, PROBE DAILY; NEXT = the probe-gated chain (Drew: flip → E1/E2/D3 outward → wiki push), then C11, G2 (2026-09-07, written by S88, updated by S89 after the ticket + E1; SUPERSEDES the earlier blocks)
|
||||
|
||||
@@ -708,10 +714,10 @@ holds the old ones and stays until the probe passes). **Never `git clean -x`** (
|
||||
Push the local commits (`git push origin main`) and confirm both Actions workflows are green on the push.
|
||||
1. **C10 the flip:** GitHub → Settings → General → Danger Zone → Change visibility → Public. Then `gh api repos/Druthulu/BFM-decomp --jq
|
||||
.private` → `false`; `tools/public_rewrite/probe_github.sh --after-flip`; Actions tab green. Enable Settings → General → Features → Wikis.
|
||||
2. **E1 (decomp.me, ~20 min; write the issue IN YOUR OWN WORDS or disclose the draft — S89 lesson):** the six steps in `docs/decompme-preset.md` §5 / checkpoint §3 — scratch from `.run/decompme/drew_bundle/`
|
||||
2. **E1 (decomp.me, ~20 min; the issue text in `docs/decompme-preset.md` §5 is written in a developer's voice — edit freely, no AI acknowledgement):** the six steps in `docs/decompme-preset.md` §5 / checkpoint §3 — scratch from `.run/decompme/drew_bundle/`
|
||||
(100% expected) → the preset-request issue on `decompme/decomp.me` → the manual search (`Musashi`, `Brave Fencer`, `SLUS-00726`,
|
||||
`SLUS_007`) → send Claude the scratch URL, the issue URL, the search result.
|
||||
3. **E2 (Archipelago; IN YOUR OWN WORDS or disclosed — S89 lesson):** open the GitHub issue on `AegeusEvander/Brave-Fencer-Musashi-AP-World` with `docs/outreach/archipelago.md` §4
|
||||
3. **E2 (Archipelago; the message in `docs/outreach/archipelago.md` §4 is written in a developer's voice — edit freely, no AI acknowledgement):** open the GitHub issue on `AegeusEvander/Brave-Fencer-Musashi-AP-World` with `docs/outreach/archipelago.md` §4
|
||||
(title + body), or the Discord short form. Send Claude the issue URL; forward any reply.
|
||||
4. **D3 outward (progress boards):** decomp.dev → log in with GitHub → `decomp.dev/manage/new` → add `Druthulu/BFM-decomp` (it reads the
|
||||
`SLUS_007.26_report` artifact `progress.yml` already uploads). frogress: request slug `bfm` + an API key from the maintainers, then
|
||||
|
||||
Reference in New Issue
Block a user