fix(symfix): key the slate by (binary, fn); §420 multi-cluster rebase banks 4 in 57s

aprop_symfix deduped its slate by BARE FUNCTION NAME, so a four-row slate for
func_8016AB6C across ov_SC03_107/ov_SC07_007/010/011 reported "1 drafts audited" - and
the three dropped rows each needed a DIFFERENT rebase, because each overlay has its own
target symbols. Same root as reloc_filter's binof and gate_lane's homonym staging: three
tools, one R48/§238 defect.

With all four visible, the structure is two uniform delta clusters of two, identical in
shape across all four overlays - one seed body's two data clusters each moving as a
block. STALE-DELTA only admits ONE cluster, so it refused all four as AMBIGUOUS. §420
records the safe generalisation (runs of constant delta, every run >= 2 members, D_
symbols only) and the verification step.

Rebased by hand under that rule, all four still MATCH at closeness 0, and the gate
banked 4/4 in 57 seconds with no drafting (commit:3629). Frontier 165, 45 banked.
This commit is contained in:
Drew T
2026-09-02 05:38:28 -06:00
parent 24d5017039
commit 2cedd19aaa
3 changed files with 51 additions and 4 deletions
+9 -2
View File
@@ -188,12 +188,19 @@ def main():
recs = [r for r in json.load(open(a.slate)) if isinstance(r, dict) and (r.get('fn') or r.get('name'))]
skip = set(json.load(open(a.skip))) if a.skip else set()
# KEY BY (binary, fn), NEVER BY NAME (R48/§238). A slate legitimately carries the SAME function
# name for several binaries — one shared body copied into four overlays is the common case — and
# a name-keyed `seen` silently audited ONE of them. Measured S71: a 4-row slate for
# func_8016AB6C across ov_SC03_107/ov_SC07_007/010/011 reported "1 drafts audited", and the
# three unexamined rows each needed a DIFFERENT rebase because each overlay's target symbols
# differ.
seen, rows = set(), []
for r in recs:
fn = r.get('fn') or r['name']
if fn in skip or fn in seen:
key = (r['binary'], fn)
if fn in skip or key in seen:
continue
seen.add(fn)
seen.add(key)
draft = r.get('draft') or f".run/aprop1/{fn}/{fn}.c"
st, stale, asm_only = audit_one(fn, r['binary'], draft)
rows.append(dict(fn=fn, binary=r['binary'], draft=draft, status=st,