Each action started a thread that read the socket field once it ran; a disconnect in between cleared it, and the user saw "Could not join channel: NullPointerException". Actions now capture the socket when they are issued and run on a pool that lives as long as the connection. What fails because the connection went away is no longer reported as an error. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>