From e0988fc64edecba040da84766ff35b98e70e6348 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 30 Aug 2026 09:51:12 -0500 Subject: [PATCH] Re-bank the two daObjAbuku_c paths #1996 absorbed, and check the ratchet on main Main has been out of sync since #1996 merged. `config/converted-baseline.json` banked `src/_ZN12daObjAbuku_cD0Ev.cpp` and `src/_ZN12daObjAbuku_cD1Ev.cpp`, which that PR deleted when it promoted the ov002/daObjAbuku_c translation unit. Nobody's checks were wrong; they just never overlapped. #1996's green ran against a base predating #2007's re-bank, which is what first banked those two files. By the time #1996 merged, the paths it deletes were in the baseline it never re-read. The next unrelated PR to touch src/** -- #1978, which has nothing to do with ov002 -- is the one that went red. The removal is legitimate and is banked with a reason, not reverted: MOVED -- absorbed into src/actors/daObjAbuku_c.cpp by TU promotion (ov002/daObjAbuku_c), which fails: No raw offset arithmetic; No unk_ fields; Calls things by real names, not mangled _Z A reconstructed TU must spell vague-linkage symbols directly (_ZN7fBase_cnwEj, _ZN8dActor_cC2Ev, _ZN8dActor_cD2Ev) or its range will not link, so `no_mangled_refs` structurally cannot pass for an absorbing file. Byte-match outranks readability. No source changed and no byte moved. Also adds a `push: [main]` trigger. The workflow's design note claimed staleness "only ever runs one way" -- permissive, never falsely red. TU promotion is the exception, because it REMOVES banked paths, and the note now says so. The trigger gates nothing (no branch protection; a red main is advisory) but it attributes the breakage to the merge that caused it instead of to whoever opens the next PR. tiers_ratchet --check PASS baseline 2565 current 2565 pytest tools/test_tiers.py 29 passed check_dead_references no new dead references Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01WdCK1xgrJdiJzPCh3bAJfQ --- .github/workflows/converted-ratchet.yml | 24 +++++++++++++++++++++ config/converted-backslide-exceptions.jsonl | 2 ++ config/converted-baseline.json | 4 +--- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/.github/workflows/converted-ratchet.yml b/.github/workflows/converted-ratchet.yml index 8ac8aed69c..bbca401591 100644 --- a/.github/workflows/converted-ratchet.yml +++ b/.github/workflows/converted-ratchet.yml @@ -24,6 +24,19 @@ # pass, so the file is not in every PR's diff and does not conflict. Re-bank it # occasionally, on its own, to bank recent gains. # +# ONE-WAY STALENESS HAS AN EXCEPTION, AND IT COST A DAY. A TU promotion REMOVES banked +# paths: `tubuild.py` consolidates N per-symbol files into one, and the absorbing file +# structurally cannot pass `no_mangled_refs`. So a promotion leaves the baseline stale in +# the FAILING direction. Measured: PR #1996 promoted `ov002/daObjAbuku_c` while its own +# checks were green -- they had run against a base predating the re-bank that first +# banked the two files it deletes. Main went out of sync the moment it merged, and the +# next unrelated PR to touch `src/**` (#1978) is the one that turned red for it. +# +# Hence the `push:` trigger below. It does not gate anything -- there is no branch +# protection here and a red main is advisory -- but it attributes the breakage to the +# merge that caused it instead of to whoever opens the next PR. Re-bank with +# `--update --reason` naming the promotion; that is the designed path, not a workaround. +# # Hence: no second checkout, and no root-file override the way langmode has one. The # escape hatch is a flag on the tool, used LOCALLY before you push. # @@ -61,6 +74,17 @@ on: - "config/tu_manifest.d/**" - "config/converted-baseline.json" - ".github/workflows/converted-ratchet.yml" + push: + branches: [main] + paths: + - "src/**" + - "tools/tiers.py" + - "tools/tiers_ratchet.py" + - "tools/delaunder.py" + - "tools/tu_manifest.py" + - "config/tu_manifest.d/**" + - "config/converted-baseline.json" + - ".github/workflows/converted-ratchet.yml" workflow_dispatch: permissions: diff --git a/config/converted-backslide-exceptions.jsonl b/config/converted-backslide-exceptions.jsonl index f11f5a0d16..25faadbe8b 100644 --- a/config/converted-backslide-exceptions.jsonl +++ b/config/converted-backslide-exceptions.jsonl @@ -12,3 +12,5 @@ {"path": "src/_ZN6BobOmb13OnYoshiTryEatEv.cpp", "reason": "Both files traded a raw (unsigned char*)this cast at [263] for dEnemyBase_c's actual field at 0x107, which is still honestly named unk_107 because nobody has recovered what the byte means. The old spelling only scored because a raw index through a re-cast this pointer slips past the RAW_OFFSET criterion -- it was never more readable, only less legible to the gate. Reverting it to score would be exactly the regression the tier exists to prevent; naming the field properly is a dEnemyBase_c-wide rename touching 13 files and belongs in its own PR."} {"path": "src/_ZN6Rabbit13OnYoshiTryEatEv.cpp", "reason": "Both files traded a raw (unsigned char*)this cast at [263] for dEnemyBase_c's actual field at 0x107, which is still honestly named unk_107 because nobody has recovered what the byte means. The old spelling only scored because a raw index through a re-cast this pointer slips past the RAW_OFFSET criterion -- it was never more readable, only less legible to the gate. Reverting it to score would be exactly the regression the tier exists to prevent; naming the field properly is a dEnemyBase_c-wide rename touching 13 files and belongs in its own PR."} {"path": "src/__sinit_ov075_0211bb00.c", "reason": "dScEntry_c::graphCallback_c's constructor is now a real compiler-owned C++ symbol. The static initializer remains a generated C reconstruction and cannot spell a constructor call in C++ source form, so its relocation must use _ZN10dScEntry_c15graphCallback_cC1Ev until the initializer's globals are reconstructed as typed C++ definitions."} +{"path": "src/_ZN12daObjAbuku_cD0Ev.cpp", "reason": "TU promotion ov002/daObjAbuku_c (PR #1996) consolidated these two per-symbol files into src/actors/daObjAbuku_c.cpp. A reconstructed TU must spell vague-linkage symbols directly (_ZN7fBase_cnwEj, _ZN8dActor_cC2Ev, _ZN8dActor_cD2Ev) or its range will not link, so no_mangled_refs cannot pass for the absorbing file. Byte-match outranks readability; the code was not reverted and no byte changed."} +{"path": "src/_ZN12daObjAbuku_cD1Ev.cpp", "reason": "TU promotion ov002/daObjAbuku_c (PR #1996) consolidated these two per-symbol files into src/actors/daObjAbuku_c.cpp. A reconstructed TU must spell vague-linkage symbols directly (_ZN7fBase_cnwEj, _ZN8dActor_cC2Ev, _ZN8dActor_cD2Ev) or its range will not link, so no_mangled_refs cannot pass for the absorbing file. Byte-match outranks readability; the code was not reverted and no byte changed."} diff --git a/config/converted-baseline.json b/config/converted-baseline.json index 800a7bd1c2..1a8f15204d 100644 --- a/config/converted-baseline.json +++ b/config/converted-baseline.json @@ -7,7 +7,7 @@ "no_codegen_trick", "no_mangled_refs" ], - "count": 2567, + "count": 2565, "converted": [ "src/ARMMathLoadState.c", "src/ARMMathSaveState.c", @@ -660,8 +660,6 @@ "src/_ZN12daDossyCap_c6RenderEv.cpp", "src/_ZN12daDossyCap_cD0Ev.cpp", "src/_ZN12daDossyCap_cD1Ev.cpp", - "src/_ZN12daObjAbuku_cD0Ev.cpp", - "src/_ZN12daObjAbuku_cD1Ev.cpp", "src/_ZN13BasementWater16CleanupResourcesEv.cpp", "src/_ZN13BasementWaterD0Ev.cpp", "src/_ZN13BasementWaterD1Ev.cpp",