4aa9d03da2
A worker's tool execution is single-threaded, so two bridge_ask calls from the same session can only be a transport retry — yet openAsk minted a fresh turnId each time and both raced to resolve the primary's single forward waiter, the loser returning NO_WAITER and leaving a dangling turn (observed as turnId #2 in the live e2e). Now openAsk is idempotent per session: a second open ask coalesces onto the existing turnId + answer future (fresh=false), and only the fresh owner surfaces the question and tears the turn down. closeAsk clears the per-session index (conditional by value) so a later ask reopens fresh. Implemented by an off-subscription worker delegated over the bridge; reviewed and validated on the primary (IDE-clean, mvn clean install 149 green, +2 tests: concurrent double-ask coalescing + post-close reopen).