Author, audit, and maintain project documentation across every surface that matters: the agent hot path (CLAUDE.md, AGENTS.md, .claude/rules/), the human entry point (README.md), and the narrative tier (docs/).
This is the single home for "make our docs good" work — bootstrapping a new project, refreshing docs after a sprint, writing a README that converts readers into users, or auditing the whole estate for drift.
This
SKILL.mdis a thin index. Detailed authoring rules live inrules/*.mdand load on demand. Worked examples are inreferences/*.md. Literal scaffolding skeletons are intemplates/*.md. Do not preload everything — load only what the current phase asks for.
Mode Detection
Parse $ARGUMENTS (first token) and route to one of four modes.
A second token of --auto is a cross-cutting modifier (see below).
| Mode | Default | Trigger |
|---|---|---|
init |
"init", "bootstrap", "scaffold", or $ARGUMENTS == "init" (no existing CLAUDE.md). |
|
update |
yes | Default when a CLAUDE.md already exists. "update", "sync", "refresh", "drift". |
readme |
"readme", "write a README", "audit the README", or $ARGUMENTS == "readme". |
|
audit |
"audit", "review the docs", "doc health check", or $ARGUMENTS == "audit". |
--auto modifier — append to any mode token to enable the autonomous-workflow guardrails.
Always passed by autonomous-workflow Phase 5 as Skill("docs", "update --auto").
When --auto is present, also load auto-update-loop.md before executing the mode's phases.
Disambiguation rule when no mode token is passed:
- If
./CLAUDE.mddoes not exist →init. - Else if
./README.mddoes not exist and the user mentioned "README" →readme. - Else →
update.
State the detected mode in one line before continuing:
Mode: update
Target: this repo
Shared Foundations (every mode loads these)
Regardless of mode, every run is governed by three rule files. Load them once on first need; do not reload them per phase.
| File | What it gives you |
|---|---|
rules/content-routing.md |
The Content Routing Rubric — which surface owns which kind of content, and why. |
rules/placement-resolver.md |
The innermost-wins algorithm for picking the specific file (root vs nested CLAUDE.md, .claude/rules/ with paths:, etc.). |
rules/writing-style.md |
Google + Microsoft style highlights, plain-language rules, and the agent-readable docs pattern. |
Then add the rule files specific to the mode:
| Mode | Additional rules to load |
|---|---|
init |
claude-md.md, readme.md, docs-folder.md |
update |
drift-detection.md, claude-md.md |
readme |
readme.md |
audit |
All of the above, plus maintenance.md for CI lint stack guidance. |
When invoked from a non-interactive caller (autonomous-workflow Phase 5) — passed as --auto — also load auto-update-loop.md.
That rule adds four non-negotiable gates (hot-path budget, recurrence threshold ≥ 2, removed-rules ledger, optional ablation) plus the JSON run-summary contract the caller logs.
Mode: init — bootstrap docs from scratch
Use when a project has no Claude configuration and (optionally) no documentation. Produces a tiered setup sized to the project's complexity.
Phases
- Detect existing config. Check for
CLAUDE.md,.claude/,AGENTS.md,README.md,docs/. If any exist, ask viaAskUserQuestion: Overwrite / Merge missing / Skip / Abort. - Triage complexity. Count source files, directories, monorepo
packages, CI/CD presence. See
references/archetypes.mdfor the small / medium / large thresholds and the per-tier file matrix. - Detect tech stack. Package manager (pnpm / npm / yarn / bun / poetry /
cargo / go.mod), test framework, linters, monorepo signal (
nx.json,turbo.json,pnpm-workspace.yaml). - Scaffold the tier's files. Use
templates/claude-md.md,templates/readme.md, and thedocs/*templates listed inrules/docs-folder.md. - Wire
.gitignore. Add.claude/settings.local.jsonidempotently. - Summarize. Print a table of created files with line counts and audience.
Hard rules during init
- Route by kind, not by file pattern. Rules go to
CLAUDE.md/.claude/rules/; narrative goes todocs/; marketing goes toREADME.md. Seerules/content-routing.md. - CLAUDE.md ≤ 200 lines. Anthropic's own threshold — beyond it, adherence drops measurably.
- README first viewport must answer what is this, does it solve my
problem, can I trust it? See
rules/readme.mdfor the above-the-fold checklist. - Never duplicate content between
CLAUDE.md,README.md, anddocs/. Pick one owner; link from the others.
Mode: update — sync docs with the codebase
Use after work has landed on a branch. Detects drift, applies targeted fixes, and pushes new rules to the innermost-ancestor destination so the hot path does not bloat over time.
Argument parsing
| Argument | Default | Effect |
|---|---|---|
branch |
yes | Compare current branch vs the default branch. Default for update. |
recent [N] |
Diff the last N commits (default 10). | |
paths <glob> |
Limit the diff to <glob>. The Placement Resolver still decides destinations. |
|
nested <dir> |
Route all updates for changes under <dir> to <dir>/CLAUDE.md (scaffold if missing). |
|
pattern <glob> |
Discovery-driven — scan files matching <glob> for shared structure, emit one rule. |
|
holistic |
Run holistic-analysis refactor on each affected area before drafting docs updates. |
|
dry-run |
Preview only. Print proposed changes; do not write. | |
all |
Full audit against the current codebase (no diff). Equivalent to audit mode for sync only. |
Phases
- Detect changes (see
rules/drift-detection.md§1 forgit diffcommands and the area-classification table). - Read current docs — every
CLAUDE.md,.claude/rules/*.md,docs/**/*.md,AGENTS.md. Build a map of what's documented today. - Drift analysis. Run deterministic checks first (dead paths,
removed commands, broken
@imports); then semantic checks (architecture claims, style claims, stale gotchas). Seerules/drift-detection.md. - Holistic analysis (if
holisticwas passed) — seerules/drift-detection.md§4. - Generate updates. Each proposed change is classified by content
kind, routed via
content-routing.md, and placed viaplacement-resolver.md. Priority tiers: P0 stale fixes apply immediately; P1 new patterns ask for confirmation; P2 polish skips unless requested. - Apply (or dry-run report).
- Summarize. Per-file table of changes plus a list of areas intentionally skipped because Claude can infer them.
Sub-modes inside update
update nested <dir>— seerules/placement-resolver.md§4.update pattern <glob>— seerules/placement-resolver.md§5.
Mode: readme — write or audit a README
Use when the README is the asset under work. Two sub-modes detected from context:
- No README exists or user says "write a README" → scaffold mode.
- README exists and user says "audit / review / improve" → audit mode.
Scaffold sub-mode
- Detect tech stack and project type (library / app / monorepo root / CLI tool).
- Render
templates/readme.mdwith the structure from the standard-readme spec — seerules/readme.mdfor the mandatory section order and the badge selection rules. - Apply the above-the-fold checklist before declaring done — the first viewport must carry name, one-line tagline, hero visual or demo, primary CTA badges, and one install line.
Audit sub-mode
- Read the README.
- Run the README audit rubric in
rules/readme.md§4. Score each item PASS / WARN / FAIL with one line of evidence. - End with a prioritized Top 3 fixes list — biggest reader-time wins first.
Mode: audit — comprehensive documentation health check
Read-only by default. Produces a structured report covering every doc surface.
Phases
- Inventory. List every documentation file across the repo.
- Per-surface audits:
CLAUDE.mdand.claude/rules/— seerules/claude-md.md§5.README.mdand any per-package READMEs — seerules/readme.md§4.docs/tree — seerules/docs-folder.md§3.
- Drift checks — full set from
rules/drift-detection.md§3 (dead paths, removed commands, broken@imports, hot-path leakage). - CI lint coverage — see
rules/maintenance.mdfor the recommendedmarkdownlint/ Vale / alex / lychee stack. - Prioritized report. P0 (stale / wrong) → P1 (missing high-value content) → P2 (polish).
If the user asks to apply fixes, route to update mode with the audit findings as the input.
Definition of Done
Each mode has a closing gate. Treat any unchecked item as a defect.
init
- Tier picked and the per-tier files matrix matches the output.
-
CLAUDE.md≤ 200 lines. -
README.mdfirst viewport (~600 px) carries name, tagline, hero, primary badges, install line. -
docs/tree (medium / large only) hasREADME.md,architecture.md,contributing.md, and (large only) per-package nested folders. -
.gitignorecontains.claude/settings.local.json. - No content is duplicated across
CLAUDE.md,README.md, anddocs/.
update
- Every P0 drift item from
drift-detection.md§3 either fixed or explicitly skipped with reason. - Every new rule placed via
placement-resolver.md— no pattern-scoped rule landed in rootCLAUDE.md. - Every
@importadded resolves to a real file. - No content moved into
docs/while a duplicate remains inCLAUDE.md(or vice versa). - Summary table delivered.
readme
- All mandatory standard-readme sections present in correct order.
- Above-the-fold checklist passes.
- Badge count between 0 and 10, and every badge represents signal (build / version / license / coverage / security / contributors), not noise (stars / forks / "made with love").
- Every relative link resolves.
audit
- Every file in the inventory has a row in the report (PASS / WARN / FAIL or N/A).
- Top 3 fixes list at the end, ordered by reader-time impact.
- No file mutations —
auditis read-only.
Core Principles
- Right surface, right cost.
CLAUDE.mdis auto-loaded — every line is a recurring token cost.README.mdis read once by humans evaluating the project.docs/is loaded on demand. Route by these costs, not by what feels natural to write. - Innermost-wins. Nested
CLAUDE.mdfiles load only when the agent is in that subtree. A rule aboutpackages/foo/**placed inpackages/foo/CLAUDE.mdcosts zero tokens for someone inpackages/bar/. The same rule in root costs everyone, every turn. - Be prescriptive, not descriptive. Tell the agent what to do; do not explain concepts. Decision tables and numbered lists beat prose.
- Each document serves exactly one Diátaxis quadrant. Tutorial or how-to or reference or explanation. If a doc serves two, split it.
- Never duplicate facts across surfaces. Pick one owner; link from the others. Duplicates always drift.
- Test the docs by removal. "Would removing this cause Claude or a reader to make a mistake?" If no, delete it.
Anti-patterns (one-liner — full list in rules/ per surface)
CLAUDE.mdover 200 lines (Anthropic's own threshold — adherence drops).- Pattern-scoped rule placed in root
CLAUDE.mdinstead of.claude/rules/withpaths:. - README wall-of-badges (>10 badges); TOC for a 60-line README.
docs/files unreferenced from anywhere (orphans).- Same fact written in
CLAUDE.mdanddocs/— one will drift. - Narrative paragraphs ("we picked X because Y, the system grew as Z…") in
CLAUDE.mdinstead ofdocs/. - Marketing prose ("blazingly fast," "simply," "easily") with no benchmark.
- README API reference dump — move to
docs/. - Backslash paths anywhere.
- Time-sensitive claims ("after August 2025…") in any surface.
Cross-tool note: AGENTS.md
agents.md is the cross-tool open spec read by
Codex CLI, Cursor, Aider, Devin, GitHub Copilot, Gemini CLI, and others.
Claude Code reads CLAUDE.md, not AGENTS.md directly.
Two interop options:
- Symlink —
ln -s CLAUDE.md AGENTS.md(simplest; one source of truth). @import— keep both files but haveCLAUDE.mdstart with@AGENTS.mdand put shared content inAGENTS.md.
For mixed-tool teams, prefer the symlink.
For Claude-Code-first teams with cross-tool readers as secondary, prefer the @import.
See rules/claude-md.md §6 for the trade-offs.