Files
BFM-decomp/docs/autopsy.md
T
Drew T adafeb13d6 feat(phase-29): T0.3b autopsy — 44% of the "near-miss backlog" are not near-misses; 315 are plumbing-blocked MATCHes
Recomputed every backlog residual from the bytes (1,699 rows, -j 12, zero agent tokens) through the
validated match_one path, deriving asm-subdir + -O0 from corpus.py. 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 dropped (R32).

BUCKETS: redraft 707 | structural 528 | integration 315 | permuter 57 | unknown 3.

1. HONESTY CORRECTION: 707 of 1,610 (44%) are class SIZE-MISMATCH — the stored best-draft is a
   PARTIAL, an incomplete attempt logged with a closeness score (the func_80183814 666-of-5,122
   shape). docs/backlog.md has been overstating readiness by ~44%. These route to a FRESH CRACK,
   not to a wall and not to the permuter.
2. ACTIONABLE: 315 entries are match_one MATCH *right now*, blocked only on the reconcile ladder —
   recomputing beat trusting the stored label because the tree moved since they were logged.
   ~108,959 gain-ins; top func_80174CB0 (16,482), func_801463A0 (13,534). §52b still applies: ~half
   of close=0 drafts fail the whole-binary gate, so these are CANDIDATES not banks.
3. The permuter bucket is 57/1,610 = 3.5% (Task-13B measured 7.7% and called targeting the problem).
   Extending the mutation set is CONFIRMED not the big lever — small, real, now bounded.
4. R34 again: 3 of 4 comparable labels DISAGREE with measurement — func_80140D68 / func_8012A328 /
   func_801549F8 recorded "schedule" but measure ADDRESSING -> cse. The grinder was aimed wrong.

CONVERGENCE: T0.2 (8/8 failures PLUMBING, 0 walls) and T0.3b (315 integration) independently point at
the SAME lever — the declaration/integration reconcile ladder, worth the 224,410-ins FREE pool AND
~108,959 backlog gain-ins. Two keys eliminated today; untried: canon_sig_reconcile v3.2 and
reconcile_decls.py (the DATA-symbol analog — one T0.2 failure text was a DATA symbol).
2026-07-26 13:25:29 -06:00

4.3 KiB

Autopsy — the permuter's failures, classified

Generated by tools/autopsy.py report from .run/autopsy/residuals.jsonl (built by collect, which recompiles every open backlog draft through tools/match_one.py and classifies the FULL residual with tools/residual_class.py).

A verdict here is a candidate, never a bank: the whole-binary byte-gate remains the sole arbiter (G3/P9).

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 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 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 —
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)

One representative per signature diagnoses the whole cluster — that is what makes the LLM pass a batch autopsy rather than N per-function reads.

# signature fns reach-weighted example
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 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 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