diff --git a/.run/backlog.jsonl b/.run/backlog.jsonl index 7d4037ee6..2126c80b4 100644 --- a/.run/backlog.jsonl +++ b/.run/backlog.jsonl @@ -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} diff --git a/docs/family-hseq.md b/docs/family-hseq.md index f3eb84129..fca3839ac 100644 --- a/docs/family-hseq.md +++ b/docs/family-hseq.md @@ -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 | diff --git a/phase-ends/CURRENT_PHASE.md b/phase-ends/CURRENT_PHASE.md index eca712e30..09d0be8dd 100644 --- a/phase-ends/CURRENT_PHASE.md +++ b/phase-ends/CURRENT_PHASE.md @@ -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. diff --git a/tools/scope_tu_externs.py b/tools/scope_tu_externs.py index db31477ee..394724098 100644 --- a/tools/scope_tu_externs.py +++ b/tools/scope_tu_externs.py @@ -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: