[BUG] Claude Code desktop app (Windows MSIX): idle stealth update quits app, child process survives, register fails 0x80073D02, app unlaunchable until hidden process is killed
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet (this is a refile of #63397, which the triage bot auto-closed as off-topic and locked; its close message asks for a new issue if still relevant)
- [x] This is a single bug report
- [x] I am using the latest version of Claude Code
What's Wrong?
This is about the Claude Code desktop app for Windows (the MSIX build that hosts Claude Code sessions). When it wedges as described below, all Claude Code work on the machine is blocked until the manual recovery is done.
The idle "stealth update" quits the app to apply a staged package, but a Claude child process survives the quit. The MSIX register then fails with 0x80073D02 ("Unable to install because the following apps need to be closed"). This leaves the app unlaunchable: clicking the icon does nothing, no window appears, and nothing shows under Apps in Task Manager. Windows suggests the Settings > Apps > Repair flow. Repair also fails with the same 0x80073D02 (the surviving process still holds the package), but the failed repair makes the hidden process visible in Task Manager. Ending that task lets the registration complete and the app launches normally.
This has hit the same machine three days in a row (8/20, 8/24, 8/25).
What Should Happen?
The stealth update should wait for the full Claude process tree to exit (or use -ForceTargetApplicationShutdown semantics) before registering the package, so the register cannot race the app's own surviving children. The app should relaunch normally after an update with no manual recovery.
Error Messages/Logs
%APPDATA%\Claude\logs\main.log ends at the stealth update on 8/20 and never resumes:
2026-08-20 17:39:13 [info] [updater] Staged version 1.34493.0 is still current (latest: 1.34493.0, lastTarget: null)
2026-08-20 17:46:13 [info] [stealth-update] Triggering stealth update after idle timeout
2026-08-20 17:46:13 [info] beforeQuitForUpdate handler fired, going down for update
2026-08-20 17:46:13 [info] Windows session ending (close-app) - quitting the app
Microsoft-Windows-AppXDeploymentServer/Operational shows the register failing repeatedly (each cluster is one manual recovery cycle: launch fails, repair fails, end hidden task, relaunch works):
8/24/2026 9:23:11 AM 419 error 0x80073D02: Unable to install because the following apps need to be closed Claude_1.34493.1.0_x64__pzs8sxrjxfjjc.
8/24/2026 9:23:11 AM 401 Deployment Register operation ... failed with error 0x80073D02.
8/25/2026 10:31:32 AM 419 error 0x80073D02: Unable to install because the following apps need to be closed Claude_1.34493.1.0_x64__pzs8sxrjxfjjc.
8/25/2026 10:41:41 AM 419 error 0x80073D02: Unable to install because the following apps need to be closed Claude_1.34493.1.0_x64__pzs8sxrjxfjjc.
The 10:41:41 failure is 7 seconds before the successful relaunch at 10:41:48, immediately after ending the hidden process. Accompanying events each time: 404, 401, 8104 (Trust Label, 0x80070057), 8107. Package status after manual recovery is Ok (Get-AppxPackage Claude), so the package itself is fine; the failure is the register racing the app's own surviving process.
Steps to Reproduce
- Run the Claude desktop app on Windows (sideloaded MSIX) with an update staged.
- Leave the app idle until the stealth updater fires (
[stealth-update] Triggering stealth update after idle timeoutin main.log). - The app quits itself for the update. A child process survives the quit.
- MSIX register fails with 0x80073D02. The app icon now does nothing and no process is visible under Apps.
- Settings > Apps > Claude > Repair fails with the same error, but the surviving process becomes visible in Task Manager afterward.
- End the task, launch the app, everything works until the next stealth update.
User-side workaround that skips the repair dance: Get-Process claude | Stop-Process -Force, then launch normally.
Claude Model
Other (Fable 5)
Is this a regression?
I don't know
Claude Code Version
2.1.220 (Claude Code), desktop app 1.34493.1.0 (MSIX, package family Claude_pzs8sxrjxfjjc)
Platform
Anthropic API (claude.ai account via desktop app)
Operating System
Windows (11 Home, build 10.0.26200)
Terminal/Shell
Other (Claude Code desktop app)
Additional Information
- Refile of #63397: same race, same error code, closed by the triage bot as "doesn't appear to be about Claude Code" without human review, now locked.
- #84992 / #81698 / #80444 reach a similar stuck-package end state via a GPU crash instead of the updater; different trigger, related cleanup problem (surviving processes holding the package).
- #42776 describes an orphaned process holding a file lock on relaunch.
- Install location:
C:\Program Files\WindowsApps\Claude_1.34493.1.0_x64__pzs8sxrjxfjjc
Showing cached comments. Read the full discussion on GitHub ↗
5 Comments
The 0x80073D02 register failing three days running is the stealth updater quitting before the whole process tree is done, so the surviving claude.exe holds the package hostage. Your
Get-Process claude | Stop-Process -Forcefix is the right one, and to keep it from re-happening I'd check for any process whose path contains 'Claude' before launching, and look for an auto-update toggle to flip off while this build is out. If the kill ever stops clearing it,Get-AppxPackage *Claude* | Remove-AppxPackageand reinstall is the heavy reset. oh, btw, I made a portable Hermes OTG rescue agent that runs off a USB stick for exactly these update-breaks-the-install moments, https://github.com/MilkyWay008/Hermes-OTG if you want a look.Independent confirmation from a second machine, plus one mechanism detail that I don't think has been mentioned yet: the service's own attempt to avoid being restarted during servicing fails with Access Denied, and it fails by design.
Same failure, different machine, newer version
Claude_pzs8sxrjxfjjcMicrosoft-Windows-AppXDeploymentServer/Operational, two register attempts ~12 minutes apart, both for the newer package:Same accompanying 404 / 401 / 8104 (0x80070057) / 8107 cluster described in the original report.
Get-AppxPackagereportsStatus: Okafterwards — the package is intact; only the registration races the surviving processes.Earlier the same day, the deployment log also recorded the abort reason explicitly:
The mechanism detail: the app tries to prevent this and is denied by Windows
CoworkVMServicelogs this on every start and every stop, in the Application event log and inC:\ProgramData\Claude\Logs\cowork-service.log:The second line is the interesting one — the service is deliberately trying to disarm its recovery actions so that it is not auto-restarted during package servicing, i.e. exactly the race in this issue. It cannot.
Why it cannot, verified on this machine:
Translating the ACEs (
RawSecurityDescriptor+Translate([NTAccount])) gives:| ACE | Account | SERVICE_CHANGE_CONFIG (DC) |
|---|---|---|
|
;;;AU|NT AUTHORITY\Authenticated Users| no ||
S-1-5-80-1949724575-…|NT SERVICE\AppXSvc| yes || — |
NT AUTHORITY\SYSTEM| absent || — |
BUILTIN\Administrators| absent || — |
NT SERVICE\CoworkVMService| absent |So the DACL of this packaged service grants config rights only to AppXSvc. The service runs as LocalSystem, and neither LocalSystem nor an elevated Administrator can call
sc failure/sc sdseton it — both returnOpenService FAILED 5: Access is denied(I tested twice from an elevated console; logs kept).That appears to be intended Windows behaviour for
WIN32_PACKAGED_PROCESSservices rather than a packaging mistake, so I'd expect it can't be fixed by adjusting the ACL at install time. But it does mean the app's existing mitigation (disarm recovery actions before stopping for servicing) is dead code on Windows — it can never succeed. Worth knowing before relying on it as part of a fix.Possible amplifier: number of configured MCP servers
On this machine the app runs ~23
claude.exeprocesses, of which 15 are--type=utility(roughly one per configured MCP server), about 8.4 GB RSS in total. Every one of those is another child that has to exit before the register can succeed, so the more MCP servers a user has configured, the wider the window for the race. That may explain why some users hit this daily and others never do — might be a useful signal for reproducing it.Frequency here
Four versions in 17 days on this machine —
1.26832.0(Aug 8) →1.34493.0(Aug 20) →1.34493.1(Aug 21) →1.37937.0(Aug 25). Each update is one automatic quit plus one register that can lose the race, which matches the "three days in a row" pattern in the original report.Workaround confirmation
Get-Process claude | Stop-Process -Forcethen relaunch works here too. StoppingCoworkVMServicefirst (elevated) and then runningAdd-AppxPackage -DisableDevelopmentMode -Register "<InstallLocation>\AppXManifest.xml"makes it deterministic — the Settings → Repair button never succeeds, because it does not terminate the surviving processes before registering.
Contrast case: same trigger and same end state, but the register succeeds here — four times — and the app still won't launch
Posting this because it cuts against the mechanism in the report rather than confirming it, which I think is more useful for narrowing the cause.
Same trigger as yours (idle stealth update), same end state (app unlaunchable, "still running" on relaunch), but
0x80073D02never occurs on this machine. If the surviving-process-blocks-the-register theory were the whole story, this box should not be able to fail the way it does.Environment
| | |
|---|---|
| App | MSIX
Claude_pzs8sxrjxfjjc, builds 1.37937.0 → .1 → .3 || OS | Windows 11 Pro 22631.6199 (23H2) |
| Hardware | RTX 4090, 64 GB |
Two of three stealth updates hung on the way out
The register is not the blocker here
Microsoft-Windows-AppXDeploymentServer/Operationalfor the 32-minute outage:Four successful registrations across 31 minutes, and the app stayed dark through all of them.
Searching the full
AppXDeploymentServer/Operationallog over 10 days: zero0x80073D02and zero0x80070020for any Claude package. The only0x80073D02on the machine belongs toMicrosoft.OneDriveSync.Caveat I can't resolve from logs alone: the repeated
RegisterByPackageFullNamecalls at 20:51 / 21:00 / 21:01 are consistent with the user retrying launch or Repair, so I can't cleanly separate "system blocked" from "user retried and it silently no-opped". What is certain is that every registration that ran, succeeded, and the app did not appear for another 8 minutes after the last one.What does correlate: files still pinned in
WindowsApps\DeletedEvent 493 fired five times across the outage and after:
at 21:01:39, 21:04:05, 21:08:55, 21:09:06, 21:15:06 — i.e. still recurring after the app came back. Consistent with something holding old package files open without that ever surfacing as a register failure. Offered as correlation, not a diagnosis.
Suggestion for triage
The two machines share the trigger (
stealth-update→beforeQuitForUpdate→ hang) and the outcome, but not the middle step. That points at the quit path rather than the registration path as the common root — the register failure in the OP may be a downstream symptom on machines where the timing lines up, not the cause. The proposed fix in the OP (wait for the full process tree to exit before registering) would still address both.Two notes for anyone gathering logs on this issue
Application Hang(Event 1002) is a usable detector. The OP notesmain.logjust ends with no error. On this machine Windows logs Event 1002 namingclaude.exeand its exact version, at the moment of the wedge.Get-WinEvent -FilterHashtable @{LogName='Application';Id=1002}gives timestamps and versions when the app log gives nothing.%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\logs\(and the%APPDATA%\Claude\logs\alias this issue quotes) to%LOCALAPPDATA%\Claude\Logs\. The old file is left frozen in place with nothing indicating the handover, so reading the old path after updating returns a stale snapshot that looks like a quiet machine. Already flagged on #80444; repeating here since this issue quotes the old path.Confirming this still reproduces on a much newer build than the one in the
original report, and adding a timing baseline plus one observation about why
this is hard to reproduce.
Environment
| | |
| --- | --- |
| Desktop app | 1.40609.0.0 (issue reports 1.34493.1.0) |
| Claude Code | 2.1.247 (issue reports 2.1.220) |
| Install | MSIX,
SignatureKind: Developer,Claude_1.40609.0.0_x64__pzs8sxrjxfjjc|| OS | Windows 11 Home, build 26200.9168 |
The stealth relaunch normally takes 3–4 seconds, which gives you a watchdog threshold
Gaps between
Windows session ending (close-app)and the nextStarting appin
%LOCALAPPDATA%\Claude\logs\main.log:| shutdown | relaunch | gap |
| --- | --- | ---: |
| 2026-08-25 14:21:06 | 14:21:10 | 4s |
| 2026-08-25 23:08:32 | 23:08:36 | 4s |
| 2026-08-26 23:57:41 | 23:57:44 | 3s |
| 2026-08-28 11:22:08 | 11:25:16 | 188s — app unlaunchable throughout; only came back after a reboot |
Rotated logs show the same path taking 32s (2026-08-14 15:52:51) and 17s
(2026-08-15 00:33:46) on occasions when it did complete, so the relaunch is
not reliably fast even in the success case.
The failure window produces zero log output
This is probably why it has been hard to reproduce on your side. The trigger is
logged:
…and then nothing until the next successful start. The app has already exited,
so the failed registration, the retry attempts, and the user-facing "another
program is using this file" dialog are all unrecorded. Everything after the gap
is the successful post-reboot launch, which looks entirely healthy:
A relaunch marker written before the quit and reconciled on next start — or a
detached watchdog that logs when the expected relaunch has not arrived within
~15s — would turn this from "unreproducible" into a signal you can query.
Not a crash.
%APPDATA%\Claude\Crashpad\reportsis empty for the preceding7 days. The exit is the app's own deliberate quit-for-update, not a fault.
One inconsistency worth checking: the app already branches on MSIX for its
other update path — it logs
[CCD-autoupdate] Disabled: MSIX installat everylaunch — but the
stealth-update/beforeQuitForUpdate/stealth-relaunchflow still runs on MSIX installs.
What I could not confirm
I rebooted instead of running the
Get-Process claude | Stop-Process -Forceworkaround, so I did not capture the registration error code and cannot
independently confirm the surviving-child-process mechanism in this instance —
only the trigger, the symptom, and the timings above. If it recurs I will
capture the
Get-AppxPackagestatus and the exact error before clearing it.Follow-up with harder evidence than a process-name kill: even a fully clean process list AND a stopped service still fails the register step. This rules out "some leftover claude.exe survives" as a complete explanation.
What was tried
A scheduled task fires on the first deployment event of the repair (
Id=665, no delay — before the "package disabled" step that closes the app), so it can act ~30s before the register step that fails. Over several iterations it escalated to:claude/cowork-svc— still failed every time.desktop6:Service Name="CoworkVMService"in the manifest,TYPE 210 WIN32_PACKAGED_PROCESS) —Stop-Servicesucceeds (confirmedStatus=Stoppedat the critical moment), butSet-Service -StartupType Disabledfails withAccess is deniedeven from an elevated Administrator session (the DACL only grantsSERVICE_CHANGE_CONFIGtoNT SERVICE\AppXSvc).chrome-native-host.exeand a Python interpreter belonging to an MCP extension (windows-mcp), both running from%LOCALAPPDATA%\Packages\<family>\LocalCache\Roaming\..., as orphans (parent wascmd.exe, not anyclaude.exe).Result: 14 real cycles, 0 successes
Including the cycle immediately after step 3 above — logged state at the exact failure moment:
Zero processes matching the package by name or by executable path anywhere on the system, service confirmed
Stopped— andRegisterByPackageFullNamewithRepairAppRegistrationOptionstill reports (same cluster every time):GetActiveAumidsInPackagereports success (finds an "active" AUMID) with no corresponding live process anywhere. That points at the AppModel Runtime's own package-state tracking (the "package singleton" bookkeeping visible in the same log asId=10007,Id=68runtime-status transitions) being out of sync with the actual process table, rather than a specific leftover child process. If that's right, no amount of killing processes from outside will fix it — it needs whatever internal API actually clears that AUMID's active flag, or a full unregister/re-register (not just repair) to reset the state cleanly.The workaround holds up in production regardless
Separate from the register step failing, the app itself has been recovered automatically 19 times in a row over 4 days by a fallback that does
Add-AppxPackage -Registerdirectly (not through the "repair" path, noRepairAppRegistrationOption) after clearing processes — that call succeeds every time, so the app is never left unusable for more than well under a minute. So the underlying race is still unresolved, but it's fully masked from the user's side at this point.