Verified 2026-09-23

Writing skills that survive Cowork

Claude Cowork runs your skill in a sandbox with rules that differ from the Claude Code CLI in ways that will silently break an otherwise-correct skill. This site covers the nine failure modes that actually show up: wrong path forms, deliverables that vanish on delivery, delete calls that fail with a permission error, a shell that cannot see your environment, runtime detection that reports the wrong answer, plugin paths that resolve differently per consumer, an input prompt the host steers away from, sub-agent assumptions that do not hold, and behaviour that changes with no version bump at all.

Derived from shipped binaries and live sessions. This site does not detect product changes.

Start from the symptom

What you saw → why → what to do instead
Tool refused the path your shell just printed
The file tools reject the shell’s absolute form outright — a literal prefix test, not a translation.
Pass the outputs location's absolute path.
Your file exists, the user never saw it
The working directory is a scratch space that is never presented or listed.
Present it, and state the path.
rm / rmdir fails with a permission error
Every Cowork mount denies exactly those two operations by default.
Design so no delete is needed.
Moving a file between mounts fails
A rename cannot cross a mount boundary.
Copy, then verify.
Your env var is empty inside the shell
The shell is sealed: host exports and hook exports do not reach it.
Pass config as arguments.
Detection reports “not Cowork” inside Cowork
The part of your skill running shell commands has none of those markers set.
Use ordered checks; branch on tools.
A global install fails or disappears
Global installs do not take effect, and nothing persists past the session.
Prefer the preinstalled stack.
A tool name from the CLI does not exist
Tool surfaces are served to the session, not shipped in the app.
Check it exists before naming it.
A long run goes silent and the user asks what is happening
Nothing in the runtime narrates, and the one nudge meant to break a silent stretch was never observed firing.
Write the progress messages into the skill, at the steps that matter.
Your skill says nothing was attached, but the user attached a file
It looked in a fixed uploads directory; the file is somewhere else in this sandbox.
Resolve the path from the message that announced the attachment.
Your plugin's MCP tools are missing in a cloud session
The sandbox does not start them; the Desktop app on the user's machine does, and only for stdio servers while it is open.
Ship a stdio command (shim an HTTP endpoint), drop user-configuration placeholders, and tell users to keep Desktop open.
Your skill ran, but none of its scripts or sub-agents did
A surface can serve your skill's text without your plugin around it, and nothing announces that.
Test for a file you ship and cannot work without, and stop when it is missing.

The five that break the most skills

If you read nothing else.

  1. 01
    Absolute session paths are denied by the file tools every time, and from Desktop 2.7032.0 so are bare filenames.
  2. 02
    Write to a stated path, present it, and name the path anyway.
  3. 03
    The shell your skill runs in is sealed — including from your own hooks.
  4. 04
    A bare environment-variable check false-negatives where it matters most.
  5. 05
    The surface is served, not shipped. It can change mid-session.

How to read the labels

Confidence — how we know
MEASUREDFROM BINARYINFERENCE
Neutral on purpose. Provenance is not severity.

Severity — what it costs you
Breaks silently Fails loudly Costs friction
Editorial, not measured — a judgement about consequence.

9 failure modes, one page each

Where this fits in your workflow

Same author as this site, and not part of the verified material.
Starting a skill
skill-creator-plus

A skill for building skills: draft, run evals against a baseline, review the results, iterate. Based on Anthropic's skill-creator and substantially reworked since. Its runtime reference encodes several of the rules documented here — including the two-sandbox delivery split and the fact that a rendered page has no way to send anything back — so a skill scaffolded with it starts on the right side of them.

Checking a skill you already have
cowork-harness

Runs a skill against Cowork's runtime contract from scenario files — including whether it triggers at all, how it behaves in each sandbox, and whether its output actually gets delivered. Has a replay mode that runs in CI. Every rule here raises the same question — does mine do this? — and clicking through a real session to find out is slow, and easy to get wrong in exactly the ways this site documents.

75 rules in total · see them all on one page