Files
BFM-decomp/docs/calibration.md
T
Drew T 7b5eda0424 feat(phase-30 S39/S4): re-gate probe — A10 broadly stands; 4 banked from the reverted overlays (+146 ins)
Tested whether decision-log A10 ("stored drafts re-gate at 0/958", measured in T1) survives
S38's tool repairs. Three populations, plain re-gate, no draft edits:

  fresh wave-6 drafts (diagnosed "blocked on a class")   4/6
  stored pool, unbiased sample (every 96th of 1,155)     1/12   <- hit was in a REVERTED overlay
  the two REVERTED overlays, targeted                    3/17

A10 BROADLY STANDS. ~8% on the general stored pool is not a harvest, and a 1,155-wide sweep
(= 1,155 whole-binary builds) is not justified by it. Do NOT generalise the fresh-draft rate
(4/6) onto the stored pool -- different populations. The honest rule is narrower and cheaper:

  after a tool repair, re-gate the drafts THAT DEFECT plausibly touched, targeted by its
  blast radius -- not the whole ledger. (R35 applied to the backlog, not just to metrics.)

BANKED (+146 ins): ov_SC06_030 func_80161208 + func_80162CCC; ov_SC07_010 func_801506A4 +
func_8016F0AC. R22 clean-fleet 140 passed, 0 failed of 140 -- which also proves byte-neutral a
fleet-shared engine_core.h edit the bank required (extern s32 func_801506A4(s32,s32) -> the
no-prototype form), reaching all 138 overlays (T2 blast radius).

Fleet 12410129 -> 12410275 instr; distinct +95 / +1 uniq; fn-count +4. audit-digest OK.

Also documents the LEDGER MECHANICS in calibration.md (Drew asked): .run/backlog.jsonl is
append-only and nothing is deleted on bank -- open-ness is DERIVED from corpus.stubs at every
read (load_best drops now-banked rows per-binary, P9) and `make report` runs `backlog.py prune`.
Membership is therefore self-maintaining and currently clean: 863 rows, 0 already-banked, 14
duplicate-addr (was 6,867 rows / 98% banked before Phase-29 compaction). What pruning does NOT
re-validate is the VERDICT on surviving rows -- closeness + residual class are as old as the
tooling that wrote them (Phase 28 found a corrupt one: func_80178004 close=0 -> 91). That is
the staleness that matters, and it is exactly what this probe measured.
2026-08-04 22:42:54 -06:00

245 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Endgame calibration — measured rates for P28/P29 sizing (Phase-27 T9)
> The roadmap (§6 risk register) makes the **member-adapt close-rate** THE swing number and holds
> P28/P29 yield projections until it's measured. This records what Phase-27 could measure directly and
> names honestly the one number that needs P28's `member_adapt` tool to pin down. All rates are
> byte-gate-grounded (G3/P9) — a "match" here means the whole-binary gate accepted it.
## Velocity (the flip-timing checkpoint input)
| | value | note |
|---|---|---|
| instr-weighted, Phase-26 close | 68.9% | committed baseline |
| instr-weighted, Phase-27 close | **67.0%** | a re-baselining DOWN, not a regression |
| game-code matches banked this phase | **~0** | Phase 27 was an INFRASTRUCTURE + FINDINGS phase |
The headline **dropped** because T7's disc-completeness audit added 4 SC07 overlays (~2.45 MB of mostly-
unmatched code) to the denominator — the prior 68.9% was measured over an incomplete disc. Raw match
velocity this phase was ~0 (no harvest ran), but the phase's product is leverage on FUTURE velocity: the
tool fixes (T2/T4/T6) and the pin-crash-wall dissolution (T5) unblock work the prior tooling hid. **For
the flip decision: do not read Phase-27 as ~0 progress/session — it is a denominator correction plus a
set of unblocking findings; the next harvest phase (P29) is where velocity resumes and should be
re-measured there.**
## The templatability swing (the number that decides P28/P29 yield)
> ### ⚠️ CORRECTED 2026-07-15 (Phase-28 T1) — the ≈0% row below was measuring a MISSING BUILD STEP.
>
> The Phase-27 row said `h_seq family ≈ 0%`, on the strength of `0x8017BEBC` banking **0 of 8**, and that
> number rewrote the endgame ("P29's arithmetic is (cores cracked) × (reach), NOT (families) × 120",
> `PhaseEnd_Phase27` Roadmap delta). **It is refuted.** The same family, same era, through the carve path
> its own exemplar required: **8 of 8 BANKED** (4 same-address + 4 cross-address; `make clean` +
> extract-all + `check-all` → **140/140 byte-identical**).
>
> **Root cause — the probe used a tool with no carve step.** `0x8017BEBC` is a **jr/switch** core. §47
> banked its exemplar as *"lazy isolation → carve (9-piece interleave) → splice → BYTE-IDENTICAL"* and
> stated the fix is *"×N template-safe"*. `family_sweep.hseq_sweep` stages C and gates — it has **no
> carve step**, so gcc's generated jump table is never placed at the sibling's address. The entire
> residual I byte-verified is **two words**: `lui $at,%hi(jtbl_801EC44C)` / `lw $v0,%lo(jtbl_801EC44C)($at)`
> (`classify_member` → **PURE, ndiff=2**, positions 343/345). `config/overlays.mk:112` carves
> `ov_SC01_000_jr_8017BEBC.o` for the exemplar; `:134` has no such entry for the member. The 0/8 measured
> the omitted carve, not the family. **`tools/jtbl_family_bank.py` exists to do exactly this per sibling
> and had never been run on this family.**
>
> **Compounding:** the family is one of only **3 of 163** with `has_mid_jr` — i.e. the roadmap generalized
> from n=1, on the least representative family in the population, using the wrong tool for its class. And
> the three Phase-26 exhaustion probes it corroborated (tiny-IMM 0/241, PURE 0/134, pinned 0/133) all
> **predate** `_carry_macros` (Phase-27 T5, `commit:0637`) — Phase 27's decision-log itself calls its re-probe
> "a **fourth** phantom exhaustion proof" while never re-running the first three. **R35: a 0% from a broken
> tool and a 0% from a working one are the same number and opposite facts.**
Propagation regimes, byte-measured (the whole-binary gate is the only entry here — G3/P9):
| regime | rate | evidence |
|---|---|---|
| **h_exact reach-N core** (byte-identical across N overlays) | **≈ ×N, near-100%** | §52 (Phase 26): 5 cracked cores → **670 banked instances** = ×134 each, mechanical |
| **h_seq family, jr/switch core, WITH the per-sibling carve** | **8/8 on a bounded probe** (n=1 family) | `0x8017BEBC` via `jtbl_family_bank.py --raw` (P28 T1): 4 same-addr + 4 cross-addr (`to_addr`), 140/140 clean-fleet |
| **h_seq family, jr/switch core, WITHOUT the carve** | 0/8 — **an artifact, not a rate** | the P27 T5 probe (`family_sweep`, no carve step). Do not cite this as templatability evidence. |
| **h_seq family, non-jr (PURE / IMM / MIXED)** | **UNMEASURED** | the three Phase-26 probes are pre-`_carry_macros` and were never re-run → P28 T3 |
**The honest state of the swing number.** The ≈0% doctrine has **no surviving post-fix evidence**. What
T1 establishes is narrow and real: a jr/switch family templates at 8/8 *when the carve its exemplar
required is actually performed*. What it does **not** establish is a general rate — n=1, and jr is by
construction the rarest class (3/163 families). **The general rate is exactly what P28 T3 measures**, over
the population that actually exists (from the T0-fixed map): **1,418 matched-exemplar families / 21,889
unmatched members** — PURE 17,024 (78%) · IMM 4,473 (20%) · **STRUCT 392 (1.8%)**.
**Note the roadmap's swing number is aimed at the wrong class.** It sizes P28/P29 on the *register-drift*
(STRUCT) close-rate — **1.8%** of the input. The mass is PURE+IMM (98%).
**The addressable pool (T0, from the fixed map).** 937,248 ins = **21.7% of all remaining weight** =
**7.16pp of fleet instr if it all banked**, all behind an already-matched exemplar:
| stratum | families | members | ins |
|---|---:|---:|---:|
| **SC07-only** (unmatched ONLY in the 4 P27 overlays; exemplar already byte-proven) | 1,255 | 6,268 | 230,612 |
| legacy PURE non-jr | 95 | 7,993 | 478,379 |
| legacy IMM (incl. `0x8017BEBC`: 115 members × 952 ins ≈ 109,480) | 36 | 6,644 | 212,707 |
| legacy MIXED | 30 | 968 | 10,462 |
| legacy PURE w/ jr | 2 | 16 | 5,088 |
This is a **prediction** (h_seq predicts; the gate decides). T3 gates it before P29 scales.
## The LEGACY h_seq rate — measured, CLASSIFIED (Phase-28 T3b, 2026-07-16)
The roadmap's actual swing number is the *legacy* h_seq rate (the SC07 pool T3-A measured turned out to
be h_exact + unwired, a different question). A bounded `family_sweep --hseq --chunk 1` over **6 legacy
PURE non-jr families** (smallest-nins first; `has_mid_jr` excluded per §53) gated:
| | count |
|---|---|
| **BANKED** (whole-binary) | **9** |
| **PLUMBING** (recoverable class) | 37 |
| **DIFF** (genuine gate byte-mismatch) | **274** |
| skipped (not-stub / pinned-exemplar) | 173 |
**~3% as-tooled (9 of 320 attempted).** *Unlike Phase 26, the failures are CLASSIFIED* — 274 genuine
gate-DIFF, not an unclassified 0%.
**But the DIFF is NOT structural variance, and this is the load-bearing nuance (R14/R35 on my own probe):**
the members are byte-level **PURE** (`classify_member` = PURE, reloc-only, 20/20 sampled), **genuine
h_seq** (all DIFF_BYTES vs the exemplar → `family_sweep` is the correct tool, not `dedup_extend`), and at
the **same vram**. A PURE family should template once its relocs are remapped. That 274 members do NOT
reproduce means the remapped exemplar body **fails to reproduce the member's bytes when recompiled** — i.e.
the residual is **recompilation divergence**, one of:
- **(a) an incomplete remap** — `symbol_map` not covering a symbol class these families use (the recurring
jtbl/prefix bug: B2's 0/8, T4's 12 DIFFs — *both* turned out to be tooling this phase); or
- **(b) genuine TU-context regalloc divergence** — the same C compiling to different bytes in different
overlay TUs (a real wall).
**These are the SAME two hypotheses B2 and the SC07 pool presented, and BOTH resolved to (a) tooling this
phase.** So the honest swing number is: **~3% as-tooled, ceiling UNKNOWN** — provisionally consistent with
"legacy h_seq largely doesn't mechanically template", but on a probe whose dominant failure mode is the
exact tooling-vs-wall ambiguity that keeps resolving to tooling. **P29 must run the disambiguating probe
before trusting 3%:** take one PURE DIFF member, diff its `family_sweep`-staged compiled bytes against the
target region-by-region — if the mismatch is at a reloc position, it's (a) incomplete remap (fixable); if
it's regalloc/schedule away from relocs, it's (b) a TU-context wall. Do NOT scale P29's "(cores)×(reach)"
arithmetic on 3% until that probe runs.
## The swing number RESOLVED — (a) TOOLING, an -O0 compile-flag artifact (Phase-29 Task 1, 2026-07-16)
The disambiguating probe RAN. **Verdict: the legacy-PURE-non-jr "~3%" is (a) TOOLING — dominated by an
`-O0` COMPILE-FLAG artifact — NOT a TU-context regalloc wall.** Built `tools/diff_regions.py` (the
deferred roadmap tool): remap the exemplar EXACTLY as `family_sweep --hseq` stages it, compile at the
EXEMPLAR's real optimization level (auto-detected from the Makefile -O0 rules), masked-diff vs the target,
classify each member (`O0-FLAG` / `TEMPLATES` / `PLUMBING-ISO` / `REGALLOC` / `NO-TARGET`).
**Root cause (byte-proven).** The two families supplying **~272 of the 274 DIFF** (`0x8013c964`,
`0x8013c938`) are **-O0 functions** — their exemplar lives in `ov_SC01_077_o0.c` (the Phase-19 -O0 cluster,
vram 0x8013B568..0x8013C98C, `21F0A003` frame-pointer prologue). `family_sweep --hseq` stages the remapped
draft into the member's CURRENT stub file, which compiles **-O2** (the Makefile -O0 rule covers ONLY
`ov_SC01_077_o0.o` / `boot.o` / the whale `_o0b` wildcard). An -O2 compile of an -O0 target can NEVER match
(a frameless ~4-ins leaf vs the 10-ins -O0 frame — `match_one`'s own `--o0` flag exists for exactly this).
Compiled at **-O0** the remapped C masked-MATCHes: `func_8013C964`@ov_SC01_000 → MATCH(10),
`func_8013C938` → MATCH(11); the -O2 compile the sweep used DIFFs(10/11).
**Distribution (106-member sample, 11 matched PURE-non-jr families, nins 2..133):**
`O0-FLAG 45 · NO-TARGET(already-banked) 29 · TEMPLATES(at exemplar opt) 17 · PLUMBING-ISO(type-lift) 15 ·
REGALLOC 0`. **ZERO genuine codegen walls.** Every failure mode is recoverable tooling: the -O0
compile-flag, already-banked, template-clean, or the §40a/§8d type-lift plumbing (a `match_one`-isolation
blind spot the real TU carries via `engine_types.h`; `family_sweep --no-preclassify` resolves it).
**Honest scope (§52b, R14/R35).** These are masked-MATCHes — a CANDIDATE, not a whole-binary bank. But the
fix is an INDEPENDENTLY byte-proven mechanism: the -O0 split (the whale banks ×134 via exactly this;
`ov_SC01_077_o0.c` banks byte-identical for THIS cluster in ov_SC01_077) + the §8d/§40a recovery (~20k
members banked so in Phase 25/26). **Whole-binary banking + the TRUE ceiling (larger families) are P29
Task 2a's gate — a prediction, gate-validated there.** Caveat carried: one cluster fn (`func_8013B7AC`,
%lo-fold) was called "overlay-local" in Phase 20 — Task 2a byte-gates EACH cluster member, never assumes
all 16 template.
**Consequence.** The "~3% as-tooled ceiling" is RETIRED (a tooling artifact — the THIRD "structural wall"
this endgame resolved to tooling, after B2 and SC07). P29's member track is NOT a low-ceiling per-member
grind; it is a **mechanical -O0 split rollout** (the deferred "-O0 ×134") + the type-lift sweep. The
~478k-ins legacy-PURE pool is back on the table. `member_adapt.py` (the (b)-wall delta engine) is NOT
needed for this pool. (Full run: `.run/probe29/`; tool: `tools/diff_regions.py`.)
## Cost / yield per tier (this session)
| tier | cost/fn | direct banks | durable yield |
|---|---|---|---|
| **Fable5** (discovery) | **~230k tok/fn** (238k/257k/270k/199k measured) | **0 / 5** | 3 oracle reclassifications + 2 cracked roots + **the pin-crash wall dissolved** + 4 new pin-free levers (cookbook §H) |
| cheap-Opus (apply idioms) | ~40–140k tok/fn (Phase-23/26 data) | the §52 wave: 5 cores | applies Fable5's idioms; the productive banking tier |
| permuter | CPU-only ($0) | regalloc/schedule drift | 7 all-time (all Phase-21); tail exhausted |
| local v3 | $0 | the ≤15-ins band | ~1,300 (Phase-23); off the hard tail |
**Fable5's ROI is NOT banks — it is idioms + wall-dissolutions** (the doctrine held perfectly this phase:
0 banks, but a propagation wall down and the codegen map extended). Budget Fable5 for *discovery*, then
harvest cheap-Opus against the distilled idioms. The perishable Fable5 window (~7/19) is spent on the
hard un-drafted cores + wall characterization, never on functions cheap-Opus can apply a known idiom to.
## The one number that needs P28 (honest gap)
**Member-adapt close-rate on REGISTER-DRIFT members** — the roadmap's headline swing — was NOT directly
measurable this phase: it needs P28's `member_adapt` tool (the exemplar→member delta engine) to try each
drift member and gate it. The bounding data: the refusal taxonomy's register-drift class is the *only*
adaptable one (§52 levers, ~⅓ pin-free crack rate per walled cluster), collision members filter out, and
pin-crash members are now UNBLOCKED (T5) rather than ×1-capped. **P28 opens by measuring this on a
byte-gated sample before P29 scales — exactly as the roadmap's risk register prescribes.**
## New lever this phase (not in the roadmap's projections)
The **pin-crash wall is dissolved** (T5 + `.run/giants/pin_crash_sigabrt.md`): the ~20 PINS-class stubs
in the manifest (and the 4 characterized pin families) were routed to the ×1 backlog as "cc1-crash /
intrinsic"; they now stage clean and are mechanically harvestable (byte-identity per sibling is the
gate's question, but the crash barrier is gone). This is un-projected P29 fuel — a whole reach-N class
the roadmap wrote off, back on the table.
---
## Stranded-draft integration recovery — measured 2026-07-24 (Phase 29 SESSION-16)
Population: the 36 stranded drafts of waves s14+s15 (`ov_SC07_006`, all reach-138), i.e. the drafts a
wave produced and the whole-binary gate rejected.
| question | measured |
|---|---|
| of the STRANDED residue, how many are byte-correct? | **24/36 MATCH, 11 near, 1 ERR (67%)** — the "~92%" is a whole-wave figure |
| blockers (they stack; cc1 shows only the first) | `self_decl_hdr` 21 · `callee_decl` 19 · `data_decl` 16 · `self_decl_tu` 5 · `local_type` 5 |
| per function, by MAX tier | T0 = 6 · T1 = 26 · not-an-integration-problem = 4 |
| yield of the EXISTING draft-side ladder | clears its own classes (callee 19→3, data 16→0) but converts **1/36** to compiling, which then DIFFs |
| yield of the per-overlay de-macroize (§65b) | 13/14 clean candidates rtu-MATCH; **14/14 attempted banks succeeded** |
| **total recovered** | **14 of 36 = 39%** (vs a pre-session projection of "all 22") |
| implied wave multiple | ~6/24 → ~20/24 = **~2.3×**, NOT the projected 3.7× |
| metric shape | distinct-code **+14 unique fns**; instr-weighted / fn-count ~flat (de-macroized banks are ×1) |
| R22 after each batch | **140/140**, three times — the T1 blast-radius claim holds |
Remaining, named (not silently dropped): 10 `match_one`-MATCH drafts still blocked by stacked classes
(3 `self_decl_tu` → `normalize_self_decls`; 3 `local_type`+`self_decl_hdr` → draft type uniquify then
de-macroize; 1 struct-tag redefinition; 1 callee-decl that rtu over-claimed; 2 with no static blocker
whose real cc1 error needs reading). 11 `near` drafts are NOT recovery fuel — they are unfinished
drafts and belong to the permuter/redraft track.
---
## Re-gating STORED drafts after a tool repair (P30 S39, measured)
**Question:** decision-log **A10** byte-proved the stored-draft backlog non-bankable by plain re-gate
(**0/958**, measured in T1). S38 then repaired several tools (the `jr_isolate_all`/`overlay_src_split`
alias-DEFINITION-deletion blindness, `harvest_verify._reload_corpus`). Does A10 still hold?
**Measured, three populations, all plain re-gate (`gate_stage --no-propagate`), no draft edits:**
| population | rate | note |
|---|---|---|
| **fresh wave-6 drafts** (S38-era, diagnosed "blocked on a class") | **4/6** | banked UNCHANGED — the class had already been freed by S38's own tool repairs |
| **stored pool, unbiased sample** (every 96th of 1,155 still-open) | **1/12** | the single hit was in `ov_SC06_030` — a REVERTED overlay |
| **the two REVERTED overlays' stored drafts** (targeted) | **3/17** | `ov_SC06_030` ×1, `ov_SC07_010` ×2 |
**Reading (P9, and the samples are small — treat as an order of magnitude, not a rate to plan on):**
A10 **broadly stands** for the general stored backlog: ~8% is not a harvest, and a 1,155-wide sweep
(1,155 whole-binary builds) is not justified by it. What IS real is that **a stored FAIL verdict is only
as current as the instrument that produced it** — drafts blocked by a defect that was later fixed bank
unchanged, and they concentrate where work was reverted or where a repair specifically applied.
**The rule (R35 applied to the backlog, not just to metrics):** after any tool repair, **re-gate the
drafts that defect plausibly touched** — targeted by the repair's blast radius, not the whole ledger.
Cheap, ~0 agent tokens, and it recovers work already paid for. Do NOT generalise a fresh-draft rate
(4/6) onto the stored pool (1/12); they are different populations.
**Ledger mechanics, for the record:** `.run/backlog.jsonl` is append-only; open-ness is re-derived from
`corpus.stubs` at every read (`load_best` drops now-banked rows per-binary, P9) and `make report` runs
`backlog.py prune`. So MEMBERSHIP is self-maintaining and currently clean (863 rows, 0 already-banked,
14 duplicate-addr; was 6,867 rows / 98% banked before Phase-29 compaction). What pruning does NOT
re-validate is the **verdict** on the rows it keeps — the `closeness` and residual class are as old as
the tooling that wrote them (Phase 28 found an outright corrupt one: `func_80178004` close=0 → 91).