Windows: Desktop crash wedged the MSIX package; recovery required manual package removal, destroying local app data (Code-tab group assignments, crash dumps)

Status Open
Reported on v2.1.219
Maintainer reply None cached
Activity 6 comments · opened Jul 26, 2026

Environment

  • Windows 10 Pro 19045, x64
  • Claude Desktop 1.24012.9 (MSIX, direct download, not Store)
  • Claude Code 2.1.219 native at crash time (2.1.220 after recovery)
  • claude.ai subscription auth (Max), Remote Control active with two concurrent Claude Code sessions bridged to the desktop app

Summary

Claude Desktop hard-crashed mid-stream. The app could not relaunch ("This app can't open - There's a problem with Claude. Reinstall the application"), the taskbar shortcut disappeared, and reinstall failed repeatedly until a manual Remove-AppxPackage plus reboot. The wedge chain is fully visible in the AppXDeploymentServer/Operational event log plus ClaudeSetup.log: zombie app processes and the CoworkVMService held file locks, the installer's own cleanup could not remove that service ("Access is denied"), elevation failed, and Windows refused the data-preserving removal path. The eventual manual package removal destroyed all package-local app data.

Timeline (2026-07-25, UTC-7, from event log + ClaudeSetup.log)

  • 14:52:04 - precursor: 15x event 8761 "AppExecutionAlias directory missing" (0x8007010B), ~2.5 h before the crash (auto-update staging?)
  • 17:31:46 - last activity timestamps in both live CC session transcripts (crash moment; = 2026-07-26T00:31:46Z)
  • 17:32:04 onward - repeated register/repair attempts fail 0x80073D02 "Unable to install because the following apps need to be closed" (zombie processes still alive)
  • 17:35-17:46 - installer attempts (ClaudeSetup.log excerpt below): service removal denied, data-preserving removal rejected (0x80073CFA, requires developer mode), AddPackage 0x80073CF9 with inner 0x80070020 sharing violation creating ...\app\resources\cowork-svc.exe, then "Elevation failed: elevated installer exited with code 1" while the UI showed "Administrator access is required to install Claude with full features" to an already-elevated user
  • 18:03-18:04 - after manual Get-AppxPackage *Claude* | Remove-AppxPackage (Windows PowerShell 5.1 admin; the Appx module fails in pwsh 7 with 0x80131539): AddPackage now fails 0x80073CF6 with inner 0x80073D05 "An error occurred while deleting the package's previously existing application data" while registering windows.stateExtension
  • reboot flushes the locks
  • 18:13 - clean install succeeds, fresh package state
  • Aftermath: fresh OAuth login required (401 on claude rc); a globally set ANTHROPIC_API_KEY forced API-key auth so Remote Control refused to start, but the desktop banner only says "check your terminal" while claude doctor knows the actual cause; the manual /login URL flow was nearly unusable in default Win10 conhost because clipboard paste was broken and OAuth codes kept expiring

ClaudeSetup.log excerpt

17:35:15.925682 WARNING: failed to remove conflicting service: could not open CoworkVMService: Access is denied.
17:35:15.946275 Windows rejected data-preserving removal for Claude_1.24012.9.0_x64__pzs8sxrjxfjjc (0x80073CFA, requires developer mode); relying on in-place update
17:35:17.230496 MSIX installation failed: AddPackage failed: AddPackage failed with HRESULT 0x80073CF9
17:35:21.256976 Elevation failed: elevated installer exited with code 1
17:35:21.256976 ERROR dialog (with log path): Administrator access is required to install Claude with full features. You can try again or install without Cowork.
17:46:00.414773 (repeat cycle, same failure)
18:04:37.236124 MSIX installation failed: AddPackage failed with HRESULT 0x80073CF6

Full 29 KB log available on request.

Data lost

Recovery required package removal, which destroyed package-local state:

  • Code-tab custom group assignments and pins. These live in renderer localStorage (dframe-store / dframe-starred-code, origin https://claude.ai) inside the package profile, so they die with the package while the session transcripts under ~/.claude survive. Post-recovery investigation confirmed the desktop app is the sync owner for this state (ccd-sync-owner protocol): assignments written in the claude.ai web app do not propagate back to Desktop, so there is no user-accessible way to restore them - they had to be reconstructed by hand-patching the leveldb WAL offline.
  • Crashpad/sentry evidence for the original fault (see below).
  • Device registration, window state, and app settings.

Original crash cause

Unrecoverable locally, and the reason is circular: no Event 1000/WER record exists (Crashpad captured the fault), but the Crashpad/sentry data lived in the package profile that had to be destroyed to un-wedge the app. Server-side crash telemetry for account 3b7ebde4-1173-48bb-a3f7-05f7ae380469 (org d65be200-e7c3-4a7e-b86d-789666e120a2) around 2026-07-26T00:31:50Z should hold the dump; happy to correlate.

Suggested fixes

  1. Installer: detect and terminate stale app processes and stop/remove CoworkVMService before AddPackage; retry on 0x80070020. The cleanup exists but fails ("Access is denied") even when elevated - service ACL issue?
  2. Fix the elevation failure (elevated installer exit code 1) and the misleading "Administrator access is required" dialog when already elevated.
  3. Provide a data-preserving reinstall that does not require developer mode (0x80073CFA), or move critical state out of package-local storage.
  4. Persist Code-tab group assignments and pins next to session data (e.g. under ~/.claude) rather than in renderer localStorage - it is exactly the state users lose in any reinstall, while their transcripts survive. Being the sync owner makes it unrecoverable even from claude.ai.
  5. The Remote Control disconnected banner should surface "ANTHROPIC_API_KEY is forcing API-key auth" when that is the cause (claude doctor already knows).
  6. Login fallback: a short user-typeable device-code flow for environments where clipboard interop is broken (default Win10 conhost).

Possibly related

#49917 (same 0x80073CF9 AddPackage failure, open), #47877 (MSIX stuck permanently), #40682 (installer fails, Canary), #71159 (0x80073CF9 orphaned package)

View original on GitHub ↗

4 Comments

NavarreDR · 1 month ago

Addendum after two days of hands-on state recovery. These findings reframe the data-loss part of this report: the loss is not just "package removal deleted local files" - three separate design decisions make recovery impossible even when the user still has all the underlying data.

  1. Sidebar group assignments and pins cannot be restored from outside the app. They live in renderer localStorage (dframe-store, dframe-starred-code) and are synced (ccd-sync-* keys) with the desktop app as the sync owner. On every desktop boot, the app pulls the server copy and discards local edits. We verified this directly: well-formed leveldb WAL records written while the app was fully quit (correct CRC framing, winning sequence numbers, verified by strict replay) were applied on disk and then silently overwritten by the boot-time sync pull. Assignments written through the claude.ai web UI do not propagate back either - the web side is a read-mostly follower. The only writer that sticks is the desktop UI itself, one drag at a time.
  1. The reinstall orphaned the server-side session registry. After the package removal and re-registration, 106 of this account's 132 server-registered Code sessions flipped to archived. The sidebar only fetches statuses=active&statuses=paused, so from the user's perspective two weeks of history simply vanished - it was neither deleted nor hidden by choice. Recovery required discovering and mass-calling POST /v1/code/sessions/<id>/unarchive (94 calls) through an authenticated browser session, which is not something a normal user can do.
  1. Even unarchived, older sessions stay invisible. The sidebar renders roughly the 50 most recently active sessions (limit=50 fetch plus a single "Show N more" expansion - observed ceiling 53 rendered of 119 active). Custom groups only display members that happen to be inside that window. Sessions created before server sync existed (10 here) have no server record at all and cannot be re-listed once the local index is gone, even though their transcripts under ~/.claude are intact.

Suggested additions to the fix list:

  • Do not let reinstall/device re-registration archive the account's sessions, or offer a one-click "restore my sessions" after reauth.
  • Persist group/pin state with session data (as originally suggested), or at minimum make it exportable/importable - the sync-owner design makes every other recovery path a dead end by construction.
  • Provide a way to browse or expand beyond the ~50-session sidebar window; grouped sessions outside the window currently look lost.

Happy to share the full recovery tooling and timestamps if useful.

LucasHenriqueDiniz · 1 month ago

I can reproduce a very similar failure chain on another Windows 10 Pro 19045 x64 system running Claude Desktop 1.24012.9 (direct-download MSIX).

The initial failure happened during normal Claude Desktop Code-tab use, before any manual package or local-state modifications:

  • Claude Desktop closed unexpectedly mid-use.
  • The app/shortcut disappeared and Windows reported:

"There's a problem with Claude. Reinstall the application."

  • ClaudeSetup.log then showed:
  • CoworkVMService already exists / potential conflict
  • failed to remove CoworkVMService: Access is denied
  • data-preserving removal rejected with 0x80073CFA
  • AddPackage failed with 0x80073CF9
  • misleading "Administrator access is required" message despite elevation
  • Manual Remove-AppxPackage followed by reinstall temporarily restored the app.
  • Session transcripts under ~/.claude/projects survived, but most Code-tab sessions/groups disappeared from the sidebar after reinstall.

One potentially useful additional clue: during a later launch failure I captured an Electron/Chromium fatal GPU-process crash:

[process-id]: ERROR: gpu_process_host.cc
GPU process exited unexpectedly: exit_code=101457950
GPU process launch failed: error_code=18
FATAL: GPU process isn't usable. Goodbye.

Immediately afterward, launching via claude:// failed with:
"Cannot start the application. Try reinstalling the application to fix the problem."

The package subsequently reported:
Status: Modified, NeedsRemediation

I cannot prove that the GPU crash caused the original package wedge, but it may be useful for correlation because the resulting MSIX/Cowork failure chain closely matches this issue.

I can provide the full ClaudeSetup.log and the console output with the GPU failure if useful.

NavarreDR · 1 month ago

Thanks @LucasHenriqueDiniz - that GPU-process fatal is the most useful clue in this thread. In my incident the original faulting process was unrecoverable (the Crashpad data lived in the package profile that had to be removed to un-wedge the install - the circular-evidence problem in my addendum), but your capture matches the fingerprint exactly: hard exit mid-use, no WER entry, package left needing remediation, then the identical CoworkVMService / 0x80073CFA / 0x80073CF9 chain. Also confirming your "Status: Modified, NeedsRemediation" observation is useful as an early warning: my reinstalled package currently reports Ok, and I now check the status daily so any drift gets caught while the app still launches. If you can attach your ClaudeSetup.log and the GPU console output, that gives the maintainers two independent full traces to correlate.

NavarreDR · 29 days ago

Addendum: two more data points from this install (Windows 10 Pro 19045, Alienware Aurora R12, Claude Desktop 1.24012.9 MSIX)

1. Second GPU-process crash, this time WITHOUT the MSIX wedge (2026-08-01)

Mid-session (heavy background-subagent fan-out running), the app window went dead at 16:09 local. The app's own logs\main.log is the only place it shows up:

2026-08-01 16:09:12 [info] GPU process gone: {
  type: 'GPU',
  reason: 'crashed',
  exitCode: 101457950,
  serviceName: 'GPU'
}

Logged twice back-to-back (looks like once per window), exitCode 101457950 = 0x060C201E. The main process never exited: main.log goes silent after this line until the post-reinstall app start 35 minutes later, and the OS has no record of the event at all - no WER report, no Application event log entry, no Crashpad dump. So this failure class is invisible to OS-level telemetry; the dead window plus a GPU process gone line in main.log is the whole signature. Fastest user-side triage: Select-String "GPU process" logs\main.log.

The important contrast with my 07-25 incident: the package did NOT wedge. Get-AppxPackage Status stayed Ok, and an over-the-top reinstall preserved all package state - sessions, groups, pins, wrappers. Losses were limited to in-flight background tasks, which correctly resolved as "stopped / No completion" on relaunch, and the session transcript kept every completed turn. So the GPU-death class has a benign variant when the package survives; what made 07-25 catastrophic was the NeedsRemediation wedge that followed, not the crash itself. This also correlates with the independent GPU-process repro reported earlier in this thread (the error_code=18 launch failure): same class, different aftermath.

2. Mechanism for the duplicated sidebar rows ("ghost pins")

Diagnosed 2026-07-27 on the same install. The duplicates are purely client-side render state:

  • The synced pin doc (ccd/dframe-starred-code in user_settings) holds only unique session ids, and the server session list has zero duplicate rows. Server state is clean.
  • The duplication lives in the persisted react-query cache (localStorage key react-query-cache-ls), query sessions_api_list_sessions: its single cached page accumulates n+1 ids for n unique sessions, and the sidebar renders one row per occurrence.
  • Repro: keep the app open, touch any session (archive + unarchive is enough), and watch its sidebar row double. The touched session is re-inserted into the cached page instead of upserted - I forced this and watched the page go from 51 to 52 ids with the same session present twice.
  • Growth is real while the app sits open: two affected pinned sessions gained roughly one duplicate row per 12.5 minutes, in lockstep (5 rows to 12 rows in about 88 minutes, untouched). The reliable victims are pinned sessions stuck in status_bucket: working with unread: false - sessions that were killed mid-turn and therefore parse as "running" forever. Non-pinned sessions duplicate too (found one at x2); Pinned is just where it is visible.
  • Cleanup behavior, tested with an untouched twin as control: archive + unarchive does not evict ghosts (the stuck working bucket is derived state and reverts on unarchive). Unpinning stops NEW growth but does not clear existing ghost rows - they are stale row objects decoupled from pin state. Only an app relaunch clears the ones on screen.

Happy to provide the raw notes for either item if useful.

Showing cached comments. Read the full discussion on GitHub ↗