Skip to main content

Reason codes

Every policy decision records exactly one reason code — the branch of the decision chain that produced it. The Policy page shows the label; hovering shows the raw code, which is what you'll see in exports, the API and alert rules. Each code always carries the same effect.

Codes marked Did not hold record a control that was reached and didn't hold — machinery failing open, timing out or being unreachable. The app highlights them, the Control Library counts them as Degraded, and the default alert rules fire on them.

Denials​

Checked first, most containing first. See Approvals and risk appetite for the order.

CodeLabelMeaning
denied_scope_containedScope containedThe organisation's gateway access is contained, so nothing under it may run.
denied_killswitchedKill switch activeA kill switch is active for this subject; running servers were terminated.
denied_unknown_identityUnknown identityThe calling agent identity isn't registered with the gateway.
denied_identity_containedIdentity containedThis agent identity is quarantined or killed.
denied_server_unknownUnknown serverThe MCP server isn't one this project has registered.
denied_no_entitlementNo entitlementThe identity hasn't been granted this server or tool.
denied_surface_unreviewedSurface unreviewedThe server changed the tools it advertises and the change hasn't been acknowledged.
denied_not_allowlistedNot allowlistedThe tool isn't on the allowlist for this caller.
denied_rbacInsufficient roleThe caller's role doesn't permit this.
denied_builtin_disabledBuilt-in disabledThe organisation's policy disables this built-in tool.
denied_subagent_not_grantedSub-agent not grantedThe agent may not invoke this sub-agent.
denied_untrusted_contextUntrusted contextUntrusted content had entered the context, and this tool must not run after that.
denied_model_not_entitledDenied model not entitledThe organisation isn't entitled to use this model.
denied_route_classificationDenied route classificationThe data classification isn't allowed on this model's route.
denied_model_killswitchedDenied model killswitchedA kill switch is active for this model.

Approval posture​

Decided when a tool is attached to an agent.

CodeEffectLabelMeaning
require_approval_pinnedApproval requiredApproval pinned onSomeone set this resource to always require approval.
require_approval_critical_guardApproval requiredCritical-risk guardCritical-risk resources always require a person.
require_approval_appetite_gateApproval requiredAbove risk appetiteThe risk is at or above the tier this project tolerates without approval.
require_approval_unclassifiedApproval requiredUnclassified resourceThe resource carries no risk classification, so approval is required until it does.
allowed_pinnedAllowedApproval pinned offSomeone set this resource to never require approval.
allowed_below_appetiteAllowedWithin risk appetiteThe risk is below the tier requiring approval.
allowed_bypass_allAllowedAppetite bypasses allThe project's risk appetite requires approval for nothing.

At call time​

CodeEffectLabelMeaning
allowedAllowedAllowedThe call was permitted.
allowed_internal_callerAllowedInternal callerThe caller is the platform itself rather than an agent.
allowed_approval_dischargedAllowedApproval dischargedApproval was required and the caller carries the approval.
require_approval_undischargedApproval requiredApproval not dischargedApproval is required and nothing has discharged it.
allowed_builtin_enabledAllowedBuilt-in enabledThe organisation's policy enables this built-in tool.
allowed_builtin_defaultAllowedBuilt-in defaultThe organisation hasn't configured this built-in, and the default is to allow it.

When no decision could be obtained​

Recorded by an enforcement point that couldn't get a decision, so a refusal for that reason is never mistaken for a policy that said no.

CodeEffectLabelDid not hold
denied_pdp_unavailableDeniedPolicy engine unavailableYes
denied_no_caller_contextDeniedNo caller contextYes

How an approval was resolved​

Recorded when a person was (or couldn't be) asked to approve a call. Each links to the oversight record holding who decided and when.

CodeEffectLabelMeaningDid not hold
discharged_human_approvedAllowedApproved by a personA person was asked and approved.
discharged_human_rejectedDeniedRejected by a personA person was asked and refused.
discharged_timed_outDeniedApproval timed outA person was asked and didn't answer in time.Yes
discharged_autonomous_refusedDeniedRefused, no humanThe run had no person to ask, so it refused rather than proceeding.
discharged_no_channelDeniedNo approval channelNobody could be asked: the run had no channel to a person at all.Yes
discharged_auto_approved_fail_openAllowedAuto-approved (fail-open)The enforcement point approved on its own because the machinery it needed was unavailable.Yes

Codes without a label​

If a decision carries a code the app has no label for — including the three model codes above — the app shows the raw code turned into words (for example, denied_model_not_entitled reads "Denied model not entitled") rather than leaving it blank.