SlackClient._call()'s retry loop catches only httpx.TimeoutException. Other transport errors —
ConnectError (DNS failure, connection refused), ReadError/WriteError (connection reset),
RemoteProtocolError — are siblings under httpx.TransportError, not subclasses of
TimeoutException, so they bypass the retry entirely and abort the sync on first occurrence.
Location: devrag/utils/slack_client.py:83-97
Suggested fix:
Widen the caught exception to the common base:
try:
resp = self._client.post(endpoint, data=data)
except httpx.TransportError:
if last:
raise
time.sleep(self._backoff(attempt))
continue
httpx.TransportError covers TimeoutException, ConnectError, ReadError, WriteError, and
RemoteProtocolError. If a narrower set is preferred, catch the explicit tuple instead. Consider
applying the same widening to GitHubClient._request() and JiraClient._request(), which have
related retry gaps.
Source: Surfaced by /engineer-agent audit-code (June run); re-verified by hand against HEAD d97b2eb on 2026-07-15, confidence high.
SlackClient._call()'s retry loop catches onlyhttpx.TimeoutException. Other transport errors —ConnectError(DNS failure, connection refused),ReadError/WriteError(connection reset),RemoteProtocolError— are siblings underhttpx.TransportError, not subclasses ofTimeoutException, so they bypass the retry entirely and abort the sync on first occurrence.Location:
devrag/utils/slack_client.py:83-97Suggested fix:
Widen the caught exception to the common base:
httpx.TransportErrorcoversTimeoutException,ConnectError,ReadError,WriteError, andRemoteProtocolError. If a narrower set is preferred, catch the explicit tuple instead. Considerapplying the same widening to
GitHubClient._request()andJiraClient._request(), which haverelated retry gaps.
Source: Surfaced by
/engineer-agent audit-code(June run); re-verified by hand against HEADd97b2ebon 2026-07-15, confidence high.