9577d66317
A pooled remote backend (Bot Mode, group chat) keeps its descriptor and SSH forward cached in the backend pool. When the remote Desktop relaunches, the remote process dies but the local forward stays LISTENing, so ensureRegistryBackend() keeps returning the dead descriptor and every dispatch to that machine fails until the app is restarted. The background sweep cannot cover this: revalidatePooledRemoteBackends() only runs from the renderer reconnect IPC, which never fires while the primary connection stays healthy. Validate the exact cached descriptor at dispatch time with a short /api/status probe (2.5 s). On failure, retire the pool entry and its SSH forward, then reconnect on demand. Concurrent dispatches share one retire/reconnect sequence through a RemoteRevalidationCoordinator keyed on the cached promise, and identity checks make a late failure from an old descriptor unable to tear down a replacement another caller already installed. Verified on a two-Mac setup (MacBook + Mac mini over SSH): after relaunching the Mac mini's Desktop, a group-chat turn from the MacBook now reaches the mini's backend and its reply lands, where it previously failed forever.