Files

24 KiB
Raw Permalink Blame History

PhaseEnd — Phase 34: The flip and the Gen2 exit — the repository public, the boards and the wiki live, the outreach sent, the tree shaped for readers

Date: 2026-09-08 · Project Version: 2.0.0 · Phase Status: Complete (milestone confirmed by Drew, gate 2 — 2026-09-08, "milestone met, write the phaseend") · Generation: Gen2 EXIT (the 25th and last phase of the arc: 8→…→33→33.5→34)

Chartered by docs/phase34-seed.md (the flip-gated remainder of Phase 33, re-chartered 2026-09-07). Ran one session (S93, 2026-09-08) and 24 commits (c9dffdcfd..577da268e; baseline eb342dc9f, Drew's Phase-33.5 close). The granular trail — every check's literal output, the three instrument findings, every owner decision in its own words — is at phase-ends/logs/Phase34.md (R19, on demand). Owner decisions (Drew): gate 1 (plan mode, Max: R84–R95 ratified; metadata and the ruleset set by Claude on his word; a GitHub Release; "no other clone" — corrected by the preflight, see Deviations); the flip itself; the compiler choice on decomp.me; three one-off R6 waivers for the wiki repository ("sync it"); frogress skipped; docs/outreach/ and docs/sunset/ out of the tree, tools/sunset/ kept; the timeline in the README; the #ai reply in his own words; the xsig v2 direction recorded for Gen3; gate 2.

Build Log

The phase in one line: the purge probe passed twice, Drew flipped the repository public, and in the same day the after-flip checks, the metadata and the protect-main ruleset, the decomp.dev card, the wiki (32 pages), the decomp.me preset request with a 100% scratch, the Archipelago note, the tool announcement and two Decompedia rows, and the aftercare (9 GB of dead scratch pruned, the record updated, two folders taken out of the public tree on the owner's decision) were done — with three instrument defects found and fixed on the way, and the close health chain green on its fifth run.

Files created/changed and complete — do not recreate (category summaries; the per-commit list is git log eb342dc9f..577da268e and the archived log):

  • Governance and record: phase-ends/CURRENT_PHASE.md (→ phase-ends/logs/Phase34.md); phase-ends/DIGEST.md §0/§1/§3/§4 (R84–R95 in full; the flip date; the archive rows as the record); docs/decision-log.md "P34 S93 — the flip" (R31); docs/accelerators.md P34 S93 (three); docs/SETUP.md (the posture section: flip date, probe, ruleset id 22564862, wiki, decomp.dev; §6.5 outcome; ledger row 14 CLOSED; the E2 SENT bullet; the D1–D3 outcome; two new/extended tool rows; the retired-tools heading); docs/gen3-handoff.md §7 (xsig v2: 1-to-1 first, then the sequence tier, the structural family and atlas cousins, returning the matched tier and the difference); .gitignore (the .run/P34/ evidence allowlist; /docs/outreach/*; /docs/sunset/* — contents form, R84).
  • The public surface: README.md — the generated timeline SVG under the progress block with its provenance line; the wiki pages Archive-index.md, Docs-and-scratch-conventions.md, Reference-index.md, Repository-layout.md, Where-the-project-goes-next.md (the public tree's shape; the archive rule is now "an Archive-index row, then delete in the same commit"), Start-a-new-decomp-project.md (DK-1…DK-81); docs/history/README.md; docs/story-timeline.md/.svg regenerated (73 rows). Removed from the tree: docs/outreach/ (2 files, sent) and docs/sunset/ (60 files, the reviewed archive) — no rewrite; the history at v1.32.1 keeps them; tools/sunset/ (35 files) stays for the tool index.
  • Tools (each with its SETUP row, R21; the kit corpus regenerated, tool_census --check 0 gaps): tools/verbatim_target_s.py --gas (the ASSEMBLABLE target form: $-registers, .L<addr> labels, symbol names for external jumps, .set noat/noreorder, no .include); tools/decompme_replica.sh steps D (the paste itself through decomp.me's own as wrapper — fed on STDIN — linked at the address, 26/26 words) and E (Drew's bundle written from the proven run); tools/cdecl.py (--audit creates its scratch dir and REFUSES, never misgrades, when the gcc adjudication cannot run); tools/doc_links.py DEFAULT list; config/tool_dictionary.tsv; config/kit_coverage_map.tsv (twelve dispositions for R84–R95, each naming the kernel or rule that carries it).
  • The kit: decomp-architect/corpus/decomp-kernels.md DK-81 (the flip day: a third-party step proven through the third party's toolchain on the pasted file; the public tree decided before the flip; a calendar gate read the next morning; a scratch prune is an instrument change); decomp-architect/README.md; the corpus copies (tools, record) regenerated by make kit-corpus.
  • Evidence (.run/P34/, allowlisted, text only): probe/pre_flip.log, probe/after_flip.log; flip/ (the repo JSON before/after, the curl codes, the metadata and ruleset API outputs, the runs, the gate-2 re-check); outward/ (the wiki dry-runs and pushes, the scratch/issue checks, the decomp.dev page, the frogress checks, the xsig API output, the Decompedia verification, the replica run after the fix); c11/ (the inventory, the prune with sizes, the cdecl and kit_coverage proofs); tools_health_close.log (run 5, 5,917 lines).
  • GitHub, outside the tree: Druthulu/BFM-decomp public (description, 7 topics, homepage = the wiki; has_wiki; the protect-main ruleset id 22564862, no bypass actors); the wiki repository (BFM-decomp.wiki, three syncs, last 73ab268); Druthulu/xsig (7 topics, homepage); the decomp.dev project (hero image set by Drew); decompme/decomp.me#2106; AegeusEvander/Brave-Fencer-Musashi-AP-World#1; the Decompedia PlayStation pages (a tools row and a projects row, edited in-site by Drew).

Tools/packages installed: none (no apt/pip; no new external tool). Agents: none — every step this phase was the owner's action or a deterministic check.

Verification results (literal, at close — S93, HEAD 577da268e, tree clean, 4 commits ahead of origin/main for Drew's push):

  • The gate-2 live re-check (20:18 UTC, .run/P34/flip/gate2_recheck.txt): gh api repos/Druthulu/BFM-decomp → "private":false, "visibility":"public","has_wiki":true,topics 7,homepage ".../wiki"; rulesets → protect-main id 22564862 enforcement:active; the archive repo → "private":true; xsig → 7 topics + homepage; unauthenticated 200 for the repo page, the raw badge JSON, the wiki's Reference index, the decomp.dev page, issue #2106 and issue #1 (the repo page, the badge and the wiki were 404 on the morning's private controls); gh run list → no-rom success and progress success on a13d1cd9a (the public repo; every push this phase green).
  • The probe: before the flip probe: PASS — every sampled old hash is gone (33 gone of 33, control OK, exit 0, no working-repo warning); after the flip --after-flip PASS 33/33 including the unauthenticated 7-char commit pages (.run/P34/probe/*.log).
  • make tools-health (run 5, 480 s): tools-health: OK — sigs fresh; corpus(+resident) + cdecl + binaries + report(lint+dedup) + cookbook-index all green. audit-binaries 218/218 · corpus 0 PHANTOM + 0 TRUNCATED · cdecl ALL ORACLES GREEN (unparsed 4 → NOT-C 4, DEFECTS 0; gcc 4,777 accepted / 0 rejected) · dedup 2,220 / 0 · audit-digest OK (13,492,113 / 13,492,113; 90,984 / 90,984) · progress + timeline fresh (73 rows) · sdk-dual OK (main 143dbb89f34491258bbc27810d0a12ec8b43a8dd with and without the SDK) · doc_links 56 documents / 454 links / 0 pending / 0 broken / coverage 63 of 63 · gccmap_cites OK · ghidra_roster OK (6) · tool_census OK (359 + 28, 0 gaps) · kit_lint OK · kit_coverage OK (rules R1..R95 0 uncovered; 60 accelerator entries 0 uncovered) · split_indicator 218 OK · xsig tests OK (8). No build input changed in this phase; R22 was not owed — the fleet's 218/218 from the Phase-33 close stands and is asserted by the digest checks.
  • decomp.me: the replica after the fix → 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; Drew's scratch https://decomp.me/scratch/mIu4d at 100% / score 0; the manual search closed ledger row 14 (no other BFM scratch exists).
  • The wiki: three syncs (fec3777..75c17d0, ..be8a6cc, ..73ab268), 32 pages, the live pages verified unauthenticated (200; 0 relative .md links left; the last sync's page shows DK-81).
  • The prune: disk 46 GB → 37 GB used (33 GB free); keep-set intact (obj40, decompme, wiki, verbatim_targets, ghidra_export, 223 sig files); tracked .run files 952, missing 0; .run/public_rewrite/ 1.1 GB → 352 KB (the probe's two inputs).
  • The headless Ghidra MCP (never used this phase — no RE work) stopped via the sentinel at the close (R23; the archived log's last entry quotes the stop); nothing under ghidra/ is tracked.

Milestone achieved (confirmed by Drew, gate 2 — 2026-09-08): all three items of the seed's milestone, on their literal reading — (1) public, the old hashes gone, CI green on the public repo, the wiki live, the archive repo private, the ruleset active, B3's proof standing; (2) every outward action done with its URL or pending by name (P9): the decomp.me preset's creation by its maintainers, a reply from the Archipelago world, frogress (skipped; the request + push recipe recorded); (3) C11 done, this PhaseEnd written with the DIGEST append and the log archived, left for Drew's close commit, the v2.0.0 tag and the Release. Gen2 EXIT.

Next: Phase 35 — Gen3 opens (readability on a byte-exact floor). Open a fresh session in plan mode, Max (Tier 1) from docs/gen3-handoff.md + docs/gen3-standards.md: the order of work is pins off (44,243 register … __asm__ pins, most of which Phase 32 showed come off byte-identical once the source shape is right) → the 5,147 macro bodies into shared C → struct unification (1,232 definitions → one per shape; the 143 raw casts; R95) → names with evidence → formatting — every step gated by the 218 hashes. Gen3's opening phases also inherit: the kit's split into its own repository (with the installable health-chain snippet and the ProjectArchitect findings recorded at 33.5), the xsig v2 direction (gen3-handoff §7), and the three pending outward items above.

Roadmap delta (what Phase 34 changed about the road ahead)

  • Gen2 is closed at v2.0.0. The constitution's Gen2 goals (overlays and engine at scale; go public under AGPL with CI and progress tracking) are met literally: 218 binaries byte-identical, the repository public with a ROM-free CI, decomp.dev live. The gen2-roadmap's two-repo mirror stayed superseded; the in-place flip with the full rewritten history is what shipped.
  • The public tree is smaller than the private one by design, and the rule is written: a retired document gets its Archive-index row and is deleted in the same commit (history keeps it); sent outreach drafts do not live in the tree; retired tools stay for the index.
  • Doctrine that outlives the phase: a step that hands a file to a third party is proven through that party's own toolchain on the file itself before the owner's browser session (DK-81); a scratch prune is an instrument change; "green" is read from an exit code, never a last line; a calendar gate is read the morning after the ticket.
  • Scale, honestly (R41): the seed priced this phase at 1–2 sessions; it took one session and 24 commits, because every outward action was Drew's and each took minutes; the day's cost was the three instrument findings (≈2 h of the session) and one browser step that failed on its first try.

Deviations

Item Plan (gate-1 plan) Actual Reason
"No other clone of the old history" (decision 3) none the preflight found a Phase-1 relic clone at /mnt/z/Storage/git/BFM-decomp (11 commits, 2026-06-13, old lineage); Drew deleted it during planning; verified gone the owner's memory vs. the filesystem — the plan recorded both
E1 (decomp.me) six browser steps, the listing pasted the first scratch FAILED to assemble (invalid operands 'li a2,2'); tools fixed and the paste proven through decomp.me's own as (26/26) before the retry, which matched 100% first time the doc's step had never been exercisable while private (R14); the listing was the word oracle, never assembled anywhere
The seed's "regenerate the bundle with decompme_replica.sh" true was false — nothing wrote the bundle; the replica's step E now does a claim written ahead of the tool
frogress (task 4) slug + key + push skipped on Drew's word after measurement (alive, 38 projects, admin-created; at 100% with decomp.dev live it adds a list row) — pending by name with the recipe owner's decision
Task 6 fork deletion gh repo delete already gone (API 404, 0 forks) — recorded, not redone done before the phase
The public tree (not in the plan) — docs/outreach/ and docs/sunset/ untracked and ignored; tools/sunset/ kept; five wiki pages and the conventions rewritten; a trial "untrack both" measured that the census needs the retired files and was reverted for the tools half Drew's two decisions after the flip (P5d, recorded)
The README (not in the plan) — the generated timeline SVG under the progress block; timeline.py regenerated (its rows had gone stale at the 33.5 close) Drew's ask
gh auth logout in C11 (Claude) moved to Drew's last command after the tag/Release push the Release and the tag verification need gh after C11
The wiki pushes Drew runs --push Claude ran three pushes, each on Drew's explicit "sync it" — one-off R6 waivers for the wiki repository only the P33 xsig/permuter precedent; R6 unchanged for BFM-decomp
The close health chain one run five runs: red at cdecl (the prune removed its scratch dir), red at doc_links (two citations of untracked paths), red at kit_coverage (R84–R95 and the new accelerators entry uncited), a fourth killed, the fifth green each a real finding; the fixes are in the tools and the map
Commit hygiene R66 one commit (81ec81945) claims "kit_coverage green" while three rows were still refused (a tail masked the exit code); named and fixed in the next commit recorded as candidate (b)

What we believed, what failed, and what we would do sooner (for the retrospective; detail in docs/decision-log.md P34 S93)

  • Believed: the decomp.me step was ready — "paste the regenerated .s without its first line". It failed on the first try: the file was the comparison oracle, not an assemblable target, and the replica had proven the compile, never the paste. Sooner: prove every third-party step through the third party's own toolchain, on the exact file, and let the proving tool write the paste (done now).
  • Believed: the flip would wait about a week on GitHub Support. It passed in a day, during the previous sub-phase. Sooner: read a calendar gate the morning after the ticket.
  • Believed: the tree that passed the flip audit was the tree to publish. Within hours the owner took two folders out — the sent outreach drafts and the reviewed archive — and a trial removal of the tools archive measured a fresh clone going red. Sooner: decide the public tree's contents at the consolidation sub-phase; the Archive-index rule (paths, never links) made the late removal harmless.
  • Believed: pruning untracked scratch was housekeeping. It was an instrument change: one audit wrote its probe under the pruned tree, and its bare except turned the refusal into four "parser defects"; two more red chains followed from citations and coverage of the day's own edits. Sooner: after any prune, re-run every tool that writes under it; and read every check's exit code — one commit here claims "green" from a masked pipeline (named in the log, fixed in the next commit).
  • Cost: no agents, no model tokens beyond the coordinator; the phase's expense was the five health runs (≈40 min wall) and the browser round-trips, and it bought a public repository whose every published number, page and card is generated or verified from the tree.

Commit Message

(Phase 34 landed as 24 commits c9dffdcfd..577da268e, 2026-09-08 (S93). This close = the archived log + this PhaseEnd + the DIGEST
update + the kit's record copies, Drew's milestone-close commit, then the v2.0.0 tag and the Release.)

chore(phase-34): CLOSE — Gen2 EXIT: the repository public (probe 33/33 gone before and after), protect-main, decomp.dev + the wiki
live, the decomp.me preset requested at 100%, the Archipelago note and the tool announcement sent, the aftercare done (v2.0.0)

- PhaseEnd_Phase34.md written; CURRENT_PHASE.md archived to phase-ends/logs/Phase34.md (R19); DIGEST §0/§2/§3 appended (step 3b)
- one session (S93): tasks 0a–8; the flip + metadata + ruleset; E1 with the paste form fixed and proven (verbatim_target_s --gas,
  replica steps D/E); E2; D3 (decomp.dev; frogress pending by name); the wiki ×3 syncs; xsig topics; the posts + Decompedia rows;
  C11 (~9 GB pruned, the record updated, docs/outreach + docs/sunset out of the tree on the owner's decision); DK-81 + the coverage map
- close: tools-health OK (run 5, 5,917 lines); the gate-2 live re-check all 200/false/true/active; no build input changed (R22 not owed)
- rules: R84–R95 ratified at gate 1; candidates (a)–(d) proposed for Phase 35 gate 1
- v1.32.1 -> v2.0.0

Rules Added This Phase

Ratified at gate 1 (2026-09-08): R84–R95 (the PhaseEnd_Phase33.5 candidates (i)–(xii)); full text in phase-ends/DIGEST.md §3.

Candidates recorded in the log, for Drew to accept, modify or reject at Phase 35 gate 1 (P10):

Rule Reason
(a) A scratch prune is an instrument change: every tool that writes under a pruned tree is re-run before the prune is called done. cdecl --audit wrote its probe under the pruned .run/audit/; the refusal read as four parser defects (run 1 of the close chain).
(b) "Green" is read from a check's EXIT CODE, never from its last line; every chain sets pipefail. Commit 81ec81945 claims "kit_coverage green" while three rows were refused — tail masked the status.
(c) A step that hands a file to a third party is proven through that party's own toolchain, on the file itself, before the owner's browser session — and the proving tool writes the paste. The decomp.me listing failed to assemble on the first try; the replica had proven the compile, not the paste (DK-81).
(d) What a public tree carries is decided before the flip, and a retired document gets its Archive-index row and is deleted in the same commit — history keeps it. Two folders left the tree within hours of going public; the paths-never-links rule made it harmless, the timing cost two commits on a public history.

(Techniques stay in the tools and their SETUP rows; strategy in docs/decision-log.md (R31) and docs/accelerators.md; the portable form in the kit's DK-81.)

PhaseEnd Changelog

v1.32.1 → v2.0.0 — Phase 34 complete; Gen2 EXIT. The purge probe passed before and after the flip, and on 2026-09-08 the owner made the repository public with a ruleset that forbids rewriting the published history. In one session the outward half of Phase 33 was done: the decomp.dev progress card, the wiki published from the tree (32 pages), the decomp.me preset request backed by a scratch that matches at 100% (after the pasted target's form was fixed and proven through decomp.me's own assembler), the note to the Archipelago project, the tool announcement, the Decompedia rows, and the aftercare — 9 GB of dead scratch pruned, the record updated, the outreach drafts and the reviewed document archive taken out of the public tree on the owner's decision, the generated timeline placed in the README. Three instrument defects surfaced and were fixed in the tools and the coverage map; the close health chain is green on all rungs. R84–R95 ratified; four candidates proposed. Gen3 opens at Phase 35 with the readability charter, the kit split, the xsig v2 direction and three outward items pending on third parties.

Plain-English Recap

Today the project went public. First the probe confirmed, twice, that GitHub had really purged the old copies of the game files from its servers; then Drew flipped the switch, and a rule was set so nobody can rewrite the published history by accident. The rest of the day was the public face: the progress card on decomp.dev, the wiki, a request to decomp.me for a compiler preset backed by a function that matches perfectly on their site, a note to the fan project that had shared memory addresses with us, an announcement of the small tool we released, and rows on the community's wiki. One step failed the first time: the file we told Drew to paste into decomp.me was our own comparison listing, which nothing had ever tried to assemble, so we fixed the tool to produce a real assemblable file and to prove it through decomp.me's own assembler before anyone pastes it again. Cleaning up afterwards, we removed nine gigabytes of old scratch, and that broke one of our own checks, which had been quietly writing into the deleted folder; it and two smaller findings were fixed and the full health check passed. Drew also decided what the public tree should not carry: the drafts of notes already sent and the archive of retired documents, both still in the history. The repository is public, every number on it is generated from the source, and the second generation of the project is finished at version 2.0.0. The third generation, making the matched code readable, starts in the next session.

🛑 Stop Here

PhaseEnd written; CURRENT_PHASE.md archived → phase-ends/logs/Phase34.md (R19, via git mv); phase-ends/DIGEST.md §0/§2/§3 appended (step 3b); the kit's record corpus regenerated (make kit-corpus) so tools-health stays equal — all left uncommitted for Drew's milestone-close commit (R6 gate-2 sign-off). The Phase-34 work is committed across the session (c9dffdcfd..577da268e; four commits not yet pushed). The headless Ghidra MCP was stopped via the sentinel (R23); nothing under ghidra/ is tracked. Drew, in order, from the repository root:

git add phase-ends/PhaseEnd_Phase34.md phase-ends/logs/Phase34.md phase-ends/DIGEST.md decomp-architect/corpus/record .run/P34/outward/wiki_push_close.log
git commit -m "chore(phase-34): CLOSE — Gen2 EXIT: the repository public, protect-main, decomp.dev + the wiki live, the decomp.me preset requested at 100%, the outreach sent, the aftercare done (v2.0.0)"
git tag -a v2.0.0 -m "v2.0.0 — Gen2 exit: 218 binaries rebuild byte-identical from C; the repository public"
git push origin main --tags
gh release create v2.0.0 --title "v2.0.0" --notes "<your words>"
gh auth logout

Facts for the Release notes, in your words (R83): 218 binaries byte-identical from C (main + resident + 138 location overlays + 78 modules); 363,214 functions, 13,492,113 instructions, main game-code 45,150 / 45,150; 1,256 Sony PsyQ library objects linked and five hand-written assembly routines kept verbatim, both stated; builds from your own disc (make disc-extract, make bootstrap); AGPL-3.0 for tools and docs, no license asserted over the game sources; the wiki, the how-to, the progress card at decomp.dev; the standards page on names and on how the AI was used. Gen2 is closed — do NOT start Phase 35 here. Start a fresh session (effort Max, plan mode) for Phase 35 — Gen3 opens, planning from docs/gen3-handoff.md and docs/gen3-standards.md. Keep this file forever.