Files

57 KiB
Raw Permalink Blame History

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).
  2. 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).
  3. 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)

  • 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)
  • 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)
  • 1 C10 — the flip (Drew, Max) + post-flip checks, metadata, ruleset, Actions green on the public repo (Claude, Low)
  • 2 E1 — decomp.me: scratch → 100% → preset-request issue → manual search (Drew, xHigh); recorded in SETUP §6.5 + ledger row 14 (Claude)
  • 3 E2 — the Archipelago issue (Drew, xHigh); URL recorded; §5 reply handling pending unless a reply arrives (Claude)
  • 4 D3 — decomp.dev registration + frogress slug/key/push (Drew, xHigh); verified by curl (Claude) → P6 rules check after this task
  • 5 F3 — the wiki: dry run (Claude), first page + wiki_sync.sh --push (Drew), pages verified — Low
  • 6 Tool discoverability: xsig topics + homepage (Claude on Drew's word); fork deletion already done; tools post (Drew) — Low
  • 7 C11 — aftercare: scratch prune (keep old-to-new.tsv + old_tag_tip.txt), docs, checks — xHigh (Claude)
  • 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.exits 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 ) + §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 ; 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).