Files
BFM-decomp/docs/progress.fleet.md
T
Drew T 82d79e7a32 fix(phase-26a): A6/A7 — the family engine could not see half its corpus; 17 fns banked x134 free
R22: check-all 136 PASSED / 0 FAILED. dedup-check 1823 validated / 0 failed (C1 coverage 224,933/224,933).
Fleet instr-weighted 66.5% -> 66.7%.

=== dedup_propagate: it was blind to HALF the corpus ===
overlay_files() used a hardcoded suffix allowlist ("_a","_o0","_o0b","_after") that predated the
Phase-26 jr carves -> 404 of the fleet's 811 overlay .c. The 407-file gap held 36,135 INCLUDE_ASM stubs
and ~32,000 inline defs, and overlay_files gates ALL of dedup_propagate (source_text / find_site /
apply_plan / struct_check / reconcile_caller_extern). Now a GLOB — never an allowlist, because the NEXT
split family would re-open it. The asm_subdir is always the file stem, an invariant the old four entries
already satisfied.

find_site's def-detector required the signature line to END in ')' and the next non-blank line to START
with '{'. It therefore silently dropped THREE shapes: K&R definitions (`s32 f(arg0)` / `s32 arg0;` / `{`),
multi-line signatures, and single-line bodies. K&R is the project's house style for exactly the biggest,
highest-reach functions — func_8015AE2C (562 ins), func_80166994, func_80133CD4, func_8015A3C8 — and they
live in the _jr_* files overlay_files could not even open. Fixing either alone would have been useless:
the glob exposes the files, and find_site would still drop their biggest prizes. Both fixed together.
  * The signature's closing paren is now found by a real paren-walk, not line.count() or split(')')[-1]:
    a single-line body containing a call (`void f(int a){ g(a); }`) has balanced parens of its own, so
    both shortcuts land on the WRONG paren and then misread the body's ';' as a prototype terminator.
  * AGREEMENT ASSERTION (the audit's): find_site vs family_remap.extract_unit -> 701 agree / 0 disagree.
    Negative controls hold (a prototype+call is rejected; a 1-line body with a call is a def).

=== THE HARVEST (free work, byte-gated) ===
--auto-from ov_SC01_077 now nominates what it could never see: 20 planned, 17 propagated x134, 3 dropped
as cross-overlay stragglers. 134 overlays rebuilt BYTE-IDENTICAL; 17 new dedup groups.
Includes ALL FOUR functions A1 caught the registry lying about (func_80128ED8 / 8012C098 / 8012C0EC /
8012C750): 0 stubs remaining, real shared macros. THE LOOP CLOSES — A1 found the lie, and THIS is the
bug that had made it true (3 of the 4 are defined in ov_SC01_077_jr_8012ACE0.c, which the allowlist could
not open, so the propagation never ran and dedup_integrate greenlit the result).

=== family_remap: 96 PHANTOM exemplars -> 0 ===
extract_unit globbed only src/<ov>/<ov>*.c, so a function matched via a SHARED body had no source form
and read as NOT MATCHED. 93-96 of 218 h_seq "matched" exemplars were phantom, carrying 2,157 candidate
members of which 1,834 are still-stubbed, PURE/IMM-clean, symbol_map-clean and unpinned — staged and
gated today, dropped before the first build then. It is now TOTAL over BOTH shared-body mechanisms:
  (1) the DEFINE_func_<ADDR>() macro — reconstructed as the exact INVERSE of dedup_propagate.make_macro
      (derived from the generator, not re-guessed from the text);
  (2) a DIRECT definition in a shared header, #included per overlay — the whale (func_80144B9C, 770 ins,
      -O0), which the registry explicitly records as "NOT a DEFINE_ macro".
  CENSUS: 216 matched exemplars, 216 real, 0 PHANTOM.

symbol_map named the symbol by HOW IT WAS LOADED, not by WHAT IT IS: reloc_targets labels every lui/%lo
pair "data", and a FUNCTION's address taken via lui/%lo (an address-taken callback) is exactly that shape
(splat's own .s: %lo(func_8017E1D4), 7 occurrences). The map got a D_<ADDR> key while the C writes
func_<ADDR>, so the word-bounded substitution matched NOTHING and silently no-op'd — the sibling kept the
EXEMPLAR's function pointer and the loss was booked as a BYTE failure, indistinguishable from a compiler
wall. Now emits both keys (addresses are unique; the pass is simultaneous, so the extra key is free).

gather_externs was line-oriented, so a WRAPPED comma extern was invisible in both directions (the first
line has no ';', the continuation has no `extern`). ov_SC01_077.c:271-272 declares NINE symbols that way,
and the exemplar referencing them (func_8013D178) is a 133-member family — every sibling was staged with
NO declaration, failed to compile, and bisect-stormed its whole gate group. Now statement-oriented, and
an unresolved symbol is REPORTED, never silently dropped.

=== family_sweep.stub_map / build_engine_types ===
stub_map: func_-only -> a curated-name stub read as "already matched" -> phantom exemplar. Now corpus-derived.
build_engine_types hard-exited on 1,070 of 1,470 type-bearing overlay .c (73%; the audit measured 573/709
= 81% on its narrower set) because 1,929 TAGGED-struct typedefs tripped a guard whose own comment asserts
"our source has only ANONYMOUS-struct typedefs" — true in Phase 20, false since the harvest agents started
writing tagged structs. inject_capped_externs routes every type-bearing body HERE as the type-heavy tail's
ONLY sanctioned unblocker, so the tail's unblocker could not run on the corpus the tail lives in.
A contained def (the typedef's span encloses the body) is liftable — it just must not be counted twice;
only a PARTIAL overlap is malformed. Verified on a file that used to hard-exit: 5 tagged typedefs folded +
forward-declared, 46 types written, exit 0.

  ** AND THE SHARPEST LESSON IN THE AUDIT: this one was never silent. It printed "[overlap] ... handle
     manually" every single time. But the message reads like a rare edge case rather than a four-fifths
     coverage failure, so nobody ever COUNTED it. A loud failure that nobody counts is exactly as
     invisible as a silent one. R32 must be "assert your coverage", not merely "fail loud". **

R14 self-catches, recorded because I hit both while fixing them: my first shared-header scan read a macro
body's `extern void f(void); \` as a DEFINITION (the trailing continuation means the line does not end in
';', so the decl guard never fired) — the exact bug fixed at commit:0552, reintroduced by me and caught only
because the whale resolved from the WRONG file. Column-0 anchoring fixes it by construction. And my
phantom census returned 0/0 twice because I guessed the manifest schema instead of reading it.
2026-07-14 10:34:06 -06:00

8.6 KiB
Raw Blame History

BFM FLEET matching progress (generated by tools/progress.py --fleet — authoritative)

136 binaries: main + resident + 134 location overlays. DETERMINISTIC,

source-derived (committed src/*.c + config/dedup.us.yaml). Live byte gate: make check-all;

cross-binary collapsible-byte leverage: docs/duplicates.cross.md.

THREE progress metrics (all matter — see the labels):

FLEET fn-count byte-ident: 284526 / 343677 = 82.79% (REAL+LINKED+empties; FUNCTION-count, ×134-inflated — one crack counts per overlay) FLEET instr-weighted : 8470381 / 12707182 = 66.7% (shipped .text across resident+134 overlays; the decomp.dev-DISPLAY number) FLEET distinct-code(uniq): 2530389 / 5410077 = 46.8% (51830/84996 unique fns; the DISTINCT-RE number; main EXE not sig'd)

FLEET REAL substantive : 282998 (of which dedup-shared 224889 via 1823 groups / 224933 instances) FLEET LINKED PsyQ objs : 959 FLEET NON_MATCHING : 7 (0 in any default build — G4) FLEET INCLUDE_ASM stubs : 59144 FLEET matchable : 343677

binary REAL shared LINKED byte-ident matchable byte-ident %
main 54 2 959 1055 2096 50.3%
resident 123 0 0 125 146 85.6%
ov_SC01_000 2085 1681 0 2085 2403 86.8%
ov_SC01_001 2089 1681 0 2091 2466 84.8%
ov_SC01_004 2081 1672 0 2082 2414 86.2%
ov_SC01_005 2107 1694 0 2107 2503 84.2%
ov_SC01_006 2107 1694 0 2107 2503 84.2%
ov_SC01_008 2080 1672 0 2082 2426 85.8%
ov_SC01_009 2101 1673 0 2102 2507 83.8%
ov_SC01_074 2085 1673 0 2087 2425 86.1%
ov_SC01_077 2320 1641 0 2322 2585 89.8%
ov_SC01_080 2117 1676 0 2117 2512 84.3%
ov_SC01_084 2124 1676 0 2129 2579 82.6%
ov_SC02_000 2170 1711 0 2170 2683 80.9%
ov_SC02_003 2170 1711 0 2170 2683 80.9%
ov_SC02_004 2086 1676 0 2086 2401 86.9%
ov_SC02_005 2187 1672 0 2197 2927 75.1%
ov_SC02_011 2192 1679 0 2203 2893 76.1%
ov_SC02_015 2091 1678 0 2091 2414 86.6%
ov_SC02_016 2116 1678 0 2119 2545 83.3%
ov_SC02_017 2159 1678 0 2167 2732 79.3%
ov_SC02_021 2097 1678 0 2097 2437 86.0%
ov_SC02_026 2106 1676 0 2112 2572 82.1%
ov_SC02_027 2131 1676 0 2140 2692 79.5%
ov_SC02_028 2132 1676 0 2142 2701 79.3%
ov_SC02_031 2120 1677 0 2125 2562 82.9%
ov_SC02_035 2097 1676 0 2100 2520 83.3%
ov_SC02_039 2081 1676 0 2081 2416 86.1%
ov_SC02_041 2108 1676 0 2111 2561 82.4%
ov_SC03_001 2213 1677 0 2230 2869 77.7%
ov_SC03_002 2143 1681 0 2158 2631 82.0%
ov_SC03_003 2086 1676 0 2087 2423 86.1%
ov_SC03_006 2153 1682 0 2162 2767 78.1%
ov_SC03_007 2133 1676 0 2137 2623 81.5%
ov_SC03_010 2096 1676 0 2096 2470 84.9%
ov_SC03_011 2100 1676 0 2106 2527 83.3%
ov_SC03_012 2080 1676 0 2081 2406 86.5%
ov_SC03_013 2097 1676 0 2097 2492 84.1%
ov_SC03_014 2145 1701 0 2145 2685 79.9%
ov_SC03_015 2148 1701 0 2148 2685 80.0%
ov_SC03_023 2086 1676 0 2087 2435 85.7%
ov_SC03_024 2140 1681 0 2147 2641 81.3%
ov_SC03_028 2123 1676 0 2127 2664 79.8%
ov_SC03_029 2124 1678 0 2134 2644 80.7%
ov_SC03_030 2102 1681 0 2104 2495 84.3%
ov_SC03_031 2097 1676 0 2100 2514 83.5%
ov_SC03_089 2114 1676 0 2121 2581 82.2%
ov_SC03_090 2116 1676 0 2124 2625 80.9%
ov_SC03_091 2117 1676 0 2125 2640 80.5%
ov_SC03_092 2123 1676 0 2135 2587 82.5%
ov_SC03_093 2104 1676 0 2108 2563 82.2%
ov_SC03_094 2099 1676 0 2105 2577 81.7%
ov_SC03_095 2090 1676 0 2093 2474 84.6%
ov_SC03_096 2090 1676 0 2093 2465 84.9%
ov_SC03_097 2113 1676 0 2120 2603 81.4%
ov_SC03_098 2097 1676 0 2100 2541 82.6%
ov_SC03_099 2091 1676 0 2094 2504 83.6%
ov_SC03_100 2098 1676 0 2102 2539 82.8%
ov_SC03_101 2099 1676 0 2103 2528 83.2%
ov_SC03_102 2094 1676 0 2097 2492 84.1%
ov_SC03_103 2097 1678 0 2100 2510 83.7%
ov_SC03_104 2117 1676 0 2124 2616 81.2%
ov_SC03_105 2111 1676 0 2118 2597 81.6%
ov_SC03_108 2083 1676 0 2083 2443 85.3%
ov_SC03_109 2084 1676 0 2086 2424 86.1%
ov_SC03_110 2089 1676 0 2089 2468 84.6%
ov_SC03_111 2097 1676 0 2100 2510 83.7%
ov_SC03_112 2095 1678 0 2097 2526 83.0%
ov_SC03_113 2089 1678 0 2092 2468 84.8%
ov_SC03_114 2079 1676 0 2081 2415 86.2%
ov_SC03_115 2093 1676 0 2095 2472 84.7%
ov_SC03_116 2087 1676 0 2090 2438 85.7%
ov_SC03_117 2105 1676 0 2111 2557 82.6%
ov_SC03_118 2148 1700 0 2149 2685 80.0%
ov_SC03_119 2145 1700 0 2146 2685 79.9%
ov_SC03_121 2090 1676 0 2093 2459 85.1%
ov_SC03_124 2162 1672 0 2182 2741 79.6%
ov_SC03_125 2125 1676 0 2137 2588 82.6%
ov_SC03_126 2087 1678 0 2087 2423 86.1%
ov_SC04_000 2104 1680 0 2113 2546 83.0%
ov_SC04_002 2118 1676 0 2122 2636 80.5%
ov_SC04_003 2096 1676 0 2100 2502 83.9%
ov_SC04_004 2110 1676 0 2112 2558 82.6%
ov_SC04_005 2111 1676 0 2117 2612 81.0%
ov_SC04_006 2087 1676 0 2089 2454 85.1%
ov_SC04_007 2106 1676 0 2110 2569 82.1%
ov_SC04_008 2082 1676 0 2082 2415 86.2%
ov_SC04_009 2091 1676 0 2094 2441 85.8%
ov_SC04_010 2087 1676 0 2088 2419 86.3%
ov_SC04_011 2137 1676 0 2143 2803 76.5%
ov_SC04_012 2085 1676 0 2086 2420 86.2%
ov_SC04_015 2145 1677 0 2156 2611 82.6%
ov_SC04_016 2084 1676 0 2086 2440 85.5%
ov_SC04_018 2191 1711 0 2191 2857 76.7%
ov_SC04_019 2197 1711 0 2197 2857 76.9%
ov_SC04_020 2114 1676 0 2126 2567 82.8%
ov_SC04_021 2086 1678 0 2086 2423 86.1%
ov_SC05_000 2090 1680 0 2093 2422 86.4%
ov_SC05_001 2106 1676 0 2111 2574 82.0%
ov_SC05_002 2089 1676 0 2092 2442 85.7%
ov_SC05_003 2089 1676 0 2090 2481 84.2%
ov_SC05_004 2086 1676 0 2088 2464 84.7%
ov_SC05_005 2091 1676 0 2092 2491 84.0%
ov_SC05_006 2085 1676 0 2085 2430 85.8%
ov_SC05_007 2092 1676 0 2097 2482 84.5%
ov_SC05_008 2111 1676 0 2113 2543 83.1%
ov_SC05_009 2086 1676 0 2090 2438 85.7%
ov_SC05_010 2111 1676 0 2115 2588 81.7%
ov_SC05_011 2088 1676 0 2089 2409 86.7%
ov_SC05_017 2187 1673 0 2198 2842 77.3%
ov_SC05_018 2137 1676 0 2150 2673 80.4%
ov_SC05_019 2086 1678 0 2086 2423 86.1%
ov_SC06_000 2146 1685 0 2149 2691 79.9%
ov_SC06_006 2095 1676 0 2096 2511 83.5%
ov_SC06_008 2111 1678 0 2117 2542 83.3%
ov_SC06_010 2097 1676 0 2102 2517 83.5%
ov_SC06_011 2095 1676 0 2099 2468 85.0%
ov_SC06_013 2088 1676 0 2089 2425 86.1%
ov_SC06_014 2092 1676 0 2094 2453 85.4%
ov_SC06_015 2089 1676 0 2089 2421 86.3%
ov_SC06_016 2107 1676 0 2109 2549 82.7%
ov_SC06_018 2105 1679 0 2112 2665 79.2%
ov_SC06_020 2095 1678 0 2096 2518 83.2%
ov_SC06_022 2111 1676 0 2119 2642 80.2%
ov_SC06_024 2117 1676 0 2123 2667 79.6%
ov_SC06_025 2104 1676 0 2109 2572 82.0%
ov_SC06_027 2079 1676 0 2080 2408 86.4%
ov_SC06_029 2132 1676 0 2144 2662 80.5%
ov_SC06_030 2090 1676 0 2090 2456 85.1%
ov_SC06_032 2101 1677 0 2108 2658 79.3%
ov_SC06_033 2105 1677 0 2112 2631 80.3%
ov_SC07_000 2104 1680 0 2106 2521 83.5%
ov_SC07_001 2091 1676 0 2093 2454 85.3%
ov_SC07_002 2108 1676 0 2112 2579 81.9%
ov_SC07_008 2075 1676 0 2075 2386 87.0%
ov_SC07_009 2086 1676 0 2088 2430 85.9%