3e39e44a8a
Both cast UIs (SpellcastingSection + MyCharacterPanel) called castSpell without a level, so it always tried the spell's base level — a warlock (only a pact slot at the pact level) could never cast, and upcasting was impossible. New availableSlotLevels() lists the castable levels (regular slots ≥ spell level with a charge, plus the pact level); the UI shows a level selector and passes the chosen level. Adds a regression test. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>