Claude Desktop (Windows MSIX): Crash loop when SkillsPlugin attempts atomic directory replacement for skill updates

Resolved 💬 2 comments Opened Mar 5, 2026 by badakim9404-collab Closed Mar 8, 2026

Environment

  • App: Claude Desktop (Windows Store / MSIX)
  • Version: 1.1.4498
  • OS: Windows 11 Home 10.0.26200 (x64)
  • CPU/RAM: AMD Ryzen 5 5600, 16GB

Description

Claude Desktop crashes immediately after login and enters a crash loop when the SkillsPlugin attempts to update existing skills (atomic directory replacement). The app can download skills fresh (Delta: 5) but consistently fails when updating existing skills (Delta: 2).

This issue is reproducible and has occurred multiple times over several days.

Evidence from logs

Skill sync behavior pattern (from main.log):

| Scenario | Delta | Sync Complete? | Occurrences |
|----------|-------|---------------|-------------|
| Fresh download (no local files) | 5 | Yes | 2/2 |
| No changes needed | 0 | Yes | 9/9 |
| Update existing skills (replace) | 2 | Never — crash | 6/6 |

Crash sequence (repeats every restart):

[SkillsPlugin] Found 5 enabled skills
[SkillsPlugin] Delta: 2 to download, 0 to remove
                                                    ← No "Sync complete" ever appears
[error] Sentry caught: { type: 'Unknown', value: 'No message', stack: undefined }
[error] Uncaught Error: Minified React error #418   ← Hydration error crashes renderer
Starting app {                                      ← App restarts, same cycle

.tmp directories accumulate:

Each failed update attempt leaves behind temporary directories that never get renamed:

skills/docx/                    ← existing (20084 bytes)
skills/docx.tmp.1772668207828/  ← failed update attempt 1
skills/docx.tmp.1772668237625/  ← failed update attempt 2
skills/docx.tmp.1772669243752/  ← failed update attempt 3
skills/pptx/                    ← existing (9182 bytes)
skills/pptx.tmp.1772668207789/  ← failed attempt (9400 bytes — newer version)
skills/pptx.tmp.1772669243766/  ← failed attempt

Server-side skill update triggered the issue:

# Old manifest (working):
docx: updatedAt=2026-02-03T15:09:44
pptx: updatedAt=2026-02-03T15:09:44

# New manifest (after fresh re-download):
docx: updatedAt=2026-03-04T20:23:13  ← server pushed update
pptx: updatedAt=2026-03-04T20:23:13  ← server pushed update

Root cause hypothesis

The SkillsPlugin downloads updated skills to .tmp directories, then attempts an atomic directory rename to replace the existing skill directory. This rename operation fails silently in the Windows MSIX sandboxed filesystem (AppData\Local\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\...).

The failure is likely caused by:

  1. MSIX filesystem virtualization interfering with atomic directory renames
  2. VM session holding file locks on mounted skill directories (--plugin-dir /sessions/.../mnt/.skills) during periodic sync
  3. The combination of both — the sync timer fires while a VM session has the skills directory mounted

The unhandled rename failure propagates to the Electron renderer, causing a React hydration error (#418) and app crash. Since the .tmp files and stale manifest persist, every restart triggers the same failure.

Workaround

Deleting all local skills and the manifest forces a fresh download (Delta: 5) which always succeeds:

SKILLS="$APPDATA/Claude/local-agent-mode-sessions/skills-plugin/<org-id>/<account-id>"
rm -rf "$SKILLS/skills/"*
rm -f "$SKILLS/manifest.json"

Suggested fix

  1. Catch and handle rename failures gracefully — fallback to delete-then-rename instead of atomic swap on Windows
  2. Skip skill sync while VM sessions have the skills directory mounted — check for active mounts before attempting updates
  3. Clean up orphaned .tmp directories on startup before attempting sync
  4. Don't crash the renderer on skill sync failure — the sync should fail silently and retry later

Steps to reproduce

  1. Use Claude Desktop on Windows (MSIX/Store version)
  2. Start a task session (which mounts the skills directory in the VM)
  3. Wait for Anthropic to push a server-side skill update (or manually modify a local skill file to create a version mismatch)
  4. The next periodic skill sync (every 10 minutes) will attempt Delta: N update
  5. App crashes and enters crash loop

Log file paths

  • %APPDATA%\Claude\logs\main.log — main process log showing skill sync failures
  • %APPDATA%\Claude\logs\claude.ai-web.log — renderer log showing React #418 errors
  • %APPDATA%\Claude\logs\cowork_vm_node.log — VM process log

View original on GitHub ↗

This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗