Cowork VM fails to start: signature verification rejects valid multi-volume AppX package copy
Summary
Cowork's isolated Linux VM fails to start with "Workspace unavailable. The isolated Linux environment failed to start" on every attempt, specifically for locally-scheduled Cowork sessions. Root cause traced to cowork-svc.exe's own internal signature verification rejecting a valid, currently-installed copy of itself on a machine with two registered AppX package volumes (C: and D:).
Environment
- Windows 11, Claude Desktop 1.30096.5.0 (package:
Claude_1.30096.5.0_x64__pzs8sxrjxfjjc) - Machine has two registered AppX package volumes:
C:\Program Files\WindowsApps(default)D:\WindowsApps(registered asHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Appx\PackageVolumes\2,SisPath = D:\WindowsApps)- This is a pre-existing, legitimate machine configuration — other Store apps are also deployed under
D:\WindowsAppson this machine.
Symptom
- Cowork UI shows:
Workspace unavailable. The isolated Linux environment failed to start. - Fails specifically for locally-scheduled Cowork sessions (Cowork's own internal scheduler — confirmed via
schtasks /queryreturning zero matches for any Claude/Cowork-related Windows Scheduled Task, so this is not OS Task Scheduler). CoworkVMService(Windows service, runs asLocalSystem) isRunningthroughout.
Diagnostic trail
cowork-service.log(host side): repeatedClient connectedentries, zeroVM started successfullyentries — the client connects and is rejected before VM creation.cowork_vm_node.log: flooded with, once per second:
````
[warn] [vm-client] Event resubscribe failed: Error: signature verification failed: client D:\WindowsApps\Claude_1.30096.5.0_x64__pzs8sxrjxfjjc\app\claude.exe was not started from the package directory C:\Program Files\WindowsApps\Claude_1.30096.5.0_x64__pzs8sxrjxfjjc
coworkd-user.log(guest/VM side): last entry from a genuinely successful prior session (mounts, process spawn, clean exit) — stale since before the failures began, consistent with the VM never being reached at all during the failure window.- Ruled out (with evidence, not assumption):
- Service not running →
Get-Service CoworkVMService=Running. - Wrong/stale Windows Scheduled Task → none exists (
schtasks /queryclean, even from an elevated prompt). - Wrong user/account context →
Get-Process -IncludeUserName -Name claudeshows every running instance owned by the interactive user, none by any other local account. - Stale cached VM/session state file → recursive filename and content search (
Select-String) of%APPDATA%\Claudeand%LOCALAPPDATA%\Claudeforcowork|vm|session/D:\WindowsAppsfound nothing.
- Confirmed root cause via registry + filesystem:
```
reg query HKLM /f "D:\WindowsApps" /s /d
D:\WindowsApps\Claude_1.30096.5.0_x64__pzs8sxrjxfjjc\app\resources\cowork-svc.exe
returned a live Windows Firewall rule for — the exact current version, exact Cowork helper binary.`
`
Test-Path "D:\WindowsApps\Claude_1.30096.5.0_x64__pzs8sxrjxfjjc\app\resources\cowork-svc.exe" # True
Test-Path "C:\Program Files\WindowsApps\Claude_1.30096.5.0_x64__pzs8sxrjxfjjc\app\resources\cowork-svc.exe" # True
cowork-svc.exe` is genuinely, identically deployed to both volumes for the same package version.
Both are real files.
Root cause
(Get-Item ...cowork-svc.exe).LastWriteTime is identical to the second on both volumes (2026-08-15 07:44:26 AM) — these are not a stale leftover vs. a fresh update, they are twin copies from a single deployment/replication operation.
This machine has two local Windows accounts (USER, interactive daily user; ADM, local admin). Get-AppxPackage -AllUsers shows Claude registered for both: Installed for USER, Staged for ADM. The working theory is that Windows' AppX deployment service replicates a package across every registered volume (C: and D: here) specifically to guarantee availability regardless of which account/session activates it — a legitimate, by-design behavior on multi-account machines with divergent default install volumes, not corruption or an abandoned install.
Given that, both copies are equally valid, correctly signed, byte-identical files. The actual defect is that Cowork's client verification does a plain path-string comparison against one hardcoded/cached "expected" directory (apparently derived from Get-AppxPackage's single reported InstallLocation), rather than validating the calling process's package identity/signature via the proper AppX APIs (which are volume-agnostic). The moment any activation path — here, Cowork's local-schedule trigger — gets legitimately served from the non-primary volume, the check fails permanently, with no retry/recovery logic: every reconnect attempt repeats the identical failure indefinitely (observed once per second in the logs).
Suggested fix
- Cowork's client authentication should validate the calling process via package identity/signature (e.g.
GetPackageInfo/Appx APIs), not a hardcoded/cached directory path string — so any legitimately-deployed copy of the package, on any registered volume, passes. - Given this stems from routine multi-volume package replication (a normal Windows behavior on multi-account machines), this is likely to affect any user with more than one local account and more than one registered AppX volume — not an edge case specific to this machine.
Note
A related in-app feedback report may have been filed via Claude Desktop's feedback flow on 2026-08-15 for the same issue; I don't have a retrievable ticket ID for it, flagging in case it helps correlate on Anthropic's end.
Showing cached comments. Read the full discussion on GitHub ↗
3 Comments
Update: root cause was more specific than originally reported, and one part of the original theory was wrong
Further investigation (with VM debug logging enabled, plus the service's own historical log under
C:\ProgramData\Claude\Logs\cowork-service.log) refines — and partly corrects — the original report.Correction: this is not "two equally-legitimate replicated copies"
The original report treated the C: and D: copies as two valid, in-sync replicas produced by routine multi-volume package replication. That's wrong.
C:\ProgramData\Claude\Logs\cowork-service.logretains service-side history going back to 2026-05-21. Across that entire history — roughly 3 months, ~24 distinct app versions — every single successfulClient signature verifiedentry was for aD:\WindowsApps\...client path. Zero exceptions. Zero rejections of any kind are logged before 2026-08-13 03:22:26 (the last successful D: verification). D: has been the sole, long-standing, properly-authorized install location on this machine the whole time — not a passive duplicate.The
C:\Program Files\WindowsApps\...copy only exists as of the current app version. It has never once been successfully verified.The actual user-facing symptom
Before VM debug logging was enabled, the error visible to the user was simply "Workspace unavailable. The isolated Linux environment failed to start." With debug logging on, the underlying error is:
occurring specifically inside
[ScheduledTasks] startVM/[HostLoop], at the "Configuring Windows VM service..." step. This has been failing on a steady ~5 minute cadence since at least 2026-08-14 (confirmed inmain.log, using the app's normal non-debug logging — this is not new or intermittent). The repeating[vm-client] Event resubscribe failed: signature verification failedwarning (the focus of the original report) is a secondary symptom of the same root cause, not a separate issue.Scope: only the scheduled/background VM-start path is affected
Every foreground/interactive launch of
claude.exe, checked repeatedly viaGet-Process -IncludeUserName, resolves correctly toC:\Program Files\WindowsApps\...(matching the current, though newly-established,InstallLocation) and is unaffected. Only the scheduled/background VM-start code path resolves execution from the D: copy (confirmed via a stack trace in the VM debug log showing the failing code executing fromD:\WindowsApps\...\app.asar\...) and then gets rejected by a signature check that apparently assumes the client must match the single currentInstallLocation(C:), rather than tolerating the package's actual, historically-authorized location.New evidence: C: itself appears to lack proper capability authorization
Attempting
Move-AppxPackage -Package Claude_<version>_x64__pzs8sxrjxfjjc -Volume <C: volume>fails with:This app declares restricted capabilities (e.g. the
computerUse/automation-related features visible in its owndesktop-featuresflag dump). Restricted capabilities normally require proper Store-mediated authorization. This failure suggests the C: deployment never received that authorization, while D: has three months of proven, successful authorization behind it — consistent with C: being the newly (and incompletely) provisioned side of this split, not D:.Remediation attempts that did NOT resolve it
For anyone else hitting this, or for triage — none of the following fixed it:
Remove-AppxPackage -Package <id> -User <secondary-local-account-SID>(un-registering the package for a second local account that had itStagedbut never launched) — no effect.Move-AppxPackage -Volume <C:>— fails with the capability-authorization error above.Move-AppxPackage -Volume <D:>— succeeds (no error) but is a silent no-op:InstallLocationremains C: afterward, D:'s files were already present so nothing was actually migrated.takeown /r,icacls /grant Administrators:F /t, thenRename-Item) — ownership and permissions succeed cleanly (confirmed viaicacls; Administrators ends up with effective Full Control), Controlled Folder Access is confirmed disabled, and Resource Monitor's handle search confirms no process has any file in that folder open — yetRename-Itemstill fails withAccess to the path is denied. This points to Windows enforcing package integrity on an actively-registered AppX folder at a level below ACLs/open-handle checks, not a permissions problem — direct filesystem tampering on a live-registered package folder appears to be structurally blocked outside the AppX servicing APIs.Currently proceeding to a full uninstall (via Settings, confirming both the C: and D: copies are actually gone from disk afterward) + reinstall, since every lighter-weight remediation has been exhausted.
Suggested fix (revised)
The scheduled/background VM-start path's signature check should validate the calling process's package identity via the proper AppX APIs (as originally suggested), tolerant of the package's actual authorized location — not assume the single most-recently-registered
InstallLocationis automatically correct. On this machine, the most-recently-registered location (C:) is in fact the less-trustworthy one: it has never passed capability authorization, while the location it's rejecting (D:) has three months of proven, successful use.Update 2: confirmed regression, no viable local fix exists
A full uninstall + fresh reinstall does not resolve this
After exhausting the lighter-weight remediation attempts listed in the previous update, I did a full uninstall via Settings (confirmed via
Get-AppxPackage -AllUsersreturning completely empty, andTest-Pathconfirming neither the C: nor D: package folders existed anymore) followed by a fresh install of the current version, from the same source originally used (direct download from claude.ai, not the Microsoft Store).The fresh install recreated the exact same C:/D: split automatically.
dir D:\WindowsApps\Claude_<version>_x64__pzs8sxrjxfjjcimmediately after the fresh install shows the package folder with timestamps matching the install itself (same day, minutes afterGet-AppxPackage's C:InstallLocationwas confirmed). This was not a leftover, not a stale cache, not anything carried over from the old install — it was written fresh, by the current installer, on a machine that had zero prior Claude package registration.The signature-check failure resumed immediately afterward, citing the identical D: client path as before.
This means the root cause is structural, not incidental
This machine has a second AppX package volume registered (
D:\WindowsApps,PackageVolumes\2in the registry) — likely from a past "install new apps to D:" configuration, and shared with several other unrelated Store apps. As long as that second volume stays registered, Windows' own deployment stack writes every install/update/repair of this package to both volumes simultaneously. That's not unique to this app or something a user did wrong — it's ordinary AppX behavior on any machine with more than one registered package volume. It's very likely reproducible on any machine in the same configuration, not specific to this machine's history.Confirmed regression
Per the previous update, the service's own historical log shows this exact machine — in this exact dual-volume configuration — worked correctly for three months across roughly two dozen prior app versions, always being served from (and always successfully verified from) the D: copy. The signature-verification logic that now rejects that same D: copy is new in the current version. The dual-volume deployment itself did not change; the app's tolerance for it did.
No reasonable local remediation exists
The only action that reliably stops Windows from re-splitting the deployment is
Remove-AppxVolumeon the D: volume — but that volume is also currently used by other, unrelated installed apps on this machine (confirmed via matching Windows Firewall rules for those apps' own D:-based binaries). Removing it to work around this bug would mean accepting unknown impact on completely unrelated software, which isn't a reasonable ask of anyone hitting this. Given that, and that a full uninstall/reinstall (the most disruptive option available to an end user) doesn't help either, there does not appear to be any viable client-side workaround — this needs a fix in Cowork's client verification logic itself: it must tolerate the package being validly deployed to more than one registered AppX volume, rather than hard-rejecting any client not served from the single most-recently-registeredInstallLocation.Note: This seems to be the same as "Claude Desktop for Windows: Cowork RPC pipe closed Workaround" (https://github.com/anthropics/claude-code/issues/85199), and the workaround that is suggested there is working for me (obviously this still needs a fix, running the service myself every time is not an acceptable solution).