| 1 | # ADR Format |
| 2 | |
| 3 | ADRs live in `docs/adr/` and use sequential numbering: `0001-slug.md`, `0002-slug.md`, etc. |
| 4 | |
| 5 | Create the `docs/adr/` directory lazily — only when the first ADR is needed. |
| 6 | |
| 7 | ## Template |
| 8 | |
| 9 | ```md |
| 10 | # {Short title of the decision} |
| 11 | |
| 12 | {1-3 sentences: what's the context, what did we decide, and why.} |
| 13 | ``` |
| 14 | |
| 15 | That's it. An ADR can be a single paragraph. The value is in recording *that* a decision was made and *why* — not in filling out sections. |
| 16 | |
| 17 | ## Optional sections |
| 18 | |
| 19 | Only include these when they add genuine value. Most ADRs won't need them. |
| 20 | |
| 21 | - **Status** frontmatter (`proposed | accepted | deprecated | superseded by ADR-NNNN`) — useful when decisions are revisited |
| 22 | - **Considered Options** — only when the rejected alternatives are worth remembering |
| 23 | - **Consequences** — only when non-obvious downstream effects need to be called out |
| 24 | |
| 25 | ## Numbering |
| 26 | |
| 27 | Scan `docs/adr/` for the highest existing number and increment by one. |
| 28 | |
| 29 | ## When to offer an ADR |
| 30 | |
| 31 | All three of these must be true: |
| 32 | |
| 33 | 1. **Hard to reverse** — the cost of changing your mind later is meaningful |
| 34 | 2. **Surprising without context** — a future reader will look at the code and wonder "why on earth did they do it this way?" |
| 35 | 3. **The result of a real trade-off** — there were genuine alternatives and you picked one for specific reasons |
| 36 | |
| 37 | If a decision is easy to reverse, skip it — you'll just reverse it. If it's not surprising, nobody will wonder why. If there was no real alternative, there's nothing to record beyond "we did the obvious thing." |
| 38 | |
| 39 | ### What qualifies |
| 40 | |
| 41 | - **Architectural shape.** "We're using a monorepo." "The write model is event-sourced, the read model is projected into Postgres." |
| 42 | - **Integration patterns between contexts.** "Ordering and Billing communicate via domain events, not synchronous HTTP." |
| 43 | - **Technology choices that carry lock-in.** Database, message bus, auth provider, deployment target. Not every library — just the ones that would take a quarter to swap out. |
| 44 | - **Boundary and scope decisions.** "Customer data is owned by the Customer context; other contexts reference it by ID only." The explicit no-s are as valuable as the yes-s. |
| 45 | - **Deliberate deviations from the obvious path.** "We're using manual SQL instead of an ORM because X." Anything where a reasonable reader would assume the opposite. These stop the next engineer from "fixing" something that was deliberate. |
| 46 | - **Constraints not visible in the code.** "We can't use AWS because of compliance requirements." "Response times must be under 200ms because of the partner API contract." |
| 47 | - **Rejected alternatives when the rejection is non-obvious.** If you considered GraphQL and picked REST for subtle reasons, record it — otherwise someone will suggest GraphQL again in six months. |
| 48 |