900 Commits

Author SHA1 Message Date
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 ea75e0f231 phase-37: CHECKPOINT for a fresh session — T0–T2 ☑; the record banked: decision log P37 S106 (struct spelling moves bytes; the /s per-access dial), accelerators P37 S106 (→ DK-65 corrected in the kit), cookbook §458 (the func_801814AC byte-read), the handoff and wiki 'byte-neutral' claims date-stamped; the 🛑 block rewritten with T3's full design brief, the counters, the probe's findings and every command | 🛑 T3 NEXT (the tools, Max design) 2026-09-12 08:09:29 -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 79b2f6f150 chore(phase-36): CLOSE — levers off to the measured floor: 53,234 → 4,010 register pins + asm statements (−92.5 %), every survivor marked with its pass and its instrument and named for the structs phase; the GTE idiom in one header; 16,759 lying call declarations repaired; the lever and readability series published; 218/218 at every step (v2.2.0) 2026-09-11 22:45:24 -06:00
Drew T c0f2fc7ab2 phase-36: T8 — kit_coverage: the P36 S99 and S105 accelerator entries dispositioned (DK-61, DK-69) 2026-09-11 21:14:59 -06:00
Drew T 0fcf000c5a phase-36: T8 — kit_lint leak fixed (the delever_regen dictionary row named generator families as bare R-tokens); kit corpus regenerated 2026-09-11 21:06:06 -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 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 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 69d83f7b61 phase-36: 16,759 lying call declarations repaired across 3,439 units, byte-identical (R22 218/218) + the Gen3 readability series
Drew: we do want C correctness on all funcs, and log it for the story and the chart.

- decl_repair --apply rewrote 3,439 units and repaired 16,759 declarations. check-all: 218 passed, 0 failed of 218.
  lever_census --check: 26,456 pin/asm sites, 0 UNMARKED — unchanged, as expected: this pass fixed TRUTH, not levers.
- only the free set was touched: a declaration is repaired when every call to that function in the unit already passes
  the arguments, so the code was right and only the promise was wrong. Calls that pass too few remain R19's population,
  where the argument must be chosen and the bytes decide.
- tools/readability_progress.py: the Gen3 series beside docs/levers.md, because levers are only one way the source is
  untrue. It counts lying call declarations (split by the K&R-empty and (void) forms, and how many sit in a body still
  holding an argument-register pin) and raw cast dereferences against struct member reads — the struct debt. Each row
  carries its date and commit so the chart is generated, never typed (R75). docs/readability.md renders it.
  First row after the repair: 94,001 lying declarations over 1,564 callees (86,701 (), 7,300 (void)), 461 in 314 pinned
  bodies; 414,148 raw cast dereferences against 173,286 struct member reads.
- dictionary rows for decl_repair and readability_progress; kit corpus regenerated; tool_census --check OK.
2026-09-10 12:11:22 -06:00
Drew T fc7d8c4019 phase-36: T7 burst — a22 banked (126 bodies), a14 refused as an invented zero term, and the struct question answered on the record
- a22: func_8017B238 closed by giving the if-arm's pointer and the else arm's first table address one function-scope
  local. Three decisions turn on that edit, all dump-proven: make_regs_eqv's head rule (cse.c:840-857), set_preference
  stripping one RTX level so an arithmetic set inherits its operand's register (global.c:1535), and combine_regs with
  birthing_insn_p's reg_n_sets == 1 (local-alloc.c:1765-1788, sched.c:2469) — which is why the merge must be with the
  else arm's non-call-crossing temp. 26,714 -> 26,462 sites.
- a14 reaches score 0 on func_80139BE0 but only by an INVENTED identically-zero term whose sole purpose is to keep a
  value live. NOT BANKED: an invented no-op expression is a compiler-forcing construct in C clothing, and worse than the
  marked launder it replaces because the launder is counted and this would be silent. The phase's own rule is ban the
  silence, not the lever. Parked for the structs/types phase with its reading; the tree comment above it ('no pure-C
  spelling survives that fold') is refuted.
- a6 corrects cookbook 455: cse1 (cse.c:7439-7502) rewrites the producer's destination to the copy's whenever the
  producer is the immediately preceding insn; combine only finishes the job once that adjacency is broken. It enumerated
  the three lever-free blockers can_combine_p admits and showed the body can pay for none, then scanned all 4,284 built
  objects for the shape — 101 hits, every lever-free precedent paying with a genuine second use, a narrow local with two
  consumers, or a join label.
- a24's residual was one absent load: cse forwards a just-stored halfword so no lh is emitted, and seven branch
  displacement mismatches were downstream of it. Its method gap is the instrument to fix next — three agents have now
  asked for local-alloc's quantity table in the pack, and alloc_table.py prints an empty or one-row table because it
  keys on dump lines that are often absent.
- Drew's struct question answered on the record: structs are not in the binary (types are erased; no metadata in a
  retail build), what is there is base + offset + width + stride, so a struct is an inference across every function
  touching a base — which makes per-function struct invention the wrong unit and is the failure P35 already recorded.
  Recommendation: keep pins as the main lane, build a zero-token struct evidence census beside it, park stuck pins with
  their evidence, and fix call signatures first because they are the bigger and cheaper blocker (471 narrow call sites
  in 323 pinned bodies). Measured: 372,224 raw cast dereferences against 92,624 struct member accesses.
2026-09-10 11:02:14 -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 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
Drew T 8fac96651f docs(phase-36): the lever series as a tracked deliverable — docs/levers.md + tools/lever_progress.py (Drew's directive)
The pin/hint removal's COUNT OVER TIME is a deliverable in its own right: the post-100% chart, the story's spine, a wiki
page, and the day-one rule the decomp-architect kit should carry. It is only ever counted by the phase that removes it, so
it has to be captured while the work happens — a census is a moment.

- docs/levers.md: the taxonomy (A pins · B1-B4 barriers/launders/keep-alives/hand-placed instructions · B5 GTE, not a
  lever · C volatile · D bare register · E asm-label aliases · F builtins · G attributes); a GENERATED §2; how the levers
  got in phase by phase (P18's pin toolkit took the wave close-rate 33% -> 56% -> 90%; the family engine then copied every
  lever across up to 134 overlays, which is why 1,758 distinct bodies are 12,578); the ladder with each rung's measured
  yield; §5 the prevent-vs-defer argument; §6 what the wiki, the kit and the story each take.
- tools/lever_progress.py: --snapshot appends a milestone row (the census's totals by class + HEAD) to
  docs/lever-progress.tsv and re-renders the document; the campaign table is derived from the de-lever ledger on every
  render and scored as state TRANSITIONS, so the rung that FINISHES a body gets the credit (counting first-rows-only
  reported rung R's 134-body batch as zero); --check refuses a series that is not this tree's.
- the numbers, generated: 21,061 sites removed or rewritten across 17,119 bodies against 33,957 still standing — 38% of
  the class A/B population came off with no understanding at all, which is the evidence behind §5's rule:
  BAN THE SILENCE, NOT THE LEVER (a lever is allowed and is a marked, ledgered, published debt from the first bank, with a
  one-compile bank-time trial; never block the byte gate on it).
- Reference-index row (doc_links OK), SETUP row, tool dictionary row, CURRENT_PHASE entry for the story.
2026-09-09 12:10:24 -06:00
Drew T c0e8fbdaae phase-36: T6 — the rung-D instrument fixed (the target was assembled from a listing), rung R built (R2/R3/R4/R5)
THE INSTRUMENT (R40). Two campaigns returned "0 of 16" with a straight face; both were the harness. The target object had
been assembled from a DISASSEMBLY LISTING, which is a second toolchain with its own answers:
  - objdump prints the pseudo-instruction `move` for `addu rX,rY,$zero`; gas assembles `move` as `or` — 24 wrong words in
    one 234-instruction function, silently;
  - a listing's %hi/%lo pairs come back RESOLVED with no relocation, while every candidate carries one, and the masked
    scorer compares reloc operands.
The permuter therefore scored 28 for a body that IS byte-identical: score 0 was unreachable and every NO-MATCH was its own.
  - tools/delever_permute.py: the target is now the tree's OWN (levered) body compiled by the build's tail into a
    one-function object — the candidates' relocations by construction — and `match_one` must call that body a MATCH against
    the ROM listing before the search starts (R34 keeps it from being circular). Base score for the tree's own body: 0.
  - tools/p16_permute.py `setup(target_o=)` + tools/permuter_ils.py `--target-o` (defaults unchanged).
  - `--positive-control TU FN`: perturb a matching body by one commutative swap, require the permuter back to 0.
  - tools/verbatim_target_s.py --gas now VERIFIES itself: assemble, disassemble, compare word by word with the image,
    `.word 0x…`-patch what does not reproduce (24 in that function), REFUSE what still disagrees. The listing is a public
    artifact (decomp.me) and was wrong for every function containing a `move`.

THE PROFILE. The weight profile now comes from the register a needed pin names, not just the site kind: callee-saved
($16-$23) is an allocation-order residual -> regalloc; caller-saved ($2/$3/$4-$7) is not -> cse. Read from the bytes: the
residual on func_80163EC8 (`register … __asm__("$2")`) is `and v0,v1,v0` against `and v0,v0,v1` — the operand order of one
`&` — and the regalloc profile weights perm_commutative 2.0 while cse weights it 40.0.

RUNG R (tools/delever.py --recipes): the cookbook's byte-neutral shape recipes, mechanically, seeded with the body's
lever-free text — R2 the formerly-pinned declarations permuted, R4 one moved through the whole declaration run, R3 an
initializer split placed after the run (C89), R5 the operand order of one commutative operator (the caller-saved lever, and
the only recipe needing no pinned declaration). Identity control on both the splice and the oracle before any verdict;
markers scrubbed within the banked body's own span only; selftest cases on a fixture whose answers are known by hand.

Also: a threading race in the site cache published the empty dict before filling it and made a whole batch report
"no site in this TU"; the file-scope asm dropper took an asm-LABEL clause for a statement. SETUP + dictionary rows.
2026-09-09 11:08:20 -06:00
Drew T 6e1677b4da phase-36: T6 rung D built and calibrated — tools/delever_permute.py, the GTE levers on the ladder (462/462), four harness defects
- tools/delever_permute.py: one exemplar per RESIDUE text class from the ledger (copies desc, needed asc) prepared as a
  single-function TU (delever's rung-A rewrite; other definitions -> prototypes; shared-header includes -> their prototypes;
  INCLUDE_ASM and file-scope asm dropped; the build's own CPPFLAGS through cpp -P), the target regenerated from the ROM image in
  BOTH forms (--gas for target.o, splat for match_one), permuter_ils with the profile from the NEEDED kinds, a winner banked only
  through delever --apply-body + the GTE re-fold. Scratch/winners keyed alias+fn (R48).
- the control (R39/R56, new): every attempt first requires the LEVERED body to be match_one MATCH against the regenerated target,
  then records the lever-free body's distance. --calibrate --limit 12: 12 of 12 MATCH; starting distance min 8 / median 78 / max 276.
- delever: ("B","gte-lever") joins REMOVABLE — a direct statement's clobbers reset to its canonical set, a variant-macro use pointed
  at the canonical macro whose name comes from the variant definition's SIGNATURE (gte_rt_m -> gte_rtv0tr, not Sony's gte_rt);
  462 of 462 gte-lever sites now offered to the ladder, 0 before. gte_consolidate.canonical_match() is the one reader of the
  canonical table (R33), direct_rewrite refactored onto it; both selftests green.
- p16_permute.setup(outdir=) + permuter_ils --pd: a scratch dir keyed by the caller, defaults unchanged.
- four harness defects found by running it: the splat listing is not assemblable (R98 in a second place); pycparser rejects
  __attribute__ and the permuter then silently permutes nothing; include_asm.h injects a file-scope .include "labels.inc" that
  collides with the permuter's own macro.inc; an asm-LABEL clause is not an asm statement (a bare scan ate one and left a headless
  K&R body). SETUP row (R21), dictionary row (R87), .gitignore allowlist for the outcomes ledger.
2026-09-09 10:21:16 -06:00
Drew T 0bd784c64e phase-36: T5 (header step) — the GTE consolidation: tools/gte_consolidate.py (signatures by the build's own maspsx→as tail: bytes + operand counts + clobbers; one canonical text per signature under Sony's names, Sony's clobbers canonical even when every definition carries the steer; lever variants <name>_m tried as canonical first; direct statements → canonical calls; --sweep), include/gte_inline.h (50 macros for 9,102 definitions) included from common.h — R22 218/218; the census's gte-lever class + per-TU definition count + strict gate; the cycle's MODE=gte; dictionary + SETUP rows; kit corpus; log entry 2026-09-09 05:28:50 -06:00
Drew T e5f59c12f4 phase-36: T3 close — the campaign tool proven end to end on ov_SC04_011 (batches t3_tus1 + t3_tus2, R22 218/218 each): the zero-register use composed into its host edit (the one refused body redrawn via --redraw), a removed site consumes its trailing !FAKE marker, the census counts ORPHAN markers (--check fails on them; the walk cache keyed on the tool's hash — it had hidden them) and delever --scrub removes them (2 scrubbed here, object identical, R22 218/218 wall 143 s); the cycle's greps fixed (no ^ anchor, an empty verify line refuses, THE PHASE'S NUMBER line, entries before the checkpoint block); the number 53,033 sites / 15,638 bodies (2,246 distinct) · 310 marked · 0 orphans; SETUP + dictionary rows; kit corpus; the t3_tus1 entry rewritten from the logs (R66); the 🛑 block rewritten for T4 2026-09-09 03:14:30 -06:00
Drew T 39e3e1851f phase-36: T3 (tools) — tools/delever.py the campaign tool: --plan/--apply (the file is the write unit, its final compile through every recipe the proof; 'done' = a ledger fact keyed by the body's normalized text before/after; replay from an exemplar in one compile; !FAKE markers on class A/B survivors; --restore from inflight.json; --apply-body for T6/T7; a selftest with a stub oracle), the launder-ASSIGNMENT rewrite (989 of 4,793 direct launders — deleting them made cc1 2.7.2 abort: the probe's 'Done' error, reproduced 3/3), macro shapes (SHB deleted, a launder expression valued, compound macros refused for T5), the oracle's COMPILE-CRASH verdict + judge_all + the mtime restore, the census's src_stamp/head, tools/delever_cycle.sh (apply → R22 → census → log + headline → commit); selftest OK; census 53,234 unchanged; calibration 177/177; plan ov_SC04_011 = 18 files / 176 bodies / 540 sites; SETUP + dictionary rows; kit corpus; T7 waves need Drew's direct approval (decisions) 2026-09-09 02:45:58 -06:00
Drew T 617f29e30c phase-36: T2 — the oracle and the probe: tools/delever_oracle.py (4,284 recipes via make -n -W; a candidate compiled in place to a scratch object and compared with the fleet run's; calibrated 177/177 untouched + twin 32/32 + positive control DIFFERS) and tools/delever.py (positional rewrites per lever class, rung A strip-all + rung B greedy, headers serial after the TU phase); --probe on 283 distinct bodies: A identical 53/283, sites removed 561/1,309 (42.9 %), needed 748 (launder 77 %, barrier 82 %, pins 45 % — v0/v1 + a0–a3 dominant), 0.225 s per compile — T4 priced at ~94k compiles ≈ 0.5 h, the residue ≈ 81 % of bodies ≈ 1,800 distinct exemplars; dictionary + SETUP rows; kit corpus; the 🛑 block for T3 2026-09-09 02:03:04 -06:00
Drew T a1407bdfc1 phase-36: T1b — the verbatim manifest learns the in-function form (49 rows: 27 PERMANENT hand asm incl. 22 per-overlay scratchpad stack-switch trampolines, 8 Sony GsTMDfast* routines carried as asm, 11 DECOMPILE-NOW + 3 UNCERTAIN game bodies never decompiled); verbatim_check detects the form structurally via lever_census.whole_body_asm_functions (--strict: 2,709 bodies, no drift); the census defers exclusion to the manifest's dispositions — the phase's number 53,234 sites in 15,679 bodies (2,227 distinct); progress.py counts PERMANENT (27) + SDK (8) with a dated correction; README/wiki/verification/gen3 docs corrected (14 game functions were asm in C shells); kit corpus 2026-09-09 01:44:31 -06:00
Drew T 357f8a1ed3 phase-36: T1 — tools/lever_census.py, the self-asserting lever census (coverage asm 80,396 = 66,415 live + 7,189 macro-block + 6,792 comment/dead; 4/4 controls; the five manifest bodies excluded): 53,221 pin/asm sites in 15,666 bodies (2,214 distinct) — 37,720 register pins + 15,501 asm statements, 0 marked; 6,911 GTE ops and 23 whole-body asm routines in C shells (2,683 sites, outside the manifest — Drew's call) set apart; progress.py levers block + README sentence; dictionary + SETUP rows; kit corpus; the 🛑 block for T2 2026-09-09 00:52:22 -06:00
Drew T ac8c29edb1 src(phase-35): T5b — the text tier: 38 same-address functions whose bytes vary per binary (the TU's declaration environment carries the original per-overlay variance) share one text each through h_text registry groups with per-member h_exact — 1,957 private copies in 1,540 TUs replaced by the include, 38 headers (func_<VRAM>__t<hash8>.h), 138/138 binaries green per binary, 0 rejected; dedup_integrate C1 per member (3173 validated, 0 failed); share_census indexes h_text groups by site, exports text classes, the S1 text half is a violation (0 now), the census json carries the oracle's counts; share_body --bucket text; progress.py/README: 103,015 bodies written once, 38 text-tier functions / 2,030 sites, 1,668 copies of 381 tiny bodies deferred; R22 clean fleet 218/218 in 90 s; SETUP; kit corpus 2026-09-08 22:39:42 -06:00
Drew T 93b4706c96 docs(phase-35): T6 CLOSE — tools-health OK with the macro-form guard (0 LIVE tools reference the retired form; 14 frozen, 38 retired); the timeline regenerated against the committed digest (74 rows); the wiki's dedup page repointed from the retired dedup_propagate to share_body (T8 rewrites it); the cycle driver's dictionary row without rule ids (the kit's leak check); the three red chain runs and their causes in the phase log 2026-09-08 21:16:02 -06:00
Drew T 5a9f455e60 tools(phase-35): T6 part 1 — 14 macro-era tools FROZEN (tools/frozen.py: one refusal from main(), imports never exit; the plan's 7 + 7 the guard census found, family_remap's CLI among them), 4 retired to tools/sunset/ (dedup_propagate + dedup_extend -> share_body.py with add_members_surgical and the load_sig library moved verbatim; macro_draft; test_reconcile_ledger), six lane callers repointed to share_body --apply --bucket new, validate_targets imports share_body, tool_census accepts FROZEN; dictionary + sunset README rows; kit corpus 2026-09-08 20:34:41 -06:00
Drew T cd43347791 config(phase-35): T5 CLOSE — the registry behind the source repaired (639 including-but-unlisted members added to 5 groups, the 5 verbose groups converted to shorthand; add_members_surgical refuses a verbose group, R43); S1: 10,180 classes, 10,180 satisfied, 0 violations (share_census --check exit 0); same-vram backlog 1,099 -> 51 classes = the ledger (50 TU-CONFLICT + 1 GATE-REJECT); dedup-check 3135/0; audit-binaries OK; registry 2,220 -> 3,135 groups; the tail run (bucket new empty); cycle logs; SETUP (the context guard); kit corpus 2026-09-08 20:24:28 -06:00
Drew T f803ada170 src(phase-35): T5 bucket new batch 8 — registered 75 groups, 150 sites in 30 TUs replaced by the include, gated 4/4 binaries green per binary, rejected classes 0 ledgered (share_body_cycle) 2026-09-08 20:05:25 -06:00
Drew T b4c7e5830c src(phase-35): T5 bucket new batch 7 — registered 120 groups, 240 sites in 63 TUs replaced by the include, gated 34/34 binaries green per binary, rejected classes 0 ledgered (share_body_cycle) 2026-09-08 20:04:57 -06:00
Drew T 2dbdaa28c4 src(phase-35): T5 bucket new batch 6 — registered 119 groups, 240 sites in 40 TUs replaced by the include, gated 14/14 binaries green per binary, rejected classes 1 ledgered (share_body_cycle) 2026-09-08 20:03:00 -06:00
Drew T ef1dd7eb33 src(phase-35): T5 bucket new batch 5 — registered 120 groups, 329 sites in 75 TUs replaced by the include, gated 15/15 binaries green per binary, rejected classes 1 ledgered (share_body_cycle) 2026-09-08 20:02:08 -06:00
Drew T 9f0cb82ff9 src(phase-35): T5 bucket new batch 4 — registered 120 groups, 360 sites in 69 TUs replaced by the include, gated 15/15 binaries green per binary, rejected classes 0 ledgered (share_body_cycle) 2026-09-08 19:57:06 -06:00
Drew T 3c14ee490a src(phase-35): T5 bucket new batch 3 — registered 120 groups, 358 sites in 59 TUs replaced by the include, gated 12/12 binaries green per binary, rejected classes 0 ledgered (share_body_cycle) 2026-09-08 19:55:15 -06:00
Drew T e4b25e5f70 tools(phase-35): T5 — share_body_cycle.sh, the unattended batch cycle for bucket new (batch → exit code + gated N/N → phase-log entry → commit → clean fleet run every N batches, stops on the first red); share_body --label; dictionary row + SETUP; kit corpus 2026-09-08 19:53:09 -06:00
Drew T a9353b4122 src(phase-35): T5 bucket new batch 2 — registered 120 groups, 360 sites in 69 TUs replaced by the include, gated 9/9 binaries green per binary, rejected classes 0 ledgered 2026-09-08 19:48:06 -06:00
Drew T 9aaa08391e src(phase-35): T5 bucket new batch 1 — 120 same-address classes given one source (120 headers under src/shared/ov/, 1,482 private copies in 535 TUs replaced by the include, 120 registry groups appended), 165/165 binaries green per binary; 1 class rejected (a body relying on a file-scope extern outside its definition), ledgered 2026-09-08 19:46:25 -06:00
Drew T a60340c6d4 src(phase-35): T5 — E_func_80168B70 re-exemplared from the majority text (share_body.py --reexemplar: header ← ov_SC01_000's copy, 7/7 includers green first, then 134 private copies → the include in 129 TUs, 141/141 binaries green, 0 rejected; the minority-header ledger row dropped); bucket 0 closed: 183 classes → 135 fully shared, 48 ledgered TU-CONFLICT (late-overlay declaration conflicts, for the types phase); SETUP paragraph (--batches, snapshot restore, the cause rule, --repair-registry, --reexemplar); kit corpus 2026-09-08 19:41:40 -06:00
Drew T 5325fd506b src(phase-35): T5 bucket 0 run 3 — 78 private copies in 24 TUs replaced by the shared include, 87 members extended (141/141 binaries green per binary); share_body: a twin's instance queued the same (tu, line) edit twice and the second replacement swallowed the next function (7 classes rejected in the five twin primaries on that artifact; now deduped), chained file:line: warning lines never a cause; the ledger re-judged by the fixed tool: 49 rows with real diagnostics (conflicting types / too few arguments in the late overlays), E_func_80168B70 kept with its cause pending the exemplar decision; kit corpus 2026-09-08 19:31:19 -06:00
Drew T 090f8fb428 config(phase-35): T5 — the registry repaired: 378 listed-but-private members removed from 79 groups (share_body.py --repair-registry, derived from the census on (binary, vram); the 317 ledgered rejected pairs + 61 sites the S94 bisects wiped); dedup-check 2221/0, C1 256,120/256,120; census A 1,812 · B 183, same-vram backlog 1,099 -> 999 classes; the first cut's name-only match (9,269 removed, 14 groups emptied) caught by dedup-check + a known-true control and reverted before commit 2026-09-08 19:20:48 -06:00
Drew T f4163518a2 tools(phase-35): T5 — share_body.py: the failure cause is the first non-warning file:line diagnostic (gcc 2.7.2 errors carry no 'error' token — 254 of 303 rejections had read 'Error 33'), reason codes SYMBOL-NAME / GATE-REJECT / PARSE-ERROR / TU-CONFLICT derived from it and recorded with the cause in every ledger note, the bisect restores from an in-memory pre-edit snapshot (never git checkout — it wiped the previous batch's uncommitted shares), one batch per invocation by default; controls on the real red cc1.err + six synthetic logs; ledger header + kit corpus 2026-09-08 19:14:45 -06:00
Drew T aacbd71eb9 src(phase-35): T5 bucket 0 (second run, finished after S94 died — banked by S96) — 170 private copies in 8 overlays replaced by the shared include (ov_SC07_006 49, ov_SC07_007 29, ov_SC07_011 29, ov_SC07_010 28, ov_SC01_077 19, ov_SC02_037 6, ov_MAIN_012 5, ov_SC03_107 5); 141/141 binaries green per binary (make check + object A/B); 55 classes rejected in 325 (class, binary) pairs, ledgered TU-CONFLICT in config/dedup_exceptions.tsv; run_extend2.log + the batch records; phase log + checkpoint headline 2026-09-08 19:11:16 -06:00
Drew T 571374b979 src(phase-35): T5 bucket 0 (first pass) — 788 members extended into their registry groups, private copies replaced by the include where the per-binary gate held (141/141 and 146/146 binaries green after bisect); share_body: the bisect now re-applies the kept classes in one bottom-up pass per TU (its per-class sequential re-application had shifted later classes' lines and rejected 125 of 183 classes on its own artifacts), the failure detail from error lines only, rejected extend classes ledgered, groups extended only with members that passed 2026-09-08 18:30:29 -06:00
Drew T 0bccef9016 tools(phase-35): T5 — share_body.py, the permanent share tool for the include-at-site form (exemplar by majority text, header written once, private copies → include at their position, per-binary gate with object comparison and bisect, registry appended by text, exception ledger); the R37 probe: func_801681FC shared by ov_SC04_008 + ov_SC05_009 (2/2 binaries green, group S_func_801681FC); the census exports per-instance line ranges; bind_alias_header factored out of macro_to_header; SETUP + dictionary rows; kit corpus 2026-09-08 18:12:41 -06:00
Drew T a8457663fc src(phase-35): T4 finalize — engine_core.h, ov_setters.h and clearTbl40.h deleted; the legacy sites converted (clearTbl40 as the SHARED_FN parameterized control in src/800_c.c; the three SC01_005 accessors as headers), the whale header moved under ov/ with every -O0 includer rewritten, 7 alias-form bodies given their own __asm__ binding, the registry's source/func lines text-edited by id, three non-shared headers rewritten; --verify OK (0 macro sites, no macro header); R22 clean fleet check-all: 218 passed, 0 failed of 218 in 145 s; dedup-check 2220/0; audit-binaries OK; the census 362,389/362,389 with 0 macro sites; SETUP + dictionary rows; kit corpus 2026-09-08 18:06:04 -06:00
Drew T 6ebb3dac33 build(phase-35): T3 — ov_SC03_015 TWIN_OF ov_SC03_014 with the primary's carve: yaml, JTBL_INTERLEAVE and the per-object JTBL_PADS lines regenerated from ov_SC03_014 by alias substitution (the twin's retired jump-table splits with them), create_c_files: False, src/ov_SC03_015/ deleted; twin + primary BYTE-IDENTICAL; interleave_check ALIGNED + pads_audit on the twin (R60; pads_audit now reads a twin's source through the oracle); dedup-check 0 failed; audit-binaries OK 2026-09-08 17:24:42 -06:00
Drew T 2648aa5a92 build(phase-35): T3 — ov_SC04_019 TWIN_OF ov_SC04_018 with the primary's carve: yaml, JTBL_INTERLEAVE and the per-object JTBL_PADS lines regenerated from ov_SC04_018 by alias substitution (the twin's retired jump-table splits with them), create_c_files: False, src/ov_SC04_019/ deleted; twin + primary BYTE-IDENTICAL; interleave_check ALIGNED + pads_audit on the twin (R60; pads_audit now reads a twin's source through the oracle); dedup-check 0 failed; audit-binaries OK 2026-09-08 17:21:44 -06:00
Drew T e79cfcc06d build(phase-35): T3 — ov_SC03_119 TWIN_OF ov_SC03_118 and ov_SC02_003 TWIN_OF ov_SC02_000 (equal carves): the twins' source dirs deleted, create_c_files: False, both twins and both primaries BYTE-IDENTICAL, audit-binaries OK, dedup-check per twin 0 failed 2026-09-08 17:15:01 -06:00
Drew T 9b0816e74a build(phase-35): T3 probe — ov_SC01_006 is a TWIN of ov_SC01_005: one source directory per payload. Makefile twin rules (build/src/<twin>/<twin>%.o <- src/<primary>/<primary>%.c, same recipe, -O0 objects kept), overlays.mk TWIN_OF + SRC_DIR, the twin's yaml create_c_files: False, src/ov_SC01_006/ (30 files) deleted; twin + primary BYTE-IDENTICAL (56760dbe), the concurrent race test green, every consumer sees the twin through the oracle; share_census: copies = distinct sites, TWIN-COVERED reported (575 classes for the pair) 2026-09-08 17:10:00 -06:00
Drew T 72a77e7d3c tools(phase-35): T1 fix — the census's dictionary row is kit-ladder P10, not the project phase; kit corpus regenerated; tool_census --check OK. The previous commit claimed the corpus regenerated while kit-corpus had exited 2 and the census had refused the row — its chain read an echo's status, not the check's (R97); this one chains on the checks' own exit codes 2026-09-08 16:26:00 -06:00
Drew T 1dbffee87d tools(phase-35): T1 — share_census.py, the fleet census of byte-identical function classes + the S1 'one source per unique function' checker with its exception ledger; 362,389/362,389 sig instances covered, 10,180 classes (A 1,712 · B 282 · C 6,107 · D 1,861 · M 218), self-test 7/7, four controls as measured; SETUP + dictionary rows, kit corpus regenerated 2026-09-08 16:24:08 -06:00