Commit Graph

762 Commits

Author SHA1 Message Date
Drew T 70134d06bf feat(decomp): parallel gate — 13 fns across 13 binaries (12 workers)
ov_SC03_094    func_8017E254
  ov_SC03_031    func_8017F728
  ov_SC03_028    func_8018568C
  md_SC07_004    func_801A3D60
  ov_SC02_031    func_801831B4
  ov_SC02_017    func_8017FCFC
  ov_SC01_080    func_801815D4
  ov_SC03_030    func_8017FB04
  ov_SC04_004    func_80182014
  ov_SC04_015    func_8017ED28
  ov_SC03_102    func_801815D4
  ov_SC05_005    func_80181828
  ov_SC03_119    func_801832E0
2026-09-01 11:19:01 -06:00
Drew T 5450f18181 revert(revert): restore ov_SC04_011/func_80182DCC — it was NEVER a false bank
Reverts commit:3475. The bank is byte-identical; MY VERIFICATION WAS BROKEN.

A jtbl bank changes CARVE CONFIG (JTBL_PADS in config/overlays.mk + the splat
yaml). Those are splat INPUTS: asm/ and the linker script are regenerated FROM
them. I checked the binary with `make build` alone, so the build linked
newly-carved C against STALE extracted state and produced a mismatched SHA. That
is the R22 corollary ("a reverted config needs a make extract, not just a make
check") pointed the other way — a LANDED config change needs one too.

Proof, run on both binaries:
    make extract BINARY=ov_SC06_025 && make build  -> BYTE-IDENTICAL
    make extract BINARY=ov_SC04_011 && make build  -> BYTE-IDENTICAL

So: R40 against myself. I attributed the failure to the subject (the bank) when
the instrument (a build over stale extract state) was at fault — after writing
"it may not even be false" into the checkpoint and reverting without testing it.
The first revert also cost real work: it discarded a legitimate 96-line match.

STANDING FIX: a per-binary verify after any gate that touched config/ MUST be
`make extract BINARY=<b> && make build BINARY=<b>`. Build-only is a valid check
ONLY when the gate changed nothing under config/.
2026-09-01 11:08:55 -06:00
Drew T d349bc053a feat(decomp): parallel gate — 9 fns across 8 binaries (12 workers)
ov_SC03_089    func_80181F9C
  ov_SC05_001    func_801809B8
  ov_SC05_008    func_80180E84
  ov_SC03_094    func_801814F4
  ov_SC03_118    func_801832E0
  ov_SC06_025    func_80182170
  ov_SC03_105    func_8017FAE8 func_80185680
  ov_SC07_002    func_80185FB0
2026-09-01 10:47:13 -06:00
Drew T d8d4f8ac6f revert(decomp): ov_SC04_011/func_80182DCC — a FALSE BANK committed under --no-r22
Reverts commit:3472. The binary was RED at HEAD: sha1 9c94d36a vs expected
8bc09c42. The gate that banked it ran with --r22 disabled because 24 drafting
agents were live (R22 does make clean, which deletes asm/ under them), so the
one check that would have caught it was the one I had turned off.

The revert must carry the CARVE STATE, not just the C: the bank moved
JTBL_PADS 0,0,4,4 -> 0,0,4,4,4 plus the splat yaml, and a src-only revert left
4 tables against 5 pad specs ('table-count drift vs the carve'). Reverting the
whole commit restores BYTE-IDENTICAL.

Found only because two drafting agents independently reported their target's
binary as BASELINE-RED and I checked their claim against the bytes.
2026-09-01 10:35:11 -06:00
Drew T 02d0461d46 feat(decomp): parallel gate — 1 fns across 1 binaries (12 workers)
ov_SC04_011    func_80182DCC
2026-09-01 04:02:41 -06:00
Drew T e32fdd47dd feat(decomp): parallel gate — 2 fns across 2 binaries (4 workers)
md_MAIN_011    func_800D1254
  ov_SC05_017    func_80189240
2026-08-31 22:22:43 -06:00
Drew T e2f64a7c62 feat(o0): md_MAIN_003 second carve — func_800D12D0 (657 ins) banked as real -O0 C
MY HYPOTHESIS WAS WRONG AND THE AGENT SAID SO. I predicted the ownership oracle
was blind to verbatim-asm owners. It is not. 0x800cedf8 is the §154-A LEADING
RODATA ISLAND (the module-id header + jtbl/ptr table at segment offset 0), which
rodata_carves already exempts via 'off == 0 and sub == ov'. The S68 first carve
legitimately renamed that subseg to md_MAIN_003_jr_800D12D0 (§371: spimdisasm
rodata migration is same-subseg-only), so the 'sub == ov' conjunct stopped firing
and offset 0 leaked in as a 'carve'. The island has NO single owner BY DESIGN --
which is why the exemption exists -- so widening owner kinds could never have
restored 1:1.

The fix drops one conjunct: offset 0 alone is the honest structural key, because a
carve is a table LIFTED OUT OF THE DATA TAIL and can never sit at the segment's own
offset 0. Verified across all 213 configs: every offset-0 .rodata piece is an md_*
leading island; ov_*/main have none. The R32 hard abort is UNTOUCHED -- this widens
the recognised-island set, it does not soften the refusal.

NEGATIVE CONTROL (R39) over all 184 binaries with .rodata pieces: OK 182 -> 183,
ABORT 2 -> 1, and exactly ONE verdict moved (md_MAIN_003). The remaining us.exe
abort (UNOWNED 0x80073238, the LZSS jtbl carve whose owner LzssDecodeSector does
not live under src/us.exe/*.c) is byte-identical before and after -- PRE-EXISTING,
not newly hidden, and logged rather than silently absorbed.

Carve byte-neutral and bank byte-identical, both re-verified by my own rebuild:
sha1 dd1b32ecf1103c6f7cf1943d25546a3046e17b14 == config/check.md_MAIN_003.sha.
md_MAIN_003 12 -> 11 stubs.

THREE o0_subsplit GAPS surfaced and hand-finished, and they must be fixed before
the remaining 7 -O0 stubs here are carved: build_new_config drops a cut at the
object start so region 0 kept the -O2 name while the tool PRINTED the _o0 name;
parse_overlay_c folds pre-anchor text into the FOLLOWING anchor, so a verbatim body
inside region 0 attached to region 1; and the island .rodata piece needs repointing
to whichever TU ends up holding its emitters.
2026-08-31 19:46:10 -06:00
Drew T 2a8120f539 feat(decomp): parallel gate — 1 fns across 1 binaries (2 workers)
ov_SC01_000    func_8017D490
2026-08-31 18:55:28 -06:00
Drew T 7a969d1c61 feat(o0): md_MAIN_003 carve — the module-binary -O0 route opens, func_800D0D6C banked (345 ins)
The single-object module binaries could not be carved at all: o0_subsplit planned
correctly and then jr_isolate_all refused with 'unaddressable content'. That
blocked 9 of the 12 remaining -O0-in-an--O2-TU functions fleet-wide, including a
byte-correct 345-instruction draft with nowhere to go.

THREE ROOT CAUSES behind the refusal, all fixed here:
* overlay_src_split.load_ov_syms: an interior YAML comment terminated the
  symbol-file list. md_MAIN_003's yaml annotates the list body, so only
  symbols.us.txt loaded and D_800D3200 resolved to None -> refusal.
* jr_isolate_all._partition: a trailing content chunk (the verbatim-asm pair after
  the last addressable anchor) now attaches to the LAST region when every symbol it
  defines resolves at/after the last cut, instead of hard-refusing.
* _file_scope_decls: bare tag forward decls (struct S_D2394;) exempted from the
  dedupe refusal; plus addr_of's D_<hex8> fallback.

THEN A LINK FAILURE THE CARVE CAUSED, worth knowing: spimdisasm migrates rodata
referenced by exactly one function into that function's .s ONLY within the same
subseg. The carve moved func_800D30D0 into the jr subseg while the .rodata island
stayed on md_MAIN_003, so three dlabel string blocks were SILENTLY DROPPED ->
undefined reference to D_800CEE58/D_800CEE80. Adding INCLUDE_RODATA does not
resurrect them (splat marks them migrated segment-wide and emits nothing). The fix
is to rename the .rodata subseg to the jr object, where every island emitter lives.
The regenerated func_800D30D0.s came back byte-identical to the pre-carve .s.

Makefile: the -O0 glob widened to src/md_*/md_*_o0?.c. Without it the region file
compiles -O2 -- byte-neutral while stub-only, but every -O0 draft banked into it
would mystery-fail the gate (§362's trap class). This is why the Makefile and tool
hunks MUST land with the carve: a fresh clone would otherwise lose the -O0 flag.

VERIFIED INDEPENDENTLY of the agent that did it: sha1
dd1b32ecf1103c6f7cf1943d25546a3046e17b14 == config/check.md_MAIN_003.sha, from a
rebuild I ran myself; md_MAIN_003 13 -> 12 stubs; func_800D0D6C absent from
corpus.stubs. interleave_check's DRIFT on this binary is PRE-EXISTING (identical on
a clean tree, verified before any change) -- md_MAIN_003 has no _JTBL_INTERLEAVE
block and must not get one; forcing ALIGNED moves the leading rodata island after
.text and shifts every address by 0xD8. config/overlays.mk untouched (R59/R60).

8 of the 9 md_MAIN_003 -O0 stubs remain: they need drafts and follow-on carves.
2026-08-31 18:13:42 -06:00
Drew T 7a89bc4fb4 feat(config): -O0 whale carve step 1 — ov_SC02_037 + ov_SC03_107
Same split as ov_MAIN_012: 0x80144B9C..0x801458E0 out of <ov>_jr_8013F350.
2 unmatched stubs, 0 already-matched islands, carve repoints (none),
config/overlays.mk UNCHANGED. Both byte-neutral against their check.sha and both
interleave_check ALIGNED (33/33 and 30/30). Derived and carved under
.run/auto/gate.<ov>.lock.
2026-08-31 16:22:41 -06:00
Drew T ff524cd07e feat(config): -O0 whale carve step 1 — split 0x80144B9C..0x801458E0 out of ov_MAIN_012_jr_8013F350
o0_subsplit: 2 unmatched stubs (func_80144B9C 770 ins + func_801457A4 79 ins), 0
already-matched islands interleaved, so K=0 and one -O0 region is correct. carve
repoints (none); config/overlays.mk UNCHANGED (the whale object owns no .rodata
carve anywhere in the fleet: 0 of 213 splat yamls carve .rodata to an _o0b).

BYTE-NEUTRAL, which is the whole claim of a carve:
  build d6b3e8b971cdd6c53aea8c4f265afb82b363283c == config/check.ov_MAIN_012.sha
interleave_check ALIGNED. Derived AND carved under .run/auto/gate.ov_MAIN_012.lock
(the commit:2791 rule: a plan derived outside the lock can describe a tree state that
never existed).
2026-08-31 16:20:38 -06:00
Drew T ed53a68f18 feat(p31 s68): deferred propagation done honestly (2 banked) + seed_ref was offering DEAD TEXT
The S67 FINAL-3 OPEN item, plus the two defects found while doing it.

* fix(dedup_propagate): the tool could not run AT ALL. S67's -j patch wrote
  `os.environ` at module level in the one module that imports `os as _os`, so
  every invocation died with NameError before doing any work. Propagation was
  not deferred, it was impossible. Import-checked the other 7 -j-patched tools.

* propagation, honestly scoped: the real closable set is 11, not 32, derived two
  independent ways that agree (seed_ref exact+same_addr, and a direct corpus
  derivation). The 3,161-entry --auto-from plan over 53 overlays is dedup
  hygiene over already-matched code and closes almost no open stub.
  Applied: 2 banked byte-green (ov_SC04_018 func_80181270, func_80182AF8);
  3 gate-refused and cleanly reverted; 6 blocked with named blockers
  (3 CARRY-FIXABLE, 3 func_80144B9C not-inline-def -> needs the o0 whale carve).
  R22 clean fleet: extract 212/212, check 213 passed 0 failed of 213, rc 0/0/0.
  Frontier 453 -> 451.

* fix(seed_ref): REFUSE targets in LINKED subsegs. The playbook calls this tool
  "the fleet-wide answer" and it reported 82 open stubs with a banked twin --
  43 of them main stubs whose TUs the linker script never references. Any C
  written there compiles, links and leaves the SHA1 green WHETHER OR NOT IT IS
  CORRECT, so a mechanical twin lane fed from that list could have minted up to
  43 gate-green FALSE matches the byte gate cannot see. draw_waves has refused
  these since S66; this oracle did not. The refusal is counted and printed, not
  silent. NC: guarded 39 subset of raw 82, all 43 dropped are main, the non-main
  population is identical.

* wave drawn: .run/S68o1 (24 opus 187-770 ins) + .run/S68m1 (30 main), cards +
  packs + wave_args asserted, queue of 53. Drafting opened at concurrency 5.
2026-08-31 15:59:01 -06:00
Drew T 51abe2d174 feat(decomp): parallel gate — 19 fns across 14 binaries (8 workers)
ov_SC03_110    func_8018035C
  ov_SC04_000    func_8017F98C
  ov_SC04_015    func_8017E520
  ov_SC03_121    func_8017D8D4 func_80180E64
  ov_SC04_011    func_801827DC
  ov_SC03_007    func_801810E4 func_80184AFC
  ov_SC03_105    func_8017F55C func_801831E0
  ov_SC02_003    func_8017F62C
  ov_SC06_024    func_8017E1F0
  ov_SC05_001    func_80183C9C
  ov_SC06_030    func_8017F268 func_80181164
  ov_SC05_010    func_8018340C func_8018388C
  ov_SC04_016    func_8017D118
  ov_SC06_022    func_8017EBE8
2026-08-31 15:19:41 -06:00
Drew T 389d7d6197 feat(decomp): wave gate — +1 fns x0 propagated (fleet 99.2%) 2026-08-31 14:41:41 -06:00
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 4ced908c08 feat(decomp): S67-wave gate — +1 fns x7 propagated (fleet 99.2%) 2026-08-31 11:25:39 -06:00
Drew T e23492e3bc feat(decomp): S67-wave gate — +1 fns x6 propagated (fleet 99.2%) 2026-08-31 11:22:50 -06:00
Drew T 274057d132 feat(decomp): S67-wave gate — +2 fns x8 propagated (fleet 99.2%) 2026-08-31 10:34:40 -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 9dfc91ba6d feat(decomp): S67-wave gate — +1 fns x1 propagated (fleet 99.2%) 2026-08-31 10:22:41 -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 29cb504546 feat(decomp): S67-cc1 gate — +1 fns x4 propagated (fleet 99.2%) 2026-08-31 03:53:22 -06:00
Drew T 4daf41702a feat(decomp): S67-cc1 gate — +1 fns x19 propagated (fleet 99.2%) 2026-08-31 03:40:23 -06:00
Drew T 91197e1b51 feat(decomp): S67-cc1 gate — +1 fns x2 propagated (fleet 99.2%) 2026-08-31 02:02:48 -06:00
Drew T 6f51dbf267 feat(decomp): worker gate — +1 fns x0 propagated (fleet 99.2%) 2026-08-30 22:15:26 -06:00
Drew T 21d7d8675d feat(decomp): worker gate — +1 fns x0 propagated (fleet 99.2%) 2026-08-30 22:04:56 -06:00
Drew T f0af912c17 feat(decomp): worker gate — +1 fns x0 propagated (fleet 99.2%) 2026-08-30 22:03:25 -06:00
Drew T 578c638b9e feat(decomp): worker gate — +1 fns x0 propagated (fleet 99.2%) 2026-08-30 22:01:59 -06:00
Drew T c359fc1804 feat(decomp): worker gate — +1 fns x0 propagated (fleet 99.2%) 2026-08-30 22:00:27 -06:00
Drew T 0649108ec9 feat(decomp): worker gate — +1 fns x0 propagated (fleet 99.2%) 2026-08-30 21:58:55 -06:00
Drew T c297dc1235 feat(decomp): worker gate — +2 fns x0 propagated (fleet 99.2%) 2026-08-30 21:56:49 -06:00
Drew T 90cfb678d9 feat(decomp): worker gate — +1 fns x0 propagated (fleet 99.1%) 2026-08-30 21:55:32 -06:00
Drew T f930be4167 feat(decomp): worker gate — +1 fns x0 propagated (fleet 99.1%) 2026-08-30 21:54:28 -06:00
Drew T ccc7f64401 feat(decomp): worker gate — +1 fns x0 propagated (fleet 99.1%) 2026-08-30 21:51:18 -06:00
Drew T 6425a810f3 feat(decomp): worker gate — +1 fns x0 propagated (fleet 99.1%) 2026-08-30 21:50:06 -06:00
Drew T 67a48ebca1 feat(decomp): worker gate — +1 fns x0 propagated (fleet 99.1%) 2026-08-30 21:46:12 -06:00
Drew T 573d8f0493 feat(decomp): worker gate — +1 fns x0 propagated (fleet 99.1%) 2026-08-30 21:44:49 -06:00
Drew T a367d3f15a feat(decomp): worker gate — +1 fns x0 propagated (fleet 99.1%) 2026-08-30 21:41:13 -06:00
Drew T 8a58d2c633 feat(decomp): worker gate — +1 fns x0 propagated (fleet 99.1%) 2026-08-30 21:39:13 -06:00
Drew T 43ac008311 feat(decomp): family-remap gate — +15 fns x0 propagated (fleet 98.8%) 2026-08-29 17:11:08 -06:00
Drew T 422bc3b50d feat(decomp): family-remap gate — +23 fns x0 propagated (fleet 98.8%) 2026-08-29 17:04:19 -06:00
Drew T e6e053c801 feat(t5): Claude wave t5y — 5 banked (sonnet 4/5, opus 0/0, +recovery); fleet 213 passed, 0 failed of 213 (P31 S62 T5) 2026-08-29 16:50:41 -06:00
Drew T bfd591c9cc feat(t5): Claude wave t5a — 41 banked (sonnet 39/44, opus 2/4); fleet 213 passed, 0 failed of 213 (P31 S62 T5) 2026-08-26 20:12:09 -06:00
Drew T ceab8ad725 fix(config): ov_SC03_108 + ov_SC06_011 orders regenerated from their yamls — the failed table-bearing gate attempts left their carve entries in the mk and my 15:43 blanket add committed them (R59, mine); both byte-identical from clean rebuilds (P31 S62) 2026-08-26 16:00:01 -06:00
Drew T 4e562cfbf4 feat(decomp): ov_SC02_016/func_801810C8, ov_SC02_021/func_8017ECFC, ov_SC03_117/func_8017E6EC banked — the Block4-typed drafts once the isolator could see the lifted typedef; isolate + tail carve; byte-identical from clean rebuilds (P31 S62 T3) 2026-08-26 15:55:57 -06:00
Drew T 497d462c98 feat(decomp): ov_MAIN_012 + ov_SC02_037 func_8015444C banked (the family's remaining two; isolate + tail carve after the carrier/carve/mk fixes); both byte-identical from clean rebuilds (P31 S62 T3) 2026-08-26 15:43:29 -06:00
Drew T 34c94a17c4 feat(decomp): ov_SC03_107/func_8015444C banked — isolated region + tail carve (the func_8015444C family's first bank); byte-identical from a clean rebuild (P31 S62 T3) 2026-08-26 15:38:23 -06:00
Drew T 0e05821b02 feat(decomp): ov_SC03_029/func_8017FF7C, ov_SC03_105/func_80186DDC, ov_SC04_016/func_8017F03C banked after the type lift (gate-time isolate+carve); two orders regenerated from their yamls after a block restore landed on a successful carve; all three byte-identical from clean rebuilds (P31 S62 T3) 2026-08-26 15:34:11 -06:00
Drew T 0decb45580 feat(decomp): ov_SC03_028 (7 fns: func_80183A74, func_801847E8, func_80184914, func_80185864, func_80185C14, func_801887A8 + 1) and ov_SC06_030 (func_8017F65C + 1) — 9 resolver drafts banked once jr_isolate_all could partition their TUs; gate-time isolate + carve, both binaries byte-identical from clean rebuilds (P31 S62 T3) 2026-08-26 15:22:11 -06:00
Drew T 7bc10e31c8 fix(config): ov_MAIN_012 — order regenerated from its yaml; the 14:56 resolver gate (-j 10) resurrected a rejected carve's mk line via a whole-file overlays.mk snapshot/restore race between binaries, then blanket-committed it (R59/R60 caught live); byte-identical from a clean rebuild (P31 S62) 2026-08-26 15:06:21 -06:00