diff --git a/phase-ends/CURRENT_PHASE.md b/phase-ends/CURRENT_PHASE.md index 866b0f4cf..4c6de6db4 100644 --- a/phase-ends/CURRENT_PHASE.md +++ b/phase-ends/CURRENT_PHASE.md @@ -36,6 +36,7 @@ Whole-binary byte-gate (`tools/harvest_verify.py`) is the SOLE arbiter (G3/P9). ## Progress log *(append one line per task on completion β€” the crash-recovery trail)* +- **T6 (partial) βœ“ (2026-07-03):** 🎯 **FLAGSHIP `func_80132784` PROPAGATED Γ—134** (`commit:0443`) β€” the 400-ins S11 giant (cracked T4, banked Γ—1) now byte-identical in ALL 134 overlays, **+1.6% byte-weighted** (the single biggest lever; function-count fleet 64.86β†’64.90%). **The T6 recovery pattern, proven end-to-end:** the T4-deferred Γ—1 cap was one straggler overlay (ov_SC02_005) declaring a CONFLICTING caller extern `void func_80132784(s32,s32,s32)` vs the def `(s32,s32,u32)` β†’ `conflicting types` β†’ dedup_propagate's all-or-nothing single-`--addr` plan dropped the whole fn. Fix: reconcile the straggler's caller extern to the def's canonical sig (s32β†’u32, byte-neutral β€” the call site casts anyway), then propagate β†’ 134 overlays rebuilt byte-identical, group `E_func_80132784` registered, dedup-check 1784/0. **Clean R22 fleet check-all 136/136.** **REMAINING T6 (the tool):** automate this β€” detect a straggler's conflicting caller decl β†’ reconcile to the def's canonical sig β†’ re-gate β†’ propagate full (vs. all-or-nothing drop); + the other Γ—1 classes (func_8014E048 pin/asm self-containment β€” a DIFFERENT blocker: dedup_propagate's `compiles_standalone` rejects pin/asm bodies; func_80144090 OtBlk type-lift; func_8014F4C0/func_80155800 TU-context leaf-MATCHes in `.run/wave/`). - **T5c βœ“ (2026-07-03):** 🟒 **TRUE clean fleet 136/136 RESTORED** (first genuinely-clean `make clean`+full-re-extract+check-all green since Phase 21). Fixed the pre-existing Phase-21 (`commit:0292`) rename-propagation breakage: renamed all **62** stale `INCLUDE_ASM(func_)` β†’ curated names across 12 main/library `src/*.c` (800c.c/800c3.cΓ—22/apicard1Β·2Β·4/boot.c/libcd1Γ—8/libetcΓ—6/libgpuΓ—3/sgap.c/snd1Γ—7/snd2.c) to match splat's canonical output (proven: splat's fresh stub-regen uses the curated names). **main clean-builds `143dbb89` βœ“; fleet 136/136 βœ“** (all overlays byte-identical, resident `8e17e02f`). Built **`tools/lint_symbol_refs.py`** (comment/string-aware, func_+D_) β€” flags any `func_/D_` ref whose addr was renamed (the R22-masked class); caught the T5b macro-call + this INCLUDE_ASM set; now 0 stale. SETUP inventory + CURRENT_PHASE finding updated. Commit: (checkpoint). - **T5b βœ“ (2026-07-03):** 🎯 **S11 CRACKED β€” the class verdict was map-incompleteness, not intrinsic codegen** (Fable5 main-loop spike, Drew switched the session to Fable5 Max). `func_8014E048` (143 ins, reach-134; "S11 LUIDβŠ—alloc intrinsic / not source-steerable" since the map wave; **28-off even after T5's directed permuter**) β†’ **MATCH (143/143) + whole-binary BANKED** (`harvest_verify` 1/0, ov_SC01_077 `d19c9580…`). Derived by reading gcc-2.7.2 source + `-dl -dg -dS` RTL dumps (12 experiments, `.run/gccmap/exp/e1a..e1k.c`): **S12 reused-s32-temp fence** (output/anti deps forbid load batching; **u16 temps DON'T work** β€” unpromoted HI vars spawn per-use zext temps that combine folds away), **S13 head-skip escape** (body-local param copies keep hard arg regs live into the temp windows β†’ conflict-steer the scratch contest; zero-byte volatile-asm dead-read as a wedge-slot fence; multi-input dead-read to rebalance K2 densities), **cse-opaque asm-copy** (`addu %0,%1,$zero`) for must-materialize pointer copies, **RC-4b pinned store-temp**, **RC-10 preference-cascade mechanics** (set_preference one-level expression unwrap; expand_preferences dying-into-set merge; find_reg pass-0 used-so-far/someone-prefers + pref override). Integration needed 2 hand-reconciles (both T6 classes): engine_core.h:17569 caller-decl `s16*`β†’`u16*` (ptr param type codegen-neutral) + canonical data decls with `*(u16*)` access casts (D_801152A8 `u8[]` / D_801152AC `s16`). **Γ—134 lift blocked by dedup_propagate self-containment (pins/asm) β†’ T6 target** (joins func_80132784). Distilled (R30): sched.md **Β§6/S12/S13** + regalloc.md **Β§F/RC-10** + cookbook Β§31 triage-table **S11 downgrade**. Backlog re-logged (capped). R22 clean fleet check-all running at close. Commit: (checkpoint). - **T5 βœ“ (2026-07-03):** **Β§31-directed permuter mutation + grinder input-changed gating β€” built, validated, distilled.** NEW `tools/permuter_weights.py`: `classify(klass,where)` β†’ `regalloc|schedule|cse|None` + `render_settings_toml` emitting the `[weight_overrides]` table decomp-permuter merges over the gcc defaults (`main.py:336` / `helpers.py:merge` β€” per-key REPLACE; **no submodule edit**, R3/R20). Biases pass-selection toward each class's Β§31 levers (`perm_reorder_decls` RC-1/3 Β· `perm_reorder_stmts` RC-2/S1 Β· `perm_temp_for_expr` S2 Β· `perm_commutative` cse) and pushes the value/type noise to ~0.1. Wired into `p16_permute.setup(…, klass=, where=)` (+`--klass`, backlog auto-lookup) and `grinder.py` (auto-threads `klass`/`where_stuck`; `klass=None` β†’ gcc defaults = the pre-T5 undirected search, a safe superset). **Grinder fix (R14):** replaced the blind `tried.clear()` idle churn with **input-changed gating** (`draft_sig`=(best_draft mtime, closeness) β€” re-open a fn only when the worker improved it; the permuter is deterministic given base.c+target.o). **VALIDATED:** the regalloc profile drove `func_8014E048` base masked-36 β†’ **29** (match_one `-drz` **35β†’28**) where the undirected search stalled β€” real directed progress; re-logged (closeness 28, improved draft promoted). The 4 flagship count-exact seeds are the project's WORST-CASE intrinsic S11/RC-6 walls ("C-space discontinuous" Β§31 RC-6) β€” directed mutation improves but doesn't gate them β†’ T5b/backlog fuel (Β§31 "two probes, don't grind"). Distilled: cookbook **Β§3b** + SETUP inventory (R16/R30). **No build-input changed β†’ 136/136 fleet invariant untouched (tools/docs only).** Commit: (checkpoint).