[BUG] Windows/MSIX: auto-update never stops the old package — CoworkVMService orphans, locks WindowsApps, app cannot relaunch (Event 658/7034 evidence)

Status Closed — duplicate
Reported on v2.1.221
Maintainer reply None cached
Activity 4 comments · opened Aug 4, 2026 · closed Aug 25, 2026

Summary

On the Microsoft Store (MSIX) build, every background auto-update leaves the previous package version still running. Windows therefore defers registration of the new package, the old cowork-svc.exe keeps a file lock inside C:\Program Files\WindowsApps\Claude_<old>\, and the app will not start again. Killing cowork-svc.exe from Task Manager does not help — the SCM immediately respawns it from the old, now half-unregistered path. A full reboot is the only reliable recovery.

This has been reported at least four times already (#42897, #42776, #46179, #36590) and three of those were closed as duplicate/invalid without a tracked fix. I'm filing this with Windows Event Log evidence spanning two months, because the previous reports were mostly symptom descriptions and I think the missing piece was proof of where the shutdown ordering breaks.

Environment

| Item | Value |
|---|---|
| OS | Windows 11 Pro 10.0.26200 (26H1) |
| App | Claude Desktop, MSIX / Microsoft Store package Claude_pzs8sxrjxfjjc |
| Version | 1.25927.0.0 |
| Bundled CLI | claude-code 2.1.221 |
| Service | CoworkVMService (display name "Claude"), cowork-svc.exe, LocalSystem, AUTO_START |
| Update cadence observed | 39 service (re)installs between 2026-06-10 and 2026-08-04 |

---

1. Windows itself reports the old package is still running during the update

Microsoft-Windows-AppXDeploymentServer/Operational, Event ID 658 (Warning) — twice on the same update:

2026-08-04 23:14:41  Marking package {Claude_1.25927.0.0_x64__pzs8sxrjxfjjc} for deferred
                     registration because {Claude_1.24012.11.0_x64__pzs8sxrjxfjjc} is still running.
2026-08-04 23:34:45  Marking package {Claude_1.25927.0.0_x64__pzs8sxrjxfjjc} for deferred
                     registration because {Claude_1.24012.11.0_x64__pzs8sxrjxfjjc} is still running.

This is the root cause in one line: the updater does not stop the old package before swapping it. Everything below is downstream of this.

2. The service dies uncleanly, and always right next to an update

System log, Event ID 7034 (Error), "The Claude service terminated unexpectedly":

2026-08-04 23:18:17   (2nd occurrence)
2026-08-04 13:40:43   (1st occurrence)
2026-07-26 15:19:23
2026-07-22 01:33:39
2026-07-19 11:36:43

Each sits within seconds of an Event 7045 (service re-installed at a new version path) and an Event 7040 (start type flipped AUTO_STARTDISABLED). Example triple:

2026-08-04 13:40:39  7045  Service installed: "…\Claude_1.24012.11.0_x64__…\app\resources\cowork-svc.exe"
2026-08-04 13:40:39  7040  Claude service start type changed from Auto to Disabled
2026-08-04 13:40:43  7034  The Claude service terminated unexpectedly. (occurrence 1)

3. The service cannot configure its own crash-recovery — on every single start

C:\ProgramData\Claude\Logs\cowork-service.log, present at every service start:

2026/08/04 23:33:57.290704  Warning: failed to open service for recovery config: Access is denied.
2026/08/04 23:35:27.752268  Warning: failed to open service for recovery config: Access is denied.
2026/08/04 23:39:22.360695  Warning: failed to open service for recovery config: Access is denied.

Confirmed by SCM — the recovery config is empty:

> sc.exe qfailure CoworkVMService
    RESET_PERIOD (in seconds) : 0
    REBOOT_MESSAGE            :
    COMMAND_LINE              :

So cowork-svc.exe is written to self-configure SERVICE_FAILURE_ACTIONS at startup, but under MSIX it runs without SERVICE_CHANGE_CONFIG rights on its own service and silently gives up. The service's recovery behaviour is therefore whatever SCM defaults to — not what the code intends.

Combined with:

> sc.exe qc CoworkVMService
    TYPE          : 210  WIN32_PACKAGED_PROCESS
    ERROR_CONTROL : 0    IGNORE
    START_TYPE    : 2    AUTO_START

…a failed start is swallowed with no user-visible signal at all. That is exactly the reported symptom: "I click the icon and nothing happens."

4. The Hyper-V guest is never shut down gracefully

Same log:

2026/08/04 23:15:45.645102  [VM] Graceful shutdown failed, forcing termination:
                            HcsShutdownComputeSystem failed with HRESULT 0x0/0x80070032
                            {"Error":-2147024846,"ErrorMessage":""}

0x80070032 = ERROR_NOT_SUPPORTED. The guest is booted with:

KernelCmdLine: console=ttyS0 earlyprintk=serial root=/dev/sda1 rootfstype=ext4 rw panic=10

There is no ACPI shutdown path wired up, so HcsShutdownComputeSystem can never succeed and the code always falls through to force-termination. Every VM stop is a hard power-off. That leaves HCS/HNS objects (VM, vNIC, NAT rules, Plan9 shares) dirty for the next service start — which matches the "Failed to start Claude's workspace" reports in #36590.

5. Locked binaries in the package directory

%APPDATA%\Claude\logs\main.log:

2026-07-29 16:29:58 [error] [Chrome Extension MCP] Failed to copy native host binary:
  Error: EBUSY: resource busy or locked, copyfile
  'C:\Program Files\WindowsApps\Claude_1.24012.9.0_x64__pzs8sxrjxfjjc\app\resources\chrome-native-host.exe'
  -> 'C:\Users\<user>\AppData\Roaming\Claude\ChromeNativeHost\chrome-native-host.exe'

6. Renderer processes block Windows shutdown

System log, provider winsrvext, Event ID 101 (Warning):

2026-07-30 01:17:53  Process …\Claude_1.24012.9.0_x64__…\app\claude.exe from package
                     Claude_1.24012.9.0_x64__… is delaying system shutdown after 5000 milliseconds.
2026-07-29 16:21:33  … is delaying system shutdown after 500 milliseconds.

7. Confirmed UI hangs

Application log, Event ID 1002 (Application Hang):

2026-07-07 20:17:00  claude.exe 1.18286.2.0 stopped interacting with Windows and was closed.
2026-07-07 15:13:26  claude.exe 1.18286.0.0 stopped interacting with Windows and was closed.

8. Separate but related — a real code-signing bug

Application log, provider CoworkVMService, Event ID 1 (Error):

2026-07-08 01:38:29  Claude VM Service error: signature verification initialization failed:
                     service is not properly signed: WinVerifyTrust returned 0x800B0109

0x800B0109 = CERT_E_UNTRUSTEDROOT. On that build the service refused to start at all because it could not validate its own signature.

Worth checking on your side: the certificate subject string changed between two consecutive releases:

2026-08-04 23:35:35  [Server] Client signature verified: …\Claude_1.24012.11.0_…\claude.exe (subject: Anthropic, PBC)
2026-08-04 23:39:36  [Server] Client signature verified: …\Claude_1.25927.0.0_…\claude.exe  (subject: Anthropic PBC)

Anthropic, PBC vs Anthropic PBC — with and without the comma. If cowork-svc.exe ever compares that subject as an exact string, a release that flips the comma will make the service reject its own client.

9. Current state of this machine

13 claude.exe processes are live as I write this, the oldest started 2026-08-04 23:39:23 — i.e. they have survived multiple app close/reopen cycles.

---

Reproduction

  1. Windows 11 with the Store/MSIX build of Claude Desktop.
  2. Use the app normally; let a background auto-update land (roughly every 1–2 days at the current cadence — 39 updates in ~8 weeks here).
  3. Close the app.
  4. Try to reopen it.

Expected: the app opens.
Actual: nothing happens, or Windows reports the file is in use. cowork-svc.exe is still running under services.exe; killing it just respawns it with a new PID. Reboot required.

---

Suggested fixes

  1. Stop CoworkVMService before package replacement. The updater already fires beforeQuitForUpdate — hook the service stop to it and wait for SERVICE_STOPPED before letting the MSIX swap proceed. Event 658 proves this isn't happening today.
  2. Make the service's shutdown actually shut things down. Either boot the guest with a working ACPI/vsock shutdown channel so HcsShutdownComputeSystem succeeds, or explicitly tear down HNS endpoints and NAT rules on the force-terminate path so state isn't left dirty for the next start.
  3. Declare failure actions in the MSIX manifest instead of setting them at runtime — the runtime call provably fails with Access Denied under MSIX on every boot.
  4. Don't ship ERROR_CONTROL=IGNORE. A service that silently fails to start produces exactly the "app just doesn't open, no error" symptom users keep reporting.
  5. Self-heal on startup: if claude.exe finds a cowork-svc.exe running from a package path that is no longer the registered version, stop the service and restart it from the current path rather than failing silently.
  6. Give users an escape hatch — a supported way to disable the Cowork VM service for users who don't use Cowork (#57371). Today sc.exe config CoworkVMService start= disabled returns Access is denied because of MSIX package protection.

---

Local workaround, for anyone hitting this

Not a fix, and the next update undoes it, but it recovers the machine without a reboot:

Stop-Service CoworkVMService -Force
Stop-Process -Name cowork-svc,chrome-native-host,claude -Force -ErrorAction SilentlyContinue
Start-Service CoworkVMService

If the package itself is wedged, re-registering works more often than reinstalling:

Get-AppxPackage -Name '*Claude*' | ForEach-Object {
  Add-AppxPackage -DisableDevelopmentMode -Register "$($_.InstallLocation)\AppXManifest.xml"
}

---

Prior reports of the same failure

  • #42776 — Desktop fails to relaunch due to orphaned process file lock (open, 116 comments, labelled invalid)
  • #46179 — Store update fails due to CoworkVMService file lock and stuck WindowsApps\Deleted (closed as completed, has repro)
  • #42897 — stuck process after auto-update requires full reboot (closed as duplicate — duplicate target not linked)
  • #36590 — CoworkVMService stops and fails to auto-restart (closed as duplicate)
  • #57371 — request for a way to disable the bundled service (open)

If this duplicates one of the above, please link it to the canonical issue rather than closing it silently — three of the five above were closed as duplicate/invalid with no linked target, which is why the same bug keeps getting refiled.

View original on GitHub ↗

3 Comments

stantheman0128 · 25 days ago

Confirming #83968 with a live before/after capture (Win11 zh-TW)

Reproduced just now on the same failure mode. Captured Event Log before clicking Relaunch and again at the moment of the dialog.

Environment

  • OS: Windows 11, build 10.0.26200, locale zh-TW
  • Install: Claude Desktop MSIX (Claude_pzs8sxrjxfjjc)
  • Before: Claude_1.24012.11.0
  • After (package registered, app cannot launch): Claude_1.25927.0.0

Timeline (local time, UTC+8, 2026-08-05)

| Time | Signal |
|---|---|
| 16:27:20 | AppXDeploymentServer Event 658: Marking package {Claude_1.25927.0.0_…} for deferred registration because {Claude_1.24012.11.0_…} is still running. |
| 16:59:24 | User clicked in-app Relaunch / Update |
| 16:59:24 | Windows dialog: “Another program is currently using this file.” (title bar path …\WindowsApps\Claude_1.25927.0.0_…) |
| 16:59:24 | AppModel-Runtime Event 215: 0x80070020: Cannot create the Desktop AppX container … converting the job |
| 16:59:24 | AppModel-Runtime Event 208: 0x80070020: Cannot create the process … [LaunchProcess] |
| 16:59:24 | cowork-service.log: service stop → immediate restart from new path …\Claude_1.25927.0.0_…\cowork-svc.exe, plus recurring Warning: failed to open service for recovery config: Access is denied. |

After-fail state (no reboot yet)

  • Get-AppxPackage reports 1.25927.0.0 / Status Ok
  • Helium hive still locked: exclusive open of %LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\SystemAppData\Helium\User.dat → sharing violation
  • CoworkVMService RUNNING; chrome-native-host.exe also present
  • UI claude.exe not running (activation fails)

Recovery attempt without reboot (failed)

Tried the thread workaround: Stop-Service CoworkVMService, kill package-related processes / chrome-native-host, Add-AppxPackage -Register, Start-Service, relaunch.

Result: still fails. Fresh Event 215/208 0x80070020 at 17:02:54 (FinishPackageActivation). Matches the “wedged AppX container / kernel hive lock — reboot only” path described in #42776.

Happy to provide ProcMon / full .evtx exports privately if useful. This is an independent confirmation of the Event 658 → 215/208 sequence on a second machine.

lmalma · 25 days ago

Correction to the root-cause analysis in the opening post

Two independent reports since I filed this have moved the diagnosis forward, and one of them contradicts part of what I wrote. Consolidating here so maintainers don't have to reconstruct it from three threads.

What I got wrong

I attributed the file lock to cowork-svc.exe holding handles inside the package directory. That is not the mechanism. Credit to @gannonlawlor, who established this in https://github.com/anthropics/claude-code/issues/42776#issuecomment-5193866362 with a test I hadn't thought to run: with zero Claude processes alive (verified via Win32_Process), HKLM\SYSTEM\CurrentControlSet\Control\hivelist still contained mounted container-silo hives pointing at the package's Helium state.

That report also rules the service out directly — stopping CoworkVMService and holding it dead in a kill loop did not allow activation to succeed. The service is a bystander. So is chrome-native-host.exe.

The actual failure is at the Desktop Bridge container layer: when the app's AppX container is torn down abnormally, its registry hives stay mounted. The next activation collides with those mounts and fails with 0x80070020 (ERROR_SHARING_VIOLATION), surfacing as AppModel-Runtime Events 215 + 208 and the "Another program is currently using this file" dialog. That is also why elevated admin can't clear it — NtUnloadKey2 returns 0xC0000022 unless run as SYSTEM.

What still holds

The Event 658 ordering bug stands, and has now been reproduced on three machines including a second locale (@stantheman0128, Win11 26200 zh-TW, in https://github.com/anthropics/claude-code/issues/83968#issuecomment-5189808528):

Marking package {Claude_<new>_x64__pzs8sxrjxfjjc} for deferred registration
because {Claude_<old>_x64__pzs8sxrjxfjjc} is still running.

Best current reading of the chain — 658 is the trigger, the hive leak is the mechanism that makes it unrecoverable:

update fires while old package is still running        → Event 658, deferred registration
  → old container torn down abnormally mid-swap
    → \REGISTRY\WC\Silo* hives left mounted
      → next activation collides                       → 0x80070020
        → Events 215 + 208, "file in use" dialog
          → dead until reboot (or SYSTEM-level hive unload)

The service-level findings in the opening post (ERROR_CONTROL: IGNORE, empty qfailure, failed to open service for recovery config: Access is denied on every start, HcsShutdownComputeSystem0x80070032 so every VM stop is a hard kill) are still real bugs and still worth fixing — but they explain why the failure is silent, not why it happens.

Retracting the workaround

The Stop-Service + kill + Add-AppxPackage -Register sequence I posted does not work — independently confirmed failing by both reporters above, with fresh 215/208 events after the attempt. Please disregard it. The only non-reboot recovery reported working is NtUnloadKey2(..., REG_FORCE_UNLOAD) on the stale \REGISTRY\WC\Silo* hives as SYSTEM with SeRestore/SeBackup.

Diagnostic step, and a healthy-state baseline

For anyone triaging, this lists the mounted silo hives belonging to the Claude package (read-only, no elevation needed):

$k = Get-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\hivelist'
$k.GetValueNames() |
  Where-Object { $k.GetValue($_) -like '*pzs8sxrjxfjjc*' } |
  ForEach-Object { [PSCustomObject]@{ Hive = $_; Target = $k.GetValue($_) } } |
  Format-List

Match on the publisher ID pzs8sxrjxfjjc alone, not on Claude_pzs8sxrjxfjjc — the version-pinned paths below read Claude_<version>_x64__pzs8sxrjxfjjc, so the narrower filter silently drops exactly the entries of interest.

Run on my machine while the app is running normally (1.25927.0.0, healthy — so this is a baseline, not a fault state), it returns eight entries under four silo GUIDs. Five are family-scoped:

\REGISTRY\WC\Silo213c4dda-…software      -> …\ProgramData\Packages\Claude_pzs8sxrjxfjjc\<SID>\SystemAppData\Helium\Cache\c2a806bfd448d00e.dat
\REGISTRY\WC\Silo213c4dda-…user_sid      -> …\AppData\Local\Packages\Claude_pzs8sxrjxfjjc\SystemAppData\Helium\User.dat
\REGISTRY\WC\Silo213c4dda-…user_classes  -> …\AppData\Local\Packages\Claude_pzs8sxrjxfjjc\SystemAppData\Helium\UserClasses.dat
\REGISTRY\WC\Silo213c4dda-…com           -> …\ProgramData\Packages\Claude_pzs8sxrjxfjjc\<SID>\SystemAppData\Helium\Cache\c2a806bfd448d00e.dat
\REGISTRY\WC\Silo8e191471-…com           -> …\ProgramData\Packages\Claude_pzs8sxrjxfjjc\<SID>\SystemAppData\Helium\Cache\c2a806bfd448d00e_COM15.dat

and three are on a version-pinned path:

\REGISTRY\WC\Silo82ceabc8-…software      -> …\ProgramData\Microsoft\Windows\WindowsApps\Claude_1.25927.0.0_x64__pzs8sxrjxfjjc\Cache\c2a806bfd448d00e.dat
\REGISTRY\WC\Silo82ceabc8-…com           -> (same .dat)
\REGISTRY\WC\Silofc9d833b-…com           -> …\Claude_1.25927.0.0_x64__pzs8sxrjxfjjc\Cache\c2a806bfd448d00e_COM15.dat

One observation I'd flag rather than claim: that second set is keyed to a path containing Claude_1.25927.0.0, the exact version string. The family-scoped hives survive an update unchanged; these version-pinned ones point at a directory that ceases to be the registered version the moment an update lands. If they aren't unmounted as part of the swap, they become mounts referencing a superseded package path — which is precisely the collision shape being reported. I'm not asserting this is the leak; I'm flagging it as worth checking against a machine that is actually wedged, since I only have a healthy sample.

For comparison on the same machine, other MSIX apps (WhatsApp, Windows Terminal, WidgetsPlatformRuntime, Client.WebExperience) each show a single silo GUID family on package-family paths only. Intel Arc Software is the one other app showing the version-pinned WindowsApps\<name>_<version>\Cache shape.

Updated fix suggestions

Superseding items 1–6 in the opening post, in priority order:

  1. Don't start the package swap while the old package is running. Event 658 is Windows telling you this outright, on three machines.
  2. Ensure the container is torn down cleanly on quit/relaunch, so its hives unmount. If the current teardown kills the process before the container is released, that's the bug.
  3. Detect and self-heal on startup. The signature is unambiguous: activation failing 0x80070020 plus \REGISTRY\WC\Silo* entries referencing your own package family. Surface a real error instead of silently doing nothing — right now the user sees a dead icon and nothing else.
  4. Fix the silent-failure enablers regardless: ERROR_CONTROL: IGNORE, the runtime SERVICE_FAILURE_ACTIONS call that always fails under MSIX (declare it in the manifest instead), and the guest ACPI shutdown path so HcsShutdownComputeSystem stops returning ERROR_NOT_SUPPORTED.
  5. Offer a supported way to disable the Cowork VM service (#57371) — even though it's not the cause here, it's still unstoppable by design under MSIX.

Three machines, two locales, two independent reporters, and a documented non-reboot recovery. @gannonlawlor's write-up in #42776 is the most complete account of the mechanism and is worth reading in full.

PotatoFarmerBoat · 12 days ago

Same failure here on Windows 11 Pro 26200, Claude 1.32352.0.0, non-admin corporate account.
Adding one detail I have not seen stated in the existing reports: an ordinary user can stop
the blocking service, so a non-admin workaround exists and the updater could do the same thing
itself.

The blocker:

Name     : CoworkVMService
State    : Running
StartMode: Auto
PathName : "C:\Program Files\WindowsApps\Claude_<version>_x64__<pub>\app\resources\cowork-svc.exe"

The service image lives inside the package directory it is blocking, and it is not a child of
the app, so quitting from the tray never stops it. That is why a reboot is the only thing that
has worked for me.

The security descriptor grants Authenticated Users both start (RP) and stop (WP):

> sc.exe sdshow CoworkVMService
D:(A;;CCLCSWRPWPDTLOCRRC;;;AU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-80-...)

So Stop-Service CoworkVMService succeeds without elevation, which makes two things true:

  1. Users stuck in the "Another program is currently using this file" loop can stop the service,

kill leftover Claude.exe processes, and relaunch, instead of rebooting.

  1. The quit-for-update path could stop its own service before handing over to the MSIX

servicing, with no additional privilege required.

Happy to attach a full process/service dump from the next failure if that is useful.

Showing cached comments. Read the full discussion on GitHub ↗