> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ctrlrun.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# InterruptApprovalProvider

> An `ApprovalProvider` whose `wait()` routes through a framework's own primitive.

`ctrlrun.InterruptApprovalProvider` — class, defined at `src/ctrlrun/adapter.py:209`

```python theme={null}
class InterruptApprovalProvider()
    def __init__(store: ApprovalStore, interrupt: FrameworkInterrupt, clock: Callable[[], datetime])
```

An `ApprovalProvider` whose `wait()` routes through a framework's own primitive.

That is the whole mechanism of SPEC-v0.5 §3: `@protect(wait=True)` raises `ApprovalRequired`,
catches it, calls `wait()`, and re-presents the same proposal under `with_approval`. The
reservation is taken only on that second pass, which is why an approval gate needs none of
`Suspended`'s machinery -- a human deliberating for an hour pins nothing.

**The operator constructs it**, on the line where they choose the policy, the store and the
identity provider:

control = Control(policy, store,
approvals=InterruptApprovalProvider(store, MyInterrupt()),
identity=..., authority=...)

An adapter never constructs a `Control` (SPEC-v0.5 §2.3). Everything it must not choose --
the identity provider, the authority document, the clock, the environment, the mode -- is
chosen there, by the person who deployed it.

## Next

* [Python API index](/reference/api/index).
* [Get started](/get-started/quickstart) · [Why](/why).


## Related topics

- [Adapters](/adapters.md)
- [Claims](/CLAIMS.md)
- [Python API](/reference/api/index.md)
- [FrameworkInterrupt](/reference/api/FrameworkInterrupt.md)
- [Use the LangGraph adapter](/guides/langgraph-adapter.md)
