From documentation
Use this skill whenever you are writing or updating technical documentation: a README, an install guide, setup or config docs, dev docs, API docs, help text, a troubleshooting section, and also every commit message and pull request description. Trigger on "write a README", "document this", "update the install guide", "our docs are out of date", "write the commit message", "open a PR", or "write the PR description". It edits the file directly, and it verifies every path, command, and flag against the actual code before writing about them. This is technical writing: transactional prose, no author's voice to preserve. Do NOT use it for writing that has a voice: essays, blog posts, emails, marketing copy, anything persuasive or personal. Those belong to the `draft` plugin. Do not use it to ghostwrite something new from nothing; it documents systems that already exist.
How this skill is triggered — by the user, by Claude, or both
Slash command
/documentation:writeThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Documentation earns the reader's time or wastes it. There is no third option, and no credit
Documentation earns the reader's time or wastes it. There is no third option, and no credit for sounding good. Every rule below exists because a real doc broke one of them.
Work in this order. Steps 1 and 2 happen before a word gets drafted.
No em dash (—) may appear in anything this skill writes. Not in a doc, not in a README,
not in a commit message, not in a PR description, not in a code comment, not in chat while
running this skill. Zero. This is absolute and has no exceptions, including the ones you are
about to invent: it is not allowed in a quotation you are paraphrasing, not allowed because the
surrounding file already uses them, not allowed because the sentence "needs" one. En dashes
(–) in prose are out too. A hyphen in a range (3-5) or a compound word (well-formed) is
fine.
If you catch yourself reaching for one, the sentence has told you something. Use one of these instead:
Before you save any file or print any message, search your text for — and – and remove
every one. This check is not optional and it is not "usually fine to skip."
Answer three questions and write the answers down where you can see them:
The rest of the doc follows from this. For a skeptical, non-technical reader, a silent failure is worse than a loud one, and a sentence admiring the architecture reads as a sales pitch, which is what makes a skeptic close the tab. For an engineer who has done this four times, the same sentence is just in the way. Same fact, opposite treatment, and the only thing that decides it is who is reading.
Don't skip this because the doc is small. A troubleshooting entry has a reader too.
Every proper noun in a doc is a factual claim: file paths, command names, flags, env vars, package names, menu items. Claims can be false, and docs rot silently, because nobody re-reads the install guide while changing the code.
Grep everything greppable. Before writing about it, confirm it exists:
<tool> --help rather than trusting memory.If a doc already exists and describes something that is no longer in the repo, that section is
not badly worded. It is fiction. Delete it and say so. Do not sync its wording to the
current code and call the doc updated; there is nothing under it to sync. (A real one: an
install guide walked users through a .env file, a Node check, and hand-editing a JSON config,
for a skill that had been deleted from the repo months earlier.)
Do not invent the UI. Install flows, menu paths, click sequences and dialogs are not greppable. If you have not watched it run, you do not know what it does. Symmetry with a neighboring feature is not evidence: one file being a double-click does not make the file next to it a double-click. When you have not seen the flow, ask, mark it unverified, or leave it out. Never guess.
Check hard limits before writing, not after. If a field has a documented maximum, such as a 1024-character skill description, a 72-character commit subject, or a 160-character meta description, measure it while drafting. A limit you plan to eyeball at the end is a limit you will break.
Hold every sentence to one question: what does the reader do differently because they read this? If the answer is "nothing, they just feel better," it does not go in. Reassurance is not information. Absence of a problem is not a feature; the reader does not know or care what the install could have been.
The tells, all of which are cheap to spot:
Cut the clause, not the sentence. Reassurance usually arrives fused to a real instruction, and over-correcting throws away the warning. "Paste the token once, into a masked field, never into a chat, and nobody reads it back to you" contains two instructions (paste it there; never in a chat) and one comfort. The comfort goes. The sentence stays.
Section 3 is about sentences that should not exist. This is the ordinary tax on the ones that should. Hunt these:
this with no noun. "This means…" This what? Name it: "this flag means…"The silent failure. For any multi-step setup, ask: what happens if someone does step 2 but not step 1? If the answer is a loud error, fine, the software is telling them. If the answer is a plausible-looking success that is actually broken, that is the single most valuable paragraph in the document. (A real one: install the skills but not the connector and everything looks right, except every answer comes back empty.) It goes in three places: the step itself, the troubleshooting section, and anywhere the reader might stop early thinking they're done.
The happy path is the easy half. Anyone can write it. Write the other half.
A commit message is documentation with a hostile deadline: it gets written at the end of a long session, when the session is the only thing in your head. That makes it the place session leakage does the most damage, and the reader, someone bisecting a regression eighteen months from now, is the least equipped to survive it.
Everything above applies, including section 0: no em dashes in a subject line or a body. These are the parts that bite hardest here:
When you finish, tell the user, in chat, not in the doc, what you actually confirmed and what you only reasoned about. Which paths you grepped. Which commands you ran. Which UI flow you have never watched anyone click through.
"I did not install these packages into a clean environment and click through" is a sentence you are allowed to write, and the user is far better off for reading it. Gloss over it and the next person to find out is a reader, in the middle of a setup that doesn't work.
Never emits an em dash or en dash, in any file it writes or any message it sends, for any
reason. Writes and edits the target file directly: this is a drafting skill, not a read-only
review. Never describes a UI or install flow it has not watched run; it asks, marks the flow
unverified, or omits it. Never rewords a section that documents code which no longer exists; it
deletes the section and reports it. Never finishes without telling the user what went
unverified. Never touches prose with a voice; essays, posts, emails, and marketing copy belong
to the draft plugin's critique and tighten.
Guides completion of development work by verifying tests, detecting environment, and presenting structured options for merge, PR, or cleanup.
Enforces test-driven development: write failing test first, then minimal code to pass. Use when implementing features or bugfixes.
Guides creation and editing of skills using test-driven development with pressure scenarios and subagents to verify agent compliance.
npx claudepluginhub benjaminjackson/writing-skills --plugin documentation