Repository navigation
fix(client): T3 Connect clients reconnect once a new tunnel is ready - #16554
Conversation
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — This is a narrowly scoped client bug fix that reclassifies one documented, temporary tunnel-readiness response as retryable while preserving blocked handling for other refusals. The existing exponential backoff is reused, and focused tests cover both the new behavior and unchanged cases. Notes:
No code changes detected at You can add or adjust custom eligibility rules. Learn more. |
Dismissing prior approval to re-evaluate dbf3920
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
|
Important Review skippedReview was skipped as selected files did not have any reviewable changes. ⚙️ Run configuration
You can disable this status message by setting the Use the checkbox below for a quick retry:
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
📝 Walkthrough
Merge Risk: ⚪ Minimal · up to
|
| Check name | Status | Explanation |
|---|---|---|
| Linked Issues check | ✅ Passed | Check skipped because no linked issues were found for this pull request. |
| Out of Scope Changes check | ✅ Passed | Check skipped because no linked issues were found for this pull request. |
| Title check | ✅ Passed | The title clearly and concisely describes the primary change: clients reconnect after a T3 Connect tunnel becomes ready. |
| Description check | ✅ Passed | The description explains the problem, implementation, scope rationale, testing evidence, limitations, and agent usage. It does not use the template's exact "Change," "Scope and approval," and "Verific… |
✨ Finishing Touches
-
📝 Generate docstrings
-
- Commit to this branch
- Create a new PR
🧪 Generate unit tests (beta)
-
- Commit to this branch
- Create a new PR
-
- Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Comment @coderabbitai help to get the list of available commands.
## What's Changed * fix(server): apply confirmed Claude subagent outcomes by @Yash-Singh1 in pingdotgg/t3code#18778 * fix(mobile): Browser page no longer logs a duplicate key warning by @tris203 in pingdotgg/t3code#18776 * fix(web): a numeric q in the pull requests URL no longer crashes the page by @ScottN-PV in pingdotgg/t3code#18666 * fix(client): T3 Connect clients reconnect once a new tunnel is ready by @shivamhwp in pingdotgg/t3code#16554 * fix(web): leaving the home page while the app loads no longer bounces you to a new draft by @shivamhwp in pingdotgg/t3code#18672 * fix(mobile): attachment images no longer re-download on every reconnect by @shivamhwp in pingdotgg/t3code#18824 * fix(server): a migration id clash stops startup with a clear error instead of crash-looping by @shivamhwp in pingdotgg/t3code#15925 * fix(server): a thread with an event type from a newer build can still resync after a downgrade by @shivamhwp in pingdotgg/t3code#15937 * fix(server): Codex titles and branch names no longer start the user's MCP servers by @brycedbjork in pingdotgg/t3code#17058 * fix(server): Claude thinking before a tool call stays a collapsed Thought by @maria-rcks in pingdotgg/t3code#18887 * perf(server): cached branch PR lookups no longer start git processes by @SunkenInTime in pingdotgg/t3code#17063 * fix(web): compact merge buttons show when they need a second click by @TonybynMp4 in pingdotgg/t3code#18878 * fix(mobile): pull requests load from another environment when theirs is offline by @juliusmarminge in pingdotgg/t3code#18698 * perf(web): collect active tool calls without array shifts by @saphid in pingdotgg/t3code#18853 * fix(web): center the pace icon on the limit card's "left" label by @akash3444 in pingdotgg/t3code#18580 * fix(web): update everything includes npm-installed servers again by @ScottN-PV in pingdotgg/t3code#18709 * fix(server): review guides find Bitbucket heads reported by short hash by @ahilles107 in pingdotgg/t3code#18900 * fix(web): scheduled task model picker no longer shifts the dialog by @flamboh in pingdotgg/t3code#18940 * fix(ci): CodeRabbit reviews no longer request changes by @Yash-Singh1 in pingdotgg/t3code#18954 ## New Contributors * @brycedbjork made their first contribution in pingdotgg/t3code#17058 **Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261013.3042...v0.0.46-nightly.20261013.3053 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261013.3053
## What's Changed * fix(server): apply confirmed Claude subagent outcomes by @Yash-Singh1 in pingdotgg/t3code#18778 * fix(mobile): Browser page no longer logs a duplicate key warning by @tris203 in pingdotgg/t3code#18776 * fix(web): a numeric q in the pull requests URL no longer crashes the page by @ScottN-PV in pingdotgg/t3code#18666 * fix(client): T3 Connect clients reconnect once a new tunnel is ready by @shivamhwp in pingdotgg/t3code#16554 * fix(web): leaving the home page while the app loads no longer bounces you to a new draft by @shivamhwp in pingdotgg/t3code#18672 * fix(mobile): attachment images no longer re-download on every reconnect by @shivamhwp in pingdotgg/t3code#18824 * fix(server): a migration id clash stops startup with a clear error instead of crash-looping by @shivamhwp in pingdotgg/t3code#15925 * fix(server): a thread with an event type from a newer build can still resync after a downgrade by @shivamhwp in pingdotgg/t3code#15937 * fix(server): Codex titles and branch names no longer start the user's MCP servers by @brycedbjork in pingdotgg/t3code#17058 * fix(server): Claude thinking before a tool call stays a collapsed Thought by @maria-rcks in pingdotgg/t3code#18887 * perf(server): cached branch PR lookups no longer start git processes by @SunkenInTime in pingdotgg/t3code#17063 * fix(web): compact merge buttons show when they need a second click by @TonybynMp4 in pingdotgg/t3code#18878 * fix(mobile): pull requests load from another environment when theirs is offline by @juliusmarminge in pingdotgg/t3code#18698 * perf(web): collect active tool calls without array shifts by @saphid in pingdotgg/t3code#18853 * fix(web): center the pace icon on the limit card's "left" label by @akash3444 in pingdotgg/t3code#18580 * fix(web): update everything includes npm-installed servers again by @ScottN-PV in pingdotgg/t3code#18709 * fix(server): review guides find Bitbucket heads reported by short hash by @ahilles107 in pingdotgg/t3code#18900 * fix(web): scheduled task model picker no longer shifts the dialog by @flamboh in pingdotgg/t3code#18940 * fix(ci): CodeRabbit reviews no longer request changes by @Yash-Singh1 in pingdotgg/t3code#18954 ## New Contributors * @brycedbjork made their first contribution in pingdotgg/t3code#17058 **Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261013.3042...v0.0.46-nightly.20261013.3053 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261013.3053
* fix(gitlab): merge request details report their head commit (pingdotgg#18608) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(server): rename built-in models from settings (pingdotgg#18840) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): Git actions follow the selected thread (pingdotgg#18862) * fix(desktop): preserve updater failure causes in diagnostics (pingdotgg#18864) * fix(web): attach dropped threads to pending answers (pingdotgg#18789) * fix(web): keep button text stable during press scaling (pingdotgg#18866) * fix(bitbucket): preserve PR head commits for review guides (pingdotgg#18402) * fix(server): return null for unresolved optional commands (pingdotgg#18871) * fix: show computer-use action titles and align app icons (pingdotgg#18865) * fix(server): apply confirmed Claude subagent outcomes (pingdotgg#18778) * fix(mobile): Browser page no longer logs a duplicate key warning (pingdotgg#18776) * fix(web): a numeric q in the pull requests URL no longer crashes the page (pingdotgg#18666) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(client): T3 Connect clients reconnect once a new tunnel is ready (pingdotgg#16554) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * fix(web): leaving the home page while the app loads no longer bounces you to a new draft (pingdotgg#18672) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): attachment images no longer re-download on every reconnect (pingdotgg#18824) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): a migration id clash stops startup with a clear error instead of crash-looping (pingdotgg#15925) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Co-authored-by: PR Batch Tester <agent@local.test> * fix(server): a thread with an event type from a newer build can still resync after a downgrade (pingdotgg#15937) Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com> Co-authored-by: PR Batch Tester <agent@local.test> * fix(server): Codex titles and branch names no longer start the user's MCP servers (pingdotgg#17058) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Yash Singh <saiansh2525@gmail.com> * fix(server): Claude thinking before a tool call stays a collapsed Thought (pingdotgg#18887) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * perf(server): cached branch PR lookups no longer start git processes (pingdotgg#17063) * fix(web): compact merge buttons show when they need a second click (pingdotgg#18878) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): pull requests load from another environment when theirs is offline (pingdotgg#18698) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(web): collect active tool calls without array shifts (pingdotgg#18853) Co-authored-by: SAPHID <saphid@users.noreply.github.com> Co-authored-by: GPT-6.1 Sol <noreply@openai.com> * fix(web): center the pace icon on the limit card's "left" label (pingdotgg#18580) * fix(web): update everything includes npm-installed servers again (pingdotgg#18709) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): review guides find Bitbucket heads reported by short hash (pingdotgg#18900) Co-authored-by: Pawel Mikolajczuk <pmikolajczuk@atlassian.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): scheduled task model picker no longer shifts the dialog (pingdotgg#18940) * fix(ci): CodeRabbit reviews no longer request changes (pingdotgg#18954) --------- Co-authored-by: Scott Norteman <snorteman@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Theo Browne <me@t3.gg> Co-authored-by: Yash Singh <saiansh2525@gmail.com> Co-authored-by: Paweł Mikołajczuk <pawel@mikolajczuk.in> Co-authored-by: Tristan Knight <admin@snappeh.com> Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com> Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Bryce Bjork <brycedbjork@gmail.com> Co-authored-by: maria <maria@kuuro.net> Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com> Co-authored-by: Antony <97451137+TonybynMp4@users.noreply.github.com> Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: Alex Southwell <saphid@gmail.com> Co-authored-by: SAPHID <saphid@users.noreply.github.com> Co-authored-by: GPT-6.1 Sol <noreply@openai.com> Co-authored-by: Akash Moradiya <64416825+akash3444@users.noreply.github.com> Co-authored-by: Pawel Mikolajczuk <pmikolajczuk@atlassian.com> Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com>
…ingdotgg#16554) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> (cherry picked from commit a143fa3)
…ingdotgg#16554) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> (cherry picked from commit a143fa3)
A T3 Connect client that tried to connect while its host was setting up a new tunnel showed "Connection failed" and never tried again on its own. It only retried when you switched tabs, the network changed, or you pressed Reconnect, even after the tunnel was up.
While a host replaces its tunnel, the relay keeps the allocation marked not ready until the new tunnel and DNS record exist (
recordTunnelclearsreadyAt,markReadysets it, ininfra/relay/src/environments/ManagedEndpointAllocations.ts). A connect request in that window getsenvironment_connect_not_authorizedwith reasonmanaged_endpoint_allocation_not_ready. The client mapped everyenvironment_connect_not_authorizedto a blocked permission error, and the supervisor never retries a blocked error on a timer. Nothing on the client changes when the tunnel becomes ready, so the client stayed parked.That one reason now maps to a transient
endpoint-unavailableerror, so the client retries with the normal backoff. Every other not-authorized reason (endpoint_provider_not_managed, a missing link, a mismatch, a missing reason from an older relay) stays blocked. The status text now says "The environment's T3 Connect tunnel is still being set up." instead of "Relay rejected the environment connection request (managed_endpoint_allocation_not_ready)."This is a small fix for an obvious bug under the contributing guide: a temporary relay state was treated as permanent, and the change only affects that one reason.
Testing
What you see
I can't make the hosted relay return this answer on demand, and running T3 Connect needs a real sign-in. So I built the real web app with a small test-only patch (not part of this PR) that makes the next 4 connection attempts fail with exactly the relay's
managed_endpoint_allocation_not_readyanswer, passed through the realmapManagedRelayError. Everything after that is the real app. I paired a browser, turned the simulation on, restarted the server to force a reconnect, and recorded the chat view. The same patch ran on main 5e22256 and on main 5e22256 with this PR merged.Recordings at 3x (the overlay clock and socket log are real time):
Full MP4s: before, after.
Tests
The rest uses the real error mapping and the real
EnvironmentSupervisorwith a fake driver andTestClock.New test in
errors.test.ts:managed_endpoint_allocation_not_readymaps to a transientendpoint-unavailableerror with the new message.endpoint_provider_not_managedand a missing reason still map to blockedpermission. On main it fails:With the fix,
vp test run src/connection/errors.test.ts src/relay/errorPresentation.test.ts src/connection/supervisor.test.tsinpackages/client-runtimepasses 70 of 70.A temporary supervisor test, not committed, sent the relay error through
mapManagedRelayErrorfor the first 3 attempts and then let the 4th succeed, with no wakeup:permissionendpoint-unavailableendpoint_provider_not_managedThe "Before" column comes from a separate check run on main 29366ea: after the first relay refusal, it advances the clock 30 minutes and asserts the connection is still blocked with exactly 1 attempt, for both reasons. A tab switch or similar wakeup was the only thing that reconnected it.
Relay discovery runs the same mapping for the environment list. It shows any mapped failure as an error on that row, so there it only changes the message.
tsc --noEmitinpackages/client-runtimepasses. Lint on the changed files has no findings.Not tested: a live T3 Connect host swapping its tunnel, and the mobile app. The recording uses the simulated relay answer described above.
🤖 Generated with Claude Code (Claude Opus 5.5)