Timeout Is Not Failure: The State Your AI Agent Is Missing An engineer from the project argues that AI agents must treat network timeouts as a distinct 'outcome_unknown' state rather than as failures or successes, to prevent duplicate operations in production. The proposed state machine includes a reconciliation loop that queries external systems for proof of effect, and uses intent fingerprints for idempotency when APIs lack native support. When an AI agent's HTTP request or browser tool call times out, what does your system record? If it records failed , the agent has a blind spot. A network timeout does not mean the operation failed on the remote server; it means the connection closed before the client received the answer. If the server processed the mutation, retrying the call blindly will create a duplicate artifact: a double payment, a duplicate ticket, a repeat email, or a redundant article. If it records succeeded , it is hallucinating certainty. The missing state is outcome unknown —a first-class operational status that halts automatic retries, records the unconfirmed mutation, and hands off execution to an explicit reconciliation loop. In our previous post, we discussed why agents need action receipts https://dev.to/anasbuilds997/your-ai-agent-doesnt-need-more-memory-it-needs-receipts-1e3m rather than purely semantic memory. Following valuable discussions with practitioners on distributed systems and memory boundaries, this article turns that concept into a concrete, testable state machine you can drop into any production agent framework. Not all exceptions are created equal: php Intent Recorded | v Attempting Transport --- DNS / Local Socket / Auth error --- REJECTED / SAFE TO RETRY | Bytes sent | v Awaiting Response --- Connection Timeout / Drop / 504 --- OUTCOME UNKNOWN Treating post-send ambiguity as a failure is the root cause of automated duplicate storms. Here is the complete lifecycle of a guarded agent action: | State | Type | Description | Allowed Next Transitions | |---|---|---|---| planned | Transient | Intent recorded locally with safe payload fingerprint. | submitted , rejected | submitted | Transient | Bytes sent to remote endpoint; awaiting response. | succeeded , rejected , outcome unknown | outcome unknown | Suspended | Network dropped or timed out after submission. Retries blocked. | reconciling , manual review | reconciling | Active | Querying external system for proof of effect. | succeeded , safe to retry , manual review | succeeded | Terminal | External ID verified via response or readback. | None | safe to retry | Terminal | Absence of effect proven via authoritative readback. | None new intent required | rejected | Terminal | Server returned deterministic client error 4xx . | None | manual review | Terminal | Absence/presence cannot be proven programmatically. | Human intervention | In payment engineering, distributed consensus is achieved through at-least-once delivery paired with a server-side deduplication key an Idempotency Key . When an external platform natively supports idempotency headers such as Idempotency-Key: