d3a1c46510
Every provider response carries usage.prompt_tokens — exact ground truth for the full request (system prompt + tool schemas + history). Context-size checks now anchor on the last main-loop response's usage and estimate only the messages appended since, instead of re-estimating the whole history with chars/4 heuristics and flat 1500-token image costs. The estimate error window shrinks from the entire conversation to one turn and self-corrects at every response. - agent/model_metadata.py: capture_usage_anchor() / anchored_context_tokens() with a structural base-message identity check that fails closed on any transcript rewrite. - agent/conversation_loop.py: anchor captured at the single main-loop usage site (MoA uses pre-fold aggregator usage; advisor/aux calls never anchor); pre-API pressure check prefers the anchor. - agent/turn_context.py: preflight compression estimate prefers the anchor. - agent/context_breakdown.py: /context display prefers the anchor. - Invalidation: compaction rewrite (conversation_compression), codex native compaction (codex_runtime), session reset/switch (run_agent), plus the fail-closed structural check for splices/micro-compaction. - Usage-less responses keep the previous anchor; no anchor -> pure estimation fallback (first request of a session).