Docs Deploy Readiness
Overview
Judge whether a docs/content site can be deployed publicly today. Discover the site's own stack, inventory, and page template first; only then apply the universal bar — never import another project's checklist wholesale.
This skill audits the DOCS about a thing. Whether the thing itself is shippable is handoff-readiness.
When to use / when NOT
Use when:
- A docs or content site is about to go public (first deploy, big relaunch, domain move).
- Someone asks "is the docs site done?", "audit the docs", "what's missing before launch?".
- Docs were generated/written in bulk and nobody has verified them against the code.
Do NOT use for:
- Auditing the library/CLI/app itself →
handoff-readiness.
- Rewriting prose →
humanizer / humanize-readme (this skill only FLAGS prose).
- A README in a repo root (no deploy target) →
humanize-readme.
- Runtime security of a server backing the docs →
security-surface-audit.
How it works
Step 1 — DETECT the stack and deploy target
Read before judging. Establish, with file evidence:
- Framework + render mode: static SSG, SSR, hybrid prerender? Check
package.json scripts, framework config (vite.config.*, next.config.*, astro.config.*, docusaurus.config.*, or equivalent), Dockerfile, CI deploy workflow.
- Build command and output: what command produces the deployable artifact, and what is it (a
dist/ of HTML? a Node server entry?).
- Origin and environment: what canonical URL/base path does the site assume? Which env vars are baked at build time vs read at runtime? Non-root hosting (e.g.
/docs/) needs explicit base config.
- Content source: where do pages live (MDX dir, CMS, generated reference), and is any of it generated — if so, is the generator part of the build?
Step 2 — DETECT the inventory (should-exist vs exists)
Build the definitive list of what SHOULD be documented from the source of truth, not from the docs:
- Library: public exports map / index entry / per-item registry index.
- CLI: every command and flag in the command definitions or
--help output.
- API/server: the route table.
- Config: the schema or parser that consumes config/env vars.
Then list the pages that exist (rg --files over the content dir, or the route manifest). Diff the two lists both directions. (Illustrative example: a shadcn-style registry's registry.json items vs docs/content/components/*.mdx — use the project's actual equivalent.)
Step 3 — DETECT the project's own page template
Sample the 3–5 most complete pages of each page type. Derive the section skeleton this project itself uses (e.g. preview → install → usage → API table → accessibility). That skeleton — not an imported ideal — is the consistency bar for siblings.
Step 4 — APPLY the five bars
Run the checks in Quality bar below. For each finding record: page/file path, bar (coverage/anatomy/prose/accuracy/deployability), severity (blocker/warning/nit), and the fix.
Step 5 — Verify the build cold
Build in a clean environment (fresh install; in a container if the deploy target is Docker). Prerendering that works on the dev machine and fails in CI/container is a known failure class. Confirm the output contains no dev origins (localhost URLs, dev tokens) and that all internal links/anchors resolve in the built output.
Step 6 — Score and report
Emit the scorecard in Output. For large sites, fan the per-bar checks out to parallel agents via convergence-loop and merge into one scorecard.
Quality bar
(a) Coverage
| Check |
Pass condition |
| Every public/visible item has a page |
Inventory diff (Step 2) is empty, or every gap is justified in writing |
| No stub pages on critical paths |
No page that is a heading + one sentence; no "Coming soon" reachable from nav |
| No orphan pages |
Every page reachable from nav/search; no dead routes in the manifest |
| Getting-started path complete |
A new user can go from landing → install → first success without a gap |
(b) Page anatomy
| Check |
Pass condition |
| Template consistency |
Every page of a type has the sections its siblings have (skeleton from Step 3) |
| Live/working examples |
Examples render or are verified to compile; more than one usage shape where the project's template shows several |
| Every consumption path covered |
If the thing installs N ways (e.g. CLI add, manual copy, npm), each page documents all N |
| Reference tables complete |
API/props/flags/options tables list type + default for every entry |
| A11y/keyboard notes |
Present where siblings have them; interactive components document keyboard behavior |
(c) Prose quality
- SCAN for AI-writing tells (list in the 2026 snapshot below) with
rg over the content dir; flag pages, count hits per page.
- Flag broken English, tense drift, and inconsistent terminology for the same concept.
- Defer the rewrite to
humanizer (general prose) / humanize-readme (README-shaped pages). Do not rewrite inside this audit.
(d) Accuracy vs code
| Check |
Method |
| Documented-but-nonexistent |
Every flag, option, env var, route, prop, default named in reference pages → grep the source; flag misses |
| Exists-but-undocumented |
Reverse direction from the Step 2 inventory |
| Defaults and types match |
Compare documented defaults against the actual schema/parser values |
| Privacy/security claims true |
"Runs locally", "never sends data", "no telemetry" → verify against actual network/telemetry code paths; a false claim here is an automatic blocker |
| Snippets current |
Imports, package names, and commands in snippets match today's source |
(e) Deployability
| Check |
Pass condition |
| Per-page meta |
Unique <title> + meta description on every page |
| Social meta |
OG + Twitter card tags; image resolves on the production origin |
| Canonical URLs |
Absolute, correct production origin, no localhost |
| sitemap.xml + robots.txt |
Sitemap covers all public routes; robots references it; prerendered routes match |
| 404 page |
Branded, with navigation/search escape — not the host default |
| Search |
Works on built output; zero-result state handled |
| llms.txt |
Present for developer-tool docs (see snapshot); llms-full.txt where siblings in the ecosystem ship it |
| Clean build |
Step 5 passed: fresh-environment build + prerender succeed, links resolve |
Quality bar (2026 snapshot)
Distilled 2026-06-10 from researched norms (quality-bar.md, sections 6–7 + deploy gotchas). Refresh via WebSearch if executing after ~mid-2027; treat as the floor, not the ceiling.
- Per-component docs page anatomy (norm set by Radix / Base UI / React Aria / shadcn docs): live rendered preview with copyable source toggle; installation per consumption path (CLI incl. namespaced registry, manual copy with file list, npm import); API reference table per part (props, types, defaults, data-attributes, CSS variables); an Accessibility section with a keyboard-interaction table mapped to the matching WAI-ARIA APG pattern; multiple usage examples (controlled, uncontrolled, composed, form integration). (These named projects are the reference points, not required tech.)
- IA: Diátaxis (tutorials / how-to / reference / explanation, https://diataxis.fr/) is the cited structure for library docs; component pages = reference + examples, getting-started = tutorial.
- Search is table stakes — Cmd+K palette over docs content.
- llms.txt is near-default for developer-tool docs (platforms like Mintlify, Fern, GitBook, Vercel ship it automatically; IDE/agent tools fetch it, AI crawlers mostly ignore it and crawl HTML).
llms-full.txt and per-page markdown routes are the common companions.
- Registry/ecosystem affordances where applicable: one-command installs per item and "Open in …" buttons are 2025–2026 ecosystem conventions (illustrative — only for registry-style products).
- Deploy gotchas observed in the wild: prerendering can fail inside Docker builds despite passing locally; client env vars are inlined at build time while server env is runtime; non-root hosting needs explicit base-path config; sitemap generation is usually NOT built into the framework — verify it actually exists in the output.
- Writing-quality tells to scan for (from Wikipedia "Signs of AI writing"): inflated significance ("pivotal", "stands as a testament"); negative parallelism ("not just X, but Y"); rule-of-three triads everywhere; vague attribution ("widely regarded"); promotional adjectives ("powerful", "seamless", "robust", "comprehensive", "blazing-fast"); trailing "-ing" impact claims ("…, ensuring accessibility"); AI vocabulary ("delve", "leverage", "crucial", "streamline", "landscape"); copula avoidance ("serves as", "boasts" for plain "is/has"); em-dash and boldface overuse; bolded-header inline lists as default prose; formulaic wrap-ups ("In conclusion"); elegant variation (component → element → widget for the same noun). Good reference prose: short declarative sentences, concrete facts, imperative voice for instructions, no marketing register.
Output
Produce exactly this report:
# Docs Deploy Readiness — <site name> @ <commit/date>
Stack: <framework, render mode, build command, output, deploy target>
Inventory: <N items should be documented / M pages exist>
Verdict: READY | READY WITH WARNINGS | NOT READY
| Bar | Score /10 | Summary |
|---------------|-----------|----------------------------------|
| Coverage | n | <one line> |
| Anatomy | n | <one line> |
| Prose | n | <one line> |
| Accuracy | n | <one line> |
| Deployability | n | <one line> |
## Blockers (deploy stops here)
- B1 [accuracy] <page path> — <issue> — <fix>
- B2 [deployability] ...
## Warnings (ship-with, fix soon)
- W1 [anatomy] <page path> — <missing section siblings have>
## Coverage gap list
| Item | Source location | Page | Status |
|------|-----------------|------|--------|
| <public item> | <file:line> | — | MISSING |
| <page> | — | <path> | STUB / ORPHAN |
## Prose flags (defer rewrite to humanizer / humanize-readme)
| Page | Tell count | Worst tells |
Scoring: any blocker in accuracy or deployability ⇒ NOT READY. Empty blocker list + warnings only ⇒ READY WITH WARNINGS. Score each bar 0–10 on evidence, not vibes.
Common mistakes
- Auditing only the pages that exist. The biggest gaps are items with no page at all — build the should-exist inventory from source of truth FIRST (Step 2).
- Importing another stack's checklist. Don't demand a registry install tab on CLI docs, or an APG keyboard table on a config-reference page. The bar is the project's own template plus the universal checks.
- Trusting the docs about the code. Every reference claim gets grepped against source. Privacy/security claims especially — a docs page saying "no data leaves your machine" over code that phones home is the worst possible finding to miss.
- Rewriting prose mid-audit. Flag and defer to
humanizer / humanize-readme; rewriting burns the audit's scope and context.
- Verifying the build only on the dev machine. Clean environment, fresh install, container if that's the target. Prerender-in-container failures are common and invisible locally.
- Treating dead links/anchors and stub pages as nits. On a critical path (getting started, install) they are blockers.
- Forgetting docs chrome accessibility. Nav, search palette, theme toggle, and code-copy buttons are product UI — hand them to
accessibility-compliance, don't skip them because "it's just docs".
- Skipping jargon review. Public docs leaking internal codenames or pre-rename terms is a launch embarrassment — run
jargon-leak alongside this audit.
1---2name: docs-deploy-readiness3description: Use when a documentation or content site needs a pre-deploy audit — someone asks "are the docs ready to ship", requests a docs review, coverage gap check, stub/orphan page hunt, docs-vs-code accuracy verification, SEO/meta/OG/canonical/sitemap/robots/llms.txt check, 404 or search validation, or a clean-environment docs build check before going public. Any stack (SSG, SSR, MDX, static export). For the artifact being documented, use handoff-readiness instead.4---56# Docs Deploy Readiness78## Overview910Judge whether a docs/content site can be deployed publicly today. Discover the site's own stack, inventory, and page template first; only then apply the universal bar — never import another project's checklist wholesale.1112This skill audits the DOCS about a thing. Whether the thing itself is shippable is `handoff-readiness`.1314## When to use / when NOT1516**Use when:**17- A docs or content site is about to go public (first deploy, big relaunch, domain move).18- Someone asks "is the docs site done?", "audit the docs", "what's missing before launch?".19- Docs were generated/written in bulk and nobody has verified them against the code.2021**Do NOT use for:**22- Auditing the library/CLI/app itself → `handoff-readiness`.23- Rewriting prose → `humanizer` / `humanize-readme` (this skill only FLAGS prose).24- A README in a repo root (no deploy target) → `humanize-readme`.25- Runtime security of a server backing the docs → `security-surface-audit`.2627## How it works2829### Step 1 — DETECT the stack and deploy target3031Read before judging. Establish, with file evidence:32331. **Framework + render mode**: static SSG, SSR, hybrid prerender? Check `package.json` scripts, framework config (`vite.config.*`, `next.config.*`, `astro.config.*`, `docusaurus.config.*`, or equivalent), Dockerfile, CI deploy workflow.342. **Build command and output**: what command produces the deployable artifact, and what is it (a `dist/` of HTML? a Node server entry?).353. **Origin and environment**: what canonical URL/base path does the site assume? Which env vars are baked at build time vs read at runtime? Non-root hosting (e.g. `/docs/`) needs explicit base config.364. **Content source**: where do pages live (MDX dir, CMS, generated reference), and is any of it generated — if so, is the generator part of the build?3738### Step 2 — DETECT the inventory (should-exist vs exists)3940Build the definitive list of what SHOULD be documented from the **source of truth, not from the docs**:4142- Library: public exports map / index entry / per-item registry index.43- CLI: every command and flag in the command definitions or `--help` output.44- API/server: the route table.45- Config: the schema or parser that consumes config/env vars.4647Then list the pages that exist (`rg --files` over the content dir, or the route manifest). Diff the two lists both directions. *(Illustrative example: a shadcn-style registry's `registry.json` items vs `docs/content/components/*.mdx` — use the project's actual equivalent.)*4849### Step 3 — DETECT the project's own page template5051Sample the 3–5 most complete pages of each page type. Derive the section skeleton this project itself uses (e.g. preview → install → usage → API table → accessibility). That skeleton — not an imported ideal — is the consistency bar for siblings.5253### Step 4 — APPLY the five bars5455Run the checks in **Quality bar** below. For each finding record: page/file path, bar (coverage/anatomy/prose/accuracy/deployability), severity (blocker/warning/nit), and the fix.5657### Step 5 — Verify the build cold5859Build in a clean environment (fresh install; in a container if the deploy target is Docker). Prerendering that works on the dev machine and fails in CI/container is a known failure class. Confirm the output contains no dev origins (localhost URLs, dev tokens) and that all internal links/anchors resolve in the built output.6061### Step 6 — Score and report6263Emit the scorecard in **Output**. For large sites, fan the per-bar checks out to parallel agents via `convergence-loop` and merge into one scorecard.6465## Quality bar6667### (a) Coverage68| Check | Pass condition |69|---|---|70| Every public/visible item has a page | Inventory diff (Step 2) is empty, or every gap is justified in writing |71| No stub pages on critical paths | No page that is a heading + one sentence; no "Coming soon" reachable from nav |72| No orphan pages | Every page reachable from nav/search; no dead routes in the manifest |73| Getting-started path complete | A new user can go from landing → install → first success without a gap |7475### (b) Page anatomy76| Check | Pass condition |77|---|---|78| Template consistency | Every page of a type has the sections its siblings have (skeleton from Step 3) |79| Live/working examples | Examples render or are verified to compile; more than one usage shape where the project's template shows several |80| Every consumption path covered | If the thing installs N ways (e.g. CLI add, manual copy, npm), each page documents all N |81| Reference tables complete | API/props/flags/options tables list type + default for every entry |82| A11y/keyboard notes | Present where siblings have them; interactive components document keyboard behavior |8384### (c) Prose quality85- SCAN for AI-writing tells (list in the 2026 snapshot below) with `rg` over the content dir; flag pages, count hits per page.86- Flag broken English, tense drift, and inconsistent terminology for the same concept.87- **Defer the rewrite** to `humanizer` (general prose) / `humanize-readme` (README-shaped pages). Do not rewrite inside this audit.8889### (d) Accuracy vs code90| Check | Method |91|---|---|92| Documented-but-nonexistent | Every flag, option, env var, route, prop, default named in reference pages → grep the source; flag misses |93| Exists-but-undocumented | Reverse direction from the Step 2 inventory |94| Defaults and types match | Compare documented defaults against the actual schema/parser values |95| Privacy/security claims true | "Runs locally", "never sends data", "no telemetry" → verify against actual network/telemetry code paths; a false claim here is an automatic blocker |96| Snippets current | Imports, package names, and commands in snippets match today's source |9798### (e) Deployability99| Check | Pass condition |100|---|---|101| Per-page meta | Unique `<title>` + meta description on every page |102| Social meta | OG + Twitter card tags; image resolves on the production origin |103| Canonical URLs | Absolute, correct production origin, no localhost |104| sitemap.xml + robots.txt | Sitemap covers all public routes; robots references it; prerendered routes match |105| 404 page | Branded, with navigation/search escape — not the host default |106| Search | Works on built output; zero-result state handled |107| llms.txt | Present for developer-tool docs (see snapshot); `llms-full.txt` where siblings in the ecosystem ship it |108| Clean build | Step 5 passed: fresh-environment build + prerender succeed, links resolve |109110## Quality bar (2026 snapshot)111112Distilled 2026-06-10 from researched norms (`quality-bar.md`, sections 6–7 + deploy gotchas). **Refresh via WebSearch if executing after ~mid-2027**; treat as the floor, not the ceiling.113114- **Per-component docs page anatomy** (norm set by Radix / Base UI / React Aria / shadcn docs): live rendered preview with copyable source toggle; installation per consumption path (CLI incl. namespaced registry, manual copy with file list, npm import); API reference table per part (props, types, defaults, data-attributes, CSS variables); an **Accessibility section with a keyboard-interaction table** mapped to the matching WAI-ARIA APG pattern; multiple usage examples (controlled, uncontrolled, composed, form integration). *(These named projects are the reference points, not required tech.)*115- **IA**: Diátaxis (tutorials / how-to / reference / explanation, https://diataxis.fr/) is the cited structure for library docs; component pages = reference + examples, getting-started = tutorial.116- **Search is table stakes** — Cmd+K palette over docs content.117- **llms.txt** is near-default for developer-tool docs (platforms like Mintlify, Fern, GitBook, Vercel ship it automatically; IDE/agent tools fetch it, AI crawlers mostly ignore it and crawl HTML). `llms-full.txt` and per-page markdown routes are the common companions.118- **Registry/ecosystem affordances** where applicable: one-command installs per item and "Open in …" buttons are 2025–2026 ecosystem conventions *(illustrative — only for registry-style products)*.119- **Deploy gotchas observed in the wild**: prerendering can fail inside Docker builds despite passing locally; client env vars are inlined at build time while server env is runtime; non-root hosting needs explicit base-path config; sitemap generation is usually NOT built into the framework — verify it actually exists in the output.120- **Writing-quality tells to scan for** (from Wikipedia "Signs of AI writing"): inflated significance ("pivotal", "stands as a testament"); negative parallelism ("not just X, but Y"); rule-of-three triads everywhere; vague attribution ("widely regarded"); promotional adjectives ("powerful", "seamless", "robust", "comprehensive", "blazing-fast"); trailing "-ing" impact claims ("…, ensuring accessibility"); AI vocabulary ("delve", "leverage", "crucial", "streamline", "landscape"); copula avoidance ("serves as", "boasts" for plain "is/has"); em-dash and boldface overuse; bolded-header inline lists as default prose; formulaic wrap-ups ("In conclusion"); elegant variation (component → element → widget for the same noun). Good reference prose: short declarative sentences, concrete facts, imperative voice for instructions, no marketing register.121122## Output123124Produce exactly this report:125126```markdown127# Docs Deploy Readiness — <site name> @ <commit/date>128129Stack: <framework, render mode, build command, output, deploy target>130Inventory: <N items should be documented / M pages exist>131132Verdict: READY | READY WITH WARNINGS | NOT READY133134| Bar | Score /10 | Summary |135|---------------|-----------|----------------------------------|136| Coverage | n | <one line> |137| Anatomy | n | <one line> |138| Prose | n | <one line> |139| Accuracy | n | <one line> |140| Deployability | n | <one line> |141142## Blockers (deploy stops here)143- B1 [accuracy] <page path> — <issue> — <fix>144- B2 [deployability] ...145146## Warnings (ship-with, fix soon)147- W1 [anatomy] <page path> — <missing section siblings have>148149## Coverage gap list150| Item | Source location | Page | Status |151|------|-----------------|------|--------|152| <public item> | <file:line> | — | MISSING |153| <page> | — | <path> | STUB / ORPHAN |154155## Prose flags (defer rewrite to humanizer / humanize-readme)156| Page | Tell count | Worst tells |157```158159Scoring: any blocker in accuracy or deployability ⇒ NOT READY. Empty blocker list + warnings only ⇒ READY WITH WARNINGS. Score each bar 0–10 on evidence, not vibes.160161## Common mistakes1621631. **Auditing only the pages that exist.** The biggest gaps are items with no page at all — build the should-exist inventory from source of truth FIRST (Step 2).1642. **Importing another stack's checklist.** Don't demand a registry install tab on CLI docs, or an APG keyboard table on a config-reference page. The bar is the project's own template plus the universal checks.1653. **Trusting the docs about the code.** Every reference claim gets grepped against source. Privacy/security claims especially — a docs page saying "no data leaves your machine" over code that phones home is the worst possible finding to miss.1664. **Rewriting prose mid-audit.** Flag and defer to `humanizer` / `humanize-readme`; rewriting burns the audit's scope and context.1675. **Verifying the build only on the dev machine.** Clean environment, fresh install, container if that's the target. Prerender-in-container failures are common and invisible locally.1686. **Treating dead links/anchors and stub pages as nits.** On a critical path (getting started, install) they are blockers.1697. **Forgetting docs chrome accessibility.** Nav, search palette, theme toggle, and code-copy buttons are product UI — hand them to `accessibility-compliance`, don't skip them because "it's just docs".1708. **Skipping jargon review.** Public docs leaking internal codenames or pre-rename terms is a launch embarrassment — run `jargon-leak` alongside this audit.