ADR (Architecture Decision Record): documenting decisions that matter
Posted on February 23, 2026 • 7 min read • 1,357 wordsAn ADR is not “yet another architecture document”: it’s a short note that captures context, the decision, and its consequences. Used well, it prevents repetitive debates, speeds up alignment, and makes choices durable.

Engineering teams spend a lot of time discussing, arbitrating, choosing… and then forgetting why they made certain decisions.
The outcome is familiar:
An ADR (Architecture Decision Record) exists to avoid that. It’s not a “big architecture doc,” nor a requirements spec: it’s a short note that captures an important decision, with just enough context to keep it understandable and reusable.
ADRs (Architecture Decision Records) became popular thanks to a post by Michael Nygard, Documenting Architecture Decisions (November 15, 2011), where he proposes a deliberately lightweight approach: recording an “architecturally significant” decision with just enough context to keep it understandable over time.
The template often referred to as the “Nygard ADR” (Title / Status / Context / Decision / Consequences) comes directly from that proposal and has been widely adopted by the community as a reference format.
In practice, you can say Nygard primarily popularized and standardized a simple method to preserve decision memory—hence why his name still comes up whenever people talk about ADRs.
An ADR is a document (often one page max) that answers three questions:
The goal isn’t to produce a “pretty” document. The goal is to make a decision:
Typical examples:
An ADR is not a control system. It’s a memory tool for decisions that matter.
The approach popularized by Michael Nygard aims for a short format.
Context explains why this topic exists now.
It should contain just enough information for a future reader to understand the constraints at the time.
Example:
“We deploy a Go service on Kubernetes. CI builds take ~18 minutes. We want faster feedback without losing reproducibility or significantly increasing local complexity.”
The decision should be readable at a glance: short, clear, unambiguous.
Example:
“We adopt remote caching + ‘affected’ task execution for CI (option B) to reduce average pipeline time.”
A decision has a life. Status prevents “ghost ADRs.”
Example:
“Status: Proposed (to be validated after a PoC on one service).”
This is the “honest” part. You write what you gain and what you accept losing.
Example:
The goal isn’t to prove you were “right.”
The goal is to make options visible and document why they didn’t meet the criteria.
Example:
“We did not choose Docker layer caching because it creates a strong dependency on local Docker and complicates the developer experience.”
Many teams stop at Context/Decision/Consequences.
Adding 4–6 lines turns the ADR into an operational decision (otherwise it “sleeps”).
Next steps should be: short, assigned, verifiable.
Example:
An ADR rarely fails because the format is bad. It fails because:
Here are practices that work.
Don’t mix “DB choice” + “repo conventions” + “event format” in a single doc.
If you need to do that, you probably have multiple decisions.
The most common approach: a docs/adr/ folder in the repo.
Naming examples:
docs/adr/0001-use-postgresql.mddocs/adr/0002-ci-remote-cache.mdNumbering makes references stable.
A good routine:
You can even request: “if you disagree, propose an alternative and its consequences.”
When a decision changes:
Superseded by ADR-00XX,This discipline avoids contradictory documentation.
# ADR-0002 — CI: Remote cache + affected tasks
Status: Accepted
Date: 2026-02-23
Owner: Hélène
## Context
Our Go services run on Kubernetes. CI pipelines average 18 minutes.
We want faster feedback without forcing Docker locally and without losing reproducibility.
## Decision
Adopt remote caching plus "affected-only" task execution for CI.
Scope: one service first, then extend to the monorepo if results are stable.
## Consequences
+ Faster feedback; fewer stalled PRs
+ Better scalability as the repo grows
- Initial setup complexity (cache backend, auth)
- Risk of incorrect cache hits → need safeguards and invalidation rules
## Alternatives considered
A) Standard CI cache: limited gains, inconsistent
C) Docker layer caching: adds local Docker dependency and friction
## Execution plan
- [ ] PoC on one service (Hélène, Friday)
- [ ] Measure before/after (avg, variance, failure rate)
- [ ] Write setup + invalidation rules (README)
- [ ] Rollout if gain > 30% and stable; rollback otherwise“We write ADRs for everything”
“We write the ADR after the fact”
“The ADR replaces discussion”
“We don’t know whether it’s still true”
Status + Superseded and keep an index.ADRs should serve the team—not the other way around.
A good sign your ADRs are working: