Files
BFM-decomp/docs/roadmap-to-100.md
T
Drew T 14b115d8ba docs(phase-30 S45 II.3): metrics re-baseline + roadmap contract delta + decision-log (R31)
- roadmap §1.1: 183 onboarded binaries; the 100% claim's exclusion list = the 34-row
  parked-for-L3 ledger (28 script + SC02/9 + MAIN/7/9 + SC03/53/54/56 — 3 rows S44 never
  tiered); supersedes the '39 type-1 backlog' framing (43 of them now build byte-identical)
- disc-completeness.md S45 section: what landed, the full parked list, the L3 resolution path
- decision-log: the S45 entry — five instrument findings a 'mechanical' batch surfaced, each
  negative-control-proven; honest baseline 94.0% instr / 95.96% fn / 87.6% distinct over 183
2026-08-06 13:36:34 -06:00

318 lines
26 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# The Road to 100% — the BFM-decomp endgame roadmap (v2, Phase 30+)
> **v2 re-baseline adopted:** 2026-07-30 (Drew, plan-mode gate at Phase-29 close; authored on
> Fable 5 at Max effort) · **Baseline:** the 2026-07-30 committed digests at HEAD `commit:1211`
> (post-T98/T99) · **Supersedes:** roadmap v1 (2026-07-15, this same file — full v1 text in git
> history at `commit:1210` and earlier; §7 records what changed and why) · **Status:** ACTIVE —
> re-baselined by every PhaseEnd.
>
> v1 chartered P27 (honest frontier) → P28 (endgame engine) → P29 (family campaign) → P30
> (mass+main) → P31 (behemoths) → P32 (flip). P27–P29 ran and **resolved every swing number v1
> held open** (§7). v2 re-charters the remainder as **P30–P33** on measured 2026-07-30 reality.
---
## 0. Authority, maintenance & how future sessions use this
- **This document is docs-layer and ADVISORY.** `PROJECT_CONTEXT.md` remains the constitution;
`phase-ends/` remains the state. Every phase still opens with its own two-gate plan approval
(P3) — this roadmap tells the Phase-Start session *what the phase is for and what feeds it*,
not that the gate is pre-approved.
- **Every PhaseEnd re-baselines this roadmap.** Each PhaseEnd carries a standing **"Roadmap
delta"** line: what this phase changed about the road ahead (numbers re-measured, buckets
emptied/split, phases re-scoped/reordered, findings that retire a lever). The megaplan and
roadmap-v1 precedents are the warning — **both plans' numbers rotted within one phase** when
the tools under them were fixed. Numbers in §2 are true as of 2026-07-30 and every phase
re-derives what it consumes.
- **On conflict:** the constitution and the latest PhaseEnd's "Next:" win over this file.
- **How a fresh session uses this:** complete the normal Session Start Protocol (CLAUDE.md load
order) first; then, when planning the next phase, open this file at the matching §3 phase
entry and plan from it + the latest PhaseEnd's Roadmap delta.
- **Number hygiene (R14 at planning scale):** every count below cites its committed source and
its date. A scan is a hypothesis; the whole-binary byte-gate is the truth. Validate any
"recoverable/templatable/matchable" count with a small gate probe before scoping work around
it — and verify the *instrument* first (R35).
---
## 1. The completion contract (Drew's decisions, 2026-07-15 — unchanged; numbers corrected)
**Target: GAME-CODE TRUE 100%**, mechanically defined:
1. After SDK objects are LINKED, **zero `INCLUDE_ASM` and zero linked `NON_MATCHING` under
`src/`** across **all onboarded code-bearing binaries**. *Corrected count (P30 S44/S45):*
**183 onboarded today** — main + resident + 141 overlays (138 type-4 + the 3 uncompressed
type-1 overlays ov_MAIN_012/ov_SC02_037/ov_SC03_107) + **40 md_* modules** at their §S44
static slots (`docs/memory-map.md`; every one byte-identical on its FIRST build at the
derived address). **The explicit exclusion list the 100% claim cites is the parked-for-L3
ledger: 34 payloads** (`make audit-disc` → `docs/disc-ledger.md` UNCLAIMED; detailed in
`docs/disc-completeness.md`) — the 28 SC0x script modules (7 × 4 per-disc builds), SC02/9,
MAIN/7, MAIN/9, **and SC03/53, SC03/54, SC03/56** (S45: three SC-disc type-1 rows the S44
exploration never tiered — same per-disc runtime routing class as SC02/9). Their bases are
loader-determined per-disc, not EXE-static; guessing one would be P9 theater. 100% is only
claimable once these 34 are onboarded-and-matched (post-L3 emulator tour, P31 bucket T) or
remain explicitly excluded with this evidence — the byte-gate cannot see them (R34).
*(The prior "39 type-1 backlog" framing is superseded: 43 of those payloads now build
byte-identical as md_*/ov_* binaries; the residue is exactly the 34-row parked ledger.)*
2. Every binary **byte-identical from a genuinely clean tree** (R22: `make clean` +
extract-all + `check-all`), and byte-identical **with AND without** the SDK objects
(the fresh-clone stub fallback invariant).
3. **Both audit oracles green — extended to main + resident.** *Status:* overlays + resident
covered (`make audit-corpus`, "corpus(+resident)"); **main still lacks an independent
second oracle** — its LINKED-excluding sig is dated 2026-06-14 and the fleet digest itself
carries the R34 caveat. P31 closes this before any 100% claim on main.
4. **No completion declaration while any game-code stub remains.** Wall verdicts are
model-relative (the §45/§52 history — and P27–P29 proved *most "walls" were our own
tooling*); walls are re-attacked at every phase boundary with the matured idiom bank and
each new model generation until they fall.
**Scope decisions (standing):**
- **PsyQ LINKED = complete.** Main's SDK-named residue (gsgap 5 objects + libapi 800c3 ≈22
objects) converts to LINKED in P31; the completion dashboard asserts the residue empties.
*Side note (Drew): decompiling the PsyQ libraries from source (sotn precedent) is a
legitimate far-future stretch — record it, do not plan it, revisit only after game-code 100%.*
- **Public flip at 100%.** Drew's call, made knowing the 2026-07-01 strategy review
recommended a near-term flip. **Standing checkpoint:** every phase close reports measured
velocity + all three metrics; if the trajectory stretches beyond what solo+agents can
credibly finish, flip timing is re-surfaced with the numbers — the decision stays
falsifiable. *P29's data point:* +18.6pp instr in 25 sessions, decaying to +0.3pp/day at
its engine's floor — the checkpoint now has real curvature to watch.
- **Metrics contract — IMPLEMENTED 2026-07-22:** every phase close reports all three —
fn-count (×138-inflated) · instr-weighted (decomp.dev-display) · distinct-code (the honest
RE truth) — **with the main EXE in the weighted denominators** (live in
`docs/progress.fleet.md` since 07-22; pre/post-07-22 instr deltas are not perfectly
comparable across that change).
---
## 2. The measured baseline (2026-07-30 — committed digests only)
**Standing** (`docs/progress.fleet.md`, regenerated post-T98): **87.5% instr-weighted**
(11,493,049 / 13,141,652) · **78.0% distinct-code** (4,396,900 / 5,634,875; 69,816 / 87,459
unique fns) · **92.00% fn-count** (325,417 / 353,720) · **140/140 byte-identical** · dedup
1886/0 · 0 NON_MATCHING linked · tools-health RC=0.
**Remaining:** 28,296 stub instances · **17,643 distinct fns** · ~1.24M distinct ins ·
~1.65M weighted ins. Average remaining multiplicity ≈1.6 — **the high-reach families are
consumed**; what remains is mostly per-overlay-distinct code, main, and named walls.
**P29 velocity (the flip-checkpoint input):** +18.6pp instr / +28.5pp distinct (+16,288
unique fns) / +8.06pp fn-count over 25 sessions; mean ~+0.74pp instr/session; final-four-day
decay **+2.7 → +2.2 → +0.6 → +0.3** — the family-remap engine's measured floor (daily table:
`phase-ends/logs/Phase29.md` T99; derive fresh via `git log docs/progress.fleet.md`).
| # | bucket | scale (source, date) | honest tractability |
|---|---|---|---|
| **W1** | **Stranded byte-correct drafts** (integration-blocked) | backlog ledger 1,350 open near-misses, dozens close=0 "MATCH pending gate" (`docs/backlog.md` 07-29; rows include since-banked fns — purge at P30 T0); measured recovery **14/36 = 39%** (`docs/calibration.md` 07-24); 10 named still-blocked drafts | the cheapest distinct wins in the repo: the tiered recovery driver + §65b de-macroize + `gate_stage` call-site-cast. **Fix `gate_stage` snapshot/restore first** — the ladder currently destroys good drafts |
| **W2** | **The `-O0` cluster** | **10 families / ~1,287 raw distinct** ≈ 7% of all remaining distinct (SESSION-24/25 checkpoints) | WALLED by the **Arm-A splat re-carve defect** (`%lo +0x20` data-symbol shift on 3 of 4 sampled overlays; cookbook §116 area) — an *instrument* wall. B2, SC07, and the "~3% h_seq ceiling" all resolved to tooling; this has the same shape. Fix splat-side OR productionize the no-recarve staging driver (sketched, logs/Phase29 ~§9036) |
| **W3** | **The fresh-crack frontier** (the mass) | family map 07-29 (`docs/family-hseq.md`): **511 substantial families / ~707k templatable ins**, **61 zero-crack** (matched sibling exists); member classes 3,899 PURE / 40 IMM / 6 STRUCT; + non-substantial families + 3,771 singletons. **Concentration (SESSION-13, 07-23 — directional; re-derive at T0): top-20 ≈ 23% of remaining instr, top-100 ≈ 53%** | wave → `gate_stage` (call-site casts, NEVER bulk header edits) → propagate-same-session is proven at scale (2,713 members banked in one session once blockers cleared). **Fresh exemplar cracks are the only lever that moves distinct-code** (SESSION-14). jr-half via the §53 carve path. **No 150-ins wave cap** (SESSION-13) |
| **W4** | **T98 residue** (behind matched exemplars) | 80 families / 960 members / **173 distinct**: 29 all-STRUCT (86 members, refused at remap by design) + 51 no-STRUCT (874 members, stage-but-DIFF; last 3 sweeps returned 0) (logs/Phase29 T98) | STRUCT members = ordinary per-member drafts in the normal queues; the 51 = one bounded diagnosis wave (~3 distinct each, expect a NEW cause per family; the `rtu_match --stderr-out` recipe). Low mass — opportunistic, never the spine |
| **W5** | **GIANT walls + PINS** | `func_801412A8` (198×138, close=110, S11 LUID regalloc) + `func_80178004` (165×138, close=91, local-alloc) ≈ 50k gain ins; **PINS class 19 fns / ~61k gain** (`docs/worklist.md` 07-24 — STALE, re-derive at T0) | special projects: §H levers, `cc1_probe` kit (P32), frontier-model discovery sprints. PINS: the pin-crash SIGABRT dissolved in P27 — mechanically harvestable now |
| **M** | **Main EXE** | **1,034 stubs / ~60.2k game-code ins at 0.7%** (436/60,201) + 7 NON_MATCHING promotions + ~80 jtbl fns + SaveLoadRoutine (the last Gen1 deferral) + SDK residue gsgap 5 obj / libapi ≈22 obj (`docs/progress.md` 07-30) | standard machinery at ×1; the fuel gap is Ghidra-C prefetch (0/2,096 cached — SESSION-13); jtbl fns ride the matured carve workflow; **the second oracle is a contract item (§1.3)** |
| **R** | **Resident** | **14 stubs** (`docs/resident-dossier.md`): 5 PLUMBING (byte-correct C exists; loose-typing def-side) + 4 DIFF (genuine residuals) + 5 jtbl-deferred | def-side reconcile (`docs/canonical-decl-reconcile-design.md`) + resident jtbl carve + §H/permuter → **the first 100%-binary flag-plant** |
| **T** | **39 type-1 code modules** | un-onboarded, in NO phase (`docs/disc-completeness.md` 07-15); mostly small (83w–1,318w); 3 window-capped ≥4096w (true sizes unknown); 3 carry overlay-like code density (3.39%) → possible large dedup | **load-address RE** (PCSX-Redux RAM proof — the Phase-3 method, R10 ≥3 datapoints) → Ghidra import → splat onboard → **R36 citizenship** (`make audit-binaries`) → `dedup_extend` harvest (SC07 precedent: 95.6% free) → genuine residue into normal queues. Extends the denominator (honest direction: headline % drops) |
| **B** | **Behemoths** | v1's list was STALE — rebuilt (SESSION-13): **`0x80183814` (5,122 ins, ov_SC07_006 — the largest fn in the game; verify it's one fn, R14)** · `0x8017bf14` (4,763) · `0x8017d2dc` (1,586) · `0x8017dc1c` (1,518) · `0x8017c954` (1,194) · `0x8017c730` (1,061×2) — ~×1 singletons | late special projects (P32): `diff_regions` piecewise attribution + `cc1_probe` + frontier drafting. Never wave fuel |
| **D** | **Carried instrument defects** | `gate_stage` ladder destroys good drafts (no snapshot/restore) · `rtu_match` buries the real cc1 error behind `--stderr-out` · `--fix-def-sig` is a REPAIR not a default (§119) · 21-file absolute-include portability · `.run/autopsy/residuals.jsonl` stale (07-21) · `docs/backlog.md` is not a work queue (§83) · ~~family_hseq vs progress.py disagree~~ **RESOLVED P30 T0c: zero definitional gap** — both derive from `corpus.stubs`; the "29,961 vs 28,296" was a cross-date, cross-scope digest misread (the delta was exactly SESSION-25's 2,713 banks); digests now stamp scope+HEAD | fix at **P30 T0, before scoping waves on their numbers** (R35: tool-integrity precedes measurement) |
**The lever order (yield/cost, measured):** recover stranded drafts (W1) → fix the `-O0`
instrument (W2) → ride the concentration curve (W3) → scope-complete (T) → flag-plant main +
resident (M, R) → walls/behemoths re-priced each boundary (W5, B).
**Model/cost doctrine** (`docs/calibration.md` + `docs/effort-map.md`): local v3 $0 (≤15-ins
band) · Haiku-tier drafters ≤~50 ins (~4.8× cheaper, A/B-validated) · GLM lane for the
def-conflict-free band (~$0.03–0.08/fn) · cheap-Opus mid-band (~40–140k tok/fn) · Opus for
the 90+/regalloc tail · permuter $0 for drift · **frontier models (Fable-class) = discovery
only** (~230k tok/fn; ROI is idioms + wall-dissolutions, never banks) · Ultracode for breadth
waves (R26/R27 prompts at every transition) · Max for planning/synthesis/walls.
---
## 3. The phase sequence
Phases are two-gated as always (plan approval → autonomous execution → milestone
confirmation). Campaign phases close on measured yield floors, not calendar. Effort/model
annotations follow `docs/effort-map.md`.
### P30 — The Recovery & Concentration Campaign (overlays to their ceiling)
*(Ultracode breadth waves / Max synthesis & deep tasks; open-ended, ROI-gated. No MCP
dependency for the cached head — 146/159 reach-138 exemplars have Ghidra-C.)*
- **T0 — Frontier regen + instrument repair [Max].** Regenerate report / family map /
worklist from verified inputs; **reconcile the family_hseq↔progress instance-count gap**
(R32) before consuming either; purge since-banked fns from the backlog ledger; refresh the
autopsy; **fix `gate_stage` snapshot/restore** (it destroys good drafts) + `rtu_match`
cc1-error surfacing; per-session velocity **derived from `git log docs/progress.fleet.md`**
(R33 — the committed digest history IS the burn-down tracker; build no scanner).
- **T1 — The integration-recovery sweep [Ultracode].** Every close=0 stranded draft through
the tiered recovery driver (T0/T1 blast-radius containment; §65b de-macroize; the
call-site-cast ladder); the 10 named blocked drafts; close the lane on its measured floor.
- **T2 — The `-O0` Arm-A splat wall [Max, deep; R17 web-research].** Fix the `+0x20`
re-carve data-symbol shift at the splat/extract layer OR productionize the no-recarve
staging driver; byte-gate on the 3 failing sampled overlays; success feeds the 10-family /
~1,287-distinct cluster into normal wave flow.
- **T3+ — The standing crack-wave loop [Ultracode waves; Max between].** 61 zero-crack
families (propagation-only) → top-mass fresh families top-down, **no size cap**, jr-half
via the carve path → **propagate behind every crack same-session** → the PINS class → W4
residue diagnoses (bounded, opportunistic). Wave lanes by band: local v3 (≤15, $0) · GLM ·
Haiku-tier · cheap-Opus · permuter on drift. Carried-in from P29: grinder family-warm-start
+ the 2 Phase-22 grinder bugs (Task 4), the permuter backlog sweep (Task 6), the 21-file
include fix.
- Every session: velocity + all three metrics; R22 clean-fleet per banked batch; tools-health
green before matching.
**Milestone:** overlays at their measured ceiling — **≥95% instr fleet, or every remaining
overlay stub on a named wall/behemoth/queue ledger** — 140/140 byte-identical throughout.
### P31 — Scope-Complete + Main & Resident to 100%
*(MCP + PCSX-Redux sessions — G2/R29/R23 discipline; Ultracode for the main waves.)*
- **T1 — Type-1 onboarding.** Size the 3 window-capped modules first; load-address RE per
the Phase-3 method (RAM-dump byte-proof, R10 ≥3 datapoints) → Ghidra import → splat
configs → **R36 citizenship** → `dedup_extend` harvest (3 modules look overlay-shaped —
possible SC07-scale free banking) → genuine residue into the normal queues. Report the
denominator re-baseline honestly (headline % will drop; that is the correct direction).
- **T2 — The main-EXE campaign.** Ghidra-C prefetch for main (the fuel gap) → band-tiered
waves over the 1,034 stubs → the ~80 jtbl fns via the matured carve workflow → promote the
7 NON_MATCHING → **SaveLoadRoutine** → gsgap resegment + libapi 800c3 → LINKED → **build
main's independent second oracle** (contract §1.3) before any 100% claim on it.
- **T3 — Resident 14 → 0.** 5 PLUMBING via the canonical-decl-reconcile design; 5 jtbl via
the resident carve; 4 DIFF via §H/permuter/pins. **First 100% binary; then main.**
**Milestone:** main + resident at 100% game-code; **all disc code onboarded or explicitly
excluded with evidence**; the contract denominators final.
### P32 — Behemoths + the Wall Endgame
*(deep sessions; Max + the best-available frontier model at that time)*
- **The behemoths (B)** from the REBUILT ledger (incl. `0x80183814`): `diff_regions`
piecewise attribution + the **`cc1_probe` kit** (package the §45 gdb-on-cc1 / RTL-dump
method: per-pass dumps, a two-candidate RTL differ, regalloc breakpoints — built here so
wall work stays repeatable) + frontier drafting.
- **The wall track:** the GIANTS (close=110/91), the §52-class ledger, anything W2/W5 left
behind — re-priced every phase boundary against the matured idiom bank + new model
generations (the true-100% doctrine; and the P27–P29 lesson says: *check the instrument
first*).
**Milestone:** 0 stubs, or a Drew-reviewed wall ledger with an explicit re-attack cadence
(this phase iterates until the walls fall; no false completion — P9).
### P33 — 100% Verification + the Public Flip + Gen2 Exit
*(Max; the capstone — substance unchanged from v1's P32)*
1. **Contract verification:** 0 game-code stubs across all onboarded binaries; R22
clean-fleet; the dual with/without-SDK invariant; both audit oracles green including
main + resident; the dashboard's three metrics at 100/100/100 game-code.
2. **The public flip** (the Gen2 Phase-14 checklist, `docs/gen2-roadmap.md`): the
allowlisted two-repo mirror (R20 — copy-in, never delete-from-a-copy, no in-place
scrub); the rom→decoder regeneration tool promoted into public `make extract`
(H1 re-tightened); AGPL-3.0 (brave-CUE keeps GPL); no-ROM CI; frogress/decomp.dev;
the README/docs refresh (the README self-declares Phase-19-stale); the first-push gate
(ROM-SHA1/oversized-blob scan over tree AND history, **explicitly asserting `dumps/` +
`extracted/` exclusion**, owner review before push); the one-way master→public sync
script; **Ghidra `ExportSymbols` types/comments text-export** (makes the DB regenerable
+ public-clean — the Phase-9/10 carried note, due here at the latest).
3. **Parking-Lot sweep at the generation boundary** (PROJECT_CONTEXT): the
Archipelago/randomizer contact (their unpublished US RAM research), the decomp.me
preset submission.
4. **Releases:** the gcc-2.7.2 codegen map (§31 + `docs/gcc-2.7.2-map/`), `xsig` as a
standalone MIT tool, the permuter-ILS/masked-scorer upstream PR, the v3
matching-drafter pipeline write-up (`docs/community-matching-model-plan.md`).
5. **Drew's endgame deliverables** (the standing memory): the progress timeline/story,
the hindsight retrospective, the public "how to AI-decomp" wiki — `docs/decision-log.md`
(R31) is the substrate.
6. **Version 2.0.0 · Gen2 EXIT.**
**The Gen3 horizon (parked, post-exit):** shiftability, asset repack, native recomp / PC
port, randomizer tooling — and the libs-from-source stretch (§1 side note).
**Honest scale:** at P29's measured ~+0.7–1.1pp/session and a remaining mix with LESS
multiplication (avg multiplicity ≈1.6) and MORE ×1 work (main, singletons), the estimate is
**P30 ≈ 10–18 sessions · P31 ≈ 4–8 · P32 unknown-by-nature · P33 ≈ 2–4**. The §1
flip-timing checkpoint runs at every phase close.
---
## 4. Foreseen tooling (named now so phases don't rediscover it)
| tool | what it does | status / phase owner |
|---|---|---|
| `gate_stage` snapshot/restore | stop the reconcile ladder destroying good drafts | **P30 T0** (defect, load-bearing) |
| `rtu_match` error surfacing | put the real cc1 error in the verdict output, not behind `--stderr-out` | P30 T0 |
| frontier reconciler | family_hseq↔progress instance-count agreement (R32) | P30 T0 |
| recovery driver (extend `recover_integration.py`) | tiered T0/T1 blast-radius integration recovery at scale | P30 T1 (measured 14/36 in P29) |
| `-O0` Arm-A splat fix / no-recarve driver | unlock the 10-family `-O0` cluster | **P30 T2** (the biggest single distinct-unlock candidate) |
| grinder family-warm-start + 2 bug fixes | drift members as token-free CPU work | P30 (carried from P29 Task 4) |
| burn-down tracker | ~~build~~ **DERIVED** from `git log docs/progress.fleet.md` (R33) | done (P29 T99 recipe) |
| `diff_regions.py` | basic-block mismatch attribution → C lines | **BUILT** (P29 T1); used through P32 |
| `member_adapt.py` | exemplar→member delta engine | **VACATED** — h_exact case → `dedup_extend`; h_seq case dissolved (the `-O0` artifact, P29 T1); only the 86-member W4-STRUCT slice could ever want it — not planned |
| family-adapt fine-tune (7B) | tune the local model on the adaptation task | **VACATED with member_adapt** — same dissolved premise; W4's 86 STRUCT members cannot justify a fine-tune |
| parallel gate farm (same-binary shards) | 5–10× gate throughput | conditional on P30/P31 wave volume (the distinct-binary farm exists in `bulk_harvest`) |
| fleet Ghidra-C prefetch (tail + main) | drafting fuel where cache coverage is 0 | **P31** (R23/R29 discipline; the reach-138 head is already cached 146/159) |
| main second oracle | independent boundary oracle for the EXE (contract §1.3) | P31 T2 |
| canonical-decl-reconcile | the resident PLUMBING def-side fix | P31 T3 (design doc exists) |
| `cc1_probe` kit | packaged gdb-on-cc1 / RTL-dump / RTL-differ for wall re-attacks | P32 |
Build-along-the-way remains the doctrine (R16) — this table is the *foreseen* set, not a cap.
---
## 5. Standing invariants (every phase)
- The **whole-binary byte-gate is the sole arbiter** (G3/P9); `match_one`/closeness/h_seq/
masked-MATCH are **candidates, never banks** (§52b — ~half of close=0 drafts fail the gate).
- **R22 clean-fleet verification** per banked batch (`make clean` + extract-all + `check-all`).
- **Tool-health gates green before matching:** corpus · cdecl · **audit-binaries (R36)** ·
report (lint + dedup-check), fail-closed — and **fix the instrument before trusting its
measurement** (R35): a 0% from a broken tool is not evidence.
- **Blast-radius typing on every integration write** (P29 T16): T0 draft-only / T1
binary-local → the per-binary gate is sufficient; T2 fleet-shared (`src/shared/**`) →
**R22 mandatory**; the driver measures the write set and asserts containment.
- **Probe before costing** (P29's error ledger; R37 candidate at the P29 PhaseEnd): probe one
member/instance before pricing or scoping a job; derive attribution from `corpus.stubs`
before/after; diff the artifact to prove an edit ran.
- **Predictions are gate-validated on samples before scaling** (R14).
- **One commit per task** after the `CURRENT_PHASE.md` update; Drew pushes (R6/R20).
- **The flywheel:** idioms → cookbook + tooling in the producing session (R16/R30); strategic
pivots → `docs/decision-log.md` (R31); PhaseEnds carry the **Roadmap delta** line.
- **Effort/model transitions are prompted, never assumed** (R26/R27) — Claude cannot toggle
`/effort` or the model itself.
- **Velocity + all three metrics reported at every phase close** — the flip-timing
checkpoint (§1) runs on these numbers.
---
## 6. Risk register
| risk | posture |
|---|---|
| The W1/W2/W3 yield numbers rot (again) | Every plan-scale number above is dated + source-cited; P30 T0 re-derives ALL of them on repaired instruments before any wave is scoped. This file's two predecessors both rotted within one phase — assume this one will too and re-derive |
| The `-O0` Arm-A wall resists the splat fix | The no-recarve staging driver is the independent fallback (sketched in logs/Phase29); if BOTH fail, the ~1,287 distinct move to the wall ledger honestly — never force-banked |
| Type-1 modules surprise (big, or unmappable) | 3 are window-capped (true sizes unknown) — size them at P31 T1 open; load-address RE is R10-gated (≥3 datapoints); anything unmappable is documented-excluded, which the contract permits with evidence |
| Walls may hold for a long time | True-100% accepts this: no false completion, no redefinition (P9); P32 iterates with a Drew-reviewed re-attack cadence; model generations re-price walls |
| Frontier-model availability is episodic | v1's "Fable5 window expires ~7/19" lapsed, yet Fable 5 served the 07-30 re-baseline — treat availability as episodic: spend frontier capacity on *discovery/walls/synthesis* whenever present, never on wave fuel (calibration: its ROI is idioms, 0/5 direct banks) |
| Scale honesty | ~17.6k distinct fns at measured velocity is a multi-month solo+agent grind; the per-phase velocity report keeps the flip-at-100% decision falsifiable rather than assumed |
| Instrument rot | R32/R33/R34/R35 + the phase-open tool-health ritual; the named D-bucket defects are P30 T0, not "later"; any tool newly promoted to load-bearing gets its coverage assertion first |
---
## 7. Superseded & side notes
- **Roadmap v1 (2026-07-15) is superseded by this v2 (2026-07-30);** full v1 text in git
history (`commit:1210`). What v1 held open, P27–P29 resolved: the member-adapt swing number
(dissolved — the "~3%" was an `-O0` compile-flag artifact; `member_adapt` + the family-adapt
fine-tune vacated); the "structural families ≈0%" doctrine (retired — B2 lives, 102/115);
the pin-crash wall (dissolved P27); the Fable5-window urgency (lapsed; availability proved
episodic); the P29 family campaign itself (ran 25 sessions, +18.6pp instr, engine measured
spent at T98). v1's P30/P31/P32 substance carries forward as v2's P31/P32/P33 with
corrected buckets (v1-B7's behemoth list was stale; v1-B9/B10 numbers re-measured).
- **`docs/family-endgame-megaplan.md`** remains superseded (since 2026-07-15; banner intact —
kept for the record).
- **Libs-from-source** (decompile the PsyQ libraries; sotn precedent): recorded as a
far-future stretch after game-code 100% — Drew, 2026-07-15. Not planned.
- **Sister-decomp idiom harvest** (Vagrant Story, CC0 — `docs/sister-decomps.md`): a parked
ceiling-breaker if BFM's own idiom well runs dry; requires Drew's greenlight and the
content firewall.
- The **flip-timing tension** (strategy review vs Drew's flip-at-100%) is documented in
`docs/decision-log.md` (2026-07-15) with the standing velocity checkpoint that keeps it
honest.