chamber: bound RPC calls with a hard wall-clock deadline Verified

Channels were created with :timeout nil, so ag-grpc applied no
default per-call timeout. ag-grpc's own per-call deadline (when one
is set) only wraps the receive path in call-unary — ensure-connected
runs outside it — so a wedge during TCP/TLS handshake or anywhere in
the gRPC stack would block the Hunchentoot worker indefinitely. The
chamber-or fallback never got a chance to fire, and worker threads
piled up until the server stopped serving any git-reading route.

Add :chamber-rpc-timeout (default 10s), use it as the channel default
timeout, and wrap chamber-call in bt2:with-timeout as a preemptive
hard deadline. On timeout, close + drop the cached channel so the
next call rebuilds it instead of reusing a half-open one.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Anthony Green2026-05-26 19:33:26 -0400 0f439fa7b59c84664641a980eda1dfe9f4be5f1c
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>