diff --git a/docs/decompme-preset.md b/docs/decompme-preset.md index 1b9f184333..2288ee419e 100644 --- a/docs/decompme-preset.md +++ b/docs/decompme-preset.md @@ -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: - - **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: . - 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. diff --git a/docs/how-to-ai-decomp/11-publishing.md b/docs/how-to-ai-decomp/11-publishing.md index b188c400e0..cfdb755495 100644 --- a/docs/how-to-ai-decomp/11-publishing.md +++ b/docs/how-to-ai-decomp/11-publishing.md @@ -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. diff --git a/docs/how-to-ai-decomp/12-failure-museum.md b/docs/how-to-ai-decomp/12-failure-museum.md index dd5bd0a33e..e065ec9e62 100644 --- a/docs/how-to-ai-decomp/12-failure-museum.md +++ b/docs/how-to-ai-decomp/12-failure-museum.md @@ -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 diff --git a/docs/outreach/archipelago.md b/docs/outreach/archipelago.md index b1b6e8f4a3..5bfeff9097 100644 --- a/docs/outreach/archipelago.md +++ b/docs/outreach/archipelago.md @@ -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 diff --git a/phase-ends/CURRENT_PHASE.md b/phase-ends/CURRENT_PHASE.md index d289e4d39c..3084f2d8fe 100644 --- a/phase-ends/CURRENT_PHASE.md +++ b/phase-ends/CURRENT_PHASE.md @@ -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