Title: 3.19.19 — every agent tool call has ~13–35s of fixed overhead (terminal executor spans leaking for hours, Windows)
Since 3.19.19 auto-installed, every agent tool call carries 20–35 seconds of overhead that has nothing to do with the work being done. Commands that finish in ~100ms return to the agent 20–35 seconds later. Turns that used to take 30 seconds now take 10–15 minutes.
I measured this fairly carefully, so here’s the evidence rather than just “it’s slow.”
The overhead is not the command
I timed the work inside each command with a stopwatch and compared it to the tool call’s wall time:
Command
Work inside
Wall time
Overhead
Stopwatch echo
115 ms
never returned (errored)
hung
Resolve 4 $PROFILE paths
~10 ms
23.4 s
~23 s
3Ă— process launch + scan
~2.5 s
27.4 s
~25 s
Directory size scan
~3 s
36.1 s
~33 s
The hung one is the clearest case: the command wrote its output within the first second, then the executor never returned control and the call was reported as errored minutes later. I’ve now seen that exact pattern three times — full output produced, no exit status.
Cursor’s own spans agree
Parsed from cursor.requestTraces.log (13,997 spans, 24h):
Span
Count
Avg
Max
PowerShellState.execute
82
2,093 s
55,933 s
LazyTerminalExecutor.execute
82
2,093 s
55,933 s
ShellCoreExecutor.execute
82
2,094 s
55,933 s
agent.request
47
260 s
4,598 s
exec.handle
1,535
21 s
923 s
queueWait
—
~0 s
14 ms
Two things stand out. exec.handle averaging 21s across 1,535 calls matches my externally measured overhead almost exactly. And three shell executor spans ran 55,933 s (~15.5 hours) each — they opened around 22:15 one night and weren’t released until 13:44 the next day.
Critically, there was only one powershell.exe process running at the time, age 0 minutes, and a fresh process spawns in ~800ms. So those multi-hour spans are leaked state inside the terminal executor’s bookkeeping, not stranded OS processes. Nothing to clean up at the OS level.
queueWait is ~0, so this isn’t client-side queueing.
Ruled out
-
Rate limiting — exactly 1 rate-limit line in 24h of logs, and it was a GitHub MCP call hitting GitHub’s own API limit. (Heads up for anyone else grepping: naive 429 matching gives ~1,000 false positives from hex span IDs like spanId=4299570092aab6b5.)
-
Network — TCP 443 to api2.cursor.sh 112 ms, cursor.com 124 ms, TLS handshake 94 ms.
-
TLS interception / proxy — cert issuer is Let’s Encrypt, not a corporate CA. WinHTTP direct, no PAC.
-
PowerShell profile — none exists at any $PROFILE path.
-
Process creation — powershell.exe -NoProfile launches in 714–830 ms.
-
MCP server count / context size — disabling unused MCP servers changed nothing, and context size doesn’t explain overnight onset.
-
Machine load — nothing pathological.
Restart helps ~2Ă—, then decays
Measurement
Before restart
After restart
Trivial echo (107 ms of work)
never returned
13.5 s
Span-stats query (~1.2 s of work)
21–36 s
13.2 s
ShellCoreExecutor avg / max
2,093 s / 55,933 s
60 s / 106 s
A full restart clears the multi-hour leaked spans and stops the outright hangs, but ~13 s of per-call overhead remains on a 100ms command. It then degrades again as state re-accumulates.
Environment
Cursor 3.19.19 (Cursor.exe written 2026-09-08 17:15, auto-update — symptoms began that evening), Windows 10.0.26100, Windows PowerShell, 3 workspace roots.
Rollback isn’t an option for me: updates are enforced in my environment, there’s no cursor-updater cache or cached installer locally, so a downgrade would be overwritten anyway.
Questions
-
Did the terminal executor change in 3.19.19?
-
Why do ShellCoreExecutor / LazyTerminalExecutor / PowerShellState spans stay open for hours with no live process behind them?
-
Is there a later patch that already fixes this?
-
Any client-side setting that reduces per-call executor overhead in the meantime?