"""IMP-33 u1 — AI fallback Settings defaults (locked). These defaults are the binding contract from Stage 2 plan (per-unit u1): - ai_fallback_enabled = False (master flag OFF; fallback path only) - ai_fallback_model = "claude-opus-4-6-20250415" - ai_fallback_timeout_s = 60.0 - ai_fallback_max_retries = 3 - ai_fallback_backoff_base_s = 1.0 - ai_fallback_backoff_cap_s = 8.0 - ai_fallback_backoff_jitter = 0.3 - ai_fallback_budget_per_run = 10 - ai_fallback_circuit_breaker_threshold = 5 Downstream u4 (client) MUST source timeout/retry/backoff/budget/circuit from Settings; inline literals are forbidden by Stage 2 plan. """ from __future__ import annotations from src.config import Settings def test_ai_fallback_master_flag_default_off() -> None: s = Settings() assert s.ai_fallback_enabled is False, ( "AI fallback master flag MUST default OFF (normal path AI=0 contract)." ) def test_ai_fallback_model_default_locked() -> None: s = Settings() assert s.ai_fallback_model == "claude-opus-4-6-20250415" def test_ai_fallback_retry_timeout_backoff_defaults_locked() -> None: s = Settings() assert s.ai_fallback_timeout_s == 60.0 assert s.ai_fallback_max_retries == 3 assert s.ai_fallback_backoff_base_s == 1.0 assert s.ai_fallback_backoff_cap_s == 8.0 assert s.ai_fallback_backoff_jitter == 0.3 def test_ai_fallback_budget_and_circuit_defaults_locked() -> None: s = Settings() assert s.ai_fallback_budget_per_run == 10 assert s.ai_fallback_circuit_breaker_threshold == 5