Commit Graph

3304 Commits

Author SHA1 Message Date
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
Drew T 9d1f4efa87 feat(decomp): family-remap-hnorm gate — +2 fns x0 propagated (fleet 98.9%) 2026-08-29 18:28:19 -06:00
Drew T f7d31f4d6f feat(decomp): family-remap-hnorm gate — +2 fns x0 propagated (fleet 98.9%) 2026-08-29 18:27:07 -06:00
Drew T aa03070e6d feat(decomp): family-remap-hnorm gate — +2 fns x0 propagated (fleet 98.9%) 2026-08-29 18:25:50 -06:00
Drew T f6b36fc2f0 feat(decomp): family-remap-hnorm gate — +2 fns x0 propagated (fleet 98.9%) 2026-08-29 18:24:35 -06:00
Drew T 429a05d54f feat(decomp): family-remap-hnorm gate — +1 fns x0 propagated (fleet 98.9%) 2026-08-29 18:23:17 -06:00
Drew T edc7a69cf3 feat(decomp): family-remap-hnorm gate — +5 fns x0 propagated (fleet 98.9%) 2026-08-29 18:22:16 -06:00
Drew T 4fac816994 feat(decomp): family-remap-hnorm gate — +2 fns x0 propagated (fleet 98.9%) 2026-08-29 18:21:04 -06:00
Drew T 6ce7893040 feat(decomp): family-remap-hnorm gate — +2 fns x0 propagated (fleet 98.9%) 2026-08-29 18:20:05 -06:00
Drew T 23d5cc2e79 feat(decomp): family-remap-hnorm gate — +2 fns x0 propagated (fleet 98.9%) 2026-08-29 18:18:58 -06:00
Drew T 576acd6738 feat(decomp): family-remap-hnorm gate — +1 fns x0 propagated (fleet 98.9%) 2026-08-29 18:18:00 -06:00
Drew T d89ae360be feat(decomp): family-remap-hnorm gate — +3 fns x0 propagated (fleet 98.9%) 2026-08-29 18:17:03 -06:00
Drew T 064496667b feat(decomp): family-remap-hnorm gate — +4 fns x0 propagated (fleet 98.9%) 2026-08-29 18:15:51 -06:00
Drew T c46980e395 feat(decomp): family-remap-hnorm gate — +2 fns x0 propagated (fleet 98.9%) 2026-08-29 18:14:50 -06:00
Drew T 88505e0cb4 feat(decomp): family-remap-hnorm gate — +2 fns x0 propagated (fleet 98.9%) 2026-08-29 18:13:33 -06:00
Drew T af827ef900 feat(decomp): family-remap-hnorm gate — +5 fns x0 propagated (fleet 98.9%) 2026-08-29 18:12:12 -06:00
Drew T ce6be4ac26 feat(decomp): family-remap-hnorm gate — +8 fns x0 propagated (fleet 98.9%) 2026-08-29 18:10:34 -06:00