When to use
Creating or updating any doc humans rely on to run, integrate with, or understand a system. Good docs answer the reader's next question before they ask it.
Not for: inline code comments, commit messages, or design debate that belongs in an ADR (use eng-architecture). This is reader-facing reference and how-to, not decision rationale.
Method
- Identify the reader and their goal: a new contributor getting set up, an on-call engineer mid-incident, or an integrator calling your API. Write for that one job; if two readers need different things, write two docs.
- Lead with the outcome. Put "what this is and why you'd use it" in the first three lines. Bury nothing important below the fold.
- Make it runnable. Every setup or usage step must be copy-pasteable and verified against a clean environment. If you can't run a step, mark it UNVERIFIED rather than implying it works.
- Match the form to the type:
- README → purpose, quickstart, config, common tasks, troubleshooting, links.
- Runbook → alert/symptom, diagnosis steps, remediation commands, escalation, rollback.
- API doc → endpoint, params, auth, request/response examples, error codes, rate limits.
- Architecture → context diagram, components, data flow, key decisions (link ADRs).
- Show real (sanitized) values, not
<placeholder> soup a reader has to decode.
- State what's out of scope and add a "last verified" date. A doc that lies is worse than none — if you can't verify a section, say so.
Example
Runbook snippet for a "queue backing up" alert:
## Alert: order-queue depth > 10k
Symptom: OrderQueueDepth alarm; checkout latency climbing.
Diagnose: `aws sqs get-queue-attributes --queue-url $Q` → check
ApproximateNumberOfMessages and consumer count in the orders dashboard.
Remediate: scale consumers → `kubectl scale deploy/order-worker --replicas=8`
Escalate: if depth still rising after 10m, page @payments-oncall.
Rollback: revert last order-worker deploy → `deploy rollback order-worker`
Last verified: 2026-07-11
Pitfalls
- Writing for no one — a doc addressed to everyone helps no one; name the reader.
- Steps that only run on your machine because of an unstated prerequisite.
- Placeholder soup the reader must reverse-engineer into real values.
- Stale docs left undated — no "last verified" means readers can't judge trust.
Output format
Doc type: <README | Runbook | API | Architecture> Reader: <who + their goal>
<the document in Markdown, headings matched to the type above>
- runnable examples with expected output
- troubleshooting / FAQ where relevant
Out of scope: <what this doc does not cover>
Last verified: <YYYY-MM-DD> Related: <links to ADRs / other docs>
1---2name: eng-tech-docs3description: Write or maintain technical documentation — READMEs, runbooks, API references, architecture docs — that a specific reader can act on without asking follow-ups.4---56## When to use78Creating or updating any doc humans rely on to run, integrate with, or understand a system. Good docs answer the reader's next question before they ask it.910**Not for:** inline code comments, commit messages, or design debate that belongs in an ADR (use eng-architecture). This is reader-facing reference and how-to, not decision rationale.1112## Method13141. **Identify the reader and their goal**: a new contributor getting set up, an on-call engineer mid-incident, or an integrator calling your API. Write for that one job; if two readers need different things, write two docs.152. **Lead with the outcome.** Put "what this is and why you'd use it" in the first three lines. Bury nothing important below the fold.163. **Make it runnable.** Every setup or usage step must be copy-pasteable and verified against a clean environment. If you can't run a step, mark it UNVERIFIED rather than implying it works.174. **Match the form to the type:**18 - README → purpose, quickstart, config, common tasks, troubleshooting, links.19 - Runbook → alert/symptom, diagnosis steps, remediation commands, escalation, rollback.20 - API doc → endpoint, params, auth, request/response examples, error codes, rate limits.21 - Architecture → context diagram, components, data flow, key decisions (link ADRs).225. **Show real (sanitized) values**, not `<placeholder>` soup a reader has to decode.236. **State what's out of scope and add a "last verified" date.** A doc that lies is worse than none — if you can't verify a section, say so.2425## Example2627Runbook snippet for a "queue backing up" alert:2829```30## Alert: order-queue depth > 10k31Symptom: OrderQueueDepth alarm; checkout latency climbing.32Diagnose: `aws sqs get-queue-attributes --queue-url $Q` → check33 ApproximateNumberOfMessages and consumer count in the orders dashboard.34Remediate: scale consumers → `kubectl scale deploy/order-worker --replicas=8`35Escalate: if depth still rising after 10m, page @payments-oncall.36Rollback: revert last order-worker deploy → `deploy rollback order-worker`37Last verified: 2026-07-1138```3940## Pitfalls4142- **Writing for no one** — a doc addressed to everyone helps no one; name the reader.43- **Steps that only run on your machine** because of an unstated prerequisite.44- **Placeholder soup** the reader must reverse-engineer into real values.45- **Stale docs left undated** — no "last verified" means readers can't judge trust.4647## Output format4849```50Doc type: <README | Runbook | API | Architecture> Reader: <who + their goal>51<the document in Markdown, headings matched to the type above>52 - runnable examples with expected output53 - troubleshooting / FAQ where relevant54Out of scope: <what this doc does not cover>55Last verified: <YYYY-MM-DD> Related: <links to ADRs / other docs>56```