Human approval across a three-day pause
Any transaction above $10,000 requires human approval. Approvers respond in anywhere from four hours to three days. The agent currently holds an open connection and times out. Redesign.
The constraint. A multi-day pause cannot live in process memory. The run must suspend to durable storage, release every resource, and resume in a different process — quite possibly a different build, since three days spans at least one deploy.
- 01Interrupt is a state, not an exception. The run persists its full state, emits the approval request, and exits. Nothing stays resident, nothing holds a connection, and cost during the pause is storage only.
- 02Resumption is an event. The approval webhook rehydrates state from the checkpoint and continues. Polling for approvals across 10,000 suspended runs is a design you will regret.
- 03State must survive schema change. Version the persisted state. On resume, either migrate it or fail explicitly with an explanation — never deserialize optimistically into a changed shape.
- 04Re-validate preconditions on resume. The world moved for three days. The invoice may be paid, the customer may have churned, the price may have changed. Resume means re-check then continue, not continue.
- 05The approval payload is a product surface. The approver needs a readable diff of what will happen and why, not a JSON dump of agent state. Get this wrong and approvers rubber-stamp, at which point the control is theatre and you have added three days of latency for nothing.
- 06Expiry is a policy decision. Decide explicitly what happens at day seven — escalate, expire, auto-reject. Auto-approve is never the answer, and leaving it undefined means runs accumulate silently forever.
Protocol note. MCP revision 2026-07-28 replaced server-initiated requests with Multi Round-Trip Requests: the server returns an InputRequiredResult and the client re-issues the original request carrying inputResponses. That is a request-response shape for gathering input, not a suspension mechanism. A three-day approval still needs the tasks extension or your own durable layer underneath — and with SSE resumability removed, holding a stream open is no longer even a bad option, it is not an option.
Stack. Temporal signals, which is the textbook fit — a workflow can wait days at no compute cost and receive the approval as a signal. LangGraph interrupt() with a Postgres checkpointer if you are already on LangGraph. An in-memory queue is disqualified by the three-day requirement alone.
Where answers fail. Designing the happy path and omitting expiry, deploy survival, and precondition revalidation. Those three are the entire difference between a demo and a system.