Repository navigation
Conversation
Codex Review Summary: ✅ CompletedThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
@jokemanfire is on triage rotation this week and is the reviewer for this one. Labels come from the PR labeler. Please review the change. Automated triage. Labels are a first pass and the assigned maintainer has the final say. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ce07d77f97
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
|
Both review findings addressed in the latest push: Surface retained status during initialization — Preserve the typed error in quit_status — 370 lib tests pass, all-features check clean, clippy/fmt clean. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d944818fcc
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
|
Second round addressed in the latest push: Publish quit status before the receive channel closes — the worker task now holds a clone of Return the retained startup failure as a transport error — Keep the typed error until the receiver consumes it — the startup error is now shared via 370 lib tests pass (640 with auth), all-features check clean, clippy/fmt clean. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3e22abf26a
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
|
Third round addressed in the latest push: Preserve startup error variants for live senders — the shared ack now uses Recover quit status from failed fallback sends — Auto fallback errors now recover Validation: 794 all-feature lib tests pass, the 10 streamable HTTP status metadata tests pass, strict all-target Clippy and rustfmt are clean. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8a2d9c6ec3
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
|
Fourth round addressed in the latest push: Preserve the underlying startup error in Display — Avoid closing every fallback transport to poll worker status — Validation: 795 all-feature lib tests pass, both fallback regression tests pass, the 10 HTTP status metadata tests pass, and strict all-target Clippy/rustfmt are clean. |
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7cd491fc3b
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
|
Fifth round addressed in the latest push: Recover retained errors after legacy notification sends — fixed at the transport source rather than broadening client-side recovery. The legacy Added an integration regression for plain Validation: 795 all-feature lib tests, all 5 discover/startup integration tests, and all 10 HTTP status metadata tests pass. Strict Clippy passes for both all-target/all-feature and the enabled startup integration configuration; rustfmt is clean. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9a8a93c455
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
|
Sixth round addressed in the latest push: Preserve live errors during fallback recovery — fallback recovery now replaces only the synthetic channel-closed error. The initialized-notification 429 regression now runs in both plain Validation: 795 all-feature lib tests, all 6 startup integration cases, and all 10 HTTP metadata tests pass. Strict Clippy passes for all targets/features and the enabled startup integration configuration; rustfmt is clean. |
What
Fixes #1441 — a streamable-http startup handshake failure was reported as
WorkerQuitReason::Fatalwith the real typed error replaced by a syntheticTransportChannelClosed, and the terminal reason had no retained carrier, so an observer whose own timeout already fired lost the cause entirely.Implements options B and C from @jokemanfire's triage comment on #1441.
B — typed error in the terminal reason
WorkerQuitReason::StartupFailed { error, context }(additive; the enum is#[non_exhaustive]), carrying the real typed error instead of a synthetic placeholder.warn(they are ordinary lifecycle events — peer unreachable, TLS failure, auth challenge — not internal faults), addressing the 500+ spurious ERROR lines.streamable_http_client.rs: both the startup-POSTErrarm andexpect_initializednow produceStartupFailedwith the real error. When the in-flightsend()receiver has already gone away (its own timeout fired), the typed error is retained in the quit reason; when the ack succeeds, the real error's text is still captured into the quit reason's context so the cause is never masked.C — retain the terminal reason for late observers
WorkerTransportnow retains the worker's terminal reason in awatchslot, written exactly once when the worker task quits, so the reason survives the single fire-and-forget ack delivery window.Transport::quit_status()(defaultNone— stdio/io/ws/custom transports are unaffected) returns the cause as an ownedDynamicTransportError.QuitReasongains an additiveTransport(DynamicTransportError)variant; the service loop reads the retained status aftertransport.close()sowaiting()/close()callers learn why the connection ended rather than an undifferentiatedClosed.Transport— only abnormal termination carries a cause.Notes for reviewers
StartupFailed'serrorstays the typedE(per the triage discussion), not a generic parameter onQuitReason— the cause crosses the service API boundary asDynamicTransportError, which keepsQuitReasonnon-generic and non-breaking. The typed error itself is notClone, so it lives in exactly one place: the in-flight ack, or the retained quit reason when the ack receiver is gone. This matches the report's "exactly one delivery attempt" concern by adding the retained carrier.startup_failure_is_retained_in_quit_status): a worker whose startup fails retains its cause inquit_statuseven with noclose()pending at the time of death.Verification
cargo test -p rmcp --features client,transport-streamable-http-client-reqwest --lib: 370 passed, 0 failed (incl. the new regression test)cargo check -p rmcp --all-features: cleancargo clippy: no new warningscargo fmt --check: clean