8cc379b528
The fail-closed gate lived only in compress_context(), but two native lossy owners compact without ever crossing it (review on #93996): - codex app-server: in "native"/"off" auto-compaction mode (native is the default) Hermes preflight is skipped and the codex agent compacts its own thread inside run_turn() — the compress_context() rejection was unreachable. init_agent now refuses checkpoint_required together with api_mode=codex_app_server (BLOCKED_MISSING_PREREQUISITE, extracted as a testable guard), and run_codex_app_server_turn() fails closed as defense in depth before a turn can reach the codex-owned boundary. - Responses server-side native compaction: native_compaction_context_management() now returns None while the gate is armed, so context_management never goes on the wire and the checkpoint-aware Hermes compressor stays authoritative. The suppression is logged once per process, not silently applied. Regressions: checkpoint_required + app-server raises before run_turn() (the session is never created); checkpoint_required keeps context_management off the wire while the plain configuration still produces it; the init guard refuses exactly the incompatible pair. Docs and cli-config.yaml.example describe both bindings. Refs #93986