a3662bb32c
A pending clarify card binds Enter / 1-9 / A-Z / arrows on `window`, and inactive tabs stay MOUNTED, so every parked clarify keeps a live listener. Nothing in the handler asked whether the card was on screen: the first listener registered won, called preventDefault(), and the rest bailed on defaultPrevented. Registration order is mount order, not visibility. With two chats waiting on a question, answering the one in front of you sent `clarify.respond` for a background session's request instead — silently answering a question the user never saw and resuming that turn. The invariant is already stated one file over, in composer-focus-keys.ts: "a clarify card waiting in a background thread must not take the foreground composer's letter keys". `clarifyCardOwnsKey` honours it via queryVisible(); the card's own listener did not. That asymmetry is the bug — the key-ownership resolver and the key handler disagreed about which card is live. Export that lookup as `visibleClarifyCard()` and have both sides use it, so they cannot drift apart again. The card bails unless it IS the visible card, which also leaves the keystroke unprevented for the composer when the only pending card is hidden. Scoped by visible-card identity rather than `usePaneVisible()`: split zones each render their own active pane, so two cards can be visible at once and a per-pane visible flag would not disambiguate them.