[BUG] Windows desktop app won't launch after package upgrade: "Another program is currently using this file" (0x80070020) -- old version's AppX container silo pinned by an orphaned elevated Claude Code child process
Summary
After a Claude Desktop (Windows) package upgrade, launching the app fails every time with a MessageBox saying "Another program is currently using this file". No process holds the file. The real failure is AppX container creation returning 0x80070020 (ERROR_SHARING_VIOLATION) at the job-to-silo conversion step, because the PREVIOUS version's Desktop AppX container job was still alive in the kernel, pinned by an orphaned elevated child process of a Claude Code session the old app had spawned. Root cause confirmed live on my machine: killing the two pinning processes cleared the stale silo instantly and the new version launched. No reboot.
I have hit this on many upgrades over months. Reboot was the only known cure, which now makes sense: reboot kills the orphans.
Environment
- Windows 11 IoT Enterprise 10.0.26200
- Upgrade Claude 1.17377.1.0 -> 1.17377.2.0 (new package folder created 04:02, old app instance exited ~08:02 when I tried to relaunch)
- No reboot between versions
Symptom
Every launch method (Start Menu, taskbar, explorer.exe shell:AppsFolder\Claude_pzs8sxrjxfjjc!Claude) yields:
[Window Title]
C:\Program Files\WindowsApps\Claude_1.17377.2.0_x64__pzs8sxrjxfjjc\app\Claude.exe
[Content]
Another program is currently using this file.
[OK]
Sysinternals handle64 finds no handles on Claude.exe or the package folder. Defender real-time off makes no difference. Add-AppxPackage -Register of the manifest succeeds and changes nothing.
Underlying error
Microsoft-Windows-AppModel-Runtime/Admin, on every attempt:
Event 215: 0x80070020: Cannot create the Desktop AppX container for package
Claude_1.17377.2.0_x64__pzs8sxrjxfjjc because an error was encountered
converting the job.
Event 208: 0x80070020: Cannot create the process for package Claude_1.17377.2.0_...
because an error was encountered while configuring runtime. [LaunchProcess]
0x80070020 = HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), from the job-to-silo conversion (NtSetInformationJobObject(JobObjectCreateSilo)). The MessageBox is just the raw Win32 string for error 32. Misleading, since no file is in use at all.
Root cause (confirmed, not a hypothesis)
The kernel object namespace (NtQueryDirectoryObject on \) still contained the OLD version's app container job after the upgrade:
Job Container_Claude_1.17377.1.0_x64__pzs8sxrjxfjjc-S-1-5-21-<usersid>
Opening that job elevated and querying JobObjectBasicProcessIdList showed exactly 2 remaining members: an elevated tool-install console (llama-svc.exe -i -elevated -pause, started hours before the upgrade by a Claude Code session running inside the old desktop app) and its conhost.
The chain:
- Claude Code sessions spawned by the desktop app run inside the app's Desktop AppX container, and every descendant inherits the silo job, invisibly.
- One session started an elevated child. The elevated process still lands in the container job.
- At teardown, the non-elevated parent cannot terminate the elevated descendant (OpenProcess with PROCESS_TERMINATE is denied across the elevation boundary), so it is silently left behind.
- The orphan keeps the old version's container job/silo alive across the package upgrade.
- Every activation of the new version then fails to create its container for the same package family + user + session: STATUS_SHARING_VIOLATION at silo conversion, surfaced as the "file in use" MessageBox.
Control observation: in the same second a launch failed, the packaged CoworkVMService's own container (session 0) was created successfully. The collision is per user session, not machine-global, which is why nothing else on the system misbehaves.
Proof: taskkill /f of the two PIDs (elevated) made the stale job vanish from the kernel namespace immediately, and the app launched normally on the next attempt.
Ruled out live
- Defender real-time scanning (disabled, still failed)
- Launch method (raw exe vs AUMID activation, identical failure)
- Package registration (
Add-AppxPackage -Registersucceeded, ACLs repaired, still failed) - Stale RuntimeBroker (killed, still failed)
- CoworkVMService and its container (service stopped, container destroy confirmed in the event log, still failed)
Reproduction
- Run Claude Desktop on Windows, open a Claude Code session in it.
- From that session, start a long-lived elevated process.
- Exit Claude Desktop, let the package upgrade.
- Launch the new version: the MessageBox appears on every attempt until the elevated orphan exits or the machine reboots.
Suggested fix
1 - Reap container descendants with SYSTEM privileges at teardown. CoworkVMService already runs as SYSTEM. On app exit (or service stop) it could terminate remaining members of the app's container job, which it can open regardless of elevation.
2 - Self-heal on launch: when activation fails with 0x80070020, look for a stale Container_Claude_<oldversion>_..._<usersid> job in the kernel namespace and have the service terminate its members, then retry. That turns a months-long recurring hard failure into a one-time hiccup.
3 - At minimum, surface a better error than the raw Win32 string. "Another program is currently using this file" sends the user hunting for file locks that do not exist.
Additional context
Diagnosed live in a Claude Code CLI session (the desktop app being down). Happy to provide the full transcript or run further diagnostics on this machine. I keep a local workaround script now that enumerates the stale container job and kills its members, so I can repro/verify a fix on the next upgrades.
Showing cached comments. Read the full discussion on GitHub ↗
3 Comments
This isn't a one-off. It's a recurring family of Windows launch/update failures that all surface the same "Another program is currently using this file" MessageBox (the raw Win32 string for error 32) and all clear on reboot:
Open: #53247, #61635, #42776, #77379, #77421, #76357, #75337
Closed: #67911, #59934, #61342, #51847
The common thread across every one is "reboot is the only known cure." That now makes sense: reboot works because it kills the leftover processes keeping the old package's AppX container job alive in the kernel. Nobody's machine is special -- everyone is just rebooting, so the actual fault (a leaked container silo) never gets pinned down and each report reads as isolated.
What I found on mine that the reboot-only reports approximate but miss: the job wasn't held by a service holding a handle. It had live MEMBER processes still inside it -- an elevated child (
llama-svc.exe -i -elevated) that a Claude Code session had spawned inside the old desktop app's container, plus its conhost. The non-elevated teardown can't kill an elevated descendant (PROCESS_TERMINATE is denied across the elevation boundary), so it's left behind and pinsContainer_Claude_<oldversion>_..._<usersid>across the upgrade.taskkill /fon those two member PIDs made the stale job vanish from the kernel namespace immediately and the app launched. No reboot.That's the practical difference from #77379, where killing the
svchostthat held a job HANDLE just respawned under a new PID and the block persisted. On the reboot-only reports it's worth checking whether there's a leftover elevated MEMBER process still inside the container job (open the job and queryJobObjectBasicProcessIdList), not only a service holding a handle -- if there is, killing it clears the block with no reboot.The fix ask stands: reap the container's descendants with SYSTEM privilege at teardown (the packaged Cowork service already runs as SYSTEM and can open the job regardless of elevation), and self-heal on launch -- when activation fails with 0x80070020, find the stale
Container_Claude_<oldversion>job and terminate its members before retrying. That turns a months-long recurring hard failure into a one-time hiccup.Full live diagnosis (event IDs 215/208, everything I ruled out, the repro) is in the issue body above.
Same
0x80070020container-silo collision, but with a different (and I suspect more common) trigger: the app's own packagedCoworkVMService, not a leftover Claude Code child.Hit this today on Windows 11 (26200) after an in-place MSIX update to
Claude_1.24012.1.0_x64__pzs8sxrjxfjjc. Identical symptom and the sameMicrosoft-Windows-AppModel-Runtime/Adminfingerprint you documented (208[LaunchProcess]+215"converting the job"), but there was no orphaned elevated Claude Code process anywhere — nollama-svc.exe, no leftoverClaude.exe, nothing totaskkill. Restart Manager reported no file lock, confirming it's purely a kernel Job/silo collision, not an open handle.What was actually pinning the container
The package's own service,
CoworkVMService(app\resources\cowork-svc.exe):TYPE = WIN32_PACKAGED_PROCESS,START_TYPE = AUTO_START,SERVICE_START_NAME = LocalSystem\pipe\cowork-vm-service)So it runs as LocalSystem in session 0, creates the package's Desktop AppX container first, and the interactive
Claude.exe(session 1) then can't create/convert its own. Event order on every launch attempt:Why the taskkill workaround doesn't apply here — and why nothing in userland fixes it
sc config CoworkVMService start= disabled→ Access Denied even from an elevated admin shell. The service SD grantsDC/WD(change-config) only toNT SERVICE\AppXSvc; Administrators and LocalSystem get onlyRP/WP(start/stop), no reconfigure.Stop-Servicesucceeds, but it trigger-restarts on the next launch.HKLM\SYSTEM\CurrentControlSet\Services\CoworkVMService\Start = 4(the key is admin-writable) → AppXSvc reverts it toAutomaticon the next package activation.What fixed it
A reboot. The update had left
C:\Program Files\WindowsApps\Deletedreporting "116 files failed to delete" and re-fired a package Register op on every launch — i.e. servicing was only half-applied. The reboot completed the deferred servicing and cleared the stale kernel container job. After reboot,CoworkVMService(session 0) and interactiveClaude.exe(session 1) coexist fine, exactly as before the update — Cowork works, no208/215at all. On this machine a reboot was the only reliable recovery, because the racing process is the app's own AppXSvc-managed service that can't be disabled from userland.Suggestion for the self-heal (item #2 in the OP)
The "enumerate stale container job members, terminate, then retry" idea should also cover the case where the container is held by the package's own
CoworkVMServicein session 0 racing the interactive session — not just leftover elevated Claude Code descendants. Sequencing interactive activation to own the container before the LocalSystem service starts (or having the service defer to / join a session-1 container) would prevent the post-update race entirely.Env: Windows 11 Pro 26200 · Claude Desktop
1.24012.1.0· package familyClaude_pzs8sxrjxfjjc.Still live six weeks later, and on much newer builds than the one I filed against. I hit it again here yesterday. This machine is now on
1.30096.1.0, the same package version as the report below.#86555 was filed today against package
1.30096.1.0. Mine was1.17377.1.0 -> 1.17377.2.0. Same dialog, same "only a reboot clears it", same "every update", so nothing across that whole span of versions changed the outcome.Six tickets have link-cited this one since I filed it: #76980, #80286, #76357, #84962, #53247, #86555. The family anchors are much bigger than any single report: #42776 is at 55 upvotes and 119 comments, #53247 at 11. This is not machine-specific.
What the last month actually added is that the one symptom now has three separate pinners, and only the first is fixable from userland:
CoworkVMServiceracing the interactive session from session 0 (albertomenache above, plus #83968 and #76357). Nothing to kill.sc configis Access Denied even from an elevated shell,Stop-Serviceloses to the named-pipe start trigger, and AppXSvc reverts the registryStartvalue on the next activation.User.dat/UserClasses.dat) held by PID 4Systemand PID 180Registry(#53247). Kernel holders, so no user-mode kill exists at all, and enumerating by package identity returns zero processes in the container.Three causes, one dialog, and two of the three cannot be cleared by anything the user is able to run. That is the case for item 2 of my original ask: reap the container's members from the packaged SYSTEM service at teardown, and self-heal on launch when activation fails with
0x80070020, rather than leaving a reboot as the only recovery.One diagnostic correction worth carrying forward, from afram123 in #80286:
0x80070020does not show up inAppXDeploymentServer/Operational, because this is an activation failure and not a deployment one.Get-AppxPackagereportsStatus: Ok. The events are inMicrosoft-Windows-AppModel-Runtime/Admin, IDs 215 and 208.