b274b346d8
Maintainer ruling (2026-08-23): a retried bot turn never mints a fresh session. retry_action() maps the #93091 item-1 reason enum to one of resume / compress_then_resume / none: - transient classes (runtime_offline, delivery_timeout, rate limit, server error) re-run the same Bot Chat session once; - context_overflow also re-runs the same session — the retried turn goes through the pre-API compaction pass in conversation_loop.py, which compacts the over-threshold transcript first (the one sanctioned context mutation); no fresh-session escape hatch exists; - auth/quota/config/model classes never auto-retry. Wired at both delivery surfaces (fix the class, not one site): bot_relay.deliver (relay handler) and _run_delivery (local message_agent runner). Failed deliveries now carry the classified reason in the structured error payload (error.data.reason). Sabotage-verified: with the retry blocks removed, 3 consumer tests fail; with them present, 22/22 pass.