ca753b96cb
Independent review finding on the merged #95980: _apply_live_compression_config only acted on PRESENT keys, so removing tail_mode / model.context_length / target_ratio / model_thresholds / proactive_prune_* / protect_last_n / min_tail_user_messages / threshold / idle_compact_after_seconds from config.yaml left stale values active in live sessions forever (probe-verified: all six stale after applying empty mappings). Absence now restores the normalized default — or the model-derived value — through the SAME derivation the construction path uses: - ContextCompressor ctor defaults read off its real __init__ signature (no hardcoded copies to drift) - compression.threshold removal re-derives via agent_init's _resolve_compression_threshold (Codex gpt-5.4/5.5 + spark autoraise included) - model.context_length removal drops the config override and forces re-inference through the deferred get_model_context_length resolution, which also re-applies the small-context threshold floor - model_thresholds removal clears stale per-model overrides from the live threshold; tail_mode falls back to the ctor's 'lean' (the old present-key path normalized invalid values to 'legacy', diverging from the compressor's own fallback) Also fixes proactive_prune_min_reclaim_tokens's present-but-null default (was 0; the real default is 4096). Refs #94724