Files
BFM-decomp/phase-ends/current/logs/T3.c3.md
T

3.8 KiB

T3.c3 — rung S apply: pinned base reaches apply; zero-site batches drawable again

Cause (evidence)

  • Ledger t3_S6 (scratch .run/T3c3/s6.py): 340 rows / 50 files; verdicts NO-SITE 332, KEPT 8; every base status NO-TYPE-IN-MAP (397: Unkstruct_80126B58 255, Unkstruct_800B5CB8 142); sites RESIDUAL(NO-TYPE-IN-MAP) 2063, RESIDUAL(TYPE-NOT-CANONICAL) 728, KEPT(MISALIGNED) 16, KEPT(NON-STRUCT) 4. Example src/ov_MAIN_012/ov_MAIN_012_jr_801549F8.c func_80155580: base param:a0 Unkstruct_80126B58 NO-TYPE-IN-MAP, 0 edits.
  • t3_S15 same type: status CANONICAL 1809 → 5136 members.
  • .run/P37/census/struct_map.json (rewritten by the cycle's per-batch census) lacks both names; .run/P39/census/struct_map.json (the pin's) has them.
  • So the brief's hypothesis was half right: plan_S's pinned bases DID reach work_file_S (bodies = plan payload), but s_body_edits checked struct_map().get(tname) FIRST and returned NO-TYPE-IN-MAP before the canonical branch, though the canonical path only needs canon_types() field maps. typed_bases_of read the live unpinned bbt (only the residual reason label; now pinned too).
  • The 7-9 "written files" per batch = the KEPT rows: kept-class sites (MISALIGNED / NON-STRUCT) respelled to CAST_* macros by s_site_rows on the no-edit path (t3_S6: 8 files, 20 respells, e.g. ov_MAIN_012_jr_8013F350.c). No members.

Change (tools/restruct.py)

  • s_body_edits: NO-TYPE-IN-MAP only when the name is neither in the map nor canonical; the LOCAL branch requires the map entry (allow_local and t).
  • typed_bases_of: cache = bbt() (same pinned merge as plan_S).
  • New s_judged(row): a rung-S row with ≥1 base CANONICAL/LOCAL. s_finished and ledger_index (done set) ignore unjudged S rows. Choice over --redraw labels: a row with no judged base is a tool non-judgement by definition, independent of labels; ledger scan shows such rows exist only in t3_S6..S14, S16..S18 (+13 in t3_S15 on all-NO-TYPE-IN-MAP bodies) — .run/T3c3/unj.py. The done-set part was found by the first probe (UNCHANGED, rows 0: done skipped the body at its current nhash).
  • Selftest: fixture S rows carry bases CANONICAL; new checks: unjudged row keeps the file drawable and out of done; s_body_edits on the planned pinned base with an empty struct map → CANONICAL with edits.

Commands

  • restruct.py --selftest → 90/90 OK (both edits).
  • make kit-corpus + make tools-health → OK (first edit); rerun after the ledger_index edit (see VERIFIED in return).
  • commit 568de6c713 (first edit: s_body_edits, typed_bases_of, s_finished).
  • delever_oracle --snapshot-baseline → 7428 objects at 568de6c71; --calibrate ov_SC04_011 ov_SC03_015 md_SC07_004 main -j 16 → OK.
  • restruct --plan --rung S --bbt .run/P39/census/body_base_type.json --only "ov_*" → 50 of 1872 drawable files · 340 bodies · 397 typed bases (= t3_S6's set); skipped file-finished 216.
  • Probe --apply --rung S --bbt … --only src/ov_MAIN_012/ov_MAIN_012_jr_801549F8.c --batch 1 --label t3_c3probe -j 12 → IDENTICAL, members 1, written 1 (D_801801F0[((Unkstruct_80126B58 *)a0)->unk2]()).
  • make check BINARY=ov_MAIN_012 → BYTE-IDENTICAL.
  • type_census --check-casts --quiet → unbacked 96, NOT 0 — pre-existing: none on the probe file (0 CAST_ there); unbacked sites sit on rows of t3_S1..S10 (t3_S1 MEMBERS/KEPT NON-STRUCT 32, t3_S2 MEMBERS SIGN 11, …; top file ov_SC04_011_jr_8017D494.c 19) — .run/T3c3/unb.py. Earlier logs (t2c3_casts) read unbacked 0: a T3-sweep regression for the expert.

For the expert

  • Commits after 568de6c713 make the calibration stale again: snapshot + calibrate before the next apply/cycle.
  • The struct_map leverage weights in plan_S still use the drifted live map (weight 0 for pinned names → alphabetical order); harmless for correctness.
  • Resuming the cycle redraws t3_S6.. files first (1872 drawable).