Claude Desktop: auto-updater fails with generic OSStatus -60006 when app relaunched before install completes
Summary
Claude Desktop's auto-updater repeatedly fails to install a downloaded update if the app is relaunched shortly after being quit. The user-facing error is a generic, unhelpful macOS OSStatus -60006, which gives no indication that the real cause is a race between the Squirrel/ShipIt installer and the app relaunching too soon. This can loop indefinitely: check → download → begin install → user (or any automation) reopens the app within ~1 minute → install aborts → next periodic check restarts the cycle.
Environment
- Claude Desktop, stuck on 1.22209.0 (2026-07-16) while 1.24012.1 (2026-07-21) was available and repeatedly failing to install
- macOS (Darwin 25.5.0)
- Updater backend: Squirrel.Mac (
ShipIthelper), update URLhttps://api.anthropic.com
User-facing symptom
main.log:
[info] [updater] Found an update, downloading
[error] [updater] Auto-update error: [Error: L'opération n'a pas pu s'achever. (OSStatus erreur -60006.)]
This error is opaque — nothing in the visible app UI or this log line indicates the real cause.
Actual cause (found in ~/Library/Caches/com.anthropic.claudefordesktop.ShipIt/ShipIt_stderr.log)
ShipIt[...] Beginning installation
ShipIt[...] Aborting update attempt because there are 1 running instances of the target app
ShipIt[...] Installation cancelled: Error Domain=SQRLInstallerErrorDomain Code=-9 "App Still Running Error"
UserInfo={NSLocalizedDescription=App Still Running Error, NSLocalizedRecoverySuggestion=All instances
of the target application should be quit during the update process}
This exact sequence (Beginning installation → Aborting ... App Still Running Error, roughly 1 minute apart) repeats five times in a row over about 20 minutes, each time triggered by the app being quit and relaunched again before ShipIt finished swapping the app bundle. A successful install observed earlier in the same log (2026-07-18) took ~4-5 minutes from Beginning installation to Successfully launched application.
The fix that worked: quit the app and wait ~5 minutes without reopening it, letting ShipIt finish in the background, then relaunch. The update then applied cleanly (confirmed via About: version changed from 1.22209.0 to 1.24012.1).
Suggested improvements
- Surface the real error to the user.
SQRLInstallerErrorDomain Code=-9 "App Still Running Error"is a clear, actionable message (ShipIt_stderr.log) that gets swallowed and replaced by a generic, localizedOSStatus -60006in the user-facingmain.log/UI. Users have no way to know "don't reopen the app yet" is the fix. - Avoid the race entirely: either have the updater retry automatically after the next quit without needing a fresh "check for updates" cycle, or hold off relaunching the just-quit instance if an install is in progress (e.g. via a lock file / IPC check before allowing a new instance to fully start), or block/queue a manual relaunch attempt with a short "update installing, please wait" message instead of starting a competing instance.
- Consider surfacing "update pending — do not reopen for N minutes" somewhere visible (menu bar icon, notification) when an install is in progress in the background after quit.
Impact
An update can be stuck indefinitely if the user's normal workflow involves quitting and quickly reopening the app (e.g. for troubleshooting, or just habit) — each attempt looks like a generic, unrelated failure with no guidance toward the actual fix.