26f5643dc9
A 'session expired' / transport-closed failure can arrive AFTER the server already accepted and executed the request (proxy-synthesized 404s, pod rotation, ClosedResourceError firing mid-response). Auto-retrying a write-capable tool in that window risks a duplicate side effect that MCP offers no way to undo. The session-expired recovery path now consults the discovery-time readOnlyHint capture (same data the trust gate uses): only tools whose annotation is exactly True keep the reconnect+retry-once behavior. Write- capable calls still get the transport healed (reconnect, breaker reset on success) but return a structured outcome_unknown error telling the model to verify with a read before re-invoking. The OAuth 401 path keeps its retry for all tools: a 401 means the server demanded authorization before dispatch, so the call never executed — matching the upstream classifier's McpAuthRequiredError => safe rule. Fails safe: missing/unknown annotations classify as write-capable.