Skip to content
awesome-applied-ai
← Design problems

19Orchestration & Protocols

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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.