---
id: "0004"
date: 2026-03-12
status: Accepted
supersedes:
superseded-by:
affected-paths: [lib/relay/http_client.rb]
affected-components: [http]
---

# 0004 — Cap outbound HTTP timeouts at five seconds

## Context

A single hung receiver held a delivery open for two minutes with the stdlib default timeouts, blocking everything queued behind it.

## Decision

HttpClient sets open_timeout and read_timeout to five seconds. A receiver that cannot accept a small JSON POST within five seconds is treated as failed and handled by the retry policy.

## Consequences

A hung receiver costs at most ten seconds per attempt. Genuinely slow-but-healthy receivers will see more retries; none have surfaced in practice.

## Alternatives rejected

Per-endpoint configurable timeouts rejected: no current need, and it invites unbounded values creeping back in. Thirty-second timeouts rejected: still long enough to stall the queue noticeably.
