[BUG] Cowork macOS: VirtioFS mount fails on every prompt after first successful artifact mount — OneDrive symlinked ~/Documents

Resolved 💬 3 comments Opened Apr 23, 2026 by jasonthunt-del Closed Apr 23, 2026

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?

Cowork on macOS fails with an RPC virtiofs mount error on every prompt after the first artifact is successfully created, including non-artifact prompts (e.g. "hello"). The first artifact mounts and renders correctly, but the VM registers Documents as a stale file node in the virtual root and all subsequent mount attempts fail.

This is a regression/variant of issues #42795, #25293, and related virtiofs mount bugs. The specific environment trigger is an enterprise macOS configuration where ~/Documents is a symlink to OneDrive CloudStorage — common on CBRE and other enterprise-managed Macs.

What Should Happen?

Artifact on Cowork should be created successfully and follow up attempts to use cowork should continue without issue.

Cowork should either:
Keep the virtiofs mount alive between prompts within the same session,
OR
Cleanly re-mount the artifact path on subsequent prompts without leaving a corrupted file node in the virtual root

Error Messages/Logs

RPC error: failed to mount /mnt/.virtiofs-root/shared/Users/JHunt13/Documents/Claude/Artifacts/test-artifact-2026 as .artifacts/test-artifact-2026: source path does not exist and could not be created: /mnt/.virtiofs-root/shared/Users/JHunt13/Documents/Claude/Artifacts/test-artifact-2026: mkdir /mnt/.virtiofs-root/shared/Users/JHunt13/Documents: file exists

Steps to Reproduce

1.) Use macOS with ~/Documents symlinked to OneDrive CloudStorage:

/Users/JHunt13/Documents -> /Users/JHunt13/Library/CloudStorage/OneDrive-CBRE,Inc/Documents

2) Open Claude Desktop and start a new Cowork session
3) Ask Cowork to create any artifact (e.g. a simple HTML dashboard)
4) Observe: first artifact creates and mounts successfully ✓
5) Send any follow-up prompt in the same session — including a plain text prompt with no artifact involved (e.g. "how are you feeling")
6) Observe: RPC mount error fires immediately ✗

Claude Model

Sonnet (default)

Is this a regression?

Yes, this worked in a previous version

Last Working Version

_No response_

Claude Code Version

Claude Desktop app (macOS) — Claude 1.3883.0 (93ff6c) 2026-04-21T17:24:01.000Z

Platform

Anthropic API

Operating System

macOS

Terminal/Shell

Terminal.app (macOS)

Additional Information

Actual Behavior

First artifact mount: succeeds
Every subsequent prompt in the same session: fails immediately with the error above
The VM registers /mnt/.virtiofs-root/shared/Users/JHunt13/Documents as a file node after the first mount
All subsequent mount attempts through the same Documents path node fail with file exists
This affects all prompts, not just artifact creation — even plain conversational prompts trigger a mount attempt

<h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Environment</h2>
<div class="overflow-x-auto w-full px-2 mb-6">
Field | Value
-- | --
OS | macOS (latest)
Hardware | Apple MacBook (managed CBRE enterprise device)
Claude Desktop version | Latest
Plan | Enterprise (CBRE)
~/Documents | Symlink → /Users/JHunt13/Library/CloudStorage/OneDrive-CBRE,Inc/Documents
OneDrive | Enabled, CBRE-managed

</div>
<hr class="border-border-200 border-t-0.5 my-3 mx-1.5">
<h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Filesystem Configuration</h2>
<div role="group" aria-label="bash code" tabindex="0" class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100"><div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><button class="inline-flex
items-center
justify-center
relative
isolate
shrink-0
can-focus
select-none
disabled:pointer-events-none
disabled:opacity-50
disabled:shadow-none
disabled:drop-shadow-none border-transparent
transition
font-base
duration-300
ease-[cubic-bezier(0.165,0.85,0.45,1)] h-8 w-8 rounded-md backdrop-blur-md _fill_10ocf_9 _ghost_10ocf_96" type="button" aria-label="Copy to clipboard" data-state="closed"><div class="relative"><div class="transition-all opacity-100 scale-100" style="width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="transition-all opacity-100 scale-100" aria-hidden="true" style="flex-shrink: 0;"><path d="M12.5 3A1.5 1.5 0 0 1 14 4.5V6h1.5A1.5 1.5 0 0 1 17 7.5v8a1.5 1.5 0 0 1-1.5 1.5h-8A1.5 1.5 0 0 1 6 15.5V14H4.5A1.5 1.5 0 0 1 3 12.5v-8A1.5 1.5 0 0 1 4.5 3zm1.5 9.5a1.5 1.5 0 0 1-1.5 1.5H7v1.5a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5H14zM4.5 4a.5.5 0 0 0-.5.5v8a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5z"></path></svg></div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50" style="width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="transition-all opacity-0 scale-50" aria-hidden="true" style="flex-shrink: 0;"><path d="M15.188 5.11a.5.5 0 0 1 .752.626l-.056.084-7.5 9a.5.5 0 0 1-.738.033l-3.5-3.5-.064-.078a.501.501 0 0 1 .693-.693l.078.064 3.113 3.113 7.15-8.58z"></path></svg></div></div></div></button></div></div><div class="text-text-500 font-small p-3.5 pb-0">bash</div><div class="overflow-x-auto"><pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5" style="color: rgb(20, 24, 31); background: transparent; font-family: var(--font-mono);"><code class="language-bash" style="color: rgb(20, 24, 31); background: transparent; font-family: var(--font-mono); white-space: pre;"><span><span>$ </span><span class="token token" style="color: rgb(0, 81, 194);">ls</span><span> -la ~/Documents
</span></span><span><span>lrwxr-xr-x </span><span class="token token" style="color: rgb(0, 128, 128);">1</span><span> JHunt13 staff </span><span class="token token" style="color: rgb(0, 128, 128);">63</span><span> Mar </span><span class="token token" style="color: rgb(0, 128, 128);">24</span><span> </span><span class="token token" style="color: rgb(0, 128, 128);">11</span><span>:21 /Users/JHunt13/Documents -</span><span class="token token" style="color: rgb(20, 24, 31);">&gt;</span><span>
</span></span><span>/Users/JHunt13/Library/CloudStorage/OneDrive-CBRE,Inc/Documents
</span><span>
</span><span><span>$ </span><span class="token token" style="color: rgb(0, 81, 194);">ls</span><span> -la ~/Documents/Claude/
</span></span><span><span>drwxr-xr-x@ </span><span class="token token" style="color: rgb(0, 128, 128);">5</span><span> JHunt13 staff </span><span class="token token" style="color: rgb(0, 128, 128);">160</span><span> Apr </span><span class="token token" style="color: rgb(0, 128, 128);">23</span><span> </span><span class="token token" style="color: rgb(0, 128, 128);">16</span><span>:22 </span><span class="token token" style="color: rgb(179, 74, 0);">.</span><span>
</span></span><span><span>lrwxr-xr-x </span><span class="token token" style="color: rgb(0, 128, 128);">1</span><span> JHunt13 staff </span><span class="token token" style="color: rgb(0, 128, 128);">30</span><span> Apr </span><span class="token token" style="color: rgb(0, 128, 128);">23</span><span> </span><span class="token token" style="color: rgb(0, 128, 128);">16</span><span>:22 Artifacts -</span><span class="token token" style="color: rgb(20, 24, 31);">&gt;</span><span> /Users/JHunt13/ClaudeArtifacts
</span></span><span><span>drwxr-xr-x@ </span><span class="token token" style="color: rgb(0, 128, 128);">3</span><span> JHunt13 staff </span><span class="token token" style="color: rgb(0, 128, 128);">96</span><span> Apr </span><span class="token token" style="color: rgb(0, 128, 128);">21</span><span> </span><span class="token token" style="color: rgb(0, 128, 128);">11</span><span>:29 Scheduled</span></span></code></pre></div></div>
<p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">Note: <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">Artifacts</code> was manually symlinked to a local directory (<code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">/Users/JHunt13/ClaudeArtifacts</code>) as a workaround attempt — this fixed the first mount but did not resolve the subsequent prompt failure.</p>
<hr class="border-border-200 border-t-0.5 my-3 mx-1.5">
<h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Workarounds Attempted</h2>
<p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">All of the following were attempted and <strong>did not resolve the issue</strong>:</p>
<ol class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-decimal flex flex-col gap-1 pl-8 mb-3">
<li class="whitespace-normal break-words pl-2"><strong>Created <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">~/Documents/Claude/Artifacts</code> directory manually</strong> — first mount succeeds, subsequent prompts still fail</li>
<li class="whitespace-normal break-words pl-2"><strong>Symlinked <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">Artifacts</code> to a truly local directory</strong> (<code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">/Users/JHunt13/ClaudeArtifacts</code>) — same result, first mount succeeds, all subsequent prompts fail</li>
<li class="whitespace-normal break-words pl-2"><strong>Cleared stale session references</strong> (<code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">cowork-enabled-cli-ops.json</code>, <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">git-worktrees.json</code>, <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">local-agent-mode-sessions</code>) before each session — allows one successful artifact per session, but the error recurs on the very next prompt</li>
<li class="whitespace-normal break-words pl-2"><strong>Started a brand new Cowork session</strong> after each artifact — same one-mount-per-session limitation</li>
<li class="whitespace-normal break-words pl-2"><strong>Pointed Cowork to a different project folder</strong> — Cowork still hardcodes artifact output to <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">~/Documents/Claude/Artifacts/</code>, ignoring the selected project folder</li>
</ol>
<hr class="border-border-200 border-t-0.5 my-3 mx-1.5">
<h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Root Cause Analysis</h2>
<p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">The issue has two layers:</p>
<p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"><strong>Layer 1 — OneDrive symlink incompatibility (existing known bug):</strong>
virtiofs cannot traverse <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">~/Documents</code> when it is a symlink to OneDrive CloudStorage. The VM's mount layer expects a real local directory, not a symlink to a cloud filesystem driver. This is documented in #25293 and #42795.</p>
<p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"><strong>Layer 2 — Stale file node not released between prompts (new/variant bug):</strong>
After the first successful mount (achieved via the local Artifacts symlink workaround), the VM registers <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">Documents</code> as a node in <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">/mnt/.virtiofs-root/</code>. On every subsequent prompt — including non-artifact prompts — Cowork attempts to re-mount the artifact path. The VM finds the <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">Documents</code> node already registered as a file rather than a directory and fails with <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">file exists</code>. This node is <strong>not cleared between prompts within the same session</strong>, making Cowork non-functional after the first artifact regardless of other workarounds.</p>
<hr class="border-border-200 border-t-0.5 my-3 mx-1.5">
<h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Feature Request / Suggested Fix</h2>
<ol class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-decimal flex flex-col gap-1 pl-8 mb-3">
<li class="whitespace-normal break-words pl-2"><strong>Add <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">artifactsPath</code> config override</strong> to <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">claude_desktop_config.json</code> — this would allow enterprise users to redirect artifact storage to a local path outside of OneDrive, e.g.:</li>
</ol>
<div role="group" aria-label="json code" tabindex="0" class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100"><div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><button class="inline-flex
items-center
justify-center
relative
isolate
shrink-0
can-focus
select-none
disabled:pointer-events-none
disabled:opacity-50
disabled:shadow-none
disabled:drop-shadow-none border-transparent
transition
font-base
duration-300
ease-[cubic-bezier(0.165,0.85,0.45,1)] h-8 w-8 rounded-md backdrop-blur-md _fill_10ocf_9 _ghost_10ocf_96" type="button" aria-label="Copy to clipboard" data-state="closed"><div class="relative"><div class="transition-all opacity-100 scale-100" style="width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="transition-all opacity-100 scale-100" aria-hidden="true" style="flex-shrink: 0;"><path d="M12.5 3A1.5 1.5 0 0 1 14 4.5V6h1.5A1.5 1.5 0 0 1 17 7.5v8a1.5 1.5 0 0 1-1.5 1.5h-8A1.5 1.5 0 0 1 6 15.5V14H4.5A1.5 1.5 0 0 1 3 12.5v-8A1.5 1.5 0 0 1 4.5 3zm1.5 9.5a1.5 1.5 0 0 1-1.5 1.5H7v1.5a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5H14zM4.5 4a.5.5 0 0 0-.5.5v8a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5z"></path></svg></div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50" style="width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="transition-all opacity-0 scale-50" aria-hidden="true" style="flex-shrink: 0;"><path d="M15.188 5.11a.5.5 0 0 1 .752.626l-.056.084-7.5 9a.5.5 0 0 1-.738.033l-3.5-3.5-.064-.078a.501.501 0 0 1 .693-.693l.078.064 3.113 3.113 7.15-8.58z"></path></svg></div></div></div></button></div></div><div class="text-text-500 font-small p-3.5 pb-0">json</div><div class="overflow-x-auto"><pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5" style="color: rgb(20, 24, 31); background: transparent; font-family: var(--font-mono);"><code class="language-json" style="color: rgb(20, 24, 31); background: transparent; font-family: var(--font-mono); white-space: pre;"><span><span> </span><span class="token token" style="color: rgb(43, 48, 59);">{</span><span>
</span></span><span><span> </span><span class="token token" style="color: rgb(184, 10, 24);">"preferences"</span><span class="token token" style="color: rgb(20, 24, 31);">:</span><span> </span><span class="token token" style="color: rgb(43, 48, 59);">{</span><span>
</span></span><span><span> </span><span class="token token" style="color: rgb(184, 10, 24);">"artifactsPath"</span><span class="token token" style="color: rgb(20, 24, 31);">:</span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">"/Users/JHunt13/ClaudeArtifacts"</span><span>
</span></span><span><span> </span><span class="token token" style="color: rgb(43, 48, 59);">}</span><span>
</span></span><span><span> </span><span class="token token" style="color: rgb(43, 48, 59);">}</span></span></code></pre></div></div>
<ol class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-decimal flex flex-col gap-1 pl-8 mb-3" start="2">
<li class="whitespace-normal break-words pl-2"><strong>Detect OneDrive/symlinked paths</strong> at session start and warn the user to select a local directory</li>
<li class="whitespace-normal break-words pl-2"><strong>Release or refresh the virtiofs mount node</strong> between prompts rather than leaving a stale file node in the virtual root</li></ol>

Claude-logs-2026-04-21T21-15-31-594Z.zip

View original on GitHub ↗

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