- profiled the clean-fleet R22: extract-all ~6m11s (136 serial `splat split`) + check-all ~2m58s (136 serial builds) = ~9 min, all serial on a 32-core box - the only shared WRITE is the 4 generated include/*.inc macros at extract time (identical content per binary); everything else is per-binary-disjoint and include/ is read-only during a build -> concurrent builds/extracts don't race - Makefile: JOBS ?= 16 + `make extract-all` (seed main serial for the macros, then parallel- extract the rest via xargs -P) + parallel `make check-all` (xargs -P), correctness-gated - MEASURED: `make clean && make extract-all && make check-all` = ~50s, check-all 136/136 BYTE-IDENTICAL (== the serial result) -> ~10.5x. Compounds across the endgame (R22 per commit) - new R22 recipe: `make clean && make extract-all && make check-all` (was the serial for-loop)
27 KiB
CURRENT PHASE — Phase 26: The Family-Endgame (finish the decomp)
Status: ACTIVE · plan approved by Drew (gate 1) 2026-07-11 · Generation Gen2 (18th phase of the arc) Opening brief:
docs/family-endgame-megaplan.md(Phase-25 handoff). Fable5 window closes ~2026-07-13. Recovery note: a fresh session resumes from the ▶ CURRENT TASK below (P3 — autonomous between gates). Read the plan context here + the megaplan; per-task log at the bottom is the crash-recovery trail.
The plan in one paragraph
The Phase-25 h_seq reframe: the "unique tail" is really per-location families — crack ONE exemplar, template ×~120 siblings through the whole-binary byte-gate. Planning-session verification (2026-07-11) reproduced the survey from the sigs: 663 tail families; substantial (nins≥80) = 186 families / 1.85M ins (megaplan's "986" was a miscount). Design-stage discovery (byte-verified on specifics, V0 re-verifies — R14): the tail is ~90% a reloc-tracker blind spot — norm_stream/reloc_targets drop the pending lui-hi on any R-type write, but gcc-2.7.2's indexed-global idiom (lui; addu $idx; lw lo($at)) preserves it, so every D_x[i] access made its function "fleet-unique" and broke remap. Substantial-tail classes: PURE-same-addr 62 fams/1.55M ins · PURE-cross-addr 103/0.10M · IMM 8/0.10M. Free win: 63 families / 0.31M ins have a MATCHED exemplar and siblings that failed earlier sweeps only from the tracker bug → zero-crack banks once the ~40-LOC fix lands (= the validation corpus). Also found: remap() sequential substitution corrupts chained renames → must become single-pass simultaneous. Immediate substitution shrinks to an escalation tier (diff-driven, 3 tiers; probe only ambiguous values). Owner decisions: carried Fable5 queue (5 giants) deferred to END of phase (low priority); milestone = structural completion.
Task checklist (effort per R7 · one commit per completed task, Drew pushes — R6)
- Task 0 — Bootstrap
[xHigh]— this file + harness task list (R28). (completes with this commit) - Task 1 — Remap core: extended reloc tracker + single-pass substitution
[xHigh]—family_remap.py: hi propagates through add/addu index adds;symbol_map/remapgained backward-compatibleto_addr=None(cross-address) +imm_maphook; single-pass simultaneous substitution + self-rename. norm_stream/h_norm UNTOUCHED. Discovery → cookbook §40b (R30) + decision-log (R31). V0 PASS (.run/v0_reloc.py): 22/22 regression (func_80141100NEW==OLD), 15/15 fix (func_801407F4vs splat .s, recoversD_80187B88/90/B0), cross-addr symbol_map clean. V1 PASS (.run/v1_regression.py): 160 real h_norm pairs, 96 SAME, 0 lost, differences are strict indexed-reloc improvements. (committed) - Task 2 —
tools/family_hseq.py+ committed manifest[xHigh]— full-frontier survey; shared word-diff classifier added tofamily_remap.py(stream_words/reloc_indices/reg_fields/classify_member— PURE/IMM/STRUCT, register-drift aware). →.run/family_hseq.json+docs/family-hseq.md. VERIFIED: fleet 74.8/58.2/30.3 (= PhaseEnd_25 & progress.py to the decimal); tail cross-check 663 families / 186 substantial / 1.847M ins (exact); classification vs Plan-agent table PURE-same 62, IMM 8 exact, PURE-cross 114≈103; 890×134/562×134 PURE per-location + 952×113 #addr21 IMM confirmed; full frontier = 581 substantial families / 3.22M templatable ins, 345 matched-sibling PURE/IMM families / 1.14M ins = the V2/V3 zero-crack corpus. (committed) - Task 3 — Imm engine (T2a Tier 1) + cross-address delta (T2b)
[xHigh]—family_remap.imm_value/imm_map_tier1/remap_hseq: diff-driven Tier-1 value-replace (asm-side ambiguity guard defers ambiguous values; C-literal swap preserving sign/hex-case) + T2b self-rename via the Task-1to_addr. Tier 2 (probe) DEFERRED — build-if-needed per Task-5 measurement (byte-gate arbitrates; only ~8 low-weight IMM families). VERIFIED (.run/v3_imm.py, match_one reloc-masked): 0 DIFF on every compilable pair — 3 IMM + 2 cross-address MATCH; 4 remap-fails were correctly-deferred asm-ambiguous values; 45 compile-fail(isolation) → whole-TU gate in Task 5. (committed) - Task 4 —
family_sweep --hseqmode[xHigh]— additivehseq_sweep()(h_norm path byte-untouched): consumesfamily_hseq.json, templates matched-exemplar members viaremap_hseq(cross-address + imm), stages.run/sweep/<ov>/func_<TO_ADDR>.cgrouped by (overlay,split), gates viaharvest_verify(unique per-group verified-out — fixes a latent multi-split overwrite). Member pre-filter =remap_hseqrefusal (STRUCT/unresolved). Static pin guard (__asm__("$N"→ skip family; §42e — the ×1-only pinned cracks that cc1-crash sibling TUs).--band/--min-members/--stage-only/--only. VERIFIED: substantial → 29 families, 1507 clean members staged / 267 groups, 1643 correctly skipped as pinned (16/29 families pinned incl. the decision-log-namedfunc_8016DF5C/8013D9B0/80133AB0); h_norm path intact; drafts byte-correct by construction (V3), type-using → whole-TU gate (Task 5). (committed) - Task 5 — Zero-crack validation harvest (substantial band) — GO/NO-GO = GO
[xHigh]— ran the real byte-gate on the 29 substantial matched-exemplar families. Tooling fix discovered + applied (Task-5's "measure then fix"):remap_hseq.gather_externscarries file-scope externs for body-referenced symbols (extract_unitonly grabbed adjacent ones) — the decl class that depressed the first run. Result: 532 members banked (byte-gated); per-family: 3 tracker-miss PURE families (0x8015d5e8/0x8015f118/0x801407f4) bank 100% ×133 = 399 byte-perfect (the free win), 1 cross-addr family 50%; 9 zero-bank families are type-using (Work8016/Prim/…) → §41 reconcile follow-on (Task 8), 16 families pinned → Task 7. VERDICT: the h_seq machinery is 100% correct on clean families — GO. decision-log 2026-07-11 (R31). R22 clean-fleet 136/136 GREEN; metrics 30.3→30.9% distinct (+375 fns) / 58.2→58.5% instr. (committed) - Task 6 — Step-A triage of the 119 draftable substantial exemplars
[Ultracode]— Workflow (.run/wf_triage_full.js, 119 agents / 0 err / 5.3M tok): per-family m2c draft (+§8 jtbl) →match_onecloseness → class + §31/§45 lever + seed (.run/phase26-seeds/). 119 triaged → cheap 29 (325k ins, 23 closeness-0 isolation-MATCH) / permuter 29 (341k) / fable5 61 (1.71M). Curriculum →docs/phase26-triage.md. ⚠ Banking caveat (verified): the 23 closeness-0 seeds gate 0/23 into ov077 — genuine function matches but carry standalone types + Ghidra sigs conflicting with the TU (§41 def-side wall:redefinition of struct Obj/conflicting types); banking needs the Task-8--reconcile/canon_sig_reconcilepass. (committed) - Task 7 — Family-core crack waves (the Fable5 window)
[launch at Max — R27; agents model:fable, parallel-isolated, distill-between]— biggest byte-weight first (890/562/536/493…); §45-templated prompts (read.greg/.lregfirst; Lever-A merged-accumulator audit; 1-death in-out-asm; /s; gdb-on-cc1,tools/reference/gcc-2.7.2/); PIN-FREE (×134);harvest_verifyarbitrates; distill each crack → cookbook §46+ (R30); cheap-Opus applies banked idioms between waves; cheap/permuter lists run in parallel[UC]. ~375k tok/crack guide; documented wall + levers = valid outcome (P9). - Task 8 — Mechanical harvest waves
[Ultracode; continues post-window]— cracked exemplars → template ×members → gate → bank; h_norm draftable/matched-free retries with the new tracker (5.9 MB bucket); F-jumptable 4 (§8); M-linkwall 1; link-undef second pass. Batched commits; R22 clean-fleet before each commit batch (never while agents needasm/). - Task 9 — Mid-band + residue measurement
[xHigh]— <80-ins families (0.68M ins) through the engine; measure h_seq-miss → GO/NO-GO fuzzy pass (build only if ROI; else Phase 27). - Task 10 — Carried Fable5 queue (END of phase — Drew's call)
[Fable5 if window remains, else permuter/Opus + banked levers]— 801670E4 (diff-23), 80178004 (close-7), 801412A8 (close-29), 8016CBC0 (153/209), 8014D820 (LCS-226); specs.run/giants/*.opus.md+.run/t7b/close/. Crack ×134 or wall-document; post-window walls → Phase 27, accepted. - Task 11 — Step-D residue map
[xHigh]— true singletons (~0.27M ins) + 5 behemoths → Phase-27 input doc. NO execution. - Task 12 — PhaseEnd
[Max — Tier 1; R27 prompt]— P7 walk, milestone demo, gate 2,PhaseEnd_Phase26.md, worklog →logs/Phase26.md(R19), in-file recap (R25), decision-log current (R31).
▶ SESSION-2 CHECKPOINT (2026-07-12) — RESUME FROM HERE (fresh session)
Phase 26 status: Tasks 0–6 DONE + committed (the h_seq engine + triage). Task 7 (Fable5) + Task 8 (mechanical harvest) IN PROGRESS. Committed baseline = commit:0528, R22 136/136 confirmed. Commits this phase: commit:0518→commit:0528.
What's banked (all committed + R22-verified through commit:0528)
- 729 reconcile-class member-matches: 463 (
commit:0527) + 266 (commit:0528), from 6 no-jtbl reconcile-clean triage cracks templated ×~133 via--reconcile-raw. Metrics ≈ 31%+ distinct-code / 59%+ instr-weighted (was 30.3/58.2 at phase start). - MID-BAND HARVEST DONE + committed + R22 136/136: plain
--hseq --band midbanked 6,853 member-matches = 320 distinct functions (3,098 type-heavy tail / 1,743 pinned / 873 no-ov077-body — all expected). Metrics: distinct-code 31.1→35.2%, instr-weighted 58.9→60.9%. - TINY-BAND HARVEST DONE + R22 136/136 (session 3, 2026-07-12): plain
--hseq --band tinybanked 17,975 member-matches / 5,617 gate-rejected (h_seq-collision false-templates, correctly refused by the whole-binary gate — the collision-prone <16-ins band) across 266 overlay.cfiles (180 tiny families; skips 1,184 no-matched-unit / 148 unresolved-imm-Tier2 / 117 STRUCT / 39 pinned). R22 clean-fleet 136/136. Metrics: distinct-code 35.2→39.1%, instr-weighted 60.9→62.9%. Phase-26 total so far: distinct 30.3→39.1%, instr 58.2→62.9%. NEXT: the two harvest gaps — §8 jtbl-rodata tooling (Drew-approved) + the reconcile fn-ptr-extern fix — then re-measure/milestone.
The h_seq family engine (all committed, the durable tooling)
tools/family_hseq.py— the survey →.run/family_hseq.json(regen after every bank) +docs/family-hseq.md. Bands: substantial(≥80)/mid(16–79)/tiny(<16).tools/family_remap.py— extended reloc tracker (addu-hi §40b),classify_member(PURE/IMM/STRUCT),imm_map_tier1(T2a),remap_hseq(plain template),remap_hseq_body(remap a RAW crack body — for reconcile-raw),gather_externs.tools/family_sweep.py --hseq— templates matched-exemplar families;--reconcile-raw RAWDIR= §41c per-sibling reconcile (remap the RAW crack per sibling +canon_sig_reconcilevs that sibling's TU); static pin guard (__asm__("$N"→ skip).--band/--only/--stage-only/--min-members.- Cracked-seed dirs:
.run/crack_raw/(raw seeds, func_.c) +.run/phase26-seeds/(triage m2c seeds) +.run/phase26-cracks/(Fable5 crack bodies).
The TWO harvest gaps (the levers for the remaining crack families) — see decision-log 2026-07-12
- §8 jtbl-rodata (Drew APPROVED building it, 2026-07-12). Overlay jtbls live in the monolithic
data tail(asm/ov_*/data/tail.data.s, e.g.dlabel jtbl_801D8E24~line 92735 in ov077). Replacing a jr-function with C emits a duplicate jtbl → broken layout. FIX = carve each jtbl out of the data tail into a dotted.rodatasubseg co-located with its function's code object (ov077 configsection_order:[.rodata,.text,.data,.bss];ld_interleave.pyalready wired, Makefile:397). Per-overlay ×134 (each sibling's data tail). STAGE: prove on ONE jtbl fn in ov077 → automate ×134. Blocks all jr cracks incl. the top Fable5 cores (890/562/536…) and the 2 Fable5 crack bodies (.run/phase26-cracks/func_80159C84.c+func_8015444C.c— code-matched, jtbl-rodata unconfirmed; they bank once §8 exists). - reconcile fn-ptr-extern gap.
canon_sig_reconcile._reconcile_dataskips any extern containing((fn-ptr syntax), ANDvisible_above/tu_ambientdon't parsevoid (*D_x[])(…)→ fn-ptr dispatch tables (D_801891B8) conflict → blocks ~15 of the 21 no-jtbl triage cracks. FIX = parse fn-ptr-array externs in all 3 fns (additive, but touches proven paths → regression-test the h_norm sweep). Smaller lever than mid/tiny.
Fable5 findings (decision-log 2026-07-12) — Drew: NO more Fable5 agents until re-approval
- rtu_match ≠ whole-binary gate for jr-functions: rtu_match neutralizes INCLUDE_ASM (excludes the §8 jtbl rodata) + masks relocs → it MATCHES while the whole-binary gate FAILS. Batch-1 (
func_80159C84/8015444C/80176218) = 0 whole-binary-confirmed cracks (2 jtbl false-MATCH, 1 limit-cut). Fable5 crack prompts must require the whole-binary gate (or a jtbl-aware check), not plain rtu_match. New idioms found (distill to cookbook when banked): postincrement pending-queue(*(s32*)(p+K))++ >= N(func_80159C84); split-temps inverse-§45-A for cross-jumped tails (func_8015444C). - Usage/session limits repeatedly interrupt Fable5 (weekly + session limits, ~3:40am/5am resets).
Triage (Task 6, committed) — docs/phase26-triage.md + .run/phase26_triage.json
119 draftable substantial families: cheap 29 (23 closeness-0 isolation-cracks) / permuter 29 / fable5 61. Whole-binary reality: 6 cheap no-jtbl-reconcile-clean bank; ~15 no-jtbl need the fn-ptr fix; 2 jtbl + the fable5 cores need §8. .run/_rr_todo.txt = the 19 not-yet-banked cracks.
NEXT STEPS (priority order, all MECHANICAL — no Fable5)
mid-harvest → R22 → commitDONE (commit:0530). 2.tiny bandDONE (session 3, 17,975 banks, R22 136/136, distinct→39.1%). 3. §8 jtbl tooling (Drew-approved; ov077 PoC → automate) — the mechanical bands are now exhausted, so this + #4 are the remaining harvest levers. 4. reconcile fn-ptr fix → re-harvest the ~15 no-jtbl cracks (--hseq --band tiny.run/_rr19.shpattern). 5. Task-5 type-families (9 zero-bank substantial) via reconcile. 6. re-measure metrics; when gaps closed → milestone check.
Effort/model: Max set (this session). Fresh session: re-apply /effort max for §8 design (Tier-1 tooling) or /effort xhigh for mechanical harvest runs. Ghidra MCP NOT needed (matching uses cached asm; run /mcp only if RE work resumes — R29).
Milestone (gate 2 — structural completion, per Drew)
- h_seq engine committed, V0–V3 validated with a measured template success rate.
- Every substantial (nins≥80) family banked ×members OR classified with evidence.
- Fable5-necessary cores attempted before window close; every crack distilled (R30/R31).
- Carried 5-target queue resolved (cracked or wall-documented).
- 136/136 byte-identical from clean fleet rebuild (R22); 0 NON_MATCHING (G4).
- All three metrics reported + Step-D residue map.
Projections (targets, NOT gates): Task 5 ≈ +5.7% distinct-code; campaign → distinct 30.3%→~55–70%, instr-weighted 58.2%→~75–88%.
Effort/model toggle map (R26/R27 — prompt + WAIT at every boundary)
On approval → /model opus + /effort xHigh (Tasks 0–4; ALL Fable5 via Agent(model:fable)). Task 5/6/8 waves → /effort ultracode. Task 7 launches + between-wave synthesis → /effort max. Task 12 → Max. Non-obvious debugging → Max.
Blockers
(none)
Log
- 2026-07-12 (session 3, R22 parallelization — Drew asked "why so slow, profile+optimize"): Profiled the clean-fleet R22 (
make clean+ extract-all + check-all). Phase split: extract-all ~6m11s (the BIGGER phase, 136 serialsplat splitruns) + check-all ~2m58s (136 serial builds; most overlays ~1.3s, ov077 slow — maspsx on its 15K-line.c) = ~9 min. Both phases were serial on a 32-core box (the old Makefile comment called cross-binary-j"racy"). Verified the only shared write is the 4 generatedinclude/*.incmacros at extract time (identical content); everything else is per-binary-disjoint andinclude/is read-only during a build → parallel is safe. AddedJOBS ?= 16+make extract-all(seedmainserial for the macros, then parallel-extract the rest) + parallelmake check-all(xargs -P$(JOBS)), correctness-gated. Result:make clean && make extract-all && make check-all= ~50s, 136/136 byte-identical — a ~10.5× speedup (9m→~50s). Committed the Makefile change (own commit). This compounds across the endgame (R22 runs every commit). - 2026-07-12 (session 3, §8 ×134 AUTOMATION — func_8012ACE0 banked fleet-wide): Built the jr-function ×134 harvest pipeline and proved it end-to-end.
tools/jtbl_carve.py= per-overlay §8 carve generator (finding: the same fn is at the same vram across siblings but its jtbl is at a DIFFERENT address in each — ov_SC01_000 jtbl_801A331C / ov_SC02_000 jtbl_801E587C — so the carve is recomputed per sibling; rewrites the config data-tail subsegs + sets<ov>_JTBL_INTERLEAVE).tools/jtbl_family_bank.py= the sibling sweep driver (per sibling: revert→carve→extract→remap_hseq+reconcile→whole-binary gate; idempotent, revert-on-fail). Propagation-cap fix:family_remap.extract_unitnow carries single-linetypedefs (jr-function bodies define localtypedef struct{} Foo_<addr>;that must template with the body, else the sibling seesFoo undeclared— additive, byte-gate-protected). func_8012ACE0 family: 133/133 siblings BANKED, 0 failures; R22 clean-fleet 136/136 byte-identical. Metrics: distinct-code 39.1% (50,698 unique fns), instr 63.0%. Opportunity map (has_mid_jrfamilies): 237 total (5,805 members / 5.68M ins) — 46 small mid/tiny (771 members, mechanical, same pipeline) + 191 substantial = the Fable5 cores (Task 7, paused). Committed. NEXT: (a) R22 profiling/parallelization (Drew asked — check-all builds 136 binaries serially on a 32-core box); (b) the other 45 small jr families. - 2026-07-12 (session 3, §8 jtbl-rodata tooling — PoC PROVEN): Built the overlay jtbl-rodata mechanism (cookbook §8a, the durable writeup). Findings: overlay jtbls form a contiguous
.rodataisland at the TAIL (between.dataglobals and a tiny remnant), not the EXE's central island. Mechanism (byte-identical, 2-step): (Step 1) carve a matched jr-function's jtbl out of[data,tail]into a dotted[.rodata, <code-subseg>]subseg (spimdisasm migrates it into the fn's.s) +[data, tail2]; parameterizedtools/ld_interleave.py --section .<binary>(derives the symbol prefix; default.main= EXE byte-identical, backward-compat proven) places text→data(pre)→rodata→data(post)→bss — build byte-identical with the fn still INCLUDE_ASM. (Step 2) swap in the C body → byte-identical — the C-emitted jtbl lands exact. Wired intomake extractvia<bin>_JTBL_INTERLEAVEinconfig/overlays.mk+ a$(strip)-guardedifneqbranch (gotcha caught: a trailing#commenton the:=left whitespace → the branch misfired on resident). PoC target:func_8012ACE0(25-ins single-jtbl jr-function, ov_SC01_077) — reconciled viacanon_sig_reconcile(raw draft hadconflicting types), banked byte-identicald19c9580, ov077 clean-rebuilds. Key P9 finding:func_80159C84/func_8015444C(the 2 carried Fable5 bodies) are rtu_match FALSE-MATCHes — their C jtbls are incomplete (52B vs 56B), so they never bank; rtu_match excludes the §8 rodata (confirms the checkpoint's "2 jtbl false-MATCH"). The maspsx "hang" scare was a truncated-experimental-file artifact — the real pipeline builds in ~1s. NEXT: full R22 (in flight) → commit the PoC + tooling; then the ×134 automation (generate the per-overlay carve + template the reconciled body per sibling). - 2026-07-12 (session 3, TINY-BAND mechanical harvest — Task 8 continuation): Regenerated the h_seq manifest from the mid-band-banked src (fleet 77.2% fn / 60.9% instr / 35.2% distinct — matches
commit:0530), then ranfamily_sweep.py --hseq --band tiny. Dry-run sized it: 180 tiny matched-exemplar families / 23,592 staged member-drafts across 267 (overlay,split) groups (skips 1,184 no-matched-unit / 148 unresolved-imm / 117 STRUCT / 39 pinned). Gated run: 17,975 member-matches BANKED / 5,617 gate-rejected (h_seq-collision false-templates — the whole-binary byte-gate G3/P9 refused every one; ~76% bank rate; per-group ~17/21 main + ~110–129/150_after). 266 overlay.cfiles touched. R22 clean-fleet (make clean+ extract-all-136 + check-all) → 136/136, 0 failed. dedup-check 1813 validated / 0 failed (registry untouched — hseq banks are per-overlay src, not ×134 registry). Metrics: distinct-code 35.2→39.1% (50,571/84,996 unique fns), instr-weighted 60.9→62.9%. The mechanical size-bands (substantial/mid/tiny) are now harvested; the remaining levers are the two harvest gaps (§8 jtbl-rodata, reconcile fn-ptr-extern). Committed (Drew pushes — R6). - 2026-07-12 (session 2b, Fable5 batch-1 whole-binary reality): P9 correction: the 2 Fable5 "cracks" (
func_80159C84/func_8015444C) rtu_match-MATCH but FAIL the whole-binary gate — both are jr-functions and rtu_match doesn't verify the §8 jtbl rodata (decision-log). Two harvest gaps found: §8 jtbl-rodata (blocks all jr cracks incl. the Fable5 cores) + reconcile data-extern (D_801891B8-class, blocks ~15/21 no-jtbl triage cracks). Real whole-binary result: 6 no-jtbl reconcile-clean cracks bank = 729 members (463 committed + 266 this commit, func_8015CD20/8015C128 ×133).func_80176218(no-jtbl) still cracking = the clean non-jtbl Fable5 test. R22 deferred until it releases asm/. - 2026-07-12 (session 2, resume after usage-limit interruption): R22 confirmed the committed 463 reconcile-class banks 136/136. Fable5 batch-1 results:
func_80159C84MATCHED (337-ins 2-jtbl giant, pin-free; new cookbook idiom = gcc-2.7.2 postincrement pending-queue(*(s32*)(p+0x238))++ >= K);func_8015444C(reached 29-mismatch) +func_80176218(early) were cut off by the weekly limit → re-launched (444C resumes from its 29-mismatch partial). The interrupted reconcile-raw-19 harvest (260/1565, partial src) was reverted (R22 discipline) and re-running clean folding in func_80159C84. All background; process on completion → R22 → commit. Fable5 batch-1 = the last batch until Drew re-approves (Drew, 2026-07-12). - 2026-07-11 (session 1, Task-8 validation slice — Drew-approved pre-window de-risk): Ran reconcile→gate→template on the triage cracks. Reconcile→bank WORKS: raw 0/23 (§41 wall) → via
canon_sig_reconcilev3.2 4/15 banked into ov077 (func_801506A4/8016A73C/80167540/80155800, byte-identical). Templating a reconciled body ×133 FAILS 0/4 — reconciled bodies are ov077-TU-specific (casts + collision-renames), need per-sibling re-reconcile (§41c). → Task-8 prerequisite: port the h_norm--reconcileM2 path intohseq_sweep. Kept the 4 ov077 banks. decision-log 2026-07-11 (R31). Paused before building the wiring per Drew. - 2026-07-11 (session 1, Task 6 — DONE + paused): Ultracode triage Workflow (119 agents, 0 err, 5.3M tok): m2c draft (+§8 jtbl) →
match_onecloseness → class + lever + seed. cheap 29 (23 closeness-0) / permuter 29 / fable5 61. Curriculum →docs/phase26-triage.md. Attempted to bank the 23 cracked "wins" into ov077 (Drew: "bank the wins but pause before task8") → 0/23 gate — the isolation-MATCHes carry standalone types/Ghidra-sigs that hit the §41 def-side wall in the real TU (redefinition of struct Obj/conflicting types); banking needs the Task-8--reconcilepass. Seeds preserved in.run/phase26-seeds/+.run/ov077_bank/. PAUSED before Task 8 per Drew. src pristine, ov077 green. - 2026-07-11 (session 1, Task 5 — GO/NO-GO = GO): Ran the real byte-gate on the substantial matched-exemplar band. Discovered + fixed the decl class (
remap_hseq.gather_externscarries file-scope externs). 532 members banked, R22 136/136 green, distinct 30.3→30.9% / instr 58.2→58.5%. Per-family: 3 tracker-miss PURE families bank 100% ×133 (399 byte-perfect free win); 9 type-using families → §41 reconcile (Task 8); 16 pinned → Task 7. Machinery byte-proven 100% correct on clean families → GO to scale. decision-log 2026-07-11 (R31). Committed. - 2026-07-11 (session 1, Task 4): Added
family_sweep --hseq(additivehseq_sweep(), h_norm path byte-untouched): manifest-driven templating viaremap_hseq, unique per-group verified-out, static__asm__("$N"pin guard (skips the ×1-only pinned cracks → Task 7). Dry-run (--stage-only): substantial band stages 1507 clean / 267 groups, 1643 correctly skipped as pinned (16/29 families pinned, incl. the decision-log-named ones). Drafts byte-correct by construction; whole-TU gate = Task 5. Committed. - 2026-07-11 (session 1, Task 3): Built the T2a imm engine (
imm_value/imm_map_tier1/remap_hseq) — diff-driven Tier-1 literal swap with an asm-side ambiguity guard — + wired T2b cross-address self-rename. Tier-2 probe deferred (build-if-needed; byte-gate arbitrates). V3 (.run/v3_imm.py): 0 DIFF on all compilable pairs (5 MATCH), ambiguity guard + cross-address self-rename confirmed; comprehensive whole-TU gate validation is Task 5. Committed. - 2026-07-11 (session 1, Task 2): Built
tools/family_hseq.py(full-frontier h_seq survey) + the shared word-diff classifier infamily_remap.py(PURE/IMM/STRUCT, register-drift aware). Reproduces the fleet metrics + the 663/186/1.85M tail cross-check exactly; classification matches the Plan-agent table; 581 substantial target families / 3.22M templatable ins, 345 matched-sibling families / 1.14M ins = the zero-crack corpus.docs/family-hseq.mdcommitted. Committed. - 2026-07-11 (session 1, Task 1): Extended
reloc_targetsfor the add/addu indexed-global idiom (the "reach-1 tail" was largely this tracker blind spot, not unique code — decision-log + cookbook §40b).symbol_map/remapgained backward-compatibleto_addr(cross-address T2b) +imm_maphook; sequential→single-pass substitution (fixes the latent chained-rename bug). norm_stream/h_norm untouched. V0 (22/22 regression, 15/15 fix vs splat .s) + V1 (160 pairs, 0 regressions) both green. Committed. - 2026-07-11 (session 1, planning): Phase Start (Tier 1, Fable5+Max+plan-mode). Megaplan analyzed; survey reproduced from sigs+src (R14) — fleet metrics match PhaseEnd_25 exactly; 186-not-986 substantial-family correction; #2 family is cross-address; 93 matched-sibling families found (0.51M ins). Tooling recon (Explore) + design pressure-test (Plan agent) → the reloc-tracker blind-spot discovery (addu-preserves-hi; 890×121 family is PURE reloc; 63-fam zero-crack corpus; sequential-substitution latent bug). Drew's gate-1 decisions: carried queue → end of phase; structural milestone. Plan approved; task list built (R28). Task 0 complete with this commit.