A pet-bar spell press sent `CMSG_PET_ACTION` even when the spell's `Spell.dbc` record or the pet object did not resolve. So with the pet out of the client's view, which leaves the bar standing on its guid from `SMSG_PET_SPELLS`, a press still made the server cast. In the reference the press does nothing there.
**The reference.** The pet bar's spell arm (types 1-5 through the jump table at `0x4bd4d0`, the arm at `0x4bd240`) first handles the aura cancel (`0x4bd242`-`0x4bd2ad`). It then leaves for the epilogue `0x4bd4c6`, with no GCD and no send, in any of these cases:
- the id is past `[0xc0d78c]` (`0x4bd2e7`-`0x4bd2ed`);
- the id has no record (`0x4bd2f3`-`0x4bd2fe`);
- the active player does not resolve (`0x4bd304`-`0x4bd324`);
- the pet guid `[0xb714a0]` does not resolve to a unit (`0x4bd346`-`0x4bd34f`).
The reaction arm (`0x4bd391`) and the command arm (`0x4bd3a3`) take none of these exits.
**Changes.**
- `PetPress::press` returns, with no send, no latch and no GCD, from a spell-slot press whose record, player object or pet object is unresolved. The exit comes after the aura cancel, as in the reference.
- `arm_pet_gcd` is now called only for a resolved press, so the two guards are one.
**Tests** (`ui_pet/press_tests.rs`):
- a press with no pet object, no catalog row or no player object sends nothing;
- the aura cancel needs no player object;
- Follow, Stay and a reaction still send with the pet unheld;
- Attack still sends at the selection with the pet unheld.
Fixes#638🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>