TU: generate dBase_c lifecycle from one genuine C++ translation unit - #1995
Conversation
✅ PR validation — PassedCommitted merge introduces no reconstruction or attribution regression. Full merge validation
Byte-verified means the range carries Warnings: 5 address range(s) left the byte-verified set while enrolled totals held steady: arm9:0x02013e80-0x02013ea4, arm9:0x02013ea4-0x02013edc, arm9:0x02013edc-0x02013ee8, arm9:0x02013ee8-0x02013ef4, arm9:0x02013ef4-0x02013f28; 3 linkcheck result(s) have unresolved relocations; 4 more function(s) now claim a match that nothing compiles; enroll them in a delinks.txt to have the ROM build check them. Per-file link-check detailAll 2687 changed file(s) compile to the ROM byte-for-byte with correct relocation targets.
The private worker commits a test merge, builds the stock ROM profile, compares every executable module, measures matched and source-built code, checks contributor lineage, and verifies affected relocations. The mod profile is opt-in and is not part of this merge gate. |
Two files conflicted, both machine-generated. config/converted-baseline.json -- resolved to origin/main's file VERBATIM. Not by regeneration, not by key union, not --ours/--theirs. `--check` only asserts current >= banked, so a PR that banks a smaller set passes green and silently lowers the floor. This branch's own TU promotion legitimately turns four banked per-symbol paths into one absorbing file, so ANY regeneration here writes 2562 -- below main's 2567 and below the 2565 that PR #2011 will leave. Leaving the file identical to main keeps the floor, drops the file from this PR's diff, and costs nothing: `--check` resolves all four dBase_c paths through config/tu_manifest.d/arm9/ActorDerived.json as MOVED -- absorbed into src/actors/ActorDerived.cpp by TU promotion (arm9/ActorDerived); that file passes all five, so nothing readable was lost which classify_missing() counts as a move, not a backslide. Verified against a simulated post-#2011 baseline: "CONVERTED ratchet PASS baseline 2565 current 2562 (+1 gained, not yet banked) (4 moved into a promoted TU)". notes/cpp-tu-current-state.md -- regenerated over the merged tree with `python tools/cpp_tu_state.py --write-note`. attribution.json auto-merged as a clean key union: 845 override keys at the merge base, +5 ours, +7 theirs, 857 after, nothing dropped. config/match_attempts.jsonl and config/match_provenance.jsonl are untouched by this branch, so their union merge driver had no edited row to mangle; both now equal origin/main byte for byte. The consolidation this PR exists for is intact. config/arm9/delinks.txt still collapses five entries into one `complete` src/actors/ActorDerived.cpp over .text 0x02013e80-0x02013f28, and 0x24 + 0x38 + 0x0c + 0x0c + 0x34 = 0xa8 closes exactly.
Resolved: - attribution.json: key union of both overrides blocks (878 keys, no key or value lost from either side). - notes/cpp-tu-current-state.md: regenerated with tools/cpp_tu_state.py --write-note; it now names both main's daKpFr_c.cpp and this branch's ActorDerived.cpp as complete multi-function owners. Took main's naming for the #1978 ov063 RTTI renames (MansionSteps -> daTrsTrap_c, BooCage -> daTBasket_c), the #1991 daDsnBase_c slots and the #2000 daKpFr_c TU promotion. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WdCK1xgrJdiJzPCh3bAJfQ
Resolved: - attribution.json: key union of both overrides blocks (903 keys; nothing lost from either side, no value disagreements). - notes/cpp-tu-current-state.md: regenerated with tools/cpp_tu_state.py --write-note. Main's naming wins throughout (#1978 ov063 RTTI renames, #1991 daDsnBase_c, #2000 daKpFr_c, #2002 daKrpa_c, the WingFeather move under src/game/actors/). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WdCK1xgrJdiJzPCh3bAJfQ
notes/cpp-tu-current-state.md was the only conflict; regenerated with tools/cpp_tu_state.py --write-note. attribution.json auto-merged and was audited for key union (903 keys, nothing dropped from either side). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WdCK1xgrJdiJzPCh3bAJfQ
Resolves the only conflict, notes/cpp-tu-current-state.md, from the merged tree itself rather than by taking a side: git ls-tree on the merge result counts .c=6374 .cpp=4876 (total 11250), which is main's post-#1995 totals adjusted by this branch's one WaterfallMist.cpp -> daObjWaterfall_c.cpp flip. The note is derived (tools/cpp_tu_state.py --write-note) and nothing gates it, but lagging counts are still worth not committing.
Promotes the five-function arm9/ActorDerived run as src/actors/ActorDerived.cpp after replacing its C-linkage lifecycle workaround with real dBase_c methods.
MWCC now emits D1 followed by D0 from the inline class destructor, with no D2 and no hand-authored destructor symbols. The same TU owns Spawn, AfterInitResources, the remaining free-function veneer, RTTI, and vtable output; exact canonical data copies are compared and discarded through the manifest.
Verification:
No claims, attempt-ledger, converted-baseline, dashboard, or tooling changes are included.