b5f072e2ce
The shared core applied `has_content_to_compress(head) is False -> nothing_to_do` on every surface, where origin/main only had it in the gateway handler. That predicate only knows the local summarizer's window: on CLI/TUI/ACP, `_compress_context(force=True)` still routes codex_app_server sessions to native compaction before any local-compressor check, and `ContextCompressor.compress` commits the phase-1 tool-result prune / blank-echo drop even when no summary window exists -- so the gate wrongly skipped real work there. It is now an opt-in `skip_without_window` that only the gateway passes, restoring each surface's prior behavior. Review follow-up on #109610.