mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-10-02 07:59:52 -04:00
536 lines
57 KiB
Markdown
536 lines
57 KiB
Markdown
# CURRENT_PHASE — Phase 34: the flip and the Gen2 exit (v1.32.1 → v2.0.0)
|
||
|
||
> **Gate 1 approved 2026-09-08 (Drew, plan mode, Max, Fable 5.1; session S93).** Rules **R84–R95 ratified at gate 1** (the Phase-33.5
|
||
> candidates (i)–(xii); binding; full text in `phase-ends/DIGEST.md` §3). The approved plan is reproduced VERBATIM at the end of this
|
||
> file (§"Approved plan") — its `~/.claude/plans/` copy is not part of the repo. This is the **last Gen2 phase**: it closes at
|
||
> **v2.0.0 = Gen2 EXIT**; Gen3 opens at Phase 35 from `docs/gen3-handoff.md` + `docs/gen3-standards.md`. **No build input changes in
|
||
> this phase: R22 is not owed**; the fleet's 218/218 is asserted by `make tools-health` (`report BINARY=main` + `audit-digest`).
|
||
> **Baseline HEAD at open: `eb342dc9f`** (Drew's Phase-33.5 CLOSE commit; tree clean; `origin/main == main`).
|
||
> **The gate is OPEN:** the purge probe printed PASS on 2026-09-07 (`.run/P33.5/probe_github_s91.log`, 33 of 33 old hashes gone,
|
||
> control OK); task 0 re-runs it immediately before the flip.
|
||
|
||
## Milestone (gate 2 — what Drew confirms; the seed's §3 with the measured additions)
|
||
1. `gh api repos/Druthulu/BFM-decomp --jq .private` → `false`; `tools/public_rewrite/probe_github.sh --after-flip` exit 0; the three
|
||
unauthenticated URLs (repo page, raw badge JSON, `no-rom` badge.svg) return 200 where they returned 404 on 2026-09-08 while private;
|
||
`no-rom` + `progress` green on the PUBLIC repo; `has_wiki` true and the wiki clonable and rendering; the archive repo
|
||
`Druthulu/BFM-decomp-archive` still private; the `protect-main` ruleset active. B3's fresh-clone proof stands (no build input changed).
|
||
2. Every outward action done with its URL, or recorded as pending BY NAME (P9 — never claimed): the decomp.me scratch + preset-request
|
||
issue + manual search (SETUP ledger row 14 closed), the Archipelago issue, decomp.dev, frogress, the wiki push, the xsig topics, the
|
||
fork deletion (already done, S93 evidence), the tools post.
|
||
3. C11 done (no other clone of the old history remains — verified; scratch pruned with sizes; docs updated; checks green);
|
||
`PhaseEnd_Phase34.md` v2.0.0 + DIGEST append written; Drew's close commit, the `v2.0.0` tag and the GitHub Release pushed. **Gen2 EXIT.**
|
||
|
||
## Effort / model (R7/R26/R27 — every transition is PROMPTED, never assumed)
|
||
- Per task (the plan's table): **Max** for task 1's decision (Drew) and task 8 (Tier 1 — prompt Drew to confirm Max before starting);
|
||
**xHigh** for tasks 0a, 2, 3, 4, 7; **Low** for tasks 0, 1's checks, 5, 6. Max is set for this session (session-only; re-apply).
|
||
No Ultracode/Workflow anywhere in this phase (nothing is breadth-shaped).
|
||
- **Drew-only (R6/R83):** every `git push`; the visibility change; every outward text (in his own words, no AI acknowledgement); the
|
||
frogress key (his shell, never a file); the gate-2 confirmation; the tag + Release; `gh auth logout` (his last command).
|
||
- **Claude on Drew's word:** the `gh repo edit` metadata calls (BFM-decomp, xsig), the ruleset `gh api` POST.
|
||
|
||
## Owner decisions (binding — AskUserQuestion 2026-09-08 + one mid-planning message)
|
||
1. The Phase-33.5 candidates (i)–(xii) ratified as **R84–R95**. 2. **Claude runs the `gh` metadata calls** after the flip on Drew's word
|
||
(wiki enable, description — Drew edits the proposed wording at task 1 —, homepage = the wiki, topics; xsig topics + homepage at task 6).
|
||
3. **No other clone of the old history exists**: the Phase-1 relic clone at `/mnt/z/Storage/git/BFM-decomp` (11 commits, 2026-06-13,
|
||
old lineage, `origin` = BFM-decomp) found by S93's preflight was **deleted by Drew during planning; verified gone** (`ls` → No such file).
|
||
`/mnt/z/Storage/git/BFM-decomp-archive` is the C4 archive mirror (remote = the private archive repo; the intended surviving copy).
|
||
4. **Extras chosen:** a GitHub Release for v2.0.0 (notes in Drew's words) and a `protect-main` ruleset (no force-push, no deletion).
|
||
**Not chosen:** the off-machine bundle copy (the archive repo is the surviving copy of the old history — `.run/public_rewrite/`'s
|
||
bundle and dictionary are deleted at C11) and a public fresh-clone re-proof (B3's proof stands).
|
||
|
||
## Tasks (strict order; one commit per task after this file is updated; harness task list = the same rows, R28 — 10 at gate 1)
|
||
- [x] **0a** Open the phase: this file, R84–R95 into DIGEST §3 (+ one §0 line), the `.run/P34/` evidence allowlist, TaskCreate ×10, `doc_links --strict` 0/0, commit — xHigh (Claude)
|
||
- [x] **0** The probe once more: `tools/public_rewrite/probe_github.sh | tee .run/P34/probe/pre_flip.log` → PASS, control OK, no WARNING — Low (Claude)
|
||
- [x] **1** C10 — the flip (Drew, Max) + post-flip checks, metadata, ruleset, Actions green on the public repo (Claude, Low)
|
||
- [x] **2** E1 — decomp.me: scratch → 100% → preset-request issue → manual search (Drew, xHigh); recorded in SETUP §6.5 + ledger row 14 (Claude)
|
||
- [x] **3** E2 — the Archipelago issue (Drew, xHigh); URL recorded; §5 reply handling pending unless a reply arrives (Claude)
|
||
- [x] **4** D3 — decomp.dev registration + frogress slug/key/push (Drew, xHigh); verified by curl (Claude) → **P6 rules check after this task**
|
||
- [x] **5** F3 — the wiki: dry run (Claude), first page + `wiki_sync.sh --push` (Drew), pages verified — Low
|
||
- [x] **6** Tool discoverability: xsig topics + homepage (Claude on Drew's word); fork deletion already done; tools post (Drew) — Low
|
||
- [x] **7** C11 — aftercare: scratch prune (keep `old-to-new.tsv` + `old_tag_tip.txt`), docs, checks — xHigh (Claude)
|
||
- [x] **8** G2 — tools-health, P7 walk, gate 2, `PhaseEnd_Phase34.md` v2.0.0 + DIGEST + log archive; Drew commits/tags/pushes/releases, then `gh auth logout` — **Max, Tier 1**
|
||
|
||
## Blockers
|
||
- None at open. The Support ticket (#4736982) did its work: the probe PASSED 2026-09-07. If task 0 or task 1's `--after-flip` probe
|
||
shows ANY hash ALIVE → stop (P5e); the fallback (delete + recreate the repository, `delete_repo` scope needed) is Drew's decision.
|
||
|
||
## Evidence layout (allowlisted under `.run/P34/`, logs only — R74)
|
||
`.run/P34/probe/` (pre_flip.log, after_flip.log) · `.run/P34/flip/` (repo JSON before/after, the curl codes, the metadata + ruleset
|
||
API outputs, `gh run list`) · `.run/P34/outward/` (the URLs Drew reports, the frogress/decomp.dev curls, the wiki checks, the xsig API
|
||
output) · `.run/P34/c11/` (the prune listing with sizes, `git worktree list`, the checks) · `.run/P34/tools_health_close.log`.
|
||
|
||
## Log (newest last; one entry per task; the 🛑 block at the end is rewritten after every task)
|
||
|
||
### 2026-09-08 — Task 0a — Open the phase (xHigh; S93)
|
||
- Written: this file (milestone, effort, decisions, tasks, evidence layout, the 🛑 block, the approved plan verbatim);
|
||
`phase-ends/DIGEST.md` §3 **R84–R95 in full** (replacing the "proposed candidates" paragraph) + one §0 line ("Phase 34 OPENED
|
||
2026-09-08"); `.gitignore` the dated `.run/P34/` allowlist block (contents-exclude form, `*.log`/`*.json`/`*.txt`/`*.md` only).
|
||
- Harness task list: TaskCreate ×10 (0a, 0, 1–8) — R28.
|
||
- Verify lines (S93): `tools/doc_links.py --strict` → `58 documents, 451 relative links checked, 0 pending (0 planned targets on the
|
||
list), 0 broken; citations 568 (444 tracked, 124 untracked); docs/ coverage 65 of 65 covered by the Reference index + README; 2
|
||
wiki-first warnings` (the two WARNs — `gen3-handoff.md` / `story.md` citing `verification.md` — pre-date this phase) → `doc_links: OK`,
|
||
rc 0. `git check-ignore -v .run/P34/probe/pre_flip.log` → re-included by `.gitignore:410`; `.run/P34/probe/x.bin` → ignored by
|
||
`:409` (the R84 by-contents form works). `git status --short` before the commit: `M .gitignore`, `M phase-ends/DIGEST.md`,
|
||
`?? phase-ends/CURRENT_PHASE.md` — nothing else (H1 review). Committed as this task's commit.
|
||
|
||
### 2026-09-08 — Task 0 — The probe once more (Low; S93)
|
||
- `tools/public_rewrite/probe_github.sh 2>&1 | tee .run/P34/probe/pre_flip.log` → **`probe: PASS — every sampled old hash is gone from
|
||
Druthulu/BFM-decomp`**, 33 `gone` lines of 33 sampled (every 134th of 4,031 + the pruned commit + the old tag tip), `control: current
|
||
main eb342dc9fe0935b8c9743f9245b08dd16f875b67 resolves (OK)` (the PUSHED tip — local `main` is two commits ahead, unpushed: task 0a
|
||
`c9dffdcfd` + this one), exit 0, **no** "WARNING — the WORKING repo" line, the throwaway `probe_scratch.git` deleted on exit (R81).
|
||
Same 33 hashes as the S91 run (`.run/P33.5/probe_github_s91.log`). **The gate is open at the moment of the flip.** Log committed
|
||
(allowlisted `.run/P34/probe/*.log`).
|
||
|
||
### 2026-09-08 — Task 1 — C10: the flip + the post-flip checks, metadata, ruleset (Drew: Max decision; Claude: checks; S93)
|
||
- **Drew flipped the repository PUBLIC** (Settings → Danger Zone → Change visibility; reported "flipped" 2026-09-08 ~11:25 MDT).
|
||
- Checks (`.run/P34/flip/`, `.run/P34/probe/after_flip.log`): `gh api repos/Druthulu/BFM-decomp` → `"private":false,"visibility":"public"`;
|
||
`Druthulu/BFM-decomp-archive` → `"private":true` (still private); **`probe_github.sh --after-flip` → PASS, 33 `gone` of 33, 0 ALIVE
|
||
(incl. the unauthenticated `/commit/<7>` pages), control `eb342dc9f` OK, exit 0.** Unauthenticated URLs (404/404/404/200 while
|
||
private): repo page **200**, `no-rom` badge.svg **200**, xsig 200; the raw badge JSON read **404 on the first try** — the Fastly
|
||
negative cache from the private era (`cache-control: max-age=300`, `x-cache: HIT`), NOT the repository: the same URL with a cache-buster
|
||
→ 200, the unauthenticated API contents endpoint → 200, the shields endpoint → 200 rendering `matched (instructions): 100.0%`, and the
|
||
plain URL re-checked after the cache turned over → **200** (R40: the instrument was exonerated before the subject was blamed).
|
||
- Writes on Drew's word (decision 2/4): `gh repo edit … --enable-wiki --description "Matching decompilation of Brave Fencer Musashi (PS1,
|
||
SLUS-00726): 218 binaries rebuild byte-identical from C" --homepage https://github.com/Druthulu/BFM-decomp/wiki` + 7 topics → verified
|
||
`has_wiki:true`, topics `[brave-fencer-musashi, decompilation, mips, playstation, psx, psyq, reverse-engineering]`. Ruleset
|
||
**`protect-main` id 22564862** (target branch `~DEFAULT_BRANCH`, rules `deletion` + `non_fast_forward`, enforcement active,
|
||
`bypass_actors: []`, `current_user_can_bypass: never`) — a future history rewrite needs the ruleset edited/deleted FIRST; a
|
||
fast-forward push and a tag push are unaffected.
|
||
- **Addendum (Drew pushed 2026-09-08 17:34Z; `origin/main == main == df055e36c`):** `gh run list` on the PUBLIC repo →
|
||
**`no-rom` run 34257901983 completed success** and **`progress` run 34257901996 completed success**, both on `df055e36c`, event push
|
||
(`.run/P34/flip/runs_after_push.txt`). Milestone item 1's Actions line is MET. Task 1 CLOSED.
|
||
|
||
### 2026-09-08 — Task 2 (part 1) — E1: the paste form fixed and proven before Drew's browser session (xHigh; S93)
|
||
- **Measured (R14):** Drew's first scratch attempt failed — `Target assembly could not be assembled … invalid operands 'li a2,2'` on
|
||
every operand line. Cause: `docs/decompme-preset.md` §5 step 2 told him to paste the splat-format listing from
|
||
`verbatim_target_s.py`, which is the WORD ORACLE (the replica reads the `/* off va word */` comments; nothing assembles it): bare
|
||
register names that resolve only through `macro.inc`, branch targets as absolute addresses. decomp.me's PS1 prelude defines `glabel`
|
||
(line 7 drew no error) but not the register aliases. The compiler choice was right (`gcc 2.7.2-psx + maspsx`). The seed's "regenerate
|
||
the bundle with `decompme_replica.sh`" was also false — nothing wrote the bundle.
|
||
- **Fix (R16 — the flywheel, tool + doc in the same change):** `tools/verbatim_target_s.py --gas` → `<fn>.gas.s` ($-registers,
|
||
`.L<addr>` labels for in-function targets, symbol names for external `j`/`jal`, `.set noat`/`noreorder`, no `.include`, the comment
|
||
column kept); `tools/decompme_replica.sh` **step D** (the paste through decomp.me's own `as` wrapper — fed on STDIN, a file argument
|
||
blocks it — linked at the address, compared word for word; PASS now needs A AND D, exit 4 = compile matches but the paste does not) and
|
||
**step E** (writes `.run/decompme/drew_bundle/` 1–4 from the proven run); doc §5 step 2 rewritten; SETUP rows (a new
|
||
`verbatim_target_s.py` row — it had none — and the replica row extended); `config/tool_dictionary.tsv` `what` extended; `make
|
||
kit-corpus` regenerated (359 copies / 28 pointers, `tool_census --check` 0 gaps; it also materialised the missing record copy of
|
||
`PhaseEnd_Phase33.5.md`).
|
||
- **Proof (`.run/P34/outward/e1_replica_after_fix.log`, the S93 standalone proofs under `e1_gas_proof/`, untracked):** our `as` 26/26
|
||
words; decomp.me's `as` wrapper 26/26 (+2 trailing zero words, gas padding); the replica: **A BYTE-IDENTICAL 26/26 · B (control) 26/26 ·
|
||
C1/C2 identical text · D the pasted target BYTE-IDENTICAL 26/26 · E bundle written → PASS, rc 0.** `doc_links --strict` OK.
|
||
- The bundle's `1_target_asm.s` is now the gas form (42 lines); 2–4 unchanged in content; `5_issue_body.md` untouched (Drew's text).
|
||
- Drew retries the scratch with the new file → 100% / score 0 expected → the issue → the search → part 2 records the URLs.
|
||
|
||
### 2026-09-08 — Task 2 (part 2) — E1: the browser session done, recorded (xHigh; S93)
|
||
- **Drew (browser):** the retry with the `--gas` paste compiled to **100% / score 0** — scratch **<https://decomp.me/scratch/mIu4d>**
|
||
(the page answers 403 to scripts, the Cloudflare block SETUP §6.5 records; Drew's report is the observation). The preset-request issue
|
||
**<https://github.com/decompme/decomp.me/issues/2106>** — `gh api` (`.run/P34/outward/e1_issue_2106.txt`): title "[PRESET] Create
|
||
Compiler Preset - Brave Fencer Musashi (SLUS-00726)", opened 2026-09-08T18:05:08Z by Druthulu, state open, no labels; decomp.me's
|
||
template `create-or-update-a-compiler-preset.md` fetched and compared — our body carries every field it asks for
|
||
(`e1_preset_issue_template.txt`). The manual search: `Musashi` / `Brave Fencer` / `SLUS-00726` → nothing; `SLUS_007` → many scratches
|
||
of other SLUS_007xx titles under other compilers, none this game → **ledger row 14 CLOSED** (the greenfield claim's last check).
|
||
- Recorded in `docs/SETUP.md`: row 14 closed; §6.5 outcome bullet; the P33 E1 bullet → done. **Pending by name (P9):** the preset's
|
||
creation by decomp.me's maintainers (its id → §6.5 when it appears).
|
||
|
||
### 2026-09-08 — Task 3 — E2: the Archipelago note sent (xHigh; S93)
|
||
- Pre-check: `gh api repos/AegeusEvander/Brave-Fencer-Musashi-AP-World` → `has_issues: true`, 0 open, license null, pushed
|
||
2026-09-07 (`.run/P34/outward/e2_target_repo.txt`) — the GitHub-issue route of `docs/outreach/archipelago.md` §4 holds.
|
||
- **Drew opened <https://github.com/AegeusEvander/Brave-Fencer-Musashi-AP-World/issues/1>** — `gh api` (`e2_issue_1.txt`): title
|
||
"Decomp of BFM (US) is public, might be useful for the AP world", 2026-09-08T18:10:19Z, by Druthulu, open, 0 comments.
|
||
- Recorded in `docs/SETUP.md` P33 E2 (a SENT bullet with the §5 reply procedure). **Pending by name (P9):** their reply (memory-map rows as
|
||
`reported`, names via symbols + `ghidra_apply_symbols.sh`); no reply within a month → noted and closed as "the offer was the deliverable".
|
||
|
||
### 2026-09-08 — Task 4 — D3: the progress boards (xHigh; S93)
|
||
- Pre-checks (`.run/P34/outward/d3_precheck.txt`): decomp.dev 200, `manage/new` → the GitHub login; the `SLUS_007.26_report` artifact on
|
||
the public repo's latest `progress` run (34257901996) present, expires 2026-12-07; frogress `data/bfm/us/` → 404 (the control).
|
||
- **decomp.dev DONE (Drew):** repo `Druthulu/BFM-decomp`, game name "Brave Fencer Musashi", short name empty, platform PlayStation →
|
||
**<https://decomp.dev/Druthulu/BFM-decomp>**, verified unauthenticated (`d3_decompdev.txt`): 200, "Brave Fencer Musashi • Progress
|
||
Report", **100.00% decompiled | 100.00% fully linked (53.97 MB)** = 13,492,113 ins × 4. Drew added a hero image via the manage page
|
||
(decomp.dev's own `header_image` field, read from its source `crates/web/src/handlers/manage.rs`; the site hosts it). "No function
|
||
information available" on a unit = our report's empty per-unit `functions` list, by design (`report_check.json`: 218 units, 0 with
|
||
function rows) — **Gen3 item:** per-function rows once names exist.
|
||
- **frogress SKIPPED this phase (Drew: "skip") — pending by name (P9):** alive (`/projects/` 38 projects, `d3_frogress_projects.txt`;
|
||
a project endpoint 200; root 404 by design; repo quiet since 2023-12, `d3_frogress_alive.txt`); admin-created projects; would add a
|
||
list row only. Recorded in `docs/SETUP.md` P33 D1–D3 with the request + push recipe for later.
|
||
- **P6 rules check due now** (tasks 0, 1, 2, 3, 4 complete after the opening step).
|
||
|
||
### 2026-09-08 — P6 mid-phase rules check (after tasks 0–4)
|
||
- CLAUDE.md "Mandatory Behavior" (8 rules) and PROJECT_CONTEXT.md "AI Collaboration Rules" (25 P/G/H/X rules) re-read from disk;
|
||
stated in chat: "Rules check — re-read complete. Continuing with task 5."
|
||
|
||
### 2026-09-08 — Task 5 — F3: the wiki is live (Low; S93)
|
||
- Claude's dry run (earlier, `.run/P34/outward/wiki_dryrun.log`): 32 pages rendered, 386 relative links rewritten, clone refused until the
|
||
first page existed (exit 0). Drew created the first page in the GitHub UI, then said **"you sync it"** — an explicit, one-off **R6 waiver
|
||
for the wiki repository** (the P33 precedent: the xsig and permuter-fork pushes); Claude ran `tools/wiki_sync.sh --push`
|
||
(`wiki_push.log`): Home modified (Drew's placeholder replaced), 31 pages added, **`fec3777..75c17d0 master -> master`**, "wiki: sync from
|
||
BFM-decomp a601c74cb". R6 stays in force for `Druthulu/BFM-decomp` itself.
|
||
- Verified from outside (`wiki_verify.txt`): remote `master` = `75c17d06…` = the clone's HEAD; unauthenticated `…/wiki` 200,
|
||
`/wiki/Home` 301 (GitHub redirects Home to the root), `/wiki/Reference-index` 200, `/wiki/How-to-AI-decomp-02-byte-gate` 200,
|
||
`/wiki/Start-a-new-decomp-project` 200; the Reference index page carries 30 wiki-page links + 48 rewritten `blob/main` links, the
|
||
custom sidebar is present, **0 relative `.md` links left**. Milestone item 1's "wiki live" line is MET. Drew's sidebar eyeball: pending
|
||
his word (not a gate).
|
||
- Note for C11: any wiki-page edit in task 7 needs one more `tools/wiki_sync.sh --push` (Drew, or on his word).
|
||
|
||
### 2026-09-08 — Task 6 (Claude's half) — tool discoverability (Low; S93)
|
||
- `gh repo edit Druthulu/xsig --add-topic decompilation --add-topic mips --add-topic playstation --add-topic psx --add-topic psyq
|
||
--add-topic dedup --add-topic reverse-engineering -h https://github.com/Druthulu/BFM-decomp` (gate-1 decision 2 is the word) → verified
|
||
(`.run/P34/outward/xsig_topics.txt`): topics `[decompilation, dedup, mips, playstation, psx, psyq, reverse-engineering]`, homepage
|
||
`https://github.com/Druthulu/BFM-decomp`, public. The fork `Druthulu/decomp-permuter`: **already gone** (API 404; `gh repo list --fork`
|
||
→ 0) — recorded, not redone; the upstream patch stays tracked at `tools/permuter/upstream/0001-reloc-masked-scorer.patch`.
|
||
- **Open:** the tools announcement (`docs/outreach/tools-announcement.md`, Drew's words, R83) — done-with-link or pending by name, on
|
||
Drew's report (addendum below).
|
||
- **Recorded for a later phase (Drew, 2026-09-08):** Drew asked whether xsig does 1-to-1 only or the twin/family/cousin tiers — it is
|
||
1-to-1 on the relocation-masked stream + a first-difference classifier; the family and cousin tiers are BFM-specific in-tree tools.
|
||
Drew's direction: **xsig v2 should carry the whole knowledge base** — 1-to-1 first, then widen along the best expansion path
|
||
(sequence tier → structural family → atlas cousins) and return the best result with its context. Written into
|
||
`docs/gen3-handoff.md` §7 (the parked Gen3 ideas) as the seed; not this phase's scope (P5d recorded, not acted on).
|
||
|
||
### 2026-09-08 — Task 6 (Drew's half) — the announcement, Discord + Decompedia (S93)
|
||
- **Discord — POSTED** by Drew in the tools channel of the decomp.me server (invite `https://discord.gg/sutqNShRRs`, from decomp.me's
|
||
README; ~1,450 members) with the post text of `docs/outreach/tools-announcement.md`, extended on Drew's request with the xsig v2
|
||
direction (`6ce1a38c6`). No permalink recorded (Discord).
|
||
- **Decompedia (decomp.wiki, a Wiki.js site whose pages sync to `decompals/decompedia`; no CONTRIBUTING, no AI policy — checked before
|
||
any edit, R83) — DONE by Drew in the site's own editor** (logged in with GitHub; the `/e/en/<page>` routes are login-gated, 403 to
|
||
anonymous): `platforms/playstation` → `- [xsig](https://github.com/Druthulu/xsig)` appended to the Tools list;
|
||
`projects/playstation-1` → `- [Brave Fencer Musashi](https://github.com/Druthulu/BFM-decomp)` as the first project row. Verified
|
||
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.
|
||
|
||
### 2026-09-08 — Task 7 (part 1) — C11: the tree's public shape, two owner decisions (xHigh; S93)
|
||
- **`docs/outreach/` untracked** (Drew: "just gitignore", after the notes were sent — the Archipelago issue, the preset request, the
|
||
tools post, his `#ai` reply): `git rm --cached`, a contents-form `.gitignore` rule (R84), no rewrite (the drafts are in the published
|
||
history); `tools/doc_links.py` DEFAULT list, the Reference-index row (a no-link row pointing at SETUP's outcome sections), two SETUP
|
||
inventory rows updated (`fe45f7f01`).
|
||
- **`docs/sunset/` untracked** (Drew: "remove sunset from the pushed repo", then "keep the old tools in the sunset folder for the index,
|
||
but not the other stuff"): the 60 tracked files of the document archive (59 + its README) leave the tree — the wiki's Archive index
|
||
rows ARE the record, the last tracked versions are in the history at v1.32.1; a contents-form ignore rule; **`tools/sunset/` (35
|
||
files) STAYS tracked** for the tool index (the census's file checks kept as they were). Rewritten so no wiki page cites the folder as
|
||
present: `Archive-index.md` (header; the tools section says the folder stays), `Docs-and-scratch-conventions.md` (the archive rule is
|
||
now "an Archive-index row + delete in the same commit; history keeps it"), `Repository-layout.md`, `Reference-index.md` §Not listed,
|
||
`docs/history/README.md`. A trial "untrack both" pass was made, measured (the census needs the retired files for its `--check`, and a
|
||
fresh clone would have gone red), and reverted for the tools half on Drew's clarification — the census is unchanged.
|
||
- Checks after: `tool_census --check` OK · `doc_links --strict` OK (0 pending / 0 broken) · `wiki_render --selftest` 12/12, 32 pages ·
|
||
`audit_public` OK over 6,914 tracked paths · `kit_lint` OK · `make kit-corpus` regenerated (359 copies / 28 pointers).
|
||
- The wiki pages changed (Reference-index, Archive-index, conventions, layout) → the C11 wiki re-sync (Drew's word).
|
||
|
||
### 2026-09-08 — Task 7 (part 2) — C11: the prune, the record, the README timeline (xHigh; S93)
|
||
- **Other clones:** none — the relic Windows clone deleted by Drew during planning (verified twice: `ls` → No such file); the C4 archive
|
||
mirror's remote re-read = `Druthulu/BFM-decomp-archive.git` (private, the surviving copy). `git worktree list` → one (R77). Runbook §12's
|
||
reset recipe: not applicable, with this evidence.
|
||
- **The prune (`.run/P34/c11/prune.txt`, `inventory_before.txt`):** the untracked campaign scratch, each tree sampled before deletion
|
||
(per-function draft dirs with `.c`/`.o`, permuter work dirs, wave shards, resolver/rtu shadow trees, the P29/P32 crack scratch; newest
|
||
2026-09-05; all superseded by the banked source): `.run/match` 4.1G, `permuter` 592M, `wave4` 357M, 15 × `wave_e*/f*` ≈1.8G,
|
||
`rtu_shadow` 321M, `resolver` 222M, `crack3` 220M, `audit` 220M, `c954` 196M, `objdiff` 6.7M; `.run/public_rewrite/` 1.1G → 352K
|
||
(only `old-to-new.tsv` + `old_tag_tip.txt` kept, so the probe stays runnable). **Disk 46G → 37G used (33G free).** Keep-set intact:
|
||
`obj40`, `decompme`, `wiki`, `verbatim_targets`, `ghidra_export`, 223 sig files; **tracked `.run` files 952, missing 0.**
|
||
- **The record:** `phase-ends/DIGEST.md` §0 (PUBLIC 2026-09-08; Phase 34 in progress), §1 (the flip date on the H1 bullet), §4 (the
|
||
archive rows are the record); `docs/decision-log.md` "P34 S93 — the flip" (R31); `docs/accelerators.md` P34 S93 (three); `docs/SETUP.md`
|
||
posture section (the flip date, the probe, the ruleset id, the wiki, decomp.dev); `docs/wiki/Where-the-project-goes-next.md` §Phase 34
|
||
in the past tense. **README (Drew's ask):** the generated timeline SVG now sits right under the progress block with its provenance line;
|
||
`tools/timeline.py` regenerated (its rows were stale against the digests since the 33.5 close) → `timeline --check` fresh.
|
||
- Checks: `make audit-digest` OK · `doc_links --strict` OK · `wiki_render --selftest` 12/12, 32 pages (this and part 1's outputs).
|
||
- **The wiki re-sync — DONE** on Drew's word ("sync it", a second explicit one-off R6 waiver for the wiki repository): `tools/wiki_sync.sh
|
||
--push` → the five modified pages, **`75c17d0..be8a6cc master -> master`**, "wiki: sync from BFM-decomp a1d47bb00"; verified: the remote
|
||
`master` = `be8a6cc`, the live Archive-index page (200) carries "removed from the tree at Phase 34" (`.run/P34/outward/wiki_push_c11.log`).
|
||
`gh auth logout` stays Drew's last command after the close push. **Task 7 CLOSED.**
|
||
|
||
### 2026-09-08 — Task 8 (part 1) — the close health chain: one instrument defect, exposed by the prune and fixed (Max; S93)
|
||
- The first `make tools-health` of the close (`.run/P34/tools_health_close.log`, 3,416 lines) went **red at `audit-cdecl`**: "PARSER
|
||
DEFECTS (gcc accepts, cdecl does not): 4", all four the same non-C line `extern if (...)` in `.run/drafts-T6-recanon/` drafts. At the
|
||
33.5 close the SAME four lines were "NOT-C (gcc rejects it too): 4 → ALL ORACLES GREEN" on an unchanged sample (the sorted glob of
|
||
`.run/drafts*/*.c`; no draft dir was pruned). **Root cause (R40 → the instrument, R57 → its write path):** the gcc adjudication writes
|
||
its probe to `.run/audit/cdecl/adj.c`; task 7's prune removed `.run/audit/`; the write raised; the bare `except Exception` counted every
|
||
unparsed line as a DEFECT. A refusal reported as a verdict.
|
||
- **Fix (`tools/cdecl.py`):** `os.makedirs` for the scratch dir (the other two `.run/audit/cdecl` users already had it); an adjudication
|
||
that cannot run now `sys.exit`s with a refusal (R43) instead of grading either way. `make audit-cdecl` alone → **unparsed 4 → DEFECTS 0,
|
||
NOT-C 4 (`.run/drafts-T6-recanon`), gcc accepted 4,777 / REJECTED 0, "cdecl: ALL ORACLES GREEN"** (`.run/P34/c11/audit_cdecl_after_fix.log`).
|
||
`make kit-corpus` regenerated (cdecl.py is in the corpus); `tool_census --check` OK. The full chain relaunched detached (its log
|
||
overwrites the red one; the red run's verdict is quoted here).
|
||
- Lesson for the ledger: a scratch prune is an instrument change — every tool that writes under a pruned tree must be re-run before the
|
||
prune is called done (a candidate rule for the PhaseEnd).
|
||
|
||
### 2026-09-08 — Task 8 (part 2) — the close health chain GREEN on its fifth run; two more instrument findings on the way (Max; S93)
|
||
- Run 2 (after the cdecl fix) went red at **`doc_links --strict`**: two wiki citations of paths I had untracked that day — the Archive
|
||
index cited the outreach draft's path, the conventions page cited the archive folder in backticks. Rewritten as prose (`a13d1cd9a`).
|
||
(The part-1 checks had printed OK because I read only their last line; strict mode had been green before those two edits.)
|
||
- Run 3 went red at **`kit_coverage`** (R92 doing its job): R84–R95, newly in the digest, and the new accelerators entry "P34 S93" were
|
||
neither cited by a kit provenance line nor dispositioned. Fix: **DK-81** (the flip day's four lessons, provenance citing the entry)
|
||
and twelve map rows, each naming the kernel or rule that already carries the lesson (DK-67, DK-57, DK-66 ×2, G66, DK-80, DK-69,
|
||
DK-65, three `KIT:` files, one RECORD). **My error, recorded (R66):** commit `81ec81945` says "kit_coverage green" while three `KIT:`
|
||
rows were still refused — `tail` in the pipeline masked the exit code; the paths are relative to `decomp-architect/`. Fixed and
|
||
stated in the follow-up `9f2aa46b5` (`.run/P34/c11/kit_coverage_after.log`: 0 uncovered rules, 0 uncovered accelerators). Run 4 was
|
||
killed (it would have failed the same way); no cdecl leftover, no orphan.
|
||
- **Run 5 (`.run/P34/tools_health_close.log`, 5,917 lines, 480 s): `tools-health: OK — sigs fresh; corpus(+resident) + cdecl + binaries +
|
||
report(lint+dedup) + cookbook-index all green.`** Rungs quoted: audit-binaries 218/218 · corpus audit 0 PHANTOM + 0 TRUNCATED · cdecl
|
||
ALL ORACLES GREEN (unparsed 4 → NOT-C 4, DEFECTS 0; gcc 4,777 accepted / 0 rejected) · dedup-check 2,220 validated / 0 failed ·
|
||
audit-digest OK (instr 13,492,113 / 13,492,113; distinct 90,984 / 90,984 uniq) · progress.py --check fresh · timeline --check fresh
|
||
(73 rows) · sdk-dual OK (main `143dbb89…` with and without the SDK) · doc_links 0 pending / 0 broken (56 documents, 454 links,
|
||
coverage 63 of 63) · gccmap_cites OK · ghidra_roster OK (6) · tool_census OK (359 + 28, 0 gaps) · kit_lint OK · kit_coverage OK ·
|
||
split_indicator 218 OK. **No build input changed in this phase (R22 not owed); the fleet's 218/218 stands from the Phase-33 close.**
|
||
- Candidate rules for the PhaseEnd (P10): a scratch prune is an instrument change (re-run every tool that writes under the pruned
|
||
tree); read a check's EXIT CODE, never its last line, before writing "green" (`set -o pipefail` in every chain); a third-party step
|
||
is proven through the third party's toolchain, on the pasted file, before the browser session.
|
||
|
||
### 2026-09-08 — Task 8 (part 3) — gate 2 and the close (Max; S93)
|
||
- The P7 walk presented with the gate-2 live re-check (`.run/P34/flip/gate2_recheck.txt`, 20:18 UTC): every milestone line quoted.
|
||
**Drew: "sync it, milestone met, write the phaseend."** The third wiki sync (one-off R6 waiver): `be8a6cc..73ab268`, the live kit page
|
||
shows DK-81. `docs/progress.fleet.md` as regenerated by the close chain committed (`577da268e`); tree clean; HEAD `577da268e`, four
|
||
commits ahead of `origin/main` (`a13d1cd9a`, both workflows green there).
|
||
- The headless Ghidra MCP stopped via `tools/ghidra_mcp_stop.sh` (R23): `REPORT: Save succeeded for processed file: /SLUS_007.26`; never
|
||
used this phase; nothing under `ghidra/` is tracked.
|
||
- `phase-ends/PhaseEnd_Phase34.md` written (all sections; Gen2 EXIT; candidates (a)–(d)); DIGEST §0/§2/§3 appended (step 3b); this file
|
||
archived → `phase-ends/logs/Phase34.md` (R19, `git mv`); `make kit-corpus` regenerated the record copies — **all left uncommitted for
|
||
Drew's close commit, the `v2.0.0` tag, the push, the Release and `gh auth logout`** (the commands are verbatim in the PhaseEnd's 🛑 block).
|
||
|
||
## 🛑 SESSION CHECKPOINT — PHASE 34 CLOSED (S93, 2026-09-08, v2.0.0 = GEN2 EXIT): tasks 0a, 0–8 ✓; the PhaseEnd is written; NEXT = Drew's close commit + tag + push + Release + logout, then a FRESH SESSION in plan mode at Max for Phase 35 (Gen3 opens from docs/gen3-handoff.md + docs/gen3-standards.md)
|
||
|
||
### How to use this block
|
||
This phase is closed. A session that finds this file under `phase-ends/logs/` reads it only on demand (R19). The seed for the next
|
||
phase is `docs/gen3-handoff.md` + `docs/gen3-standards.md`; the pending outward items (the decomp.me preset's creation, a reply from
|
||
Archipelago, frogress) are named in `PhaseEnd_Phase34.md`; the wiki is synced through `tools/wiki_sync.sh --push` (Drew's, R6).
|
||
|
||
### 0. How to use this block
|
||
A fresh session reads CLAUDE.md's load order, replays THIS block verbatim, and resumes at the first unchecked task above. Everything
|
||
a task needs is in its row, its plan paragraph (§"Approved plan" below), and the "carried context" here. Drew's browser/GitHub steps
|
||
pace tasks 1–6: present ONE task, wait for Drew's report (URLs / "done"), verify against the host, log, commit, next. Never claim an
|
||
outward action done without its URL or API line (P9). Effort: Max is session-only — ask Drew to re-apply `/effort max` at session
|
||
start (tasks 0a–7 run fine at xHigh; task 8 is Tier 1, Max).
|
||
|
||
### 1. Where things stand
|
||
- Baseline HEAD at open `eb342dc9f` = `origin/main` (Drew's 33.5 close, pushed 2026-09-08 15:36Z). Tree clean apart from this task's
|
||
files. 1 pack / 82 MB; the working repo holds none of the sampled old commits (the probe's self-check line is absent from S91's log).
|
||
- GitHub (measured S93 15:xx MDT): `Druthulu/BFM-decomp` **private**, `has_wiki` false, description "Brave Fencer Musashi decomp", no
|
||
topics, no homepage, AGPL-3.0, 0 forks, 161 Activity rows; both workflows GREEN on `eb342dc9f` (`no-rom` run 34245832656 1m52s,
|
||
`progress` run 34245832709 22s; artifact `SLUS_007.26_report` 7,921 B). `Druthulu/BFM-decomp-archive` private, not a fork.
|
||
`Druthulu/xsig` public, no topics, no homepage. `Druthulu/decomp-permuter` **does not exist** (API 404; not in `gh repo list`).
|
||
- Unauthenticated controls while private (the known-true negatives for task 1): `https://github.com/Druthulu/BFM-decomp` → 404;
|
||
`https://raw.githubusercontent.com/Druthulu/BFM-decomp/main/docs/badges/fleet_instr.json` → 404;
|
||
`https://github.com/Druthulu/BFM-decomp/actions/workflows/no-rom.yml/badge.svg` → 404; `https://github.com/Druthulu/xsig` → 200.
|
||
- `gh auth status`: logged in as Druthulu, scopes `gist read:org repo workflow` (enough for everything planned; no `delete_repo`).
|
||
- Inputs present: `.run/decompme/drew_bundle/{1_target_asm.s,2_context.c,3_source.c,4_compiler_flags.txt,5_issue_body.md}` (E1);
|
||
`.run/public_rewrite/old-to-new.tsv` (4,033 lines) + `old_tag_tip.txt` (the probe's inputs; `docs/commit-map.tsv` carries the same
|
||
rows); `tools/frogress_upload.py` dry run prints the payload for `eb342dc9f` (363,214 / 13,492,113 / 5,820,205 / 45,150 / 218).
|
||
- `.run/` 29 GB, disk 24 GB free of 73 GB; `.run/public_rewrite/` 1.1 GB; `.run/objdiff/` 6.7 MB; no linked worktrees; no tags anywhere.
|
||
|
||
### 2. Carried context per remaining task (exact invocations; gotchas)
|
||
- **Task 0:** `mkdir -p .run/P34/probe && tools/public_rewrite/probe_github.sh 2>&1 | tee .run/P34/probe/pre_flip.log; echo exit=${PIPESTATUS[0]}`.
|
||
Expect "probe: PASS — every sampled old hash is gone", "control: current main <origin/main sha> resolves (OK)", exit 0. The fetch check
|
||
runs in a throwaway bare repo under `.run/public_rewrite/probe_scratch.git` (R81) — it never touches the working repo. Needs `gh` auth
|
||
and network. A "WARNING — the WORKING repo's object store holds N" line means old objects are held locally → the recipe it prints is
|
||
Drew's to run (the auto-mode classifier refuses `gc --prune` from a Claude shell).
|
||
- **Task 1 (Drew flips, then Claude):** `gh api repos/Druthulu/BFM-decomp --jq '{private,visibility,has_wiki}'`;
|
||
`tools/public_rewrite/probe_github.sh --after-flip 2>&1 | tee .run/P34/probe/after_flip.log`; the three curls above (expect 200 now);
|
||
`gh api repos/Druthulu/BFM-decomp-archive --jq .private` (expect true). Metadata: `gh repo edit Druthulu/BFM-decomp --enable-wiki
|
||
--description "<Drew-approved>" --homepage https://github.com/Druthulu/BFM-decomp/wiki --add-topic decompilation --add-topic playstation
|
||
--add-topic psx --add-topic mips --add-topic reverse-engineering --add-topic psyq --add-topic brave-fencer-musashi` (proposed
|
||
description: "Matching decompilation of Brave Fencer Musashi (PS1, SLUS-00726): 218 binaries rebuild byte-identical from C").
|
||
Ruleset: `gh api -X POST repos/Druthulu/BFM-decomp/rulesets --input -` with `{"name":"protect-main","target":"branch","enforcement":
|
||
"active","conditions":{"ref_name":{"include":["~DEFAULT_BRANCH"],"exclude":[]}},"rules":[{"type":"deletion"},{"type":"non_fast_forward"}]}`;
|
||
verify `gh api repos/Druthulu/BFM-decomp/rulesets`. Then commit the log, Drew pushes, `gh run list --limit 2` must show both green.
|
||
- **Task 2 (Drew):** `docs/decompme-preset.md` §5. Paste `1_target_asm.s` WITHOUT its `.include "macro.inc"` line (the bundle's copy
|
||
starts with a 3-line comment — check whether the `.include` line follows it and drop it). Expect 100% / score 0. If not: STOP and run
|
||
`tools/decompme_replica.sh --upstream` before anything else (a moved decomp.me pin). Record scratch URL, issue URL, the manual search
|
||
result in `docs/SETUP.md` §6.5 (line ~517) and ledger row 14 (line ~1005) and the P33 E1 section (line ~1202).
|
||
- **Task 3 (Drew):** `docs/outreach/archipelago.md` §4 (title + body; or the Discord short form). Record the URL in SETUP's P33 E2
|
||
section (line ~1180) + the log. §5 (reply handling: memory-map rows `reported`, names via `config/symbols.us.txt` +
|
||
`tools/ghidra_apply_symbols.sh`) is pending unless a reply arrives in-phase.
|
||
- **Task 4 (Drew):** decomp.dev `manage/new` → `Druthulu/BFM-decomp` (reads the `SLUS_007.26_report` artifact of `progress.yml`);
|
||
frogress slug `bfm` + key requested from the maintainers; push = `FROGRESS_API_SECRET=… .venv/bin/python tools/frogress_upload.py
|
||
--push` in DREW's shell. Verify: `curl -s -o /dev/null -w '%{http_code}' <decomp.dev project URL>`; `curl -s
|
||
https://progress.deco.mp/data/bfm/us/ | head -c 600`. Then the P6 rules check (four tasks completed: 0, 1, 2, 3).
|
||
- **Task 5:** Claude `tools/wiki_sync.sh` (dry run; expect "not clonable yet … Rendered 32 pages" until Drew creates the first page).
|
||
Drew: Wiki tab → Create the first page → `tools/wiki_sync.sh --push`. Verify: `git -C .run/wiki/BFM-decomp.wiki log -1 --oneline`;
|
||
curls of `https://github.com/Druthulu/BFM-decomp/wiki`, `/wiki/Home`, `/wiki/Reference-index` → 200.
|
||
- **Task 6:** `gh repo edit Druthulu/xsig --add-topic decompilation --add-topic mips --add-topic playstation --add-topic psx --add-topic
|
||
psyq --add-topic dedup --add-topic reverse-engineering -h https://github.com/Druthulu/BFM-decomp`; verify `gh api repos/Druthulu/xsig
|
||
--jq '{topics,homepage}'`. Fork: already gone (record, do not redo). Drew posts `docs/outreach/tools-announcement.md` in his words.
|
||
- **Task 7 (C11):** `git worktree list` (expect one); `du -sh .run/public_rewrite .run/objdiff`; delete everything in
|
||
`.run/public_rewrite/` EXCEPT `old-to-new.tsv` and `old_tag_tip.txt`; `rm -rf .run/objdiff`; list untracked regenerable `.run/`
|
||
subtrees with sizes (`git ls-files .run` is the keep-set; the allowlisted evidence dirs stay) and prune the regenerable ones, quoting
|
||
before/after `du`. Docs: DIGEST §0 (PUBLIC since <date>) + §1 (the flip executed); `docs/decision-log.md` "## P34 S93 (2026-09-08)
|
||
— the flip" (R31); `docs/SETUP.md` posture section (line ~942: the flip date, the ruleset, the wiki live) + §6.5/row 14/E2/D3
|
||
outcomes; `docs/wiki/Reference-index.md:70` (outreach row → past tense); `docs/wiki/Where-the-project-goes-next.md` §Phase 34 (past
|
||
tense, dated). Checks: `.venv/bin/python tools/doc_links.py --strict`; `.venv/bin/python tools/wiki_render.py --selftest`;
|
||
`make audit-digest`. If wiki pages changed → Drew re-runs `tools/wiki_sync.sh --push` (or list as pending). NOT here: `gh auth logout`.
|
||
- **Task 8 (G2, Tier 1):** `nohup make tools-health > .run/P34/tools_health_close.log 2>&1 &` with a foreground waiter loop (the chain
|
||
exceeds the 10-min foreground cap; never a harness background task — the memory `tools-health-foreground-not-background`); read the
|
||
final "tools-health: OK" line. P7 walk of every checkbox + the milestone lines; present; WAIT for gate 2. Then the PhaseEnd
|
||
(`phase-ends/PhaseEnd_Phase34.md`, all sections incl. Plain-English Recap, R84–R95 in the rules table, pending outward items by
|
||
name), `git mv phase-ends/CURRENT_PHASE.md phase-ends/logs/Phase34.md`, DIGEST §0/§2/§3 append — LEFT UNCOMMITTED. The 🛑 block
|
||
hands Drew: `git add -A phase-ends && git commit -m "chore(phase-34): CLOSE — …"`, `git tag -a v2.0.0 -m "Gen2 exit — …"`,
|
||
`git push origin main --tags`, `gh release create v2.0.0 --title "v2.0.0" --notes-file <his notes>`, `gh auth logout`. HARD STOP.
|
||
|
||
### 3. Environment
|
||
WSL2 Ubuntu, `~/bfm-decomp` (ext4). `.venv/bin/python` for every tool. `gh` authenticated as Druthulu (until Drew's logout at the
|
||
close). The headless Ghidra MCP is started by the SessionStart hook and is NOT needed in this phase (no RE work; stop it cleanly per
|
||
R23 before the close: `tools/ghidra_mcp_stop.sh` if present — check SETUP §2.8). Network needed for every gh/curl step. No `/tmp` (R12):
|
||
scratch under `.run/P34/`. Never `git clean -x` (R78). Never `git push` (R6).
|
||
|
||
## Approved plan (verbatim, 2026-09-08 — the `~/.claude/plans/` copy is not part of the repo)
|
||
|
||
# Phase 34 plan — the flip and the Gen2 exit (v1.32.1 → v2.0.0)
|
||
|
||
Planned 2026-09-08 (S93, plan mode, Max) from `docs/phase34-seed.md`, `docs/public-flip-runbook.md` §11–§12, the Phase-33
|
||
checkpoint §0b (`phase-ends/logs/Phase33.md:745`), and the live GitHub/tree state measured this session.
|
||
|
||
## Context
|
||
|
||
Phase 33 finished everything before the public flip and was re-chartered because the flip waited on GitHub Support purging the
|
||
old objects (ticket #4736982). Phase 33.5 made the docs publishable. **The gate opened during 33.5: the probe printed PASS on
|
||
2026-09-07** (`.run/P33.5/probe_github_s91.log`, 33 of 33 old hashes gone, control OK). Phase 34 is the last Gen2 phase: the flip,
|
||
the outward actions Drew does in his own words, the aftercare, and the v2.0.0 PhaseEnd = Gen2 EXIT. Gen3 opens at Phase 35.
|
||
|
||
Most tasks are **Drew's browser/GitHub actions**; Claude's job is to run the probes and checks, verify every outward result against
|
||
the host (P9: a URL or an API line, never an intent), log each task in `CURRENT_PHASE.md`, commit per task (R42/R8), and write the
|
||
PhaseEnd. Nothing in this phase changes a build input: **R22 is not owed**; tools-health runs once before the PhaseEnd (docs rungs).
|
||
|
||
## Gate-1 decisions (Drew, 2026-09-08, this session)
|
||
|
||
1. **Rules:** the Phase-33.5 candidates (i)–(xii) are **ratified as R84–R95** (full text appended to `phase-ends/DIGEST.md` §3 in task 0a):
|
||
R84 ignore-file directory-form wall · R85 two DERIVED figures per check · R86 a judge is an instrument (negative-control before a FAIL) ·
|
||
R87 a tool ships with its dictionary row · R88 `doc_links --strict` after ANY untrack/archive move · R89 an unattended installer's
|
||
manifest is a derivable SET · R90 transcripts-in-repo governance needs the firewall's class-7 line · R91 a foreign project's path in
|
||
prose, never a backticked citation · R92 a distillation ships with a coverage check · R93 the worklogs get one final read with an
|
||
"already banked?" grep · R94 never `.strip()` a porcelain listing · R95 types are a banking + width lever: canonical type file from
|
||
the first bank, widths proven by the bytes, no duplicate definition or raw address cast banked (the Gen3 type rule).
|
||
2. **Repo metadata:** Claude runs the `gh repo edit` calls after the flip on Drew's word (wiki enable, description, topics, homepage;
|
||
xsig topics + homepage in task 6). Description proposed: *"Matching decompilation of Brave Fencer Musashi (PS1, SLUS-00726): 218
|
||
binaries rebuild byte-identical from C"* — Drew edits the wording at task 1.
|
||
3. **Other clones:** none. The one candidate, `/mnt/z/Storage/git/BFM-decomp` (a Phase-1 relic clone: 11 commits, 2026-06-13, old
|
||
lineage, `origin` = BFM-decomp), was found by this session's preflight and **deleted by Drew during planning; verified gone
|
||
(`ls` → No such file)**. C11's clone-reset step is therefore not applicable; recorded with this evidence.
|
||
4. **Extras chosen:** a GitHub Release for v2.0.0 (notes in Drew's words) and a ruleset on `main` (no force-push, no deletion).
|
||
Not chosen: the off-machine bundle copy (the archive repo `Druthulu/BFM-decomp-archive`, private, is the surviving copy of the old
|
||
history) and the public fresh-clone re-proof (B3's proof stands, per the seed).
|
||
|
||
## Preflight facts (measured S93; R14 — re-verify in the task that depends on them)
|
||
|
||
| Fact | Value |
|
||
|---|---|
|
||
| `main` / `origin/main` | both `eb342dc9f` (Drew's 33.5 close, pushed 15:36Z); tree clean; 1 pack, 82 MB, no old objects held |
|
||
| Repo | `private: true`, `has_wiki: false`, description "Brave Fencer Musashi decomp", topics `[]`, homepage null, license AGPL-3.0, 0 forks, 161 activity rows |
|
||
| Workflows | `no-rom` 1m52s and `progress` 22s both **success** on `eb342dc9f`; artifact `SLUS_007.26_report` (7,921 B) present, not expired |
|
||
| Unauthenticated controls (today, private) | repo page **404**, raw badge JSON **404**, `no-rom` badge.svg **404**, `Druthulu/xsig` **200** — the known-true negatives for the post-flip checks |
|
||
| gh | logged in as Druthulu, scopes `gist read:org repo workflow` (enough for `repo edit`, rulesets, `release create`); no `delete_repo` — not needed |
|
||
| Fork `Druthulu/decomp-permuter` | **already gone** (API 404; `gh repo list` shows no fork) — task 6's deletion is DONE, evidence recorded |
|
||
| Archive repo | `Druthulu/BFM-decomp-archive` private, not a fork — must STAY private (a milestone check) |
|
||
| E1 inputs | `.run/decompme/drew_bundle/` present (33-line target, context, source, flags, issue body); `.run/decompme/target/` absent (regenerable, not needed — the bundle IS the paste) |
|
||
| D3 inputs | `frogress_upload.py` dry run prints the payload for `eb342dc9f` (363,214 / 13,492,113 / 5,820,205 / 45,150 / 218) |
|
||
| Windows tree | `/mnt/z/Storage/git/BFM-decomp/.git` was a Phase-1 relic (HEAD `f7807d84d` 2026-06-13, 11 commits, old lineage) — **deleted by Drew 2026-09-08 during planning, verified gone**; `/mnt/z/Storage/git/BFM-decomp-archive` is the C4 archive mirror (remote checked, see task 7) |
|
||
| `.run/` | 29 GB; disk 24 GB free of 73 GB; `.run/public_rewrite/` 1.1 GB (bundle, dict.json, maps, logs); `.run/objdiff/` 6.7 MB |
|
||
| Tags | none, locally or on origin — `v2.0.0` will be the first |
|
||
| Maps | `.run/public_rewrite/old-to-new.tsv` 4,033 lines == `docs/commit-map.tsv` rows (+5 comment lines) — the probe's input survives in the tracked file |
|
||
| `gh` in the health chain | none — logout is safe for tools-health |
|
||
|
||
## Tasks (one at a time; each ends with a `CURRENT_PHASE.md` log entry + one commit; effort per R7)
|
||
|
||
**0a. Open the phase** — Claude · xHigh · *first action after approval.* Write `phase-ends/CURRENT_PHASE.md` (this plan verbatim,
|
||
checkboxes, current-task pointer, a 🛑 SESSION CHECKPOINT block), append R84–R95 in full to `phase-ends/DIGEST.md` §3 (the
|
||
P33.5 precedent), add the `.run/P34/` evidence allowlist block to `.gitignore` (logs only, R74), build the harness task list (R28),
|
||
commit. Verify: `doc_links --strict` still 0/0.
|
||
|
||
**0. The probe, once more** — Claude · Low. `tools/public_rewrite/probe_github.sh | tee .run/P34/probe/pre_flip.log` → exit 0,
|
||
"PASS", control OK, no "WARNING — the WORKING repo holds" line. If anything is ALIVE: stop, P5(e) — the fallback (delete/recreate)
|
||
is Drew's decision and needs `delete_repo` scope. Commit the log.
|
||
|
||
**1. C10 — the flip and the post-flip checks** — Drew (decision, Max) then Claude (checks, Low).
|
||
Drew: Settings → General → Danger Zone → Change visibility → Public. Tell Claude. Claude, on that word:
|
||
- `gh api repos/Druthulu/BFM-decomp --jq .private` → `false`; `probe_github.sh --after-flip` → exit 0 (adds the unauthenticated
|
||
7-char `/commit/` checks); the four unauthenticated curls flip **404 → 200** (repo page, raw badge JSON, badge.svg; xsig stays 200);
|
||
`gh api …/BFM-decomp-archive --jq .private` → still `true`.
|
||
- Metadata (decision 2): `gh repo edit Druthulu/BFM-decomp --enable-wiki --description "<Drew's wording>" --homepage
|
||
https://github.com/Druthulu/BFM-decomp/wiki --add-topic decompilation --add-topic playstation --add-topic psx --add-topic mips
|
||
--add-topic reverse-engineering --add-topic psyq --add-topic brave-fencer-musashi`; verify with `gh api` (`has_wiki` true, topics list).
|
||
- The ruleset (decision 4): `gh api -X POST repos/Druthulu/BFM-decomp/rulesets` with `{name:"protect-main", target:"branch",
|
||
enforcement:"active", conditions:{ref_name:{include:["~DEFAULT_BRANCH"],exclude:[]}}, rules:[{type:"deletion"},{type:"non_fast_forward"}]}`;
|
||
verify with `gh api …/rulesets`. (A fast-forward push of the close commit and a tag push are unaffected.)
|
||
- Actions: the next push (this task's commit, pushed by Drew) must show both workflows green on the PUBLIC repo — `gh run list --limit 2`
|
||
quoted in the log; never claimed unseen (P9). All outputs → `.run/P34/flip/`.
|
||
|
||
**2. E1 — the decomp.me preset** — Drew · xHigh. The six steps of `docs/decompme-preset.md` §5 with the bundle in
|
||
`.run/decompme/drew_bundle/` (paste `1_target_asm.s` without its `.include "macro.inc"` line; `2_context.c`; `3_source.c`; flags
|
||
`4_compiler_flags.txt`; issue body `5_issue_body.md`, edited in Drew's voice, R83). Expect 100% / score 0; if not, STOP and Claude runs
|
||
`tools/decompme_replica.sh --upstream` (a moved pin) before anything else. Drew reports: scratch URL, issue URL, the manual-search
|
||
result. Claude records them in `docs/SETUP.md` §6.5 + ledger row 14 (closing the greenfield claim's last check) + the log; commits.
|
||
|
||
**3. E2 — the Archipelago note** — Drew · xHigh. The issue on `AegeusEvander/Brave-Fencer-Musashi-AP-World` from
|
||
`docs/outreach/archipelago.md` §4 (or the Discord short form), in Drew's words. Claude records the URL in SETUP's P33 E2 section + the
|
||
log; the reply handling (§5: memory-map rows as `reported`, names via `symbols.us.txt` + `ghidra_apply_symbols.sh`) is **recorded as
|
||
pending** in the PhaseEnd unless a reply arrives in-phase.
|
||
|
||
**4. D3 — the progress boards** — Drew · xHigh. decomp.dev: log in → `decomp.dev/manage/new` → add `Druthulu/BFM-decomp` (reads the
|
||
`SLUS_007.26_report` artifact). frogress: request slug `bfm` + key from the maintainers; when granted,
|
||
`FROGRESS_API_SECRET=… .venv/bin/python tools/frogress_upload.py --push` (Drew's shell — the key never touches a file or Claude's
|
||
context). Claude verifies: the decomp.dev project URL resolves (curl 200); `curl https://progress.deco.mp/data/bfm/us/` returns the
|
||
entry for the pushed hash. Whatever is not granted in-phase is **recorded as pending** with the request's evidence.
|
||
→ **P6 rules check after this task** (four completed: 0, 1, 2, 3 — task 0a is the opening step).
|
||
|
||
**5. F3 — the wiki** — Drew · Low (Claude dry-runs first). Claude: `tools/wiki_sync.sh` (dry run: render 32 pages, clone refused
|
||
until the first page exists). Drew: Wiki tab → "Create the first page" (any content) → `tools/wiki_sync.sh --push`. Claude verifies:
|
||
`git -C .run/wiki/BFM-decomp.wiki log -1` shows the sync commit; unauthenticated curl of `…/wiki`, `…/wiki/Home`,
|
||
`…/wiki/Reference-index` → 200; the sidebar renders (Drew eyeballs, Claude records). Log + commit.
|
||
|
||
**6. Tool discoverability** — Claude on Drew's word · Low. `gh repo edit Druthulu/xsig --add-topic decompilation --add-topic mips
|
||
--add-topic playstation --add-topic psx --add-topic psyq --add-topic dedup --add-topic reverse-engineering -h
|
||
https://github.com/Druthulu/BFM-decomp`; verify via `gh api repos/Druthulu/xsig --jq '{topics,homepage}'`. The fork deletion is
|
||
**already done** (measured S93: API 404, no fork in `gh repo list`) — recorded, not redone. Drew posts the tools announcement
|
||
(`docs/outreach/tools-announcement.md`, his words) and reports where; recorded as done-with-link or pending.
|
||
|
||
**7. C11 — aftercare** — Claude · xHigh.
|
||
- Other clones: **none remain** — the Windows relic clone was deleted by Drew during planning (verified); the C4 archive mirror at
|
||
`/mnt/z/Storage/git/BFM-decomp-archive` points at the private archive repo, not at BFM-decomp, and is the intended surviving copy of
|
||
the old history (its remote is re-checked read-only and quoted in the log). The runbook's reset recipe is recorded as not applicable.
|
||
- Claude: `.run/public_rewrite/` → delete the bundle, `dict.json`, the clone artefacts and logs, **keeping `old-to-new.tsv` +
|
||
`old_tag_tip.txt`** (hashes only, inert; the probe stays runnable — deviation from the seed's "delete the directory", reason: R55,
|
||
keep the instrument); delete `.run/objdiff/`; prune regenerable `.run/` subtrees that are NOT tracked/allowlisted (list first,
|
||
`git ls-files .run` as the keep-set, sizes quoted, R41); `git worktree list` (R77) before any gc — none expected.
|
||
- Docs: `phase-ends/DIGEST.md` §0 (PUBLIC since <date>; the Phase-34 state) + §1 (the flip executed; R1/R20 historical stays);
|
||
`docs/decision-log.md` "P34 S93 — the flip" entry (R31: the calendar gate, the relic clone, the ratified rules);
|
||
`docs/SETUP.md` posture section (the flip date, the ruleset, the wiki live, §6.5/row 14/E2/D3 outcomes), `docs/accelerators.md` if
|
||
anything new; the "after the flip" markers in `docs/wiki/Reference-index.md:70` (outreach row) and
|
||
`docs/wiki/Where-the-project-goes-next.md` §Phase 34 (past tense, dated). Then `doc_links --strict`, `wiki_render --selftest`,
|
||
`make audit-digest --check`; if the wiki pages changed, Drew re-runs `tools/wiki_sync.sh --push` (or it is listed as pending).
|
||
- **`gh auth logout` moves to the very end** (a deviation from the seed): tasks 8's Release and the tag verification need gh; it is
|
||
the last line of the 🛑 block, Drew's command after the push.
|
||
|
||
**8. G2 — PhaseEnd_Phase34 v2.0.0 (Gen2 EXIT)** — Claude · **Max, Tier 1** (prompt Drew to confirm Max before starting).
|
||
`make tools-health` detached with a waiter (>10 min; the P33.5 precedent), read OK. Verify every checkbox (P7) against the milestone
|
||
below, present the proof lines, **wait for gate 2**. On confirmation: `PhaseEnd_Phase34.md` (all sections; the verification lines
|
||
quoted from `.run/P34/`; pending outward items listed by name; R84–R95 in the rules table; the plain-English recap; the Gen3 pointer
|
||
`docs/gen3-handoff.md` + `docs/gen3-standards.md`), `git mv CURRENT_PHASE.md phase-ends/logs/Phase34.md` (R19), DIGEST §0/§2/§3
|
||
appended — left uncommitted for Drew (R6). The 🛑 block gives Drew, verbatim: the close commit; `git tag -a v2.0.0 -m "Gen2 exit …"`;
|
||
`git push origin main --tags`; `gh release create v2.0.0 --title "v2.0.0 — Gen2 exit" --notes-file <Drew's notes>` (notes in Drew's
|
||
words from the PhaseEnd changelog facts, R83); then `gh auth logout`. HARD STOP.
|
||
|
||
## Milestone (gate 2 — what Drew confirms; the seed's §3, with the measured additions)
|
||
|
||
1. `gh api repos/Druthulu/BFM-decomp --jq .private` → `false`; `probe_github.sh --after-flip` exit 0; the three unauthenticated
|
||
URLs 200 (were 404); `no-rom` + `progress` green on the public repo; `has_wiki` true and the wiki clonable/rendering; the archive
|
||
repo still private; the ruleset active. B3's fresh-clone proof stands (no build input changed).
|
||
2. Every outward action done with its URL or recorded as pending by name: decomp.me scratch + preset issue + search (row 14
|
||
closed), the Archipelago issue, decomp.dev, frogress, the wiki push, the xsig topics, the fork (done), the tools post.
|
||
3. C11 done (no other clone of the old history remains — verified; scratch pruned with sizes; docs updated; checks green); `PhaseEnd_Phase34.md` v2.0.0 + DIGEST append
|
||
written; Drew's close commit, the `v2.0.0` tag and the Release pushed. **Gen2 EXIT.**
|
||
|
||
## Verification, end to end
|
||
|
||
- Every check compares a derived figure to a derived figure (R85): API JSON, exit codes, HTTP codes with today's 404 controls, `gh run
|
||
list` lines — all tee'd under `.run/P34/{probe,flip,outward,c11}/` (allowlisted, logs only).
|
||
- Instruments: `probe_github.sh` (throwaway scratch, R81), `gh api`, `curl -s -o /dev/null -w '%{http_code}'`, `tools/wiki_sync.sh`,
|
||
`tools/frogress_upload.py`, `tools/doc_links.py --strict`, `tools/wiki_render.py --selftest`, `make audit-digest`, `make tools-health`.
|
||
- Stop conditions: any ALIVE hash (task 0/1), a decomp.me diff below 100% (task 2), a red workflow on the public repo (task 1), a
|
||
`doc_links` failure after the C11 edits — each is P5(a)/(e): report with output, no redefinition (P9).
|
||
|
||
## Deviations from the seed, stated up front
|
||
- Task 0a added (the opening commit: plan, R84–R95, allowlist, task list). Task 6's fork deletion is already done. Task 7 keeps the two
|
||
probe input files and moves `gh auth logout` to the end. Task 1 gains metadata + the ruleset (decisions 2, 4); task 8 gains the Release.
|
||
- Sessions: 1–2 (Drew's browser steps pace it; frogress/decomp.dev/Archipelago may close as pending).
|