Files
BFM-decomp/phase-ends/logs/Phase32.md
T
Drew T 4f7c3b64a3 docs(phase-33): commit-map + citations resolved to the rewritten history (C4–C7 — the tip commit)
- docs/commit-map.tsv: 4,032 rows (ordinal of the ORIGINAL main -> rewritten hash, author/committer dates, subject);
  1 pruned row of zeros (ordinal 1712, "session archive update"); 0 old hashes asserted; ordinal 1 unchanged by the
  rewrite (byte-identical)
- resolve_tokens: 1,238 commit:NNNN tokens -> shortest-unique new hashes in 98 files (docs, phase-ends, logs, tool
  docstrings, 2 C comments, the A5 evidence logs); residue left as tokens: commit:1712 x4 (the pruned commit),
  commit:orphan-24 x2, commit:orphan-26, commit:orphan-35 (cited commits that exist in no lineage)
- the rewrite (C4): filter-repo 2.47.0 on a bare clone of the C2 tip, 311 s, exactly 1 pruned, main 4,032 -> 4,031;
  the pre-rewrite history is mirrored in the private archive repo and in the local bundle
- the proof (C5): verify_rewrite 4,031 pairs / 0 failures; absent_scan 0 offenders; gate_scan 0 offenders on the clone
- adoption (C6): 100 text files differ at the tip, 0 purge paths, 0 added/deleted; leftover refs dropped; no gc yet
- resolver skips tools/public_rewrite/ (its self-test fixtures are the token grammar, not citations); repo-local
  identity is the GitHub noreply address from here on; CURRENT_PHASE: C4–C7 logged, checkpoint -> NEXT = C8
2026-09-06 23:28:39 -06:00

61 KiB
Raw Blame History

CURRENT_PHASE — Phase 32: the last 21 + the parked 5 (short, kill-gated)

Gate 1 approved 2026-09-05 (Drew, plan mode, Max, Fable 5.1). Rules R44–R63 ratified at gate 1 (binding). The approved plan (full text): ~/.claude/plans/plan-mode-enabled-max-iterative-ember.md — its substance is this file. Jumping-off document: docs/frontier-p32.md. Roadmap: docs/roadmap-to-100.md v2 §3 (P32 as written is consumed; P32 is this census) + PhaseEnd_Phase31.md Roadmap delta. Baseline HEAD at open: 77df1092e (Phase-31 close + post-close docs; no src//config/ change since the S80 census — verified git diff 3c292ef09..HEAD -- src config Makefile empty).

Milestone (gate 2)

Every one of the 21 census rows is BANKED or carries a FINAL verdict (PROVED wall / candidate wall with a gcc-mechanism citation + a bounded-attempt record / deferred with its cost stated); each of the 5 parked payloads is onboarded byte-identical at a byte-proven base (its stubs then join the census and are banked or ledgered the same way) or carries a documented exclusion with the static + runtime evidence; the fleet is byte-identical (R22) at every banked batch; the PhaseEnd carries the final wall ledger, the corrected denominators (main game-code 41,556 — the 22-ins Ghidra-boundary gap), all three metrics, and the roadmap delta (P33 = verify + flip).

Kill gate: a session that banks nothing and produces no new verdict ends the crack work (T3); the parked-5 work is bounded to the static candidate list + one static-RE session; no forced banks, no redefinition (P9). Scale estimate: 3–5 sessions.

Effort / model (R7/R26/R27 — every transition is PROMPTED, never assumed)

  • Max through T0–T2 (T2 is non-obvious static RE; T0/T1 are settled-design and would be fine at xHigh).
  • Prompt to drop to xHigh for T3 (orchestration) and T4 (ledgering); prompt back to Max for T5 (PhaseEnd).
  • Models: T1c one Sonnet agent (123 ins); T3 Opus for all 11 targets (escalation tier — Sonnet plateaued on the ≤120-ins rows in S79); Fable only if an agent names a wall class the codegen map lacks — STOP and prompt Drew first. No Ultracode / Workflow: one-page census → the S80 one-agent-per-function shape (docs/wave-playbook.md §S80 addendum, Agent-tool subagents; tools/agent_verdicts.py for any that outlive a session).

Adjustments vs frontier-p32.md §4 (approved)

  1. The parked 5 (T2) run BEFORE the crack pass (T3): the static header probe (2026-09-05) gave every payload a deterministic candidate base, so T2 is a set of ~0-token new_binary.sh byte-gate probes, and any stubs they add ride the same single bounded agent pass.
  2. Tooling-first split into three tasks, one commit each (P4/R42/R60).
  3. No MCP dependency for the parked 5 (static evidence + our own matched C); MCP only as a fallback (R29 prompt).
  4. Walls get a ledger task (T4), not drafting — incl. fixing two dangling best-draft paths (R62).

Tasks (strict order; one commit per task after this file is updated; count banks from the SOURCE)

  • T0 — Phase open (Max) — DONE 2026-09-05: verbatim 5==5 · exclude 8/8 fresh · census 21 (B-CARVE 4 / D-NEAR 10 / F-FAR 7, .run/P32/frontier_p32_open.json) · tools-health OK · check-all 213/213 rc 0 (.run/P32/t0_baseline.log): this file; harness task list (R28); baseline reads — verbatim_check --strict (5==5), exclude_audit --assert-fresh, frontier_classify --json .run/P32/frontier_p32_open.json (21), make tools-health OK, make check-all 213/213 (read of the on-disk S80 artifacts); commit.
  • T1a — resident: split the code subseg, bank func_800D128C (243) — DONE 2026-09-05: BANKED byte-identical 8e17e02f… (commits 380ccdc84 split + c513e1fbb bank); R22 after the bank: check-all 213 passed / 0 failed, rc 0 (.run/P32/t1a/r22.log); resident stubs 2 → 1; THREE instrument fixes on the way (cookbook §496 carrier provided-types, §498 carve --pre drop + gate ignoring the extract rc + interleave_check false DRIFT); twin_rescan: 20 open, nothing newly free. Original brief: jr_isolate_all resident --only func_800D128C (dry-run CLEAN 2026-09-05: 3 region files, carve repoint resident → resident_jr_800D00E4, --order + JTBL_PADS) → make extract BINARY=resident && make build BINARY=resident -j8 (EXIT CODE, R53; byte-neutral split) → commit carve state alone (R60) → rtu_match the closeness-0 draft .run/S71_gate14/resident/func_800D128C.c in the new region TU → parallel_gate --r22 (carves jtbl_80113FB8 + jtbl_80114198; pads_audit after) → in-tree build exit code → commit → twin_rescan. TU refusal → §376/§378 chain as a byte-neutral plumbing commit BEFORE re-gating.
  • T1b — ov_SC02_017: split + remap the twin, bank func_80186C64 (209) — DONE 2026-09-05: BANKED byte-identical c0253499… (c52190ca8 carrier §497 fix — NO source rename needed · 599dba3ba split · c7f5b498a bank); 0 drafting tokens; four §376 TU spellings + one TU-provided typedef stripped. Original brief (Max/xHigh): byte-neutral tag rename in src/ov_SC02_017/ov_SC02_017_jr_8017DF34.c (:4314/:4319; keep the typedef name) → build sha-unchanged → commit → jr_isolate_all ov_SC02_017 --only func_80186C64 (dry-run REFUSED on the conflict 2026-09-05; expect CLEAN after the rename) → extract/build byte-neutral → commit carve state → family_remap --addr 0x801810C8 --from ov_SC02_016 --to ov_SC02_017 --to-addr 0x80186C64 (d=2 RELOC-ONLY twin; source src/ov_SC02_016/ov_SC02_016_jr_801810C8.c:2839) → strip typedefs the TU already defines (§491 gap 2) → rtu_match → parallel_gate --r22 → commit → twin_rescan.
  • T1c — md_MAIN_034: bank func_800CB00C (123) — DONE 2026-09-05: BANKED byte-identical 46153c06… (059266afc) from the STORED S72 body .run/O21/opus/func_800CB00C.c (rtu MATCH 123/123; the census's best_draft was a name-collided WRONG file, R48/R38) — NO agent; WALL pin dropped (exclude 8→7); backlog 18→17. R22 after the T1b+T1c batch: check-all 213 passed / 0 failed, rc 0 (.run/P32/t1b/r22.log). Original brief: pack via claude_wave_packs (the stored 174-ins draft is WRONG, not a seed; §494 jtbl idioms) → verbatim grep → rtu_match --split md_MAIN_034 --source md_MAIN_034 → parallel_gate (island pads derive at build, §303) → commit → twin_rescan; drop the md_MAIN_034:func_800CB00C pin (exclude_audit --write). Progress report to Drew after T1c.
  • T2 — the parked 5 (Max) — DONE 2026-09-05 (T2a–T2c; T2d not needed):
    • T2a — DONE 2026-09-05 (848c7c50a): controls 7/7 (5 STRONG, 2 CONSISTENT; TEXT_LO estimates == yaml); the five: MAIN/7 STRONG 0x800CEDF8 · MAIN/9 STRONG 0x800CD348 · SC03/53, /54 CONSISTENT top 0x801EF468 (12-way tie) · SC03/56 SPLIT (jal vote 0x80178C8C vs ptrs/lui ~0x801CBB50); memory-map §S45 p7; SETUP row. Brief: tools/payload_base_evidence.py (id word, first prologue → TEXT_LO, abs-pointer window, lui hi-half histogram, jal self-consistency per candidate base, DESTPTR lookup in the window from .run/idxtab_map.json) — R39 controls: must re-derive md_MAIN_008/011 (0x800CEDF8), md_MAIN_042 (0x800CCB1C), md_MAIN_013 (0x800CAE08), md_SC03_073 (0x801EF468) from their payloads alone; refuses a payload with no self-reference (base-independent bytes — say so, never guess). SETUP row (R21); evidence rows → docs/memory-map.md §S45 p7 (G5 static-derived, US). Commit.
    • T2b — DONE 2026-09-05: ALL FIVE onboarded on their first candidate, byte-identical first builds — md_MAIN_007 @0x800CEDF8 (1a696a851, 19 stubs, A4 applied) · md_MAIN_009 @0x800CD348 (10aaf5c29, 11) · md_SC03_053 + md_SC03_054 @0x801EF468 (b52d67be0, 15 + 7) · md_SC03_056 @0x801CBB50 (1e843c607, 4). Fleet 213 → 218; +56 stubs (~2,600 ins). Instrument findings (R34/R35): the all-INCLUDE_ASM first build is a NULL oracle for FINE base errors (+8 builds byte-identical; +0x1000 fails the link) — bases are static-derived STRONG, byte-proven by the first internal-call C bank; a jal-vote base whose targets are shared-engine function starts is OUTWARD-EXPLAINED (SC03/56's false 0x80178C8C). Close chain (sig-modules → tools-health → audit-disc → R22 of 218) running: .run/P32/t2b/close.log. Original brief: onboard probes, one payload per commit, top candidate first (the module-class law: the FIRST build's byte-identity is the arbiter; a miss → next candidate; none → stays parked with the evidence): md_MAIN_007 extracted/retail/MAIN.CD.dir/FILE_007 0x800CEDF8 0x34 (9/9 internal jals on its own prologues at that base; omit symbols.resident.txt, A4 law) · md_MAIN_009 …/FILE_009.dir/0.1 0x800CD348 0x3C (the unique base fitting both in-region jals; then 0x800CAE08, 0x800CCB1C) · md_SC03_053 …/SC03.CD.dir/FILE_053.dir/0.1 0x801EF468 0x4 · md_SC03_054 …/FILE_054.dir/0.1 0x801EF468 0xF0 · md_SC03_056 …/FILE_056.dir/0.1 0x801CBB50 0x4 (then 0x801CBD90, 0x801CC6E0). After each success: make sig-modules, make tools-health (R36), make audit-disc (UNCLAIMED 5 → 5−N), commit.
    • T2c — DONE 2026-09-05: 20 free banks in the five new modules for 0 drafting tokens (89d177aa3 8 · 9ffd0b7ee 5 · a2d28df18 7): 7 d=0 hash twins + 3 RELOC-ONLY via family_remap, 9 constant-only NEAR-COUSINs (each constant named by the real-TU diff), 2 hand pass-throughs (main's func_80014128 shape); dedup_extend 0 (no macro-group members); split_indicator population fix (8b2bbff83, was a stale 213 list — R51). R22 after the batch: check-all 218 passed / 0 failed, rc 0 (.run/P32/t2c/r22.log). Census: 54 stubs / 6,376 ins (.run/P32/frontier_t2c_close.json: main 12 · md_MAIN_007 15 · md_MAIN_009 10 · md_SC03_053 6 · md_SC03_054 4 · md_SC03_056 1 · ov_SC03_105 2 · resident 1 · md_MAIN_003 1 · ov_SC06_022 1 · ov_SC07_002 1). make audit-disc UNCLAIMED 0 of 220; disc-completeness.md P32 section written; cookbook §499 + decision-log S81 (R31). Brief: free banks + census: twin_rescan / dedup_extend for h_exact twins of the new stubs; regenerate the census; leftovers join T3. Update docs/disc-completeness.md (+ ledger regen), decision log (R31).
    • T2d — NOT NEEDED (both MAIN/7 and MAIN/9 onboarded on their first candidate). Brief: (only if MAIN/7 or MAIN/9 refuse every candidate): one bounded static-RE pass over our own C (src/800.c, src/boot.c, src/resident/resident.c: loadDestPtrTable, D_800D3764/D_800D384C, the resourceIdMap sites) for a route producing global index 7 or 9; MCP (R29) only if the C is insufficient. Outcome: a base, or the strengthened exclusion evidence. Progress report after T2.
  • T3 — one bounded crack pass, Opus agents, one per function (xHigh orchestration — prompt R27): DONE 2026-09-05 (S83): 47/47 drafted, 39 BANKED (10 in the launching session + 29 in S83: the 11 S82 MATCH rows, the 17 queued Haiku rows 17/17 MATCH, and func_8001BC6C cracked 6 -> 0 by permuter_ils + an R63 read), 8 NEAR ledgered in the backlog with cost, 0 FAIL, 0 walls found. Census 15 stubs / 3,758 ins = 7 pinned walls + 8 NEAR (.run/P32/frontier_t3_close.json); md_SC03_053/054/056 100% C; resident 145/145; main 6 open (5 walls + func_80039308 NEAR 17). Fleet (make report): instr 13,484,739 / 13,488,497 = 100.0% · distinct 5,812,831 / 5,816,589 = 99.9% (90,975 / 90,984 unique) · fn-count 363,199 / 363,214 = 100.00% · INCLUDE_ASM 15. Step 8 (bounded tail): func_8001BC6C BANKED; func_800CD674 permuter plateau at the same $a3<->$t1 pair; func_800CF3E8 Opus second look NO GAIN at 27 but the §500-D1 mechanism corrected (cse find_best_addr) and its lever refuted (§500-H). Harvest: cookbook §500-F/G/H, BRIEF.md, jtbl_carve probe text, Makefile C_SRCS dotfile guard (a masked_diff probe broke a gate_main rebuild). Fleet R22 218/218 at 10:46, 11:09 and 217+main extracted, 218 passed / 0 failed, exits 0/0/0 at 12:00 MDT (S83). Original brief: targets = main:func_80023BF0 11 · func_80038698 11 · func_80039B20 7 · func_80039308 34 · func_80015B6C 40 · func_8002FDE8 35 · func_8001BC6C 28 · ov_SC03_105:func_80185810 37 · md_MAIN_003:func_800CF3E8 54 · ov_SC07_002:func_8017DC80 84 · resident:func_800D06E8 344 (after a byte-neutral fix of the Struct80078E78 typedef clash) + any T2c leftovers. Cheap second looks first: func_80023BF0 (VERIFY the S80 permuter waypoint's semantics before seeding) and func_80039B20. Packs: claude_wave_packs (S79 verdict incl. INERT list, exact-length best draft, matched same-TU neighbour, §494/§495 laws, the fixed permuter recipe permuter_ils … --cycles 8 --secs 150 --j 3); brief = .run/S79w/SYS.md. Per result, never in bulk: verbatim grep → rtu_match (main: --tu src/<TU>.c) → gate (parallel_gate --r22 / main: gate_main <slate> --apply, read the BODY/TABLE/PLUMBING/MIXED line) → commit per bank (R42) → twin_rescan; plateaus → backlog.py log with attempt + cost (R41). Expected 1–4 banks (S79: 3/11 on the Opus F/G tier), ~0.6–1.4M tokens. Progress report after T3.
  • T4 — the walls' FINAL verdicts — DONE 2026-09-05 (S83, xHigh, no drafting): all 7 pinned rows re-probed IN TU CONTEXT (rtu_match in the real TU; the three CC1-FAIL rows via a sandbox TU copy under .run/P32/t4/tu/ — every CC1 FAIL was plumbing, R40) and every one reproduced its recorded residual: 1 PROVED (main:func_80011380 §474, DIFF 6) · 6 CANDIDATE with current citations (func_80032A74 1 · func_80020DA4 2 · func_80039DEC 2 · func_800391D4 3 · ov_SC06_022:func_8017DF28 2 · ov_SC03_105:func_801834A4 6). No verdict changed. Deliverables: the wall table below; config/wave_exclude.txt annotated per row, exclude_audit --assert-fresh 7/7; backlog rows for all 7 (the two path-less rows given existing drafts, R62; func_80032A74 got a TU-clean synced draft .run/P32/t4/drafts/func_80032A74_tuclean.c); cookbook §500-I; docs/accelerators.md (8); decision-log (the final wall doctrine, R31). Original brief: the 8 pinned rows — confirm each citation current + instrument exonerated (R40), PROVED vs CANDIDATE, ledger best-draft → an existing real-TU-clean C file (R62: func_80011380 → .run/m3/opus/func_80011380.c; func_801834A4 → .run/S71_gate14/ov_SC03_105*/), exclude_audit --write, backlog.py render; a T3 idiom naming a wall's mechanism re-opens that row (bounded: one attempt, permuter first). Wall table into this file; cookbook §496+; decision log; accelerators.
  • T4b — crack and bank the final 15 (ADDED 2026-09-05 by Drew's directive; supersedes the kill gate: "anything that isn't the original hand-written asm or the PsyQ libs needs to be cracked and banked before we finish") — FIRST PASS COMPLETE 2026-09-05 (S83): 11 of 15 BANKED byte-identical, 4 carried to the NEXT session's HAND pass (Drew: no second agent round; hand-crack the remaining ones). Hand pass first (22 spellings, 0 banks, every blocker refined to a mechanism in .run/P32/t4b/<fn>/NOTES.md), then one Fable agent per row (permission, not requirement — Drew), resumed 3-at-a-time through three usage-limit outages. Banked (each: coordinator rtu_match in the CURRENT real TU → gate_main / bank.sh byte-identical → one commit; pins dropped by exclude_audit --write; mechanism in cookbook §501–§501-L): main:func_800391D4 1e54e88a8 · main:func_80039DEC e8c2b6baa · md_MAIN_009:func_800CD674 b13e824f7 · ov_SC06_022:func_8017DF28 b31084300 · main:func_80020DA4 b47bc2ea0 · ov_SC03_105:func_801834A4 ff86e2572 · md_MAIN_003:func_800CF3E8 cb871087e · md_MAIN_009:func_800CD92C 4a9a67c59 · ov_SC07_002:func_8017DC80 825da37bc · main:func_80011380 35fa11674 (the §474 "PROVED" wall) · md_MAIN_007:func_800CF6D0 228928dbe. Ten of the eleven were T4 "walls" or long-standing NEARs. **HAND PASS S84 (2026-09-06, Fable Max, no agents): row (a) main:func_80032A74 → PROVED at 1 (§501-M producer census: the 0x48 slot can only be a combine-minted ghost, which needs an lh/lb; the pin stays with its final verdict; ledger + tools/ghost_census.py + cc1_dumps.sh repair; row (b) md_MAIN_007:func_800CF408 → BANKED byte-identical 8fa12bc22 (the banked sibling func_800CD92C's spelling ported with a u32 array alias of the OT symbol, §501-N; zero pins/asm); row (c) main:func_80039308 → PLATEAU at 4 (S84 verdict, §501-O: the phantom slot's producer census refutes every route; Y4 is register-exact); row (d) ov_SC03_105:func_80185810 → BANKED byte-identical cdd9a2cb8 (S85, 2026-09-06): the banked same-shape cousin ov_SC02_027:func_80180B3C's packet-window spelling ported — ZERO pins, zero fences, zero asm dials (§501-P); ov_SC03_105 100% C). T4b hand pass COMPLETE: 13 of 15 banked, 2 verdicts (PROVED 1 · PLATEAU 4), both in main. Carried (4, all exact length, in docs/backlog.md with next levers): main:func_80032A74 1 (the last pin; ghost pseudo — near-proved) · md_MAIN_007:func_800CF408 3 · main:func_80039308 4 · ov_SC03_105:func_80185810 13. Close: fleet R22 218 passed / 0 failed, exits 0/0/0 (23:33–23:36 MDT, .run/P32/t4b/r22_full.log); make report: instr 13,486,890 / 13,488,497 = 100.0% · distinct 5,814,982 / 5,816,589 = 100.0% (90,982 / 90,984 unique) · fn-count 363,210 / 363,214 = 100.00% · INCLUDE_ASM 4; main REAL 787 · LINKED 1,256 · VERBATIM 3 · stubs 2 · 2,089 / 2,091 = 99.90% · 143dbb89…; census .run/P32/frontier_t4b_close.json 4 stubs / 1,607 ins; decision-log P32 S83 T4b (R31); accelerators (10)–(11); tools-health OK (.run/P32/t4b/tools_health.log).
  • T4c — crack the last 2 main rows before closing (ADDED 2026-09-06 by Drew: "do that now, lets crack these before closing the phase") — DONE 2026-09-06 (S85, Max, Fable 5.1, no agents): BOTH BANKED byte-identical via gate_main ("BANKED 1 main functions -- 143dbb89f34491258bbc27810d0a12ec8b43a8dd BYTE-IDENTICAL" ×2): main:func_80032A74 f9a90affb (the S84 "PROVED wall" — a combine self-update ghost mints the 8-byte slot, §501-Q) · main:func_80039308 ffb1949a1 (ZERO pins: the ghost chain + three inline (b2 * 0x100) temps merged by loop.c with a u16 vol accumulator + the s17/s18 reuse, §501-R). Census .run/P32/frontier_t4c_final.json: 0 stubs / 0 ins. config/wave_exclude.txt → 0 entries (exclude_audit --write); backlog 1 open (the legacy func_80062144 row, not a stub); twin_rescan 0 open; verbatim 5 == 5. Tools: tools/cc1_dumps_tu.sh + tools/alloc_table.py (promoted), tools/cc1_dumps.sh -dL; SETUP rows. Route + 56 variants: .run/P32/t4e/NOTES.md.
  • T5 — PhaseEnd (Max, Tier 1 — prompt R27): P7 checkbox walk; milestone demo (R22 fleet N/N, tools-health, verbatim_check --strict, final census, wall ledger, parked-5 dispositions via make audit-disc, make report all three metrics + main 143dbb89… with/without SDK dirs, corrected denominators); WAIT for gate 2; PhaseEnd_Phase32.md (+ Roadmap delta + Plain-English Recap); git mv this file → phase-ends/logs/Phase32.md (R19); R23 MCP stop if it ran; leave both uncommitted for Drew (R6); 🛑 (P8).

T4 — the walls' FINAL ledger (S83, 2026-09-05; every row re-probed in TU context; config/wave_exclude.txt carries the same lines)

row ins class closeness leaf / real-TU (S83) mechanism · citation bounded attempt record verdict best draft
main:func_80011380 (boot, −O0) 192 C-level floor 6 / 6 (rtu --o0) fold-const.c:882 split_tree merges MULT(MULT(i,2),2); the two escapes each cost one insn (stupid.c:497 adjacency / expand_decl use-brackets) — cookbook §474, §388 −O0 colouring oracle 20 spellings + statement-expression + (t=i*2)*2 register form (S76 proof); pinned S79 #8 PROVED .run/m3/opus/func_80011380.c
main:func_80032A74 (800_b_2) 422 FRAME/WIDTH 1 / 1 (synced draft) sole residual idx 244 lh vs lhu: extendhisi2 is a force_not_mem EXPAND (an orphan frame slot is minted only at an lh); the target's +8 frame bytes = §172 producer 3 (caller-save area, reload1.c:1445) ~200 byte-probes + 100-variant retyping sweep (S79 Opus) + permuter_ils 8×150 s null (S80); S83: CC1 FAIL was 7 header typedefs + 4 decl spellings → synced copy DIFF 1 CANDIDATE .run/P32/t4/drafts/func_80032A74_tuclean.c
main:func_80020DA4 (800) 100 REGALLOC-PERM 2 / 2 phantom 16-byte frame reproduced (address-taken frame_pad[3]); residual = mflo destination $t0 vs $a2; pinning regresses to 79 5 attempts 51→20→14→8→2 (S7x/S79) + permuter_ils null (S80); S83 rtu DIFF 2 CANDIDATE .run/S79w/sonnet/func_80020DA4.c
main:func_80039DEC (800_c) 74 REGALLOC (K&R) 2 / 2 (sandbox TU, no-proto decl) the $a3↔$t0 swap of the two K&R raw-preserve parameter copies is fixed by ARGUMENT POSITION in gcc-2.7.2 narrow-parameter promotion (2nd → $a3, 3rd → $t0) before global-alloc; every pin regresses to 60–75 (cookbook §376/§495 K&R laws, lines ~1320/1508) 3 attempts (S7x/S79 Sonnet 9) + permuter_ils 9→2 (S80); S83: CC1 FAIL = the TU's narrow prototype at 800_c.c:3496 vs the K&R def CANDIDATE .run/S79w/permuter/func_80039DEC.c
main:func_800391D4 (800_c) 75 SCHED (loop) 3 / 3 (sandbox TU, [][1] externs) 3-insn SCHEDULE-REORDER (off init vs arg1's sll/sra): move_movables splices hoisted invariants after any pre-existing preheader flow code (loop.c 2.7.2:1529; map loop.md L4) 4 prior + S79 Sonnet 64→3 (i=$7 pin kills combine_givs, D_80073140[][1] decl, 7 asm("") pads) + permuter_ils null (S80); S83: the [][1] spelling is load-bearing (TU-compatible forms → 65 @ 76) CANDIDATE .run/S79w/sonnet/func_800391D4.c
ov_SC06_022:func_8017DF28 (jr_8017BEBC) 119 SCHED (slot) 2 / 2 expand_block_move copy_addr_to_reg pseudo cse-reused for both later &mtx args (map cse_expr.md [A23-2]/§H); addiu $s2,sp,0x10 in the jal delay slot vs the target's bnez slot five RTL-verified attempts (S71/S79); permuter_ils "1" was a divergent rewrite (S80, R63); S83 rtu DIFF 2 CANDIDATE .run/S79w/sonnet/func_8017DF28.c
ov_SC03_105:func_801834A4 (jr_80181C84) 106 SCHED (loop) 6 / 6 (×3 variants) loop.c movable ordering (S71) S71 gate14 resolver variants cn-cast / -rc / -rc-sd all DIFF 6; S83 rtu DIFF 6 ×3 CANDIDATE .run/S71_gate14/ov_SC03_105-cn-cast-rc-sd/func_801834A4.c
(unpinned) md_MAIN_003:func_800CF3E8 469 ALIAS-BASIN 27 / 27 cse.c find_best_addr (fold_rtx MEM; COST pseudo 0 vs hard reg 1) swaps the bare-REG tag-load address to a pseudo; the alias lever refuted 5/5; the pinned-pointer launder frees the load but lands it 4 slots late (79 @ 470) — §500-H S79/S82 Opus + S83 Opus second look (245k tokens, ~16k compiles) CANDIDATE (backlog, not pinned) .run/P32/t3/opus/func_800CF3E8.c

The other 7 NEAR rows (func_80039308 17, func_800CD674 2, func_800CD92C 15, func_800CF408 49, func_800CF6D0 137, func_80185810 35, func_8017DC80 46) are DEFERRED WITH COST in docs/backlog.md (class · closeness · best draft · agent/permuter cost), per the milestone's third disposition.

Standing procedure (every task)

Fix the TU by a byte-neutral plumbing commit BEFORE any gate (S77 law) · commit banked work before the next command that can touch src/ (R42) · after any bank: twin_rescan, verbatim_check --strict (R62) · after a carve/merge touching a yaml/.mk: make extract BINARY=<b> before building; pads_audit/interleave_check on every touched carve binary (R60) · fleet verify after every banked batch: make clean && make extract-all && make check-all — read EXIT CODES (R53), quote the green count at every close (R58); make tools-health · log each task here + refresh the 🛑 checkpoint before any pause · rules check every 4 tasks (P6) · harvest idioms into the cookbook before the next drafting step (R16/R30) · no Co-Authored-By trailer (R5); keep the Claude-Session: line.

Blockers

  • 2026-09-05 09:xx: the successor session's SessionStart hook launched a headless Ghidra MCP server (.run/ghidra-mcp.log); T3/T4 do not use it; no RE writes → never stage the ghidra/ churn (R23).
  • Ghidra MCP not running at open (clean stop in the log; the SessionStart hook's server did not persist). Not needed for T0–T2b; if T2d needs it: tools/ghidra_mcp_start.sh → pause → Drew runs /mcp (R29) → G2 ping.

Log

  • 2026-09-06 (S85, T4c CLOSE — the chain's logs read; gate 2 CONFIRMED by Drew) — Fleet R22 after the two main banks: make clean EXIT=0 · extract-all 217 extracted, 0 failed of 217 (+ main, serial) EXIT=0 · check-all 218 passed, 0 failed of 218 EXIT=0 (16:13:17 MDT) (.run/P32/t4e/r22_*.log). make report: fn-count 363,214 / 363,214 = 100.00% · instr 13,488,497 / 13,488,497 = 100.0% · distinct 5,816,589 / 5,816,589 = 100.0% (90,984 / 90,984 unique) · MAIN game-code 41,534 / 41,534 = 100.0% · INCLUDE_ASM 0 · NON_MATCHING 0 · LINKED 1,256 · REAL substantive 360,737 (dedup 2,220 groups / 255,708 instances) (report_close.log). make report BINARY=main: REAL 789 · LINKED 1,256 · VERBATIM 3 · INCLUDE_ASM 0 · matchable 2,091 · byte-identical 2,091 / 2,091 = 100.00% · SHA1 143dbb89f34491258bbc27810d0a12ec8b43a8dd (report_main_close.log). make tools-health (tools_health.log): see the PhaseEnd (read at the close). Milestone confirmed by Drew (gate 2): "milestone confirmed, gate 2 approved. write the PhaseEnd". NEXT = T5 executed in this session.
  • 2026-09-06 14:00–19:30 MDT (S85, continued) — T4c DONE: the last two functions banked; the frontier is EMPTY. (a) func_80032A74: step 0 shape-grep (0x6009F, 0x5301) → cousins func_8003388C/func_800336A8 (800_b_2) and func_8003A0E4 (800_c); the crack was a NEW frame-slot producer — combine.c:2306 skips the ref decrement for a deleted self-update (i2dest_in_i2src), so gx = dd->unk07; gx -= 0x100; flag = (u32)sub < (u32)(u8)gx; compiles to the same lbu and reload mints the orphan slot at 0x48; 18 reproducers (.run/P32/t4e/ghost/, k4/k5/k7/k14/k16/k17 mint, byte-store hosts don't); rtu MATCH on the first probe (a1); gate_main BANKED f9a90affb. (b) func_80039308: Y4 + the ghost chain fixed the frame (DIFF 6), reusing arm 1's s17/s18 as the else pointer/temp fixed the else head (b11 DIFF 2), then 40 variants on the hoisted sll $s2 (tools/cc1_dumps_tu.sh real-TU dumps + tools/alloc_table.py): a named vbase after the inner loop is never a movable (loop.c:695), a 1-use temp is "not desirable", copy-first folds the arms onto vol (cse.c make_regs_eqv), copy-last births vol after the tests ($a0); the reproducer sweep (s1–s8) found u16 vol keeps the arms on the hoisted register; b52 = u16 vol + vol = b2 * 0x100 copy-first + arms (b2 * 0x100) ± X (three temps merged by combine_movables, refs 7 → $s2) → MATCH; b54–b56 dropped every pin → b56 zero pins; gate_main BANKED ffb1949a1. Post-bank: verbatim 5==5, twin_rescan 0 open, backlog 1 open (legacy row), exclude_audit --write → 0 entries, census 0 / 0. Harvest: cookbook §501-Q, §501-R (+index OK), accelerators (15)(16), decision-log P32 S85 T4c, SETUP rows, .run/P32/t4e/NOTES.md, .gitignore allowlist. Fleet R22 + make report ×2 + make tools-health launched as one background chain at ~19:20 MDT (.run/P32/t4e/r22_{clean,extract,check}.log, report_close.log, report_main_close.log, tools_health.log) — read them first next session. Session paused at Drew's request (90% context). NEXT = record the chain's numbers → T5.
  • 2026-09-06 13:00–13:50 MDT (S85, continued) — T4b CLOSE (task #13 done): fleet R22 after the bank make clean && make extract-all && make check-all → clean EXIT=0 · extract-all 217 extracted, 0 failed of 217 (+ main, serial) EXIT=0 · check-all 218 passed, 0 failed of 218 EXIT=0 at 13:21:49 MDT (.run/P32/t4d/r22_{clean,extract,check}.log). make report (fleet, .run/P32/t4d/report_close.log): instr 13,487,557 / 13,488,497 = 100.0% · distinct 5,815,649 / 5,816,589 = 100.0% (90,984 / 90,984 unique fns) · fn-count 363,212 / 363,214 = 100.00% · INCLUDE_ASM 2 · NON_MATCHING 0 · LINKED 1,256 · REAL substantive 360,735 · dedup 2,220 groups / 255,708 instances. make report BINARY=main (report_main_close.log): REAL 787 · LINKED 1,256 · VERBATIM 3 · INCLUDE_ASM 2 · matchable 2,091 · byte-identical 2,089 / 2,091 = 99.90% · build SHA1 143dbb89f34491258bbc27810d0a12ec8b43a8dd byte-identical · MAIN game-code weighted 40,594 / 41,534 = 97.7% (digest denominator; the corrected one is 41,556). make tools-health → OK (sigs fresh; corpus(+resident) + cdecl + binaries + report(lint+dedup) + cookbook-index green; split_indicator 218 OK). Census .run/P32/frontier_t4b_final.json 2 stubs / 940 ins (main func_80039308 PLATEAU 4 · func_80032A74 PROVED 1); twin_rescan 2 open / 0 newly free; verbatim_check --strict 5 == 5; docs/backlog.md 3 open (the two verdict rows + the legacy func_80062144 "won't compile standalone" row). 🛑 block refreshed for T5 (below). NEXT = T5 — the PhaseEnd (Tier 1, Max; present the milestone demo and WAIT for gate 2).
  • 2026-09-06 (S85, session 3a7e207c, Max, Fable 5.1, no agents) — T4b hand pass, row (d) ov_SC03_105:func_80185810 BANKED byte-identical (cdd9a2cb8: bank.sh — rtu MATCH 489/489 in the real TU, splice, make build BINARY=ov_SC03_105 -j8 rc 0, sha d305ff6d… == config/check.ov_SC03_105.sha). Preflight: tree clean, verbatim_check --strict 5==5, make check-all 218 passed / 0 failed EXIT=0 (.run/P32/t4d/check_all_preflight.log); the Fable draft re-verified DIFF 13 (rows 363–380). §501-N step 0: twin oracle 0, atlas knn nothing (only a REVERSE 0.55 "weak cousin" entry), symbol grep = this overlay only; the SHAPE grep ('0x200) << 2', the getTPage chain) surfaced ov_SC02_027:func_80180B3C — the same billboard drawer, banked — whose objdump window (0x34f8–0x3560) is the target's rows 362–386 verbatim. Its window spelling ported onto the draft (.run/P32/t4d/d1_sibport.c) → MATCH first try; the pin census (d2–d12, all real-TU): mode/cl/c40/uu pins individually and jointly removable, ot16 pin load-bearing ONLY next to 2-set neighbours (DIFF 4), d9 with NO pins = MATCH → banked; F2's polarity re-rolls 42 rows, a 2-set uu 63 rows (the S83 "combine folds the fresh andi via nonzero_bits / a hard reg hides it" reading refuted — the andi survives as a lone single-set insn). Post-bank: twin_rescan 2 open / 0 newly free; verbatim_check --strict 5==5; backlog.py render 3 open (row pruned); census .run/P32/frontier_t4b_final.json 2 stubs / 940 ins (main func_80039308 4 · func_80032A74 1). Harvest: cookbook §501-P (+ index regen), accelerators (14), decision-log P32 S85 (R31), .run/P32/t4d/NOTES.md (the 12-variant census). Fleet R22 launched after the bank (.run/P32/t4d/r22_*.log) — see the T4b close entry. T4b hand pass COMPLETE: 13/15 banked + 2 final verdicts. NEXT = the T4b close, then T5.
  • 2026-09-06 (S84, continued) — T4b hand pass, row (c) main:func_80039308 → PLATEAU at 4 (verdict). Producer census for the target's phantom slot [arg1 @0][8 @8][cnt @0x10] (§501-O): cnt's slot is spill_stack_slot[23] (cnt evicted from $s7, .greg "Register 95 now on stack"), so the phantom is an initial-loop slot with no traffic; every producer refuted on dump facts (leaf → no save area; LO spilled after GR; products alternate to GR_REGS — C3 measured mflo $a1/$v1; no unallocated single-block equiv pseudo; expand-time locals precede; all 13 lh single-use, no lb). Rows 49/50 = two move_movables hoists in body order (open: steer the hoisted b2 * 0x100 into $s2 without the pin). Ledger row updated (closeness 4, FRAME+SCHED), NOTES .run/P32/t4c/func_80039308/NOTES.md, probe c3_twoprod.c. Row (d) ov_SC03_105:func_80185810 (13) read (report + rtu DIFF 13 re-verified) — NOT started; per §501-N its step 0 is a banked-sibling search on its symbol set (D_800A5E60, D_801BC9B4/BC, D_801BA6B0, D_800AF630, D_800A6610). Session paused here at Drew's request (87% context).
  • 2026-09-06 (S84, continued) — T4b hand pass, row (b) md_MAIN_007:func_800CF408 BANKED byte-identical (8fa12bc22: bank.sh — rtu MATCH 178/178 in the real TU, splice, make build BINARY=md_MAIN_007 -j8 rc 0, sha 2ff702b6… == config/check.md_MAIN_007.sha). The Fable draft's 3-row prologue-weave residual (§501-L) was a shape symptom: the same-family banked sibling md_MAIN_009:func_800CD92C (§501-H) had matched with the plain libgpu addPrim shape; porting it with this function's constants matched first try (b0d_sibport_alias.c). The TU declares extern u8 D_800AA60C[], which kills the sibling's u32 ARRAY_REF (the form whose address memory_address → force_reg lets cse bind the OT base into $t2; every u8 respelling emits the $at macro form ×8) — solved with the fleet's asm-label alias extern u32 wD_800AA60C[] __asm__("D_800AA60C"); (1,438 banked files carry the pattern; a declaration, not an asm body). Measured and refuted on the way: the sibling's lever-7 trailing volatile asm 2-set dial (flips $t1/$t0), the struct-view and P_TAG-on-u8 forms. Post-bank: twin_rescan 3 open / 0 newly free; verbatim_check --strict 5==5; backlog rendered 4 open (the row pruned). Harvest: cookbook §501-N, accelerators (13), NOTES .run/P32/t4c/func_800CF408/NOTES.md (7 variants). bank.sh's Claude-Session trailer now comes from $CLAUDE_SESSION (was S83's id hard-coded). NEXT = row (c) main:func_80039308 (4).
  • 2026-09-06 (S84, session 72d8b4b1, Max, Fable 5.1) — T4b hand pass, row (a) main:func_80032A74 CLOSED: PROVED at 1 (verdict, not a bank). Preflight: tree clean, verbatim_check --strict 5==5, make check-all 218 passed / 0 failed rc 0 (.run/P32/t4c/check_all_preflight.log). Re-verified in the real TU (rtu_match … --tu src/800_b_2.c --asm-subdir asm/nonmatchings/800_b_2): the s16 u18 draft DIFF 1 (idx 244 lh vs lhu, frame exact); the u16 u18 TU-clean variant DIFF 22 = the 22 frame rows only (422/422 code). The residual is ONE reload-time slot at sp+0x48. Instead of a spelling sweep, enumerated every post-parameter stack-slot producer from the 2.7.2 source (reload1.c:658 ghost alter_reg · caller-save.c:249 area · reload1.c:879 invalid-equiv address · reload1.c:3499 spill_stack_slot) and refuted each on the bytes/dumps: combine's newi2pat ghosts re-derive a narrow load (lh/lb) and the site is lhu with no lb/double load; a save area without sw/lw needs sched.c:4962 staleness and no register-only insn shares a block with any of the 7 calls; unallocated single-block equiv pseudos cannot exist; $t0 holds no pseudo (order_regs_for_reload) and LO mult results retry into GR_REGS. Found and measured a NEW ghost producer — local-alloc.c optimize_reg_copy_2 on tmp = x; tmp op= c; x = tmp; (P13 refs 5, P14 refs 1) — which cannot slot because it is minted after regclass (class GR_REGS, no conflicts → allocated, vars=0). 18 isolated reproducers, 0 draft variants. Deliverables: cookbook §501-M, tools/ghost_census.py (new) + tools/cc1_dumps.sh (repaired: frame line + census, the under-counting (use) grep gone) + SETUP rows (R21), accelerators (12), backlog row (WALL-PROVED) + tools/backlog.py tie-break repair (kept the EARLIEST record at equal closeness — the S84 row never rendered), config/wave_exclude.txt annotated (exclude_audit --assert-fresh 1/1), notes .run/P32/t4c/func_80032A74/NOTES.md. NEXT = row (b) md_MAIN_007:func_800CF408 (3).
  • 2026-09-05 13:05–23:40 MDT (S83, continued) — T4b first pass COMPLETE: 11 of 15 banked, 4 carried. Fifteen Fable agents launched from .run/P32/t5x/ (BRIEF + packs + the hand-pass NOTES); three usage-limit outages killed every run (resumed each time via SendMessage with context intact; "write deliverables early" saved one crack from a dead run); from the second outage on, resumed 3 at a time (Drew). Verdicts: 11 MATCH (each re-verified by the coordinator in the CURRENT real TU and banked byte-identical — main rows via gate_main slates, overlays/modules via SPLIT=… DRAFT_DIR=.run/P32/t5x/fable bank.sh), 4 NEAR at exact length (1 / 3 / 4 / 13) with pass-attributed residuals and next levers ledgered. Every crack came from READING a pass dump against the 2.7.2 source; cookbook §501–§501-L (12 new laws: cascades, cross-jump-after-alloc, dying-input vs birthing boost, hard-reg sets count, pins forbid retry regs, CSE-quantity split, three-passes-three-dials, constants as floaters, manufactured orphans, a proved tree wall is not an RTL wall, sched2's /s exemption, coupled dials); decision-log P32 S83 T4b; accelerators (10)–(11). Instrument defects: bank.sh (empty fn list → built the unchanged tree, exit 0; _jr_ TU split; draft dir) hardened, and two premature "banked" ledger messages corrected in the next commit (memory: write the message from the tool's output). Pins 7 → 1. Fleet R22 218/218 at the close; make report fleet 100.0/100.0/100.00, 4 stubs. Drew: no second agent round; hand-crack the remaining four next session. NEXT = the hand pass on the four (see the 🛑 block), then T5.
  • 2026-09-05 12:05–12:40 MDT (S83, continued) — T4 DONE. Preflight: tree clean, verbatim 5==5, R22 218/218 (12:00), exclude_audit --assert-fresh 7/7. Every pinned wall's best draft re-run with rtu_match in its CURRENT real TU: func_80011380 DIFF 6 (--o0), func_80020DA4 DIFF 2, func_8017DF28 DIFF 2, func_801834A4 DIFF 6 ×3 variants; the three CC1-FAIL rows re-probed after their plumbing was understood — func_80032A74 (7 TU-provided typedefs + 4 decl spellings → cdecl.strip_provided_typedefs + the TU's lines → DIFF 1 in the real TU), func_80039DEC and func_800391D4 (a sandbox TU copy under .run/P32/t4/tu/ with the declaration edited THERE → DIFF 2 / DIFF 3) — no src/ edit, no byte-neutral commit spent on rows that will not bank. Leaf match_one re-measured all three (1 / 2 (permuter) / 3). No verdict changed: 1 PROVED (§474) + 6 CANDIDATE, citations current (§474, §172 reload1.c:1445, loop.md L4 2.7.2:1529, cse_expr.md [A23-2], the K&R promotion laws). Deliverables: the wall table (above), config/wave_exclude.txt per-row S83 lines, backlog rows for all 7 (+ the two path-less rows fixed, R62; docs/backlog.md 16 open), cookbook §500-I, accelerators (8), decision-log. NEXT = T5 (Max, Tier 1 — prompt R27, WAIT for gate 2).
  • 2026-09-05 11:30–12:30 MDT (S83, continued) — T3 steps 8–9 DONE → T3 CLOSED. Step 8: permuter_ils 8×150 s -j3 on the two REGALLOC-PERM seeds — func_800CD674 plateau (best waypoint = the same 2-row $a3↔$t1 pair; ledgered with cost), func_8001BC6C reached masked 1; the R63 read showed three mutations, one of them a WRONG-WIDTH & 0xFF (lhu→lbu); the two sound ones (idx after color; an early tag/k birth) = leaf MATCH, re-spelled well-defined as k = 0; tag = (a1 << 8) | k; (11 spellings measured), rtu MATCH in src/800.c, gate_main BANKED 143dbb89 (836181a6c) — main 7 → 6 open. gate_main's first rebuild died on a concurrent agent's src/.masked_diff_probe.<pid>.c (present at parse, gone at compile) → Makefile C_SRCS find now -not -name '.*' (563a21144, byte-neutral, control on make -pn). One bounded Opus second look at func_800CF3E8 (245k tokens, 29 min): 27 holds; §500-D1's mechanism corrected to cse.c find_best_addr (fold_rtx MEM; COST pseudo 0 vs hard reg 1), the alias lever refuted 5/5, a new zero-byte pinned-pointer launder found (79 @ 470, structurally closer) — cookbook §500-H, backlog row updated. Step 9: make report (fleet instr 100.0% · distinct 99.9% · fn 100.00% · 15 stubs), make report BINARY=main, census .run/P32/frontier_t3_close.json (15 / 3,758), twin_rescan 0 free, cookbook §500-G/H + index, this file; R22 → see the 🛑 block. Kill gate: the session banked 29 and produced 3 new verdicts; the tail's three bounded attempts are spent — T3 closes on the evidence. NEXT = T4.
  • 2026-09-05 10:10–11:25 MDT (S83, session 491895ad, xHigh, Fable 5.1) — T3 steps 0–7 DONE: 28 banks, fleet R22 218/218 twice. Preflight R22 218/218 rc 0 (.run/P32/t3s3/r22_check.log) → the 11 S82 MATCH rows banked: md_SC03_053 ×2 (d3f05998d 9887e6987, 100% C) · main ×2 via gate_main (e2aee8e27: "slate 2 -> 2 compatible … BANKED 2 … 143dbb89 BYTE-IDENTICAL") · md_SC03_054 func_801EF6D8 604+7 jtbls (aa773c8fb; jtbl_carve --probe refused the tail carve → §303 derive stage reproduced the island pads 0,0t1,0t1,0t1,0t1,0t1,0 with NO carve state change) · md_MAIN_007 ×6 after the byte-neutral func_800CF3B0 no-proto decl commit (9e84ce2cd, 8ca9d53ca) — two integration classes on the way (same-TU s16/u16 spelling of D_800B99E8; §304 self-defining rodata D_800CEDFC). twin_rescan 33 open / 0 free; verbatim 5==5; R22 make clean && make extract-all && make check-all → 217+main extracted, 218 passed / 0 failed, exits 0/0/0 (.run/P32/t3s3/r22_full.log, 10:41–10:46); tools-health OK. The 9 NEAR rows ledgered (backlog_near.sh; docs/backlog.md 15 open). 17 Haiku agents launched 10:57 from staged prompts (.run/P32/t3s3/prompts/), 17/17 MATCH by 11:15, each re-verified with rtu_match in the CURRENT TU and banked by bank.sh (verbatim grep → rtu → splice → one build → sha → commit-on-green): md_MAIN_007 ×6 (5aab66b2d 5160775a1), md_MAIN_009 ×8 (f20e42259 fc922a4cc — func_800CD520 needed a §376 re-spell after a sibling bank added the file-scope prototype), md_SC03_054 ×2 (582bcab70, 100% C), md_SC03_056 ×1 (f461715d0, 100% C). twin_rescan 16 open / 0 free. Harvest: cookbook §500-F (the four integration classes), BRIEF.md §304 sentence, jtbl_carve --probe text, harvest_notes. Post-batch R22 (after all 28 banks): 217+main extracted, 218 passed / 0 failed, exits 0/0/0 (.run/P32/t3s3/r22b_full.log, 11:04–11:09).
  • 2026-09-05 (successor session, later) — Session-start protocol rewritten at Drew's direction (R64 candidate): phase-ends/DIGEST.md created (every phase synopsis + every rule in full + the PROJECT_CONTEXT corrections + the doc map); CLAUDE.md load order = PROJECT_CONTEXT → DIGEST → the three most recent PhaseEnds → CURRENT_PHASE, ≈100k tokens, the 🛑 block replayed VERBATIM; Phase Boundary step 3b maintains the digest (P7); phase-ends/README.md + SETUP §7 updated; the two memories (checkpoint-current-phase-before-pause, session-start-list-rules-in-full) + MEMORY.md updated; .run/P32/t3/PROMPT_TEMPLATE.md saved (verbatim agent prompts). The 🛑 block below was REFRESHED to the verbatim-replay standard and SUPERSEDES the 09:30 block. Ratify R64 at PhaseEnd_Phase32.
  • 2026-09-05 09:30 MDT — T3 CHECKPOINT by the successor session (Max, Fable 5.1) after the launching session died. The T3 coordinator (session c6a5fb71) banked 10 functions in 9 commits (T3 (1)–(9), 01:01–01:07 MDT) and then hit "Prompt is too long" at 01:07 MDT; 22 agent completions (07:07Z–08:04Z) arrived into a dead session. Recovered via the recorded route: agent_verdicts.py over the 31 task transcripts → .run/P32/t3/verdicts.jsonl (20 MATCH / 9 NEAR / 2 FAIL); every unbanked draft re-verified with rtu_match in its real TU (10 MATCH confirmed). Instrument incident (R48 class): one agent's tidy-up (find .run/P32/t3/opus -maxdepth 1 -type f ! -name func_800CD674.c -exec mv {} _scratch/, 07:52Z) had swept 11 sibling Opus deliverables — found in _scratch/, moved back, byte-verified at the reported closeness; tools/agent_drafts_restore.py (NEW — transcript replay) written as the fallback; .gitignore allowlist for .run/P32/** so the drafts/ledger/census are committed (R20). Harvest written IN-SESSION (R16/R30): cookbook §500 (10 banked closers, 10 MATCH closers, 9 NEAR classes, two NEW mechanisms — the pinned-base alias basin and #line-equalised ASM_OPERANDS — and the process defects); docs/wave-playbook.md §S80 addendum-2 (per-function work dirs, JSON-only final message, the 20-agent cap, the recovery tools); docs/accelerators.md P32 T3; docs/decision-log.md P32 S82 (R31); SETUP row (R21). Read-only T4 pre-check results from the dead session preserved in the 🛑 block. Effort: this checkpoint at Max; T3 resumes at xHigh (R27).
  • 2026-09-05 — gate 1 approved; T0 opened at HEAD 77df1092e.
  • 2026-09-05 — T3 LAUNCHED (xHigh): 47 targets = census 54 − 7 pinned walls (.run/P32/t3/targets.json, 5,288 ins); packs built (claude_wave_packs, 47/47 neighbours, 10 journals); brief .run/P32/t3/BRIEF.md. 20 Agent-tool drafters running (16 Opus: the 11 old near/far rows + resident func_800D06E8 + the 4 largest new bodies · 3 Sonnet · 1 Haiku); 27 Haiku queued behind the harness's 20-concurrent cap (.run/P32/t3/pending_launch.txt, launched one per freed slot). Recovery + per-result route: .run/P32/t3/LAUNCHED.md.
  • 2026-09-05 — T2c DONE (R22 218/218 rc 0) · T2d not needed. Twenty of the 56 new stubs fell to twin remaps and constant flips (0 tokens); the rest (36, all ≤50 ins but one, never drafted) join T3 on the model ladder. Session limit reset here (Drew); effort now xHigh via /model (the T3 orchestration level, R27 satisfied). Settings-file JSON defect fixed (a trailing comma).
  • 2026-09-05 — T2b DONE — the parked ledger is EMPTY: all five payloads onboarded byte-identical (MAIN/7 → md_MAIN_007 @0x800CEDF8; MAIN/9 → md_MAIN_009 @0x800CD348; SC03/53, /54 → md_SC03_053/054 @0x801EF468; SC03/56 → md_SC03_056 @0x801CBB50). Every base came from T2a's static alignment (self-calls / fn-ptr-table entries on the module's own function starts; controls 7/7), NOT from the byte check — two negative controls showed the first build is base-lenient (fine offsets) and only catches gross errors. Two tool refinements en route (combined STRONG rule; outward-explained vote bases). The 100% claim loses its last asterisk once the new stubs are banked or ledgered (T2c/T3).
  • 2026-09-05 — T1b + T1c DONE (R22 213/213 rc 0 for the batch) · T2a DONE. Both banks were ZERO-token: T1b's body came from family_remap of the d=2 twin (+ four TU spellings), T1c's from a stored S72 body the census had mis-keyed (R48) — the journals (R38) named both. Census 21 → 18 stubs (resident 1 · main 12 · md_MAIN_003 1 · ov_SC03_105 2 · ov_SC06_022 1 · ov_SC07_002 1). T2a's instrument gives every parked payload a bounded probe list; two are STRONG.
  • 2026-09-05 — T1a DONE — resident:func_800D128C BANKED (243 ins, byte-identical 8e17e02f, R22 213/213). The stored S71 closeness-0 draft was byte-correct all along; the whole task was three instrument defects the resident (the fleet's one common.h-only, --pre-sandwich binary) exposed in overlay-only assumptions: (1) jr_isolate_all dropped a file-local typedef whose name engine_types.h also defines (§496 — fixed: provided types derived from the TU's own includes); (2) jtbl_carve regenerated JTBL_INTERLEAVE without the --pre hdr.rodata.o clause → extract refused → the gate linked a stale script and booked the byte-correct draft as DIFF; harvest_verify ignored that extract's rc (§498 — both fixed, R49/R61); (3) interleave_check read a --pre line as n=0 (false DRIFT; fixed). R38 then found two more stored MATCH bodies for T1b/T1c (see their rows). Effort stayed Max.
  • 2026-09-05 — T0 DONE. Baseline reads all green (.run/P32/t0_baseline.log): verbatim_check --strict 5 bodies == 5 rows; exclude_audit --assert-fresh 8 entries, 8 WALL, 0 stale; frontier_classify → 21 rows = the S80 census exactly; make tools-health OK (sigs fresh, corpus(+resident), cdecl, audit-binaries 213/213, report lint+dedup, cookbook-index, split_indicator 213 OK); make check-all 213 passed / 0 failed, rc 0. Harness task list #1–#11 built (R28). NEXT = T1a.

🛑 SESSION CHECKPOINT — T4c COMPLETE: THE FRONTIER IS EMPTY (0 stubs); NEXT = record the R22/report chain, then T5 the PhaseEnd (2026-09-06 ~19:30 MDT; written by session 3a7e207c "S85" at Drew's 90%-context pause; SUPERSEDES every earlier block)

0. How to use this block

You are a FRESH SESSION that has read PROJECT_CONTEXT.md, phase-ends/DIGEST.md, PhaseEnd_Phase29/30/31.md and this file, and nothing else (CLAUDE.md protocol, R64 candidate). Replay this block verbatim, state phase / done / NEXT / effort, list the rules from the digest, then WAIT for Drew. NEXT = (1) read the background chain's logs (§3 step 0) and write their numbers into this file (the T4c close), commit; (2) T5 — the PhaseEnd, a Tier 1 task at effort Max (R7/R27: prompt /effort max and WAIT), which has TWO waits: present the milestone demo and WAIT for gate 2; only then write PhaseEnd_Phase32.md, append the digest, archive this file, HARD STOP (P8). No Agent tool, no Workflow, no drafting — there is nothing left to draft.

1. Where we are

Phase 32 — the last 21 + the parked 5 — extended by Drew's T4b directive (every function that is not original hand-asm or a PsyQ object must be cracked and banked before the phase closes) and closed out by T4c (Drew, 2026-09-06: "let's crack these before closing the phase"). Gate 1 approved 2026-09-05; R44–R63 ratified then; R64 candidate (ratify at this PhaseEnd). Tasks: T0 ✓ T1a ✓ T1b ✓ T1c ✓ T2a–c ✓ (T2d not needed) T3 ✓ T4 ✓ T4b ✓ T4c ✓ · T5 pending. (The parent T2 checkbox in the task list is still [ ] although its four sub-items are [x] — tick it when archiving.) Harness tasks this session: #1 row (d) done · #2 T4b close done · #3 T5 in progress · #4 T4c done. The census is EMPTY: .run/P32/frontier_t4c_final.json → 0 stubs / 0 instructions. Every game-code function of all 218 binaries is C; the 5 PERMANENT verbatim __asm__ bodies (config/verbatim_manifest.json, verbatim_check --strict 5 == 5) and main's 1,256 LINKED PsyQ objects are the only non-C code. config/wave_exclude.txt: 0 entries. docs/backlog.md: 1 open row — func_80062144 "won't compile standalone", a stale pre-atlas ledger row, NOT a stub (say so in the PhaseEnd). twin_rescan 0 open. Banks this session (all gate_main "BANKED … 143dbb89f34491258bbc27810d0a12ec8b43a8dd BYTE-IDENTICAL" / bank.sh sha == config): ov_SC03_105:func_80185810 cdd9a2cb8 · main:func_80032A74 f9a90affb · main:func_80039308 ffb1949a1. Main: REAL 789 · LINKED 1,256 · VERBATIM 3 · stubs 0 (was 2,089 / 2,091 = 99.90% byte-identical at the T4b close; now 2,091 / 2,091). Last fleet R22 (after the row (d) bank, BEFORE the two main banks): 217+main extracted, 218 passed / 0 failed, exits 0/0/0 at 13:21:49 MDT (.run/P32/t4d/r22_*.log); the two main banks were each verified by gate_main's clean main rebuild. A fleet R22 + make report + make report BINARY=main + make tools-health chain was launched in the background at ~19:20 MDT and is NOT yet recorded — logs in .run/P32/t4e/: r22_clean.log, r22_extract.log, r22_check.log (expect "218 passed, 0 failed of 218" + EXIT=0), report_close.log (expect INCLUDE_ASM 0, instr 13,488,497 / 13,488,497 = 100.0%, distinct 100.0%, fn-count 100.00%), report_main_close.log (expect REAL 789 · LINKED 1,256 · VERBATIM 3 · stubs 0 · 2,091 / 2,091 · sha 143dbb89…), tools_health.log (expect OK). If any log is missing or red, re-run that step yourself (make check-all is ~2 min; the reports ~10 min). Non-ghidra tree clean at HEAD after this session's commits; the ghidra/ churn is R23 restart-noise — never stage it. Claude commits, Drew pushes (R6; ~113 unpushed).

2. What S85 did (session 3a7e207c, 2026-09-06, Max, Fable 5.1, no agents; commits cdd9a2cb8 0ab474ed5 fe2f34b9f f9a90affb ffb1949a1 + the harvest commit)

  • Row (d) ov_SC03_105:func_80185810 BANKED by porting the banked cousin ov_SC02_027:func_80180B3C's spelling (§501-P; the atlas had scored it 0.55) with zero pins; T4b closed (fleet R22 218/218, reports, tools-health, checkpoint fe2f34b9f).
  • T4c (Drew's directive): func_80032A74 (the "PROVED wall") banked on the first probe once the missing frame-slot producer was found — combine.c:2306 skips the ref decrement for a deleted self-update, so gx = <load>; gx -= 0x100; (u8)gx leaves a ghost pseudo that reload slots (§501-Q; 18 reproducers in .run/P32/t4e/ghost/). func_80039308 banked with ZERO pins after 56 measured variants: the ghost chain (frame), the s17/s18 variable reuse (else head), and the hoisted base as three inline (b2 * 0x100) temps merged by loop.c's combine_movables with u16 vol keeping cse off the copy (§501-R; the loop.c/cse.c/ global.c rules are quoted there with line numbers).
  • Instruments: tools/cc1_dumps_tu.sh (real-TU pass dumps from an rtu_match --work dir — the standalone cc1_dumps.sh compile is NOT faithful on main TUs), tools/alloc_table.py (global allocation order/priorities from the dumps), tools/cc1_dumps.sh -dL; SETUP rows (R21). Harvest: cookbook §501-P/Q/R (index OK), accelerators (14)(15)(16), decision-log P32 S85 ×2, .run/P32/t4d/NOTES.md, .run/P32/t4e/NOTES.md, .gitignore allowlists for .run/P32/t4d/ and .run/P32/t4e/.

3. NEXT — in order

  1. Preflight + the T4c close: git status --short | grep -v ghidra/ (empty) · verbatim_check --strict (5 == 5) · read the six logs in §1 and copy their result lines into this file's Log (a "T4c close" entry: the R22 line with exit codes and time, the three make report metrics, main's REAL/LINKED/VERBATIM/stubs/sha, tools-health OK) · git add phase-ends/CURRENT_PHASE.md .run/P32/t4e/*.log docs/progress.fleet.md .run/backlog.jsonl (whatever the reports regenerated) · commit "docs(phase-32): T4c close — …" · harness task #4 already done. If the chain had not finished (an EXIT= line missing), wait for it or re-run the missing step; never write a number you did not read from a log (R14/R58).
  2. T5 (Max, Tier 1 — prompt R27; WAIT for gate 2): P7 walk (T0–T4c; tick the parent T2 box) → the milestone demo as observable proofs (P9): the fleet R22 line (218/218, exits) · make tools-health OK · verbatim_check --strict 5 == 5 · the census 0 / 0 · the wall ledger — EMPTY (state that the milestone's "FINAL verdict" clause was not needed: every row banked) · make audit-disc (residue 0, UNCLAIMED 0 of 220 at the T4b close — re-run) · exclude_audit --assert-fresh config/wave_exclude.txt (0 entries) · make report ×3 metrics + main 143dbb89… (the WITH/WITHOUT-SDK-object-dirs dual was proven S79; re-run make report BINARY=main only unless Drew asks for the dual) · the denominators (main game-code: the digest prints 41,534; the corrected denominator is 41,556, the 22-ins Ghidra-boundary gap; at 0 stubs both read 100%). Then "🟡 PhaseEnd creation is a Tier 1 task. Confirm when ready." → WAIT for gate 2.
  3. On confirmation: phase-ends/PhaseEnd_Phase32.md (the PROJECT_CONTEXT format, every section): Build Log (the five onboarded modules T2b; the banks by commit — T1a c513e1fbb, T1b c7f5b498a, T1c 059266afc, T2c ×20, T3 ×39, T4b ×11 (S83) + 8fa12bc22
    • cdd9a2cb8 (S84/S85), T4c f9a90affb ffb1949a1; tools: payload_base_evidence.py, ghost_census.py, agent_drafts_restore.py, cc1_dumps.sh repair + -dL, cc1_dumps_tu.sh, alloc_table.py, bank.sh; verification results verbatim from the logs; milestone achieved: 0 stubs across 218 binaries, every remaining non-C byte is a PsyQ object or one of the 5 PERMANENT hand-asm bodies; Next = P33 verify + public flip) · Deviations (the T4b directive superseding the kill gate; T4c added by Drew after the T4b close; T2d not needed; the Opus pass banking 39 not 1–4; Fable used for the T4b first pass; two "final verdicts" (PROVED/PLATEAU) overturned by new producer knowledge — say so plainly) · Commit Message for Drew's milestone-close commit · Rules Added — R64 to RATIFY + candidates: (i) a wall verdict is pass-attributed with a dump line; (ii) write "banked" only from the tool's printed success line; (iii) agents write deliverables early; (iv) a helper refuses an empty work list; (v) a residual gets a PRODUCER CENSUS before a spelling sweep and "PROVED" names the list it was proved against (S85: two PROVED/ PLATEAU verdicts fell to producers missing from the list — §501-Q/R); (vi) a ledger's tie-break is part of the instrument; (vii) port a banked sibling's SPELLING before any dial (§501-N/P); (viii) a similarity score is not a shape oracle — grep the idiom's constants (§501-P); (ix) S85: build the 1-second reproducer battery for a mechanism BEFORE probing the 500-instruction function (accelerators (15)/(16)) · PhaseEnd Changelog v1.30.0 → v1.31.0 · Roadmap delta (P32 fully consumed; the frontier is empty; P33 = verify + public flip per roadmap v2 §3 P33, ≈2–4 sessions; the flip-timing checkpoint) · believed / failed / sooner (the walls were our censuses; every pin came off) · Plain-English Recap (R18/R25) · 🛑. Then phase-ends/DIGEST.md §0 (state), §2 (the P32 synopsis), §3 (R64 ratified + accepted candidates) — step 3b · git mv phase-ends/CURRENT_PHASE.md phase-ends/logs/Phase32.md (R19) · R23 (the SessionStart hook's headless Ghidra MCP: stop it cleanly if a stop script exists; no RE writes this phase → never stage ghidra/) · leave the PhaseEnd + the archived log UNCOMMITTED for Drew (R6) → "PhaseEnd file created. Commit the file and start a new Claude Code session for the next phase." → HARD STOP (P8).

4. Files, tools, exact invocations, gotchas

  • .run/P32/t4e/ (S85, tracked): NOTES.md (the whole T4c route), a1_ghost_unk07.c, b1…b56*.c + rtu_*.log, bank/func_80032A74.c
    • bank/func_80039308.c (the banked bodies), slate_*.json, gate_main_*.log, ghost/{g,h,k,r,s}*.c (the reproducers), the chain logs; ignored: rtu/, dumps_*/. .run/P32/t4d/ (row (d)), t4c/, t4b/, t5x/, t3s3/ (bank.sh), t3/, t4/.
  • Instruments: tools/rtu_match.py <fn> --split <sub> --tu src/<sub>.c --asm-subdir asm/nonmatchings/<sub> --c <draft> --work <dir> (main) · tools/gate_main.py <slate.json> --apply (main banks; slate = [{"fn":…,"draft":<abs path>}]; prints the BANKED line — "banked" is written ONLY from it) · .run/P32/t3s3/bank.sh (overlays) · tools/cc1_dumps_tu.sh <rtu work dir> <tag> + tools/alloc_table.py <tag> [fn] [root] · tools/cc1_dumps.sh <draft> <tag> + tools/ghost_census.py · tools/twin_rescan.py · tools/verbatim_check.py --strict · tools/frontier_classify.py --json <out> · tools/exclude_audit.py [--write OUT] [--assert-fresh] config/wave_exclude.txt · tools/backlog.py render.
  • Gotchas (live): make clean deletes asm/ — never run rtu_match/twin_rescan/frontier_classify while an R22 chain runs · gate_main rewrites main's asm/ too · the standalone cc1_dumps.sh is not faithful on main TUs (use cc1_dumps_tu.sh) · the cookbook index does not index bold §501-x sub-entries (--check still passes) · a u16 local can be a HImode pseudo in these TUs (not promoted) — that is the §501-R firewall · .run/P32/** allowlists are per-subdir · backticks inside a double-quoted --where are command substitution · grep "\$t2\b" anchors on $ — use '[$]t2[^0-9]'.

5. Environment

Fleet 218; shas: main 143dbb89f34491258bbc27810d0a12ec8b43a8dd · ov_SC03_105 d305ff6da199b52d0d44023766643a8b661ed524 (config/check.<b>.sha is authoritative). Toolchain unchanged (SETUP §5.4). The SessionStart hook launches a headless Ghidra MCP (.run/ghidra-mcp.log); nothing in T5 uses it (R23). Claude commits, Drew pushes.

6. Standing reminders

Every bank commits before the next command that can touch src/ (R42) · quote the fleet's green count at every close (R58) · verify a build from its exit code (R53) · a masked/permuter score is not a closeness until its diff is read (R63) · an __asm__ body that reproduces instructions is a verbatim, not a bank (R62) · port a banked sibling before dialing (§501-N/P) · census the PRODUCERS (§501-M/O/Q) and read the allocation ORDER (§501-R) before any spelling or pin · write "banked" only from the tool's printed success line · rules check every 4 tasks (P6) · harvest before the next step (R16/R30) · no Co-Authored-By (R5) · never stage ghidra/ (R23) · the PhaseEnd + archived log stay uncommitted for Drew (R6).

Plain-English recap (R18). This session finished the game's code: the last overlay function fell to a cousin's wording, and the last two main-program functions — one "proved" impossible and one stuck at four instructions for weeks — fell once two missing compiler behaviours were found and reproduced in five-line test programs: a bookkeeping gap that leaves an unused stack slot, and the exact source shape (an expression written three times, and a 16-bit accumulator) that makes the 1995 compiler hoist a value into the right register. Every register trick the earlier drafts carried turned out to be unnecessary. Not a single hand-translated function remains untranslated; what is left is the fleet-wide verification (already running in the background) and the phase's closing report, which needs Drew's sign-off.