Promote daKpFr_c as a genuine class TU - #2000
Conversation
✅ PR validation — PassedCommitted merge introduces no reconstruction or attribution regression. Full merge validation
Byte-verified means the range carries Warnings: 21 address range(s) left the byte-verified set while enrolled totals held steady: ov070:0x02121b48-0x02121b88, ov070:0x02121b88-0x02121bdc, ov070:0x02121bdc-0x02121be4, ov070:0x02121be4-0x02121c8c, ov070:0x02121c8c-0x02121cbc, +16 more; 20 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 1 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. |
Resolves three generated files that main regenerated wholesale: - config/converted-baseline.json: REGENERATED with the post-#2007 tiers.py (tools/tiers_ratchet.py --update), not resolved by side or key union. Keeping the branch's copy would have banked 1951 and silently lowered the ratchet floor by ~600 entries with every gate green. New count 2559 = main's real current CONVERTED score (2565) minus the six per-symbol files this PR's ov070/daKpFr_c promotion absorbs. - config/converted-backslide-exceptions.jsonl: the six daKpFr_c rows this branch already logged are kept as-is; two rows added for src/_ZN12daObjAbuku_cD0Ev.cpp and D1, which main's own ov002/daObjAbuku_c promotion (#1996) absorbed without re-banking. Both are classified "MOVED -- absorbed into src/actors/daObjAbuku_c.cpp" by the tool's own classify_missing(), and that file exists in this tree. - notes/cpp-tu-current-state.md: regenerated with tools/cpp_tu_state.py --write-note; --check-note is clean. No source file, delinks entry, or byte changed in this merge. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WdCK1xgrJdiJzPCh3bAJfQ
Carries origin/main through the restacked #2000. Same two generated files conflicted and are resolved the same way: - config/converted-baseline.json: REGENERATED with the post-#2007 tiers.py (tools/tiers_ratchet.py --update), never by side or key union. Count 2552 = the parent branch's 2559 minus the seven per-symbol files this PR's ov070/daKrpa_c promotion absorbs. All seven are classified "MOVED -- absorbed into src/actors/daKrpa_c.cpp" by classify_missing(), that file exists in this tree, and all seven already had rows in config/converted-backslide-exceptions.jsonl from this branch's own earlier run, so no duplicate rows were added. - notes/cpp-tu-current-state.md: regenerated with tools/cpp_tu_state.py --write-note; --check-note is clean. No source file, delinks entry, or byte changed in this merge. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WdCK1xgrJdiJzPCh3bAJfQ
Re-merges main now that #2011 has re-banked the two daObjAbuku_c paths that #1996 absorbed, which was main's own ratchet desync and not this PR's doing. - config/converted-baseline.json: REGENERATED from main's 2565 with tools/tiers_ratchet.py --update -- never resolved by side or key union. New count 2559 = 2565 minus the six per-symbol files this PR's ov070/daKpFr_c promotion absorbs. All six are classified "MOVED -- absorbed into src/actors/daKpFr_c.cpp by TU promotion (ov070/daKpFr_c)" by the tool's own classify_missing(), and that file exists and is tracked in this tree. Zero genuine removals. - config/converted-backslide-exceptions.jsonl: the union driver produced duplicate daObjAbuku_c rows (this branch's earlier pair plus #2011's). #2011's authoritative rows are kept and the redundant pair dropped, so each path is one row. The six daKpFr_c rows this branch already logged are unchanged; no new rows were needed. - notes/cpp-tu-current-state.md: regenerated with tools/cpp_tu_state.py --write-note; --check-note is clean. No source file, delinks entry, or byte changed in this merge. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WdCK1xgrJdiJzPCh3bAJfQ
Carries origin/main through the restacked #2000 and #2002. - config/converted-baseline.json: this PR RENAMES rather than absorbs, so it is resolved by carrying the three PathLift -> dPathLiftActor_c key renames onto the parent branch's 2552 set and then regenerating with tools/tiers_ratchet.py --update. That yields +1 / -0 and count 2553: zero removals and zero backslide rows, which is the honest reading. Regenerating WITHOUT the key rename first would have reported the three paths as "GONE -- not a tracked source file any more" and demanded a --reason, which would have logged a rename as a readability backslide. git itself scores them as renames (R076/R059/R061), all three destinations exist and are tracked, and all three are CONVERTED in the new set, so no readability was lost. This matches how this branch already handled the D0/D1 pair against the older baseline. - notes/cpp-tu-current-state.md: regenerated with tools/cpp_tu_state.py --write-note; --check-note is clean. No source file, delinks entry, or byte changed in this merge. 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 (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
Summary
ov070/daKpFr_cfrom 21 one-function sources intosrc/actors/daKpFr_c.cppVerification
tubuild verify: 21/21 MATCH, objisolate clean, relocation destinations clean_Znwmromdata_check: 4 VERIFIED, 6 PARTIAL with 72 exact bytes, 0 DIFFERS, 0 UNNAMEDcheck_src_tu_compiles: 88/88rombuild.py -j 16: 11,085/11,085 reproducing, 0 mismatches, 106/106 modules exact, ROM-build PASS