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

# ApproverIdentity

> How a deployment verifies who answered an approval (SPEC-v0.8 §2.3).

`ctrlrun.ApproverIdentity` — class, defined at `src/ctrlrun/approval.py:201`

```python theme={null}
from ctrlrun import ApproverIdentity
```

```python theme={null}
class ApproverIdentity
    def __init__(provider: IdentityProvider, roles_claim: str | None = None)
```

How a deployment verifies who answered an approval (SPEC-v0.8 §2.3).

**Opt in, then fail closed.** A `Control` built without one behaves exactly as 0.7.0 did;
one built with it refuses any approval whose row carries no `VerifiedApprover`, wherever
that approval came from and whatever the store did with the column.

A second instance of `v0.3`'s `IdentityProvider` and never the agent's: the agent's provider
reads what a proxy set for the agent, and a deployment where one object answers both doors
is one where the agent's own token can grant the agent's own approvals.

`roles_claim` names the claim this issuer puts roles in (§3.4). It lives here because it is
a property of the issuer and not of any one surface: the operator MCP server reads it where
`--approver-roles-claim` does not override it, and a surface that reads neither holds no
roles and so satisfies no control that names one.

## Next

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


## Related topics

- [Python API](/docs/reference/api/index.md)
- [VerifiedApprover](/docs/reference/api/VerifiedApprover.md)
- [Approve from your assistant](/docs/mcp/approve-from-your-assistant.md)
- [Authority and delegation](/docs/concepts/authority-and-delegation.md)
- [Threat model](/docs/THREAT_MODEL.md)
