mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-09-26 13:33:34 -04:00
chore(phase-30 S48): stage 0b closed — 91 banked (stub oracle 13,345 -> 13,254), R22 213/213 clean
This commit is contained in:
@@ -4,16 +4,16 @@
|
||||
# cross-binary collapsible-byte leverage: docs/duplicates.cross.md.
|
||||
|
||||
# THREE progress metrics (all matter — see the labels):
|
||||
FLEET fn-count byte-ident: 350027 / 363379 = 96.33% (REAL+LINKED+empties; FUNCTION-count, ×134-inflated — one crack counts per overlay)
|
||||
FLEET instr-weighted : 12769730 / 13523856 = 94.4% (shipped .text across main + resident + 211 overlays; the decomp.dev-DISPLAY number)
|
||||
FLEET distinct-code(uniq): 5167601 / 5851963 = 88.3% (80317/90928 unique fns; the DISTINCT-RE number)
|
||||
FLEET fn-count byte-ident: 350118 / 363379 = 96.35% (REAL+LINKED+empties; FUNCTION-count, ×134-inflated — one crack counts per overlay)
|
||||
FLEET instr-weighted : 12790228 / 13523856 = 94.6% (shipped .text across main + resident + 211 overlays; the decomp.dev-DISPLAY number)
|
||||
FLEET distinct-code(uniq): 5188099 / 5851963 = 88.7% (80408/90928 unique fns; the DISTINCT-RE number)
|
||||
MAIN game-code weighted : 436 / 79510 = 0.5% (INCLUDED in the fleet numbers above since 2026-07-22 — roadmap §1 metrics contract; LINKED-excluding Ghidra sig dated 2026-08-05; caveat is R34: no independent second oracle for a PS-X EXE, NOT drift)
|
||||
(fleet EXCLUDING main, for continuity with pre-2026-07-22 readings: 12769294 / 13444346 = 95.0%)
|
||||
(fleet EXCLUDING main, for continuity with pre-2026-07-22 readings: 12789792 / 13444346 = 95.1%)
|
||||
|
||||
FLEET REAL substantive : 347845 (of which dedup-shared 249221 via 1949 groups / 249295 instances)
|
||||
FLEET REAL substantive : 347936 (of which dedup-shared 249221 via 1949 groups / 249295 instances)
|
||||
FLEET LINKED PsyQ objs : 959
|
||||
FLEET NON_MATCHING : 7 (0 in any default build — G4)
|
||||
FLEET INCLUDE_ASM stubs : 13345
|
||||
FLEET INCLUDE_ASM stubs : 13254
|
||||
FLEET matchable : 363379
|
||||
|
||||
| binary | REAL | shared | LINKED | byte-ident | matchable | byte-ident % |
|
||||
@@ -90,7 +90,7 @@ FLEET matchable : 363379
|
||||
| md_SC05_029 | 19 | 0 | 0 | 23 | 31 | 74.2% |
|
||||
| md_SC07_003 | 17 | 0 | 0 | 17 | 100 | 17.0% |
|
||||
| md_SC07_004 | 42 | 0 | 0 | 42 | 315 | 13.3% |
|
||||
| ov_MAIN_012 | 2177 | 1658 | 0 | 2256 | 2403 | 93.9% |
|
||||
| ov_MAIN_012 | 2206 | 1658 | 0 | 2285 | 2403 | 95.1% |
|
||||
| ov_SC01_000 | 2390 | 1775 | 0 | 2390 | 2403 | 99.5% |
|
||||
| ov_SC01_001 | 2398 | 1776 | 0 | 2400 | 2466 | 97.3% |
|
||||
| ov_SC01_004 | 2396 | 1767 | 0 | 2397 | 2414 | 99.3% |
|
||||
@@ -116,7 +116,7 @@ FLEET matchable : 363379
|
||||
| ov_SC02_028 | 2566 | 1776 | 0 | 2576 | 2701 | 95.4% |
|
||||
| ov_SC02_031 | 2495 | 1772 | 0 | 2500 | 2562 | 97.6% |
|
||||
| ov_SC02_035 | 2492 | 1771 | 0 | 2495 | 2520 | 99.0% |
|
||||
| ov_SC02_037 | 2294 | 1658 | 0 | 2376 | 2516 | 94.4% |
|
||||
| ov_SC02_037 | 2325 | 1658 | 0 | 2407 | 2516 | 95.7% |
|
||||
| ov_SC02_039 | 2396 | 1771 | 0 | 2396 | 2416 | 99.2% |
|
||||
| ov_SC02_041 | 2477 | 1771 | 0 | 2480 | 2561 | 96.8% |
|
||||
| ov_SC03_001 | 2674 | 1772 | 0 | 2691 | 2869 | 93.8% |
|
||||
@@ -153,7 +153,7 @@ FLEET matchable : 363379
|
||||
| ov_SC03_103 | 2497 | 1773 | 0 | 2500 | 2510 | 99.6% |
|
||||
| ov_SC03_104 | 2545 | 1776 | 0 | 2552 | 2616 | 97.6% |
|
||||
| ov_SC03_105 | 2451 | 1772 | 0 | 2458 | 2597 | 94.6% |
|
||||
| ov_SC03_107 | 2219 | 1658 | 0 | 2302 | 2497 | 92.2% |
|
||||
| ov_SC03_107 | 2250 | 1658 | 0 | 2333 | 2497 | 93.4% |
|
||||
| ov_SC03_108 | 2401 | 1771 | 0 | 2401 | 2443 | 98.3% |
|
||||
| ov_SC03_109 | 2409 | 1771 | 0 | 2411 | 2424 | 99.5% |
|
||||
| ov_SC03_110 | 2442 | 1778 | 0 | 2442 | 2468 | 98.9% |
|
||||
|
||||
@@ -181,7 +181,85 @@ stub on a named wall/behemoth/queue ledger** — 140/140 byte-identical througho
|
||||
|
||||
---
|
||||
|
||||
# 🛑 SESSION S47 CHECKPOINT — FINAL (2026-08-11) — FRESH SESSION SAFE HERE
|
||||
# 🛑 SESSION S48 CHECKPOINT (2026-08-11) — STAGE 0b CLOSED — FRESH SESSION SAFE HERE
|
||||
> **Tree CLEAN** but for R23 `db.*.gbf` churn — never stage. **Nothing running.**
|
||||
> Gate at close: **`check-all` 213 passed / 0 failed of 213** from a CLEAN rebuild (R22:
|
||||
> `make clean && make extract-all && make check-all`; extract-all 212+main, 0 failed).
|
||||
> **Fleet: 94.6% instr · 88.7% distinct · 96.35% fn-count · INCLUDE_ASM stubs 13,254.**
|
||||
> `tools-health`: Drew watched it pass at the end of S47 — not re-run (his call).
|
||||
> **NO phase close** — T5 unopened, needs Drew's gate-2.
|
||||
|
||||
## THE SESSION IN ONE LINE
|
||||
**91 instances banked — the STUB-ORACLE DELTA (13,345 → 13,254)** — and this time the accumulated
|
||||
sum (65 + 25 + 1) agrees with it. **Stage 0b is DONE**: the 122 blocked jr member-slots were 112
|
||||
still-open, of which **91 banked (81%)**; the residue is 15 gate-fail + 6 carve-fail, ledgered below.
|
||||
Every bank came from repairing THREE instruments — no function was decompiled this session.
|
||||
|
||||
## ▶ RESUME HERE — STAGE 1 (0b is closed; 0a's leftovers unchanged)
|
||||
1. **STAGE 1 — the reach-ordered sibling campaign** (the 15-step loop above, §160g/§161).
|
||||
**REGEN FIRST** (`make sig-overlays && make sig-modules && tools/family_hseq.py`) — 91 fresh
|
||||
banks make the current map stale. Tiers ×9 → ×3, then PROBE ×2 with 10 families before
|
||||
committing 870 cracks at a 2× payoff. Wave one's ×10+ tier is consumed.
|
||||
⚠️ This is the first BIG agent spend since S47 (~150-250M tok over 6-10 sessions) — prompt Drew
|
||||
for the Ultracode/effort transition BEFORE launching a wave (R26/R27).
|
||||
2. 0a leftovers (unchanged, bounded, run alongside a campaign): 56 members of the reach-57 family
|
||||
(per-member rodata + typedef gather) · 116 data-bundled files.
|
||||
3. 0c stays BLOCKED (main-partition probe cannot account for 954 of 2,002 rows — fix the probe).
|
||||
0d (permuter, kill rule <2/20) is free CPU whenever the machine is idle.
|
||||
|
||||
## ✅ WHAT S48 LANDED — three instrument repairs, 91 banks, 0 decompilation
|
||||
**1. `JTBL_PADS` did not follow its span through jr isolation** (`commit:1578`) — THE 0b blocker,
|
||||
and it fails TWO ways: the bare-isolate path leaves the stale line on the residual object
|
||||
(`consumed 0 rodata .align(s) but 4 pad spec(s) given` — S47's hard error), while the
|
||||
`jtbl_family_bank` path re-runs `jtbl_carve`, whose `set_pads_vars` regenerates the block keyed by
|
||||
the CURRENT subseg names, finds no prior spec under the new `_jr_<addr>` name, and **silently drops
|
||||
it** — cc1's `.align 3` then pads the span's non-8-aligned interior tables and the image shifts,
|
||||
reported only as `built, bytes differ`. Fix: `jr_isolate_all` repoints the pads target with the
|
||||
`--order` leaf (refusing loud if the old object still hosts a `.rodata` piece), + a second,
|
||||
DISAGREEING oracle in `jtbl_carve.set_pads_vars` that refuses when a spec would vanish for a subseg
|
||||
no longer in the carve set (R34). R37 probe: `func_801789AC` → ov_SC02_037 went
|
||||
`built, bytes differ` → **BANKED**.
|
||||
**2. A def item can OPEN inside a block comment** (`commit:1606`) — item boundaries are
|
||||
`;`-terminated, so a decl whose TRAILING comment wraps hands the continuation to the next item;
|
||||
`_proto_from_lines` starts `_strip` with `in_block=False` and renders comment prose as the return
|
||||
type: `extern * a prototyped (s32) decl is … */ void func_80151664(void);`. It COMPILED (the
|
||||
hoist emits the opening `/*` right above, so the garbage lands back inside a comment) — but
|
||||
`_file_scope_decls` meets a col-0 `extern …;` it cannot type and refuses (R32, correctly).
|
||||
**That was the whole isolate-fail class: 23 slots.** Applied `family_remap`'s D1 backstop (a `*/`
|
||||
with no `/*` before it ⇒ the chunk opened inside a comment) and repaired the 16 already-polluted
|
||||
region files; all 3 binaries re-gate BYTE-IDENTICAL.
|
||||
**3. `_carry_typedefs`' already-carried test was line-oriented** (`commit:1607`) — it required the
|
||||
name on the same line as the keyword, which `typedef struct Foo { … } Foo;` never satisfies, so the
|
||||
preamble's own multi-line typedefs were carried TWICE (`redefinition of struct Foo_8013C0F8`).
|
||||
One parser (`_typedef_blocks`) now serves both callers (R33).
|
||||
|
||||
## 📌 THE 0b RESIDUE — 21 slots, named (not a wall, not free)
|
||||
- **15 `gate-fail`, all `built, bytes differ`** (5 families ×3: `func_8013C414`, `func_8013B83C`,
|
||||
`func_8013BD74`, `func_801588CC`, + 1). GENUINE DIFF — these are Stage-1/3 drafting work, not
|
||||
plumbing. Do NOT re-sweep them blind (A10: stored MATCH drafts re-gate at ~0%).
|
||||
- **6 `carve-fail`** (`func_8015AE2C` 2, `func_8015444C`/`func_80154C24` partial):
|
||||
`jtbl_carve: span 0x…: table starts […] do not fit the span (first must equal the span start)`.
|
||||
The auto-isolate retry does not clear it. **Unopened mechanism** — one probe would price it.
|
||||
- The 3 monolithic binaries (`ov_SC02_037`/`ov_SC03_107`/`ov_MAIN_012`) are no longer monolithic:
|
||||
they now carry ~30 `_jr_` regions each. Future isolates there are cheap.
|
||||
|
||||
## 🧰 MY ERROR LEDGER (2)
|
||||
1. **I diagnosed 0b from the S47 log before probing** — predicted the pads *rename* was the whole
|
||||
story. The first probe (`func_8013C0F8`) hit a DIFFERENT defect (duplicate typedefs) and the
|
||||
second exposed the silent-drop face I had not predicted. The fix was right, the reasoning path
|
||||
was backwards: **probe first, then explain** (R37 exists for this).
|
||||
2. **Called the duplicate-typedef body a one-family outlier** on a tag-count scan; the empirical
|
||||
before/after diff then found a SECOND family (`func_8013B83C`) whose block-scope multi-line
|
||||
typedef the old test also missed. The scan was too weak to support the word "only".
|
||||
|
||||
## 🔁 METHOD NOTE WORTH KEEPING
|
||||
**A silent instrument failure and a loud one have the same root but opposite economics.** Both 0b
|
||||
faces came from ONE missing rule ("the pads spec belongs to the span, not the name"); the loud face
|
||||
cost S47 a diagnosis, the silent face would have cost a whole wave read as `genuine DIFF`. Every
|
||||
repair this session therefore shipped its own refusal, not just its fix. The S47 rule candidate
|
||||
(*a guard must state its COVERAGE, not just its verdict*) earned a third exemplar — adopt at T5.
|
||||
|
||||
# 🛑 (superseded by S48) SESSION S47 CHECKPOINT — FINAL (2026-08-11)
|
||||
> **Tree CLEAN** but for R23 `db.*.gbf` churn — never stage. **Nothing running.** 35 commits.
|
||||
> Gates at close: **`check-all` 213 passed / 0 failed of 213** (R22 run after EVERY batch, ~12×).
|
||||
> **Fleet: 94.4% instr · 88.3% distinct · 96.33% fn-count · INCLUDE_ASM stubs 13,345.**
|
||||
@@ -201,9 +279,9 @@ The adopted plan is above ("THE ADOPTED ENDGAME PLAN"), with the 15-step reach-o
|
||||
**Stage 0a is DONE ENOUGH — stop grinding it.** Its two compounding defects are fixed; what is left
|
||||
(typedef gather, per-member rodata) is BOUNDED (56 known members + 116 data-bundled files) and can
|
||||
run alongside a campaign instead of blocking it.
|
||||
1. **0b — JTBL_PADS repointing.** 122 jr member-slots at a measured ~100% conversion. Strongest
|
||||
remaining deterministic item, and a clean first task for a fresh session. **Gate-probe ONE
|
||||
binary before believing the 122 (R37).**
|
||||
1. ~~**0b — JTBL_PADS repointing.**~~ ✅ **DONE (S48)** — 112 of the 122 slots were still open;
|
||||
**91 banked (81%)**, not the predicted ~100%. Three instrument repairs, no decompilation.
|
||||
Residue 21 (15 genuine-DIFF gate-fail + 6 carve-fail), ledgered in the S48 checkpoint.
|
||||
2. **STAGE 1 — the reach-ordered sibling campaign.** Tiers: ×9 → ×8 → … → ×3, then PROBE ×2 with
|
||||
10 families before committing 870 cracks at a 2× payoff. Wave one's ×10+ tier is consumed.
|
||||
3. 0c stays BLOCKED (my main-partition probe could not account for 954 of 2,002 rows — fix the
|
||||
|
||||
Reference in New Issue
Block a user