What each raxit reason code means and how to respond to it.
Every decision carries a reason_code — in raxit audit tail, raxit explain, and the
[raxit BLOCKED] message an agent sees. This page lists all 68, grouped by family. Codes are
the stable wire vocabulary: third-party tools parsing audit records depend on these exact
strings.
The call timestamp is outside the configured clock-skew window.
Sync the agent clock, or raise context_guard.max_clock_skew.
deny.context_replay
The context sequence number is missing, malformed, or not strictly increasing.
Send a strictly increasing integer under context_guard.sequence_key.
deny.context_incomplete†
Documented as "a required context key is missing," but has no emission site anywhere in the codebase.
Don't expect to see this fire. If you're chasing a missing-context denial, look for defer.context_incomplete instead — that's the code that actually fires for this condition (as a suspend, not a deny).
†deny.context_incomplete is defined, registered, and hinted, but is currently dead —
grepping the source finds no call site outside the reason-code registry itself. Documented here
for completeness only; do not use it as a "this is how missing context denies" reference.
These are audit tags for operator actions on the policy itself, not decisions on an agent's tool
call — they show up in the audit trail when a human changes the active policy.
Code
Meaning
policy.rollback
An operator rolled back to a prior policy snapshot (raxit rollback).
policy.reload
An operator hot-reloaded the policy via POST /v1/reload or SIGHUP.
policy.apply
An operator applied a new policy version via raxit apply (validate → tests-gate → push).
Per the source: these are notDecision.ReasonCode values from a Cedar evaluation — a
compensation ("undo") call is governed normally and carries its own ordinary reason code (e.g.
deny.budget_exceeded). These are separate signals surfaced so a post-permit output-block's fate
is never silently swallowed.
Code
Meaning
What to do
compensation.build_failed
A compensatable tool's output was blocked, but compensation.tools[].arg_mapping couldn't resolve a source path from the original call's args — no undo was built.
Review the arg_mapping against what the tool actually received.
compensation.uncompensatable
A blocked tool's declared reversibility is irreversible (or declares no compensation) — nothing to undo.
Alert-only; review the blocked call manually.
compensation.undo_denied
The built undo call didn't itself permit when re-governed (deny or defer).
Review the undo's own Decision Provenance Record (DPR) (CompensationFor links back to the original call) and resolve manually.
compensation.terminal
A compensation ("undo") call's own output was blocked — an undo is never itself compensated (depth cap 1).
Review the undo call manually; this is terminal, no further auto-undo happens.
A non-sealed classifier's receipt was durably recorded to the audit log before its labels entered session taint.
classification.degraded
The configured classifier errored or was unreachable; the governor recorded this as evidence and either degraded to the sealed regex floor (on_classifier_unavailable: regex_degrade, the default) or surfaced the failure (fail_closed).
Several deny/defer pairs share the same detector but route differently by config: —
deny.budget_exceeded / defer.budget_exceeded (budgets.on_exceed), deny.spend_anomaly /
defer.spend_anomaly (budgets.anomaly.action), and deny.circuit_open /
defer.circuit_reattest (limits.breaker.on_open). These aren't redundant — each pair is the
same underlying condition, routed to a different resolution path by an explicit operator knob.