Architecture Decision Records That Age Well
An Architecture Decision Record is a short document that answers one question: why did we choose this? Not what we built — why. Teams that keep good ADRs stop re-litigating the same decisions every eighteen months.
The format that works
Every ADR template works if you actually fill it in. The one I keep coming back to:
# ADR-0007: Use an outbox table for event publication
## Status
Accepted (2026-08-14)
## Context
Orders are written to PostgreSQL; events must reach Kafka.
Dual writes can lose events on crash.
## Decision
Write events to an `outbox` table in the same transaction;
a relay publishes them to Kafka.
## Consequences
- No lost events between DB and Kafka
- At-least-once delivery: consumers must be idempotent
- One more table to monitor for growthThree traits of ADRs that survive
- They are short. If it doesn't fit on one screen, it won't be read in a year.
- They record rejected options. The rejected alternatives are the whole point — they tell future readers what was already considered.
- They state expiry conditions. "This holds while we're under 5k events/sec" turns a stale ADR from misinformation into a documented threshold.
Where they live
In the repository, next to the code, reviewed in pull requests. A wiki page nobody watches is where context goes to die. If the decision can't be found next to the system it shaped, it effectively doesn't exist.
Summary
- Record why, not what — the diff already explains what.
- Keep them short, store rejected options, add expiry conditions.
- Keep them in version control and let them age via supersession, not silent rot.