CI / validate (pull_request) Failing after 6s
Fixes 4 critical reliability issues discovered during Zulip server outage recovery: 1. CLOSE-WAIT socket leak: _reconnect() now creates a fresh httpx.AsyncClient() when the queue expires, preventing stuck connection pool. Old client is explicitly aclose()'d. 2. Silent poll loop death: After sustained 502 errors, the poll loop was returning [] without logging — transport errors are swallowed by _api_call returning (None, 0). Added heartbeat logging every 5 minutes and silence detection warnings after 60s of no events. 3. HTTP client stuck pool: Added proactive client recreation after 20 consecutive empty polls (connection pool exhaustion detection) and periodic refresh every 500 polls (connection reuse limit). 4. Log spam: 502 error responses from Netbird contain full HTML pages — now truncated to 80 chars with newlines stripped. Also: - Support ZULIP_URL env var (in addition to ZULIP_SITE) - expose silence_seconds, consecutive_empty_polls, client_pool_resets in health stats - Reduced health callback interval from 600s to 300s