Commit Graph

342 Commits

Author SHA1 Message Date
Drew T 96f4e0ed5d feat(decomp): S67-wave-jtbl gate — +1 fns x2 propagated (fleet 99.2%) 2026-08-31 12:23:50 -06:00
Drew T 257b9d8a3b feat(decomp): S67-wave gate — +2 fns x1 propagated (fleet 99.2%) 2026-08-31 10:31:15 -06:00
Drew T 1c21f0a1e2 feat(decomp): S67-cc1 gate — +1 fns x3 propagated (fleet 99.2%) 2026-08-31 04:10:27 -06:00
Drew T 838d7cea34 feat(decomp): parallel gate — 179 fns across 102 binaries (10 workers)
md_MAIN_037    func_800CAF4C
  md_MAIN_028    func_800CAE0C
  md_MAIN_015    func_800CAEC0
  md_MAIN_029    func_800CAEE0
  md_MAIN_013    func_800CAF68 func_800CB6E4
  md_MAIN_020    func_800CAF18 func_800CB034
  md_MAIN_001    func_800CEF04
  md_MAIN_033    func_800CAE0C
  md_MAIN_023    func_800CAEC0
  md_MAIN_003    func_800D06BC
  md_MAIN_043    func_800CD1F4
  md_MAIN_041    func_800CAEC0 func_800CAF08
  md_MAIN_038    func_800CAE0C func_800CAED0
  md_MAIN_047    func_800CCB28
  md_MAIN_046    func_800CCB28
  md_SC03_073    func_801EFBC0
  md_MAIN_040    func_800CAED0
  md_SC03_075    func_801EFBC0
  md_SC03_132    func_801E2D50
  md_SC04_025    func_801E855C
  md_SC04_029    func_801E8440
  md_SC03_137    func_801E2ED8
  md_SC04_026    func_801E82C0
  md_SC05_023    func_801EDEAC func_801EE148
  md_SC05_024    func_801EDEAC func_801EE3E4
  md_SC03_133    func_801E2FF4
  md_SC05_025    func_801EDEAC func_801EE148
  md_SC05_028    func_801EE2C8
  ov_MAIN_012    func_8016829C
  ov_SC01_001    func_80180890
  ov_SC01_074    func_8017D918
  ov_SC01_077    func_80184A68
  ov_SC01_084    func_8017E224 func_8017E890 func_8017E94C
  ov_SC01_009    func_8017FE10
  ov_SC02_026    func_8017D948
  ov_SC02_004    func_8017D8B0
  ov_SC02_031    func_8017F400 func_801829F8
  ov_SC02_035    func_8017D598
  ov_SC02_021    func_8017DC10 func_8017F264
  ov_SC02_017    func_8017FCB8 func_8018287C func_80183940
  ov_SC02_027    func_8017F498
  ov_SC02_011    func_80182380
  ov_SC02_005    func_8017E014 func_8017FDB4 func_801800CC func_80180328 func_801803BC func_80180454 func_80180B90 func_8018112C func_8018118C func_80181388 func_8018141C func_80182098 func_801849E4 func_80185858 func_8018655C func_801880AC func_801886C4 func_8018B5E0 func_8018D574
  ov_SC03_001    func_8017EFD4 func_8017F258 func_80180E68 func_8018166C func_8018247C func_80184A1C func_80186A04
  ov_SC03_012    func_8017DCB4
  ov_SC03_011    func_8017E170
  ov_SC03_014    func_8017BFA0
  ov_SC03_002    func_801813E4
  ov_SC03_024    func_8017BFA0 func_8017DA98 func_80180230 func_80180660 func_801806D4 func_80180748 func_801807AC func_801809F8 func_801817A8 func_80184814 func_80184884 func_80184940
  ov_SC03_007    func_8017E6C0
  ov_SC03_028    func_80185344
  ov_SC03_010    func_8017E69C
  ov_SC03_030    func_8017EEE0
  ov_SC03_091    func_801822CC
  ov_SC03_089    func_80181474
  ov_SC03_093    func_8017F8D8
  ov_SC03_096    func_8017F444
  ov_SC03_097    func_8017EE04 func_8017EF54 func_8017FDBC
  ov_SC03_029    func_80182E84 func_80183E70
  ov_SC03_090    func_801814B4
  ov_SC03_092    func_8017F29C
  ov_SC03_105    func_8017FEA8
  ov_SC03_111    func_8018093C func_80181178
  ov_SC03_116    func_801819F4
  ov_SC03_112    func_8017E9A0 func_80181D08
  ov_SC03_110    func_8017F234
  ov_SC03_114    func_8017CFC0 func_8017DDA0
  ov_SC03_117    func_8017E99C
  ov_SC03_121    func_8017CE3C
  ov_SC03_118    func_8017DA98
  ov_SC03_124    func_8017FB04 func_80180D48 func_80182488
  ov_SC03_125
2026-08-30 09:50:49 -06:00
Drew T 375238f6df feat(decomp): parallel gate — 71 fns across 47 binaries (10 workers)
ov_SC02_028    func_8018754C
  ov_SC02_005    func_8018BFBC
  ov_SC02_026    func_8017F390 func_8017F538
  ov_SC02_035    func_801803A4
  ov_SC03_015    func_8017DD7C
  ov_SC02_031    func_80181AE0
  ov_SC03_023    func_8017DAD0
  ov_SC03_093    func_8017F768
  ov_SC03_095    func_8017DD30
  ov_SC03_029    func_80187118
  ov_SC03_089    func_80184A08 func_8018545C
  ov_SC03_091    func_80184B28 func_8018558C func_80187954
  ov_SC03_096    func_8017EDAC func_8017F308
  ov_SC03_090    func_80183C3C func_80184958 func_80186AAC func_8018AA88
  ov_SC03_024    func_8017DD7C
  ov_SC03_100    func_80180E18
  ov_SC03_104    func_80181AD0 func_80181CA8 func_80181EA0 func_801827EC
  ov_SC03_112    func_8018172C
  ov_SC03_110    func_8017FB14 func_80180AF0
  ov_SC03_108    func_8017F788 func_8017FD08
  ov_SC03_101    func_801807F4 func_80181374
  ov_SC03_097    func_80180294 func_801803FC
  ov_SC03_115    func_8017E998 func_8017EFB8
  ov_SC03_124    func_801836B8
  ov_SC03_119    func_8017DD7C
  ov_SC03_114    func_8017D740
  ov_SC03_125    func_80180230
  ov_SC03_118    func_8017DD7C
  ov_SC04_007    func_8017F01C
  ov_SC04_010    func_8017D6C4
  ov_SC04_020    func_8017FAD4
  ov_SC04_005    func_8017F5E0
  ov_SC04_019    func_8018B2B8 func_8018B400
  ov_SC05_001    func_80184028 func_80184430
  ov_SC05_006    func_8017F16C
  ov_SC05_004    func_8017F188
  ov_SC05_010    func_80187B80
  ov_SC05_007    func_8017F568
  ov_SC06_000    func_8017DD7C
  ov_SC06_024    func_80186CF0
  ov_SC06_020    func_801808F4 func_8018348C func_801834F0
  ov_SC06_018    func_80188234 func_8018931C
  ov_SC06_022    func_8017F9FC func_801809D4 func_80184818 func_80187414
  ov_SC06_033    func_80187E08
  ov_SC07_002    func_8018672C
  ov_SC07_009    func_8017CFC0
  ov_SC06_030    func_8017DE08
2026-08-29 18:57:37 -06:00
Drew T 277df834b2 feat(decomp): parallel gate — 178 fns across 61 binaries (10 workers)
ov_SC03_093    func_80181ED4 func_80182288
  ov_SC03_095    func_80180654 func_80180850
  ov_SC03_096    func_8017FE4C func_8018001C func_80180208
  ov_SC03_094    func_80183A3C
  ov_SC03_107    func_80180F88
  ov_SC03_103    func_801835F8
  ov_SC03_098    func_801821C8
  ov_SC03_104    func_80181EF4 func_8018312C func_80183318 func_80184200
  ov_SC03_109    func_8017D790 func_8017D8E0 func_8017DB84 func_8017E024
  ov_SC03_101    func_801806B8 func_80180BAC func_80180E50 func_80183670
  ov_SC03_110    func_8017FFC8
  ov_SC03_097    func_80181A64 func_80184A2C func_80184D28
  ov_SC03_108    func_8017E27C func_8017EA44 func_8017FC3C func_801808B4 func_801809A0
  ov_SC03_115    func_8017DAC8 func_8017E2F4
  ov_SC03_113    func_8017FB98 func_801829C8
  ov_SC03_121    func_8017FA84
  ov_SC03_111    func_80183A7C
  ov_SC03_112    func_8017E70C func_8017FCF4 func_8017FDB8 func_8017FE90 func_80180388 func_8018276C func_80182858 func_80182944 func_80182B20
  ov_SC03_125    func_8017EA68 func_8017F590 func_8017F804 func_801804CC
  ov_SC03_119    func_8017CFBC func_8017DE24 func_8017F7F0 func_8018244C func_801831D0 func_801856B4 func_801881D8
  ov_SC03_118    func_8017CFBC func_8017DE24 func_8017F7F0 func_8018244C func_801856B4 func_801881D8
  ov_SC03_126    func_8017C014 func_8017E508 func_8017E98C func_8017EDB8
  ov_SC03_124    func_8017EB84 func_8017F268 func_80181D40 func_801832A8 func_8018A250
  ov_SC04_000    func_8017EA54 func_80182BA8
  ov_SC04_003    func_8017FD38
  ov_SC04_004    func_8017F9AC func_801823F4
  ov_SC04_007    func_8018084C func_80180D98 func_80181B98
  ov_SC04_002    func_80184DC8 func_8018615C
  ov_SC04_006    func_8017EDF4 func_8017EE34 func_8017F354
  ov_SC04_008    func_8017DC54 func_8017DCB4
  ov_SC04_012    func_8017DD84
  ov_SC04_005    func_8017FCA0 func_80181998 func_801846E4 func_80187928 func_801879E4
  ov_SC04_020    func_8017E558 func_8017EA40 func_8017FD70 func_8017FED0 func_80180554 func_80180AF0 func_80180EE0
  ov_SC04_019    func_8017DD0C func_80183578 func_80183BC4 func_8018651C func_801877B0
  ov_SC04_018    func_8017DD0C func_80183578 func_80183BC4 func_8018651C func_801877B0
  ov_SC05_004    func_8017EFD4 func_80180F18 func_80180FA8 func_8018101C func_8018125C
  ov_SC05_003    func_801804CC func_80180CE8
  ov_SC04_021    func_8017C014 func_8017E508 func_8017E98C func_8017EDB8
  ov_SC05_005    func_8017E9F8
  ov_SC05_007    func_8017E8A4
  ov_SC05_009    func_8017E9E8
  ov_SC05_008    func_80180698 func_80182054
  ov_SC05_010    func_801861D0 func_80186E94
  ov_SC06_000    func_80184CBC
  ov_SC05_019    func_8017C014 func_8017E508 func_8017E98C func_8017EDB8
  ov_SC06_011    func_8017F3C8 func_801801AC
  ov_SC05_018    func_8017E558 func_80181204 func_80182F78 func_8018375C
  ov_SC05_017    func_8017DD0C func_8018BE14
  ov_SC06_013    func_8017E7E8
  ov_SC06_014    func_8017D4C8 func_8017FB4C
  ov_SC06_015    func_8017D174 func_8017E6A4
  ov_SC06_016    func_801821D4
  ov_SC06_024    func_80184D68
  ov_SC06_018
2026-08-29 18:43:08 -06:00
Drew T a4d2fd62d3 feat(t5): Claude wave t5z — 5 banked (sonnet 4/4, opus 1/1); fleet 213 passed, 0 failed of 213 (P31 S62 T5) 2026-08-29 17:31:30 -06:00
Drew T 8033919966 feat(decomp): free A-prop sibling lane (maintenance pass) — zero model tokens 2026-08-26 03:44:58 -06:00
Drew T 72411637b5 chore(decomp): commit in-tree banked work before the serial lane 2026-08-25 20:23:08 -06:00
Drew T 9b300a570f chore(decomp): commit in-tree banked work before the serial lane 2026-08-25 20:17:33 -06:00
Drew T 274932d209 chore(decomp): commit in-tree banked work before the serial lane 2026-08-25 16:06:04 -06:00
Drew T 7713700d72 feat(decomp): ox wave dj overlays — 43 banked
Committed before the main batch: gate_main reverts on failure and would take these with it.
2026-08-25 12:21:43 -06:00
Drew T 5357c8b448 feat(decomp): ox wave de overlays — 192 banked
Committed before the main batch: gate_main reverts on failure and would take these with it.
2026-08-25 11:17:00 -06:00
Drew T 488e009bd1 feat(decomp): ox wave cd overlays — 18 banked
Committed before the main batch: gate_main reverts on failure and would take these with it.
2026-08-24 23:00:38 -06:00
Drew T 0de85bc8d2 feat(decomp): ox wave bj overlays — 19 banked
Committed before the main batch: gate_main reverts on failure and would take these with it.
2026-08-24 15:56:26 -06:00
Drew T e1479c1900 feat(decomp): ox wave bh overlays — 155 banked
Committed before the main batch: gate_main reverts on failure and would take these with it.
2026-08-24 10:52:11 -06:00
Drew T 87e8565bc6 feat(phase-26): h_seq family sweep — 50 member-matches banked via remap_hseq 2026-08-18 14:58:40 -06:00
Drew T c7b1fc507a feat(phase-31): worker gate — +1 fns x0 propagated (fleet 95.3%) 2026-08-14 21:41:13 -06:00
Drew T 3a0e1dad49 feat(phase-31): worker gate — +1 fns x0 propagated (fleet 95.3%) 2026-08-14 20:58:25 -06:00
Drew T e6e462c6d1 feat(decomp): worker gate — +1 fns x0 propagated (fleet 95.2%) 2026-08-14 02:53:03 -06:00
Drew T c2a02f8404 feat(decomp): worker gate — +1 fns x0 propagated (fleet 95.2%) 2026-08-13 17:04:24 -06:00
Drew T 49cf2dc15a feat(decomp): worker gate — +1 fns x17 propagated (fleet 95.1%) 2026-08-12 22:56:40 -06:00
Drew T 63bb8f8959 feat(decomp): worker gate — +1 fns x36 propagated (fleet 95.1%) 2026-08-12 22:47:24 -06:00
Drew T c55ad64614 feat(phase-30 S48-T6): wave 6 — 24 exemplars banked; the gate-refusal ROOT CAUSE found
Wave 6 (wf_9729fd89-c16, 76 agents, 6.7M tok): 40 targets -> 35 agent-MATCH,
1 refuted, 0 UNVERIFIED (the new field works), 4 NEAR -> 24 BANKED.

*** THE FINDING OF THE CAMPAIGN, and it is not a compiler idiom ***
func_8017F2D4 had been "MATCH standalone / DIFF at gate" SEVEN times across
five waves. Every attempt hunted codegen. The body was byte-correct the whole
time. The fault was that the prior notes named the WRONG DESTINATION TU:
..._jr_8017C340.c holds only a CALLER and a prototype; the INCLUDE_ASM lives in
..._jr_8017ED5C.c. Splicing into the wrong file is a no-op, the binary differs,
and harvest recorded its canned string "match_one MATCH but gate rejected
(declaration/TU plumbing)" — A GUESS, NOT A MEASUREMENT. No declaration
conflict ever existed.

NEW LAW (zero-cost oracle): THE SPLAT ASM SUBDIR NAMES THE DESTINATION TU.
asm/<overlay>/nonmatchings/<TU_basename>/<fn>.s  =>  the INCLUDE_ASM is in
src/<overlay>/<TU_basename>.c, always — the third path component IS the TU
stem. Never accept a prose TU citation that disagrees with the --asm-subdir you
were handed: a grep for the function name also hits callers and prototypes in
OTHER TUs and reads exactly like a destination hit. Corollary: re-derive the TU
path from the asm subdir BEFORE hunting codegen on any gate-refused backlog
entry.

The agent proved it properly: in-situ splice into BOTH TUs, full pinned triple,
279/279 with 0 masked diffs, plus a collateral-drift check (71/71 other sized
symbols byte-identical). It also corrected the reach to x2 (only two .s files
for that function exist, byte-identical modulo the overlay name).

Bank rate across six waves: 67% -> 79% -> 69% -> 68% -> 73% -> 60%.
2026-08-12 18:13:19 -06:00
Drew T 043532b475 feat(phase-30 S48-T6): wave 4 — 18 exemplars banked; + a 4th comment-blindness fix
Wave 4 (wf_05895a19-121, 75 agents, 7.9M tok): 40 targets -> 35 agent-MATCH,
0 refuted, 5 NEAR, 0 FAIL, 0 drafts lost. 18 banked so far on the whole-binary
gate across 9 binaries; the other 17 are re-gating on a clean tree (see below).

PRIOR-NOTES SEEDING HELD AT SCALE: 10 of 12 seeded targets confirmed (wave 3
was 7 of 9). func_8017C294 — the x16 family, the largest single item on the
board — is now NEAR at **2 ins** (18 -> 11 -> 2 across three seeded attempts).

THE 4th COMMENT-BLINDNESS DEFECT OF THE SESSION, and the first with blast
radius. A crack agent annotated a decl in its draft:

    extern void func_801842DC(s32 a0);   /* TU:4023 INCLUDE_ASM (no decl) */

`corpus._INCLUDE_ASM_CAND` only skips lines that BEGIN with a comment marker,
so it read `INCLUDE_ASM (` out of the trailing PROSE, found no quoted path, and
refused the whole binary's stub oracle — correctly, by its own R32 contract.
That then failed gate_stage for every LATER binary in the run, because they all
walk the corpus: 12 binaries banked, then 5 were blocked by one comment in a
13th. Fixed the same way as the other three today: decide candidacy on
cdecl._mask'ed text, PARSE FROM THE ORIGINAL (the mask blanks string content
and would erase the asm path). Verified on 4 binaries incl. main (2,002 stubs).

AND THE DAMAGE IT LEFT: gate_stage raised out of the CorpusError BEFORE its
revert, stranding failed drafts spliced in src/. The 17 solo re-gates that
followed all read 0/17 — they were building a POISONED TREE, not judging their
own drafts. Residue reverted here; the 17 re-gate clean next.

The pattern is now sharp enough to state: any scanner that greps C source for a
token must mask comments and strings FIRST — and agent-authored drafts make it
far likelier, because their prose mentions the exact tokens our tools hunt for.
2026-08-12 12:25:20 -06:00
Drew T 50dd6b3c3f feat(phase-30 S48-T6): wave 3 — 27 exemplars banked, 0 drafts lost
Wave 3 (wf_2680d8ff-539, 74 agents, 8.08M tok): 39 targets -> 35 agent-MATCH,
0 refuted, 4 NEAR, 0 FAIL -> 27 BANKED on the whole-binary gate (69%).

THE HARDENED HARNESS HELD: 0 drafts missing on disk (wave 2 lost 21 of 26 to a
shared output dir). Per-agent dirs + "never touch anything outside your own
directory" + a verifier that re-runs sha1sum LAST.

PRIOR-NOTES SEEDING IS THE SESSION'S BEST LEVER: 7 of 9 seeded targets
converted, including all three wave-2 whole-binary-gate misses and both big
NEARs — func_80189540 (551 ins, was NEAR +2) and func_8017C3BC (407 ins, was
NEAR 17). func_8017C294 (the x16 family) went 18 -> 11 ins: narrowing, not a
wall.

func_80189540 also required the one host edit its agent byte-probed:
  src/ov_SC04_018/ov_SC04_018_jr_80188E1C.c:3093
  extern s32 func_80189540(s32 a0, s16 a1)  ->  (s16 a0, s16 a1)
That TU has no call site, so the edit is inert; the OTHER TUs' (s32,s16) decls
are deliberately left alone (real call sites, and an s16 prototype there would
force caller-side truncation and could de-match banked callers).

Its agent also recovered a better draft that already existed at
.run/backlog_drafts/func_80189540.c — a 551-ins MATCH that had been DE-matched
to 549 by "fixing" the definition's s16 first parameter to s32, the exact
inverse of that draft's own warning. Restoring s16 recovered the match.
2026-08-11 22:51:32 -06:00
Drew T 95909749bb feat(phase-30 S48-T6): recover all 21 "lost" wave-2 drafts from the transcripts — 17 more banked
Drew's question ("can you just analyze the workflow results to get those
drafts back?") was right, and my write-off was wrong. The drafts were never
lost: every agent's tool calls are recorded in the run transcripts, content
included. Recovery is deterministic and cost ~0 agent tokens.

Method (all three passes were needed):
1. Write records -> 20 of 21 had one. Naive extraction gated only 8/21,
   because agents REFINE with Edit and I was treating each edit's new_string
   as a whole file.
2. Replay Write-then-Edit in order per (agent, file_path), snapshotting after
   every mutation, then gate every snapshot newest-first -> 20/21 MATCH.
3. The last one (func_8017DF40) never used Write/Edit — it wrote via a shell
   heredoc. Extracted the heredoc bodies from the bash tool calls -> MATCH.

Whole-binary gate on the 21: 17 BANKED, 4 NEAR.
  md_SC03_073 func_801EFC94 x8   <- a MODULE exemplar, through the path fixed
                                    earlier today (commit:1626)
  ov_SC03_014 func_8017C154 x7  func_8017C6A0 x7  func_8017D1E0 x7
  ov_SC03_118 func_80187180 x8  func_80187B80 x8
  ov_SC06_018 func_80185C2C func_8018DE60 func_801850F4 func_801857CC
              func_801880C4 func_80185DD8 (all x6)
  ov_MAIN_012 func_8017DD28 x5 · ov_SC02_026 func_801814D8 x6
  ov_SC03_093 func_8018171C x5 · ov_SC03_107 func_8017EB70 x5
  ov_SC06_008 func_80180000 x8
NEAR at the binary gate: func_8017DF40, func_8017EEEC, func_80187960,
func_8018A974 — the §52b population (per-function MATCH, binary gate refuses).

Wave 2 now stands at 22 of 28 banked (79%) vs wave 1's 8 of 12 (67%), with
20 of 28 drafted by Sonnet.
2026-08-11 20:56:31 -06:00
Drew T 0ec7d4c052 feat(phase-30 S48-T6): wave 2 — 5 exemplars banked; 21 verified drafts LOST to a harness defect
Wave 2 (wf_d804f25a-f6f, 54 agents, 6.76M tok, 66 min): 28 targets ->
26 agent-MATCH (93%, vs wave 1's 75%), 0 refuted, 2 NEAR, 0 FAIL.

Then only 5 of the 26 drafts still existed on disk. The verifiers were NOT
lying — their evidence quotes exact instruction counts matching each target
(101/187/108/77 ins), so the files existed when they ran. Later crack agents
DELETED them while tidying the SHARED .run/wave2/ directory; one agent's own
notes say "scratch dir removed afterwards so .run/wave2/ contains only draft
.c files". 28 agents, one output dir, and a prompt line ("drafts to .run/wave2
ONLY") that invited cleanup.

Zero-token recovery: re-gated every surviving .c under .run/wave2/** whose
text DEFINES the target function -> 2 of 21 recovered.

Banked (5/5 through the whole-binary gate — every draft that survived passed):
  ov_SC01_005  func_8017ED5C x5  func_8017DEFC x5
  ov_SC03_093  func_801818F0 x5
  ov_SC04_018  func_80188B84 x5
  ov_SC06_018  func_80183F50 x6

The 21 lost cracks keep their full agent notes in .run/jr48/wave2_lost.json —
idioms, integration surface, family maps. They are re-runnable from those
notes at a fraction of a cold crack.
2026-08-11 20:37:35 -06:00
Drew T ce85242084 fix(phase-30 S47-0a.2): conform func_80175414 — 1,845 decls / 1,061 files; R22 213/213
The new head plumbing class after the symbol-kind fix: `conflicting types for func_80175414` (27
member-rows). Byte-true DEF is `void func_80175414(s32 _arg0)` (its DEFINE_ macro). The fleet
declared it 1,845 times in four spellings, of which three are the SAME TYPE (parameter names do not
participate) — the outlier was 28 sites declaring `(void)`.

conform_decls REFUSED the naive conform and was right to: 29 ZERO-ARG CALL SITES exist across 28
files, so conforming the declaration alone turns each into `too few arguments` — a fleet-wide
COMPILE break the per-binary gate cannot see (the tool cites 138/140 binaries, measured). It named
the count, the consequence, why the cheap check misses it, and the flag that repairs it, then
forced the two-step: --cast-zero-arg-calls (29 sites cast to the 0-arg fn-ptr shape, §17a-1 — gcc
folds the cast of a known symbol to a direct jal, so it is codegen-neutral), then the conform.

Result: 1,845 declaration sites rewritten across 1,061 files, 0 non-canonical remaining (axis
complete, R32). R22 clean-fleet: check-all 213 passed / 0 failed of 213.

WORTH RECORDING AS A TOOLCHAIN STANDARD: this is the instrument that has not wasted a cycle today.
Every other one reported SUCCESS over a defect — a classifier that discarded every gcc-2.7.2 hard
error (no `error:` prefix), a diff that miscounted 116 data-bundled .s files, a --verified-out
truncated to zero bytes over 62 real banks, a --band default that reported "0 families" on a real
135-member family, and a scope stamp describing the filesystem instead of the run. conform_decls
reports FAILURE with a repair path. A guard must state its COVERAGE, not just its verdict; the
in-repo exemplars are this tool and the §53 jr interlock.
2026-08-11 14:15:01 -06:00
Drew T dbed0942b1 feat(phase-30 S47-A4): cdFileLocTable typedef alias banks 138 members; R22 213/213
The one-line fix committed ahead of this run (CdFileLoc_80128C98 aliasing CdFileLoc) cleared the
largest remaining propagation-sweep class. Re-sweep: 138 member-matches banked, failures 875 -> 737,
`conflicting types for cdFileLocTable` gone entirely (136 -> 0).

Derived net (138 INCLUDE_ASM removed, 0 re-added) equals the report's 138 — they agree.
R22 clean-fleet: check-all 213 passed / 0 failed of 213.
Fleet 94.2 -> 94.3% instr / 87.9 -> 88.1% distinct / 96.15 -> 96.21% fn-count; stubs 13,780.

Residue reclassified — no symbol dominates any more: 227 PLUMBING-other, 125 DIFF (real byte
divergence, 17%), 93 CC1-FAIL(no-diagnostic), 26 memcpy, then a tail of small data-symbol
conflicts (D_80114F24 12, D_800AE620 11, D_800183E0 9, D_80126B58 6, D_80078EB4 6).

CC1-FAIL rose 77 -> 93 and that is NOT a regression: members that previously died earlier on the
cdFileLocTable conflict now reach a different compile error. Those 93 are hard gcc errors whose
text the sweep's classifier discards because it greps for `error:`, which gcc-2.7.2 never emits on
hard errors. That classifier is now the highest-value instrument fix left — three times today a
no-diagnostic verdict concealed something cheap.
2026-08-10 20:59:06 -06:00
Drew T 0a5be43765 feat(phase-30 S47-A3): jtbl family func_801884D8 — 15/15 siblings banked
Exemplar ov_SC02_028 @0x801884d8 (matched), 15 members. Per-sibling whole-binary byte-gate (G3/P9) is the
arbiter: jtbl_carve -> make extract -> remap_hseq -> make build, keep iff byte-identical else
revert. Tally: === func_801884D8: {'BANKED': 15} ===

Committed per family because jtbl_family_bank's per-sibling revert restores from HEAD — an
uncommitted prior family would be lost. Campaign-end R22 verifies the fleet.
2026-08-10 19:03:17 -06:00
Drew T f68188a73c feat(phase-30 S47-A3): jtbl family func_8018A564 — 21/22 siblings banked
Exemplar ov_SC02_027 @0x8018A564 (matched), 22 members, 125 ins each. Per-sibling whole-binary
byte-gate (G3/P9) is the arbiter: jtbl_carve -> make extract -> remap_hseq -> make build, keep iff
byte-identical else revert. Tally: {'BANKED': 21, 'isolate-fail': 1}.

Committed per family because jtbl_family_bank's per-sibling revert restores from HEAD — an
uncommitted prior family would be silently destroyed mid-sweep (the tool refuses a dirty tree for
this reason). Campaign-end R22 verifies the fleet.

NOTE on counting: the jtbl carve creates NEW split files, so a git-diff INCLUDE_ASM tally
over-reports (removals visible, re-additions inside untracked files not). True count settles
against the stub oracle at the campaign-end R22.
2026-08-10 18:59:45 -06:00
Drew T efec1b9b71 fix(phase-30 S47-A1): asm-label aliases must never be dropped by §8d; +148 members
scope_data_externs §8d drops the draft's decl of any symbol the TU already declares at file scope.
It keys on the SYMBOL, but a §37 asm-label ALIAS binds a DIFFERENT C identifier to that symbol:
the TU declares `D_801851BC`, it does NOT declare `tbl_D_80187044`. Dropping the alias left the
body referencing an undeclared name, which cc1 reports with no `error:` prefix — so the sweep
classified all 132 siblings as CC1-FAIL(no-diagnostic), i.e. as a codegen wall.

The bitter part: the alias exists PRECISELY BECAUSE the TU declares that symbol with a conflicting
type (a `void (*[])(void)` dispatch table vs this function's 20-byte-stride view). The drop rule
fired on exactly the declarations written to survive it. Why 1 of 2 died was fully determined:
tbl_D_80187048's symbol is not in the TU, so it demoted normally.

Fix: is_asm_alias() — an alias is demoted into the body, never dropped (the identifiers differ, so
it cannot collide with the TU's decl). Control-tested 6 ways incl. self-labels and plain externs.

Measured: func_80132018 3/135 -> 135/135; full re-sweep +16 more. Total +148 members.
R22 clean-fleet 213 passed / 0 failed of 213. tools-health OK, dedup-check 1949/0.
Fleet 96.11 -> 96.15% fn-count, 87.8 -> 87.9% distinct; stubs 14,120 -> 13,972 = -148 (2nd oracle).

CORRECTION TO MY OWN CLAIM (R14): after the probe I said the 58% aggregate was concealing a broad
problem. The re-sweep refuted it — only 16 more banks fleet-wide. The alias class really was one
family; the first read ("outlier") was right and the correction was wrong.

875 sweep failures classified: 231 PLUMBING-other, 141 DIFF (real divergence, only 16%),
136 `conflicting types for cdFileLocTable` (ONE symbol — biggest single class left),
77 CC1-FAIL(no-diagnostic), 26 memcpy, 12 D_80114F24, 11 D_800AE620, 9 D_800183E0.

STILL UNFIXED, and the most dangerous instrument left: the sweep's failure classifier greps for
`error:`, which gcc-2.7.2 never emits on hard errors. Every hard error therefore reads
CC1-FAIL(no-diagnostic). That is how a missing declaration looked like a codegen wall across 132
functions. rtu_match was fixed for this at T0(b); this classifier was not.
2026-08-10 18:50:48 -06:00
Drew T 9ab9120e04 feat(phase-30 S47-B): conform 8 declaration axes (~10,930 sites); 3 guard defects fixed; 213/213
Task B, re-scoped from evidence. The 129 dedup_extend failures are 106 conflicting-types /
21 CC1-FAIL / 4 undefined-ref / 3 DIFF — real byte divergence is 2%, and memcpy is 17 of 106,
not the story. Direction reversed too: the byte-true DEF of func_80128ED8 is what the target
.c files already declare; engine_core.h's macro-local extern was the stub-era guess.

Conformed 8 axes to byte-truth (func_8012F14C 2843, func_8012E5CC 2052, func_8012F038 2214,
func_8014C568 1816, func_80128ED8 1524, func_8012C750 406, func_8012C0EC 50, func_80144A04 25).
R22 clean-fleet: check-all 213 passed / 0 failed of 213. Zero functions banked by design.

Tooling (R33/R35) — three guards that asserted completeness over a narrowed population:
- NEW tools/macro_draft.py: a deduped fn has no definition in any .c (body lives in a DEFINE_
  macro), so conform_decls had been refusing the largest class it was built for.
- conform_decls skipped engine_core.h wholesale as "a defining TU": 10 stale externs survived
  while 1,514 fleet sites moved, and it still printed "axis complete". Skip now scoped to the
  defining macro's span.
- Return-axis compare was literal: typedef int/s32 and a missing `extern` faked a return change.
  Now compares normalized types.
- §85 consumer scan under-reported (the dangerous direction): a cast between `=` and the call
  hid `s0 = (s32 *)func_80144A04(...)`. Now classified by position, validated both ways.

Corrections to my own predictions (R14): the documented scalar-narrowing hazard was benign
across 2,052 sites; the breaks were arity (6 call sites, fixed with §17a-1 fn-ptr casts) and
the consumer-guard gap. A header-only first probe broke ov_SC01_000 — §85 is literal.

Not done, named: memcpy (builtin codegen), ApplyMatrixSV (no DEF), gte_SetRotMatrix (link bug),
func_80147364 (unparseable macro), D_800AE620/D_80126CC4 (data axis). Cookbook §159.
2026-08-10 16:01:49 -06:00
Drew T f6e48b60c5 perf(phase-30 S46-4): parallelise the propagation — 24min -> 11.4min, and +62 MORE instances
Drew: "make it more multi-threaded... I still see my cpu idle for far too long."
Measured, fixed, and regression-tested against the S46-3 bank as a KNOWN ANSWER.

- THE MEASUREMENT: 31s saturated (33 makes/48 cc1/load 27) then ~25s with ONE build alive
  while 31 cores idled, repeating. Causes: ex.map starts in list order so the giants land
  last, and apply/restore is single-threaded.
- gate_all -> gate_failures: return EVERY failure the sweep already computed (~138 rounds -> 1).
- Longest-first gate scheduling; results re-sorted into `changed` order so the verdict stays
  bit-identical to the serial loop's.
- PER-OVERLAY INDEPENDENT SEARCH, IN PROCESSES. My first cut used threads and the box refuted
  it: 0-4 builds alive at load 3, because the work is regex over 15k-line files and 138
  "parallel" searches all queued on the GIL. Same logic in a ProcessPoolExecutor: 14-29 builds,
  load 34.75, search phase ~100s. Safe because the shared header is written ONCE by the parent
  and each overlay owns its own .c files + build/<bin>/. Seeded with one in-process search
  first — a pool submitted at once gives every worker an empty suspect list and makes all 138
  pay a full bisection. place_in_overlay extracted to module level so the worker and the
  in-process apply cannot drift (R33); compiles_standalone's fixed t.c is per-call now.
- THE REGRESSION (the point, not the stopwatch): revert src/+config to pre-bank, re-run the
  identical command -> 29 functions (same), 141 overlays byte-identical, 682s vs ~1440s, and
  285 exclusions vs ~350 => +62 MORE member instances (249,161). The old prefix-based
  necessity probe was OVER-EXCLUDING (charging 4 fns to 9 overlays that did not all need
  them); the per-overlay shrink minimises per overlay. The faster path is also more correct —
  a timing comparison would never have shown it. R22 213/213 + tools-health green.
- STILL SERIAL, now the actual wall-clock (neither is a build): ~3min setup before the first
  gate (registered_addrs() yaml-parsing a 1949-group/249k-instance registry + 213 sig loads)
  and ~2.5min of sequential reconcile_caller_extern after the search.
- Captured as defaults: docs/accelerators.md A8 + memory fleet-tool-parallelism-defaults.
  cookbook index regenerated (my §155c append left it stale — the gate caught it, exit 1).
2026-08-07 23:14:15 -06:00
Drew T b005312127 feat(phase-30 S46-3): propagation banked — 29 fns / +2,815 member-instances; R22 213/213
The S45p9 blocker is closed, and the recovery loop that kept it from finishing is rewritten.

- BANKED: dedup_propagate --auto-from ov_SC02_037 --recover -> 29 functions propagated,
  141 overlays byte-identical, dedup 1920 -> 1949 groups, member instances 246,284 ->
  249,099 (+2,815). make clean && extract-all && check-all -> 213 passed / 0 failed (R22).
- WHY IT FINISHED THIS TIME: gate_all -> gate_failures returns EVERY failure from the sweep
  that already computed them, and the recovery loop resolves them all per round. Converged in
  3 rounds; the old one-overlay-per-sweep design needed ~138. That reframes the S45 run — it
  was not nearly done when it died, it had barely started.
- Batching did NOT cost capability: per-overlay necessity probes excluded four of the nine
  culprits from only the 9 overlays that needed it (not all 138), and ov_SC07_006 was
  RECOVERED by the Part-B caller-extern reconcile instead of excluded.
- Plan phase parallelised: 5 min -> 26 s, plan + skip classification byte-identical. Its
  compiles_standalone temp file is per-call now — the fixed `t.c` was the same fake-isolation
  class as match_one's shared --work dir (P28 T5), latent until something ran it in parallel.
- docs/accelerators.md (NEW, Drew 2026-08-07): the reusable-workflow ledger — what we learned
  late that a future decomp should know on day one, each entry with when we found it, when it
  WAS findable, what it cost, and the honest prerequisite where one exists.
2026-08-07 22:24:35 -06:00
Drew T 9f61cd33c5 feat(phase-30 S6): BOTH GIANT WALLS CRACKED ×138 (+50,094 ins) — the verdicts were stale, not wrong
The two functions the roadmap has carried as PERMANENT WALLS since Phase 24 are matched in all 138
overlays. Neither needed a siege. Both matched from drafts ALREADY ON DISK.

  func_80178004  165 ins x 138 = 22,770   Phase 26: Fable5, ~477k tokens, "intrinsic 3-integer
                                          regalloc wall". THREE stored drafts report match_one
                                          MATCH today; one banked first try, no new work.
  func_801412A8  198 ins x 138 = 27,324   close=29/110 since Phase 24. Matched from 1 of 31 stored
                                          drafts + the §37/§124 alias.

WHY func_801412A8 LOOKED INTRINSIC (worth understanding — match_one is structurally blind to it):
the TU declares `extern int func_801412A8(int,int,int,int,int,int)` and its callers USE the return
(`param_1 = func_801412A8(...)`), while the byte-true definition is
`Prim_1412A8 *(Prim_1412A8 *, int, int, int, u16, u16)`. Narrow params cannot agree with an `int`
prototype and the no-prototype escape is illegal once a param promotes, so NEITHER side can move --
and the resulting byte difference is in the CALLERS, which match_one never compiles. The §37/§124
def-side asm-label alias decouples them: the TU decl keeps governing the call sites (codegen
untouched), the definition keeps its byte-true signature.

THEN PROPAGATION RETURNED 0/137 TWICE, both times a missing TYPE, not codegen:
  family_remap's `_carry_macros` carries file-scope #defines but (a) NOT typedefs, and (b) is NOT
  TRANSITIVE -- it brought addPrim_1412A8 and stopped, though that macro calls setaddr/getaddr and
  getaddr casts to PTag_1412A8. Lifted Env_1412A8 / PTag_1412A8 / Prim_1412A8 + OT/getaddr/setaddr
  into src/shared/engine_types.h (inside the include guard) -> 137/137, 0 failed.

MY ERROR, CAUGHT BY THE GATE: I lifted the typedefs but did not STRIP them from ov_SC01_077.c, so
they were declared twice and gcc-2.7.2 rejects a repeated typedef even when identical -- the lesson
already recorded at the foot of engine_types.h. R22 came back 139/140 with [FAIL] ov_SC01_077 (the
exemplar's own overlay). Stripped, re-verified, 140/140. A proper lift strips the source;
build_engine_types --strip does both and I did it by hand.

Also a measurement error worth recording: I checked whether the draft defined Prim_1412A8 with a
plain `grep -c` -- which matches inside `addPrim_1412A8` -- and briefly concluded the carry worked.
Substring false positive; the same shape as reading a `return` as a declaration.

VERIFIED: make clean && make extract-all && make check-all -> 140 passed, 0 failed of 140.
Fleet 12432941 -> 12483035 instr (+50,094 -- EXACTLY the two giants x138); fn-count +276;
instr-weighted 94.5% -> 94.8%. audit-digest OK. 0 NON_MATCHING (G4).

THE RULE THIS BUYS: re-measure a wall before respecting it, and SCAN every stored draft rather than
sampling (my first pass checked 8 of 31 and reported "closeness 40" for a function whose MATCH was
in the 9th). Four minutes of re-measurement was worth 50,094 instructions.
2026-08-05 12:51:06 -06:00
Drew T 638f97dbbb feat(phase-30 S39): propagate free h_exact class 0x80176144 (53 ins x 1) - R22 140/140 2026-08-05 00:09:28 -06:00
Drew T c3bf1c988d feat(phase-30 S39): func_801758FC propagated x137 (+7,535 ins) — the largest free h_exact class
Measured the h_exact free pool from the bytes rather than trusting the frontier report's
numbers (R14 — its whale claim was 3/4 wrong: it said the whale was open in all four SC07
overlays; three were already banked and I closed the fourth earlier this session).

MEASURED: 215 open function-instances / 8,763 instructions are byte-identical (h_exact,
including reloc payloads) to an already-matched function. ONE class is 86% of that pool:

  func_801758FC — 55 ins, same address in all 138 overlays, matched in ov_SC01_000 only,
  OPEN in the other 137  =>  7,535 instructions.

h_exact means identical INCLUDING jal/lui/%lo reloc immediates, so the matched body compiles
byte-identically at every member with NO remap (dedup_extend's correctness argument, §14).
dedup_propagate --addr authored it once as DEFINE_func_801758FC() in engine_core.h and
instantiated it at all 137 open sites in address order.

  [ OK ] 138 overlays byte-identical after propagation; 1 new group in config/dedup.us.yaml

VERIFIED: make clean && make extract-all && make check-all -> 140 passed, 0 failed of 140.
Fleet instr 12411467 -> 12419002 = +7,535 EXACTLY; fn-count +137; instr-weighted crosses to
94.5%. distinct-code unchanged BY DESIGN -- the class was already matched in ov_SC01_000, so
the 137 add fleet instructions but no new DISTINCT function. audit-digest OK. 0 NON_MATCHING.

Note this function had been sitting in the stored-draft backlog for ov_SC06_030 and
ov_SC07_010 and re-gated "no" earlier tonight -- because gating a DRAFT is the wrong move for
an h_exact class. The right move is propagating the already-MATCHED body. Same function, two
routes, and only one of them is free.

Remaining free pool after this: 78 instances / 1,228 ins across 32 classes.
2026-08-04 23:56:15 -06:00
Drew T 936cd07b58 feat(phase-30 S38/S1d): generalised alias harvest — R22 140/140, but distinct-code DROPPED (unexplained)
Applied the def-side asm-label alias transform to all 971 staged member drafts (of 997; the rest
had no func_<ADDR> definition head) and gated them: 192 source files changed, ~5,985 insertions.
R22 clean-fleet 140/140 AFTER reverting ov_SC06_030 (below).

METRICS, AS MEASURED — one of them moved the WRONG WAY and I cannot yet explain it:
    fn-count      96.32% -> 96.46%   (+483 fns)
    instr-weighted 94.4% ->  94.4%   (+2,990 ins)
    distinct-code  89.3% ->  89.2%   (78,025 -> 77,952 uniq, -73)
A revert of ONE overlay to HEAD cannot lose 73 distinct functions, so something else is going on.
LEAD (NOT CONFIRMED): progress.py's definition scanner records the identifier immediately before the
paren (SIG at tools/progress.py:423), so an alias definition `void aF80146A6C(...)` is recorded as
`aF80146A6C`, not as func_80146A6C. That same scanner's docstring documents this exact blindness for
K&R defs, where it "silently erased ~190k banked instructions". BUT that lead does not explain why
fn-count ROSE while distinct-code FELL — they should move together under a pure naming artifact.
DO NOT treat the alias harvest's yield as established until this is resolved: the bytes are proven
(R22), the ACCOUNTING is not.

ov_SC06_030 REVERTED: `D_800AF648' undeclared in func_8017E120 — a draft that gated fine broke once
the REST of the harvest landed in the same TU (its declaration presumably displaced by another
banked draft's preamble). SECOND instance today of "per-binary acceptance is not a fleet claim"
(§61), after ov_SC07_010. In a WIDE harvest it is not even a per-TU claim, and only the clean-tree
R22 catches it. The narrow single-family run (138/138) was clean precisely because it was narrow.
2026-08-04 21:13:19 -06:00
Drew T a5e97739fb feat(phase-30 S38/S1d): the def-side asm-label alias cracks the 208-conflict class — 138/138 banked
Family 0x80146ab4 (18 ins, x138, PURE) had been failing 0/138 with `conflicting types for
func_80146A6C` — 208 of the ~398 conflicts in the sweep residue, its single dominant blocker.

DIAGNOSED BY READING THE DRAFT, after three levers were eliminated by measurement:
    draft def : void func_80146A6C(s16 a0, s32 a1, s16 a2, s16 a3, u16 a4, s32 a5, s32 a6)
    TU decl   : extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6);
The NARROW PARAMS are the wall: C's default argument promotion means s16/u16 cannot agree with an
s32 prototype, and the `()` no-prototype escape is ILLEGAL precisely when a param promotes. Neither
declaration side can move.
  - cast_call_sites: already on by default; wrong axis (fixes CALLEE decls, not the def's own).
  - --normalize-self-decls: 0 banks + non-neutral reverts; wrong axis (the target's decl in callers).
  - --fix-def-sig: measured 0/138, error UNCHANGED — it cannot reconcile a promoting param at all.

THE ESCAPE (§37/§124, S33-proven on func_80147364 — definition (u16,u16) vs 4,046 fleet decls,
banked x137 first try; 1,725 in-tree precedents): give the DEFINITION a private C identifier and
bind the emitted symbol with a GNU asm label, so the TU's declaration never meets the definition and
its type becomes irrelevant. Zero blast radius on every caller; byte-neutral by construction.

    void aF80146A6C(<byte-true params>) __asm__("func_80146A6C");
    void aF80146A6C(<byte-true params>) { ... }

RESULT: 138/138 banked, ~2,484 instructions, ZERO agent tokens. R22 clean-fleet 140/140.
.run/alias_defs.py applies the transform to a staged draft set.

NEXT: this is a CLASS lever, not a one-family fix — generalise it across the remaining sweep residue.
2026-08-04 20:43:14 -06:00
Drew T be2eaa1842 feat(phase-30 S38/S1c): re-sweep the matched-exemplar families after the type lift — 97 members banked
Families that returned 0/N before the 895-type lift now bank: 97 member-matches across 137 families
(1,138 failed; skipped 186 STRUCT-class by design, 106 unresolved-immediate, 6 not-stub).
R22 clean-fleet 140/140. Fleet 94.2 -> 94.3% instr / 88.9 -> 89.1% distinct / 96.29 -> 96.32% fn.

RESIDUE PRICED FROM THE SWEEP'S OWN .classified.txt PAYLOADS, not inferred: in the 400 most recent
failure records, 133 are genuine DIFF and the clear majority are `conflicting types for <sym>` —
the §103/§20 extern-conflict class, across ~12 overlays. That confirms S1b (wire reconcile_tu /
cast_call_sites into the --hseq path) is the correct next lever, and it is now justified by
measurement rather than by the plan's projection.

Method note worth keeping: those per-member diagnoses have been written on every sweep run for a
month and were never read — including by me, until after I had spent two probes and a manual
--stage-only round rediscovering one of them. Every remaining task now starts by reading the payload.
2026-08-04 19:04:56 -06:00
Drew T c57860db4e feat(phase-30 S38/S1a): lift 895 local types to engine_types.h — kills the type-scope sweep class
The free-sweep "wall" was a C parse error: a remapped member body names the EXEMPLAR's TU-local
types, which are undeclared in the sibling's TU, so gcc-2.7.2 parses the declarator as an expression
and dies before ever reaching codegen. extract_unit does carry typedefs, but only ones immediately
preceding the function in the preamble — types declared elsewhere in the exemplar's TU are missed.

Rather than patch the scanner per-family, remove the class: lift every liftable local type into the
shared header once. 895 types lifted, 6,196 local definitions stripped across 1,259 files.
R22 clean-fleet 140/140.

EXCLUDED s8/s16/s32/u8/u16/u32/f32/s64/u64/f64 — lift_types classified those common.h scalars as
liftable and lifting them would have been actively harmful. The tool's own visibility guard kept 8
local defs in src/ov_SC01_077/ov_SC01_077_o0.c, which does not include engine_types.h (stripping a
type out of a TU that cannot see the replacement DELETES it, and the link error that follows names
an unrelated data symbol).

Mechanism proven before scaling: lifting just 3 types took 0x801833f0's family from 0/6 to 6/6.
2026-08-04 18:46:30 -06:00
Drew T ba87a9b256 feat(phase-30 S38): wave-6 propagation family 1 — func_8017FEE0 x15 siblings
jtbl_family_bank (the §53 carve path — family_sweep --hseq correctly REFUSED these as has_mid_jr
families, warning that a 0% from the non-carve path would be a TOOL artifact, not a wall).
func_8017FEE0 (299 ins, cross-address family of 19 open siblings): 15 BANKED, 4 gate-fail.
Each sibling individually byte-gated by jtbl_family_bank (carve -> extract -> remap -> build, keep
iff byte-identical else revert). R22 clean-fleet runs once over the whole propagation batch; this
commit exists because jtbl_family_bank REQUIRES a clean tree between families (its per-sibling
revert restores from HEAD, so an uncommitted prior family would be destroyed).
2026-08-04 17:50:05 -06:00
Drew T b497ee1649 feat(phase-30 S33c): PROPAGATE head COMPLETE — func_801466F0 x137 took three fixes + a type-lift
Fleet 96.17 -> 96.21% fn-count / 93.8% instr / 88.0% distinct; dedup 1909 -> 1910
groups, 0 failed, C1 241216/241216. R22 clean-fleet: 140 passed, 0 failed of 140.

The head is now 5/5 classes, 18,545 templatable ins, all banked this session from
a standing start of 0.

func_801466F0 had sat since S6b behind THREE separate blockers, each of which
looked sufficient on its own to explain the failure:
 1. Its definition is under a §37/§73 ASM-LABEL ALIAS (`aF801466F0` in C, bound to
    the real symbol by `__asm__`), and dedup_propagate.find_site anchored its head
    regex on the literal `func_<ADDR>` — structurally blind to the form, returning
    None, which every caller reads as "not matched". Now reuses
    family_remap._alias_decl_for rather than growing a second matcher (R33).
 2. That matcher was itself blind to the WRAPPED (multi-line) declaration — the
    §134 shape, third tool. Fixed by matching over the joined text and mapping the
    offset back to the decl's FIRST line (extract_unit carries from there).
    Regression control: the single-line form still resolves. Fleet census after:
    2,768 of 2,768 alias sites resolve, 0 missed.
 3. Its record type was a draft-local typedef, so the body failed
    compiles_standalone. Lifted Rec801466F0 to src/shared/engine_types.h INSIDE
    the include guard (the SESSION-19 double-include note) and switched both the
    macro and the exemplar to it — byte-neutral, gate-proven.

Probed on ONE member before the fleet run: byte-identical 9052dc0e first try.

MEASURED, NOT INHERITED (R37): the S6b note frames the alias-regex gap as a CLASS
of missed work. It is ONE function — 91 distinct alias decls fleet-wide, the
per-line matcher resolved 90. Recording it so a future session does not scope a
phase against a class that does not exist.

cookbook §138 extended with the alias-form tool boundary and the three-blocker
story; index regenerated.
2026-08-04 00:44:33 -06:00
Drew T 4f6b0e8de1 feat(phase-30 S33b): PROPAGATE head 82% banked — 15,257 of 18,545 ins, four levers
Fleet 96.10 -> 96.17% fn-count / 93.7 -> 93.8% instr / 88.0% distinct.
dedup 1908 -> 1909 groups, 0 failed, C1 241078/241078.
R22 clean-fleet: 140 passed, 0 failed of 140.

  func_80147364  4,110  x137  definition-side asm-label alias
  func_8016BA68  3,886  x134  dedup_extend + the MIRROR decl relax
  func_8012F274  3,973  x136  hand-authored macro, source overlay excluded
  func_8012A598  3,288  x138  cdecl._mask backscan fix + shared-type switch
  func_801466F0  3,288  OPEN  the wrapped-alias regex — measured as ONE function

THREE DISTINCT CARRY VARIANTS were hiding in one "CARRY-FIXABLE" bucket, and
only one is a tool bug (-> cookbook §138):
  - a MULTI-LINE comment halts the preamble backscan -> fix the tool (cdecl._mask)
  - a draft-local `struct Tag {…}` -> switch the exemplar to the SHARED type
  - a file-scope `static inline` helper -> hand-author, EXCLUDE the source overlay
The third is the sneakiest: gcc-2.7.2 accepts implicit function declarations, so
the extracted body PASSED compiles_standalone with the helper undeclared and the
miss surfaced only as a whole-binary byte DIFF 137 gates later. Instantiating
that macro in the SOURCE overlay is a duplicate definition (its file-scope helper
is still there), so the shape is `--source-overlay X --binaries <all-but-X>`;
`--binaries` alone removes the source from the scan pool and errors.

TOOL BOUNDARY: once a group's members are DEFINE_func_*() sites, dedup_propagate
cannot extend it (find_site never returns a `def`). dedup_extend is the tool for
an already-macro-ized group — and `dedup_extend --check-only` across ordinary
overlays is a cheap fleet-wide wiring census (measured: exactly 1 group per
overlay, so no hidden backlog).

MEASURED, NOT INHERITED (R37): the S6b note frames _alias_decl_for's single-line
regex as a CLASS of missed work. It is not — 91 asm-label alias decls exist
fleet-wide, the regex matches 90, and the single miss is func_801466F0. Worth
3,288 ins, but a one-function fix. Correcting the expectation so a future session
does not scope against it.
2026-08-04 00:30:56 -06:00
Drew T 62042f65ca fix(phase-30 S11): multi-line-comment blindness in dedup_propagate; func_8012A598 x138
Fleet 96.06 -> 96.10% fn-count / 93.7% instr / 88.0% distinct; dedup 1907 -> 1908
groups, 0 failed, C1 240807/240807. R22 clean-fleet: 140 passed, 0 failed of 140.

func_8012A598 (3,288 templatable ins) was being written off as CARRY-FIXABLE.
It took TWO fixes; either alone leaves it skipped.

1. TOOL (R33) — find_site's preamble backscan. The SESSION-18 fix handled blank,
   `//`, and SINGLE-LINE `/* … */` lines, but a MULTI-LINE block comment still
   halted the walk: its middle lines start with `*` and its last line ends `*/`
   without starting `/*`. So the three externs above the body were dropped and
   the body then failed compiles_standalone on now-undeclared data. This is the
   §134 multi-line-blindness class — S6b fixed the identical shape three times in
   family_remap (D1/D2/D5) and this copy was never reached.

   Fixed by deciding skippability on `cdecl._mask` — the project's ONE masking
   oracle — instead of on line syntax: it subsumes every comment form at once and
   cannot be fooled by a `/*` inside a string, with an R32 assertion on the
   length-preservation invariant it rests on. Strictly monotone (it can only
   carry MORE preamble), and dedup_propagate is a byte-gate feeder, so a bug here
   can fail to bank but never falsely bank.

2. EXEMPLAR — the body also declared a draft-local `struct BigCopy164` tag, which
   the tool refuses by design (two macros defining one tag would redefine it in a
   single TU). The shared `struct BigCopy` (engine_types.h L312) is the identical
   layout and is ALREADY used this exact way at engine_core.h:16158, so switching
   the exemplar to it is byte-neutral and drops the alias too.

Probed on ONE member before scaling (R37/S29): byte-identical 9052dc0e first try;
then 138 overlays byte-identical.

PROPAGATE head accounting after this: 7,398 of 18,545 ins banked (func_80147364
4,110 + func_8012A598 3,288). Still open, each with a NAMED cause and none yet
diagnosed against a build: func_8012f274 (3,973, dropped), func_8016ba68 (3,886,
4/138), func_801466f0 (3,288, the S6b D4 wrapped-alias gap).
2026-08-03 23:53:50 -06:00
Drew T c7ad41c8a3 feat(phase-30 T6/S11): the propagation lag — EXTEND 31/36, and the PROPAGATE head measured
Continues the S11 lane. Fleet 96.01 -> 96.06% fn-count / 93.6 -> 93.7% instr /
88.0% distinct; dedup 1905 -> 1907 groups, 0 failed, C1 240669/240669.
R22 clean-fleet: 140 passed, 0 failed of 140. 0 NON_MATCHING (G4).

EXTEND (SC07): the 16 volatile-blocked DIFF slots banked on retry after the
data asm-label alias -> lane total 31/36.

PROPAGATE head, measured rather than projected. .run/s8_lag.json re-split: the
checkpoint's "45 classes / 20,837 ins" is really 5 classes carrying 18,545 ins
(89%) and 41 carrying 2,316. Per-class outcome:

  func_80147364  30x137 = 4,110  BANKED x137 (definition-side asm-label alias)
  func_8012f274  29x137 = 3,973  DROPPED — byte-diverges in ~130 overlays
  func_8016ba68  29x134 = 3,886  4 of 138 banked; excluded from ~130
  func_8012a598  24x137 = 3,288  SKIPPED, cause NAMED by the tool
  func_801466f0  24x137 = 3,288  no source found — the S6b D4 gap, still open

  func_80147364's byte-true definition is `(u16, u16)` while 4,046 fleet decls
  say `(u16, s32)`. u16 is a default-promotion type, so the `()` no-prototype
  escape is ILLEGAL (the documented gcc-2.7.2 dead-end) and conforming the decl
  would change caller codegen. The DEFINITION-SIDE asm-label alias gives the def
  a distinct C identifier while emitting the real symbol -- zero blast radius on
  every caller. Probed on ONE member first (1 build, not 137 -- the S29
  discipline): byte-identical 9052dc0e first try; then 137 overlays clean.
  In-tree precedent for the form: 1,725 files.

MEASURED NEGATIVE, recorded not buried: `dedup_propagate --recover` banked only
4 of 138 on func_8016ba68 and dropped func_8012f274 entirely (137 [exclude]
lines). The caller-extern reconcile that is 16/16 lifetime ON DRAFTS does NOT
transfer to PROPAGATION of these two. Cause not yet diagnosed -- probe one
excluded overlay's build output before any further attempt (§136a), do not
re-run the lever hoping.

NAMED NEXT (cheapest first): func_8012a598 skips on `missing file-scope extern
(CARRY-FIXABLE): D_801151D4, D_80126DB8_a, D_80127504` -- the SESSION-18
preamble-backscan class. Its body is 2 statements and `struct BigCopy` is
ALREADY in the shared engine_types.h (L312) with the identical statement already
macro-ized at engine_core.h:16158, so a hand-authored macro (the func_80147364
path) should take it x137 for ~0 tokens.

Process errors recorded in CURRENT_PHASE.md, all three one mechanism -- the
signal sampled is not the thing waited for: (1) a `nohup CMD &` wrapper's exit
read as the fleet check finishing (it stood at 63/140); (2) a corpus.stubs probe
mid-rebuild, which R32's coverage assertion refused rather than answer wrongly;
(3) CORRECTION to the S10 checkpoint's own rule -- `pgrep -x make` is right for
one make and WRONG for a campaign of sequential makes (it fired in a gap and
reported a live campaign done), and `pgrep -f <pattern>` SELF-MATCHES so that
waiter can never exit. Wait on the campaign process or `treelock.sh --status`.
2026-08-03 23:41:34 -06:00
Drew T a4bc49a23d feat(phase-30 S8): the x10-99 band closes 23/23; §137 makes REGALLOC-PERM arithmetic, not a permuter job
- S8-3 (23 fresh x10-99 families, 121-328 ins — the hardest band this session): draft 16/23 ->
  capture (1 PLUMBING / 6 DIFF) -> reconcile 1/1 -> redraft 6/6 => **23/23 (100%)**.
  Propagated 206 + 81 = 287 member-matches across 80+54 overlays. R22 clean-fleet 140/140.
  FLEET 95.97% fn / 93.4% instr / 87.5% distinct (77,404 uniq); dedup 1905/0; 0 NON_MATCHING.
- §136b CLOSES AT 15/15 — no function ledgered "genuine byte-DIFF" survived a redraft, all session.
- §137 (NEW, the session's most reusable result): REGALLOC-PERM — a clean 2-register swap — is a
  TWO-COMPILE ARITHMETIC PROBLEM. global.c:allocno_compare ranks by floor_log2(R)*R/L*1e4*size;
  read R and L out of `cc1 -dl -dg` for BOTH contenders AND their ranked neighbours to get the
  admissible priority WINDOW, then place a zero-byte `__asm__ __volatile__("" ::"r"(v))` so L lands
  inside it. func_801833F0: contenders ONE unit apart (1297 vs 1296), window (1228,1296), five
  placements probed, only L=219 -> pri 1232 worked. R and L are FORCED BY THE EMITTED CODE (L is
  recomputed post-sched1), which is exactly why source-reordering is a dead end for this class.
  Converts a class the permuter banked 0 from all session into a deterministic calculation.
  Companion: floor_log2 makes ref-count a STEP function (5/6/7 refs are worthless, you must reach 8)
  — func_8017EFA8 closed 30 register-name mismatches by taking a pseudo 4 refs -> 8 with a dead read.
- §136j — the failure MIX FLIPS WITH SIZE: <=120 ins fails ~70% on declarations; 121-328 ins fails
  86% on genuine codegen. Budget reconcile for the small band, redraft for the big one — and do NOT
  read 70% on a big-function wave as a broken pipeline; that is the expected shape.
- §137a — a gate verdict has a TIMESTAMP. Two "DIFF" ledger entries were STALE (draft rewritten 28
  min after the gate ran, never re-gated); both were already byte-perfect. Compare verdict time to
  draft mtime before redrafting. Plus two offline oracles an agent built: a FULL RELOCATION RESOLVE
  (catches wrong jal/%hi/%lo targets that match_one's mask hides) and a COLLATERAL CHECK (whole-TU
  objdump with/without splice). Together they discriminate all three causes of "match_one says MATCH
  but the overlay SHA differs" without running make.
- §136f addendum — the collider is often an already-banked SIBLING BELOW the splice; locate it by
  arithmetic (draft grows the file N lines, so TU line L reports at L+N).
- cookbook-index 380 -> 382 sections.
2026-08-03 16:25:06 -06:00
Drew T b61d805b8b feat(phase-30 S7): wave 4b batch 3 — 35 heads + 305 members; the 144-family B-shape queue is worked
- BATCH 3 (37 targets, 41 agents, 2.75M tok -> 35 claimed): gate BANKED 35; family_sweep propagated
  305 member-matches / 39 failed across 77 overlays (14 STRUCT skipped by design). 340 instances.
  R22 clean-fleet 140/140 (sixth time this session).
  FLEET 95.86% fn / 92.9% instr / 86.5% distinct (77,061 unique fns); dedup 1905/0; 0 NON_MATCHING.
- WAVE 4b COMPLETE: b1 32/37 + b2 35/37 + b3 35/37; with wave 4a (30/33) the whole 144-family
  B-shape queue that opened this session is worked through — 138 of 144 drafts banked (96%).
- §136e — batch 3's two HONEST NEGATIVES, worth as much as the wins:
  (1) §136c SIBLING-FIRST HAS A PRECONDITION. func_801899AC's family has all 13 members still
      unmatched and no engine_core.h twin, so there IS no byte-verified sibling and the search is
      pure cost. Check a banked sibling EXISTS before spending the greps.
  (2) A loop increment in the loop-back DELAY SLOT + a compensating negative addiu is a SOURCE
      SHAPE, not a reorg artefact — MIPS1 has no annulling, so reorg CANNOT invent the
      compensation. Write `p += 2; if (t == cur) break; ... p -= 2;`. combine's reg_n_sets==1 guard
      stops the addiu folding into the following lw. The index's delay-slot entries point at reorg,
      which is a dead end for this class.
  Plus a new §136-L1 application on the RETURN axis (an over-scoped temp became a global allocno and
  swapped $v0/$v1 with the returned local, collapsing the target's `j` + `addu` return).
- COMPOSITION, demonstrated on func_8017D5F4 (46 ins): flat early-returns -> dead-local frame pad ->
  s16 locals -> operand order -> 3 register pins -> 2 zero-byte re-ties -> permuter for the last 2.
  THE PERMUTER IS THE LAST STEP ON AN ALREADY-PINNED BASE, not the first.
- cookbook-index 374 -> 375 sections. 6 stubs remain; per §136b none is a wall on one attempt.
2026-08-03 12:34:53 -06:00