ADR Author
Overview
An Architecture Decision Record (ADR) is a short, immutable document that captures one
architecturally significant decision: the forces at play (context), the realistic options,
the option chosen, and the consequences that follow. ADRs form an append-only log so future
maintainers can reconstruct why the system looks the way it does — not just what it does.
This skill produces rigorous ADRs that distinguish facts from opinions, force an honest
options comparison, and make consequences (good, bad, and neutral) explicit.
Keywords: ADR, architecture decision record, design decision, technical decision log,
MADR, Nygard, trade-off analysis, options matrix, decision rationale, superseded decision,
build vs buy, framework selection, database choice, API style, architecture governance.
When a Decision Deserves an ADR
Write an ADR when the decision is architecturally significant — it is costly to reverse,
affects multiple teams/components, or constrains future choices. Use the checklist in
references/significance-checklist.md. If none of the criteria fire, capture it as a code
comment or a ticket instead, not an ADR.
Workflow
Confirm significance. Run the decision through references/significance-checklist.md.
If it does not qualify, tell the user and suggest a lighter-weight record.
Assign an ID and locate the log. ADRs live in a directory such as docs/adr/ or
doc/architecture/decisions/. Number them sequentially with a zero-padded prefix:
0001-use-postgresql.md, 0002-adopt-rest-over-graphql.md. Use
scripts/new_adr.py to scan the directory, compute the next number, and scaffold the file.
Gather context. Interview the user (or read the codebase) to extract the forces:
business drivers, technical constraints, team skills, deadlines, existing systems,
non-functional requirements (performance, security, cost, operability). Separate
objective facts from assumptions — label assumptions explicitly.
Enumerate real options. List 2-4 genuinely viable options. "Do nothing" is often a
valid option and should appear when relevant. Reject straw-man options. For each option,
describe how it works and its pros/cons against the forces from step 3.
Build the options matrix. Score options against the decision criteria (the
non-functional requirements that matter most here). See the worked example in
examples/database-selection.md. The matrix makes the trade-off legible; it does not
replace judgment.
State the decision. One clear sentence in active voice: "We will use X." Then explain
the rationale tied directly to the forces and the matrix. Name who decided and when.
Spell out consequences. Enumerate positive, negative, and neutral consequences.
Negative consequences are mandatory — every decision has costs. Include follow-up actions,
new risks, and what becomes harder.
Set status and links. Status is one of Proposed, Accepted, Rejected,
Deprecated, Superseded by ADR-NNNN. Link related and superseded ADRs bidirectionally.
Write the file from templates/adr-template.md, keep it under ~2 pages, and present
it. Remind the user that accepted ADRs are immutable — to change a decision, write a new
ADR that supersedes the old one rather than editing it.
ADR Document Structure
Use the canonical structure (a pragmatic blend of Nygard and MADR):
- Title —
ADR-NNNN: <short imperative phrase>
- Status — Proposed / Accepted / Rejected / Deprecated / Superseded by ADR-NNNN
- Date — ISO date the status last changed
- Context — the forces, constraints, and problem statement (facts vs. assumptions)
- Decision Drivers — the criteria that matter (the columns of your options matrix)
- Considered Options — each option with how-it-works + pros/cons
- Decision Outcome — the chosen option and the rationale
- Consequences — positive, negative, neutral; follow-ups and new risks
- Links — supersedes / superseded-by / related ADRs and external references
Decision Framework: Picking and Comparing Options
Compare options against weighted decision drivers, not on vibes:
- Identify the 3-6 drivers that actually matter for this decision (e.g., operability,
team familiarity, cost, latency, vendor lock-in, time-to-market).
- Optionally weight them if some clearly dominate.
- Score each option per driver (
++, +, o, -, --, or 1-5).
- Read the matrix, then write the narrative — the matrix informs, judgment decides.
Document why the winning option wins even if it doesn't top every column.
See examples/database-selection.md for a complete matrix and narrative.
Worked Example
examples/database-selection.md shows a full ADR choosing between PostgreSQL, MongoDB, and
DynamoDB for a new service — including the drivers, the scored options matrix, the decision
narrative, and honest negative consequences. Use it as the quality bar.
Best Practices
- One decision per ADR. If you're tempted to use "and", split it.
- Write in the present tense, active voice. "We will…", not "It was decided that…".
- Capture the decision when it's made, while the context is fresh and the alternatives
are still remembered. ADRs written months later lose the forces.
- Make assumptions explicit. Tag anything not verifiable as an assumption; it tells
future readers what to re-check if reality diverges.
- Always list negative consequences. An ADR with only upsides is marketing, not a record.
- Keep it short. Two pages max. Detail belongs in linked design docs, not the ADR.
- Treat accepted ADRs as immutable. Supersede, don't edit. The log's value is its history.
- Link bidirectionally. When ADR-0012 supersedes ADR-0007, update both files.
- Number consistently with zero-padding so the directory sorts correctly.
- Store ADRs in the repo, next to the code they govern, so they version with it.
Common Pitfalls
- Straw-man options. Listing only the chosen option plus throwaway alternatives. Future
readers see through it and lose trust in the log. List options you genuinely weighed.
- Conflating context with decision. Context describes the problem and forces before
you decided; it must not leak the conclusion.
- Omitting "do nothing". Often the real baseline; failing to consider it hides cost.
- No consequences, or only good ones. The most-skipped, most-valuable section.
- Editing an accepted ADR to reflect a new choice — this destroys the rationale trail.
Write a superseding ADR instead.
- Over-long ADRs that nobody reads. If it needs a design doc, write one and link it.
- Writing an ADR for a trivial decision. Use the significance checklist; don't dilute
the log with reversible, local choices.
- Vague titles like "Database decision". Prefer "ADR-0003: Use PostgreSQL for the orders
service".
1---2name: adr-author3description: Authors Architecture Decision Records (ADRs) that capture context, considered options with trade-offs, the chosen decision, and its consequences. Use this skill when the user wants to write, draft, document, or revise an architecture decision, an ADR, a design decision record, a technical decision log, or asks "why did we choose X" / "we need to record this decision" / "document this trade-off" for things like database choice, framework selection, API style, build vs. buy, or deprecating a component.4license: MIT5---67# ADR Author89## Overview1011An Architecture Decision Record (ADR) is a short, immutable document that captures one12architecturally significant decision: the forces at play (context), the realistic options,13the option chosen, and the consequences that follow. ADRs form an append-only log so future14maintainers can reconstruct *why* the system looks the way it does — not just *what* it does.1516This skill produces rigorous ADRs that distinguish facts from opinions, force an honest17options comparison, and make consequences (good, bad, and neutral) explicit.1819**Keywords:** ADR, architecture decision record, design decision, technical decision log,20MADR, Nygard, trade-off analysis, options matrix, decision rationale, superseded decision,21build vs buy, framework selection, database choice, API style, architecture governance.2223## When a Decision Deserves an ADR2425Write an ADR when the decision is **architecturally significant** — it is costly to reverse,26affects multiple teams/components, or constrains future choices. Use the checklist in27`references/significance-checklist.md`. If none of the criteria fire, capture it as a code28comment or a ticket instead, not an ADR.2930## Workflow31321. **Confirm significance.** Run the decision through `references/significance-checklist.md`.33 If it does not qualify, tell the user and suggest a lighter-weight record.34352. **Assign an ID and locate the log.** ADRs live in a directory such as `docs/adr/` or36 `doc/architecture/decisions/`. Number them sequentially with a zero-padded prefix:37 `0001-use-postgresql.md`, `0002-adopt-rest-over-graphql.md`. Use38 `scripts/new_adr.py` to scan the directory, compute the next number, and scaffold the file.39403. **Gather context.** Interview the user (or read the codebase) to extract the *forces*:41 business drivers, technical constraints, team skills, deadlines, existing systems,42 non-functional requirements (performance, security, cost, operability). Separate43 objective facts from assumptions — label assumptions explicitly.44454. **Enumerate real options.** List 2-4 genuinely viable options. "Do nothing" is often a46 valid option and should appear when relevant. Reject straw-man options. For each option,47 describe how it works and its pros/cons against the forces from step 3.48495. **Build the options matrix.** Score options against the decision criteria (the50 non-functional requirements that matter most here). See the worked example in51 `examples/database-selection.md`. The matrix makes the trade-off legible; it does not52 replace judgment.53546. **State the decision.** One clear sentence in active voice: "We will use X." Then explain55 the rationale tied directly to the forces and the matrix. Name who decided and when.56577. **Spell out consequences.** Enumerate positive, negative, and neutral consequences.58 Negative consequences are mandatory — every decision has costs. Include follow-up actions,59 new risks, and what becomes harder.60618. **Set status and links.** Status is one of `Proposed`, `Accepted`, `Rejected`,62 `Deprecated`, `Superseded by ADR-NNNN`. Link related and superseded ADRs bidirectionally.63649. **Write the file** from `templates/adr-template.md`, keep it under ~2 pages, and present65 it. Remind the user that accepted ADRs are immutable — to change a decision, write a new66 ADR that supersedes the old one rather than editing it.6768## ADR Document Structure6970Use the canonical structure (a pragmatic blend of Nygard and MADR):7172- **Title** — `ADR-NNNN: <short imperative phrase>`73- **Status** — Proposed / Accepted / Rejected / Deprecated / Superseded by ADR-NNNN74- **Date** — ISO date the status last changed75- **Context** — the forces, constraints, and problem statement (facts vs. assumptions)76- **Decision Drivers** — the criteria that matter (the columns of your options matrix)77- **Considered Options** — each option with how-it-works + pros/cons78- **Decision Outcome** — the chosen option and the rationale79- **Consequences** — positive, negative, neutral; follow-ups and new risks80- **Links** — supersedes / superseded-by / related ADRs and external references8182## Decision Framework: Picking and Comparing Options8384Compare options against weighted **decision drivers**, not on vibes:85861. Identify the 3-6 drivers that actually matter for *this* decision (e.g., operability,87 team familiarity, cost, latency, vendor lock-in, time-to-market).882. Optionally weight them if some clearly dominate.893. Score each option per driver (`++`, `+`, `o`, `-`, `--`, or 1-5).904. Read the matrix, then **write the narrative** — the matrix informs, judgment decides.91 Document *why* the winning option wins even if it doesn't top every column.9293See `examples/database-selection.md` for a complete matrix and narrative.9495## Worked Example9697`examples/database-selection.md` shows a full ADR choosing between PostgreSQL, MongoDB, and98DynamoDB for a new service — including the drivers, the scored options matrix, the decision99narrative, and honest negative consequences. Use it as the quality bar.100101## Best Practices102103- **One decision per ADR.** If you're tempted to use "and", split it.104- **Write in the present tense, active voice.** "We will…", not "It was decided that…".105- **Capture the decision when it's made**, while the context is fresh and the alternatives106 are still remembered. ADRs written months later lose the forces.107- **Make assumptions explicit.** Tag anything not verifiable as an assumption; it tells108 future readers what to re-check if reality diverges.109- **Always list negative consequences.** An ADR with only upsides is marketing, not a record.110- **Keep it short.** Two pages max. Detail belongs in linked design docs, not the ADR.111- **Treat accepted ADRs as immutable.** Supersede, don't edit. The log's value is its history.112- **Link bidirectionally.** When ADR-0012 supersedes ADR-0007, update both files.113- **Number consistently** with zero-padding so the directory sorts correctly.114- **Store ADRs in the repo**, next to the code they govern, so they version with it.115116## Common Pitfalls117118- **Straw-man options.** Listing only the chosen option plus throwaway alternatives. Future119 readers see through it and lose trust in the log. List options you genuinely weighed.120- **Conflating context with decision.** Context describes the problem and forces *before*121 you decided; it must not leak the conclusion.122- **Omitting "do nothing".** Often the real baseline; failing to consider it hides cost.123- **No consequences, or only good ones.** The most-skipped, most-valuable section.124- **Editing an accepted ADR** to reflect a new choice — this destroys the rationale trail.125 Write a superseding ADR instead.126- **Over-long ADRs** that nobody reads. If it needs a design doc, write one and link it.127- **Writing an ADR for a trivial decision.** Use the significance checklist; don't dilute128 the log with reversible, local choices.129- **Vague titles** like "Database decision". Prefer "ADR-0003: Use PostgreSQL for the orders130 service".