mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-09-27 14:02:04 -04:00
82d79e7a32
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.
8.6 KiB
8.6 KiB
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% |