fix(phase-29): T55 — frontier re-mapped; 2 families swept, 0 banked, both blockers diagnosed to the line

Honest result: NO YIELD. What it produced is a re-measured frontier, a real fix to my own T53 work,
and both failures diagnosed rather than left as "0/N".

FRONTIER RE-MAPPED (T52's +132 moved it): family_hseq -> 2,647 target families, 513 substantial,
64 with a banked exemplar AND live stubs. Caveat recorded: the top two by byte-weight (0x8013c414
180KB, 0x8013c0f8 84KB) are -O0, and _o0 families are already measured at ~1/137 — do not be drawn
by their weight.

FAMILY 1 func_8014032C (183 ins x 136 ~ 25,000 ins): sample 0/8, last_err empty. Read one sibling's
real gate result (§53/§59) past the -j16 interleave and the §58 memcpy red herring — TWO causes:
  (1) conflicting types for D_80115128 — the T48/T51 class, which tu-scoped should have caught;
  (2) jtbl_rodata_pads "more rodata .align than pad specs — table-count drift vs the carve", a
      DISTINCT class jtbl_family_bank's own comment documents as NOT isolate-fixable (§91 --like
      role trap).
After fixing (1): still 0/8. Cause 2 is the live blocker — carve work, not decl work. NOT ground
further; it is a documented wall.

THE T53 DEFECT, FOUND AND FIXED: contested() scanned only the draft's BLOCK-scope externs, because
T51's motivating family had them hand-written in the body. But gather_externs carries decls in at
FILE scope, and those are exactly the ones scope_data_externs.fix DROPS when the TU already declares
the symbol — its give-up branch, the fatal case the lever exists for. Measured: scope_data_fix
dropped 3 symbols while contested() returned []. So the stage never fired on its own class. Now
scope-independent; regression-checked against T51's case using the pre-T51 TU from git (old ==
new, added []), and it now finds D_80115128 on the T55 target.

FAMILY 2 func_80144090 (154 ins x 136 ~ 21,000 ins), chosen because has_mid_jr=False avoids the
carve: 0/136. Diagnosed: conflicting types for D_800A651C (2210 vs 379) — the SAME class.
family_sweep gates via PLAIN harvest_verify by design, so it never sees the tu-scoped lever, which
lives only in jtbl_family_bank. Probed: the lever would move D_800A651C + D_800AF648 (deletion-only)
and REFUSES D_800B9A02 as "3 file-scope decls above (ambiguous)" — an over-conservative refusal,
since duplicate-IDENTICAL externs are legal C.

THE FINDING: the same decl-scope collision class gates the frontier's mechanical families — it cost
T52's family 133 of 137 siblings, and it blocks both families probed here. The lever exists and is
byte-proven; it is not reachable from the sweep path most families use.

No src/ or config/ change: no bank, no metric move. Tree verified clean after every probe.
This commit is contained in:
Drew T
2026-07-28 19:56:19 -06:00
parent f72e2344a6
commit bcd44badc9
4 changed files with 128 additions and 53 deletions
-5
View File
@@ -13,7 +13,6 @@
{"ts": "2026-06-21 22:01:56", "addr": "0x80174cb0", "name": "func_80174CB0", "reach": 134, "klass": "regalloc-order", "nins": 123, "status": "near", "closeness": 0, "where_stuck": "none \u2014 MATCH (match_one 123/123). Levers: (1) \u00a721 one combined stack struct {s32 a[5]; ...}", "best_draft": ".run/backlog_drafts/func_80174CB0.c", "binary": null, "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-07-14 12:56:18", "addr": "0x8014d610", "name": "func_8014D610", "reach": 134, "klass": "WAVE", "nins": 74, "status": "near", "closeness": 60, "where_stuck": "WAVE: 60 mismatch", "best_draft": ".run/backlog_drafts/func_8014D610.c", "binary": "ov_SC01_077", "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-06-22 00:05:13", "addr": "0x8016163c", "name": "func_8016163C", "reach": 134, "klass": "plumbing", "nins": 78, "status": "near", "closeness": 50, "where_stuck": "none \u2014 MATCH (78 ins). First arm calls func_801599A4 with NO arg (asm nop delay slot) via fn-ptr cast ((void(*)(void))func_801599A4)().", "best_draft": ".run/backlog_drafts/func_8016163C.c", "binary": null, "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-06-22 03:29:52", "addr": "0x80140d68", "name": "func_80140D68", "reach": 134, "klass": "schedule", "nins": 65, "status": "near", "closeness": 5, "where_stuck": "5-ins near-miss \u2014 gcc hoists `lui 0xff00` (the 0xFF000000 mask) one slot too early in the first AddPrim block, so the D_800B9A02 index value lands in $v1 instead of $a1 and *param_1 is read late (idx 35-43). Structure + regs otherwise byte-exact (frame eliminated via struct-array D_800AE7BC, &D_800B9A02 held in $a2 via the pB $6 pin, param_1+8 grouping fixes the rest). Pure sched1 list-order residual -> permuter candidate (try reg-hint + reorder around the lui 0xff00 / lw 0($a0) pair).", "best_draft": ".run/backlog_drafts/func_80140D68.c", "binary": null, "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-06-22 00:05:13", "addr": "0x80161774", "name": "func_80161774", "reach": 134, "klass": "plumbing", "nins": 69, "status": "near", "closeness": 53, "where_stuck": "none \u2014 MATCH (69 ins, match_one verified; clean nested-if; param_1 -> $s0 call-crossing)", "best_draft": ".run/backlog_drafts/func_80161774.c", "binary": null, "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-06-22 00:53:10", "addr": "0x8014e5b4", "name": "func_8014E5B4", "reach": 134, "klass": "regalloc-order", "nins": 59, "status": "near", "closeness": 23, "where_stuck": "none \u2014 MATCH", "best_draft": ".run/backlog_drafts/func_8014E5B4.c", "binary": null, "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-06-22 00:53:11", "addr": "0x801759d8", "name": "func_801759D8", "reach": 134, "klass": "schedule", "nins": 56, "status": "near", "closeness": 0, "where_stuck": "none \u2014 MATCH (56 ins)", "best_draft": ".run/backlog_drafts/func_801759D8.c", "binary": null, "source": "worker", "residual": null, "passes_tried": null}
@@ -59,7 +58,6 @@
{"ts": "2026-06-23 10:33:31", "addr": "0x80159a20", "name": "func_80159A20", "reach": 1, "klass": "struct", "nins": 58, "status": "failed", "closeness": null, "where_stuck": "none \u2014 MATCH. Key lever: block tail-MERGE (gcc shared `bne ...,$L1` cross-jump) by making the two return-tests STRUCTURALLY DIFFERENT \u2014 positive `if(==){goto mask;} return;` per branch (not `if(!=) return;`), so neither tail can merge. Then fix block ORDER by inverting the outer test (`if(d!=1)` makes the ==4/return path the inline fall-through, the d==1/p[2] path the forward `beq`-target block \u2014 matching the target layout).", "best_draft": ".run/backlog_drafts/func_80159A20.c", "binary": null, "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-06-23 10:33:31", "addr": "0x8015fbe0", "name": "func_8015FBE0", "reach": 1, "klass": "schedule", "nins": 58, "status": "near", "closeness": 1, "where_stuck": "none \u2014 MATCH", "best_draft": ".run/backlog_drafts/func_8015FBE0.c", "binary": null, "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-06-23 10:33:31", "addr": "0x80183cf4", "name": "func_80183CF4", "reach": 1, "klass": "struct", "nins": 57, "status": "near", "closeness": 0, "where_stuck": "none \u2014 MATCH (clean switch + jtbl; orchestrator owns jtbl/rodata migration)", "best_draft": ".run/backlog_drafts/func_80183CF4.c", "binary": null, "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-06-23 11:48:02", "addr": "0x80177da8", "name": "func_80177DA8", "reach": 1, "klass": "remat", "nins": 63, "status": "near", "closeness": 58, "where_stuck": "gcc narrows `&0xfffffeff` on a 16-bit (lhu) value to `andi 0xfeff` (inline), but target hoisted -0x101 into $t4 (and-reg) in the loop preheader \u2014 a gcc-2.7.2 LICM-before-combine pass-ordering quirk unsteerable from C; that 1-ins gap cascades the constant-reg numbering + tail reassoc. Secondary: single-IV loop ptr anchors at +0xA (short, 2 accesses) not +0xC (byte) like target.", "best_draft": ".run/backlog_drafts/func_80177DA8.c", "binary": null, "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-06-23 11:09:10", "addr": "0x801842c8", "name": "func_801842C8", "reach": 1, "klass": "plumbing", "nins": 62, "status": "near", "closeness": 0, "where_stuck": "none \u2014 MATCH", "best_draft": ".run/backlog_drafts/func_801842C8.c", "binary": null, "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-06-25 20:30:02", "addr": "0x8017f114", "name": "func_8017F114", "reach": 1, "klass": "regalloc-order", "nins": 75, "status": "near", "closeness": 1, "where_stuck": "none \u2014 MATCH", "best_draft": ".run/backlog_drafts/func_8017F114.c", "binary": null, "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-07-14 12:56:21", "addr": "0x80161a90", "name": "func_80161A90", "reach": 134, "klass": "O1", "nins": 34, "status": "near", "closeness": 26, "where_stuck": "WAVE: 26 mismatch", "best_draft": ".run/backlog_drafts/func_80161A90.c", "binary": "ov_SC01_077", "source": "worker", "residual": null, "passes_tried": null}
@@ -67,7 +65,6 @@
{"ts": "2026-07-02 11:08:32", "addr": "0x8016ba68", "name": "func_8016BA68", "reach": 134, "klass": "STUB", "nins": 29, "status": "near", "closeness": 1, "where_stuck": "STUB: 1 mismatch", "best_draft": ".run/backlog_drafts/func_8016BA68.c", "binary": "ov_SC01_077", "source": "glm-small40", "residual": null, "passes_tried": null}
{"ts": "2026-06-24 20:13:27", "addr": "0x8012a1bc", "name": "func_8012A1BC", "reach": 134, "klass": "schedule", "nins": 78, "status": "near", "closeness": 42, "where_stuck": "42/78 \u2014 block-copy bytes correct (char[8] => lwl/lwr/swl/swr); residual is gcc's load-hoist split. Target hoists all 9 non-block scalar loads to the top then stores 4, blk, blk, then late-stores the rest; a \"memory\" barrier is needed to stop the block copy hoisting+spilling but it also pins the 5 late scalars' stores too early. No single source/barrier shape reproduces \"loads cross the block copy but the copy itself does not\" \u2014 permuter/schedule residual.", "best_draft": ".run/backlog_drafts/func_8012A1BC.c", "binary": null, "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-06-24 20:13:27", "addr": "0x8012e014", "name": "func_8012E014", "reach": 134, "klass": "other", "nins": 73, "status": "near", "closeness": 0, "where_stuck": "none \u2014 MATCH (expected; straightforward struct-field + global-copy body)", "best_draft": ".run/backlog_drafts/func_8012E014.c", "binary": null, "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-07-14 12:56:15", "addr": "0x80132f40", "name": "func_80132F40", "reach": 134, "klass": "STRUCT", "nins": 72, "status": "near", "closeness": 59, "where_stuck": "STRUCT: 59 mismatch", "best_draft": ".run/backlog_drafts/func_80132F40.c", "binary": "ov_SC01_077", "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-06-24 20:13:28", "addr": "0x80133298", "name": "func_80133298", "reach": 134, "klass": "struct", "nins": 65, "status": "near", "closeness": 0, "where_stuck": "none \u2014 MATCH (65 ins, relocation-masked)", "best_draft": ".run/backlog_drafts/func_80133298.c", "binary": null, "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-06-24 22:47:48", "addr": "0x8012b77c", "name": "func_8012B77C", "reach": 134, "klass": "schedule", "nins": 58, "status": "near", "closeness": 33, "where_stuck": "gcc instruction-scheduler load-ordering + 1st-ratan2 delay-slot fill differ (s2 subtraction lands early instead of in the delay slot; `lh s1,2(a2)` hoisted ahead of the iVar8 loads). All regs/ops correct (result pinned $s4 reads uninit then RMW-builds the u32; iVar8 unpinned so both halves load to temps -> `subu s5,v1,v0`). Residual is the \u00a720 store-vs-load/delay-slot scheduler tie-break (source reorder/barrier/precompute all tried, do not move it); ~3-4 real slots, count inflated by offset cascade. move==addu rd,rs,zero byte-identical.", "best_draft": ".run/backlog_drafts/func_8012B77C.c", "binary": null, "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-07-24 14:33:43", "addr": "0x8012f49c", "name": "func_8012F49C", "reach": 138, "klass": "regalloc-order", "nins": 51, "status": "near", "closeness": 0, "where_stuck": "none \u2014 MATCH (51 ins, relocation-masked)", "best_draft": ".run/backlog_drafts/func_8012F49C.c", "binary": "ov_SC07_006", "source": "t6-recover", "residual": null, "passes_tried": null}
@@ -996,9 +993,7 @@
{"ts": "2026-07-02 15:29:02", "addr": null, "name": "func_80186C88", "reach": null, "klass": null, "nins": null, "status": "near", "closeness": 6, "where_stuck": "residual: 6 mismatch", "best_draft": ".run/backlog_drafts/func_80186C88.c", "binary": "ov_SC06_029", "source": "bulk-harvest", "residual": null, "passes_tried": null}
{"ts": "2026-07-02 15:29:02", "addr": null, "name": "func_80186D64", "reach": null, "klass": null, "nins": null, "status": "near", "closeness": 10, "where_stuck": "residual: 10 mismatch", "best_draft": ".run/backlog_drafts/func_80186D64.c", "binary": "ov_SC06_029", "source": "bulk-harvest", "residual": null, "passes_tried": null}
{"ts": "2026-07-02 22:52:42", "addr": "0x801412a8", "name": "func_801412A8", "reach": 134, "klass": "regalloc-order", "nins": 198, "status": "near", "closeness": 110, "where_stuck": "110 mismatch (count-exact 198/198). S11 LUID(x)alloc: register-assignment permutation + prim2 store-schedule. \u00a731 permuter seed (was mis-logged 164).", "best_draft": ".run/backlog_drafts/func_801412A8.c", "binary": "ov_SC01_077", "source": "T1-relog", "residual": null, "passes_tried": null}
{"ts": "2026-07-14 12:56:14", "addr": "0x8012e364", "name": "func_8012E364", "reach": 1, "klass": "regalloc-order", "nins": 67, "status": "near", "closeness": 23, "where_stuck": "23/67 masked. Structure+idioms exact (barrier fixes the late D9498 load; k=0x1000 CSE'd into $a3 hoisted to the blez delay slot; 6 register pins land arg/$a2, k/$a3, D9498/$v1, temp_a1/$a1, var_v0(_2)/$v0). Residual is the discontinuous q<->temp_v0 reuse chain (q reuses $v0 but target puts it in $a0 reusing x's dead reg; every whole-function pin that forces q->$a0 chains hi>>5 or var_v0 wrong) + 2nd-half schedule (0x2C lhu interleaved before the +k addu; the abs copies temp_v1->$v0 via addu-move). Permuter-class (register renaming) but pins block pycparser -> hand/human finish.", "best_draft": ".run/backlog_drafts/func_8012E364.c", "binary": "ov_SC01_077", "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-07-09 21:32:59", "addr": "0x8013bd74", "name": "func_8013BD74", "reach": 1, "klass": "struct", "nins": 198, "status": "near", "closeness": 192, "where_stuck": "none \u2014 MATCH", "best_draft": ".run/backlog_drafts/func_8013BD74.c", "binary": "ov_SC01_077", "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-07-14 12:56:16", "addr": "0x8013b598", "name": "func_8013B598", "reach": 1, "klass": "O0", "nins": 66, "status": "near", "closeness": 66, "where_stuck": "WAVE: 66 mismatch", "best_draft": ".run/backlog_drafts/func_8013B598.c", "binary": "ov_SC01_077", "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-07-14 12:56:16", "addr": "0x8013c08c", "name": "func_8013C08C", "reach": 134, "klass": "O0", "nins": 27, "status": "near", "closeness": 26, "where_stuck": "WAVE: 26 mismatch", "best_draft": ".run/backlog_drafts/func_8013C08C.c", "binary": "ov_SC01_077", "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-07-14 12:56:25", "addr": "0x8017c294", "name": "func_8017C294", "reach": 2, "klass": "regalloc-order", "nins": 246, "status": "near", "closeness": 230, "where_stuck": "structurally matched (246 ins, param_3 in $fp, spurious psVar7[1] giv killed via", "best_draft": ".run/backlog_drafts/func_8017C294.c", "binary": "ov_SC01_077", "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-07-14 12:20:02", "addr": "0x80185ba4", "name": "func_80185BA4", "reach": 1, "klass": "WAVE", "nins": 177, "status": "failed", "closeness": null, "where_stuck": "won't compile standalone (loose-typing / missing decl)", "best_draft": null, "binary": "ov_SC01_077", "source": "worker", "residual": null, "passes_tried": null}
+44 -44
View File
@@ -2,11 +2,11 @@
> Generated by `tools/family_hseq.py` from the 138 overlay sigs + per-overlay src stubs. Ranked by TEMPLATABLE byte-weight (PURE+IMM members × nins × 4). The byte-gate is the arbiter.
**Fleet (overlays):** 90.9% fn / 85.9% instr / 76.9% distinct-code matched. Unmatched: 32,145 instances / 1,840,793 ins (19,762 distinct classes).
**Fleet (overlays):** 90.9% fn / 86.1% instr / 77.2% distinct-code matched. Unmatched: 32,009 instances / 1,822,297 ins (19,633 distinct classes).
**Tail cross-check (Phase-25 close):** 18,663 tail fns / 717,657 ins → 552 h_seq families ≥2, **143 substantial (nins≥80) / 282,722 ins**.
**Tail cross-check (Phase-25 close):** 18,527 tail fns / 700,113 ins → 551 h_seq families ≥2, **142 substantial (nins≥80) / 265,042 ins**.
**Full frontier (all unmatched by h_seq):** 2647 target families (≥2 members or a matched sibling) + 3771 singletons (Step-D residue). Substantial: **513 families / 764,377 templatable ins**, 63 with a matched sibling (zero-crack). Substantial member classes: 4,303 PURE · 40 IMM · 6 STRUCT-excluded.
**Full frontier (all unmatched by h_seq):** 2647 target families (≥2 members or a matched sibling) + 3771 singletons (Step-D residue). Substantial: **513 families / 745,881 templatable ins**, 63 with a matched sibling (zero-crack). Substantial member classes: 4,167 PURE · 40 IMM · 6 STRUCT-excluded.
## Top substantial families (by templatable byte-weight)
@@ -22,44 +22,44 @@
| 7 | 165 | 138 (138/0/0) | 1/138 | per-location | PURE | 0 | · | 0x80178004 draft-ov077 | 22,770 |
| 8 | 154 | 137 (137/0/0) | 1/137 | per-location | PURE | 1 | Y | 0x8013c0f8 matched-ov077 | 21,098 |
| 9 | 154 | 136 (136/0/0) | 1/136 | per-location | PURE | 2 | · | 0x80144090 matched-ov077 | 20,944 |
| 10 | 136 | 137 (137/0/0) | 1/137 | per-location | PURE | 1 | Y | 0x80135260 matched-ov077 | 18,632 |
| 11 | 137 | 132 (132/0/0) | 1/132 | per-location | PURE | 6 | · | 0x80133ab0 matched-ov077 | 18,084 |
| 12 | 947 | 16 (16/0/0) | 6/16 | cross-address | PURE | 0 | Y | 0x8017c974 draft-ov077 | 15,152 |
| 13 | 952 | 13 (7/6/0) | 5/13 | cross-address | IMM | 103 | Y | 0x8017bebc matched | 12,376 |
| 14 | 88 | 138 (138/0/0) | 1/138 | per-location | PURE | 0 | · | 0x8016ec0c draft-ov077 | 12,144 |
| 15 | 80 | 136 (136/0/0) | 1/136 | per-location | PURE | 2 | · | 0x80143d28 matched-ov077 | 10,880 |
| 16 | 195 | 36 (36/0/0) | 11/36 | scattered | PURE | 0 | · | 0x8017c218 modal | 7,020 |
| 17 | 299 | 20 (20/0/0) | 20/20 | scattered | PURE | 0 | Y | 0x8017fee0 modal | 5,980 |
| 18 | 227 | 26 (26/0/0) | 10/26 | scattered | PURE | 0 | · | 0x8017bfec modal | 5,902 |
| 19 | 236 | 20 (20/0/0) | 20/20 | scattered | PURE | 0 | · | 0x80180520 modal | 4,720 |
| 20 | 158 | 26 (26/0/0) | 10/26 | scattered | PURE | 0 | · | 0x8017c378 modal | 4,108 |
| 21 | 793 | 5 (5/0/0) | 2/5 | cross-address | PURE | 0 | · | 0x8017d174 modal | 3,965 |
| 22 | 246 | 16 (16/0/0) | 6/16 | cross-address | PURE | 0 | · | 0x8017c294 draft-ov077 | 3,936 |
| 23 | 766 | 5 (5/0/0) | 3/5 | cross-address | PURE | 0 | · | 0x8017df84 modal | 3,830 |
| 24 | 328 | 11 (11/0/0) | 11/11 | scattered | PURE | 0 | · | 0x801833f0 modal | 3,608 |
| 25 | 890 | 4 (4/0/0) | 1/4 | per-location | PURE | 134 | Y | 0x80178d40 matched-ov077 | 3,560 |
| 26 | 237 | 15 (15/0/0) | 15/15 | scattered | PURE | 0 | · | 0x801832a8 modal | 3,555 |
| 27 | 253 | 14 (14/0/0) | 10/14 | scattered | PURE | 0 | · | 0x8017c9bc modal | 3,542 |
| 28 | 491 | 7 (7/0/0) | 6/7 | cross-address | PURE | 0 | Y | 0x801863cc modal | 3,437 |
| 29 | 166 | 20 (20/0/0) | 20/20 | scattered | PURE | 0 | · | 0x8017fac0 modal | 3,320 |
| 30 | 92 | 36 (36/0/0) | 11/36 | scattered | PURE | 0 | · | 0x8017c910 modal | 3,312 |
| 31 | 90 | 36 (36/0/0) | 11/36 | scattered | PURE | 0 | · | 0x8017c064 modal | 3,240 |
| 32 | 293 | 11 (11/0/0) | 4/11 | cross-address | PURE | 0 | · | 0x8017c43c modal | 3,223 |
| 33 | 770 | 4 (4/0/0) | 1/4 | per-location | PURE | 134 | · | 0x80144b9c matched-ov077 | 3,080 |
| 34 | 611 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | · | 0x80186e24 modal | 3,055 |
| 35 | 493 | 6 (6/0/0) | 1/6 | per-location | PURE | 132 | Y | 0x8015a3c8 matched-ov077 | 2,958 |
| 36 | 263 | 11 (11/0/0) | 11/11 | scattered | PURE | 0 | · | 0x80182fd4 modal | 2,893 |
| 37 | 557 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | Y | 0x80186570 modal | 2,785 |
| 38 | 185 | 15 (15/0/0) | 13/15 | scattered | PURE | 0 | · | 0x8018b23c modal | 2,775 |
| 39 | 551 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | Y | 0x80189540 modal | 2,755 |
| 40 | 125 | 22 (22/0/0) | 22/22 | scattered | PURE | 0 | Y | 0x80185440 modal | 2,750 |
| 41 | 386 | 7 (7/0/0) | 6/7 | cross-address | PURE | 0 | · | 0x80186b78 modal | 2,702 |
| 42 | 83 | 32 (32/0/0) | 30/32 | scattered | PURE | 0 | · | 0x80189c7c modal | 2,656 |
| 43 | 177 | 15 (15/0/0) | 13/15 | scattered | PURE | 0 | · | 0x8018aa98 modal | 2,655 |
| 44 | 513 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | Y | 0x801878e8 modal | 2,565 |
| 45 | 96 | 26 (26/0/0) | 10/26 | scattered | PURE | 0 | · | 0x8017c738 modal | 2,496 |
| 46 | 154 | 15 (15/0/0) | 15/15 | scattered | PURE | 0 | · | 0x8018389c modal | 2,310 |
| 47 | 164 | 14 (14/0/0) | 14/14 | scattered | PURE | 0 | · | 0x80190748 modal | 2,296 |
| 48 | 113 | 20 (20/0/0) | 10/20 | scattered | PURE | 13 | · | 0x8017bef8 matched-ov077 | 2,260 |
| 49 | 562 | 4 (4/0/0) | 1/4 | per-location | PURE | 134 | Y | 0x8015ae2c matched-ov077 | 2,248 |
| 50 | 147 | 15 (15/0/0) | 15/15 | scattered | PURE | 0 | · | 0x80183cac modal | 2,205 |
| 10 | 137 | 132 (132/0/0) | 1/132 | per-location | PURE | 6 | · | 0x80133ab0 matched-ov077 | 18,084 |
| 11 | 947 | 16 (16/0/0) | 6/16 | cross-address | PURE | 0 | Y | 0x8017c974 draft-ov077 | 15,152 |
| 12 | 952 | 13 (7/6/0) | 5/13 | cross-address | IMM | 103 | Y | 0x8017bebc matched | 12,376 |
| 13 | 88 | 138 (138/0/0) | 1/138 | per-location | PURE | 0 | · | 0x8016ec0c draft-ov077 | 12,144 |
| 14 | 80 | 136 (136/0/0) | 1/136 | per-location | PURE | 2 | · | 0x80143d28 matched-ov077 | 10,880 |
| 15 | 195 | 36 (36/0/0) | 11/36 | scattered | PURE | 0 | · | 0x8017c218 modal | 7,020 |
| 16 | 299 | 20 (20/0/0) | 20/20 | scattered | PURE | 0 | Y | 0x8017fee0 modal | 5,980 |
| 17 | 227 | 26 (26/0/0) | 10/26 | scattered | PURE | 0 | · | 0x8017bfec modal | 5,902 |
| 18 | 236 | 20 (20/0/0) | 20/20 | scattered | PURE | 0 | · | 0x80180520 modal | 4,720 |
| 19 | 158 | 26 (26/0/0) | 10/26 | scattered | PURE | 0 | · | 0x8017c378 modal | 4,108 |
| 20 | 793 | 5 (5/0/0) | 2/5 | cross-address | PURE | 0 | · | 0x8017d174 modal | 3,965 |
| 21 | 246 | 16 (16/0/0) | 6/16 | cross-address | PURE | 0 | · | 0x8017c294 draft-ov077 | 3,936 |
| 22 | 766 | 5 (5/0/0) | 3/5 | cross-address | PURE | 0 | · | 0x8017df84 modal | 3,830 |
| 23 | 328 | 11 (11/0/0) | 11/11 | scattered | PURE | 0 | · | 0x801833f0 modal | 3,608 |
| 24 | 890 | 4 (4/0/0) | 1/4 | per-location | PURE | 134 | Y | 0x80178d40 matched-ov077 | 3,560 |
| 25 | 237 | 15 (15/0/0) | 15/15 | scattered | PURE | 0 | · | 0x801832a8 modal | 3,555 |
| 26 | 253 | 14 (14/0/0) | 10/14 | scattered | PURE | 0 | · | 0x8017c9bc modal | 3,542 |
| 27 | 491 | 7 (7/0/0) | 6/7 | cross-address | PURE | 0 | Y | 0x801863cc modal | 3,437 |
| 28 | 166 | 20 (20/0/0) | 20/20 | scattered | PURE | 0 | · | 0x8017fac0 modal | 3,320 |
| 29 | 92 | 36 (36/0/0) | 11/36 | scattered | PURE | 0 | · | 0x8017c910 modal | 3,312 |
| 30 | 90 | 36 (36/0/0) | 11/36 | scattered | PURE | 0 | · | 0x8017c064 modal | 3,240 |
| 31 | 293 | 11 (11/0/0) | 4/11 | cross-address | PURE | 0 | · | 0x8017c43c modal | 3,223 |
| 32 | 770 | 4 (4/0/0) | 1/4 | per-location | PURE | 134 | · | 0x80144b9c matched-ov077 | 3,080 |
| 33 | 611 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | · | 0x80186e24 modal | 3,055 |
| 34 | 493 | 6 (6/0/0) | 1/6 | per-location | PURE | 132 | Y | 0x8015a3c8 matched-ov077 | 2,958 |
| 35 | 263 | 11 (11/0/0) | 11/11 | scattered | PURE | 0 | · | 0x80182fd4 modal | 2,893 |
| 36 | 557 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | Y | 0x80186570 modal | 2,785 |
| 37 | 185 | 15 (15/0/0) | 13/15 | scattered | PURE | 0 | · | 0x8018b23c modal | 2,775 |
| 38 | 551 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | Y | 0x80189540 modal | 2,755 |
| 39 | 125 | 22 (22/0/0) | 22/22 | scattered | PURE | 0 | Y | 0x80185440 modal | 2,750 |
| 40 | 386 | 7 (7/0/0) | 6/7 | cross-address | PURE | 0 | · | 0x80186b78 modal | 2,702 |
| 41 | 83 | 32 (32/0/0) | 30/32 | scattered | PURE | 0 | · | 0x80189c7c modal | 2,656 |
| 42 | 177 | 15 (15/0/0) | 13/15 | scattered | PURE | 0 | · | 0x8018aa98 modal | 2,655 |
| 43 | 513 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | Y | 0x801878e8 modal | 2,565 |
| 44 | 96 | 26 (26/0/0) | 10/26 | scattered | PURE | 0 | · | 0x8017c738 modal | 2,496 |
| 45 | 154 | 15 (15/0/0) | 15/15 | scattered | PURE | 0 | · | 0x8018389c modal | 2,310 |
| 46 | 164 | 14 (14/0/0) | 14/14 | scattered | PURE | 0 | · | 0x80190748 modal | 2,296 |
| 47 | 113 | 20 (20/0/0) | 10/20 | scattered | PURE | 13 | · | 0x8017bef8 matched-ov077 | 2,260 |
| 48 | 562 | 4 (4/0/0) | 1/4 | per-location | PURE | 134 | Y | 0x8015ae2c matched-ov077 | 2,248 |
| 49 | 147 | 15 (15/0/0) | 15/15 | scattered | PURE | 0 | · | 0x80183cac modal | 2,205 |
| 50 | 144 | 15 (15/0/0) | 15/15 | scattered | PURE | 0 | · | 0x8018365c modal | 2,160 |
+68
View File
@@ -7770,3 +7770,71 @@ function is **not in the corpus at all** — the two targets that actually plate
### GATE
Tooling-only, no `src/`/`config/` change → no bank, no metric move. `parse OK` on both edited tools;
the effect measured directly through `autopsy.verdicts()` and `grinder.candidates()`.
## ⚠️ T55 — frontier re-mapped, 2 families swept, **0 banked** — and both blockers are the SAME class
Honest result: no yield. What it produced instead is a re-measured frontier, one real fix to my own
T53 work, and both failures diagnosed to the exact line.
### THE FRONTIER, RE-MAPPED (T52's +132 moved it)
`family_hseq` regenerated: **2,647 target families · 513 substantial · 64 with a banked exemplar AND
live stubs.** That last set is the mechanical fuel; it is ranked in `.run/family_hseq.json`.
**Caveat recorded:** the top two by byte-weight (`0x8013c414` 180 KB, `0x8013c0f8` 84 KB) are **-O0**
(`ov_SC01_077_o0.c`) and the phase already measured `_o0` families at ~1/137 — do not be drawn by
their weight.
### FAMILY 1 — `func_8014032C` (183 ins × 136 stubs ≈ 25,000 ins): TWO causes, one of them mine
Sample 8 → **0/8**, `last_err` empty (every stage produced a candidate; all failed the gate). Read
one sibling's real gate result rather than concluding (§53/§59) — the `-j16` interleave and the §58
`memcpy` red herring both had to be stepped past to get it:
1. **`conflicting types for D_80115128`** — the T48/T51 class, which `tu-scoped` should have caught.
**It did not, and that was a defect in my T53 wiring** (below).
2. **`jtbl_rodata_pads: more rodata .align directives than pad specs — table-count drift vs the
carve`** — a DISTINCT class `jtbl_family_bank`'s own comment documents as **not** isolate-fixable
(the §91 `--like` role trap: the sibling's jtbl layout does not correspond to ov_SC01_077's).
After fixing cause 1: still **0/8**. Cause 2 is the live blocker; this family needs carve work, not
decl work. **Not ground further — it is a documented wall, and grinding it is what this phase keeps
telling itself not to do.**
### THE T53 DEFECT I FOUND AND FIXED — `contested()` was blind to the majority form
`contested()` scanned only the draft's **BLOCK-scope** externs, because in T51's motivating family
the byte-true decls had been hand-written inside the function body. But `gather_externs` carries an
exemplar's decls in at **FILE scope**, and those are exactly the ones `scope_data_externs.fix`
**DROPS** when the TU already declares the symbol — its documented give-up branch, and the fatal
case the whole lever exists for. Measured: on `func_8014032C`, `scope_data_fix` dropped **3** symbols
while `contested()` returned **`[]`**. So the tu-scoped stage never fired on precisely its own class.
Fixed (scope-independent now) and **regression-checked against T51's original case using the pre-T51
TU from git: old `['D_8017F198','D_8017F19C','D_8017F1A4']` == new, added `[]`.** On the T55 target
it now correctly finds `D_80115128`.
### FAMILY 2 — `func_80144090` (154 ins × 136 stubs ≈ 21,000 ins): the SAME decl class, in a tool that lacks the lever
Swept via `family_sweep --hseq` (chosen because `has_mid_jr=False` avoids the carve entirely, so
cause 2 cannot recur). **0/136.** Diagnosed one sibling: **`conflicting types for D_800A651C`**
(line 2210 vs 379) — the T48/T51 class again. `family_sweep` gates via **plain `harvest_verify`** by
design (§T3: gate_stage's transforms perturb a correct remapped draft), so **it never sees the
tu-scoped lever, which lives only in `jtbl_family_bank`.**
Probed the lever against it: it would move `D_800A651C` + `D_800AF648` (deletion-only, 0 consumers)
and **refuses `D_800B9A02` — "3 file-scope decls above the splice point (ambiguous)"**. That refusal
is **over-conservative**: duplicate-*identical* externs are legal C, so N identical decls are not
ambiguous, they are one decl written N times.
### THE FINDING
**The same decl-scope collision class gates the frontier's mechanical families** — it is what cost
T52's family 133 of 137 siblings, and it is what blocks both families probed here. The lever exists
and is byte-proven; it is simply not reachable from the sweep path that most families use.
### GATE
No `src/`/`config/` change → no bank, no metric move, tree clean after every probe (T53's revert
guard held through two crashes-by-design and four aborted stagings).
## ▶ NEXT (ranked, all measured — the first two are one job)
1. **Wire the tu-scoped lever into `family_sweep`'s staging** (it only exists in `jtbl_family_bank`).
Directly unblocks `func_80144090` ≈ **21,000 ins**, and applies to the other non-jr families.
2. **Relax `scope_tu_externs`' duplicate-decl refusal**: if the N file-scope decls of a symbol are
textually identical they are unambiguous — delete all N. Currently refuses (`D_800B9A02`).
Keep refusing when they genuinely differ.
3. **Re-sweep `func_80144090`, then work down the 64-family list** (skip the two -O0 leaders).
4. `func_8014032C` needs **carve** work (table-count drift, §91), not decl work — separate, harder.
5. **PARKED: `func_80176734`** (51,198 ins) — five tiers bounced; clusters A and B provably coupled.
+16 -4
View File
@@ -253,12 +253,24 @@ def stub_pos(tu_text, func, tu_path=''):
def contested(draft_body, tu_text, above):
"""The DATA symbols a staged draft declares at BLOCK scope that the target TU also declares at
FILE scope above the splice point — i.e. exactly the symbols whose two declarations collide.
Derived from the draft, never hand-listed (R33)."""
"""The DATA symbols a staged draft declares — at EITHER scope — that the target TU also declares
at FILE scope above the splice point. That intersection is exactly the set whose two declarations
collide. Derived from the draft, never hand-listed (R33).
BOTH SCOPES, and the first cut got this wrong (Phase 29 T55). It scanned only the draft's
BLOCK-scope externs, because in T51's motivating family the byte-true decls had been written
inside the function body by hand. But `family_remap.gather_externs` carries an exemplar's decls
in at FILE scope (column 0), and those are the ones `scope_data_externs.fix` DROPS when the
target TU already declares the symbol — its documented give-up branch, and the fatal case this
whole lever exists for. So the scan was blind to the majority form: on `func_8014032C`
`scope_data_fix` dropped three symbols while `contested` returned `[]`, and the tu-scoped stage
never fired on precisely the class it was built for (`conflicting types for D_80115128`).
The rule is scope-independent: a draft decl and a TU file-scope decl of the same symbol collide
wherever the draft's sits."""
draft_syms, seen = [], set()
for ln in cdecl._mask(draft_body).split('\n'):
if not ANY_EXTERN_RE.match(ln) or ln.startswith('extern'):
if not ANY_EXTERN_RE.match(ln):
continue
d = re.search(r'\bD_[0-9A-Fa-f]{6,8}\b', ln)
if d and d.group(0) not in seen: