Files
BFM-decomp/config/splat.ov_SC01_077.yaml
T
Drew T c55ad64614 feat(phase-30 S48-T6): wave 6 — 24 exemplars banked; the gate-refusal ROOT CAUSE found
Wave 6 (wf_9729fd89-c16, 76 agents, 6.7M tok): 40 targets -> 35 agent-MATCH,
1 refuted, 0 UNVERIFIED (the new field works), 4 NEAR -> 24 BANKED.

*** THE FINDING OF THE CAMPAIGN, and it is not a compiler idiom ***
func_8017F2D4 had been "MATCH standalone / DIFF at gate" SEVEN times across
five waves. Every attempt hunted codegen. The body was byte-correct the whole
time. The fault was that the prior notes named the WRONG DESTINATION TU:
..._jr_8017C340.c holds only a CALLER and a prototype; the INCLUDE_ASM lives in
..._jr_8017ED5C.c. Splicing into the wrong file is a no-op, the binary differs,
and harvest recorded its canned string "match_one MATCH but gate rejected
(declaration/TU plumbing)" — A GUESS, NOT A MEASUREMENT. No declaration
conflict ever existed.

NEW LAW (zero-cost oracle): THE SPLAT ASM SUBDIR NAMES THE DESTINATION TU.
asm/<overlay>/nonmatchings/<TU_basename>/<fn>.s  =>  the INCLUDE_ASM is in
src/<overlay>/<TU_basename>.c, always — the third path component IS the TU
stem. Never accept a prose TU citation that disagrees with the --asm-subdir you
were handed: a grep for the function name also hits callers and prototypes in
OTHER TUs and reads exactly like a destination hit. Corollary: re-derive the TU
path from the asm subdir BEFORE hunting codegen on any gate-refused backlog
entry.

The agent proved it properly: in-situ splice into BOTH TUs, full pinned triple,
279/279 with 0 masked diffs, plus a collateral-drift check (71/71 other sized
symbols byte-identical). It also corrected the reach to x2 (only two .s files
for that function exist, byte-identical modulo the overlay name).

Bank rate across six waves: 67% -> 79% -> 69% -> 68% -> 73% -> 60%.
2026-08-12 18:13:19 -06:00

162 lines
9.5 KiB
YAML
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.
# splat config — Brave Fencer Musashi location overlay ov_SC01_077 (SC01.CD/FILE_077/0.4.dec)
# Phase 13 T1: the milestone overlay (load byte-proven, Phase 3 T6b). Instantiated from
# config/splat.us.overlay.template.yaml. Flat decompressed blob @ vram 0x80128158 (the shared
# overlay slot); code at file 0x0; data tail from 0x5E978 (end of the last sig_image function,
# vram 0x80186AD0) to EOF 0xB29D7 (731,607 B -> end vram 0x801DAB2F). The text/data split is
# iterated vs `make check BINARY=ov_SC01_077` (Phase-5/10 precedent). Matches the DECOMPRESSED
# 0.4.dec (sha1 d19c9580…); LZSS repack is Gen3 (not in the verify path).
name: ov_SC01_077
sha1: d19c9580a02dc63ba1f0e7e0c770f3b10de35635
options:
basename: ov_SC01_077
target_path: extracted/retail/SC01.CD.dir/FILE_077.dir/0.4.dec
elf_path: build/ov_SC01_077/ov_SC01_077.elf
base_path: ..
platform: psx
compiler: PSYQ
asm_path: asm/ov_SC01_077
src_path: src/ov_SC01_077
asset_path: assets/ov_SC01_077 # `bin` subsegs (the trailing carve) -> assets/ov_SC01_077/*.bin
build_path: build
ld_script_path: build/ov_SC01_077/ov_SC01_077.ld
ld_dependencies: True
undefined_syms_auto_path: build/ov_SC01_077/undefined_syms_auto.txt
undefined_funcs_auto_path: build/ov_SC01_077/undefined_funcs_auto.txt
find_file_boundaries: False
o_as_suffix: True
use_legacy_include_asm: False
section_order: [".rodata", ".text", ".data", ".bss"]
symbol_addrs_path:
- config/symbols.us.txt
- config/symbols.resident.txt
- config/symbols.ov_SC01_077.txt
subalign: 2
string_encoding: ASCII
data_string_encoding: ASCII
rodata_string_guesser_level: 2
data_string_guesser_level: 2
segments:
- name: ov_SC01_077
type: code
start: 0x0
vram: 0x80128158
align: 4
subsegments:
# Phase-19 T1: per-file -O0 split (src/boot.c precedent). The 16 contiguous functions
# vram 0x8013B568..0x8013C98C were compiled -O0 (prologue sig 21F0A003); gcc-2.7.2 has no
# per-function optimize pragma, so they need their own -O0 .o (the Makefile forces
# CC1FLAGS=-O0 on ov_SC01_077_o0.o). A single object's .text can't be split around a middle
# object, so before/after are DISTINCT objects: before -> ov_SC01_077_a (smaller, asm paths
# rewritten), after KEEPS the ov_SC01_077 name (the bulk matched C + asm paths unchanged).
- [0x0, c, ov_SC01_077_a]
- [0x2b88, c, ov_SC01_077_jr_8012ACE0]
- [0xd730, c, ov_SC01_077_jr_80135888]
- [0xd8f4, c, ov_SC01_077_jr_80135A4C]
- [0xdbc8, c, ov_SC01_077_jr_80135D20]
- [0xff88, c, ov_SC01_077_jr_801380E0]
- [0x13410, c, ov_SC01_077_o0] # -O0 cluster: 16 fns vram 0x8013B568..0x8013C98C (file 0x13410..0x14834)
# Phase-24 whale: func_80144B9C is a SECOND -O0 region (prologue 21F0A003) stranded in the
# -O2 "after" segment (0x80144B9C..0x801457A4). Carve it into its own -O0 object (o0b), splitting
# the -O2 "after" into before-whale (keeps the ov_SC01_077 name) and after-whale (ov_SC01_077_after).
- [0x14834, c, ov_SC01_077] # -O2 after part 1: vram 0x8013C98C..0x80144B9C (file 0x14834..0x1CA44)
- [0x1CA44, c, ov_SC01_077_o0b] # -O0 WHALE func_80144B9C: vram 0x80144B9C..0x801457A4 (file 0x1CA44..0x1D64C)
- [0x1d64c, c, ov_SC01_077_after]
- [0x2c2f4, c, ov_SC01_077_jr_8015444C]
- [0x2cacc, c, ov_SC01_077_jr_80154C24]
- [0x30774, c, ov_SC01_077_jr_801588CC]
- [0x31b2c, c, ov_SC01_077_jr_80159C84]
- [0x32270, c, ov_SC01_077_jr_8015A3C8]
- [0x32cd4, c, ov_SC01_077_jr_8015AE2C]
- [0x341d4, c, ov_SC01_077_jr_8015C32C]
- [0x42a14, c, ov_SC01_077_jr_8016AB6C]
- [0x499f4, c, ov_SC01_077_jr_80171B4C]
- [0x4b364, c, ov_SC01_077_jr_801734BC]
- [0x50854, c, ov_SC01_077_jr_801789AC]
- [0x50be8, c, ov_SC01_077_jr_80178D40]
- [0x52354, c, ov_SC01_077_jr_8017A4AC]
- [0x52cd4, c, ov_SC01_077_jr_8017AE2C]
- [0x58a0c, c, ov_SC01_077_jr_80180B64]
- [0x58ee4, c, ov_SC01_077_jr_8018103C]
- [0x59a8c, c, ov_SC01_077_jr_80181BE4]
- [0x59f84, c, ov_SC01_077_jr_801820DC]
- [0x5a110, c, ov_SC01_077_jr_80182268]
- [0x5ad24, c, ov_SC01_077_jr_80182E7C]
- [0x5b1cc, c, ov_SC01_077_jr_80183324]
- [0x5b998, c, ov_SC01_077_jr_80183AF0]
- [0x5ba54, c, ov_SC01_077_jr_80183BAC]
- [0x5bb9c, c, ov_SC01_077_jr_80183CF4]
# Phase-26 §8 jtbl-rodata carve (cookbook §8, the LZSS precedent adapted to a flat overlay).
# gcc emits each `switch` jump table into .rodata; this overlay's jtbl island sits at the TAIL
# (vram 0x801D7F9C..~0x801D9460), between the .data globals and a tiny .data remnant. While every
# jr-function is INCLUDE_ASM the jtbls emit as in-place .data (byte-fine). But a MATCHED jr-function's
# C emits its jtbl into .rodata (which section_order floats to the FRONT) while the raw copy stays in
# the data tail -> duplicate + wrong address. FIX: carve each matched fn's jtbl(s) out of the data tail
# into a dotted .rodata subseg co-located with its code object; tools/ld_interleave.py --section
# .ov_SC01_077 then places .data(pre) -> .rodata(jtbls) -> .data(post), reconstructing the island.
# PoC: func_8012ACE0's single jtbl jtbl_801D8078 (8-aligned, 204B) = vram 0x801D8078..0x801D8144
# = file 0xAFF20..0xAFFEC. func_8012ACE0 lives in the ov_SC01_077_a subseg. Other functions'
# jtbls stay raw .data until matched (each matched fn's jtbl gets its own carve — the ×134 tool).
- [0x5e978, data, tail]
- [0xafe44, .rodata, ov_SC01_077_a] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xaff20, .rodata, ov_SC01_077_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb0014, data, tail2]
- [0xb0018, .rodata, ov_SC01_077_jr_80135888] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb002c, data, tail3]
- [0xb0030, .rodata, ov_SC01_077_jr_80135A4C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb0044, data, tail4]
- [0xb0048, .rodata, ov_SC01_077_jr_80135D20] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb008c, data, tail5]
- [0xb0098, .rodata, ov_SC01_077_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb00fc, .rodata, ov_SC01_077_o0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb0280, data, tail6]
- [0xb0708, .rodata, ov_SC01_077] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb07c4, data, tail7]
- [0xb07dc, .rodata, ov_SC01_077_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb08b8, .rodata, ov_SC01_077_jr_80154C24] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb08fc, .rodata, ov_SC01_077_jr_801588CC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb09a4, .rodata, ov_SC01_077_jr_80159C84] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb09d8, data, tail8]
- [0xb09dc, .rodata, ov_SC01_077_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb09f8, data, tail9]
- [0xb09fc, .rodata, ov_SC01_077_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb0a38, data, tail10]
- [0xb0a3c, .rodata, ov_SC01_077_jr_8015C32C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb0a58, data, tail11]
- [0xb0a70, .rodata, ov_SC01_077_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb0ab0, data, tail12]
- [0xb0af0, .rodata, ov_SC01_077_jr_80171B4C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb0b10, .rodata, ov_SC01_077_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb0b24, data, tail13]
- [0xb0cb4, .rodata, ov_SC01_077_jr_801789AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb0ccc, .rodata, ov_SC01_077_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb0ed0, data, tail14]
- [0xb0ed4, .rodata, ov_SC01_077_jr_8017A4AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb0f60, data, tail15]
- [0xb0f64, .rodata, ov_SC01_077_jr_8017AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb0f98, data, tail16]
- [0xb0fa0, .rodata, ov_SC01_077_jr_80180B64] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb1000, .rodata, ov_SC01_077_jr_8018103C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb1098, .rodata, ov_SC01_077_jr_80181BE4] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb10ac, data, tail17]
- [0xb1128, .rodata, ov_SC01_077_jr_801820DC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb1148, .rodata, ov_SC01_077_jr_80182268] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb11a8, .rodata, ov_SC01_077_jr_80182E7C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb11e8, .rodata, ov_SC01_077_jr_80183324] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb12a8, .rodata, ov_SC01_077_jr_80183AF0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb12c8, .rodata, ov_SC01_077_jr_80183BAC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb1308, .rodata, ov_SC01_077_jr_80183CF4] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb1328, data, tail18]
- [0xB29D4, bin, trailing] # final 3 bytes (EOF 0xB29D7 not word-aligned; spimdisasm drops
# a trailing partial word and a <4-byte `data` carve emits nothing,
# so use `bin` = raw .incbin, byte-exact). Word-aligned overlays omit this.
- [0xB29D7] # EOF (731,607 B) -> end vram 0x801DAB2F