# MentorActionDecision record

> The MentorActionDecision record of Novior.MentorAgent.Abstractions.Models: One decision of MentorAgent's tool gate, as IMentorActionObserver receives it…

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

One decision of MentorAgent's tool gate, as [`IMentorActionObserver`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-interfaces/imentoractionobserver) receives it. [`MentorActionDecision.ToolName`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractiondecision#toolname) and [`MentorActionDecision.DisplayName`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractiondecision#displayname) mean what they mean on [`MentorActionStarted`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionstarted). The call's arguments are never part of it. More properties may be added.

## Definition

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

`public sealed record MentorActionDecision : IEquatable<MentorActionDecision>`

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

## Constructors

`public MentorActionDecision()`

## Properties

### `AgentKind`

`public MentorAgentKind? AgentKind { get; init; }`

Which kind of agent asked for the action, or `null` on the MCP server, where the caller names the tool itself.

### `AgentName`

`public string? AgentName { get; init; }`

The name of the agent that asked for the action, when it has one.

### `CallId`

`public string? CallId { get; init; }`

The model's id for the call; on the MCP server, the id of the JSON-RPC request.

### `ConfirmationId`

`public Guid? ConfirmationId { get; init; }`

The [`ConfirmationRequest.ActionId`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/confirmationrequest#actionid) of the confirmation, on the decisions that belong to one: it links [`MentorActionOutcome.ConfirmationRequested`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome) to the answer.

### `ConfirmedBy`

`public ClaimsPrincipal? ConfirmedBy { get; init; }`

On [`MentorActionOutcome.Confirmed`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome), who confirmed: the caller of `POST /mentor/approve`; in a circuit, in the MAUI app and through the hub's `RespondToApproval`, the session's signed-in user.

### `Detail`

`public string? Detail { get; init; }`

The application's own words for the decision: the reason an `IMentorActionPolicy` gave for stopping the call or asking for a confirmation, on [`MentorActionOutcome.Blocked`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome), [`MentorActionOutcome.ConfirmationRequested`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome) and [`MentorActionOutcome.Denied`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome) ([`MentorActionReasons.NobodyToConfirm`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionreasons#nobodytoconfirm)). `null` otherwise.

### `DisplayName`

`public required string DisplayName { get; init; }`

The text shown to the user for the tool: the one [`IMentorStateService.OnActionExecuting`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-interfaces/imentorstateservice#onactionexecuting) carries.

### `ExceptionType`

`public string? ExceptionType { get; init; }`

On [`MentorActionOutcome.Failed`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome) and [`MentorActionOutcome.PolicyFailed`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionoutcome), the full name of the exception's type. Never its message.

### `Outcome`

`public required MentorActionOutcome Outcome { get; init; }`

What the gate decided.

### `ReasonCode`

`public required string ReasonCode { get; init; }`

Why, as a code that stays the same from one version to the next: one of the constants of [`MentorActionReasons`](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractionreasons).

### `RequiredRoles`

`public IReadOnlyList<string> RequiredRoles { get; init; }`

The roles the action requires, any one of which is enough; empty when it requires none.

### `SessionId`

`public string? SessionId { get; init; }`

An opaque id of the session the turn runs in — the circuit, the MAUI app's scope, the hub connection, the `/mentor/chat` request, the A2A task — the same for every decision taken in it. On the MCP server, a fingerprint of the MCP session id, never the id itself; `null` when the call has no session.

### `Surface`

`public required MentorActionSurface Surface { get; init; }`

Where the call came from.

### `Timestamp`

`public required DateTimeOffset Timestamp { get; init; }`

When the gate decided, in UTC.

### `ToolName`

`public required string ToolName { get; init; }`

The tool's technical name, as the model or the MCP client called it (for example `cancel_order`).

### `TurnId`

`public string? TurnId { get; init; }`

An opaque id of the user turn, new for every message: every call the model makes while answering it has the same one. `null` on the MCP server, where there is no turn.

### `User`

`public ClaimsPrincipal? User { get; init; }`

Who asked for the action, or `null` when nobody is signed in.

---

- Previous: [MentorActionCount record](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractioncount.md)
- Next: [MentorActionInfo record](https://docs.mentoragent.net/api/novior-mentoragent-abstractions-models/mentoractioninfo.md)
