49f50c68a0
Review-pass findings on the lazy-init deferral: - No-op guard: the codex app-server usage callback assigns compressor.context_length on EVERY response (same window each time). The setter unconditionally invalidated the derived budgets, wiping runtime corrections applied directly to threshold_tokens / tail_token_budget (aux-context threshold sync) — those persisted on main's eager init. Same-value assignment is now a no-op. - Re-floor on genuinely new window: the setter invalidates budgets but previously kept the stale threshold_percent, so a codex window switch recomputed threshold_tokens from the new window with the old model's floored percent. Re-apply the raise-only small-context floor from _base_threshold_percent so percent and tokens derive from the same window (guarded with getattr for object.__new__ test instances). - Init log extracted to _emit_init_summary_once() and also fired from the setter path, so a consumer assigning context_length before any read no longer strands the startup line forever. - threshold_tokens getter resolves the window into a local before reading threshold_percent — correctness no longer depends on left-to-right argument evaluation order. - reasoning_timeouts: fix inaccurate 'tuples are immutable' comment (the container is a list; safety comes from build-once-at-import), document why the slug stays in the tuple. Adds TestContextLengthSetterCoherence (3 tests): same-value assignment preserves overrides; new-window assignment re-floors both directions.