Note
Grok responding on behalf of Julius.
Triage
Thanks for the careful numbers, @smnbss. Having per-build counts from the trace files made this much easier to dig into.
What I found
I compared Alpha on 2 Oct (v0.0.45, 6c8fed35) with 0.0.46-nightly.20261003.2623 (fed41fa8). Between those two, packages/ssh/src/tunnel.ts only changed imports, and the readiness cadence is the same: a probe every 100ms, up to 20s for a new forward (SSH_READY_TIMEOUT_MS), and a 2s check before an existing forward is dropped (ensureTunnelEntry).
The relevant change in that range is #14897. When a connection keeps failing, reconnects now back off with jitter up to 5 minutes instead of stopping at 16 seconds. The first retry comes a little sooner (about 1–2s instead of 3s), and bringing the app to the foreground still resets the backoff, as it did on Alpha.
Here are your numbers converted to hourly rates, reading "until ~18:24" as 18.4 hours and the evening window as 6 hours:
| Window | Failed loopback GETs / hour | Distinct local ports / hour |
|---|---|---|
| Alpha, 2 Oct (24h) | ~172 | ~2.9 |
| Alpha, 3 Oct until 18:24 | ~221 | ~5.4 |
| Nightly, 3 Oct evening (~6h) | ~1,220 | ~24.5 |
| Nightly, 4 Oct (24h) | ~104 | ~2.6 |
So the 3 Oct evening window is clearly hotter, but the full Nightly day on 4 Oct is quieter than Alpha. During the spike, about one new local port every 5 minutes per host (147 ports over 6h across 2 hosts) lines up with the new 5-minute cap rather than a tighter loop.
Also, those loopback GETs aren't SSH connection attempts. launchOrReuseRemoteServer runs before reserveLocalTunnelPort, so connect timeouts, MagicDNS failures, and the 15-minute SSH command timed out never show up as http.client GET to 127.0.0.1. They come from waitForHttpReady on a forward that already exists. A full 20s wait is about 200 probes, which is close to the ~195 per port you saw. The evening average works out to about 20 GETs per failed waitForHttpReady span (7,317 / 369), which matches the 2s stale-tunnel check.
This is related to #11287 and #4144 but isn't the same report.
To narrow down what made that evening hot, a short sanitized trace excerpt would help:
ssh/tunnel.launchOrReuseRemoteServerfailures that never reserve a port- each failed
shared.httpReadiness.waitForHttpReadyspan, with itstimeoutMsandattempts - whether an
application-activewakeup was resetting the backoff during the spike
The exact Alpha version string from that app would help too.
Likely fix area
- The reconnect backoff from #14897, especially how foreground and wakeup resets interact with it while a host stays unreachable.
- The stale-tunnel check in
ensureTunnelEntryandwaitForHttpReadyinpackages/ssh/src/tunnel.ts, if the excerpt shows forwards being recreated faster than the backoff allows.
A maintainer will decide on the fix direction.