Skip to main content
This guide explains how Duvo handles things that go wrong during a Run — what the system retries automatically, what counts as a permanent failure, how to write AOPs that control recovery behavior, and how to prevent duplicate actions when a run executes more than once.

How Duvo Recovers from Transient Problems

When a Run hits a problem that is likely temporary — a network timeout, an overloaded external service, a rate-limit response — Duvo automatically returns the Run to the queue and retries it. You do not need to do anything. The Run will appear as Running or briefly as Pending in your Runs List while the retry is in progress. What counts as a transient problem:
  • Connection timeouts and network errors (ETIMEDOUT, ECONNRESET, socket hang up)
  • HTTP 429 Too Many Requests (rate limiting)
  • HTTP 502, 503, 504 (gateway errors and temporary service unavailability)
  • Brief overload on the Duvo infrastructure
How retries work: Duvo uses exponential backoff — each successive attempt waits longer than the previous one, up to a maximum of 60 seconds. The system tries up to a configured number of times before giving up. If the problem resolves during that window (which it usually does for transient errors), the Run continues normally. You will not see a Failed status for Runs that recovered through automatic retry.

When a Run Fails Permanently

Some failures cannot be recovered by retrying. Duvo marks the Run as Failed immediately in these cases: You can manually retry a failed Run from the Runs List — click the row to open the Run, then use the retry action. For case-based workflows, see Retrying and Updating Cases.

Understanding Run Statuses

A Run that ends without the agent explicitly completing, postponing, or handing over the underlying case is automatically marked Failed. This means every AOP that processes cases should clearly instruct the agent when and how to resolve each case.

AOP Patterns for Controlling Recovery Behavior

The agent follows your AOP instructions when deciding how to handle errors it encounters mid-run (as distinct from the system-level retry logic above, which handles failures before or during dispatch). Use these patterns to tell the agent how to behave when something goes wrong.
Use this when the condition needed to proceed may resolve on its own:
When the agent postpones a case, its status changes to Postponed with the scheduled retry time. At that time, Duvo automatically picks it up again.
Use HITL when you want a person to decide what to do rather than having the Run fail silently:
See Designing Human-in-the-Loop Workflows for guidance on choosing between approval gates and automatic failures.

Skip Semantics: Skipped vs Failed vs Postponed

These three outcomes look similar but mean different things:

When an operator rejects a HITL request

When an operator clicks Reject on an approval request, the agent receives a rejection signal. What happens next depends entirely on how your AOP handles it. Duvo does not automatically halt or retry the Run — your AOP must define the response. Common patterns:
Without explicit instructions for the rejection path, the agent may loop, stall, or make an unsafe assumption. Always define what a rejection means for your workflow.

When condition data is missing

If the agent reaches a conditional step but the data needed to evaluate the condition is absent:
Or:

Idempotency: Preventing Duplicate Actions on Retry

When an agent retries a step after an earlier attempt failed, there is a risk of performing an action twice — sending two emails, creating two records, charging a customer twice. Use these patterns to prevent that.

The check-before-write pattern

Always check whether the action has already been completed before performing it:

Tag actions with a reference ID

Use a stable identifier from your source data (PO number, order ID, ticket ID) to make each action uniquely identifiable:

Per-connection idempotency patterns


Where to Look When Something Goes Wrong

Runs List

The Runs List (Past Runs in the sidebar) shows the status of every Run across all your agents. Use the Needs attention quick filter to surface Failed and Needs Input Runs immediately. For each failed Run, the evaluation badge shows the severity of any issues found. Click the badge to see a breakdown of what went wrong and why.

Case timeline

For cases processed through Queue, open the case detail view to see the full processing history — which agent handled each stage, when it ran, and what the outcome was. If a case has been retried multiple times, each attempt appears in the timeline.

Reading a failure

Common failure patterns and what they indicate:

Designing Human-in-the-Loop Workflows

Escalation patterns, fallbacks, and approval thresholds

Queue

Case statuses, postpone behavior, and manual retry

Runs List

Monitoring status across all agents