Log analysis (Opus)
Cursor Upgrade Log Analysis — 2026-02-03
Executive Summary
Two distinct but interrelated issues were identified from the logs. The primary cause of both symptoms is the SSH Remote extension’s interaction with the upgrade process, compounded by a missing SSH key file and the askpass dialog being blocked or hidden during update-triggered restarts.
Issue 1: File/Process Lock Issues During Upgrade
Root Cause: Update Applied While SSH Remote Session Active
Timeline of events:
| Time |
Event |
| 16:31:48 |
Session 163148 starts on Cursor v2.4.22 |
| 16:31:59 |
SSH remote authority resolution begins for vps-remote |
| 16:32:01 |
SSH key SSHpriv_openssh not found — falls back to password auth |
| 16:32:03 |
Askpass prompts for password; responded in ~15s |
| 16:32:23 |
SSH connection established successfully (22s total) |
| 16:32:18 |
Update detected — state transitions: checking → downloading → downloaded → updating |
| 16:32:57 |
Update state: ready (update applied in ~36s) |
| 16:33:22 |
Extension host exits with code 0 — session torn down for restart |
What happened: The update was applied while an active SSH remote session was running. The update process replaced files in C:\Users\SeanWing\AppData\Local\Programs\cursor\ while the running process still held handles to them. The extension host was then terminated to restart with the new version.
Evidence of File Lock Consequences
After restart (session 163515, window2), the following errors appeared immediately:
-
ENOENT: no such file or directory, realpath 'c:\Users\SeanWing\AppData\Local\Programs\cursor\bin'
-
The cursor\bin directory was missing or not yet created by the installer
-
This is errno -4058 (ENOENT) on a realpath syscall — the path simply didn’t exist at the time the extension host tried to access it
-
Occurred at 16:36:11, roughly 1 minute after the new session started
-
Failed to read .git/HEAD: ENOENT ... cursor\.git\HEAD
- The Git extension tried to read
.git/HEAD from the Cursor install directory (not a git repo) — harmless but confirms filesystem access issues
-
Extension registration conflicts:
-
command 'geminicodeassist.startagent' already exists — duplicate command registration suggesting extensions loaded from both old and new paths
-
callClient: client not ready — 19 occurrences in window2, indicating the extension host infrastructure wasn’t fully initialized
-
No Connect transport provider registered — Cursor’s internal IPC/transport layer failed to initialize, blocking:
-
User pricing info fetch
-
Privacy mode check
-
C++ config loading
-
Server creation
Contributing Factor: Extension Cleanup Race Condition
The shared process log shows extension cleanup at startup:
Marked extension as removed anthropic.claude-code-2.1.25-win32-x64
Marked extension as removed atom8n.n8n-atom-v3-3.25.23-universal
Marked extension as removed google.geminicodeassist-2.68.0-universal
These deletions happened at 16:35:23, while window2’s extension host was already trying to load at 16:35:55 — a 32-second gap but the extensions may not have been fully cleaned before the new host tried to register them.
Issue 2: Cursor Hanging on Startup After Upgrade
Root Cause: SSH resolveAuthority Blocking + Askpass Dialog Hidden
This is the dominant issue and directly explains the perceived hanging. The startup sequence blocks on resolveAuthority(ssh-remote) which in turn blocks on the SSH askpass dialog.
Detailed Mechanism
Session 163515, Window 1 (the main hang):
| Time |
Event |
Duration |
| 16:35:27 |
resolveAuthority(ssh-remote) invoked |
0ms |
| 16:35:27 |
SSH connection attempted to vps-remote (168.231.103.86:2222) |
— |
| 16:35:29 |
SSH key SSHpriv_openssh not found |
2s |
| 16:35:31 |
Askpass server receives password prompt |
4s |
| 16:35:31 |
“Pausing timeout; waiting for askpass response” |
— |
| … |
571 seconds of “waiting…” logged every 1s |
— |
| 16:38:10 |
Askpass response finally received (~2m39s later) |
163s |
| 16:38:10 |
Connection closed by 168.231.103.86 port 2222 |
— |
| 16:38:10 |
5 retry attempts all fail immediately |
— |
| 16:38:10 |
Permanent failure declared |
163,151ms |
The entire Cursor UI was blocked for ~2 minutes 43 seconds waiting for the SSH password dialog. The askpass dialog was likely either:
-
Hidden behind other windows during the update restart
-
Not rendered due to the window manager not giving it focus after the automated restart
-
Dismissed/timed out by the remote server before the user could respond
Second attempt (same window, reload at 16:38:16):
| Time |
Event |
Duration |
| 16:38:24 |
Second resolveAuthority(ssh-remote) attempt |
— |
| 16:38:28 |
Askpass prompt received |
4s |
| 17:05:36 |
Askpass response received |
27 minutes later |
| 17:05:37 |
Connection closed by 168.231.103.86 port 2222 |
— |
This 27-minute gap is almost certainly the user not seeing the password dialog at all, with the UI appearing frozen.
Ghost Sessions (The “Hanging” Evidence)
20260204T093144/ — directory structure created but no log files
These represent Cursor processes that started, created their log directory structure, but never progressed far enough to write any log output. This is consistent with the process starting, attempting SSH resolution immediately, and hanging before any renderer or extension host logging could begin.
Additional Issues Found
oh-my-claudecode Plugin Errors
The sessionEnd hook from the oh-my-claudecode plugin (v3.7.4) fails consistently:
-
On local windows: Error: The "path" argument must be of type string. Received undefined — the transcript_path is null
-
On remote windows: spawn /bin/bash ENOENT — trying to run bash on a remote path referencing the local Windows plugin directory /C:/Users/SeanWing/.claude/plugins/...
Missing SSH Key (Pre-existing)
Every SSH connection attempt logs: no such identity: C:\\Users\\SeanWing\\.ssh\\SSHpriv_openssh: No such file or directory
This forces password-based authentication for every connection, which requires the askpass dialog, which is the core of the hanging issue.
Filesync Failures on Window 4
Failed to check if file sync is enabled for user
Failed to fetch fsConfig File sync is disabled
The Cursor file sync service couldn’t authenticate — likely related to the transport provider not being registered.
Logs.zip