make ClientLifecycleMode::Auto own conservative modern-to-legacy lifecycle negotiation
recognize correlated METHOD_NOT_FOUND, INVALID_REQUEST, and INVALID_PARAMS responses
recognize unsupported-version failures that explicitly reject the attempted modern version, including known initial HTTP 400 responses with id: null and no supported-version list
fall back after initial HTTP 404/405 while rejecting 401/403, unrelated IDs, established-session failures, arbitrary messages, and unknown, mixed, or future protocol versions
expose typed HTTP status and response body data consistently for reqwest, custom HTTP adapters, and Unix-socket transports
keep the HTTP worker available for a real legacy initialize retry without fabricating a JSON-RPC response
Downgrade policy
Auto mode retries legacy initialization only when the discovery probe provides explicit legacy evidence:
a correlated -32601, -32600, or -32602 response
an explicit rejection of the attempted modern protocol version, with any advertised versions exclusively historical
a recognized initial null-ID prevalidation response
an initial HTTP 404 or 405
Authentication failures, unrelated response IDs, established-session errors, malformed or arbitrary errors, and unknown/mixed/future version evidence fail without downgrade.
Transport behavior
HttpStatusError carries the original status and body independently of the HTTP backend. Valid JSON-RPC errors in an initial HTTP 400 continue through normal modern-version negotiation; raw prevalidation failures remain typed transport errors that Auto mode can inspect. When a downgrade is safe, Auto sends a real legacy initialize request through the still-live transport worker.
Custom StreamableHttpClient implementations can participate by returning UnexpectedHttpStatus(HttpStatusError) for non-success discovery responses.
Validation
full rmcp suite with the documented non-local feature set
focused lifecycle, reqwest, custom-adapter, and Unix-socket integration suites
This is intended to let Codex remove its complete legacy_discovery_fallback_response workaround while preserving deployed-server interoperability and downgrade safety.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Downgrade policy
Auto mode retries legacy initialization only when the discovery probe provides explicit legacy evidence:
Authentication failures, unrelated response IDs, established-session errors, malformed or arbitrary errors, and unknown/mixed/future version evidence fail without downgrade.
Transport behavior
HttpStatusError carries the original status and body independently of the HTTP backend. Valid JSON-RPC errors in an initial HTTP 400 continue through normal modern-version negotiation; raw prevalidation failures remain typed transport errors that Auto mode can inspect. When a downgrade is safe, Auto sends a real legacy initialize request through the still-live transport worker.
Custom StreamableHttpClient implementations can participate by returning UnexpectedHttpStatus(HttpStatusError) for non-success discovery responses.
Validation
This is intended to let Codex remove its complete legacy_discovery_fallback_response workaround while preserving deployed-server interoperability and downgrade safety.
Fixes #1040