# MentorActionReasons class

> The MentorActionReasons class of Novior.MentorAgent.Abstractions.Models: The reason codes of MentorActionDecision.ReasonCode. They stay the same from one…

- URL: https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionreasons
- Verified with: MentorAgent 1.2.0
- Last updated: 2026-10-27
- Packages: Novior.MentorAgent.Abstractions

The reason codes of [`MentorActionDecision.ReasonCode`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractiondecision#reasoncode). They stay the same from one version to the next; a new one comes only in a minor version, and the CHANGELOG says so.

## Definition

Namespace: `Novior.MentorAgent.Abstractions.Models`. Package: `Novior.MentorAgent.Abstractions`.

`public static class MentorActionReasons`

```shell
dotnet add package Novior.MentorAgent.Abstractions
```

## Fields

### `Allowed`

`public const string Allowed = "allowed"`

[`MentorActionOutcome.Allowed`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome): the action requires no role, or the user holds one, and every `IMentorActionPolicy` lets it through.

### `AuthCheckFailed`

`public const string AuthCheckFailed = "auth-check-failed"`

[`MentorActionOutcome.Denied`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome): reading the user threw.

### `AuthNotConfigured`

`public const string AuthNotConfigured = "auth-not-configured"`

[`MentorActionOutcome.Denied`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome): the action requires a role and the host has no `AuthenticationStateProvider`.

### `AutoApproved`

`public const string AutoApproved = "auto-approved"`

[`MentorActionOutcome.Allowed`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome): in Native mode, an auto-approval rule let an action that asks for confirmation run without asking.

### `Completed`

`public const string Completed = "completed"`

[`MentorActionOutcome.Executed`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome): the action ran.

### `ConfirmationTimeout`

`public const string ConfirmationTimeout = "confirmation-timeout"`

[`MentorActionOutcome.Rejected`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome): nobody answered the confirmation within `ConfirmationTimeout`, so the action did not run.

### `Exception`

`public const string Exception = "exception"`

[`MentorActionOutcome.Failed`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome): the action threw.

### `LoginRequired`

`public const string LoginRequired = "login-required"`

[`MentorActionOutcome.Denied`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome): the action requires a role and nobody is signed in.

### `NobodyToConfirm`

`public const string NobodyToConfirm = "nobody-to-confirm"`

[`MentorActionOutcome.Denied`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome): the action, or a policy, asks for confirmation and nobody can give it — a task from another agent, a call to the MCP server. A policy's reason is in [`MentorActionDecision.Detail`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractiondecision#detail).

### `NotAuthorized`

`public const string NotAuthorized = "not-authorized"`

[`MentorActionOutcome.Denied`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome): an `IMentorActionPolicy` does not allow this user the action.

### `Operator`

`public const string Operator = "operator"`

[`MentorActionOutcome.ConfirmationRequested`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome), [`MentorActionOutcome.Confirmed`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome), [`MentorActionOutcome.Rejected`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome): the user was asked, and answered.

### `Policy`

`public const string Policy = "policy"`

[`MentorActionOutcome.Blocked`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome): an `IMentorActionPolicy` stopped the call. [`MentorActionOutcome.ConfirmationRequested`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome): a policy asked for the confirmation, which the action does not ask for itself; the answer is then [`MentorActionReasons.Operator`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionreasons#operator)'s, as for any other.

### `PolicyException`

`public const string PolicyException = "policy-exception"`

[`MentorActionOutcome.PolicyFailed`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome): an `IMentorActionPolicy` threw.

### `PolicyTimeout`

`public const string PolicyTimeout = "policy-timeout"`

[`MentorActionOutcome.PolicyFailed`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome): an `IMentorActionPolicy` did not answer within `ActionPolicyTimeout`.

### `RateLimited`

`public const string RateLimited = "rate-limited"`

[`MentorActionOutcome.Denied`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome): the caller is over `RateLimitPerUser` (MCP server).

### `ResultWithheld`

`public const string ResultWithheld = "result-withheld"`

[`MentorActionOutcome.Executed`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome): the action ran, and `OnToolResult` threw, so its result was withheld. The MCP server's caller gets an error result.

### `RoleMissing`

`public const string RoleMissing = "role-missing"`

[`MentorActionOutcome.Denied`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome): the user holds none of the roles.

### `SessionEnded`

`public const string SessionEnded = "session-ended"`

[`MentorActionOutcome.Stopped`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome): the session ended — the circuit, the hub connection or the request closed.

### `Stop`

`public const string Stop = "stop"`

[`MentorActionOutcome.Stopped`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome): Stop, `/mentor/cancel`, the MCP client cancelled the call, or the caller cancelled the A2A task — also after the confirmation, before the action started.

### `TurnEnded`

`public const string TurnEnded = "turn-ended"`

[`MentorActionOutcome.Stopped`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome): in Native mode, the turn ended before the action could run — the run failed after the confirmation, or the turn gave up after too many rounds of approvals.

### `Withheld`

`public const string Withheld = "withheld"`

[`MentorActionOutcome.Denied`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome): the MCP server does not publish the action — it asks for confirmation, a predicate keeps it back, or it requires roles and no `McpCallerPrincipal` is set.

---

- Previous: [MentorActionOutcome enum](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome.md)
- Next: [MentorActionRequest record](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionrequest.md)
