Commit Graph

1933 Commits

Author SHA1 Message Date
Drew T e112eff601 fix(phase-29): find_site — a comment-only line halted the extern scan (§68); func_80174CB0 x1 -> x3
TWO mislabels in one tool, both found by making it print what the compiler actually said.

1) compiles_standalone() returned a bare False and the caller filed EVERY failure under
   "overlay-local TYPE (the real cap)". The dominant real cause is undeclared FILE-SCOPE EXTERNS.
   Now returns (ok, stderr) and the skip is classified by actual cc1 output.
2) find_site()'s backward walk over "preceding contiguous externs" skipped BLANK lines but not
   COMMENT-ONLY lines, so a full-line /* ---- */ between two extern groups dropped every extern
   above it. Comment lines are now skipped like blanks and filtered out of the emitted body so
   make_macro never meets a `//`.

RESULT, measured honestly: func_80174CB0 went from "not self-contained" to a 138-member PLAN, but
--recover banked only x3 (ov_SC07_006/007/011); 135 overlays excluded. Those exclusions are NOT
byte divergence (all 138 share h_exact) -- they are the CARRIED EXTERNS colliding with each target
overlay's own decls. The carry is necessary but not sufficient: it must reconcile per-target-TU
(cdecl.compatible(), the shape reconcile_tu already uses). Spec updated in CURRENT_PHASE.md.

- R22 clean-fleet 140/140, 0 failed. dedup-check 1883 validated / 0 failed, C1 coverage complete.
- fleet instr 79.9% (10,501,384 / 13,141,652); +246 ins from the x3.
- WHY THIS MATTERS beyond the numbers: the Phase-21 backlog already prescribed "macro-extern-
  injection frees them x134 (~+0.3%)" and it was never built, because the mislabel told every later
  session these were the known-hard type wall. A wrong diagnostic label cost ~4 phases.
- cookbook §68. NOTE the exclusion message is ALSO mislabelled ("byte-diverge / irreconcilable"
  conflates differing bytes with a non-compiling instantiation) -- logged to fix.
2026-07-25 00:17:08 -06:00
Drew T ceff685a8c docs(phase-29): the carry fix banks x3 not x138 — carried externs must be reconciled per-target-TU 2026-07-25 00:13:53 -06:00
Drew T f109b55441 docs(phase-29): func_8014F3E8 MATCH + the §30#2 widen recipe (15 header + 3349 src decls, all-spellings trap) 2026-07-25 00:10:25 -06:00
Drew T e6053357b8 docs(phase-29): cookbook §68 — the comment-halted extern scan + the mislabel that hid it for 4 phases 2026-07-25 00:00:41 -06:00
Drew T 00b6448f4e fix(phase-29): dedup_propagate — the "overlay-local TYPE (the real cap)" skip was a MISLABEL
compiles_standalone() returned a bare False and the caller attributed EVERY failure to the
overlay-local type cap. The dominant real cause is undeclared FILE-SCOPE EXTERNS: the body
references extern decls living outside the extracted def block (func_80174CB0: 22 of them;
carrying them makes it compile cc1 rc=0).

- compiles_standalone now returns (ok, stderr); the skip is classified by actual cause:
  "missing file-scope extern (CARRY-FIXABLE): <names>" vs "overlay-local TYPE (the real cap)".
- FLEET SIZING (--auto-from ov_SC01_077 --check-only): 7 skipped, ALL 7 carry-fixable, 0 genuine
  type-cap. Three of them (0x80142B2C/0x801535F4/0x80155800) are on the Phase-21 backlog list whose
  note ALREADY said "macro-extern-injection frees them x134 (~+0.3%)" -- never built, because the
  mislabel told every later session they were the type wall. A wrong label cost ~4 phases.
- also: func_80174CB0's local Mtx_/Svec_ typedefs swapped for the canonical shared MATRIX/SVECTOR
  (byte-identical layouts); ov_SC07_006 still BYTE-IDENTICAL 7ca772be.
- value behind the real fix: the 7 (~+0.3pp) + func_80174CB0 x138 (16,974 ins, ~+0.13pp), ~0 tokens.
- _carry_externs itself is SPEC'd but NOT built here: it writes 138 overlay files (§63 class) and
  wants a fresh session with an R22 budget. func_80174CB0 (banked x1) is the test case.
2026-07-24 23:50:38 -06:00
Drew T af59d8a630 feat(phase-29): bank func_80174CB0 (123 ins) — the §65g verdict was a wrong SIGNATURE
SESSION-17 filed this as §65g-class: "not 'run one more tool', but 'needs a transform that does
not exist yet'". Refuted. It needed the correct self-declaration.

- The TU expands DEFINE_func_80174C80() carrying `extern s32 func_80174CB0(s32, s32);`, while all
  ~100 prior drafts defined `void func_80174CB0(s32, s16)` — matches perfectly STANDALONE, dies in
  the real TU with `conflicting types`. Defining it `s32 (s32, s32)` and recovering param_2's
  s16-ness with an explicit (s16) cast at the func_80012558 use site is byte-identical.
- Drafted by an isolated agent (Opus 5 @ High, 65k tok) pointed at the NAMED blocker with the
  canonical callee sigs supplied — not asked to re-derive the C. It self-verified through the real
  cpp->cc1->maspsx->as chain (cc1 rc=0, 123/123 ins, 0 diffs) before reporting, so the bank was
  first-try clean.
- make check BINARY=ov_SC07_006 BYTE-IDENTICAL (7ca772be); R22 clean-fleet 140/140, 0 failed.
- Propagation ×138 follows as a separate targeted step (§55b: bank -> commit -> dedup_propagate --addr).
- FOLLOW-UP LOGGED: the recovery ladder also relaxed `extern s32 func_80174CB0(s32,s32)` -> `()` in
  src/shared/engine_core.h (+2 overlay files), escalating a binary-local bank to FLEET tier. The
  banked def AGREES with the original prototype, so that edit looks unnecessary — to be tested.
2026-07-24 23:43:15 -06:00
Drew T ab67b6980e docs(phase-29): func_80174CB0 banked — the §65g verdict was a wrong signature, not a missing transform 2026-07-24 23:42:08 -06:00
Drew T 16089c7659 docs(phase-29): wave batch 1 — sig-targeted drafting works (MATCH in 55s/32k); blocker walked to the §30#2 macro-widen 2026-07-24 23:38:41 -06:00
Drew T dcab9c68b0 docs(phase-29): fix the recorded waiter recipe — pgrep -f self-matches, use a captured PID 2026-07-24 22:07:44 -06:00
Drew T d9a602e49e docs(phase-29): correct the SESSION-18 checkpoint's round-robin claim in place 2026-07-24 22:07:15 -06:00
Drew T c937f494c6 docs(phase-29): qualify §66d-4 — profile diversity is a lottery ticket (0-for-1 on func_80140958) 2026-07-24 22:06:56 -06:00
Drew T 2bf82c5708 docs(phase-29): note the ILS-watcher anti-pattern (tail -f monitors stay armed after the result) 2026-07-24 22:06:11 -06:00
Drew T fe53cfba82 docs(phase-29): func_80176218 — hoist closed (indexed-global idiom); residual now -2 ins 2026-07-24 21:53:28 -06:00
Drew T 83c96f6c6c docs(phase-29): func_80176734 — dual-width idiom is necessary but not sufficient (+2 ins, frame cascade) 2026-07-24 21:51:46 -06:00
Drew T 8399599dba docs(phase-29): func_8014D820 close=9 is a 3-profile MEASURED floor; backlog updated 25->9 2026-07-24 21:50:30 -06:00
Drew T a3ef424b9f docs(phase-29): func_80176734 — confirm the dual-width load diagnosis, name the C idiom 2026-07-24 21:48:21 -06:00
Drew T b7107d7bcc docs(phase-29): the structural-bucket mis-route + an honestly-sized backlog re-check for P30 2026-07-24 21:47:37 -06:00
Drew T 686aec359c docs(phase-29): cookbook §66d-5 — 'structural' is not a permuter veto (measured counterexample) 2026-07-24 21:46:40 -06:00
Drew T 3ca322402f docs(phase-29): the 84-98 block is provably search-only (11 attempts); round-robin measured both ways 2026-07-24 21:42:43 -06:00
Drew T edc9ae92e1 docs(phase-29): §66d-4 — measured, a REPEATED profile yields nothing (lever is profile diversity) 2026-07-24 21:41:29 -06:00
Drew T 16cfc33839 docs(phase-29): cookbook §66d-4 — amend the 'permuter floor' rule (profile-relative, not absolute) 2026-07-24 21:41:02 -06:00
Drew T d67a6cd492 docs(phase-29): SESSION-18 checkpoint — func_8014D820 25->9, §67 + the profile round-robin finding 2026-07-24 21:40:34 -06:00
Drew T e9f27c0987 docs(phase-29): correct §67 — the a2 $7 pin is still load-bearing, not pin-free 2026-07-24 21:39:12 -06:00
Drew T b5a5186361 docs(phase-29): §67 — stale pins are dead weight; the func_8014D820 seed is now pin-free 2026-07-24 21:39:01 -06:00
Drew T aa7ec67496 docs(phase-29): func_8014D820 12->10 (cse) ->9 (reader fix of a permuter regression) 2026-07-24 21:38:12 -06:00
Drew T 4e0bc0ab92 docs(phase-29): pre-clear func_8014D820's banking path (blocker_probe before the match) 2026-07-24 21:35:23 -06:00
Drew T 3f0c31a1c2 docs(phase-29): func_8014D820 16->14->12 (weight-varied ILS); the block-reorder dead end recorded 2026-07-24 21:32:38 -06:00
Drew T b8e7250c78 feat(phase-29): tools/symcheck.py — the pre-gate symbol-set guard (§67a)
Builds the guard SESSION-17 left as a TODO after the func_801463A0 `_s`-alias trap, where a draft
invented extern aliases no symbol table defines, read MATCH under rtu_match, and could never bank.

- diffs the symbols a draft's object references (reloc records) against the target .s's
  %hi/%lo/jal set; reports MISSING (invented-alias signature) and INVENTED separately.
- fills a real hole: match_one/masked_diff compare relocation-MASKED words (object-vs-.s is
  symbol-agnostic BY CONSTRUCTION) and rtu_match COMPILES WITHOUT LINKING -- so both are
  structurally blind to this class. R34: a second oracle that can disagree with the first.
- NEGATIVE-CONTROL PROVEN: with one data extern renamed to an invented alias, match_one reports
  the SAME 14 mismatched as the correct draft; symcheck exits 1 naming both symbols.
- --c compiles via match_one so the pinned triple/flags can never drift (R33); or --obj.
- applied to the live func_8014D820 close=14 draft: 12/12 symbols agree, so a match there will
  link cleanly -- the §65c class is ruled out for it in advance.
- cookbook §67a + SETUP tooling-inventory row (R21). Necessary condition, NOT a match oracle:
  still finish on the whole-binary byte-gate (G3/P9).
2026-07-24 21:30:08 -06:00
Drew T 34417179df docs(phase-29): func_8014D820 25->14 by reading — the §67 arg-copy PLACEMENT lever
- PROBE ANSWERED (the SESSION-17 open item): a0's first use is body-line 41, a1's is 28
  -> use order ALREADY matched the target's birth order while birth order was inverted.
  The §31 RC-1/RC-2/RC-3 first-use-order hypothesis is REFUTED for this class; decl order
  is inert too. Both retired, do not re-buy.
- ROOT CAUSE (byte-read): gcc schedules the arg->pseudo entry copies as ordinary in-block
  insns and hoists an unconstrained one to the earliest slot. Mine raced `move $s4,$a0` to
  idx 2, which freed $a0 to become the early load temp (target: $v1) and left the target's
  idx-12 load-delay slot unfilled. The "wrong temp reg", the mirrored `sw $sN`/`move $sN`
  prologue and the +1 instruction were ONE defect in three costumes.
- THE LEVER (cookbook §67, written in-session per R30): an UNPINNED launder
  `__asm__ __volatile__("" : "=r"(pv) : "0"(p));` placed at the statement where the target's
  copy lands, later uses rewritten to pv. Zero instructions. Prerequisite: collapse redundant
  pointer aliases first (the two-pseudo split made gcc serve the first use from the incoming
  arg reg). Placement is the knob and is NOT linear -- sweep 3-4 anchors (3-statement plateau).
- 25 -> 16 by reading; permuter_ils (REGALLOC, 10x180s) 16 -> 14 in cycle 1 then x9 unchanged
  (§66d-3: a repeat means stop). Its edit is semantics-preserving (hoists desc.y+0x10) and
  cleared the idx 271/272 cluster. Seeds tracked: s18_func_8014D820_close{16,14}.c.
- MEASURED NEGATIVES recorded so they are never re-bought: pinning the laundered var to $s4
  (pre-stages via $t0, 305 ins); pinning the reused temp t to $3 (287/303); an artificial
  "r"(t) dependency (inert -- gcc still hoists); laundering after the beqz (305); dropping the
  a2 pin (29); wholesale pos/desc reorder or sinking z0=ent->z (+1 ins).
- NOT banked (G3) -- residual 14 in 2 clusters: idx 21/22 scratch $v1 vs $a0, idx 84-98 the
  desc.y/currentLocationId schedule. SCHEDULE-weighted ILS running from the close=14 seed.
- Also measured: func_80140958 260/260 54 - func_80176734 371/371 56 - func_80176218 328 vs
  327, whose +1 is NOT §67 (it hoists a global address into an extra callee-saved $s6 that the
  target rematerializes -> the §17 array-decay lever).
2026-07-24 21:27:14 -06:00
Drew T 76d5d5437d docs(phase-29): SESSION-17 closing checkpoint — next session starts on the giants (full handoff) 2026-07-24 20:55:30 -06:00
Drew T 11e6895e52 docs(phase-29): the Ghidra-C prefetch is measurably spent — 0.51pp ceiling across 87 overlays
- Measured locally (no MCP): per-overlay stubs that are substantial AND uncached AND undrafted = what
  an import would unlock. Best single overlay 6,062 ins (0.05pp); fleet total 67,116 ins (0.51pp).
- Task 5's greedy cover (+1.59pp for ov_SC06_018) was a snapshot of a CONSUMABLE and has been consumed
  by the s14/s15 waves + permuter runs. What remains is overlay-unique tail across 87 overlays, each
  needing a server restart + a human /mcp for ~0.01pp.
- Ranked: giants ~+1.3pp (seeds ready) > func_801463A0 ~+0.11pp > the ENTIRE prefetch ~+0.51pp at 87
  human-gated imports. The prefetch is now the worst lever on the board.
- R14 on myself: a 3-line ls of two dirs made func_8014032C look never-attempted; the full glob found
  6 drafts. The fleet figure (0 cached+never-drafted at live>=100) stands. Same failure as §66c, twice
  in one session — prefer the glob over a hand-listed pair.
2026-07-24 20:47:48 -06:00
Drew T 75f56b16b8 docs(phase-29): func_801463A0 — both §H antidotes inert (2 byte-recorded negatives)
- Balanced-if diamond and a zero-ins memory barrier both leave it at exactly 100/36, unchanged.
  Why: §H kills a fold ACROSS A JOIN; here both uses are adjacent statements in the same basic
  block, so there is nowhere for a fresh cse table to start.
- State: a standalone MATCH (101 ins) exists with direct-symbol u16 decls, blocked ONLY by the
  canonical "extern u8 D_80126BE0[]" living inside a DEFINE_func_* macro body (engine_core.h:19813).
  Exits: (a) demacroize = x1 trap (+101 ins, forfeits x138), (b) change the shared decl = T2 /
  §63 disaster class, (c) a C form that keeps u8[] and defeats the address CSE = the open question.
  +13,938 ins if (c) lands. Do not re-buy (a) or the two antidotes.
2026-07-24 20:41:27 -06:00
Drew T 3d26cef9ad docs(phase-29): func_801463A0 driven to standalone MATCH; one named blocker left (§H antidote)
- 3 falsified hypotheses, then MATCH (101 ins) with direct-symbol scalar decls. The length gap was
  the target re-materializing "lui $at,%hi(sym)" per scalar store while array/struct forms let gcc
  CSE the address into a register (1-ins stores) -> mine was exactly one instruction short.
- Remaining blocker NAMED: the TU's canonical decl is "extern u8 D_80126BE0[]" INSIDE a DEFINE_func_*
  macro body (engine_core.h:19813), so the matching u16 form gives conflicting types in the real TU
  (real cc1, via rtu_match --stderr-out).
- demacroize would clear it but banks x1 (+101 ins) and forfeits x138 — a trap, not a win. The right
  exit is the §H CSE address-fold antidote (balanced if/else diamond, zero asm) so the canonical u8[]
  decl stays and the bank propagates x138 (+13,938 ins). Both draft forms preserved.
2026-07-24 20:39:57 -06:00
Drew T 8940347855 docs(phase-29): func_801463A0 — the §65c root cause found and fixed (invented _s symbol aliases)
- rtu MATCH (101 ins) vs gate reject, baseline intact -> divergence had to be in a relocation.
  All 9 jal targets agreed; of 15 data symbols the target uses, the draft referenced 14 — missing
  exactly D_80126BE8.
- CAUSE: the draft declared D_80126BE0_s / D_80126BE8_s — `_s`-suffixed aliases NO symbol table
  defines, invented because D_80126BE0 was already declared at a different type in the same draft.
- MECHANISM CORRECTED (§65c refinement): rtu over-claims not merely because it is relocation-masked
  but because it COMPILES WITHOUT LINKING — an unresolvable extern is invisible to it by construction.
  Cheap general guard: diff the draft's symbol set against the target .s's %hi/%lo/jal set before
  gating (one comm over two greps; found this in seconds).
- FIXED: real symbols referenced, duplicate u8[] decl dropped, store re-expressed via &. Residual is
  now an ORDINARY near-miss (100 vs 101 ins, 36 mismatched, regalloc/fold) -> permuter fuel.
  Draft preserved at .run/giants/s17_func_801463A0_symfix.c.
2026-07-24 20:32:52 -06:00
Drew T 04450d75a0 docs(phase-29): the 2 typedef-blocked drafts are §65g-class — 0/2, blockers stack 3 deep
- Did it properly: per-TU provided set via cdecl.typedef_names(tu_path) (217/215 names; it takes a
  PATH), strip_provided_typedefs dropped 2/2 typedef lines from each draft, then the DRIVER's ladder.
  pass 1 banked 0/2; src/ restored exactly.
- The stack: func_80156670 S8 -> B8 -> conflicting types for D_801270A8 (a DATA extern);
  func_80174CB0 MATRIX/SVECTOR -> conflicting types for func_80012ABC (a callee conflict
  cast_call_sites did not clear). cc1 reveals only the first layer each time (§65).
- NEW STATIC-ORACLE BLIND SPOT (R34 earning its keep): func_80156670's data conflict is CC1-ONLY —
  the static oracle says `none` while real cc1 fails. First cc1-only case measured (SESSION-16 was
  36/36 agreement). A `static: none` verdict is not evidence a draft is clean.
- Stripped drafts kept at .run/perm_s17j/ so the next attempt starts 3 layers in. ~+0.4pp if solved.
2026-07-24 20:25:50 -06:00
Drew T f8534a6dbb docs(phase-29): SESSION-17 final checkpoint — 3 banks ×138, driver verified, spine refreshed 2026-07-24 20:02:02 -06:00
Drew T 25a02d6940 feat(phase-29): propagate 2 integration banks ×138 — fleet 79.7 -> 79.9% instr, R22 140/140
- func_8012B4B8 (84) + func_80169228 (105) propagated via targeted --addr (--check-only first,
  never --auto-from): 138 overlays byte-identical, 2 new dedup groups, ~+26,082 ins.
- R22 clean-fleet: check-all 140 passed, 0 failed of 140. Fleet fn-count 88.90 -> 88.98%.
- The 3 non-banks are diagnosed, not guessed (blocker_probe, both oracles agree): func_801463A0 is
  a real-cc1 MATCH in its own TU that the gate still rejects (§65c rtu-vs-gate divergence, link-level);
  func_80156670/func_80174CB0 carry "drop when banking" typedefs textually identical to the canonical
  ones. Blockers STACK — stripping the cc1-named typedef exposed the next (S8->B8; MATRIX->a callee
  conflict). Remedy named: strip ALL shared-provided typedefs, then run the DRIVER's ladder.
2026-07-24 20:01:31 -06:00
Drew T 1d225747ba feat(phase-29): 2 stranded reach-138 drafts banked from the refreshed spine — R22 140/140
- Ladder-only recovery (no demacroize, so these are NORMAL banks that can propagate x138):
  func_8012B4B8 (84 ins) + func_80169228 (105 ins), both confirmed gone from src, not read off
  the report (§55b trap 4). 2 of 5 candidates.
- DRIFT-CHECK EARNED ITS KEEP (R14): the backlog's close=0 was wrong for 2 of the 7 spine entries —
  func_8012CC88's draft is for ov_SC07_006 and is 13 off in ov_SC01_077 (the documented
  'backlog drafts are overlay-specific' caveat, now confirmed), func_80158638 is 2 off, not 0.
- The cross-file churn is gate_stage's own fix_arity_callers --any-proto pass on the banked fns'
  caller decls (byte-neutral no-proto widening; comments preserved, H5). R22 clean-fleet 140/140.
- Diagnosed the 3 non-banks with blocker_probe (both oracles agree 3/3): func_801463A0 = real-cc1
  MATCH in its own TU yet gate-rejected (the §65c rtu-vs-gate divergence); func_80156670 and
  func_80174CB0 = local_type collisions on 'S8' and 'MATRIX' -> uniquify (T0, draft-only).
2026-07-24 19:52:58 -06:00
Drew T a34acfd91f docs(phase-29): func_80176218 271->110 (converged) — giant queue complete; the refreshed spine points at integration next 2026-07-24 19:39:27 -06:00
Drew T 1004668405 chore(phase-29): regenerate the fuel manifest + worklist — the decision spine was 9 days stale
- Stale spine claimed 223 live stubs / 870,668 ins and ranked 3 already-banked fns in its top 7
  (func_801325B8, func_8014ADE0, func_8012CC88-in-077 verified 0-live in src).
- TRUE state: 160 live stubs / 583,077 ins remaining gain.
- SHARP EDGE (R35): worklist.py --assert-partition exits at the assertion and does NOT rewrite the
  doc, so 'regenerating' with it leaves the stale file in place and still exits 0. Run it bare to write.
2026-07-24 19:38:31 -06:00
Drew T 5c4325f9cc docs(phase-29): SESSION-17 closing checkpoint — every giant driven to its permuter floor; 3 seeds preserved
- func_80176734: 76 -> 57 in cycle 1, then flat x9 (converged). Completes the queue.
- Seeds TRACKED at .run/giants/s17_*.c — the allowlist covers .run/giants/*.c but NOT subdirectories,
  so they go at the top level (the R20 trap: a subdir would have left them untracked and one
  git clean from gone).
- Queue state: 80177940 BANKED x138 | 8014D820 25 (toolkit exhausted -> Fable5) | 80140958 56 |
  80176734 57 | 80176218 271 (never run). ~+1.3pp instr if the four crack.
2026-07-24 19:32:26 -06:00
Drew T 26e613d93a docs(phase-29): func_8014D820 — the §17 toolkit is exhausted (4 moves, all inert or worse); now a justified Fable5 case
barrier-on-a1 25 (inert) | barrier-on-a2 25 (inert) | param-staging via pinned $s3/$s4 35 | staging+barrier 34.
Staging DID fix the register assignment (loads via $v1 like the target) while shuffling birth order, so
the two are separately steerable and no tried combination gets both. Residual reproduced independently:
gcc copy-propagates the $a3 pin, so mine loads through incoming regs where the target uses the copies.
2026-07-24 19:27:24 -06:00
Drew T 8fffb945c8 docs(phase-29): SESSION-17 final checkpoint — func_80140958 converged 116->56; both giants handed forward as reader seeds 2026-07-24 18:28:16 -06:00
Drew T ff19fdec5e docs(cookbook): §66d-3 — read the ILS per-cycle series, not its final best 2026-07-24 17:18:09 -06:00
Drew T 5be57b0ec2 docs(phase-29): func_80140958 ILS 116->59 and still descending — continuation launched
Per-cycle 80/75/72/69/64/62/60/59, monotone, never repeating. The readable signal: a repeated best
score means DONE (func_8014D820: 25 x7 -> reader/Fable5); a still-falling last cycle means
BUDGET-LIMITED (buy more cycles, it is CPU not tokens). Read the series, not the final number.
2026-07-24 17:17:51 -06:00
Drew T 3299bad2b8 docs(phase-29): func_8014D820 ILS plateau at 25 + inert §17 barrier probe — a measured stop
- permuter_ils from the 27-waypoint: 27 -> 25 in cycle 1, then UNCHANGED for 7 cycles.
- Residual read: target emits $s3<-a1 first, $s4<-a0 twelfth; mine the reverse. Same mapping,
  swapped BIRTH ORDER, cascading into prologue save order + load base regs. §17 register-ORDER class.
- A one-line scheduling barrier on a1 (after the decl block; before it is a C89 error) changed
  NOTHING. Corroborates the drafting agent's swept-pins note. Seeds carried; do not re-spend CPU.
2026-07-24 16:51:01 -06:00
Drew T e6354ae82d docs(cookbook): §66d correction — [structural] is a hint, not a veto
func_80177940 was structural(OPCODE-MIXED) at close=5 and the permuter still took it 5->1: the class
names only the DOMINANT residual. Policy: at low closeness run the search anyway (CPU, not tokens);
at high closeness read first.
2026-07-24 16:45:55 -06:00
Drew T b7d86356e1 docs(phase-29): SESSION-17 checkpoint — driver verified, wave premise refuted, func_80177940 banked x138 2026-07-24 16:42:51 -06:00
Drew T cfa421eef2 docs(cookbook): §66d — the permuter/reader loop, and what transfers between giants
- The two halves of a 'not steerable from source order' note belong to different tools: the permuter
  closes INSN_LUID scheduler ties a hand sweep provably cannot enumerate; the reader closes semantic
  fixes the mutation set cannot invent. residual_class's bucket ([permuter] vs [structural]), already
  printed by match_one, is the free handoff signal; its profile feeds p16_permute --klass verbatim.
- Diagnose from a byte-verified SIBLING, and test the naive reading first: deleting the redundant mask
  alone COLLAPSED the copy (100 vs 101 ins), which is what proved a distinct PINNED register was needed.
- §66d-1: the LOOP transfers between giants, the PIN does not (the same move cost func_8014D820
  285 mismatched). §66d-2: setup() wipes the scratch dir; the cleanup pkill was global.
2026-07-24 16:42:20 -06:00
Drew T 32de37fff4 feat(phase-29): propagate func_80177940 x137 — 138 overlays byte-identical, R22 140/140
- Targeted `dedup_propagate --addr 0x80177940 --recover` (NEVER --auto-from; --check-only first
  confirmed the plan held exactly this one address, so the de-macroize hazard could not apply).
- 138 overlays rebuilt byte-identical; 0 stubs remain for the address; 1 new dedup group registered.
- R22 clean-fleet: check-all 140 passed, 0 failed of 140.
- Fleet: fn-count 88.86 -> 88.90%, instr-weighted 79.6 -> 79.7% (+13,938 ins = 101 x 138),
  distinct-code 64,874 -> 64,875 unique fns.
2026-07-24 16:41:44 -06:00