Glossary

An ADR records why, not what.

The code shows what was decided. Only the record shows what was rejected, and why.

Download for macOS
v0.1.33 · .dmg · Apple Silicon & Intel
Signed & notarized by Apple · opens without a Gatekeeper warning
sha256 698955a0187bc039f4c74f5d05a9f10fbb27376a45788a0a241d1326b73873c7
Download for Windows instead
$curl -fsSL https://lucidtrain.com/install.sh | sh

An architecture decision record, or ADR, is a short document capturing one significant decision: the context that forced it, the decision itself, the alternatives that were considered and rejected, and the consequences accepted along with it. The convention, introduced by Michael Nygard in 2011, is that ADRs are immutable once accepted. A decision that gets reversed is not edited; a new ADR supersedes it, so the record shows the reasoning history rather than only the current state.

Immutability is the whole mechanism

Editing an accepted ADR destroys the thing it exists to preserve. The value is not knowing that you use Postgres, which is visible from the repository, but knowing that in 2023 you considered a document store, rejected it for a specific reason, and what that reason was. Supersede rather than edit and the file becomes a record of reasoning. Edit it and it degrades into documentation that says what is already obvious.

What makes a decision worth recording

The test is whether reversing it later would be expensive. Choosing a datastore, a boundary between services, a synchronous or asynchronous integration, a language for a new component: these are hard to undo and their reasoning is forgotten fast. Choosing a linting rule is not. Teams that record everything stop reading them, which is the usual failure mode.

Why it belongs beside the code

ADRs are conventionally kept as markdown in the repository, typically under docs/adr, so they are versioned with the code they describe and travel with a clone. A decision record in a wiki decays because it is one more place to remember; one in the repository shows up in a diff when the code it justifies changes.

Where an agent fits

The context section is the part people skip, because writing it means reconstructing what was true at the time. An agent with the repository and its history available can draft that from the actual change, leaving the judgement, what was rejected and what consequence you accepted, to the person who made the decision. That is the half that cannot be automated and should not be.

The conventional sections

SectionHolds
TitleA short noun phrase naming the decision
StatusProposed, accepted, deprecated or superseded
ContextThe forces that made a decision necessary
DecisionWhat was chosen, in the active voice
ConsequencesWhat becomes easier and what becomes harder
FAQ

Questions

Who introduced ADRs?

Michael Nygard, in a 2011 post proposing lightweight immutable records kept alongside the code.

Should I edit an ADR when the decision changes?

No. Write a new one that supersedes it and mark the old one superseded. Editing destroys the reasoning history, which is the only reason the format is worth the effort.

How long should an ADR be?

One page. If it runs longer it is usually several decisions that should be recorded separately.

Related

Last updated