diff --git a/docs/autopsy.md b/docs/autopsy.md index 0d8216530b..985a9fca48 100644 --- a/docs/autopsy.md +++ b/docs/autopsy.md @@ -4,36 +4,35 @@ > A verdict here is a **candidate**, never a bank: the whole-binary byte-gate remains the sole arbiter (G3/P9). -**Corpus:** 1752 record(s) · 1659 classified · status {'near': 1354, 'nobuild': 93, 'match': 305} +**Corpus:** 1699 record(s) · 1610 classified · status {'near': 1295, 'nobuild': 89, 'match': 315} ## Buckets — what tool each failure actually wants | bucket | fns | reach-weighted | meaning | |--------|----:|---------------:|---------| -| redraft | 699 | 2162 | the stored draft is NOT this function — un-attempted work misfiled as a near-miss; route to a fresh crack, not to a wall | -| structural | 578 | 7761 | local mutation CANNOT introduce it — wants a C-level idiom, not CPU | -| integration | 305 | 2303 | byte-correct standalone; blocked on plumbing (§58/§59 reconcile ladder) | -| permuter | 75 | 740 | local mutation CAN reach it — permuter fuel (a plateau here is a **missing-transform** candidate) | -| unknown | 2 | 2 | the residue the LLM tier is for | +| redraft | 707 | 1638 | the stored draft is NOT this function — un-attempted work misfiled as a near-miss; route to a fresh crack, not to a wall | +| structural | 528 | 5067 | local mutation CANNOT introduce it — wants a C-level idiom, not CPU | +| integration | 315 | 2454 | byte-correct standalone; blocked on plumbing (§58/§59 reconcile ladder) | +| permuter | 57 | 855 | local mutation CAN reach it — permuter fuel (a plateau here is a **missing-transform** candidate) | +| unknown | 3 | 140 | the residue the LLM tier is for | ## Classes | class | fns | reach-weighted | bucket | permuter profile | |-------|----:|---------------:|--------|------------------| -| SIZE-MISMATCH | 699 | 2162 | redraft | — | -| LENGTH-DRIFT | 394 | 6380 | structural | — | -| MATCH | 305 | 2303 | integration | — | -| OPCODE-MIXED | 80 | 878 | structural | — | -| WIDTH | 44 | 310 | structural | — | +| SIZE-MISMATCH | 707 | 1638 | redraft | — | +| LENGTH-DRIFT | 353 | 4223 | structural | — | +| MATCH | 315 | 2454 | integration | — | +| OPCODE-MIXED | 79 | 478 | structural | — | +| WIDTH | 46 | 449 | structural | — | | IMM-OFFSET | 38 | 38 | structural | — | -| DELAY-SLOT | 23 | 289 | permuter | schedule | -| BRANCH-POLARITY | 22 | 155 | structural | — | -| REGALLOC-PERM | 18 | 151 | permuter | regalloc | -| ADDRESSING | 17 | 150 | permuter | cse | -| IMM-VALUE | 10 | 143 | permuter | cse | -| SCHEDULE-REORDER | 7 | 7 | permuter | schedule | -| MIXED | 2 | 2 | unknown | — | +| BRANCH-POLARITY | 21 | 21 | structural | — | +| ADDRESSING | 19 | 418 | permuter | cse | +| DELAY-SLOT | 18 | 284 | permuter | schedule | +| REGALLOC-PERM | 7 | 7 | permuter | regalloc | +| IMM-VALUE | 4 | 4 | permuter | cse | +| MIXED | 3 | 140 | unknown | — | ## Top clusters (the batch-autopsy work items) @@ -41,31 +40,35 @@ One representative per signature diagnoses the whole cluster — that is what ma | # | signature | fns | reach-weighted | example | |--:|-----------|----:|---------------:|---------| -| 1 | `SIZE-MISMATCH/short` | 604 | 1801 | func_8017E918 (close=4, 2 ins) | -| 2 | `MATCH` | 305 | 2303 | func_80168B70 (close=0, 27 ins) | -| 3 | `LENGTH-DRIFT/-1?` | 116 | 1712 | func_8018312C (close=5, 7 ins) | -| 4 | `SIZE-MISMATCH/long` | 95 | 361 | func_8017E06C (close=6, 9 ins) | -| 5 | `LENGTH-DRIFT/-2?` | 70 | 1268 | func_80190480 (close=3, 4 ins) | -| 6 | `OPCODE-MIXED` | 67 | 599 | func_80161D20 (close=1, 14 ins) | -| 7 | `LENGTH-DRIFT/1?` | 63 | 595 | func_80187074 (close=4, 7 ins) | -| 8 | `LENGTH-DRIFT/2?` | 51 | 450 | func_80181B8C (close=5, 11 ins) | +| 1 | `SIZE-MISMATCH/short` | 614 | 1545 | func_8017FF90 (close=4, 2 ins) | +| 2 | `MATCH` | 315 | 2454 | func_80168B70 (close=0, 27 ins) | +| 3 | `LENGTH-DRIFT/-1?` | 112 | 1047 | func_8018312C (close=5, 7 ins) | +| 4 | `SIZE-MISMATCH/long` | 93 | 93 | func_8017E06C (close=6, 9 ins) | +| 5 | `LENGTH-DRIFT/-2?` | 70 | 1272 | func_80190480 (close=3, 4 ins) | +| 6 | `OPCODE-MIXED` | 67 | 466 | func_80161D20 (close=1, 14 ins) | +| 7 | `LENGTH-DRIFT/1?` | 62 | 461 | func_80187074 (close=4, 7 ins) | +| 8 | `LENGTH-DRIFT/2?` | 50 | 316 | func_80181B8C (close=5, 11 ins) | | 9 | `LENGTH-DRIFT/-7` | 32 | 32 | func_80184590 (close=9, 2 ins) | -| 10 | `LENGTH-DRIFT/+1` | 21 | 21 | func_8017DCE4 (close=3, 8 ins) | -| 11 | `IMM-OFFSET/1` | 17 | 17 | func_801827C4 (close=1, 13 ins) | -| 12 | `DELAY-SLOT/1` | 13 | 146 | func_8016BA68 (close=1, 29 ins) | -| 13 | `BRANCH-POLARITY/bnez!=beqz` | 11 | 144 | func_80185E38 (close=1, 12 ins) | -| 14 | `IMM-VALUE` | 10 | 143 | func_8018A640 (close=2, 4 ins) | -| 15 | `WIDTH/lhu!=lh` | 9 | 9 | func_80142A10 (close=1, 28 ins) | -| 16 | `LENGTH-DRIFT/-3?` | 8 | 1072 | func_8012CC88 (close=13, 102 ins) | -| 17 | `OPCODE-MIXED/addressing,width` | 8 | 274 | func_8017F114 (close=5, 75 ins) | -| 18 | `DELAY-SLOT/2` | 8 | 141 | func_80158638 (close=2, 87 ins) | +| 10 | `IMM-OFFSET/1` | 17 | 17 | func_801827C4 (close=1, 13 ins) | +| 11 | `DELAY-SLOT/1` | 10 | 143 | func_8016BA68 (close=1, 29 ins) | +| 12 | `BRANCH-POLARITY/bnez!=beqz` | 10 | 10 | func_80185E38 (close=1, 12 ins) | +| 13 | `WIDTH/lhu!=lh` | 9 | 9 | func_80142A10 (close=1, 28 ins) | +| 14 | `BRANCH-POLARITY/beqz!=bnez` | 8 | 8 | func_8017FDB0 (close=1, 12 ins) | +| 15 | `OPCODE-MIXED/addressing,width` | 6 | 6 | func_8017F114 (close=5, 75 ins) | +| 16 | `DELAY-SLOT/2` | 6 | 139 | func_80158638 (close=2, 87 ins) | +| 17 | `ADDRESSING/lui!=addiu` | 6 | 139 | func_8012A328 (close=3, 60 ins) | +| 18 | `WIDTH/sh!=lw` | 5 | 5 | func_8018AFDC (close=3, 8 ins) | +| 19 | `WIDTH/lw!=lhu` | 4 | 270 | func_8015FBE0 (close=1, 58 ins) | +| 20 | `LENGTH-DRIFT/+1` | 4 | 4 | func_8017DCE4 (close=3, 8 ins) | ## Second oracle — deterministic verdict vs the recorded label The recorded `klass` is what a wave agent typed months ago; the verdict is derived from today's bytes. Neither is authoritative — **the disagreement is the finding**, and it is exactly the `mis-classified` bucket (a wrongly-labelled residual sends the directed search at the wrong levers, so it plateaus and then reads as a wall). -- labelled records comparable: **4** · agree **3** · disagree **1** +- labelled records comparable: **4** · agree **1** · disagree **3** | fn | recorded label | label routes to | measured class | measured routes to | |----|----------------|-----------------|----------------|--------------------| +| func_80140D68 | `schedule` | schedule | ADDRESSING | cse | +| func_8012A328 | `schedule` | schedule | ADDRESSING | cse | | func_801549F8 | `schedule` | schedule | ADDRESSING | cse | diff --git a/phase-ends/CURRENT_PHASE.md b/phase-ends/CURRENT_PHASE.md index 486ee04df9..79cf89c6b6 100644 --- a/phase-ends/CURRENT_PHASE.md +++ b/phase-ends/CURRENT_PHASE.md @@ -4507,3 +4507,45 @@ resolves. T0.1/T0.3 only read sigs/configs and write `.run/` + `docs/` ⇒ safe **⇒ The single highest-value backlog action is to RUN `residual_class.py` over the 1,486 unlabelled entries** (deterministic, LLM-free, reads the bytes) so the 333 close=0 + 184 close-1-4 band can be routed to the right lever instead of grinding undirected. That is a zero-token tooling run. + +- **✅ 2026-07-26 (SESSION-20) — T0.3b AUTOPSY: every backlog residual RECOMPUTED from the bytes + (1,699 rows, `-j 12`, zero agent tokens). Three findings, one of them a large honesty correction.** + `autopsy.py collect` re-derives each residual through the validated `match_one` path, deriving the + asm subdir AND the `-O0` flag from `corpus.py` (both are documented silent-artefact generators). + **R34 cross-check PASSED: closeness agreed with `masked_diff.structured_diff` on all 1,610 built + rows, 0 classifier errors.** 89 `nobuild` rows REPORTED, not silently dropped (R32). + **THE BUCKETS (reach-weighted in parens):** + | bucket | fns | meaning | + |---|---|---| + | **redraft** | **707** (1,638) | *the stored draft is NOT this function* — un-attempted work MISFILED as a near-miss | + | **structural** | **528** (5,067) | local mutation cannot introduce it — wants a C-level idiom, not CPU | + | **integration** | **315** (2,454) | **byte-correct standalone; blocked on PLUMBING** | + | permuter | **57** (855) | local mutation CAN reach it — the only true permuter fuel | + | unknown | 3 (140) | the residue the LLM tier is for | + **① THE HONESTY CORRECTION — 707 of 1,610 (44%) of the "near-miss backlog" ARE NOT NEAR-MISSES.** + Class `SIZE-MISMATCH` (614 `short` + 93 `long`): the stored best-draft is a PARTIAL — an agent's + incomplete attempt logged with a closeness score, exactly like `func_80183814`'s 666-of-5,122 recon. + **`docs/backlog.md` — "the phase's other durable deliverable" (PhaseEnd 21) — has been overstating + readiness by ~44% ever since.** These route to a FRESH CRACK, not to a wall and not to the permuter. + **② THE ACTIONABLE POOL — 315 entries are `match_one` MATCH RIGHT NOW**, blocked only on the + §58/§59 reconcile ladder. Recomputing beat trusting the stored label exactly as the tool's docstring + argued: the tree has moved (type-lifts, shared-header work) since these were logged. Top by value: + `func_80174CB0` (123×134 = 16,482) · `func_801463A0` (101×134 = 13,534) · `func_80173A60` (59×134) · + `func_80176144` (53×138) · `func_8012F49C` (51×138); **total ≈108,959 gain-ins** where reach is + known. Spread across ~40 binaries (35 in ov_SC01_077). **⚠️ §52b still applies — ~half of close=0 + drafts fail the whole-binary gate — so this is 315 CANDIDATES, not 315 banks.** + **③ THE PERMUTER BUCKET IS 57.** Task-13B measured 75/972 (7.7%) permuter-shaped and concluded + *"the problem was TARGETING, not a missing transform"*; the fresh recompute says **57 of 1,610 + (3.5%)**. **Extending the mutation set is confirmed NOT the big lever** — it is a small, real, and + now precisely-bounded one. + **④ R34 EARNS ITS KEEP AGAIN — 3 of 4 comparable labels DISAGREE with the measurement:** + `func_80140D68`, `func_8012A328`, `func_801549F8` were all recorded **schedule** (→ schedule levers) + but measure **ADDRESSING** (→ cse levers). **The grinder was being pointed at the wrong levers for + these**, which is precisely the `mis-classified` bucket the autopsy exists to find. + **⇒ STRATEGIC CONVERGENCE (the answer to "what one thing unlocks the most"):** T0.2's gate probe + (8/8 failures PLUMBING, 0 walls) and T0.3b's autopsy (315 integration-class) **independently point + at the SAME lever — the declaration/integration reconcile ladder.** It is worth the 224,410-ins FREE + pool *and* ~108,959 backlog gain-ins. Two candidate keys were eliminated today (`--fix-def-sig` + regresses; `--normalize-self-decls` 0/123); the untried ones are **`canon_sig_reconcile` v3.2** and + **`reconcile_decls.py`** (the DATA-symbol analog — and one of T0.2's two failure texts was a DATA + symbol, `conflicting types for 'D_800A651C'`, which neither tested flag targets).