ADR Patterns
Architecture Decision Records (ADRs) capture why a choice was made. The code answers what; the ADR answers why. When someone on the team asks "can we just use X instead?" six months later, the ADR is how you avoid re-litigating.
This kit ships three methodology ADRs pre-written (Strangler Fig, Dev Harness, Product Decision Log). Everything else is yours to decide — the kit provides the format.
Format (MADR-lite)
# ADR-NNNN: <decision title>
- **Status:** Proposed | Accepted | Deprecated | Superseded by ADR-XXXX
- **Date:** YYYY-MM-DD
- **Deciders:** @owner, @reviewer-1
- **Tags:** backend, frontend, migration, ...
## Context
Why is this decision needed now? What are the constraints?
## Decision
What did we decide? Lead with one sentence. Then detail.
## Consequences
### Positive
- ...
### Negative
- ...
### Neutral
- Things to watch but not block on.
## Alternatives Considered
### Alternative A: <name>
- Pros:
- Cons:
- Rejected because:
### Alternative B: <name>
...
## References
- Links, prior ADRs, external docs.
The template is at docs/templates/adr-template.md.
Two classes of ADR
Technical ADRs (0001–0010 range, by convention)
Framework choice, database, messaging, deployment topology. Deciders are usually Architect + senior eng.
Product Decision Records
Pricing tiers, entitlement rules, MVP scope, feature gating. Deciders are usually PM Lead + Architect. Same format, different domain. The kit's pre-written ADR-0003: Product Decision Log (shipped under docs/adr/) is a meta-ADR that makes this class first-class so these decisions stop being buried in PRD appendices.
Retroactive ADRs
Sometimes a decision was made in a meeting three months ago and is already in production. Write the ADR anyway, mark Status: Accepted with a Recorded: YYYY-MM-DD note, fill in the Alternatives Considered from memory.
The audit trail exists, future-you stops guessing, and if a new team member challenges the decision you have a document to either defend or gracefully deprecate.
When not to write an ADR
- Reversible, single-PR changes (naming conventions, lint rule, config value) — a PR description is enough.
- Decisions that'll be undone within a sprint.
- "How do we implement X" — that's a spec, not an ADR. ADRs are about which option to pick, not the playbook for one option.
Deprecation and supersession
Don't delete an old ADR. Instead:
- Change its status to
Deprecatedand add a one-liner at the top explaining what replaces it. - If a direct successor exists:
Superseded by ADR-NNNNand cross-link. - The reader lands on ADR-0042 "Use MySQL", sees it's deprecated, follows the link to ADR-0087 "Use Postgres", and gets the context for the shift.
Filing convention
One ADR per file, numbered sequentially, in docs/adr/. Keep a docs/adr/README.md index (the kit provides one). Never reuse a number even if an ADR is abandoned — just mark it Deprecated and move on.
Suggested ADRs to write early
For any non-trivial project:
- Monorepo strategy (one repo? multiple? Turborepo / Nx / Lerna?)
- Backend framework (Rails / Nest / FastAPI / Spring / Go stdlib)
- ORM / persistence layer
- Migration protocol — the kit provides ADR-0001 Strangler Fig; accept or adapt it.
- Dev harness / tool conventions — the kit provides ADR-0002.
- Product decision log — the kit provides ADR-0003.