Files
benilla-octo/crates
gromandClaude Opus 5 c5544a7ea3 A double load, a stand-in that won a race, and the unified ActionButtonUp
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
2026-10-31 14:53:07 -06:00
..