core/tests/test_ask_serving_gate.py
Shay 3cfaaf9153
feat(config): add explicit default-dark serving gate fields
Adds explicit default-false RuntimeConfig ask_serving_enabled and verified_serving_enabled fields while preserving default-dark helper behavior. Includes focused ASK/VERIFIED gate tests and cross-gate independence coverage. No pass_manager wiring, runtime wiring, verify.py wiring, served behavior, or CLAIMS/metric movement.
2026-06-09 10:24:28 -07:00

47 lines
1.5 KiB
Python

"""ASK serving gate — default-dark invariant.
This is deliberately narrower than serving integration. It proves the post-scoping
kill-switch predicate is dark unless an operator/config object explicitly opts in.
No chat/runtime wiring, no pass-manager emission, no carve-out retirement.
"""
from __future__ import annotations
from dataclasses import dataclass
from core.config import DEFAULT_CONFIG, RuntimeConfig
from core.epistemic_questions.serving_gate import ask_serving_enabled
@dataclass(frozen=True, slots=True)
class _LegacyConfig:
"""A pre-field config shape: absence of the flag must mean dark."""
unrelated: bool = True
@dataclass(frozen=True, slots=True)
class _OptInConfig:
ask_serving_enabled: bool
def test_default_runtime_config_keeps_ask_serving_dark() -> None:
assert hasattr(RuntimeConfig(), "ask_serving_enabled")
assert RuntimeConfig().ask_serving_enabled is False
assert DEFAULT_CONFIG.ask_serving_enabled is False
assert ask_serving_enabled(DEFAULT_CONFIG) is False
assert ask_serving_enabled(RuntimeConfig()) is False
def test_missing_flag_is_dark_for_legacy_config_shape() -> None:
assert ask_serving_enabled(_LegacyConfig()) is False
def test_gate_only_lights_on_explicit_truthy_opt_in() -> None:
assert ask_serving_enabled(_OptInConfig(False)) is False
assert ask_serving_enabled(_OptInConfig(True)) is True
def test_none_uses_default_config_and_stays_dark() -> None:
assert ask_serving_enabled() is False