Skip to content

Audit fail-closed granularity: block on auth/budget failure, allow on observability failure #485

Description

@Destynova2

Context

The most dangerous LiteLLM criticism (their own P0 "Stability Sprint", PR #34429) is fail-open budgets: on a Redis failure, requests could proceed and blow the budget even with fail_closed_budget_enforcement requested. For a regulated client, a budget is an authorization to consume, not just reporting.

grob is already fail-closed for budget: src/server/budget.rs:164/176 returns Err(BudgetExceeded) before the provider call, spend committed synchronously, and tests/…mod.rs asserts "dispatch must block on the policy budget cap". Good.

The delta

The analysis makes a sharper distinction we should prove we honour per subsystem:

  • Authorization / budget / policy backend unavailable → the request MUST be blocked (no successful reservation ⇒ no provider call).
  • Observability (audit sink, metrics, OTel) unavailable → the request MAY continue (availability preserved), with the degradation recorded.

Failing the wrong way in either direction is a bug: blocking on a metrics outage kills availability; continuing on a policy-engine outage silently grants access.

Ask

Audit each hot-path dependency and classify it explicitly:

Dependency On failure
budget reservation (spend store / policy cap) block
policy engine / HIT authorization block
deterministic DLP block
secret backend (OpenBao/GrobStore) at request time block
audit log write continue + flag
metrics / OTel export continue
pricing/token estimate continue (degrade)

Then add tests that inject each failure and assert the classified behaviour (property test style, alongside tests/enterprise/property_budget_test.rs). Document the table in an ADR so the contract is explicit.

Priority

Medium-high. The code is likely already correct for most rows; the value is a proven, documented contract rather than incidental behaviour.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions