Start here
The contract
What can change
Verified against
This page as Markdown
Verified 2026-08-05 What was checked, and when — not a guarantee it is still true.
The contract: every rule on one page
This page is generated from the rules on every other page, in order, with no additional prose. If you read nothing else, read this. Each rule links to the page that explains it and carries the same confidence badge.
Every rule on the site, grouped by the page that explains it. Generated — this page cannot disagree with the others.
Treat a folder the user connected as a separate mount with its own rules, not as part of the workspace. Measured
Do not assume a connected project gives you a folder mount. It does not. Measured
Write files using bare or relative filenames, not absolute paths. Measured
Do not leave anything you want the user to see in the working directory alone. Measured
Never pass an absolute session path to the file tools. It is denied, not translated. Measured
Treat your own skill's files as read-only at runtime. Measured
Treat the uploads location as read-only and write everything to the outputs location. Measured
Do not rely on writing a file to a directory as the act of delivering it. Measured
Write the deliverable to a stated path, then present it with whichever delivery tool the session offers; if none exists, state the path and stop. From binary
State the path of what you produced even when a delivery tool worked. Inference
Never call a tool that writes to the user's own disk from inside a skill. From binary
Do not hand-copy files into the outputs location before presenting them. From binary
Assume the session filesystem does not outlive the session. Measured
Assume your skill may run in either of two lanes, and never assume which one. Measured
Treat needing a delete as a design smell, because getting one interrupts the user. Measured
Do not assume that approval to delete in one location applies anywhere else. Measured
Do not move files between mounts with a rename. Copy, then verify. Measured
Expect removing a file or a directory to fail with a permission error on every Cowork mount. Measured
Expect the agent to ask for delete permission on its own the first time a removal fails. From binary
Do not treat a file vanishing from its old path as evidence that it was deleted. Measured
Do not use the inline shell-execution syntax in skill instructions and expect it to run. From binary
Do not rely on arbitrary outbound network access from shell commands. From binary
Do not plan on installing packages at runtime. Inference
Do not assume the sandbox has no third-party libraries. It ships a large preinstalled stack. Measured
Do not expect to read or write anything outside your own session. Measured
Do not pass configuration to your skill's shell commands through the environment. Measured
Do not assume the shell tool has the same name it has in the CLI. Measured
For behaviour rather than reporting, branch on which tools exist instead of on the environment. Measured
Do not hard-fail when a runtime marker is missing. Fall through to the next check. Measured
Do not detect Cowork with a bare environment-variable check. Measured
Detect the runtime with an ordered sequence of checks, not a single environment test. Measured
Remember your skill spans two execution contexts, and test the one you are actually in. Measured
Do not use a hook to export environment variables for your skill's shell commands. Measured
Expect plugin hooks to fire in Cowork. Measured
Install a plugin through the Cowork application if you want Cowork sessions to see it. Measured
Do not write into your plugin's own directory at runtime. Measured
Expect plugin files to be present as a mounted directory, and find it rather than hardcoding it. Measured
Use the plugin-root token for file-tool reads, and discover the mounted path at runtime for anything you execute. From binary
Always name the agent type when dispatching a sub-agent. Measured
Do not plan to resume a finished sub-agent. Dispatch a fresh one with the context restated. From binary
Do not use a sub-agent to get around a path restriction or a permission prompt. Measured
Put everything a sub-agent needs in its prompt. It cannot ask you for more. Inference
Write sub-agent fan-out so that a dispatch being queued or refused is handled, not fatal. From binary
Write sub-agent prompts with relative paths, exactly as you would the main thread. Measured
Detect capabilities at the moment you use them, and state a clear fallback when they are missing. Measured
Do not assume configuration is fixed for the lifetime of a session. From binary
Never write a skill that depends on the exact wording of the system prompt. From binary
Do not treat 'the version has not changed' as evidence that behaviour has not changed. Measured
Assume tool availability and defaults are served to the session, not shipped in the application. Measured
Write down which behaviours your skill depends on, in the skill itself. Inference
Do not hardcode a tool name your skill merely hopes is present. Measured
What the confidence labels mean
Measured Observed live in a real session, with a control where noted.
From binary Read out of a shipped artifact; the behaviour was not exercised.
Inference Stated as inference in the source material — read the caveats.
Unofficial. Not affiliated with Anthropic. Derived from shipped binaries and live
sessions, then stamped with the build it was checked against.
This documentation does not detect product changes — behaviour served from Anthropic's
side can change at any time, with no version bump and no signal here.
Found something wrong?
Open an issue — corrections
are the cheapest way this stays accurate.
By Yaniv Golan · part of the
Claude Code Internals project ·
facts.json · llms.txt