## TL;DR

The agent polls Concur waiting for an approval that may take days, and the poll loop hits the agent's timeout. Poll with a bounded number of attempts and long intervals, persist the watch state, and resume checking in a later run instead of blocking one run indefinitely.

## Error

```text
agent failed with timeout waiting for concur approval workflow state
```

## Steps

1. Replace tight polling with sparse checks: query the approval state every 15 to 30 minutes, not every few seconds. Expected: far fewer API calls and no rate-limit risk.
2. Set a maximum watch duration per run (for example, 2 hours); when it expires, save the report ID and current state. Expected: the run ends cleanly instead of timing out.
3. Persist the watch list to durable storage between runs. Expected: the next run picks up exactly the reports still pending.
4. On each check, compare the workflow state to the saved state; act only on transitions. Expected: the agent reacts to approvals without busy-waiting.
5. If Concur offers event notifications for your plan, subscribe to approval events instead of polling. Expected: near-instant reaction with zero polling.

## When to use

- An agent blocks waiting for a Concur approval workflow.
- Approvals legitimately take hours or days.

## When not to use

- The approval chain is broken (see the approval-chain skill).
- The agent needs the approval to proceed at all (redesign the flow to be resumable).

## Tool compatibility

- SAP Concur approval APIs; custom agent watch loops.

## Variant phrasings

### Agent timed out polling approval status

Same failure, shorter wording.

### Approval watch exceeded run budget

The scheduler phrasing of the same timeout.

## Why it happens

Human approvals operate on human timescales. An agent that waits synchronously for a days-long process will always outrun its own time budget; the watch must be resumable across runs.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_2DucxQu9on72GyOH1QOpjQ
