Fail-closed & degrade-closed
Why raxit fails closed, and degrades closed when the control plane is unreachable.
If the policy engine errors, if the audit write fails, if a required cloud state service is unreachable, if a warrant's consume-once counter can't be confirmed — none of those produce a permit. They all produce a deny, with a reason code that names exactly what broke:
deny.eval_error the policy engine raised an internal error
deny.audit_error the audit write failed before the decision was returned
deny.control_plane_unreachable a state-bearing decision needed the control plane, which was down
deny.warrant_state_unavailable the shared warrant counter couldn't be reached; never upgrade under uncertainty
deny.credential_error the credential broker failed to mint a short-lived credentialThe mental model: every error is more restrictive, never less
raxit's rule is simple to state and easy to verify by reading the reason codes above: every failure mode narrows what's allowed, never widens it. A broken dependency, a timeout, an unreachable service, a malformed config value — none of these are ever interpreted as "when in doubt, let it through." The system has exactly one direction it fails in.
This shows up at three different layers:
- Cedar evaluation. A policy-condition error is
deny.eval_error, not a fallthrough to permit — see step 2 of the decision resolution chain. - Audit-before-execute. The Decision Provenance Record is
fsync'd before the decision returns. If that write fails, the decision flips todeny.audit_error— an action can never run without a corresponding audit record already committed. See Audit & the DPR chain. - Warrant/state consistency. A warrant that would upgrade a
defertopermitonly does so if the shared, cross-replica consume-once counter gives a definitive answer. If that state authority is unreachable or ambiguous, the upgrade is refused (deny.warrant_state_unavailable) rather than guessed at — never "assume it wasn't used yet."
Degrade-closed: what happens when the control plane goes away
Some decisions need shared state that only the control plane can answer — cross-replica taint,
warrant consumption, saga journaling. When that control plane is unreachable, the call denies
(deny.control_plane_unreachable) rather than falling back to a local, possibly-stale answer
that could under-count a budget or miss a taint label. This is "degrade-closed": losing
connectivity to a dependency degrades the system toward more restrictive behavior, not less.
There is no permissive kill switch
RAXIT_GOVERNANCE is the one deliberate bypass — and it's intentionally narrow. It accepts
exactly two values, "on" or "off" (case/whitespace-insensitive); anything else, including
plausible-looking typos like "1" or "true", raises an error synchronously rather than
silently defaulting to either state:
RAXIT_GOVERNANCE=on # governed (default when unset)
RAXIT_GOVERNANCE=off # governance disabled — calls return a synthetic bypass permit
RAXIT_GOVERNANCE=1 # error: not "on" or "off"There is no third value that means "govern, but permissively" — off is a full, explicit bypass
you have to opt into with an exact string, not a dial you can nudge toward permissive.
fail_open is a dev-only, explicit opt-in
Some lower-level autopatch/drift machinery exposes a fail_open-shaped knob for local
development — e.g. RAXIT_DRIFT_MODE=warn downgrades an autopatch drift/tamper signal from a
hard abort to a logged warning that continues ungoverned. This exists for iterating on
integration code locally; it is not the production default (RAXIT_DRIFT_MODE defaults to
"fail-closed"), and it never appears in security.yaml itself — there's no default: allow
or equivalent authored-policy escape hatch. See
Rules & effects for the corresponding security.yaml rejection:
default allow is not supported; use enforce.
If you're chasing a specific deny.* code and want to know exactly what triggered it and how to
respond, the full table is in Reason codes.

