Commit Graph

3643 Commits

Author SHA1 Message Date
Drew T 9a94d0593d feat(decomp): main +1 - func_8005FA94 via §265 verbatim asm (gate_main, BYTE-IDENTICAL)
A §332 delay-slot wall the pinned triple cannot emit from C; banked the verbatim-asm way,
verified by one clean rebuild at 143dbb89f34491258bbc27810d0a12ec8b43a8dd. Bank confirmed
from the source (stub gone), not from the tool's own count.
2026-09-02 10:16:01 -06:00
Drew T 225f7d4ee9 docs(phase-31): frontier 150, 60 banked; main lane reopened; two gate_main defects fixed 2026-09-02 10:15:20 -06:00
Drew T b5f4bff5b2 feat(decomp): parallel gate — 4 fns across 4 binaries (10 workers)
ov_SC04_000    func_80180020
  ov_SC05_010    func_8017F15C
  ov_SC07_002    func_80183458
  ov_SC06_029    func_8017F330
2026-09-02 10:14:15 -06:00
Drew T 38a039d121 fix(gate_main): refuse a draft that contains its own INCLUDE_ASM (R43)
Substituting such a draft puts the stub straight back: nothing changes, the clean build
is trivially byte-identical, and the function is reported banked while its stub is still
in src/. That is how func_8002B0B4 was counted in this morning's "BANKED 5 of 6" when
only 4 had applied.

Refused at slate load so it fires in every mode including dry run. Negative-controlled
both directions: the no-op slate is refused by name, a real verbatim draft still passes.
Scope measured before generalising: 5 of 2,749 stored drafts, all one of two functions -
rare, but silent, which is why it is a refusal and not a warning.
2026-09-02 10:10:39 -06:00
Drew T ce671f7e14 fix(gate_main): count banks from the SOURCE, not from the slate
len(good) is "what we decided to keep", not "what was substituted". A draft whose stub
pattern does not match is a SILENT NO-OP: nothing changes, the build is trivially
byte-identical, the batch passes, and the function is reported banked while its
INCLUDE_ASM is still in src/.

Measured here: the bisect printed "BANKED 5 of 6" and func_8002B0B4's stub was still in
src/800.c - four real banks. The stub's absence is the bank oracle everywhere else in
this project; gate_main now uses it too, and names any accepted draft that never applied
instead of counting it.
2026-09-02 10:06:38 -06:00
Drew T e167c9c3cc feat(decomp): main +5 via gate_main - four §265 verbatim-asm walls and one ordinary body
The main lane, run the ONLY way main can be gated (§414): substitute the whole slate ->
make extract -> make build -> compare SHA1, with a bisect when the batch fails.
Baseline asserted green first (143dbb89...), batch of 6 failed, bisect isolated
func_8002C410 in 7 rebuilds, and the remaining 5 banked BYTE-IDENTICAL.

Four of the five are §265 verbatim-asm bodies for functions on the §332/§188 toolchain
wall list - the accepted route for a function the pinned triple cannot emit from C, the
same way func_800D0B1C banked overnight. Candidates came from scoring every stored draft
for main's 53 non-rejected open functions with match_one: 6 of 53 at closeness 0.
2026-09-02 10:05:39 -06:00
Drew T 38faa55a56 feat(decomp): parallel gate — 2 fns across 2 binaries (10 workers)
ov_SC03_105    func_801803A0
  ov_SC06_033    func_80190E64
2026-09-02 10:00:36 -06:00
Drew T a2b0a6b98f tune(draw): opus up to 340 ins, not 150 - Fable for difficulty, not length (Drew)
Drew, 2026-09-02: "use opus mainly and only escalate the difficult ones to fable".
The S69 table that set the old 150 line actually puts opus's cliff at ~350:

    m1  opus  191-347 ins   10/15 MATCH   1,291 tok/matched-ins   <-- best measured
    m2  opus  347-670 ins    1/9  MATCH   7,158                   <-- the cliff

So 150 was handing opus's STRONGEST band to Fable. Fable is now reserved for >340
instructions and for arm_from_history's compiler-internal residual signal (§413) at any
size. On the current pool that moves three functions back to opus while two stay on
Fable because their history names a scheduling/regalloc residual - escalation by
difficulty rather than length, which is the point.

Retries default back to opus: one failure is not evidence of a wall, and the history
signal lifts a target on its own if the notes justify it.
2026-09-02 09:58:03 -06:00
Drew T 1baa5ec405 feat(decomp): parallel gate — 2 fns across 2 binaries (10 workers)
ov_SC03_092    func_8017FA74
  ov_SC03_028    func_80181000
2026-09-02 09:35:36 -06:00
Drew T 11862e3c22 docs(phase-31): gate 10 (+3), frontier 162, 48 banked; §420-§423 harvested 2026-09-02 05:51:08 -06:00
Drew T f778dd3f6a feat(decomp): parallel gate — 3 fns across 3 binaries (10 workers)
md_SC07_003    func_801A293C
  ov_SC01_001    func_8017FEE0
  ov_SC03_105    func_80187A30
2026-09-02 05:50:05 -06:00
Drew T 5ce3704e21 docs(cookbook): §422 QImode arithmetic + flag^1 temp; §423 the "cause not determined" typedef collision
§422 (resident/func_800D06E8, 344 ins): mips.h has no PROMOTE_MODE, so a u8 local is
really QImode - `(u8)(c-3) < 2` gives widen_operand a paradoxical subreg (raw $a0) and
combine.c:9246 drops the truncation before the sltiu, while `(u32)(c-3)` re-widens and
loses it. And `s1 = (cmp) ^ 1` puts the comparison in the destination pseudo; the flag
needs its own temp.

§423 (ov_SC03_092/func_8017FA74): match_one closeness 0 + gate reject + "cause not
determined" has a checkable cause. harvest_verify splices the draft where the
INCLUDE_ASM stub was; a file-scope typedef the TU also defines (five lines below, here)
makes gcc-2.7.2 exit 33 on a C89 redefinition, the TU fails, the gate reverts, and
nothing names the typedef. Fix is block scope, proven with a three-way control. Mirror
of §409 law 2 - together they cover collisions above and below the splice point.

Tool trap: a scratch TU copy needs -Isrc/<overlay> or cpp exits 1 on the relative
engine_core.h include and EVERY variant passes identically.
2026-09-02 05:49:58 -06:00
Drew T a10613fa4a docs(cookbook): §421 - a la $tN + addiu pair can be a RELOAD artifact no C spelling reaches
Byte-proven on md_SC07_003/func_801A293C (313 ins, 6 -> 0 in 23 compiles). $t0 there is
reload's scratch (regalloc.md L80: first wholly-unused call-clobbered reg), not an
allocation: a launder output goes to $v0 via local-alloc, and any $8 pin evicts every
mfhi/reload to $t1 (measured 3x). The reach is §385's single-instruction non-volatile
asm with the bare symbol as an INPUT.

Also: spelling an addPrim RMW as a libgpu P_TAG 24-bit addr bitfield makes
store_fixed_bit_field mask the value first, hoisting 0xFFFFFF before 0xFF000000 and
closing both the lui/ori and lw-swap clusters at once (6 -> 3); and an in-place `and $s0`
needs `s0 = s0 & 0xFFFFFF` written out, not the compound form.

The law: before spending iterations on a register you cannot get, ask whether it belongs
to regalloc at all - reload runs after every dial C gives you.
2026-09-02 05:42:42 -06:00
Drew T 1c932c61b8 docs(phase-31): +4 via multi-cluster symbol rebase; frontier 165, 45 banked 2026-09-02 05:38:45 -06:00
Drew T 2cedd19aaa fix(symfix): key the slate by (binary, fn); §420 multi-cluster rebase banks 4 in 57s
aprop_symfix deduped its slate by BARE FUNCTION NAME, so a four-row slate for
func_8016AB6C across ov_SC03_107/ov_SC07_007/010/011 reported "1 drafts audited" - and
the three dropped rows each needed a DIFFERENT rebase, because each overlay has its own
target symbols. Same root as reloc_filter's binof and gate_lane's homonym staging: three
tools, one R48/§238 defect.

With all four visible, the structure is two uniform delta clusters of two, identical in
shape across all four overlays - one seed body's two data clusters each moving as a
block. STALE-DELTA only admits ONE cluster, so it refused all four as AMBIGUOUS. §420
records the safe generalisation (runs of constant delta, every run >= 2 members, D_
symbols only) and the verification step.

Rebased by hand under that rule, all four still MATCH at closeness 0, and the gate
banked 4/4 in 57 seconds with no drafting (commit:3629). Frontier 165, 45 banked.
2026-09-02 05:38:28 -06:00
Drew T 24d5017039 feat(decomp): parallel gate — 4 fns across 4 binaries (4 workers)
ov_SC03_107    func_8016AB6C
  ov_SC07_011    func_8016AB6C
  ov_SC07_010    func_8016AB6C
  ov_SC07_007    func_8016AB6C
2026-09-02 05:37:23 -06:00
Drew T f31f56ef17 docs(phase-31): the drafting pool emptied; the carve lane replaced it (+5, frontier 169)
Wave 3 drew 1 target - 0 left in pool. Of 174 open: 64 main, and of 110 non-main, 41
drafted this session, 68 excluded, 2 walls, ZERO undrawn. Re-probing the 68 with
jtbl_carve --probe found 17 now reporting `tail`, because tonight's jr_isolate_all
fixes changed their overlays. All 17 already had drafts; 10 scored closeness 0 with no
drafting. The gate banked 5, and they are exactly the five overlays jr-isolated tonight.

An exclude list is a snapshot of what the TOOLING could not do and goes stale the moment
the tooling improves - re-probe it after every tool fix.
2026-09-02 05:34:38 -06:00
Drew T c0e8731947 feat(decomp): parallel gate — 5 fns across 5 binaries (10 workers)
ov_SC03_010    func_8017F6C0
  ov_SC03_029    func_80186A34
  ov_SC03_013    func_801806F8
  ov_SC03_092    func_8017FE88
  ov_SC07_000    func_8017F8B8
2026-09-02 05:33:39 -06:00
Drew T 9bb43dd426 docs(phase-31): S71 gate 9 (+2, frontier 174, 36 banked); §419 density lever recorded 2026-09-02 05:19:10 -06:00
Drew T ca813cb5ab feat(decomp): parallel gate — 2 fns across 2 binaries (10 workers)
ov_SC01_000    func_8017DD04
  ov_SC03_028    func_80180B44
2026-09-02 05:18:24 -06:00
Drew T 5a39af246e docs(cookbook): §419 - when a pin is impossible, win the local-alloc density contest
Byte-proven on ov_SC01_000/func_8017DD04 (297 ins). Pinning the 0x80 constant to $7
loses its sched1 birthing boost, because $a3 and $a2 are ALSO set by the function's own
call-argument copies (reg_n_sets == 2) - a hard-register pin on an argument register is
unavailable to any function that passes arguments in it.

So win the ranking instead. local-alloc ranks by refs/live_length: 0x80 scored
13/319 = 4890 and took $6 (a pure $a2<->$a3 swap, 24 wrong). One six-input zero-byte
asm on mlo at the blk3/blk4 boundary buys 6 references, 5217 > 4890, mlo takes $6 and
0x80 falls to $7 with its boost intact. The boundary must be the one cut no hoisted
constant crosses, or you move the live lengths you are exploiting.

Measured inert: pinning mlo to $6 (cse never substitutes a hard reg for a bitfield
constant), and a dead hard-reg copy as a register suggestion (flow deletes it).
2026-09-02 05:12:40 -06:00
Drew T 49d1e06632 docs(phase-31): S71 gate 8 (+2, frontier 176, 34 banked); two proven walls recorded
Two functions recorded as walls with their refutation lists rather than redrafted:
ov_SC03_105/func_801834A4 (loop.c movable ordering, closeness 6) and
ov_SC06_022/func_8017DF28 (expand_block_move's copy_addr_to_reg pseudo reused by cse,
closeness 2, seven levers measured inert). One MATCH blocked purely on carve state with
its exact prescription queued in .run/S71_carve_todo.txt.
2026-09-02 05:02:09 -06:00
Drew T e1f6c5cdd9 feat(decomp): parallel gate — 2 fns across 2 binaries (10 workers)
ov_SC04_016    func_8017DF8C
  ov_SC07_006    func_80183374
2026-09-02 05:01:22 -06:00
Drew T 16c4fc75e1 docs(cookbook): §418 - second index as a GIV, and keeping a table address unfolded
Byte-proven on ov_SC04_016/func_8017DF8C (184 ins, 32 -> 0 in seven compiles).

1. Writing the stride as `off = j * 0x50` (a giv of biv j) rather than a second biv
   fixes 14 preheader rows and 8 latch rows at once: loop.c chains givs LIFO
   (loop.c:4421), so with `j = 0` spelled first the `move $s0,$zero` emits last and the
   arg-3 giv lands in its natural record slot. When the PREHEADER ORDER is wrong, check
   which variables are bivs and which are givs before touching anything else.

2. To emit la + addu + lh 0(reg) instead of a folded %hi/%lo(sym+K), hoist the table
   pointer to a function-scope local set ONCE outside both loops. No LOG_LINK crosses
   basic blocks so combine cannot fold it, and with every $s taken reload rematerialises
   it from reg_equiv_constant at the use and deletes the init - so the hoist is free.
   Spell the sum `idx + (s32)tbl`; the reverse costs one operand swap.

Measured inert here: §328's volatile cast on a reg+sym address.
2026-09-02 04:53:00 -06:00
Drew T 8709798738 docs(phase-31): S71 gate 7 (+3, frontier 178, 32 banked) + the measured blocker census
Blocker census read off the 37 gate verdicts on disk: DIFF 18, CARVE 7, PARSE 3,
NO-DIAG 3, CONFLICT 2, ARITY 2, UNDEF 2. I had called carve the dominant remaining
class mid-session on the strength of the last two agents I'd read; it is not. What
remains is mostly genuine codegen, the opposite of the integration-dominated picture
this session opened with.

Also recorded rather than redrafted: ov_SC03_105/func_801834A4 as a proven loop.c
movable-ordering wall (closeness 6, two measured-inert levers), and
ov_SC01_004/func_8017EB30 as MATCH-279/279 blocked purely on §8e carve state.
2026-09-02 04:46:02 -06:00
Drew T 7b256d1c35 feat(decomp): parallel gate — 3 fns across 3 binaries (10 workers)
ov_SC01_009    func_8017FFD0
  ov_SC03_013    func_8017E6F4
  ov_SC07_007    func_80182184
2026-09-02 04:45:11 -06:00
Drew T 46cfd92e0b docs(cookbook): §417 - a pin blocks jump.c's select collapse; unpinning exposes cse skip-blocks
Byte-proven on ov_SC03_013/func_8017E6F4 (182 ins). A pinned select arm expands as
ior+copy (two insns), so jump.c:728's `x=b; if(c) x=a;` collapse cannot fire. Unpinning
lets it fire - and then cse_end_of_basic_block's skip_blocks path walks between the two
D_80184D2C[idx] reads and CSEs the symbol_ref into $s3. The earlier agent read that as
"unpinning costs +2" and restored the pin, which re-blocked jump.c and hid the cse
behaviour: the function plateaued for three attempts on that misattribution.

The law: when removing a lever MOVES the residual instead of shrinking it, the new
residual is a different pass. Attribute it with a pass dump before re-adding the lever.
2026-09-02 04:38:41 -06:00
Drew T 072607df7b docs(phase-31): S71 gate 6 (+4, frontier 181) and cookbook §416
Four new byte-proven levers from the overnight lane, none previously in the cookbook:
re-read the store instead of passing the value (CSE store-forwarding), (&SYM)[3] vs a
pointer local as an ADDRESSING choice, one biv with +0/+2/+4 for combine_givs, and a
local's width choosing lh vs lhu+sll/sra.

Also recorded: the same-address twin hint was false three times tonight (ov_SC06_000,
ov_SC01_080, ov_SC03_030) while the same-TU neighbour was the real fuel in every case.

Three of the night's five post-limit MATCHes recovered a body off disk rather than
re-deriving it - func_80181A60 in 2 minutes instead of 16.
2026-09-02 04:32:08 -06:00
Drew T 6d21bed9db feat(decomp): parallel gate — 4 fns across 4 binaries (10 workers)
ov_SC01_084    func_80181310
  ov_SC01_080    func_80180D54
  ov_SC03_030    func_80181A60
  ov_SC06_000    func_80183398
2026-09-02 04:31:28 -06:00
Drew T ab46791e06 docs(phase-31): S71 resumed at 04:11 after the session-limit reset
All five in-flight agents died on the 5-hour limit and returned NO-DRAFT; that is a
harness kill, not a verdict about the targets (R40), so they relaunch unchanged.
Gate 5 banked 2 (commit:3614). launch_check.py added after a stale card burned an agent.
2026-09-02 04:12:25 -06:00
Drew T 0fb99b763b feat(decomp): parallel gate — 2 fns across 2 binaries (10 workers)
ov_SC02_011    func_80182714
  ov_SC04_011    func_80180B24
2026-09-02 02:10:07 -06:00
Drew T 2f46e3e0fc docs(cookbook): §415 - a file-scope decl merges the TU's later block-scope externs into it
gcc-2.7.2 pushdecl/different_binding_level: adding a file-scope extern for a callee that
the TU also declares at BLOCK scope merges those later externs into the global, which
then conflicts with the TU's own definition - and the error names the definition, not the
decl you added. Match the TU's binding LEVEL, not just its type. Byte-proven on
ov_SC04_011/func_80180B24 (215 ins), which also needed the house __asm__ alias for a
file-scope vs block-scope D_ spelling collision.
2026-09-02 02:01:50 -06:00
Drew T 6fac2e0f35 feat(waves): refuse to launch an agent at an ALREADY-BANKED target (R43/R45)
wave_args asserts a target is open AT DRAW TIME, then the payload sits on disk while
gates run. S71 launched ov_SC01_006/func_8017F9F8 from a payload built before the gate
that banked it; the agent spent a full run to report "STALE CARD - already banked
today", with no .s left to score against. Filtering the wave-2 payload found 3 such
targets of 27.

launch_check.py re-asks the same oracle everything else uses (a bank REMOVES the
INCLUDE_ASM stub, so corpus.stubs not containing the symbol IS the bank), either for one
target or by filtering a {wave,targets} payload in place. An unreadable binary is treated
as OPEN - a tool fault is not a verdict about the subject (R40).
2026-09-02 01:59:46 -06:00
Drew T 6716100e57 docs: regenerated progress + backlog from the R22-green fleet (853/1919 = 44.45%, frontier 187) 2026-09-02 01:51:14 -06:00
Drew T 4d7c297b12 docs(phase-31): S71 CHECKPOINT — fleet R22 GREEN 213/213, honest frontier 187 (23 banked), main incident recorded 2026-09-02 01:50:33 -06:00
Drew T dff33f66d9 docs(setup): WSL memory cap lowered 48GB -> 32GB (Drew, 2026-09-02); applies on next wsl --shutdown 2026-09-02 01:49:46 -06:00
Drew T 2f72f8b20d fix(pgate): REFUSE main — an incremental main gate is a FALSE PASS, not just a false diff
S71 ran main through parallel_gate, got "11 banked", committed it, and the R22
clean-fleet verify came back 212/213. main did not compile from clean; once the two
declaration conflicts were reconciled it built and was STILL not byte-identical. All 11
were then re-gated one at a time against a clean build — 11 of 11 REJECT.

The rule was already written down in ox_campaign.gate_main_batch: "main is gated by ONE
CLEAN REBUILD of the whole EXE, never incrementally … main's extract rewrites the linker
script, so an incremental main gate returns a FALSE DIFF." parallel_gate's worker IS
gate_stage, so it inherits that — and S58 recorded the false-DIFF direction while this is
the false-PASS one, which is worse: a false diff wastes drafts, a false pass commits wrong
bytes and reads green until the next clean fleet check (R53's signature — a failed build
leaves the previous object on disk and the SHA check downstream reads it).

Now a refusal naming tools/gate_main.py, not a docstring in the callee (R43).
Cookbook §414, including the two instrument errors made while recovering.
2026-09-02 01:45:21 -06:00
Drew T 6fbdfdb361 revert(main): commit:3586's 11 banks — main did not build from clean, and was not byte-identical
The R22 clean-fleet verify came back 212/213. The failure is main, and `git log -L` puts
all four conflicting declaration lines in commit:3586 — this session's own main re-gate:

  src/800.c:24519  extern int  func_8004355C(s32, void *);   vs :24396 (s32, u8 *)
  src/800.c:26395  extern void func_80038FFC();              vs the s32 definition below

Reconciling both declarations (byte-neutral, §376) made main COMPILE, and it was then
still not byte-identical — so the commit was wrong on both counts, not merely unbuildable.
The gate reported "11 banked" against a tree that cannot compile from clean.

src/800.c restored to commit:3586^; `make extract BINARY=main && make build BINARY=main`
now gives sha1 143dbb89f34491258bbc27810d0a12ec8b43a8dd BYTE-IDENTICAL. The 11 bodies are
kept at .run/S71_main_suspect/800.c.banked11 for a per-function re-gate — this revert is
about restoring a green fleet, not a verdict on every one of them.
2026-09-02 01:41:34 -06:00
Drew T 2814d385ac feat(waves): journal_notes also reads a project-local note file
A stopped agent produces no journal row, so the next agent on that function learns
nothing — including that a scratch directory full of compiled candidates and their
match_one scores is sitting on disk. .run/journal_notes_local.jsonl is the same row
shape read through the same code path, so hand-recorded evidence reaches the pack
exactly as an agent's own note does.

Used immediately: six S71 agents that ran past 36 minutes were stopped to free their
slots; each now has a local note naming its scratch dir and stating that a stop is NOT
evidence of difficulty. All six are back in the draw pool and will draw at the Fable
tier per §413.
2026-09-02 01:33:21 -06:00
Drew T 0e4c98dc97 docs(phase-31): S71 gate cycle 4 — frontier 210 -> 176, 34 banked; residual-class routing + the R48 name-key exposure 2026-09-02 01:31:57 -06:00
Drew T 27cc083de9 feat(decomp): parallel gate — 5 fns across 5 binaries (12 workers)
md_MAIN_028    func_800CB8A0
  md_MAIN_003    func_800D24D0
  ov_SC01_006    func_8017F9F8
  ov_SC07_000    func_8017F69C
  ov_SC07_002    func_8017FCA8
2026-09-02 01:31:10 -06:00
Drew T bfea4affd8 feat(draw): route the model tier off the prior RESIDUAL CLASS, not nins
Measured on S71's own wave: wall-clock tracks iteration count, and iteration count
tracks the residual class, not size. A 26-instruction function took 18 min / 31 tool
calls (regalloc, finished NEAR); a 122-instruction one took 80 s / 10. The 20-33 min
runs were all compiler-internal residuals — scheduling ties, birthing boost, register
colouring, LUID order — where every hypothesis costs a compile-and-measure cycle.

arm_for keys on nins alone, so a 47-instruction regalloc wall could not be drawn at
the higher tier and nothing escalates mid-run. arm_from_history() now reads the
function's own journal notes at draw time and returns fable when they name one of
those classes; it never downgrades the size ladder's choice.
R39 control over 3,147 functions with history x 3 bands = 9,441 decisions:
4,020 upgrades (43%), 0 downgrades.

The control's FIRST form passed over an empty set — it keyed on journal rows carrying
a binary, and there are none: the agent verdict schema never had that field, so every
historical note is name-keyed and the same name is a different function in another
overlay (§238). claude_wave_draft.js's VERDICT now requires `binary`, so new rows are
exact. Cookbook §413.
2026-09-02 01:29:59 -06:00
Drew T fecbfac5f8 docs(phase-31): §412 — §323 carve blocker 2 was a regex blind to __attribute__; 5 of 6 carve overlays cleared 2026-09-02 01:25:56 -06:00
Drew T 7bcb3e51ec feat(carve): §323 blocker 2 cleared — jr-isolate ov_SC03_029 for func_80186A34, byte-identical
The type-name scan matched `}\s*(\w+)\s*;`, which reads `__attribute__` as the name
and fails on the following `((` — so a packed file-local typedef never entered the
carried set, every decl naming it read as an unknown type, and the isolate refused the
whole overlay. Stripping attributes before the scan is the entire fix.
2026-09-02 01:25:06 -06:00
Drew T 93bfa45561 feat(carve): §323 blocker 2 cleared — jr-isolate ov_SC07_000 for func_8017F8B8, byte-identical
The type-name scan matched `}\s*(\w+)\s*;`, which reads `__attribute__` as the name
and fails on the following `((` — so a packed file-local typedef never entered the
carried set, every decl naming it read as an unknown type, and the isolate refused the
whole overlay. Stripping attributes before the scan is the entire fix.
2026-09-02 01:24:53 -06:00
Drew T ad0d883810 feat(carve): jr-isolate ov_SC03_092 for func_8017FE88 — byte-identical, carve refusal cleared 2026-09-02 01:21:49 -06:00
Drew T f0512ff9ee feat(carve): jr-isolate ov_SC03_013 for func_801806F8 — byte-identical, carve refusal cleared 2026-09-02 01:21:36 -06:00
Drew T 49c41094a6 feat(carve): jr_isolate_all places file-local statics — ov_SC03_010's carve refusal cleared
The CARVE-REFUSED class (10 of the frontier's gate failures) has one dominant cause:
"subseg <ov>_jr_<addr> would host NON-CONTIGUOUS .rodata carves", whose named remedy
is jr_isolate_all. The isolate itself then refused 4 of the 6 affected overlays over a
file-local `static inline` helper (bandsetup, setup_80188D90) that has no address BY
CONSTRUCTION — §82.1 helpers exist to shape their caller's code and emit no symbol.

* jr_isolate_all now places such a definition with the ONE region that uses it, and
  refuses loudly if two regions do (two copies of a used static is a byte change, R43).
* overlay_src_split._proto_from_lines no longer prefixes `extern` to a declaration that
  already has a storage class — `extern static inline void f(...)` is "multiple storage
  classes" to cc1. The two changes are inseparable: placing statics is what first made
  the tool emit a prototype for one.

Byte-gated on ov_SC03_010: extract + build rc=0,
sha1 cacaf7c2c08037e6934f9d02c0ae5d7c78cf2463 BYTE-IDENTICAL. jtbl_carve --probe then
moves from `plan-refused` to `tail — standard §8a carve at gate time`.
2026-09-02 01:20:44 -06:00
Drew T 6c4391abb9 docs(phase-31): S71 gate cycle 3 — 29 banked; journal-notes made permanent; jr_isolate_all unblocked 2026-09-02 01:17:47 -06:00
Drew T 8f87334399 docs(setup): WSL2 memory reclaim — autoMemoryReclaim=gradual + the interim cache dropper
Task Manager showed WSL holding 30 GB while Linux was using 4 GB and ~22 GB was
reclaimable page cache (a gate wave reads the 450 MB asm/ tree plus every build
object). .wslconfig had a memory cap but no reclaim policy, so WSL2 never handed
freed pages back to Windows. Added autoMemoryReclaim=gradual (needs wsl --shutdown),
recorded the no-restart manual reclaim, and .run/memkeeper.sh as the interim
automatic form. R21.
2026-09-02 01:17:25 -06:00