Skip to content

Module README guide — small tactical docs next to code

How to write a module map: a short README that sits next to the code it describes and carries the local knowledge the code alone cannot state. It serves everyone the same way — humans and agents, feature work and maintenance. This guide is for anyone (especially agents) adding or extending one.

Live examples in this repo: src/lib/ar/README.md · scripts/README.md · tests/e2e/README.md.

When to write one

Any one trigger is enough:

  • The area has two or more look-alike implementations (same concept, different consumers) and nothing states which serves what.
  • A convention exists that code doesn't declare: units, coordinate frames, physical models, naming/taxonomy rules, generated-vs-source boundaries.
  • A fix or review went to the wrong file or layer in this area — that miss is the signal that local knowledge is undocumented.
  • A folder has grown enough files that "what lives where" needs answering.

Where it lives

README.md inside the module's folder; for a single top-level file, <name>.README.md next to it. Always adjacent to the code so it moves, versions, and gets reviewed together with what it describes.

What goes in (10–25 lines, whichever of these apply)

  1. One line: what this area is and which route/feature consumes it.
  2. Ownership map — file/function → responsibility → consumer.
  3. Disambiguation — name the look-alikes and when to use which.
  4. Local conventions & invariants — units, frames, models, taxonomy rules, "generated — don't hand-edit" boundaries.
  5. Contracts callers rely on.
  6. Pointers up — one line each to the ADR / PRD / RFC / TA.md section that holds the why. Link, never summarize: the README carries the what / which / who-owns; the big docs carry the why. If the why isn't written anywhere, flag the gap — don't invent it here.

What stays out

  • Bug/ticket/PR references and history ("added for #123" rots).
  • API reference — signatures and types live in the code.
  • Roadmap/strategy — belongs in the docs you link to.
  • Anything the code already says clearly. Non-obvious only.
  • More than ~25 lines. Longer means the area needs splitting, or the content is really an ADR.

Voice: a maintainer leaving notes for the next person; present tense. The README states the module's intended conventions — if code contradicts the doc, that divergence is a bug to raise and fix (same anti-drift rule as TA.md), never something to paper over.

Validating a module README

  • Review checklist (2 min). Someone who has never seen the area must be able to answer from the README alone: which file/function do I touch for a symptom here? which of the look-alikes, and why not the other? what invariant must my change respect? Plus: ≤25 lines, zero bug references, links to big docs rather than copies. Any miss → rewrite.
  • Localization quiz (empirical). Give an agent a vague-but-honest bug description for the area and ask "which file/function would you change, and what must the fix respect?" — once without the README, once with it. The doc is load-bearing iff the with-doc answer names the right target and constraints when the without-doc answer did not.

Hindsight caveat: a README written by someone who knows a specific bug can smuggle the answer. Stick to module-intent facts (ownership, conventions, contracts) a maintainer would write regardless; never describe any bug's symptom or fix.

Orrery — architecture documentation · MIT · No tracking