Rejection Reasons

X-Fairvisor-Reason is set on reject responses.

Core reasons

Reason Meaning
no_bundle_loaded No active bundle is loaded
kill_switch Request matched an active kill switch
token_bucket_exceeded Token bucket denied request
budget_exceeded Cost budget exhausted
circuit_breaker_open Policy circuit breaker is open
loop_detected Loop detector threshold exceeded

LLM-specific reasons

Reason Meaning
prompt_tokens_exceeded Prompt estimate exceeded max prompt limit
max_tokens_per_request_exceeded Prompt + completion reservation exceeded per-request cap
tpm_exceeded Tokens-per-minute budget exhausted
tpd_exceeded Tokens-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).