Summary
When VRChat is launched with a vrchat://launch?id=... instance URL and the login sequence (API calls + Photon region discovery) takes longer than ~60 seconds to complete, the Photon peer ends up in the Disconnecting state at the moment the client attempts the region switch. From that state, the client never issues a connect: every subsequent join attempt logs Switching to network region xx (current state: Disconnecting) and times out 30s later with Failed to connect to network region, without ever logging Connecting to realtime network. The only recovery is killing the process.
Evidence (from 90 days of logs across 5 machines, 271 launches)
Login-to-first-region-switch latency is perfectly bimodal: every successful session was 2–13s; every failed session was 65–110s. Zero observations in between.
The first Switching to network region line predicts the outcome with no exceptions: current state: ConnectedToNameServer → connected (235/235 sessions); current state: Disconnecting → failed (20/21 sessions; the single recovery happened only because a full re-login re-established the NameServer connection).
Once stuck, in-app retries never recover. One session logged 88 consecutive Switching ... (current state: Disconnecting) attempts, all failing identically.
On failure the client also triggers TryAlternateInstance and silently redirects to a different instance (observed: requested group(...)~region(jp) → redirected to friends(...)~region(us)), which is problematic for anyone trying to reach a specific instance.
What appears to happen
After Got best network region, the client begins tearing down the NameServer connection. If the join flow (Destination set → Requesting join token → region switch) arrives while the peer is still mid-teardown (Disconnecting), the region-switch code appears to wait for a terminal state that never arrives — it has no handling for the Disconnecting case — and times out. Nothing ever calls connect again on that peer.
Repro (probabilistic)
Launch VRChat.exe "vrchat://launch?id=<world:instance>" --no-vr on a low-end machine (observed on Intel N150 mini PCs; never reproduced on high-end machines on the same LAN in 183 launches) or otherwise cause the login sequence to take >60s.
Observe the first Switching to network region line. If it shows current state: Disconnecting, the session is unrecoverable.
Launching without an instance URL avoids the failure in our data (7/7 clean launches), presumably because the client goes straight to Home without waiting on Destination set, and after the first successful join the peer starts subsequent switches from Disconnected, which works fine.
Suggested fix
In the region-switch path, treat Disconnecting explicitly: either wait for the transition to Disconnected and then proceed to connect, or force-reset the peer state and reconnect (the same workaround Photon suggests for peers stuck in Disconnecting). Alternatively, cap the retry loop and surface a fatal error instead of retrying forever.
Environment
VRChat 2026.3.1-1886, Windows 11, desktop mode (--no-vr), Steam install / VRChat account login.