Three of these are the harness telling the truth about load order, which is worth more than the
tests they unblocked:
- **The load ledger now guards a file a kit names twice**, not just a prerequisite. A second load
builds a second frame under the same name, the global keeps one of them, and the reference's own
`parent == MultiBarRight` (`ActionButton.lua:363`) then reads false for a button whose parent
really is the bar. The toc names each file once; a kit should too.
- **`MultiActionBars.xml` belongs before `BonusActionBarFrame.xml`** (toc rows 48 and 84), and the
order is load-bearing: `ShapeshiftBar_OnLoad` runs `UIParent_ManageFramePositions` at load, whose
stand-in pass seats a hidden parentless frame for every managed name still absent —
`MultiBarRight` among them — and a frame's publish to `_G` never overwrites (`0x701bd0`). The
stand-in kept the global for good and the anchor fork read the wrong side.
- **`paperdollframe.xml` must not name `UIDropDownMenu.lua`** beside its `.xml`. The XML brings its
own `<Script file=>`; naming the chunk again **re-ran** it, and the file declares
`UIDROPDOWNMENU_DEFAULT_TEXT_HEIGHT = nil` at scope while `DropDownList1`'s OnLoad is what fills
it from Button1's font. The second run put the nil back, and then every dropdown row went to
`SetFont(STANDARD_TEXT_FONT, nil)` — a usage refusal that took out a whole file's OnLoads, seven
at a time. The ledger could not catch it: a `<Script file=>` chunk never passes through
`load_entry`. `uidropdownmenu.xml` also gained `Fonts.xml` as a prerequisite for the same height.
- **`ActionButtonUp` is one body now** (`ActionButton.lua:27-46`): it picks the bonus or the normal
button and passes the caller's own `onSelf` through. Stock's separate BONUS branch handed
`UseAction` a literal 0, so ALT-1 in a stance drove the bonus page without self-casting. Gone.
- The bonus bar is driven by an offset plus `UPDATE_BONUS_ACTIONBAR`, not a bare `Show()`: the
event is the only thing that runs `ActionButton_Update` on that row, and a button registers
`ACTIONBAR_UPDATE_COOLDOWN` only inside its `HasAction` arm — while the event's own handler hides
the bar again when the offset is 0, so both halves are needed.
- And `tooltip_compare`'s player needed the name `CharacterFrame_OnShow` gsubs unguarded.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SgstFWtn1RxEJ5kVrpgYwn