Generic training explains the tool; useful training gets this reader to their goal with what they already have. Fix those facts first, then build backwards from the goal.
When to use
- Someone asks to teach, train, onboard, explain, or document how to use a tool, app, topic, or repo (guide, tutorial, course, walkthrough, manual, deck)
- A new teammate, client, or attendee must get productive with something that exists
- Existing docs list features but get nobody to an outcome
Steps
- Collect what is known (reader, what they use, goal, source, format, constraints) from the request and the workspace: README, rules files, manifests.
- Ask only for what is still open, in one message with a default per question
(
references/intake.md); nothing open → state the assumptions and go. - Inspect the source before writing. Repo: run the commands you teach, keep real output. App: drive it, capture screens, copy exact labels. Topic: name your canon.
- Design the path backwards: the goal as a test the reader passes, then the 5–12 outcomes that make it true, each needing only earlier ones.
- Write every lesson to the contract: title as the outcome, why, exact steps, a check, and the trap that really happens.
- Build the chosen format (
references/formats.md): copy theassets/template, replace the content, keep its structure. - Verify as the reader: phone and desktop widths, every command run, every link
followed, every fact checked against step 3; then run
scripts/check.mjs. - Hand back the files, what was assumed, what only a human can fill in, and how to regenerate when the source changes.
Rules
- The reader's words, not the source's: plain language, sentence case, second person.
- Every sentence is true of the source as inspected; nothing from memory.
- What they already use decides what to skip; the goal decides where to stop.
- Real examples over abstract ones: the reader's own data or situation when known.
- Nothing private leaves the source: no credentials, customer names, or emails in text or images; placeholders instead.
- Limitations are stated as tips, never hidden, removed when they stop being true.
- One format per document, chosen for how it is read.
- The output stands alone: relative paths, no build step for a guide or deck.
Lesson contract
Every lesson carries, in this order:
- Title — the outcome in the reader's words: "Request a meeting", not "Meetings module"
- Why — one sentence tying it to the goal
- Steps — numbered, imperative, one action each, with the exact label, command, or output
- Check — "you're done when …", observable without help
- Trap — the mistake that actually happens here, and its fix
- Optional: a note (tip or stated limitation) and a media slot (screenshot, demo, diagram)
Formats
| Format | Pick when | Output |
|---|---|---|
| Guide (default) | The reader works through it alone, one sitting to a few hours | One index.html (+ assets/): sticky nav, progress bar, lesson filter, lessons with steps, checks, traps, and media slots |
| Deck | Someone presents or narrates it; 25 slides or fewer | One deck.html: arrow-key and click navigation, progress, speaker notes, overview grid, prints one slide per page |
| Site | Many lessons, ongoing reference, several readers, needs search | Next.js app with markdown lessons in content/, sidebar, prev/next, client-side search, static export |
Structure contracts, template placeholders, and the per-format checks live in
references/formats.md; the templates in assets/guide.html, assets/deck.html, and
assets/site/. Media is captured from the real source and redacted, never described from
imagination. Define a term the first time only when the goal needs it; cut any lesson that
serves the tool rather than the goal.
Examples
Good intake: "Reader: new QA teammate who knows Playwright. Uses: this repo, macOS.
Goal: run the smoke suite and file a vendor bug with evidence. Format: guide."
Bad intake: "Reader: users. Goal: learn the app." — no test to pass, so no way to order or cut
Good title: "Order food and pay the bill" Bad: "Restaurant vocabulary" — a topic, not an outcome
Good step: "Run `npm run test:web:smoke`; the last line reads `12 passed`."
Bad step: "Run the tests and make sure they pass." — no command, no expected output
Good trap: "Typing in the search box does nothing until you press the keyboard's search key."
Bad trap: "Be careful with search." — nothing to recognise, nothing to do
Good check: "You're done when the metro map on your phone shows your stop in Spanish."