## TL;DR
Persist the pagination cursor before backing off, and resume from it after the wait. The scan is abandoned because the agent loses its place during the backoff.

## Error
```text
(scan stopped at 40 percent after 429 responses; no resume attempted; no error text)
```

## Steps
1. Confirm the abandonment: the agent log shows 429s followed by exit, with no resume. Expected: the failure mode confirmed.
2. Add cursor persistence: write the current page token or offset to durable state before sleeping for backoff. Expected: the place saved.
3. On wake, read the cursor and continue the scan from there instead of restarting. Expected: resume logic in place.
4. Re-run a throttled scan. Expected: it pauses on 429s and completes.

## When to use
- Scans stop partway after 429 responses
- The agent has backoff but no resume
- Large tenants always trigger throttling

## When not to use
- The scan fails without any 429 (a different error)
- The API has no pagination cursor (page by offset or filter instead)
- Throttling never happens (the resume logic is still good hygiene)

## Tool compatibility
Any paginated license API (Okta, Graph, Salesforce, Slack).

### Variant phrasings
### agent restarts from page one after backoff
That re-fetches and re-throttles. Persist the cursor to avoid it.

### cursor lost when the agent process restarts
Write the cursor to disk or a state store, not just memory.

## Why it happens
Backoff without state is just a pause before giving up. The scan's position lives in memory, so anything that interrupts the run (exit, restart, timeout) loses it.

## Provenance

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