Rejection Reasons

X-Fairvisor-Reason is set on reject responses.

Core reasons

ReasonMeaning
no_bundle_loadedNo active bundle is loaded
kill_switchRequest matched an active kill switch
token_bucket_exceededToken bucket denied request
budget_exceededCost budget exhausted
circuit_breaker_openPolicy circuit breaker is open
loop_detectedLoop detector threshold exceeded

LLM-specific reasons

ReasonMeaning
prompt_tokens_exceededPrompt estimate exceeded max prompt limit
max_tokens_per_request_exceededPrompt + completion reservation exceeded per-request cap
tpm_exceededTokens-per-minute budget exhausted
tpd_exceededTokens-per-day budget exhausted

Streaming reason

completion_tokens_exceeded may appear in streaming SSE error payloads when mid-stream completion limit is hit. It is not emitted as X-Fairvisor-Reason header in the normal reject path.

Shadow mode

In shadow mode, would-reject reasons are kept in internal decision metadata while HTTP response is allow (200).