docs(phase-34): task 7 part 2 — C11: ~9 GB of untracked campaign scratch pruned (46G→37G), public_rewrite kept to the probe inputs; DIGEST §0/§1/§4, decision-log P34 S93, accelerators, SETUP posture, direction page; README shows the generated timeline

This commit is contained in:
Drew T
2026-09-08 13:39:26 -06:00
parent 1ff6b5395b
commit a1d47bb002
10 changed files with 170 additions and 25 deletions
+30
View File
@@ -0,0 +1,30 @@
== .run top-level sizes (largest 30)
/bin/bash: line 1: /usr/bin/du: Argument list too long
== untracked top-level dirs under .run (no tracked file inside)
118M .run/wave_ei/
118M .run/wave_ek/
119M .run/wave_fa/
119M .run/wave_fd/
121M .run/wave_en/
121M .run/wave_ep/
121M .run/wave_es/
122M .run/wave_eh/
123M .run/wave_eo/
123M .run/wave_ex/
123M .run/wave_ez/
124M .run/wave_et/
129M .run/wave_eu/
129M .run/wave_ev/
131M .run/wave_eq/
139M .run/ghidra_export/
196M .run/c954/
220M .run/audit/
220M .run/crack3/
222M .run/resolver/
321M .run/rtu_shadow/
357M .run/wave4/
592M .run/permuter/
1.1G .run/public_rewrite/
4.1G .run/match/
== disk
/dev/sdd 73G 46G 24G 67% /
+33
View File
@@ -0,0 +1,33 @@
== before (2026-09-08)
/dev/sdd 73G 46G 24G 67% /
118M .run/wave_ei
118M .run/wave_ek
119M .run/wave_fa
119M .run/wave_fd
121M .run/wave_en
121M .run/wave_ep
121M .run/wave_es
122M .run/wave_eh
123M .run/wave_eo
123M .run/wave_ex
123M .run/wave_ez
124M .run/wave_et
129M .run/wave_eu
129M .run/wave_ev
131M .run/wave_eq
196M .run/c954
220M .run/audit
220M .run/crack3
222M .run/resolver
321M .run/rtu_shadow
357M .run/wave4
592M .run/permuter
4.1G .run/match
1.1G .run/public_rewrite
6.7M .run/objdiff
== after
old-to-new.tsv
old_tag_tip.txt
352K .run/public_rewrite
keep-set present: 5/5, sig files 223, tracked .run files 952, tracked-but-missing 0
/dev/sdd 73G 37G 33G 54% /
+5
View File
@@ -28,6 +28,11 @@ originals; nothing "functionally equivalent" counts. What the repository claims
_Generated by `tools/progress.py --readme` from `docs/progress.json` — numbers are never typed by hand._
<!-- progress:end -->
![Matched percentage over time — the project timeline](docs/story-timeline.svg)
The timeline is generated from the committed progress digests by `tools/timeline.py` (never drawn by hand); the dated rows behind
it are in [`docs/story-timeline.md`](docs/story-timeline.md) and the narrative in [`docs/story.md`](docs/story.md).
Two things in those binaries are deliberately **not** our C, and are stated as such:
- **1,256 functions of the main executable are Sony's PsyQ library code** (libcd, libgs, libgte, libgpu, libspu/libsnd,
+6 -2
View File
@@ -945,10 +945,14 @@ Every script under `tools/` (plus the two report make-targets), grouped by purpo
---
## Backup & repository posture (rules R20/R21) — PUBLIC since Phase 33
## Backup & repository posture (rules R20/R21) — PUBLIC since 2026-09-08 (Phase 34)
The repository is **public** (`https://github.com/Druthulu/BFM-decomp`, AGPL-3.0 for `tools/`+`docs/`, `src/NOTICE.md`
for the game sources, `THIRD_PARTY.md`). **H1 is in force:** no ROM-derived or proprietary bytes are in git or in its
for the game sources, `THIRD_PARTY.md`) — **flipped 2026-09-08** (Phase 34 task 1) after `tools/public_rewrite/probe_github.sh`
passed immediately before (33/33 sampled old hashes gone) and again after (`--after-flip`, incl. the unauthenticated commit pages);
the **`protect-main` ruleset** (id 22564862: no deletion, no force-push of `main`, no bypass actors — edit the ruleset first if a
rewrite is ever needed) guards the published history; the wiki (`docs/wiki/` + the how-to, 32 pages) is live and synced by
`tools/wiki_sync.sh`; the progress card is `https://decomp.dev/Druthulu/BFM-decomp`. **H1 is in force:** no ROM-derived or proprietary bytes are in git or in its
history — the retail EXE, the RAM dumps, the Ghidra project, the Sony SDK, the session archive, the extension zips and
`brave.exe` were purged from every commit before the flip (`docs/public-flip-runbook.md`), and `tools/audit_public.py` +
CI (`.github/workflows/no-rom.yml`) keep it that way. The disc dump (`disks/`), `extracted/`, `build/`, `asm/`, `expected/`
+14
View File
@@ -892,3 +892,17 @@ lessons that were fixed but never generalised; on this project one in five candi
~4.3M tokens, ~13 min wall each in two batches; the coordinator's cost was the brief, the harvest script, the clustering and the
provenance generation.
## P34 S93 (2026-09-08) — the flip day: a third-party step proven through the third party's toolchain, and the public-tree decisions
The one failure of the flip day was a browser step nobody could have exercised while the repository was private: `docs/decompme-preset.md`
told the owner to paste the regenerated target listing into decomp.me, and decomp.me's assembler refused it (`invalid operands 'li a2,2'`).
The listing is the project's word oracle — nothing on our side assembles it; its bare register names resolve only through `macro.inc` and
its branch targets are absolute addresses — and the replica that had "proven the preset" compared words from the listing's comments,
never the listing itself. **Accelerator: 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 tool that proves it writes the paste** (`verbatim_target_s.py --gas`;
`decompme_replica.sh` steps D and E; the retry matched 100% first time). Two smaller ones from the same day. **A calendar gate is read
the morning after the ticket, not "daily for a week":** the Support purge took one day; the probe passed during the previous sub-phase and
the flip could have opened a day earlier. **Decide what a public tree carries before the flip:** the sent outreach drafts and the
document archive were always going to leave (the owner removed both within hours of going public), and deciding at the consolidation
sub-phase would have spared two untrack commits on a public history; the Archive-index rule that made the removal harmless — name
archived files as paths, never links — held.
+38
View File
@@ -3645,3 +3645,41 @@ register lever (accelerators (16)), and treat "PROVED" as "proved against this l
above any mid-campaign harvest's. Both are now the kit's own rules: the coverage check is in the kit's health target, and the record's
front page tells the next project that its logs deserve one final read.
## P34 S93 (2026-09-08) — the flip: a calendar gate that opened early, and what a public tree carries
- **Context and belief.** Phase 33 closed re-chartered because the flip waited on GitHub Support purging the old objects (the Activity
view served every pre-force-push tip). The seed planned a daily probe "until PASS, ~a week", with a delete-and-recreate fallback. The
probe passed on 2026-09-07, during Phase 33.5 — the purge took a day, not a week — so Phase 34 opened with its gate already open and the
fallback never needed. Gate 1 (plan mode, Max) ratified the twelve Phase-33.5 candidates as R84–R95 and added three things the seed did
not have: repository metadata and a `protect-main` ruleset (no force-push, no deletion, no bypass actors) set by Claude on the owner's
word, a GitHub Release for v2.0.0, and the finding that a Phase-1 relic clone of the OLD history still existed on the Windows
filesystem — deleted by Drew during planning, so C11's clone-reset step became "not applicable, with evidence".
- **What failed, once.** The decomp.me browser step failed on its first try: the doc told Drew to paste the regenerated target listing,
which is the project's WORD ORACLE (nothing on our side assembles it — bare register names that resolve only through `macro.inc`,
branch targets as absolute addresses). decomp.me's assembler refused it (`invalid operands 'li a2,2'`). The step had been written for a
private repo and never exercised (R14). The fix went into the tools, not the doc alone: `verbatim_target_s.py --gas` (the assemblable
form), the replica's step D (the paste itself through decomp.me's own `as` wrapper, 26/26 words) and step E (the bundle written from
the proven run); the retry matched 100% first time. Lesson, the same as P33's: a step that talks to a third party is proven through
that party's own toolchain before the owner sits down in the browser.
- **The outward day.** Public at 11:2x MDT; the after-flip probe 33/33 gone; both workflows green on the public repo; decomp.dev
registered (100.00% / 100.00%, hero image); the wiki pushed (32 pages; Claude ran the push on Drew's explicit one-off R6 waiver, the
P33 xsig precedent); the preset request (decompme/decomp.me#2106); the Archipelago note (AegeusEvander/…#1); xsig topics + homepage;
the tools post and Drew's own `#ai` reply in the decomp.me Discord; two Decompedia rows. frogress skipped on measurement: alive, 38
projects, admin-created, and at 100% with generated badges and decomp.dev live it would add a list row only — pending by name.
- **Two owner decisions about the public tree (the pivot in this entry).** After the notes were sent, Drew took `docs/outreach/` out of
the tree ("just gitignore"), and then the document archive `docs/sunset/` ("remove sunset from the pushed repo … keep the old tools in
the sunset folder for the index, but not the other stuff"). The 33.5 design had anticipated exactly this: nothing ever linked into the
archive, the Archive index names each file as a path, so the removal broke no link — but the folder was still cited as PRESENT in four
wiki pages, and a trial "untrack both" pass measured that the tool census `--check` needs the retired files (a fresh clone would have
gone red), which is why the tools half stayed. Convention going forward (on the conventions page): a retired document gets its
Archive-index row and is deleted in the same commit; history keeps it. No rewrite for either — the drafts and the archive are in the
published history and contain nothing ROM-derived.
- **Scratch.** The untracked `.run/` campaign scratch that the frontier's emptying made worthless — per-function draft trees, permuter
work dirs, wave shards, resolver and rtu shadow trees, the P29/P32 crack scratch — was pruned after sampling each tree (≈9 GB; disk
46 → 37 GB used); `.run/public_rewrite/` kept only the probe's two inputs (1.1 GB → 352 KB) so the probe stays runnable; every
tracked `.run` file (952) and the keep-set (`obj40`, the sigs, `decompme`, `wiki`, `verbatim_targets`, `ghidra_export`) untouched.
- **Hindsight — the better path.** (1) Exercise every third-party step through that party's own toolchain before the owner's browser
session, and let the tool write the paste (done now for decomp.me; the same rule would have caught it in P33). (2) Decide what a
public tree carries BEFORE the flip, not after: the outreach drafts and the archive were always going to leave; deciding at 33.5 would
have spared two untrack commits on a public history. (3) A "daily probe for a week" should start the day the ticket is filed and be
read the next morning — it passed in one day and the phase could have opened a day earlier.
+1 -1
View File
@@ -90,4 +90,4 @@
| 2026-09-06 | 36 | P32 (v1.31.0) | 218 | 100.0% | 100.0% | 100.0% | 100.0% | 0 | 789 / 2091 |
| 2026-09-07 | 61 | P33 (v1.32.0) | 218 | 100.0% | 100.0% | 100.0% | 100.0% | 0 | — |
73 dated rows · phase ticks from the 33 PhaseEnds · the chart: `docs/story-timeline.svg`.
73 dated rows · phase ticks from the 34 PhaseEnds · the chart: `docs/story-timeline.svg`.
+14 -14
View File
@@ -4,22 +4,22 @@ The matching is finished: 218 binaries rebuild byte for byte and the frontier is
The first is short and mostly administrative — the public flip and the close of the second generation. The second is the
third generation: making code that *matches* into code a maintainer would call *finished*.
## Phase 34 — the flip and the Gen2 exit
## Phase 34 — the flip and the Gen2 exit (2026-09-08)
The repository's history was rewritten before publication to remove every game-derived byte and force-pushed in
place. The flip itself waits on one thing outside the project's control: GitHub Support purging the old objects, which
the host's Activity view still serves for every pre-force-push tip ([The ROM firewall](The-ROM-firewall.md)). A probe
of the old hashes runs daily and the flip is gated on it printing PASS (or, if the purge stalls, on recreating the
repository under the same name). **It printed PASS on 2026-09-07** — every sampled old hash gone, the live control still
resolving — so the gate is open and Phase 34 can proceed; the probe is run once more immediately before the flip.
The repository's history was rewritten before publication to remove every game-derived byte and force-pushed in place;
the flip waited on GitHub Support purging the old objects, because the host's Activity view still served every
pre-force-push tip ([The ROM firewall](The-ROM-firewall.md)). The probe of the old hashes printed PASS on 2026-09-07 and
again immediately before the flip, and **the repository went public on 2026-09-08**, with a ruleset that forbids
force-pushing or deleting `main` from then on.
After that, in order: the visibility change and the checks that follow it (the probe after the flip, the Actions tab
green, the wiki enabled — GitHub offers wikis only on public repositories on the free plan); the outward actions the
maintainer does in his own words — the decomp.me preset request, a note to the neighbouring Archipelago project whose
RAM map cited this one, the progress boards (decomp.dev, frogress), the wiki push, the tool announcement and the
topics on the released tool repositories; the aftercare (other clones reset to the rewritten history, the rewrite
scratch deleted); and the Phase-34 close at **v2.0.0**, which is the Gen2 exit. The seed for that phase, with every
task, actor and effort level, is [`docs/phase34-seed.md`](../phase34-seed.md).
The same day, in order: the after-flip probe and the Actions runs on the public repository; the progress card on
decomp.dev, read from the workflow's report artifact; this wiki, published from `docs/wiki/` and the how-to; the
decomp.me preset request with a scratch that matches at 100%; the note to the neighbouring Archipelago project; the
tool announcement and the Decompedia rows; and the maintainer's own decisions on what a public tree carries (the sent
outreach drafts and the document archive left it — the Archive index is the record). The phase closes at **v2.0.0**,
the Gen2 exit, with a PhaseEnd that lists by name what is still pending on third parties (the preset's creation, a
reply from Archipelago, frogress). Its seed, with every task, actor and effort level, is
[`docs/phase34-seed.md`](../phase34-seed.md).
## Gen3 — readability, on a byte-exact floor
+20 -1
View File
@@ -221,7 +221,26 @@ output) · `.run/P34/c11/` (the prune listing with sizes, `git worktree list`, t
`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).
## 🛑 SESSION CHECKPOINT — PHASE 34 OPEN (S93, 2026-09-08): tasks 0a, 0–6 ✓; task 7 part 1 ✓ (outreach + docs/sunset out of the tree); NEXT = task 7 part 2 (the .run prune, DIGEST/decision-log/SETUP/wiki updates, checks, the wiki re-sync), then 8 (G2 — Tier 1, Max)
### 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).
- **Open for the wiki:** five wiki pages changed in task 7 (Reference-index, Archive-index, conventions, layout, direction) → a re-sync
push needs Drew's word (R6; the task-5 waiver was one-off). `gh auth logout` stays Drew's last command after the close push.
## 🛑 SESSION CHECKPOINT — PHASE 34 OPEN (S93, 2026-09-08): tasks 0a, 0–7 ✓ (task 7's wiki re-sync awaits Drew's word); NEXT = task 8 (G2 — Tier 1, Max: tools-health detached, the P7 walk, gate 2, the PhaseEnd v2.0.0)
### 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
+9 -7
View File
@@ -19,8 +19,9 @@ database regenerable from `config/ghidra/`). The whole history was rewritten wit
no license asserted over `src/`, NOTICE, THIRD_PARTY, badges, ROM-free CI), the releases (gcc-2.7.2 map, xsig, the permuter driver —
offered upstream and declined, the drafter write-up, the decomp.me preset proven through decomp.me's own toolchain), the outreach notes,
story, retrospective, wiki (13 pages) + how-to (13 chapters), and the **Gen3 charter** (`docs/gen3-handoff.md`, `docs/gen3-standards.md`)
are written. **The repository is still PRIVATE:** GitHub Support must purge the old objects first (ticket #4736982; the Activity view
publishes every pre-force-push tip, so a clean tree is not enough). **Phase 33.5 CLOSED 2026-09-08 (v1.32.1; `PhaseEnd_Phase33.5.md`):** the docs sub-phase before the flip — the wiki is the single
are written. **The repository went PUBLIC on 2026-09-08 (Phase 34 task 1, Drew)** after the purge probe passed twice — 2026-09-07 and
again immediately before the flip (33 of 33 sampled old hashes gone; Support ticket #4736982 had done its work) — with the `protect-main`
ruleset (no force-push, no deletion) guarding the published history. **Phase 33.5 CLOSED 2026-09-08 (v1.32.1; `PhaseEnd_Phase33.5.md`):** the docs sub-phase before the flip — the wiki is the single
source of truth (six new pages incl. the Reference index and the Archive index; 59 documents and 34 tools retired into indexed sunset
folders; `doc_links` with six checks), the tracked `.run/` is flip-ready (1,086 → 868 + the phase's own evidence; the two ROM listings
untracked under an audit-only rule + a content check), the memory store reconciled (80 == 80; an 18-file seed), and **the day-one decomp
@@ -30,8 +31,9 @@ kit-corpus`, asserted equal in tools-health), `tools/kit_coverage.py` (every rul
its first run found 26 + 21 uncited, three genuine gaps), and the worklog mining pass (777 candidates / 634 banked / 143 new → DK-69–80).
R74–R83 ratified at its gate 1; candidates (i)–(xii) proposed for Phase 34 gate 1. **Phase 34's gate is OPEN: the purge probe PASSED
2026-09-07.** **Phase 34 = the flip + the outward actions + C11 + the v2.0.0 PhaseEnd = Gen2 EXIT** (`docs/phase34-seed.md`).
**Phase 34 OPENED 2026-09-08 (S93; gate 1 in plan mode at Max; R84–R95 ratified; the plan and the live state are in
`phase-ends/CURRENT_PHASE.md`).** **Gen3 opens at Phase 35** — its seed now includes the S91-b types doctrine (R95, the canonical
**Phase 34 IN PROGRESS (opened 2026-09-08, S93; gate 1 in plan mode at Max; R84–R95 ratified; the plan and the live state are in
`phase-ends/CURRENT_PHASE.md`): the flip done, decomp.dev live, the wiki live (32 pages), the decomp.me preset requested, the
Archipelago note sent, the tools announced; `docs/outreach/` and `docs/sunset/` left the tree on the owner's decision.** **Gen3 opens at Phase 35** — its seed now includes the S91-b types doctrine (R95, the canonical
type layer).
## 1. Corrections and supersessions of PROJECT_CONTEXT.md recorded in PhaseEnds (P1: the constitution is never edited)
@@ -42,7 +44,7 @@ type layer).
backups → today: **one commit per completed task after CURRENT_PHASE.md is updated; a bank commits the moment it
exists (R42)**. Claude commits; **Drew pushes** (R6); the PhaseEnd + archived log are left uncommitted for Drew's
milestone-close commit; no `Co-Authored-By` (R5).
- **H1** was relaxed while private (R1, 2026-06-10 → 2026-09-06) and is **IN FORCE again since Phase 33 C3 (2026-09-06)**: the ROM-derived and proprietary paths left the index and were purged from the whole history before the public flip (`docs/public-flip-runbook.md`); R1 is historical. **R20's backup home** is now the text export `config/ghidra/` (+ `tools/ghidra_rebuild.sh --proof`), `dumps/CHECKSUMS.sha1`, `tools/psyq_CHECKSUMS.sha256`, and the private archive repo `Druthulu/BFM-decomp-archive` (the pre-rewrite history); **never `git clean -x`** (CLAUDE.md fail-safe).
- **H1** was relaxed while private (R1, 2026-06-10 → 2026-09-06) and is **IN FORCE again since Phase 33 C3 (2026-09-06)**: the ROM-derived and proprietary paths left the index and were purged from the whole history before the public flip (`docs/public-flip-runbook.md`); R1 is historical. **The flip itself happened on 2026-09-08 (Phase 34 task 1).** **R20's backup home** is now the text export `config/ghidra/` (+ `tools/ghidra_rebuild.sh --proof`), `dumps/CHECKSUMS.sha1`, `tools/psyq_CHECKSUMS.sha256`, and the private archive repo `Druthulu/BFM-decomp-archive` (the pre-rewrite history); **never `git clean -x`** (CLAUDE.md fail-safe).
- **Environment:** all-in-WSL (R2); Ghidra runs **headless** (MCP server via `tools/ghidra_mcp_start.sh` / the
SessionStart hook; symbols persist only via `tools/ghidra_apply_symbols.sh`, MCP renames do not); PCSX-Redux is
Windows-native bridged over the web API (R11); no `/tmp`, scratch under `.run/` (R12).
@@ -355,8 +357,8 @@ the binding text. R44–R63 one-liners are the P31 table, ratified at P32 gate 1
## 4. Where things live (the doc map a session needs)
**The wiki is the source of truth for documentation (Phase 33.5):** `docs/wiki/Reference-index.md` lists every live reference and
generated file with how to read it — start there; `docs/wiki/Docs-and-scratch-conventions.md` says where each kind of knowledge goes;
`docs/wiki/The-ROM-firewall.md` is the no-ROM policy; `docs/wiki/Archive-index.md` records every document retired to `docs/sunset/`
(kept for the owner's review; nothing links into it). The files a session touches most: `docs/SETUP.md` (environment, every tool's
`docs/wiki/The-ROM-firewall.md` is the no-ROM policy; `docs/wiki/Archive-index.md` records every document retired at Phase 33.5
(the archive folder itself left the tree at Phase 34, 2026-09-08 — the rows are the record; nothing ever linked into it). The files a session touches most: `docs/SETUP.md` (environment, every tool's
row, commands) · `docs/matching-cookbook.md` §1–§500 (idioms; 3.5 MB — grep by §, never read whole) + `docs/cookbook-index.md`
(symptom-keyed, derived, 566 KB — grep) · `docs/gcc-2.7.2-map/` (the compiler map) · `docs/wave-playbook.md` (THE wave procedure;
the OpenRouter-era `automation-runbook.md` is archived) · `docs/effort-map.md` · `docs/phase34-seed.md` (the next phase's seed;