Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.
Stop mistaking a quiet connection for a closed one
Sending worked once after signing in and never again. jolt's TLS sockets carry
a 30-second receive timeout, so a channel with nothing to say reads nothing
without being closed — and the reader took that for EOF, announced a
disconnect, and cleared the connection. Everything after that went into the
buffer the user was looking at and nowhere else: the message appeared, and no
one received it. Guests rarely saw it because a busy channel never idles that
long, and OAuth put every signed-in user on TLS.
So a quiet stretch is now a quiet stretch. Past 45 seconds it earns a PING,
and only silence after that counts as gone — which is the ping-timeout
detection the client never actually had.
TLS also stopped being written from two threads at once. OpenSSL is driven
here through a pair of memory BIOs with no locking of its own, and the reader
parks inside SSL_read for the whole timeout; queueing lines for the reader to
flush removes the question entirely. That wants a short poll, so TLS sockets
now time out every 200ms — which is also the longest a line waits to go out.
FRQ_TRACE=1 prints every line in and out. It is what turned this up, along
with the discovery that the test observer watching from outside had been dying
of its own unanswered pings and reporting the app's messages as lost.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>