249 Commits

Author SHA1 Message Date
Drew T f3b8af0ec1 phase-37: CHECKPOINT for a fresh session (84 % context) — T4 in progress: the D cycles (17,316 declarations canonical, 1,302 K&R sites marked, 207 data aliases typed, 10 __builtin_abs), the alias-defined-function class (120 of 149 back under their real names, 29 kept with causes; the unit's per-file prototype ladder, the hoist, the K&R-style definition), the planner's DECL-NONE settling; the timeline's lower panel redrawn on Drew's word (every lever increment with its method, the casts as two instruments); decision log + accelerators P37 S107, story §10 + retrospective §7 advanced; the 🛑 block rewritten with T4's exact resume | R22 check-all: 218 passed, 0 failed of 218 at f2b58011e | 🛑 T4 NEXT (resume per the checkpoint §1) 2026-09-12 14:32:37 -06:00
Drew T 32673a7d90 chore(phase-37): the size gate = GitHub's 100 MiB hard limit (was its 50 MiB warning) — the red no-rom CI was SIZE alone on the P36 judgement ledger (74.8 MiB, our own rows; ROM checks 1/2/4 clean), Drew's decision; audit_public WARNs above 80 MiB; workflow, wiki and SETUP wording follow | audit_public: OK — 0 offenders among 15219 tracked paths | 🛑 T4 NEXT 2026-09-12 10:10:09 -06:00
Drew T 545092d376 phase-37: T3 ☑ — the tools: tools/struct_layout.py (the o32 layout engine + the canonical-type writer in the final style + the naming invariant), tools/restruct.py's full form (rungs S/S2/S+A/X/R/D/L, the ledger, inflight restore, selftest 48 + --real 53), delever_oracle's LINKED mode (the build's own ld on the candidate object; f3 known-true + negative; the snapshot guard that caught T2's contaminated build/ object), include/common.h's reinterpret macros (proven equal on cc1's assembly), tools/restruct_cycle.sh (detached); rung D banked on ov_SC04_011 (258 units: 242 canonical / 8 K&R marked / 16 kept with causes); SETUP §P37 S107, dictionary rows, kit corpus, decision log + accelerators P37 S107, cookbook §458 addendum, story §10 + retrospective §7 + timeline | R22 check-all: 218 passed, 0 failed of 218 (r22_t3c) | 🛑 T4 NEXT (the declaration layer; P6 rules check first) 2026-09-12 10:04:16 -06:00
Drew T cd39c79de6 phase-37: T2 ☑ — the probe: rung 1 (struct spelling) byte-neutral on 126/139 judged bodies (90.6 %, 716 sites moved), rung S2 closes 13/13 DIFFERS with 27 casts kept (139/139); the definition's signature free for 4,473/4,828 (TU, callee) pairs (92.6 %, 0 DIFFERS; 355 compile refusals = K&R sites + multi-spellings); the definition fold 12/20 TUs clean (opaque folds need member renames); the layout engine cc1-validated on 5,283 definitions / 29,248 fields (0 rejected; two engine gaps fixed: nested-paren attributes, per-field aligned(N); 27 dead-guarded standalone blocks blanked); the relocation control (object DIFFERS, binary identical) proves T3's linked mode; engine_types.h fan-out 3,975 objects in 35 s; tools/restruct.py (--try/--probe/--probe-decls/--probe-defs/--audit-layouts/--fanout-cost) + SETUP + dictionary | 🛑 T3 NEXT (the tools, Max design) 2026-09-12 01:27:45 -06:00
Drew T da26c05d67 phase-37: T1 ☑ — tools/type_census.py + the struct map: 7,261 struct definitions (525 layouts, 206 duplicate classes / 2,789 names, 39 VARIANT), 503,016 raw pointer-cast dereferences in four forms (coverage OK; + 18,912 address-of, 36,681 typed cast-member), 98,648 lying declarations / 1,609 callees, 18,760 evidence-clustered types explaining 99.2 % of sites, 24 parked P36 classes in parked.tsv, controls 4/4; lever_census controls re-keyed and --strict made literal (6,717 direct GTE statements in bodies); progress.py types block + README sentence + 2 corrections; the readability series read by column name with 16 census columns; docs/struct-map.md; SETUP §P37 S106; dictionary row; kit corpus | 🛑 T2 NEXT (the probe, Max) 2026-09-11 23:54:15 -06:00
Drew T b3369d0279 phase-36: T8 — lever_census --selftest + --check wired into make tools-health (0 UNMARKED, 0 orphans); --strict stays the structs phase's finish line 2026-09-11 20:23:35 -06:00
Drew T 5c80301196 phase-36: S105 — the strip keeps a block-comment tail and drops the marker rung B wrote inside it: the six comment-boundary UNSTRIPPABLE classes strip (0 orphans); selftests OK 2026-09-11 18:35:38 -06:00
Drew T bb2012f78d phase-36: S105 harvest f7 — R22 tries every same-base sibling (not only the literal base) and no longer reads a cast store as a set; known-true 37 → 0 on func_8017FD14; selftest OK 2026-09-11 14:07:56 -06:00
Drew T 4a503fce1e phase-36: S105 harvest f5 — generators R45 derived_pointer_store (known-true 0 alone on two f5 bodies) and R46 set_once_chain (ALL 0 on func_8018FA34); selftest OK; SETUP rows 2026-09-11 13:25:01 -06:00
Drew T ae522dbc49 phase-36: S105 harvest f2 — generator R44 counter_derived_pointer (known-true 0 on e21's start text, 18 on f2's loop 2), R22 extended to same-base offsets, the && read-as-&p refusal in R22/R44 fixed; selftest OK 2026-09-11 11:56:31 -06:00
Drew T 37b7433691 phase-36: S104 agent-start pass — 14 MATCH of 27, 0 new banks (all already closed by agents or parked; the bank filter recorded in SETUP); e37 packs (ov_SC03_097) 2026-09-11 04:48:05 -06:00
Drew T 2fe2d27f1f phase-36: generator R43 sign_test_to_mask (+ dead-pad drop; a composition move); e26 (11) + e28 (6) banked 2026-09-11 04:06:10 -06:00
Drew T c97b798d9d phase-36: delever_regen also starts from an agent's lever-free near-miss (e22: the families finished its 28 body in one pass); e22 banked 3 (ov_SC06_029); func_80185D44 stays at its one lever 2026-09-11 03:55:08 -06:00
Drew T 2b1393dd9a phase-36: lever_free_body refuses a strip that unbalances block comments (R43) — e24 found a start text left as invalid C; 7 residue classes had been silently UNSCORED, now named 2026-09-11 03:17:48 -06:00
Drew T b93e3cab89 phase-36: R39 widened — 1–3 statements after the join, blank lines skipped (e24's store pair; known-true 0 on all three) 2026-09-11 03:16:25 -06:00
Drew T c621e6d82f phase-36: generator R42 move_statement_far (e19; a composition move — alone 8 on its start text); e19 banked 4 (ov_SC01_080) 2026-09-11 02:49:19 -06:00
Drew T 99355f6723 phase-36: generators R40 return_preincrement and R41 swap_if_else_arms (e2/e16), known-true 0 on all three; e16 banked 4 (800_b_2) 2026-09-11 02:35:25 -06:00
Drew T bd6fc3c5c1 phase-36: generator R39 duplicate_join_statement (the integer-tie split of e12/e14; known-true 0 on two of three) 2026-09-11 02:30:13 -06:00
Drew T 8caf6ba259 phase-36: alloc_table prints gcc's truncated integer priority and flags ties (global.c:594-607) — e14's integer-tie closes were invisible in the float column; e14 banked 4 (ov_SC06_010) 2026-09-11 02:29:04 -06:00
Drew T d737200579 phase-36: generator R38 shift_to_division (e7's hand-expanded signed division as a real division; a composition move — alone 6 → 6/7 on e7's start text) 2026-09-11 01:21:37 -06:00
Drew T 16c9d2fb6d phase-36: delever_pack's related search falls back to the TU's directory for main (every main pack's related.txt was empty); e3 banked func_80036FB0, parked func_800384A8 (s16→s32 parameter) and func_80037144 (linked-identical, needs gate_main); e8 packs 2026-09-11 01:07:58 -06:00
Drew T 8fb959e077 phase-36: R31 emits an all-shifts cast candidate (d39) and R35 handles cast copies of a parameter (d38), both known-true 0; named_definitions indexes func_X_body asm-label definitions 2026-09-11 00:13:37 -06:00
Drew T bbe0d66336 phase-36: generator R37 return_constants (d27: a pinned result local as constant returns; known-true 0) 2026-09-10 23:26:58 -06:00
Drew T ba98d26df8 phase-36: R23 accepts a case/default label as a statement boundary (d22's split, known-true 0); generators R35 drop_param_copies (d24) and R36 merge_set_chains (d25, known-true 0) 2026-09-10 23:11:13 -06:00
Drew T d94d993102 phase-36: generators R28 merge_pinned_twins, R29 fold_store_temps, R31 shift_operand_casts, R32 compound_assignments, R33 else_arm_assignments, R34 merge_disjoint_locals — harvested from d1/d5/d8/d12/d13/d14/d15/d19, each run against its agent's start text (R31/R32/R33 reproduce the close, R28/R29 the measured single-move score); METHOD step 13 2026-09-10 22:27:07 -06:00
Drew T 06302b97c2 phase-36: S104 — the census counts a marker on a kept ordinary-C fake (do-while / dead init, Drew's ruling (a)) apart instead of as an orphan; R7 marks its do-while; log: d1–d10 all at 0, R27, the R97 correction for 830650946 | 🛑 T7 RUNNING, census 4,928 / 0 unmarked, exit 0 2026-09-10 21:51:49 -06:00
Drew T 30fd6796f9 phase-36: generator R27 named_ports — the same function lever-free in another binary, ported by pairing the two original objects' relocation sequences (+ carried file-scope externs, the target's return type); wired into delever_regen and recipe_candidates; 511/1,010 residue classes have a donor, a 24-class probe closed 4; METHOD step 12 (S104's landings) 2026-09-10 21:43:05 -06:00
Drew T 7b6418c179 phase-36: the census walker defaults to the tree's cross-file asm-macro table for every out-of-census caller (delever scrub/bank/judge) — S103's scrub false positive on an ENGINE_SHB launder reproduced and fixed; control still finds a real orphan; census unchanged 5,097 / 0 unmarked 2026-09-10 20:54:20 -06:00
Drew T 48176e51ff phase-36: delever_regen forks worker processes after warming the shared caches (threads sat on the GIL with zero compiles) and appends each judged class to <label>.jsonl as it lands; the S104 all-families sweep runs 2026-09-10 20:50:56 -06:00
Drew T aada3bdc2b phase-36: the first minimum-lever bank (func_80177B5C: 1 marked launder instead of 23 levers, 133 bodies); c43/c44/c45/c37 closes with their cross-address copies (delever --port-scan); generator R26 alias_repeated_addresses (known-true: c45's close from its start text) (R22 218/218) 2026-09-10 18:32:46 -06:00
Drew T 01f066923d phase-36: re-draw c21 — func_801397B0 closed (a do-while reference-weight wrapper, on the a4/c15 precedent), 125 bodies; c22's and c28's readings (func_8012E364 at 4, func_8013F350's head irreducible); --try parallel-safe per call with --keep (R22 218/218) 2026-09-10 17:14:30 -06:00
Drew T e984e5822f phase-36: re-draws c25 (func_80166F58, a narrowing copy) and c26 (func_80133CD4, split temps) closed, 254 bodies; tools/localalloc_sim.py (c26's local-alloc simulator, 0 mismatches over 150 blocks); propagate no longer trusts stale ledger hashes; R25 regen 3 classes; regen reports COMPILE-ERROR (14,xxx -> 13,083 sites, R22 218/218) 2026-09-10 16:58:01 -06:00
Drew T 96820256ce phase-36: re-draws c24 (func_8012956C: a phantom 4th argument + a switch) and c23 (func_80133784: the exit block inside a real loop, overturning b4's de-loop reading) closed, 252 bodies; R25 trim_arguments; argcheck reads K&R definitions (95 callees were invisible); the selftest asserts every dispatched family is registered (R22 218/218) 2026-09-10 16:45:14 -06:00
Drew T a620e1880f phase-36: generator R24 (the addPrim copy read as a whole word, c20's move) + its regen pass (2 classes, the func_80140D68 header on 140 objects); c13's reading of func_80140958 (43 -> 4, not closed) (R22 218/218) 2026-09-10 15:57:16 -06:00
Drew T 9f2b6b24aa phase-36: cc1_dumps_tu.sh takes a .c file and resolves ../shared includes (six agents had written their own dump.sh) 2026-09-10 15:43:03 -06:00
Drew T 164825b5d8 phase-36: delever_regen — R22+R23 re-run over the whole residue closes 17 classes / 22 bodies with no agent; --try learns header TUs (24 classes had never been scorable) (17,715 → 17,692 sites, R22 218/218)
- tools/delever_regen.py: read-only pass (both starting texts, only the named families, delever_search --try --body,
  one worker per class) + --bank (re-score on the current tree, apply_body_core, propagate); dictionary + SETUP rows
- pass 1: 1169 classes in 127 s, 14 MATCH; the 25 UNSCORED read before banking: 24 were header-TU classes whose
  includer's ../shared include never resolved in --try (fixed; controlled: unchanged body 0, lever-free 32, mutated 1),
  1 a body-local #define (R22/R23 now refuse preprocessor lines); pass 2 over header TUs: 104 judged, 3 MATCH
- banked: 14/14 + 3/3 (two shared headers IDENTICAL on 141 objects each); R23 12 classes, R22 5
- check-all 218 passed 0 failed; lever_census 17,692 marked 0 UNMARKED
2026-09-10 15:36:01 -06:00
Drew T a060705725 phase-36: T7 agents c14 + c16 — func_801670E4 (all seven levers; its refuted @stuck note replaced in 136 copies) and func_8013D178 (one pointer per if-group), 261 bodies; R23 widened to one open block and now closes func_8013D178 alone; c9's reading of func_8013CF68 (38 -> 10, not closed) (18,776 → 17,715 sites, R22 218/218) 2026-09-10 15:24:01 -06:00
Drew T e6a8f35052 phase-36: T7 agents c12 + c10 — the func_80148E54/D44 twins (implicit handler argument) and func_80135A4C (cross-jump tails, parameters passed through), 395 bodies; delever_pack writes related.txt (20,206 → 19,276 sites, R22 218/218)
- c12: c3's reading held on both twins — the angle as the handler's first argument + tmp reused as the later operand;
  the stale 'jalr with no args' comment corrected in the 135 files whose body now passes it
- c10: jump2 cross-jump merged two walk tails (exits now fall to the single final return), the s16 SUBREG gate, and
  func_80135480 called at its real arity; its answer was func_80135888 in another file
- delever_pack related.txt: lever-free bodies in the overlay sharing a func_/D_ symbol, ranked (known-true: top hit for
  func_80135A4C is func_80135888); METHOD_S103 +6 emitter entries; SETUP rows
- apply-body IDENTICAL x3, propagate 131/131 x2 + 133/133; check-all 218 passed 0 failed; lever_census 19,276 marked 0 UNMARKED
2026-09-10 15:03:27 -06:00
Drew T 2e61220bde phase-36: T7 wave c — seven agent closes (c4 c6 c1 c7 c3 c5 c8) + func_8017EEC0's parameter, ~1,000 bodies; generator R23; CI's verbatim_check fixed and wired into tools-health (23,988 → 20,206 sites, R22 218/218)
- closes, each --try 0 then apply-body IDENTICAL + propagate N/N 0 refused: func_80133AB0 (u16 width moves), func_80130D48
  (one call per goto-tail site), func_80135168 (reused temps split + H16 member store), func_80134A74 (widths + join
  statement in both arms), func_80148AFC (implicit handler argument + later operand), func_8015D738 (jump threading:
  re-read + a do-while on precedent, the class raised with Drew), func_80135004 (temp split + argument from its global)
- func_8017EEC0: the uninitialised a0v T4 tus10 left is the parameter (8/8, IDENTICAL)
- CI red since cb2fb5e6d: verbatim_check --strict saw the DECOMPILE-NOW row func_8017EEC0 converted; row removed (one
  row), --update keeps order + UTF-8 (proven equal to the hand fix), verbatim_check --strict now in make tools-health
- delever.split_reused_locals = family R23 (selftest + two refusals; known-true: joint split = the agents' measured 12/26)
- check-all 218 passed 0 failed (twice); lever_census 20,206 marked 0 UNMARKED; Drew: at most five concurrent agents
2026-09-10 14:56:17 -06:00
Drew T 205331765f phase-36: T7 agent c2 — func_8013D8FC closed (the walked-pointer merge), 131 bodies; harvested as generator R22 (24,119 → 23,988 sites, R22 218/218)
- agent c2 (Opus): a second pointer q = p + 5 stepped in lockstep with p kept a second biv alive (loop.c strength
  reduction, -dL 'Cannot eliminate biv'); one pointer lets combine_givs fold every field read onto one base
- bank: apply-body IDENTICAL, propagate 130/130, check-all 218 passed 0 failed, lever_census 23,988 marked 0 UNMARKED
- delever.merge_walked_pointers = family R22 (selftest + two refusal controls; known-true: the agent's start text's
  candidate is its closing body, --try score 0); leads the COUNT class after R19 in delever_search; SETUP row
- S103 opening: the method addendum .run/P36/agents/METHOD_S103.md; wave c launched (six agents); Fable out of credits,
  c5/c6 relaunched on Opus
2026-09-10 14:30:30 -06:00
Drew T 82da34b392 phase-36: the S102 checkpoint — the session's method, every new tool documented, and what the next session must not rediscover
30,358 -> 24,119 lever sites (-6,239) in 6,317 bodies; 22 agents across two waves (14 closed, 8 read without closing);
generators R15-R21 added, each with a selftest and a known-true check against the body it was harvested from; 16,759
lying call declarations repaired free across 3,439 units; check-all: 218 passed, 0 failed of 218 at every step.

- docs/SETUP.md gains section P36 S102: the generator table R15-R21 naming the body each came from, the call-signature
  tools, the baseline snapshot that makes the fleet gate and the agents independent, the repaired dump tools, and the
  packs. Every tool has a tool_dictionary row; tool_census --check and doc_links --strict are green.
- the checkpoint carries the operating procedure (the agent lane is the main lane and is never empty; only one writer;
  reconciliation after a killed run), the method that closed 14 of 22 bodies in order, the exact invocations, the
  gotchas that cost something, and the open items by name.
- the three JOINT generators are called out as such: R20, R21 and b7's four-way retype all win only as a single edit
  whose every intermediate step scores WORSE than the start, so a beam that composes one move at a time walks away from
  them. Generate the joint candidate; do not trust the search.
- two refusals recorded as standing practice: an invented identically-zero term is not banked (R20 closed that body
  honestly hours later), and a body whose improvements are compensating errors is reported rather than banked.
2026-09-10 14:07:32 -06:00
Drew T 374c8a0e97 phase-36: apply the R14 premise correction that the previous commit's message claimed but did not contain
The edit in 161d36cf3 failed its match assertion while the commit went through, so that message over-claimed: it said
R14's documented premise was corrected and the file was unchanged. Naming it here rather than quietly fixing it (R66 —
write 'done' only from the tool's own success line; the assertion had printed a traceback and I committed anyway).

The correction itself, byte-proven by agent a15 on func_80166F58: MIPS in gcc 2.7.2 defines only PROMOTE_PROTOTYPES and
not PROMOTE_MODE (config/mips/mips.h:1153), so a narrowed parameter stays a HImode pseudo and the extension still happens
at the use — the prototyped narrow form, the wide form and the K&R form all give the same 67-instruction merged output.
R14's banked closes stand on their bytes rather than on that rationale.
2026-09-10 10:54:31 -06:00
Drew T d71836107c phase-36: T7 agent a3 — func_801397B0 not closed (best 2), its reading toolified as R18 the bystander move
The third agent produced no bank and a precise refutation plus a generator, which is the deliverable the brief asks for.

- it refuted the a2 hypothesis on its own body: git grep returns 1,770 declarations in two forms, both (s32 a0), no (void)
  anywhere, and the pin is on a local rather than the parameter. Three lever-free spellings reach the target's complete
  register assignment, so the class is reachable from plain C.
- its best is score 2, class ORDER, 89/89 instructions, every register correct, one displaced bystander store. The target's
  sw sits inside the lbu->addiu window and that position is forced: anti_dependence and true_dependence (sched.c:817/845)
  both hold, so the store can neither hoist nor sink. Post-sched1 stream and reg_live_length then match ours, leaving
  reg_n_refs — computed by flow on the pre-combine RTL — as the only remaining input.
- R18 moves one simple statement to each other position in its own block, up to six away. R9's adjacent swap is the special
  case; the distance is the point. It costs no instruction where R7's LOOP notes are a full sched1 barrier and always cost
  one displaced insn, so R18 is ranked ahead of R7 in every class.
- two wrong spellings before the known-true check passed: identifier-disjointness as a requirement offered three candidates
  and none of them the agent's (it is only an ordering preference now — byte-identical output is the same program, so the
  oracle is the whole correctness proof, which is R9's own footing), and a blank line counted as an obstacle, so the
  generator never offered the very move it was written from. It now reproduces that body exactly: bystander @21->17.
- delever_pack.py now writes each trace candidate's residual class beside its score, from the agent's method note: a bare
  number hid that a move had already turned this body's residual from REG into ORDER.
- delever --selftest OK (3 new controls incl. the nested-block refusal); delever_search --selftest OK; tool_census OK.
2026-09-10 04:26:00 -06:00
Drew T 975850ff84 phase-36: T7 toolify a2 — generators R16 (constant holder inlined) and R17 (constant-run split), the directed form of a move R9 reached only by luck
- R16 writes a local whose only assignment is one integer literal at every use and deletes it. R6 stops at a temp read
  exactly once, so a holder read four times was invisible to the search and its whole family with it. Deleting it is
  byte-neutral alone but removes a quantity from the block, which is what lets the next move reach the allocator.
- R17 splits a run of consecutive same-literal assignments by moving the nearest differently-valued one into it, at each
  interior split point. find_free_reg's live-range scan (local-alloc.c:2109-2110): while the two constants' ranges are
  disjoint they share a caller-saved register; splitting makes the first live across the second and it takes another colour.
- known-true check: on the seed that keeps func_80168828's semantically-forced $4 pin, R16 then R17 reaches
  score 0 (OTHER; mine 108 ins, target 108) — MATCH at three of the six offered split points, in ten compiles where the
  blind search needed 2,271.
- the engine selftest's caller-saved assertion is now the ordering invariant (every targeted lever before every blind
  family) rather than a fixed window widened once per new generator.
- delever --selftest OK (4 new controls); delever_search --selftest OK; tool_census --check OK; SETUP row (R21).
2026-09-10 01:27:20 -06:00
Drew T 861dd0651c phase-36: T7 toolify a1 — generator R15, the sink (agent a1's crack made mechanical; reproduces it from the pre-bank text at score 0)
The harvest half of the one-at-a-time loop (R16): agent a1's reading of func_80156044 is now a move the engine can make
on any body, so the remaining head classes get it for free.

- R15 sinks the statement AFTER an if/else chain into every arm and deletes the variables it consumed:
  `if (c) { v = e1; } else { v = e2; } w = f(v);` -> `if (c) { w = f(e1); } else { w = f(e2); }`.
- it is a REGISTER move, not a scheduling one. A value set in every arm and read after the merge is a cross-block pseudo
  local-alloc never gives a quantity (local-alloc.c:472, next_qty reset at :517), so the arm holds two quantities and
  takes block_alloc's unrolled case 2 (:1499-1502, qty_compare :1578-1596). Sinking makes it a third block-local
  quantity, and case 3 (:1491-1496) falls through into case 2 and applies that comparison a second time, undoing its own
  exchange — the two caller-saved colours swap. It also takes the value out of global.c, where set_preference
  (global.c:1535+) had given it a copy preference through the merge result's argument copy.
- applicability is checked, never assumed: each consumed variable must be assigned exactly once in every arm by a simple
  statement, appear in the merge statement, and occur nowhere else in the function.
- if_chains() counts a line's CLOSING braces before its opening ones. On a `} else if (...) {` line the two net to zero
  and the first version's depth counter never closed the arm — the generator found 0 candidates on the very body it was
  written from. Caught by running it on that known-true case before believing it.
- ranked third in REG-caller / REG-mixed / COUNT; the engine selftest's "R5 in the first three" assertion widened to
  "R5 and R15 in the first four" rather than de-ranking the new move.
- verified: delever --selftest OK (3 new controls: a variable read after the merge, a variable one arm does not set, the
  brace walk's three arms); delever_search --selftest OK; and the known-true check — R15 run on func_80156044's
  pre-bank text emits the agent's crack and `--try` scores it
  `score 0 (OTHER; mine 74 ins, target 74) — MATCH`.
- SETUP row rewritten (R21), kit corpus regenerated, tool_census --check OK (371 copies + 30 pointers, 0 gaps).
- no src/ change in this commit; the sweep of the other 56 head classes follows.
2026-09-10 00:45:15 -06:00
Drew T 7b2200edad phase-36: the tail pass g6 + g6b (47 + 63 of 400 small classes; 186/191 siblings propagated), R22 218/218; 30,806 → 30,358 sites; --try (a candidate scored without a tree write), delever_pack.py (the 57 T7 packs + PROMPT.md), --restore refuses an empty snapshot; the checkpoint: T7 as one agent at a time, approved, starts in the fresh session 2026-09-09 23:32:57 -06:00
Drew T 2f3ce92a15 phase-36: rung G run g5 — the head re-drawn wide: 5 of 70 (small classes, 62 bodies), R22 218/218; 30,892 → 30,806 sites; the wide-search lever is spent on the big classes (112,216 compiles); R14 rewrites prototypes, R8 names repeated operands/groups, R12 splits multi-declarator lines; C/D-only bodies are done and not drawn, the seed keeps class C/D sites 2026-09-09 22:07:17 -06:00
Drew T 1ec67f6677 phase-36: rung G run g4s — func_8016E9EC's shape closed in three classes (133 bodies, R22 218/218; 31,025 → 30,892 sites); generators R12 widths (u8/short/int), R14 parameter width, R8 shared base, R10 cast alias; the bank and propagation in process (apply_body_core); the per-tag scratch-object race fixed; propagate's empty-list return 2026-09-09 20:18:43 -06:00
Drew T 5ae0b5cebd phase-36: rung G run g2 — func_80142EC0 closed (do-while + swap, 132 bodies banked, propagated 131/131), R22 218/218; 33,295 → 33,031 sites; the wider beam with R10/R12/R13/R8-cse moved nine of fifteen past g1; cookbook §455; lane B's constant-swap and do-while claims verified on bytes (the ledger in residual_moves.md) 2026-09-09 18:51:01 -06:00
Drew T 623e553408 phase-36: rung G — tools/delever_search.py, the guided search (the score is the oracle's own object read as an edit distance, the residual classified to pick the move families, a beam composing 2–3 moves; positive controls 1–2 PASS, 3 FAIL on a missing inverse); R8/R9 + the unwrap in delever's generator registry; the 301-row ledger hash defect fixed at its cause and repaired; lane B's residual→move map banked 2026-09-09 18:11:16 -06:00