A documentation template can manufacture the appearance of order in seconds: a getting-started page, a reference section, a neat little slot for troubleshooting. Fill those headings before choosing a real product task and you have built an empty house faster.

I think a template earns its keep only when it forces the writer to expose product behavior. The downloads below pair a blank starter with a filled example for a hypothetical export service that stores request records in memory without generating files.

The quickstart proves a first result, reference nails down the contract, and troubleshooting tells the reader what to do when the response disappears.

Copy the blank starter or inspect the filled template

The blank starter contains a MkDocs site and its validator. The writing lab is a separate Markdown example with a local service; it does not replace the starter's publishing setup.

Page job Filled example Evidence the page must supply
Choose where to begin docs/index.md Links from the reader's task to the owning page
Reach first success docs/getting-started.md Startup commands and an observable response
Perform a bounded task docs/send-a-request.md A complete request with its recovery branch
Look up a contract docs/reference.md Input rules and response meanings
Recover from a symptom docs/troubleshooting.md A diagnostic check and a justified next action

If a page has no distinct reader job, kill the placeholder until a task requires it. An empty "Concepts" section is a promise nobody has done the work to keep.

The documentation types guide helps place explanation or tutorial material when it grows beyond this initial route.

Fill the starting path with a real command

The filled quickstart tells the reader to extract the archive and run these commands from writing-lab. The recorded test runtime is Node.js 24.18.0; the fixture has no npm dependencies.

node --version
node check.mjs
node service.mjs

The check ends with PASS. The server then prints its loopback URL and remains running.

Set LAB_URL to the printed value in another terminal:

export LAB_URL=http://127.0.0.1:49152
curl --fail-with-body "$LAB_URL/health"
curl -i "$LAB_URL/exports" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: report-a' \
  --data '{"format":"csv"}'

On a fresh server, the request returns HTTP 202 with {"id":"exp_1","format":"csv","status":"accepted"}. The page must define what "accepted" means: a record exists in this server's memory.

If the health request fails, compare the URL with the server terminal before continuing; use the recovery page for an export error. Keep this server running for the recovery experiment below.

Put exact rules in reference

A quickstart can choose csv for its first request. Reference must also say whether json is allowed and what happens to an unsupported value.

That distinction keeps setup prose short without hiding the contract.

Reference field Filled value Check
Format csv or json, required xml returns HTTP 400
Request key Required; 1 to 64 ASCII letters, digits, or hyphens Missing key returns HTTP 400
Body size Limit: 4096 bytes A valid padded 4096-byte request is accepted; 4097 bytes return HTTP 413
Retention The lifetime of this server instance A new instance starts with no stored records
Output An accepted record identifier The fixture contains no file-generation worker

Run node check.mjs to verify the tested cases. An assertion failure means the corresponding contract statement needs investigation.

For a CLI or internal tool, fill the option's allowed values and state the observed failure before recommending the page layout. Limit the claim to the tested cases, then name the behavior change that should trigger page review.

Give recovery its own decision table

The blank starter already includes a troubleshooting page. The missing work is product-specific: supply enough information for the reader to act after an ambiguous outcome.

The filled guide deliberately stores a request, then closes its connection without a response.

curl -i "$LAB_URL/exports" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: report-loss' \
  -H 'X-Fixture-Drop-Response: yes' \
  --data '{"format":"csv"}'

Use a previously unused key. Expect curl's Empty reply from server and exit code 52.

The controlled connection loss is not a timed network outage. If you receive HTTP 200, that key was already retained; use another unused key to reproduce the failure.

Observed state Next action Reason
Response lost; same instance still running Repeat with the saved key and format, omitting the fixture failure header The retained record can be returned with HTTP 200
HTTP 409 Compare the new format with the original request The key identifies a different retained payload
Process restarted after response loss Stop the recovery experiment The fixture cannot recover the previous record

"Retry failed requests" is the kind of instruction that looks tidy in a review and ruins someone's afternoon in production. The filled request guide contains the retry command and the troubleshooting page owns the stop condition.

The recorded fixture checks ran on Node.js 24.18.0 on 10 September 2026. No human reader trial has been completed.

Reader check: select an action for each row using only the filled pages, then identify the supporting sentence. If a choice needs outside information, record that gap before claiming the template supports the task.

After the recovery experiment, press Ctrl-C in the server terminal. Stopping this fixture erases its stored records.

Check structure and behavior separately

The blank starter's validator checks navigation and local Markdown links. Its strict build checks the documentation site.

Run its commands from the extracted starter, after installing its requirements in a fresh Python environment:

python -m venv .venv
. .venv/bin/activate
python -m pip install -r requirements.txt
python scripts/validate_docs.py
mkdocs build --strict

If installation or validation fails, stop before publishing generated output. These checks do not send a request to your product.

The filled fixture's node check.mjs covers behavior and closes its temporary servers, but does not test the blank starter's publishing workflow.

Change Page to review Evidence to repeat
Startup command changes Getting started Clean-directory startup and health request
Input limit changes Reference Accepted boundary and rejected adjacent value
Storage lifetime changes Reference and troubleshooting Recovery before and after restart
A link target moves Index and referring pages Link validation and rendered navigation

The documentation review checklist adds the reader-facing checks.

Assign an owner to each filled page and keep its triggering behavior beside the review check.