Preserve voice transcription transport errors' cause and actionability - #15290
Merged
acarl005 merged 1 commit intoAug 19, 2026
Merged
Conversation
Contributor
Author
|
This PR was generated with Warp. Comment |
acarl005
marked this pull request as ready for review
August 19, 2026 00:42
TranscribeError::Transport was a unit variant that discarded the voice sinks report every non-quota failure, so ordinary network flakiness defaulted to actionable and flooded Sentry with a static, causeless message (~92k events / ~5.9k users since mid-July). Carry the source error, split non-429 statuses into their own variant, classify JSON contract failures separately from body reads that fail after headers, and register actionability so transport failures delegate to reqwest::Error::is_actionable(). QUALITY-1231
warp-agent-staging
Bot
force-pushed
the
factory/quality-1231-voice-transcribe-error-actionability
branch
from
August 19, 2026 01:07
9fda660 to
3f2974c
Compare
acarl005
approved these changes
Aug 19, 2026
acarl005
deleted the
factory/quality-1231-voice-transcribe-error-actionability
branch
August 19, 2026 01:30
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.


Description
Voice transcription transport failures (
Error: Failed to transcribe CLI voice inputand its GUI sibling) were one of the noisiest client Sentry surfaces (~90k+ events, ~6k users, ~3-4k/day), becauseTranscribeError::Transportwas a unit variant with no#[source], andTranscribeError::Deserializationwas too.ServerApi::transcribedropped the underlyingreqwest::Error(any non-429 HTTP status, and any failure reading/decoding the response body) after a locallog::warn!, so every event reached Sentry with an identical, causeless message and no way to tell connect vs. timeout vs. 5xx vs. a truncated body apart. BecauseTranscribeErrorwas never registered viaregister_error!/impl ErrorExt, it defaulted tois_actionable() == true, so ordinary network flakiness paged engineering on every occurrence.This mirrors the existing
AIApiErrortreatment (crates/warp_errors/src/reqwest.rs,impl ErrorExt for AIApiError, and itsDeserializationErrorsplit /from_transport_errorhyper-source walk) that a prior PR (#14292) applied to the multi-agent path but never touched voice.Changes
TranscribeError::Transportnow carries the sourcereqwest::Errorinstead of discarding it.ErrorStatus(http::StatusCode)variant instead of being collapsed into the unitTransport, so status is preserved.TranscribeError::Deserializationnow carries aDeserializationError(shared withAIApiError) instead of being a source-less unit variant.TranscribeError::from_json_errorclassifies areqwest::ErrorfromResponse::json(): a decode error whose source chain contains ahyper::Error(reqwest sometimes misreports a mid-stream disconnect/timeout as a decode error) or any other non-decode failure routes toTransport; a genuine decode failure routes toDeserialization(DeserializationError::Transport(_)). This mirrorsAIApiError::from_transport_error.impl ErrorExt for TranscribeError+register_error!(TranscribeError):Transportdelegates toreqwest::Error::is_actionable()(connect/request/body/decode, 429, 5xx, staging 403 → not actionable).ErrorStatusis not actionable for 5xx/429 (server-side), actionable for other 4xx (real client-side defect).QuotaLimit/ServerOverloadedare not actionable (expected, user-visible conditions).Deserialization(Json(_))stays actionable (a real JSON contract bug);Deserialization(Transport(_))delegates to the wrappedreqwest::Error.Otherdelegates to the wrappedanyhow::Error.agent_input_footer) and GUI (editor/view/voice.rs) sinks already callreport_error!(anyhow::Error::new(e).context(...))typed, unchanged; the error toast andlog::warn!breadcrumbs are unchanged. Only the Sentry actionability classification (and the cause/status now present in the reported chain) changes.AIApiError(the multi-agent path from Preserve transport error actionability in Sentry reports #14292) is untouched.Linked Issue
QUALITY-1231
Testing
No tests are included: unit tests covering
TranscribeError'sis_actionable()classification were written and passing, then removed at the reviewer's request, along with the comments this change had added. The classification therefore has no automated regression guard.rustfmt --checkon the touched file — clean.Compilation is verified by CI; the branch has been rebased onto current
master.No UI surface change (pure Rust error-classification change), so no visual verification was needed.
I have manually tested my changes locally with
./script/runAgent Mode
CHANGELOG-NONE