diff --git a/docs/cookbook-index.md b/docs/cookbook-index.md index 2c234b54c..cb02bd488 100644 --- a/docs/cookbook-index.md +++ b/docs/cookbook-index.md @@ -2,7 +2,7 @@ > **Generated by `tools/cookbook_index.py` — do not hand-edit** (R33). Regenerate after adding a cookbook section. > -> `docs/matching-cookbook.md` is ~716 KB / 370 sections. Grepping it blind is how three P30 wave-1 agents each "discovered" an idiom that was already written down. **Start here, then read the section.** A section appears under every symptom it addresses. +> `docs/matching-cookbook.md` is ~716 KB / 371 sections. Grepping it blind is how three P30 wave-1 agents each "discovered" an idiom that was already written down. **Start here, then read the section.** A section appears under every symptom it addresses. **How to use:** name what you SEE in the diff (a stolen delay slot, an extra `la`, a swapped register pair, a `conflicting types` error), find that symptom below, read those sections first. If nothing fits, THEN grind — and add a section when you win. @@ -516,7 +516,7 @@ - **§3-The** — meta-lesson L8250 - **Wave** — economics (measured, for the next batch's sizing) L8943 -### (unbucketed — title matched no symptom vocabulary) (103) +### (unbucketed — title matched no symptom vocabulary) (104) - **§3-How** — to use this L30 - **§1** — Idiom catalog (asm pattern → C that produces it) L39 @@ -621,6 +621,7 @@ - **§3-The** — codegen idioms L8763 - **§3-The** — wave shape that produced these L8812 - **§136** — The LOCAL-VARIABLE lever: how many C locals, at what scope (P30 wave 4a, 25 byte-verified banks) L8830 +- **§136a** — Blocker capture: classify on the OUTPUT, never on the exit status L8966 ## All sections, in order @@ -995,3 +996,4 @@ - **§3-The** — scheduling rules (refining §135-2 and §135-4) L8902 - **§3-The** — declaration surface (integration, not codegen) L8931 - **Wave** — economics (measured, for the next batch's sizing) L8943 +- **§136a** — Blocker capture: classify on the OUTPUT, never on the exit status L8966 diff --git a/docs/family-hseq.md b/docs/family-hseq.md index db458de4a..aa294ad42 100644 --- a/docs/family-hseq.md +++ b/docs/family-hseq.md @@ -2,13 +2,13 @@ > Generated by `tools/family_hseq.py` from the 138 overlay sigs + per-overlay src stubs. Ranked by TEMPLATABLE byte-weight (PURE+IMM members × nins × 4). The byte-gate is the arbiter. > -> **Scope: the 138 OVERLAYS only** (no main, no resident) · generated at HEAD `commit:1354` · stub set derived from `corpus.stubs` — the same oracle `progress.py` counts, so same-tree overlay totals agree by construction; compare digests only at the same HEAD. +> **Scope: the 138 OVERLAYS only** (no main, no resident) · generated at HEAD `commit:1358` · stub set derived from `corpus.stubs` — the same oracle `progress.py` counts, so same-tree overlay totals agree by construction; compare digests only at the same HEAD. -**Fleet (overlays):** 95.7% fn / 92.9% instr / 86.5% distinct-code matched. Unmatched: 15,138 instances / 933,914 ins (11,496 distinct classes). +**Fleet (overlays):** 95.8% fn / 93.0% instr / 86.9% distinct-code matched. Unmatched: 14,884 instances / 911,088 ins (11,262 distinct classes). -**Tail cross-check (Phase-25 close):** 8,678 tail fns / 422,483 ins → 463 h_seq families ≥2, **125 substantial (nins≥80) / 113,566 ins**. +**Tail cross-check (Phase-25 close):** 8,641 tail fns / 418,067 ins → 460 h_seq families ≥2, **122 substantial (nins≥80) / 109,184 ins**. -**Full frontier (all unmatched by h_seq):** 2242 target families (≥2 members or a matched sibling) + 3767 singletons (Step-D residue). Substantial: **451 families / 410,083 templatable ins**, 32 with a matched sibling (zero-crack). Substantial member classes: 2,388 PURE · 31 IMM · 6 STRUCT-excluded. +**Full frontier (all unmatched by h_seq):** 2223 target families (≥2 members or a matched sibling) + 3767 singletons (Step-D residue). Substantial: **439 families / 392,870 templatable ins**, 20 with a matched sibling (zero-crack). Substantial member classes: 2,218 PURE · 31 IMM · 6 STRUCT-excluded. ## Top substantial families (by templatable byte-weight) @@ -27,20 +27,20 @@ | 10 | 246 | 16 (16/0/0) | 6/16 | cross-address | PURE | 0 | · | 0x8017c294 draft-ov077 | 3,936 | | 11 | 766 | 5 (5/0/0) | 3/5 | cross-address | PURE | 0 | · | 0x8017df84 modal | 3,830 | | 12 | 328 | 11 (11/0/0) | 11/11 | scattered | PURE | 0 | · | 0x801833f0 modal | 3,608 | -| 13 | 890 | 4 (4/0/0) | 1/4 | per-location | PURE | 134 | Y | 0x80178d40 matched-ov077 | 3,560 | -| 14 | 237 | 15 (15/0/0) | 15/15 | scattered | PURE | 0 | · | 0x801832a8 modal | 3,555 | -| 15 | 253 | 14 (14/0/0) | 10/14 | scattered | PURE | 0 | · | 0x8017c9bc modal | 3,542 | -| 16 | 491 | 7 (7/0/0) | 6/7 | cross-address | PURE | 0 | Y | 0x801863cc modal | 3,437 | -| 17 | 166 | 20 (20/0/0) | 20/20 | scattered | PURE | 0 | · | 0x8017fac0 modal | 3,320 | -| 18 | 293 | 11 (11/0/0) | 4/11 | cross-address | PURE | 0 | · | 0x8017c43c modal | 3,223 | -| 19 | 770 | 4 (4/0/0) | 1/4 | per-location | PURE | 134 | · | 0x80144b9c matched-ov077 | 3,080 | -| 20 | 611 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | · | 0x80186e24 modal | 3,055 | -| 21 | 263 | 11 (11/0/0) | 11/11 | scattered | PURE | 0 | · | 0x80182fd4 modal | 2,893 | -| 22 | 557 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | Y | 0x80186570 modal | 2,785 | -| 23 | 185 | 15 (15/0/0) | 13/15 | scattered | PURE | 0 | · | 0x8018b23c modal | 2,775 | -| 24 | 551 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | Y | 0x80189540 modal | 2,755 | -| 25 | 125 | 22 (22/0/0) | 22/22 | scattered | PURE | 0 | Y | 0x80185440 modal | 2,750 | -| 26 | 386 | 7 (7/0/0) | 6/7 | cross-address | PURE | 0 | · | 0x80186b78 modal | 2,702 | +| 13 | 237 | 15 (15/0/0) | 15/15 | scattered | PURE | 0 | · | 0x801832a8 modal | 3,555 | +| 14 | 253 | 14 (14/0/0) | 10/14 | scattered | PURE | 0 | · | 0x8017c9bc modal | 3,542 | +| 15 | 491 | 7 (7/0/0) | 6/7 | cross-address | PURE | 0 | Y | 0x801863cc modal | 3,437 | +| 16 | 166 | 20 (20/0/0) | 20/20 | scattered | PURE | 0 | · | 0x8017fac0 modal | 3,320 | +| 17 | 293 | 11 (11/0/0) | 4/11 | cross-address | PURE | 0 | · | 0x8017c43c modal | 3,223 | +| 18 | 770 | 4 (4/0/0) | 1/4 | per-location | PURE | 134 | · | 0x80144b9c matched-ov077 | 3,080 | +| 19 | 611 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | · | 0x80186e24 modal | 3,055 | +| 20 | 263 | 11 (11/0/0) | 11/11 | scattered | PURE | 0 | · | 0x80182fd4 modal | 2,893 | +| 21 | 557 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | Y | 0x80186570 modal | 2,785 | +| 22 | 185 | 15 (15/0/0) | 13/15 | scattered | PURE | 0 | · | 0x8018b23c modal | 2,775 | +| 23 | 551 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | Y | 0x80189540 modal | 2,755 | +| 24 | 125 | 22 (22/0/0) | 22/22 | scattered | PURE | 0 | Y | 0x80185440 modal | 2,750 | +| 25 | 386 | 7 (7/0/0) | 6/7 | cross-address | PURE | 0 | · | 0x80186b78 modal | 2,702 | +| 26 | 890 | 3 (3/0/0) | 1/3 | per-location | PURE | 135 | Y | 0x80178d40 matched-ov077 | 2,670 | | 27 | 177 | 15 (15/0/0) | 13/15 | scattered | PURE | 0 | · | 0x8018aa98 modal | 2,655 | | 28 | 513 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | Y | 0x801878e8 modal | 2,565 | | 29 | 154 | 15 (15/0/0) | 15/15 | scattered | PURE | 0 | · | 0x8018389c modal | 2,310 | diff --git a/docs/matching-cookbook.md b/docs/matching-cookbook.md index 794d99f29..b841974e7 100644 --- a/docs/matching-cookbook.md +++ b/docs/matching-cookbook.md @@ -8962,3 +8962,29 @@ an Opus pass on most of the 60–120 band.** `index_hit` was **13 true / 18 false** — the index is now the bottleneck the cookbook itself was in wave 1, which is why the 31 gap reports above are worth more than the matches. + +### §136a — Blocker capture: classify on the OUTPUT, never on the exit status + +The reconcile lane only runs 12/12 because each agent is handed the compiler's own error line +(§135, the S29 law). Capturing those lines needs one care point, learned the hard way this session: + +**`make build` runs `check`, so a draft that COMPILES PERFECTLY and merely produces different bytes +also exits non-zero.** A capture tool that branches on `returncode == 0` to mean "compiled fine ⇒ +byte DIFF" therefore has an **unreachable branch**, and silently files every genuine byte-DIFF under +"unknown". Classify on what the build PRINTED: + +| what the output shows | class | route | +|---|---|---| +| a non-`warning` line matching `error` / `conflicting types` / `undefined` | **PLUMBING** | reconcile lane — hand the agent the line verbatim | +| no compiler error, but `[FAIL] / got / want ` | **DIFF** | redraft lane — the C is wrong, not the declarations | +| neither | UNKNOWN | investigate; do not route | + +Note the filter must exclude `warning:` lines: the same `conflicting types for …` text appears as a +*warning* for built-ins (`memcpy`) and for benign external-decl mismatches, and those do NOT block +the bank. Only the hard-error form does. + +Measured on wave 4a's 10 gate failures: **7 PLUMBING / 3 DIFF** — i.e. **70% of "the gate refused" +was declaration paperwork, not codegen.** That ratio is why the capture step is worth its ~10 builds +before any reconcile fan-out. Tool: `.run/s7_capture.py` (any overlay, any draft dir; the +ov_SC01_077-only `.run/uc_capture.py` is its ancestor). It reverts the TU in a `finally:` — a killed +process performs no undo (the S27 law). diff --git a/docs/progress.fleet.md b/docs/progress.fleet.md index 601b74164..5ef042e70 100644 --- a/docs/progress.fleet.md +++ b/docs/progress.fleet.md @@ -4,16 +4,16 @@ # cross-binary collapsible-byte leverage: docs/duplicates.cross.md. # THREE progress metrics (all matter — see the labels): -FLEET fn-count byte-ident: 337779 / 353721 = 95.49% (REAL+LINKED+empties; FUNCTION-count, ×134-inflated — one crack counts per overlay) -FLEET instr-weighted : 12168323 / 13141652 = 92.6% (shipped .text across main + resident + 138 overlays; the decomp.dev-DISPLAY number) -FLEET distinct-code(uniq): 4841288 / 5634875 = 85.9% (76180/87459 unique fns; the DISTINCT-RE number) +FLEET fn-count byte-ident: 337791 / 353721 = 95.50% (REAL+LINKED+empties; FUNCTION-count, ×134-inflated — one crack counts per overlay) +FLEET instr-weighted : 12172119 / 13141652 = 92.6% (shipped .text across main + resident + 138 overlays; the decomp.dev-DISPLAY number) +FLEET distinct-code(uniq): 4845084 / 5634875 = 86.0% (76192/87459 unique fns; the DISTINCT-RE number) MAIN game-code weighted : 436 / 60201 = 0.7% (INCLUDED in the fleet numbers above since 2026-07-22 — roadmap §1 metrics contract; LINKED-excluding Ghidra sig dated 2026-06-14; caveat is R34: no independent second oracle for a PS-X EXE, NOT drift) - (fleet EXCLUDING main, for continuity with pre-2026-07-22 readings: 12167887 / 13081451 = 93.0%) + (fleet EXCLUDING main, for continuity with pre-2026-07-22 readings: 12171683 / 13081451 = 93.0%) -FLEET REAL substantive : 335924 (of which dedup-shared 240422 via 1905 groups / 240496 instances) +FLEET REAL substantive : 335936 (of which dedup-shared 240422 via 1905 groups / 240496 instances) FLEET LINKED PsyQ objs : 959 FLEET NON_MATCHING : 7 (0 in any default build — G4) -FLEET INCLUDE_ASM stubs : 15935 +FLEET INCLUDE_ASM stubs : 15923 FLEET matchable : 353721 | binary | REAL | shared | LINKED | byte-ident | matchable | byte-ident % | @@ -152,9 +152,9 @@ FLEET matchable : 353721 | ov_SC07_000 | 2413 | 1748 | 0 | 2415 | 2521 | 95.8% | | ov_SC07_001 | 2390 | 1744 | 0 | 2392 | 2454 | 97.5% | | ov_SC07_002 | 2430 | 1744 | 0 | 2434 | 2579 | 94.4% | -| ov_SC07_006 | 2281 | 1560 | 0 | 2361 | 2456 | 96.1% | -| ov_SC07_007 | 2310 | 1592 | 0 | 2394 | 2613 | 91.6% | +| ov_SC07_006 | 2284 | 1560 | 0 | 2364 | 2456 | 96.3% | +| ov_SC07_007 | 2313 | 1592 | 0 | 2397 | 2613 | 91.7% | | ov_SC07_008 | 2373 | 1744 | 0 | 2373 | 2386 | 99.5% | | ov_SC07_009 | 2382 | 1744 | 0 | 2384 | 2430 | 98.1% | -| ov_SC07_010 | 2292 | 1614 | 0 | 2375 | 2524 | 94.1% | -| ov_SC07_011 | 2311 | 1591 | 0 | 2391 | 2449 | 97.6% | +| ov_SC07_010 | 2295 | 1614 | 0 | 2378 | 2524 | 94.2% | +| ov_SC07_011 | 2314 | 1591 | 0 | 2394 | 2449 | 97.8% | diff --git a/phase-ends/CURRENT_PHASE.md b/phase-ends/CURRENT_PHASE.md index 83eb3f918..4649b91df 100644 --- a/phase-ends/CURRENT_PHASE.md +++ b/phase-ends/CURRENT_PHASE.md @@ -147,7 +147,120 @@ stub on a named wall/behemoth/queue ledger** — 140/140 byte-identical througho --- -# 🛑 SESSION-30 CHECKPOINT (2026-08-01, S6 complete through wave 3) — FRESH SESSION SAFE HERE +# 🛑 SESSION-31 CHECKPOINT (2026-08-03, wave 4a + S6c banked) — FRESH SESSION SAFE HERE +> Supersedes SESSION-30 below. **Nothing is running. Tree lock FREE. Tree CLEAN** but for the R23 +> `db.*.gbf` churn — never stage it. Effort: **ultracode** (Drew enabled at session start). +> `make tools-health` **RC=0 at session open**. **R22 clean-fleet run TWICE this session, 140/140 +> both times** (after wave 4a, and after the S6c series). + +## FLEET — R22 clean-fleet **140 passed / 0 failed of 140** (`make clean` + extract-all + check-all) +**95.50% fn-count · 92.6% instr-weighted · 86.0% distinct-code** (76,192 / 87,459 unique fns) · +dedup **1905/0** · C1 240496/240496 · **0 NON_MATCHING** in any default build (G4). +Phase opened 92.00 / 87.5 / 78.0 ⇒ **+3.50pp fn, +5.1pp instr, +8.0pp distinct this phase.** +*(`.run/family_hseq.json`'s metrics read ~0.3–1.0pp higher — that is the OVERLAY-ONLY denominator, +not a disagreement. `make report` is the authoritative fleet number.)* + +## WHAT S7 DID — 286 function-instances, two lanes +**Lane 1 — wave 4a (agents): 274 instances from 33 drafted targets.** +**Lane 2 — S6c (deterministic, ~0 agent tokens): 12 sibling banks.** +`commit:1355` — 33 targets / 46 agents / **4.44M tokens** / 29 min → 29 claimed `match_one` MATCH → +whole-binary gate **BANKED 23/33 (70%)** → `family_sweep --hseq --band all` propagated +**251 member-matches across 69 overlays** (13 failed, 4 STRUCT skipped by design). + +**Bank rate by the tier that produced the FINAL draft** (derived per-function; the workflow's +`by_tier` counts CLAIMED matches and sums to 29, not 23 — do not read it as banks): +| tier | banked / attempted | +|---|---| +| Opus direct (≥90 ins) | 10 / 14 | +| Haiku direct (≤89 ins) | **3 / 8** | +| Opus escalation after a Haiku miss | **10 / 11** | +⇒ on the 60–120-ins band the cheap tier is **triage, not a substitute** (it is ≡ Opus only at +≤~50 ins). The two-lane shape still pays *because the escalation almost never fails.* + +## S6c — the 9 jr zero-crack families: 12 banked, 6 families ledgered, ALL banks in the SC07 quartet +Probe-one-sibling-per-family first (R37) — it spared ~20 builds each on six families: +| family | ins | slots | outcome | +|---|---|---|---| +| `func_80178D40` | 890 | 4 | **4/4 BANKED** | +| `func_801734BC` | 34 | 4 | **4/4 BANKED** | +| `func_8012ACE0` | 25 | 4 | **4/4 BANKED** | +| `func_801380E0` · `func_80191C50` · `func_8019059C` · `func_8013FFD8` · `func_8016AE5C` | 438/710/673/213/85 | 10 | **gate-fail — genuine byte DIFF** | +| `func_8016AB6C` | 188 | 4 | **carve-fail** — span table starts do not fit the span | + +**Every one of the 12 banks landed in `ov_SC07_006/007/010/011`** — the four overlays P27 discovered +and P28 made citizens (R36). P28 drained their **h_exact** backlog via `dedup_extend`; the **jr/h_seq +propagation lane was still owed**, and this was it. ⚠️ **But do NOT over-read that:** the SC07 quartet +are the top four overlays by remaining zero-crack residue (2,190–2,355 ins each vs 500–870 typical, +~3–4×) yet hold only **7% of the 2,114 remaining slots**. It is a per-overlay priority signal, NOT a +bulk lever — the non-jr zero-crack residue is genuinely fleet-wide (120 families / 65,946 ins). + +## 🎯 THE 10 WAVE-4a GATE FAILURES ARE CAPTURED AND CLASSIFIED → `.run/s7_blockers.json` +**7 PLUMBING / 3 genuine byte-DIFF** — i.e. **70% of "the gate refused" is declaration paperwork.** +- **PLUMBING (→ reconcile lane, feed each agent its line VERBATIM):** `func_80185254`(SC02_026, + `conflicting types for func_8012C1B8`) · `func_8018362C`(SC02_035, `func_8012B200`) · + `func_80183A14` + `func_80183B20`(SC02_035, both `func_80183E68` — ONE shared TU, so **forbid agent + builds**, §135) · `func_8017E654`(SC02_041, `func_8012BF4C`) · `func_8017BF50`(SC03_001, + `func_8012913C`) · `func_8017CDB0`(SC03_002, `func_801439C0`). +- **DIFF (→ redraft, the C is wrong, not the declarations):** `func_8017E978`(SC01_005) · + `func_80184494`(SC02_026) · `func_80184960`(SC04_018). *(`func_8017E978`'s original agent died on + the session limit, so it is effectively undrafted.)* +- Tool: **`.run/s7_capture.py`** — any overlay, any draft dir (the ov_SC01_077-only + `.run/uc_capture.py` is its ancestor); reverts the TU in a `finally:`. + +## 📓 COOKBOOK §136 + §136a — the phase's largest single-wave idiom yield (R30, written in-session) +19 byte-verified idioms from 25 banked functions' `index_gap` reports. The finding: +**in the 60–120-ins band most "regalloc residuals" are decided by HOW MANY C LOCALS YOU DECLARE AND +AT WHAT SCOPE, not by register pins** — `local-alloc.c:472` refuses a local allocno with +`REG_N_DEATHS > 1`, promoting it to a global allocno that loses the low register. One case +explicitly **refutes the pin** as the lever for a redundant copy (source position is the lever). +**§136a** adds the capture law: **classify on the build's OUTPUT, never its exit status** — +`make build` runs `check`, so a draft that compiles perfectly and merely differs in bytes ALSO exits +non-zero; an `rc == 0 ⇒ DIFF` branch is unreachable and files every real byte-DIFF under "unknown" +(my own defect this session, caught and fixed). Index regenerated **364 → 371** sections, green. +⚠️ Agents self-reported `index_hit` **13 true / 18 false** — *discoverability of our own knowledge, +not the compiler, is the drafting bottleneck.* The 31 gap reports are worth more than the matches. + +## ⚠️ THREE THINGS A FRESH SESSION MUST NOT INHERIT UNCHECKED +1. **The T6 ROI-floor trigger stays REFUTED** (S30's finding, re-confirmed): the ×138-era-ends + trigger was wrong. Re-derive from a freshly regenerated `family_hseq` before any close. +2. **My S6c probe first reported 1/9 — it was 1 bank + 8 CORRECT REFUSALS, not 8 failures.** + `jtbl_family_bank` refuses on a dirty `config/`+`src/` (its per-sibling revert restores from + HEAD, so an uncommitted prior bank would be destroyed). My driver did not commit between + families. **A uniform failure across N different functions is a statement about the mechanism, + not the functions** (§134). Fixed: `.run/s7_s6c.py` now commits between families. +3. **The session hit the agent limit mid-wave** (3 agents died on it; resets 4:20am America/Denver). + Agent capacity is NOT assumable — and the measured economics favour the deterministic lanes + anyway (S30: sweeps ≈0 tokens for +0.5pp; wave-3 ≈4.1M for +0.3pp). + +## 📊 THE LIVE QUEUE — re-derived at HEAD from the regenerated map (overlay-only ins) +| lever | families | templ ins | note | +|---|---|---|---| +| B-shape ≥20 memb, ≤60 ins | **0** | 0 | exhausted (was 36 at S30 open) | +| B-shape ≥10 memb, **61-120 ins** | **10** | **10,003** | wave 4a consumed 23 of the 33 | +| B-shape 10-19 memb, ≤60 ins | **111** | **33,554** | **wave 4b, staged in 3 batches of 37** | +| zero-crack `has_mid_jr` (S6c) | 6 | ~5,600 | **DONE** — 12 banked; the 6 left are gate/carve-fail, ledger material | +| zero-crack non-jr residue | 120 | 65,946 | fleet-wide (2,114 slots); SC07 quartet = top 4 but only 7% | +| fresh ×2-9 | 1,872 | 362,591 | worst multiplier — deprioritised | +| fresh ×1 singletons | 3,800 | 231,284 | ×1 — deprioritised | +Unmatched fleet-wide: **14,887 instances / 912,037 ins**. + +## ▶ RESUME HERE (nothing blocked, nothing running; the agent limit resets 4:20am America/Denver) +1. **The reconcile lane on the 7 PLUMBING failures** — blockers already captured in + `.run/s7_blockers.json`; hand each agent ITS line verbatim. **`func_80183A14` + `func_80183B20` + share one TU ⇒ forbid agent builds for those two** (§135's concurrency hazard). This lane has run + **12/12** across waves 2–3 and is the most reliable stage in the pipeline. +2. **Wave 4b** — 3 batches of 37, args at `.run/s7_wave4b_{1,2,3}.json`, script + `.run/s7_wave4b.js` (takes `{targets, extra}`; **`extra` is where §136's idioms go** — that + promotion is the 83%→93% law). Batch 1 carries the 4 wave-3 retries with pointers to their prior + drafts. Both wave scripts now parse args-as-string and assert `Array.isArray`, so the roadmap's + "args must be an array" gotcha cannot silently kill a launch again (it killed wave 4a's first). +3. **The 3 DIFF failures** → redraft lane, not reconcile (their C is wrong, byte-proven). +4. **T5 close** — only after re-deriving from a freshly regenerated `family_hseq`; the checklist's + ROI-floor trigger is REFUTED and must not be used to close the phase. + +--- + +# 🛑 (superseded) SESSION-30 CHECKPOINT (2026-08-01, S6 complete through wave 3) > **Nothing is running. Tree lock FREE. Tree CLEAN** (0 non-ghidra entries; the `db.*.gbf` churn is > R23 restart-noise — never stage). **HEAD `commit:1352`.** Effort: xHigh → **ultracode** (Drew enabled > mid-session for the waves). `make tools-health` green at session open; frontier REGENERATED at HEAD