[BUG] Windows MSIX 3P mode: rootfs.vhdx commit fails, app self-terminates (beforeQuit)
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
On Claude Desktop Windows MSIX 1.5354.0, Cowork in 3P mode (Bedrock managed configuration) consistently fails to commit rootfs.vhdx to disk. The app downloads the 2.2 GB rootfs.vhdx.zst to completion (last progress log shows 97.6% with "ETA 5s", followed ~7 seconds later by the start of vmlinuz.zst and initrd.zst parallel downloads — log interval is ~10 seconds, so the download actually reached 100%). Within 6 seconds of those parallel downloads starting, the app self-terminates via app.quit() — without any user action, OS signal, or system shutdown. The rootfs.vhdx commit step ([ClaudeCodeManager-VM] Installed at ...\rootfs.vhdx) never logs, indicating the failure is in the commit/install step, not the download itself. On restart, the VM image downloads are not retried, leaving the installation permanently stuck.
The same machine runs 1P mode correctly end-to-end (same MSIX build, same OS, same network, same user action pattern). Only the mode differs.
Log evidence points to the MSIX AppxManifest not registering the Claude-3p folder as a virtualized path, so the VM service's expected commit destination never auto-exists on disk.
Environment
| | |
|---|---|
| Claude Desktop | 1.5354.0 (x64, MSIX) |
| Package family | Claude_pzs8sxrjxfjjc |
| claude-code | 2.1.121 |
| VM bundle hash | 5680b11bcdab215cccf07e0c0bd1bd9213b0c25d |
| OS | Windows 11 Enterprise, version 25H2, Build 26200 |
| CPU virtualization | Enabled (BIOS) |
| VirtualMachinePlatform | Enabled |
| HypervisorPlatform | Enabled |
| Microsoft-Hyper-V-All | Disabled — not needed; 1P works without it |
| Inference provider | Amazon Bedrock, us-west-2 |
Same-machine 1P vs 3P comparison
| | 1P (success, 10:26-10:38) | 3P (failure, 10:00-10:04) |
|---|---|---|
| MSIX log | virtualization active — ...\Claude exists | not virtualized — ...\Claude-3p absent |
| Data path (logical) | %APPDATA%\Claude\ | %LOCALAPPDATA%\Claude-3p\ |
| Actual storage (post-redirect) | ...\LocalCache\Roaming\Claude\ — auto-created by MSIX | ...\LocalCache\Roaming\Claude-3p\ — never created |
| vm_bundles\claudevm.bundle\ | rootfs.vhdx + sessiondata.vhdx + smol-bin.vhdx + vmlinuz + initrd | empty (directory itself never exists) |
| rootfs.vhdx commit step | Installed at ...\rootfs.vhdx logged after download completes | commit step never runs (download completes; next step fails) |
| beforeQuit self-termination | none | 6 seconds after vmlinuz/initrd start |
| [workspaceMcpServer] bash | vmStatus=ready, PPTX produced | vmStatus=failed, nothing works |
| MCP servers active | 10 | 7 (missing cowork-onboarding, mcp-registry, visualize) |
Single independent variable: mode. Everything else is identical. The 1P session passes through the exact same post-download moment where vmlinuz.zst and initrd.zst start in parallel (10:30:17-10:30:18) without self-terminating. The download-completion timing itself is not the trigger — the MSIX virtualization state is. In 1P, [VM] getVMStorageSubpath at 10:30:34 resolves the commit path successfully and the commit proceeds.
What Should Happen?
The VM bundle should commit to disk (same five files 1P produces: rootfs.vhdx, sessiondata.vhdx, smol-bin.vhdx, vmlinuz, initrd), the VM service should reach configure(), and workspace bash tools should work — just as 1P mode does on the same machine.
Error Messages/Logs
All fingerprints below appear in every 3P reproduction session.
**1. MSIX virtualization reports the Claude-3p path ABSENT**
[MSIX] Filesystem not virtualized — C:\Users\<user>\AppData\Local\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude-3p absent (likely Squirrel upgrade)
Compare with 1P mode on the same machine, same version:
[MSIX] Filesystem virtualization active — C:\Users\<user>\AppData\Local\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude exists
**2. rootfs.vhdx commit step never runs**
`[ClaudeCodeManager-VM] Installed at ...\rootfs.vhdx` is **never written** in any 3P session. The download reaches at least 97.6% (last progress log; log interval ~10s, so actual completion is ~100%), and the next step (parallel `vmlinuz.zst` / `initrd.zst` downloads) does start — proving the download itself finished. The failure is at the commit/install step:
10:04:07 [info] [download:3] 97.6% (2180.0/2233.9 MB) avg 10.90 MB/s, ETA 5s
10:04:14 [info] [download:4] Starting download from .../vmlinuz.zst
10:04:14 [info] [download:5] Starting download from .../initrd.zst
10:04:20 [info] beforeQuit: handler fired, going down
**3. Self-termination via beforeQuit (no user action, no OS signal)**
10:04:20 [info] beforeQuit: handler fired, going down
10:04:20 [info] beforeQuit: handler is not yet run, preventing quit and cleaning things up
Electron's `beforeQuit` is emitted by (1) user UI quit, (2) OS signal, (3) internal `app.quit()`. Paths 1 and 2 are ruled out (I did nothing; no system shutdown). Only path 3 is possible.
**4. VM service never reached configure()**
10:04:20 [warn] [HostLoop] VM boot failed; bash proxy unavailable:
failed to set VHDX path:
VHDX file not found: C:\Users\<user>\AppData\Local\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude-3p\vm_bundles\claudevm.bundle\rootfs.vhdx
10:04:20 [error] Failed to run onQuitCleanup(cowork-vm-shutdown):
Error: not configured: call 'configure' first
The cleanup handler fails because `configure()` was never called. The VM service was waiting for a VHDX at the MSIX-virtualized path that, per fingerprint #1, does not exist.
**5. VM image downloads are never retried after the auto-restart**
After the auto-restart at 10:04:21, only the Linux CLI binary (`claude.zst`) is re-downloaded on each subsequent launch. `rootfs.vhdx.zst`, `vmlinuz.zst`, `initrd.zst` are never attempted again.
Full logs are attached (see Additional Information).
Steps to Reproduce
100% reliable on this machine.
- Remove all Claude state (so we test a clean install):
``powershell``
Get-Process -Name "Claude*","claude*","cowork*" -EA SilentlyContinue | Stop-Process -Force
Get-AppxPackage -Name "Claude*" | Remove-AppxPackage
Remove-Item -LiteralPath "$env:LOCALAPPDATA\Claude-3p" -Recurse -Force -EA SilentlyContinue
Remove-Item -LiteralPath "$env:LOCALAPPDATA\Packages\Claude_pzs8sxrjxfjjc" -Recurse -Force -EA SilentlyContinue
Remove-Item -LiteralPath "$env:APPDATA\Claude" -Recurse -Force -EA SilentlyContinue
Remove-Item -LiteralPath "HKCU:\SOFTWARE\Policies\Claude" -Recurse -Force -EA SilentlyContinue
Remove-Item -LiteralPath "HKLM:\SOFTWARE\Policies\Claude" -Recurse -Force -EA SilentlyContinue
- Install Claude Desktop MSIX from https://claude.com/download.
- On the login screen, do not sign in. Open menu → Help → Troubleshooting → Enable Developer Mode.
- Developer → Configure third-party inference:
- Provider: Bedrock (AWS)
- Region: us-west-2
- AWS bearer token: (any valid token)
- Model:
global.anthropic.claude-sonnet-4-6
- Apply locally. App restarts in 3P mode.
- Do nothing else. Wait ~3-4 minutes.
Result: app self-terminates, restarts once, then stays unusable for workspace tasks forever on this install. Reproduced deterministically.
Claude Model
Sonnet (default)
Is this a regression?
I don't know
Last Working Version
_No response_
Claude Code Version
2.1.121 (via Claude Desktop 1.5354.0)
Platform
AWS Bedrock
Operating System
Windows
Terminal/Shell
PowerShell
Additional Information
Root cause hypothesis
The MSIX AppxManifest does not register Claude-3p as a virtualized folder, while it does register Claude.
Evidence chain:
[MSIX] Filesystem not virtualized ... Claude-3p absentis logged on every 3P start. The exact message states the virtualized path was not created.- 1P counterpart logs
Filesystem virtualization active ... Claude existson every 1P start — proving MSIX does auto-create virtualized paths, just not forClaude-3p. - The
[VM] getVMStorageSubpathlog in 1P resolves the subpath to the MSIX-virtualized%LOCALAPPDATA%\Packages\...\LocalCache\Roaming\Claude\claude-code-vm. The VM service expects to write VM bundle files into the MSIX-virtualized location. - In 3P, the equivalent virtualized location (
...\LocalCache\Roaming\Claude-3p\vm_bundles\) does not exist, so the VM bundle commit has no destination. The rename/commit fails silently, the VM service never reachesconfigure(), and the app takes theapp.quit()branch. failed to set VHDX path: VHDX file not found ...\Claude-3p\vm_bundles\claudevm.bundle\rootfs.vhdxconfirms the VM service was looking for the file in the MSIX-virtualizedClaude-3ppath and did not find it.
Alternatives ruled out
- Environment — 1P works on the same PC. Hyper-V role disabled in both cases. No EDR interference in logs.
- Timing / LAM race — 1P goes through the same post-download moment (parallel
vmlinuz.zst/initrd.zstdownloads afterrootfs.vhdx.zstcompletes) without self-terminating. The download-completion timing itself is not the trigger. - Dirty install state — reproduced on a clean, fresh install with all prior data removed.
Attachments
3p-failure-main.log.txt— extracted from%LOCALAPPDATA%\Claude-3p\logs\main.log, 3P failure session1p-success-main.log.txt— extracted from%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\logs\main.log, 1P success session on the same PC
Personal identifiers masked as <user>, <account-id>, <org-id>, <session-id>, <vm-instance-id>.
This issue has 6 comments on GitHub. Read the full discussion on GitHub ↗