skills/documentation/SKILL.md
Writes human-friendly Markdown documentation for non-developer audiences — Implementation, product, project, CS, support, QA, ops, business analysts. Explains how a feature works, how to set it up or configure it for a client, how it ties to business rules and the product roadmap — for technical readers who don't read code. Code blocks appear only when the reader will copy, paste, send, or recognize them (embed snippets, config values, sample payloads) — not to explain how the system is built. Use when asked to "document this for the implementation team", "write a guide for product / PM / CS", "explain how X works for non-devs", or for setup guides, runbooks, FAQs, hand-off docs aimed at internal non-dev teams. Also use when adding or editing a Markdown file inside the repo's `docs/` folder for a non-developer audience. Do NOT use for API reference, developer READMEs, code-level docs (JSDoc, docstrings), or framework / testing guides — those are different docs.
npx skillsauth add cvscarlos/ai-skills documentationInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Creates a Markdown file in the current repository. The file explains a system, feature, workflow, or setup procedure to people who work with the software but don't read code. The reader knows enough to follow workflows, configuration, and edge cases — and they stop reading when they hit a code block they don't need.
The main idea: read the code as the source of truth, then write the doc in the language of the reader's job. Turn technical details into the behavior the business sees. Keep only the code blocks the reader will copy, paste, send, or recognize. Remove everything else.
Prefer short and focused docs. A reader who finishes a short, focused doc gets more value than a reader who skims a long one. Most docs are read quickly, in Notion or a wiki tab, with another tab waiting. The doc that respects that wins. Remove any section, sentence, or adjective that does not add clear value.
Before reading anything, get clear on these — they shape your writing, but none of them appear in the doc itself:
Audience: subtitle, a "Who this is for" section, or any other audience label in the final doc. Published docs end up in Notion, wikis, and search, where anyone in the company can read them; a fixed audience label tells unintended readers "this is not for you" without making the doc better for the intended ones.If any of this is unclear, ask one short question. The wrong reader profile in your head produces the wrong doc.
Before writing, scan the repository for existing documentation. This is how the skill matches each project's style, instead of forcing the same shape on every repo.
Look for:
docs/, documentation/, wiki/, root-level *.md, or a sibling docs repo referenced in READMEtitle, audience, last-reviewed), heading order, "Related docs" sections, callout stylesWrite the new doc into the same folder, using the same naming and structure. If the repo has no existing docs, use the template at the end of this skill, and decide for yourself how much code to include (see Rules: Include code only when the reader needs it).
Read enough of the code, config, and related docs to understand the full behavior. You are looking for what the system does, not how it is built:
Skip implementation details that do not change behavior (framework choice, internal helper structure, recent refactors).
For every technical concept you found, write down its business meaning before it goes in the doc. This step is what makes this skill different from a generic doc writer.
| Code-world term | Reader-world translation |
| -------------------------- | ------------------------------------------------ |
| InvoiceCreated event | "when a new invoice is generated" |
| retry_after_seconds=300 | "the system waits 5 minutes before trying again" |
| if user.tier == "pro" | "for Pro-tier customers only" |
| nullable: true in schema | "this field is optional" |
| 429 from upstream | "the partner system is rate-limiting us" |
If a concept has no business meaning, it probably does not belong in the doc. The exceptions are things the reader copies, pastes, or sends — see Rules.
Write the full doc in one pass, using only what you can confirm from the code, sibling docs, and what the user has already told you. The file you save is what the reader will see — it must be ready to read, not a worksheet with author notes.
Do not put [TODO] markers, TBD, [needs confirmation], or any other author note in the doc. These exist for the writer, not the reader. Once the doc is published to Notion or a wiki, they become noise that future readers must ignore. If you cannot fill a section with confidence, you have two options — never a placeholder:
Keep a private list of open questions as you write — things you could not confirm: roadmap status, plan-tier rules, named owners, SLAs, screenshots, business reasons. You will share these with the user in Step 7, as a list in your chat reply, not in the doc.
Before saving, re-read the draft from top to bottom as a reader would. Look for two common problems:
Duplicated deep content. The same workflow, business rule, or configuration explained in full in more than one section. When you find it, pick the main section to own the topic (usually the section the reader reaches first), keep the full explanation there, and replace the other occurrence with a one-line summary and a reference. If two sections say the same thing because they should be one section, merge them — feel free to change the structure; the draft is not final.
Layered content is not duplication. A short "Quick start" followed by a detailed "Setup guide" is fine — the quick start is intentionally short (5 numbered steps, no context), and the setup explains each step in detail. The same is true for TL;DR/Overview pairs, Examples that show rules stated earlier, and a Glossary that defines terms used in the body. Ask yourself: does each version add something new (more depth, a different view, a concrete example, or a summary), or does the later one just repeat the earlier one?
When you restructure, move sections instead of copying them. If a paragraph belongs in a different section, cut and paste it — do not leave the original behind.
Then run the checklist:
Audience: subtitle, no Who this is for section, no For X and Y... tagline under the title[TODO] marker[TODO], no TBD, no <TBC>, no ? placeholders, no "TODO: confirm with user" lines. The reader sees a finished doc; open questions live in your chat replydocs/<slug>.md.Then go through the open questions with the user, one at a time. When they answer, add the new information back into the doc — replacing the softened phrasing with the confirmed details, or adding sections you omitted on purpose. The doc stays clean the whole time; the chat is where open questions live.
Audience: subtitle, no Who this is for section, no For X and Y… tagline. Published docs travel to Notion, wikis, and search, where anyone in the company can read them; a fixed audience label limits readership for no benefit.[TODO], no TBD, no <TBC>, no "[needs screenshot]", no "[confirm with user]". Author notes are noise to the reader. They stay in Notion and wikis after the conversation that created them ends, and no one remembers what they meant. If you can't fill something with confidence, omit it or use more general words so the gap is hidden. Keep open questions in your private notes and raise them in your chat reply, not in the doc.Code-heavy doc — wrong reason for the code:
## How it works
The `InvoiceEventProcessor.handle()` method is invoked when an `InvoiceCreated`
event arrives on the `billing.events` queue. It calls `EmailService.send()`
with a `template_id` of `5`.
The reader cannot use class names. They stop reading at the first identifier in backticks.
Vague doc — saying nothing concrete:
## How it works
When something happens, the system sends an email to the customer. There is
some retry logic in case it fails.
No trigger, no timing, no rules, no failure behavior. The reader cannot answer a single real question after reading this.
Better shape — prose for the workflow, code only for the artifact:
## How it works
When a new invoice is generated, the system emails the customer their receipt
within ~1 minute. If the customer's email provider rejects the message, we
retry every 15 minutes for up to 4 hours. After that, the message is marked
as failed and shows up on the billing-ops dashboard for a human to follow up.
## Embed the chat widget on the customer's website
Paste this snippet into the customer's site template, just before the
closing `</body>` tag. Replace `YOUR_ACCOUNT_ID` with the value from the
customer's onboarding form:
\`\`\`html
<script
src="https://cdn.example.com/widget.js"
data-account="YOUR_ACCOUNT_ID"
async
></script>
\`\`\`
The widget loads asynchronously and adds ~12 KB to the page.
The workflow is prose; the snippet is in code because that is what the Implementation engineer hands to the client.
Audience-labeled doc — limits the reader before they start:
# Feature X
> **Audience:** Implementation, Support
> **Purpose:** Setup guide
For platform admins and Implementation engineers configuring X — no code reading required.
## Overview
...
The audience is a focus aid for you, the writer. Once published, this doc ends up in Notion, wikis, and search, where anyone in the company can read it. A fixed audience label tells some readers "this is not for you" without making the doc better for the intended readers. Remove the tagline and the frontmatter; the title and the Overview are enough.
Default structure for repos with no existing docs. If the repo already has documentation, match its style instead — folder location, heading style, tone, amount of code, and any metadata. Remove sections from this template that are not worth keeping for the current reader and purpose.
# <Feature or system name>
<One- to three-sentence intro: a plain statement of what this doc explains and what the feature does. No audience label, no purpose tag, no frontmatter — just the intro a Notion reader expects.>
## Overview
<Plain-language explanation of what the feature does, when it matters, and how it differs from related features. This is the section most readers actually read; make it count.>
## How it works
<Numbered workflow in plain steps. One step per real action. Include timing, branches, and who/what is involved.>
1. <Trigger — the event or action that starts the flow>
2. <Next step — what happens, where, who sees it>
3. <…>
<Add a Mermaid diagram if the flow has branches or parallel paths.>
## How to set it up / deliver it to a client
<If the reader's job is to configure, enable, or hand something to a client: step-by-step setup with the exact snippets, settings, or templates they need. Keep code blocks scoped to what the reader actually pastes or sends.>
## When it applies (and when it doesn't)
<Eligibility, scope, plan tiers, and explicit out-of-scope cases.>
## Business rules and configuration
<What is configurable, by whom, with what effect. State each rule and what it means in practice.>
| Setting / rule | What it controls | Default | Who can change it |
| -------------------- | ----------------------- | ------- | ----------------- |
| <name in plain text> | <plain-language effect> | <value> | <role> |
## Product context
<How this feature fits the product: roadmap position, related features, known limitations, upcoming changes. Include only what you know confidently from the user or visible repo state; omit the section entirely if you can't fill it without guessing.>
## Roles and responsibilities
<Who configures, who monitors, who is paged, who approves changes. A RACI-style table works well when ownership crosses teams.>
## Examples
<1–3 worked scenarios. Use realistic but generic data. Show the reader what "normal" and "edge" look like.>
## Edge cases and failure modes
<What can go wrong, what the system does automatically, and what a human needs to do. Each entry: trigger → system behavior → human action.>
## Troubleshooting / FAQ
<Questions the audience actually asks. Avoid filler. If you can't think of a real question, don't invent one.>
## Glossary
<Terms specific to this system. Plain-language definitions. Skip if no jargon was used.>
## Related docs
<Links to adjacent docs the reader may need: API reference for developers, customer-facing help articles, runbooks for other teams.>
## Technical reference (optional)
<Stable named things the reader handles in their job: key files and what they do, configuration field paths, named services, payload shapes, schema fields. Use a table when listing more than 3 items. Skip this section if there is nothing of this kind worth surfacing.>
| File / config path / service | Role / what it controls |
| ---------------------------- | ------------------------- |
| `path/to/file.py` | <one-line role> |
| `config.some_setting` | <what the field controls> |
testing
Decide whether a GitHub PR can be approved, then optionally write and submit the approval comment when the user explicitly authorizes it. Use when the user says "review this PR", "review PR
development
Run a Socket.dev supply-chain check before installing, updating, or executing any npm package. Triggers on `npm install/i/add/update/upgrade <pkg>`, `yarn add/upgrade/dlx`, `pnpm add/install/update/dlx`, `bun add/install`, `npx`, `pnpx`, `bunx`, or any phrase that adds/bumps a Node dependency ("let's use <pkg>", "install X", "bump <pkg>"), including direct `package.json` edits. Use this skill EVEN IF the user did not ask — npm typosquats, malware, and malicious postinstall scripts are common, and one extra check beats days of cleanup. Checks Socket score, malware verdicts, install scripts, capabilities, CVEs, and maintainer trust, then decides PROCEED, WARN, or ABORT.
development
Generates a comprehensive handover document for another AI agent to seamlessly continue work on a task without prior context. Use when asked to "handover", "save state", "switch providers", "switch to claude/codex/opencode/cursor", or prepare a summary for the next AI session. Also use when moving work between directories of the same repository.
tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.