Commit Graph

3320 Commits

Author SHA1 Message Date
Drew T 80c548a59b feat(decomp): O41 overlay lane — 17 fns, clean-R22 verified 213/213
parallel_gate merged 17 across 16 binaries, aborted on a real red (ov_SC04_011). Reverted that one
file (func_80181F0C); the other 17 fns verify green from a full clean rebuild.

CORRECTION to my own first read: I attributed the ov_SC04_011 failure to func_80182DCC, whose agent
had flagged a needed jtbl carve for that same binary. The merged-and-failing draft was actually
func_80181F0C — I inferred from the binary name matching the carve note instead of reading the diff.

The carve-prediction pattern is still real and worth acting on, on the evidence that does hold:
three agents this session named, in advance, the integration reason the whole-binary gate would
refuse a draft they had just matched in isolation (func_801588CC's §8e/§260-A tail-class jtbl carve;
func_80182DCC's jtbl_801ED970 8-word carve in tail19.data.s; func_8001AF34's JTBL_PADS residual).
Those are gate-side work, not drafting failures, and must not be re-drafted — that is how
ov_SC06_022:func_80181664 burned three slots.
2026-08-30 20:32:26 -06:00
Drew T 481cb5dff1 feat(decomp): main batch-gate batch 0 — 143dbb89 byte-identical 2026-08-30 20:14:04 -06:00
Drew T f5d2cd017e docs(cookbook): S66 harvest round 4 — 1 NEW, 5 addenda from the O31 lane
9 mechanism-advertising transcripts of 19, from the session's hardest draw (23 of 25 over 120 ins)
and the first wave whose packs auto-carried the residual class's cookbook bucket. 16/16 agents.

§319 (NEW) — duplicate 'return v;' tails let combine fold the OR into $v0.

The sharpest addendum extends §164-26 (func_8017D89C). That section closes 'It is the only spelling
that reaches it' about the 2-D extern retype, and §185b hardens the failure into a recorded blocker
— so a function whose TU forbids the retype was written off. A THIRD spelling reaches the same
no-movable state with no retype at all: do the address arithmetic in INTEGER space and cast,
*(s32*)((s32)SYM + (j<<2)). The array never decays, expand_expr's ARRAY_REF case is never entered,
no ADDR_EXPR base pseudo is emitted, and scan_loop has nothing to record. §164-26's own byte-refuted
control stays valid and is the discriminator: *(char**)(SYM + b*8) still hoists, because
pointer_int_sum rebuilds it as a pointer add — a cast to s32 BEFORE the add is not the same edit as
a cast to char** AFTER it.

That addendum also records a second, cheaper tell: instead of counting the frame for an extra
callee-saved register, look for a DISTANT straight-line read of the same array's element 0 coming
out as 3 instructions (lui/addiu/lw 0()) where the clean 2-instruction lui %hi / lw %lo fold belongs
— the loop's subscript form corrupts an unrelated access blocks earlier. Closeness 37 -> 4 from that
one respelling, with a different-symbol control proving the loop is the cause.
2026-08-30 18:49:56 -06:00
Drew T 3d4d523a7a feat(decomp): parallel gate — 4 fns across 4 binaries (4 workers)
ov_SC04_018    func_8018BB50
  ov_SC03_015    func_80187A98
  ov_SC05_017    func_8018B850
  ov_SC03_001    func_801816D8
2026-08-30 18:37:38 -06:00
Drew T f59f0883ad feat(decomp): O31 overlay lane — 16 fns, clean-R22 verified 213/213
Hardest draw of the session: 23 of 25 targets over 120 instructions (up to 138), and the FIRST wave
whose packs auto-carried the residual class's cookbook bucket (15 of 25). Agents self-reported
25/25 MATCH with zero NEAR — against O21's 34/40 earlier the same day on an EASIER band. One wave
is not causation (the arm mix also moved toward opus), but the notes changed character: they cite
and EXTEND banked laws instead of grinding.

Gate refused 2, and BOTH were predicted by their own agents as integration rather than codegen:
func_801588CC's note named the §8e/§260-A tail-class jtbl carve (jtbl_80199FF8 parked adjacent to
.rodata) and said it needs the gate's jtbl lever, not C. func_8017E498 likewise. Reverted those two
binaries; the other 16 verify green from a full clean rebuild.

Headline lever from this wave (func_80181E98) is a SCOPE CORRECTION to §186, the same shape as the
§167-05 polarity fix earlier today: §186 says no C-level barrier steers cross-jumping — true for
STEERING, but a zero-byte __asm__ __volatile__("") before an arm's goto BLOCKS a suffix merge
outright. Traced to gcc's own jump.c: simplejump cross-jumping calls find_cross_jump(insn,
JUMP_LABEL(insn), minimum=1) and walks BACKWARDS from the j; the empty asm is an ASM_INPUT that
fails rtx_renumbered_equal_p at compare #0, so last1==0 and no merge occurs, for zero emitted bytes.
Closeness 75 -> 40 plateau -> MATCH.
2026-08-30 18:33:06 -06:00
Drew T caa220806c feat(decomp): main batch-gate batch 0 — 143dbb89 byte-identical 2026-08-30 18:07:37 -06:00
Drew T eb6a1c9386 feat(packs): push the cookbook bucket into the pack — retrieval was the leak
Round-3 harvest measured a RETRIEVAL defect, not a knowledge gap: func_800CDBA8 and func_800CB00C
both re-derived laws the book already states (§165-19/§162d1/§30#3 birthing-boost; the
§135-1/§165-28 unsigned-switch-selector rule) by grinding match_one, with an EMPTY
cookbook_refs_used — they never grepped the index. SYS.md already tells them to ('START AT
docs/cookbook-index.md — it is symptom-keyed'); the instruction is there and gets skipped.

So stop asking. When the pack has ALREADY MEASURED the prior draft's residual and therefore knows
its klass, paste the matching symptom bucket from docs/cookbook-index.md straight into the pack,
capped at 40 rows with a pointer to the rest. Retrieval becomes push, not pull.

Mapping is klass -> bucket (REGALLOC-PERM/LOCAL -> register allocation & pins; SCHEDULE-REORDER,
OPCODE-MIXED, LENGTH-DRIFT -> instruction scheduling; DELAY-SLOT/BRANCH-POLARITY -> delay slots &
branches; WIDTH/IMM-VALUE/IMM-OFFSET -> types, signedness & width; ADDRESSING -> CSE; CC1-FAIL ->
declarations). An unmapped klass yields no bucket rather than a wrong one.

Negative control on the O21 slate, both directions: 12 packs carry a measured residual, 10 of those
get a bucket (2 have an unmapped klass and correctly get none); packs with no residual get none.
The loop closes visibly — the func_8017EDE8 pack now carries this round's OWN addendum about
§137's barrier failing in a cross-jump shared tail, which is exactly that function's residual class.
2026-08-30 17:22:11 -06:00
Drew T cd3a87ceba docs(cookbook): S66 harvest round 3 — 5 addenda, 1 refutation, 2 retrieval failures
11 mechanism-advertising transcripts of 30 from the M2 (main) + O21 (overlay) lanes. 19/19 agents.

The addenda sharpen four residual classes with byte evidence: the static local_type blocker is
TEXTUAL and survives typedef removal (func_801588CC); an orphan sh triplet to $sp is a write-only
local array (func_8017F274); a REGALLOC-PERM store reading the narrow copy's register splits with a
second temp (func_801838CC); and a REGALLOC-PERM store inside a CROSS-JUMP SHARED TAIL defeats
§137's barrier method entirely, because the barrier reschedules the whole shared block instead of
the one pair (func_8017EDE8) — that last one is a real scope limit on an existing technique.

TWO RETRIEVAL FAILURES recorded as such, not as news: func_800CDBA8 and func_800CB00C re-derived
banked laws (§165-19/§162d1/§30#3 birthing-boost; the §135-1/§165-28 unsigned-switch-selector rule)
by grinding match_one, with an empty cookbook_refs_used — i.e. they never grepped the index. The
book's own guidance says a high COVERED rate is a signal to fix RETRIEVAL rather than write more
prose, so these are logged where the next reader will see them.
2026-08-30 17:20:01 -06:00
Drew T db7db13d7f feat(decomp): O21 overlay-lane gate — 22 fns, clean-R22 verified 213/213
parallel_gate merged 23 drafts across 22 binaries; its R22 caught 5 real failures
(ov_SC03_110:func_80180270, ov_SC06_025:func_8018098C, ov_SC03_024:func_8017DE8C+func_801838CC,
ov_SC02_037:func_801588CC, ov_SC07_010:func_8017EC6C). Reverted those five binaries' files; the
remaining 22 fns verify green from a full clean rebuild.

Lane conversion this round, same models and packs, drawn minutes apart:
  O21 overlays  40 targets, 18-128 ins -> 34 self-reported MATCH (85%), 22 gated
  M2   main     15 targets, 74-102 ins ->  4 self-reported MATCH (27%),  1 gated
Size does not explain it (M2's band sits inside O21's). Nearly every O21 MATCH cites an in-TU twin
or neighbour — overlays are ~134 near-copies of one engine, so a structural relative is usually
already banked. src/800.c is single-copy game code with no twin to lean on. Budget main at roughly
a third of the overlay rate, and reach for the permuter there rather than more drafting slots:
main's NEARs cluster at closeness 3-16, i.e. regalloc tail, not wrong code.
2026-08-30 17:06:05 -06:00
Drew T e403eac964 feat(decomp): main batch-gate batch 0 — 143dbb89 byte-identical 2026-08-30 16:47:07 -06:00
Drew T ae34a46dba docs(cookbook): S66 harvest round 2 — the M1/O1 resume transcripts
7 mechanism-advertising transcripts of 32, extracted then adversarially novelty-verified.
11/11 agents, 0 errors. Verdicts: 2 ADDENDUM, 1 COVERED, 1 REFUTED.

The valuable one is a POLARITY SCOPE on §167-05 (func_80182538). §167-05 sits on the mirror-image
site — same address class (one base pseudo, two disjoint u16 offsets, memrefs_conflict_p = 0),
literally the same 0x6/0xA offsets — and its headline says no statement order, no register pin and
no scope edit can create the scheduling edge. That is true only in ITS direction: you need the edge
to keep a load BELOW a store. When the target wants the load ABOVE an unrelated sibling store, both
orders are legal, rank_for_schedule falls through to INSN_LUID (§49), and plain statement order is
the whole dial, for free. Without this scoping a future agent reads §167-05's 20-variant plateau and
wrongly concludes statement order is inert on this cell. closeness 3 -> 0 by hoisting the sibling
load to its own statement above the store.

Also §211/§17 applied-existing on func_80180FF4: once nins is right, a whole-function $sN swap means
two values live across the same jal became global allocnos, and global.c's allocno_compare density
sort is not obliged to match the target — only an explicit register pin on the crossing value
overrides it. Reconfirmed on a PARAMETER rather than a plain local.

Index regenerated: 946 sections.
2026-08-30 16:09:02 -06:00
Drew T ee5cf85351 feat(decomp): O1 resume gate — 7 fns, clean-R22 verified 213/213
parallel_gate merged 8, aborted on a real red (ov_SC06_022 fails a clean rebuild). Reverted that
one file; the remaining 7 verify green.

ov_SC06_022:func_80181664 has now failed the whole-binary gate TWICE, from two independently
written drafts — the O1 wave and then the O1 RESUME, which re-drafted it because a resume replays
the ORIGINAL args and so bypasses the openness/refusal filter added in commit:3301. Two independent
refusals is a wall signal, not a drafting failure: it belongs on the permuter/wall ledger, and the
refusal ledger should be keyed (binary, fn) and consulted by the DRAW — the way twin_sweep already
keys its refusals by (target, exemplar).
2026-08-30 15:54:09 -06:00
Drew T 743065e4be feat(decomp): main batch-gate batch 0 — 143dbb89 byte-identical 2026-08-30 15:34:45 -06:00
Drew T e485cc8559 feat(decomp): main batch-gate — +1 fn (143dbb89 byte-identical)
Batched main gating (batches of 8, per the measured lesson that batch-40 strands good drafts in
chunks the bounded bisect abandons). Both batches' bisects CONVERGED this time — batch 0: 3 of 7 in
13 rebuilds; batch 1: 1 of 3 in 5 rebuilds — no BISECT ABORTED, so nothing was stranded.

BUG IN MY WRAPPER (R42): gate_main --apply re-extracts and re-splices main on every invocation, so
running batch 1 REVERTED batch 0's three banks. Only batch 1's survived to the tree. The wrapper
must COMMIT between batches; re-running batch 0 to recover them.
2026-08-30 15:28:52 -06:00
Drew T 8fcd05965e feat(decomp): O1 wave gate — 16 fns, clean-R22 verified 213/213
parallel_gate merged 17 drafts across 16 binaries then aborted on "check-all: 212 passed, 1 failed".
The red was REAL: ov_SC06_022 still failed from a fully clean rebuild. Reverted that one file
(func_80181664, back to the drafting queue); the remaining 16 verify green with
make clean && make extract-all && make check-all.

CORRECTION to what I claimed while diagnosing the earlier x1 abort: parallel_gate's R22 IS a proper
clean rebuild — it calls sh(["make","clean"]) at tools/parallel_gate.py:257 before extract-all and
check-all. I had grepped for the string "make clean", which cannot match the arg-list form, and
wrongly concluded the tool was reading incrementally. The x1 red was real too; my revert of its two
bad drafts is what made the fleet green. The genuinely stale read was MY OWN bare `make check-all`
run after that revert, which still reported the old 211/213 from leftover objects and nearly led me
to discard 21 good banks. R40 (exonerate the instrument) applies to the instrument's SOURCE, not
just its output: read the code before blaming it.
2026-08-30 14:49:09 -06:00
Drew T a1024ab76d docs(cookbook): S66 harvest — 4 NEW sections, 15 addenda, 1 refutation
Distilled from 35 wave transcripts (12 byte-proven, 23 drafted-but-ungated and marked UNPROVEN),
each extracted then adversarially novelty-verified against the book. 57/57 agents, 0 errors.
Verdicts: 4 NEW, 15 ADDENDUM, 6 COVERED (rediscoveries — the signal to fix RETRIEVAL, not to write
more prose), 1 REFUTED.

The NEW laws:
  §315  all-constant aggregate fill emits in SHARED-LITERAL GROUPS x destination order
  §316  IMM-OFFSET-only residual: early "return 0" guards skip the flag test
  §317  a narrow struct-field store distributes the truncation (convert.c convert_to_integer
        trunc1), minting a HImode copy whose source cse rewrites to the equivalent constant --
        so a LIVE variable becomes an immediate load. Fix: route the arithmetic through a FRESH
        s32 temp. Byte-proven func_8017EF94 (293->292 ins, closeness 73 -> MATCH); the control
        that reused an EXISTING scratch var regressed to 63, so freshness is the lever.
  §318  a unary minus stored back into the same halfword is computed in HImode (lhu)

Notable addendum: §167-12's own scope note asked for a byte-proven instance of the single-operand
volatile keepalive; func_8017F498 supplies it (closeness 2 -> MATCH, 99 ins), and extends the tell
from unary ops to a three-operand non-commutative subu whose dest ties its PINNED source.

This is the step I skipped for eight waves. Drew: harvesting is the project thesis, not hygiene --
new idioms make the next exemplars cheaper and mint free banks.
2026-08-30 14:41:50 -06:00
Drew T 45cf37ee02 docs: refresh progress/backlog after the S66 gates (260 fns closed, fleet 213/213) 2026-08-30 14:28:10 -06:00
Drew T d20007e049 feat(decomp): x1 wave gate — 21 binaries, clean-R22 verified 213/213
The x1 parallel_gate merged 23 files then ABORTED on 'check-all: 211 passed, 2 failed'
(ov_SC03_124, ov_SC03_001), correctly leaving the merge in the tree for inspection (R42).

That red was a STALE INCREMENTAL ARTIFACT, not a bad draft: after reverting the two named
binaries' files, a bare 'make check-all' still reported the same 211/213, but rebuilding
ov_SC03_124 from a cleaned build dir produced 0b3991853c39d8c3d8d12e145e3312dd333f2189 —
exactly config/check.ov_SC03_124.sha. The authoritative sweep (make clean && make extract-all
&& make check-all) then returned 213 passed, 0 failed of 213.

Lesson re-earned (R22's own rationale): a bare check-all is an incremental read and must never
be used to diagnose a red fleet — it nearly cost 21 byte-verified banks. The two reverted
drafts (func_8018009C, func_80182BB8) go back to the drafting queue.
2026-08-30 14:27:23 -06:00
Drew T ebde3e546d feat(decomp): parallel gate — 2 fns across 2 binaries (3 workers)
ov_SC03_109    func_8017D9D8
  ov_SC04_019    func_80180284
2026-08-30 11:21:43 -06:00
Drew T 4c7550f97e feat(decomp): parallel gate — 21 fns across 21 binaries (10 workers)
md_MAIN_003    func_800D05B4
  md_MAIN_016    func_800CB158
  ov_SC01_009    func_8017F2A0
  ov_SC02_016    func_80182D54
  ov_SC01_080    func_80181918
  ov_SC03_001    func_80186A8C
  ov_SC03_029    func_80181600
  ov_SC03_101    func_80180864
  ov_SC03_091    func_801826C8
  ov_SC03_092    func_8017DF40
  ov_SC03_102    func_8018153C
  ov_SC03_103    func_8017E830
  ov_SC03_124    func_8018A3C8
  ov_SC03_105    func_801839A4
  ov_SC04_008    func_8017D8C4
  ov_SC04_012    func_8017DAE4
  ov_SC04_018    func_80180284
  ov_SC05_004    func_8017EF0C
  ov_SC06_025    func_801808AC
  ov_SC06_016    func_801813B0
  ov_SC07_002    func_801804D4
2026-08-30 11:15:07 -06:00
Drew T f0553e9ce5 fix(wave_args): refuse targets banked since the draw — the session's biggest throughput leak
Measured against corpus.stubs at gate time on this session's own waves:
  w2  80 drawn / 12 still open  -> 85% of its agents re-derived already-banked functions
  w3  80 drawn / 39 still open  -> 51%
  x1  80 drawn / 71 still open  -> 11%
~109 of 240 agents in w2+w3 spent full budgets on work that was already banked, by the concurrent
parallel_gate commit or by sibling propagation from a twin remap. The agents DID notice ('stale
pack', 'target .s no longer exists') but only after reading the pack, and several reconstructed the
banked body just to have something to submit.

draw_waves filters against the DRAWN ledger, which stops drawing a target twice but says nothing
about whether it is still OPEN. In a campaign where gates land continuously, a wave drawn at T and
launched at T+2h is stale by construction. Openness is the same class of assertion wave_args already
makes about the .s and the pack, so it belongs here, where it costs nothing.

Negative control (both extremes): x1 drops exactly its 9 closed targets and keeps 71; w2 drops 68
and keeps 12 — matching the independent corpus.stubs measurement.
2026-08-30 10:59:01 -06:00
Drew T 11b818d6c3 feat(decomp): gate_main pass 2 — +2 main game-code fns (143dbb89 byte-identical)
Auto-reconcile loop dropped 1 batch-aborting draft (func_8005E8E8), then bisected 40 candidates in
24 full-EXE rebuilds: 7 explicitly rejected, 5 chunks unresolved when the bisect hit its own bounded
step limit. gate_main reported 'BANKED 3'; corpus.stubs('main') went 132 -> 130, so 2. SECOND
instance of gate_main over-reporting its bank count by one (R14) — trust the oracle, not the tool.
2026-08-30 10:52:24 -06:00
Drew T fb45696a81 feat(decomp): parallel gate — 12 fns across 12 binaries (10 workers)
ov_SC01_084    func_801822A4
  ov_SC01_080    func_801800F4
  ov_SC02_005    func_80180CA0
  ov_SC03_002    func_80180E90
  ov_SC03_013    func_8017EEA4
  ov_SC03_124    func_8017FC58
  ov_SC04_015    func_801803D4
  ov_SC04_011    func_80186300
  ov_SC07_001    func_80180C2C
  ov_SC06_025    func_80180284
  ov_SC07_010    func_80181C54
  ov_SC06_000    func_801835B0
2026-08-30 10:37:22 -06:00
Drew T c06914b80d feat(decomp): parallel gate — 12 fns across 11 binaries (10 workers)
ov_SC03_110    func_801800F0
  ov_SC03_108    func_8017FD64
  ov_SC05_001    func_80183A30
  ov_SC01_001    func_8017F830
  ov_SC04_004    func_80181D1C
  ov_SC04_002    func_80183790
  ov_SC03_119    func_8017BFA0
  ov_SC03_118    func_8017BFA0
  ov_SC04_003    func_8017DE58 func_80180CC0
  ov_SC04_007    func_8017F86C
  ov_SC05_007    func_8017DF40
2026-08-30 10:15:04 -06:00
Drew T 96bc363c19 feat(decomp): gate_main — main game code banked from the S66 m1/m2/m3 waves
gate_main.py clean-rebuild gate over the 41 compatible drafts of the 54 drawn (11 dropped for
in-TU decl conflicts, 3 more dropped as batch-aborting compile conflicts by the auto-reconcile
loop). Bisect stopped itself after 24 full-EXE rebuilds with 3 chunks unresolved -- a bounded
failure by design. Final: 143dbb89f34491258bbc27810d0a12ec8b43a8dd BYTE-IDENTICAL.
Explicitly rejected: func_80013154, func_8001AAD0, func_8001BC6C, func_80021174, func_800241C0,
func_80031988.
2026-08-30 10:06:39 -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 89a22dc6ed feat(decomp): t6-recover gate — +1 fns x0 propagated (fleet 99.0%) 2026-08-29 21:17:06 -06:00
Drew T 5c0b2969d7 tools(P31 S66): match_one --json answers on toolchain failure; packs render it; wave_args + draw_waves
- match_one.py: a CPP/CC1/MASPSX/AS failure printed bare text and exited 1 even under --json, so
  every programmatic caller got json.loads of a non-JSON line. claude_wave_packs swallowed 4 of 19
  prior drafts as 'residual not measured: Expecting value' — the most actionable datum a pack can
  carry (the draft does not COMPILE, here is the error) was the one it dropped. Negative control:
  a near draft still measures identically (closeness 2, same residual rows); human mode unchanged.
- claude_wave_packs.py: renders that verdict, pointing the agent at the card's decl_prior block.
  Coverage on wave r1 went 15/19 -> 19/19 packs carrying a measured verdict.
- wave_args.py (new): emits the claude_wave_draft.js args from <wave>/targets.json, asserting the
  .s exists, that sub is exactly its parent dir, and that the pack exists. Written because I
  hand-typed sub as 'ov_SC03_112/jr_80181D08' when the truth is
  'asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801817E0' (a stub's asm dir is named for its jr-carve
  block, not itself) — all 19 agent oracles would have failed identically and read as a model
  failure. Negative control: that exact string is REFUSED.
- draw_waves.py (new): draws waves off corpus.stubs cheapest-first, ledger-filtered, with
  name-collision deferral (packs are name-keyed and refuse a duplicate). Re-measured the frontier:
  the S65 tier map's '~557 cheap singletons (3-17 ins)' conflated one-member FAMILIES with small
  functions — only 28 undrawn non-main stubs are <=17 ins; the bulk is 51-120 (258) and >120 (245).
2026-08-29 21:08:59 -06:00
Drew T a9dd3518d8 docs(phase-31): point a fresh session at the LAST checkpoint block
CURRENT_PHASE.md now holds 27 checkpoint blocks and several older ones say 'supersedes every earlier
block' — true when written, false now. The S64 FINAL block sits ~370 lines above the live S65 FINAL-4
one and makes the same claim, so a fresh session reading top-down could anchor on a state the tree has
moved past by 647 banked functions. Banner at the top states the rule: the LAST block is the live one.
2026-08-29 20:50:55 -06:00
Drew T 130c000b59 docs(phase-31): S65 FINAL-4 fresh-session checkpoint — written AFTER the harvest (the rule I broke earlier); 647 closed / 213-213 green, the tier map, the loop, the 69-item recovery queue, 7 tool fixes, the two wave-closing steps I skipped all session 2026-08-29 20:44:39 -06:00
Drew T 5ef1c0e615 docs(cookbook): S65 full-session harvest — 14 transcripts from 12 waves, 7 banked, 7 refuted as rediscoveries
Step 6 of the wave-closing sequence had not run since t5t. This is that backlog: every wave from t5u
to t8b, 139 transcripts, 14 carrying a novelty signal, each distilled and then adversarially verified
against this book before anything was written.

Verdicts: 7 COVERED, 6 ADDENDUM, 1 NEW (section 314).

The COVERED half is the point, not a loss. The verifiers did real work: the "3 new levers" claimed on
func_80183DA4 were traced to 164-71 + 30 stating the identical composite law (scalar decl places the
frame slot at &-time, COMPONENT_REF keeps MEM_IN_STRUCT_P) with a byte-evidenced worked example, and
the claimed-new delay-slot polarity on func_800CAEC0 turned out to REFINE the 220 S64 addendum rather
than contradict it — that addendum's "polarity means aliasing, never arity" holds only when the draft
has a pin or named alias, which this one did not. That bound is now stated.

Four entries are marked UNPROVEN: they come from drafts the whole-binary gate REFUSED, so the lever
moved match_one's closeness but no byte-equality is claimed (R14/G3). Section 314 is one of them — the
abs-range if/else-if wall, with four structurally different C rewrites measured byte-identical.

Index 921 -> 922 sections, green.
2026-08-29 20:43:08 -06:00
Drew T 3ca7e00d81 docs: recovery queue — the step-2 lane I skipped for 12 waves, classified and QUEUED
wave-harvest-is-a-pipeline-step step 2 (RECOVER the failure set: near-misses, gate-drops, errored
cards) ran for NO wave this session, nor for the earlier t5b-t5r waves. This is that backlog, built
and classified but deliberately NOT run (Drew, S65: queue it for next session).

69 unbanked wave targets: 47 with a draft on disk, 22 errored with none.
  Lane A  14 GATE-DROPS  — match_one MATCH, gate refused: integration/JTBL_PADS, probe first ($0).
                           Includes ov_MAIN_012:func_80144B9C at 770 ins, the largest recoverable item.
  Lane B  33 NEAR-MISSES — closest are closeness 1, 2, 2, 2, 2, 2, 3, 4, 4, 5. The S65 pack builder
                           now embeds the measured residual, so a redraft starts from the diff.
  Lane C  22 ERRORED     — no draft was ever written (rate limits); these are not failures at all.
2026-08-29 20:29:34 -06:00
Drew T b519fd0d6f docs(phase-31): S65 FINAL-3 — 647 stubs closed (44% of the overlay frontier), the TIER MAP (twin-remap drained; leveraged reps mint but bank at 40%; cheap singletons bank at 98% and mint nothing), parallel_gate + twin_sweep, 7 tool fixes, my errors fully accounted 2026-08-29 20:10:58 -06:00
Drew T 25bc11febd feat(t5): Claude wave t8b — 19 banked (sonnet 19/20, opus 0/0, +recovery); fleet 213 passed, 0 failed of 213 (P31 S62 T5) 2026-08-29 20:09:04 -06:00
Drew T 62f8eefbab feat(t5): Claude wave t8a — 20 banked (sonnet 20/20, opus 0/0); fleet 213 passed, 0 failed of 213 (P31 S62 T5) 2026-08-29 20:03:08 -06:00
Drew T 29a3807fe9 feat(decomp): parallel gate — 19 fns across 9 binaries (10 workers)
ov_SC02_021    func_8017F468
  ov_SC01_006    func_8017D624 func_8018203C
  ov_SC02_003    func_80183F0C func_80189D10
  ov_SC03_013    func_8017C234 func_8017E3C4
  ov_SC03_011    func_8017C234
  ov_SC03_015    func_80184920
  ov_SC03_119    func_801834DC func_80188C8C
  ov_SC04_019    func_8017E8A4 func_8017F1C8 func_8017FDE4 func_80182800 func_80183338 func_8018A224
  ov_SC05_005    func_801806A0 func_8018093C
2026-08-29 19:55:31 -06:00
Drew T 37b447084d feat(t5): Claude wave t7a — 8 banked (sonnet 8/20, opus 0/0, +recovery); fleet 213 passed, 0 failed of 213 (P31 S62 T5) 2026-08-29 19:44:51 -06:00
Drew T cd43e7cbd5 feat(t5): Claude wave t7b — 11 banked (sonnet 10/20, opus 0/0, +recovery); fleet 213 passed, 0 failed of 213 (P31 S62 T5) 2026-08-29 19:37:12 -06:00
Drew T 8ae40e10d2 fix(recover): exempt --probe-only from the single-instance lock — it writes nothing
The lock I added earlier today guards a real hazard (the driver mutates the shared tree and is not
parallel-safe), but I scoped it to the whole tool instead of the mutating path. --probe-only execs
blocker_probe, which compiles in its own scratch dir and touches nothing — excluding it buys no
safety and costs a free diagnostic.

Measured cost: a t7b drafting agent (func_801832E0) tried the probe TWICE, was refused both times by
a concurrent sweep holding the lock, and submitted with its blocker unconfirmed — exactly the $0
diagnostic the pack tells agents to run first.

Control: with the lock held, --probe-only now returns rc 0 and its verdict table; the mutating path
still returns rc 1 REFUSED.
2026-08-29 19:33:13 -06:00
Drew T 849ff3ce27 feat(twin_sweep): refusal ledger — stop re-gating candidates the gate already refused
The seam decays hard as it is worked out. Measured across four rounds today: 139/157 = 88.5%, then
178/234 = 76%, then 71/165 = 43%, then 1/95 = 1%. By the last round almost every candidate was one a
previous round had already tried and the gate had refused, so the sweep spent ~7 minutes of builds to
bank one function.

A refusal is deterministic for a given (target, EXEMPLAR) pair — the same exemplar remaps to the same
text — so the ledger keys on both and skips those by default. A NEW exemplar for the same target is a
different question and is retried automatically, which matters because the pool refills as banking
mints exemplars. --retry-refused overrides.

The ledger starts empty (today's rounds predate it) and populates from .run/pgate_results.json.
2026-08-29 19:14:02 -06:00
Drew T dbe262f3fe feat(decomp): parallel gate — 1 fns across 1 binaries (10 workers)
ov_SC05_005    func_8017FFC8
2026-08-29 19:12:54 -06:00
Drew T d804449be5 fix(distill): carry banked=False through to the distiller and the verifier
The distill prompt asserted 'the whole-binary byte-gate ACCEPTED the final draft, so the final body is
ground truth' for EVERY target. With --with-unbanked now feeding it drafts the gate REFUSED, that
sentence would have laundered an unproven body into a byte-proven cookbook entry (R14/G3). A target
with banked=False now gets an explicit PROVENANCE WARNING telling the distiller to extract the lever
anyway (cookbook 52: a model that FAILS still distils the idiom that cracks its siblings) but to mark
every claim UNPROVEN and never assert byte-equality; the verifier is told the same so its
entry_markdown carries the label. Exercised this session: the one surviving ADDENDUM came from an
unbanked draft and is filed UNPROVEN.

Also regenerates the scoreboard after the day's banks.
2026-08-29 19:03:28 -06:00
Drew T c17f0fbe1f feat(t5): Claude wave t6b — 3 banked (sonnet 3/3, opus 0/1, +recovery); fleet 213 passed, 0 failed of 213 (P31 S62 T5) 2026-08-29 19:02:32 -06:00
Drew T 1ef355d38d docs(phase-31): S65 FINAL-2 checkpoint — 562 stubs closed (39% of the overlay frontier), the twin-enumeration finding that re-opens the family lever at h_exact/h_norm, parallel_gate at 10.4x, 6 tool fixes, my own -P4 corruption + the monitoring lessons 2026-08-29 19:01:08 -06:00
Drew T 517e691eab feat(t5): Claude wave t6a — 4 banked (sonnet 4/4, opus 0/1, +recovery); fleet 213 passed, 0 failed of 213 (P31 S62 T5) 2026-08-29 19:00:14 -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 e9449ef0fe feat(tools): parallel_gate.py + twin_sweep.py — worktree-isolated concurrent gates, and the twin lever as one command
parallel_gate.py — the per-binary byte gate was serial BY HARNESS, not by nature. Each binary already
compiles into its own build/<bin>/, links its own .ld and checks its own SHA; what serialized it was
shared mutable state in the ONE checkout (the splice, assert_write_set's GLOBAL git status, and the
deliberately-broad `git add -u src/` that must stay broad). Measured: a 109-binary sweep ran ~1
min/binary on a 32-core box at load 1.4 (~4% utilisation), and an xargs -P 4 attempt over the shared
tree CORRUPTED it earlier today.

Fix is ISOLATION, not locking: one git worktree per worker (own index, own src/, own build/). Workers
gate and NEVER commit; the orchestrator adopts only drafts the gate ACCEPTED, and only where the main
tree still matches the pinned baseline (otherwise REFUSED, never clobbered), then ONE commit and ONE
R22 clean-fleet sweep verifies the merged whole.

Measured on 85 binaries / 234 candidates: 178 banked in 12m19s wall for 127m40s CPU = 10.4x
parallelism, ~7x end-to-end vs serial, 99 files merged, 0 refused, check-all 213/213.

Five things a fresh worktree does NOT have, each found by measurement and each first appearing as
"the draft failed": splat-generated include/*.inc, the EMPTY tools/maspsx submodule, gitignored
tools/bin (cc1) + tools/psyq, build/{<bin>,assets/<bin>} outputs, and extracted/retail. Dirs mixing
tracked and untracked content cannot be symlinked wholesale (ln -s nests INSIDE them) — hence
link_missing(). The negative control that catches all of it: an UNMODIFIED binary must build
BYTE-IDENTICAL in the worktree. Before that control, the first parallel run reported a clean,
plausible "0 banked across 4 binaries" that was pure environment artifact.

twin_sweep.py — enumerate every open stub that has an ALREADY-BANKED structural twin, remap it
mechanically, gate it. Yields measured today: h_exact 139/157 = 88.5%, h_norm 36/45 then 178/234
= 76-80%. h_seq stays refused (Phase-26) and is not used. THE POOL REFILLS: each bank becomes an
exemplar for its siblings — 165 fresh candidates existed immediately after banking 178. Run it
BEFORE drawing any wave; t5_cards does not build seed_ref, so cards assert "no banked twin" for
these and agents redraft answers we already hold (a t5u Opus slot ground ov_SC03_023:func_8017BEBC
to closeness 45 while ov_SC02_004 held a byte-identical banked copy).
2026-08-29 18:45:49 -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 5c56f5b925 feat(decomp): family-remap-hnorm gate — +2 fns x0 propagated (fleet 98.9%) 2026-08-29 18:30:39 -06:00
Drew T 29dd998964 feat(decomp): family-remap-hnorm gate — +2 fns x0 propagated (fleet 98.9%) 2026-08-29 18:29:40 -06:00