Architecture decision record (ADR) skill
Helps a developer or team create and maintain architecture decision records:
short documents that capture an important architecture decision, the context
that led to it, and its consequences.
This skill is general-purpose: it applies to any repository the user is
working in, not just this one. reference/templates.md and
reference/writing-guide.md are self-contained — no need to read the rest of
this repo to use them.
1. Decide if this decision deserves an ADR
Not every decision needs one. Recommend an ADR when the decision:
- Is architecturally significant (affects structure, external interfaces,
quality attributes, or is expensive/risky to reverse).
- Needs to be understood by future developers who weren't in the room.
- Involved real trade-offs worth recording (not a one-line style choice
already covered by a linter or style guide).
Skip an ADR when the decision is tiny, self-contained, single-developer,
already covered by policy/standards, or purely a temporary workaround/POC.
If the user is unsure, ask what the decision is and who needs to understand
"why" later — that usually settles it.
2. Find or create the ADR directory
Look for an existing convention first:
git ls-files | grep -iE '(^|/)(adr|adrs|decisions?)(/|$)'
- If one exists, follow its naming/format/numbering so far.
- If none exists, ask the user (or default to) a top-level
decisions/ or
adr/ directory. Some teams prefer decisions/ because the word
"architecture" and the abbreviation "ADR" put some contributors off,
while "decisions" invites broader use (vendor, planning, scheduling
decisions too).
- Some projects number files (
0001-choose-database.md, adr-tools style);
others don't. Match what's already there; otherwise unnumbered
present-tense file names (see below) are simplest to start with.
3. Name the file
Convention used across this ecosystem:
- A present-tense imperative verb phrase, e.g.
choose-database.md,
format-timestamps.md, manage-passwords.md, handle-exceptions.md.
- Lowercase with dashes.
.md extension.
- If the project numbers ADRs, prefix with a zero-padded sequence number,
e.g.
0007-choose-database.md.
4. Pick a template
Ask the user's preference, or pick based on the shape of the decision — see
reference/templates.md for the full skeletons. Quick guide:
| Situation |
Template |
| Default / most teams / unsure |
Nygard — Title, Status, Context, Decision, Consequences |
| Want lightweight options-with-pros/cons |
MADR |
| Enterprise, need traceability to requirements/principles |
Tyree & Akerman |
| Fast executive sign-off on a narrow technical choice (a library, a model, a CI strategy) |
ITD (Important Technical Decision) |
| Vendor/tool selection with cost, SWOT, stakeholder opinions |
Business case |
| Want a one-paragraph "Y-statement" style summary plus narrative |
Alexandrian pattern |
| Need formal, testable non-functional requirements language |
Planguage |
| Contributing to / matching EdgeX Foundry conventions |
EdgeX |
| Full architecture documentation, ADR is one section of it |
arc42 (§9) |
| Want a lightweight traffic-light options-comparison table |
Gareth Morgan |
| Want an "Options → Options Analysis → Recommendation" narrative flow |
GIG Cymru NHS Wales |
When in doubt, default to Nygard — it's the simplest, most widely recognized,
and easiest for a team to adopt without tooling.
5. Write it well
Load reference/writing-guide.md for the fuller checklist. The essentials:
- One decision per ADR. Don't bundle multiple architecturally
distinct decisions into one file.
- Context should explain the organization's situation, constraints, and
the forces in tension — not just "we needed a database."
- Decision should state the chosen direction plainly, not hedge.
- Consequences should cover both what gets easier and what gets harder,
plus any follow-on ADRs this decision now requires.
- Timestamp it. Costs, vendor pricing, and scaling numbers change —
date anything that might go stale.
- Give the record a status:
proposed | accepted | rejected | deprecated | superseded by <link>.
6. Handle supersession, not silent edits
ADRs are usually treated as immutable once accepted (some teams instead
prefer a "living document" with dated addenda — ask if unsure which this
team wants). When a new decision replaces an old one:
- Create a new ADR file describing the new decision.
- Update the old ADR's Status to
Superseded by [new-adr](path).
- Link back from the new ADR's Status/Links section:
Supersedes [old-adr](path).
7. Optional: wire it into pull requests
If the user wants ADR presence enforced or automatically surfaced on PRs,
mention (don't set these up unprompted):
- ADR Guard — GitHub
Action that fails a PR when watched code paths change without an
ADR being added/updated. Supports
ADR-Exempt: waivers.
- Decision Guardian —
surfaces relevant existing decision records on a PR touching that code.
Full background, more templates, and further reading live in the
architecture-decision-record repo.
1---2name: architecture-decision-record-skill3description: Use when a user wants to create, write, name, place, or organize an Architecture Decision Record (ADR) in a software project — e.g. "write an ADR for choosing a database", "document this architecture decision", "set up an adr/ or decisions/ directory", "which ADR template should I use", "supersede an old ADR". Covers picking a template, naming the file, filling in context/decision/consequences, and deciding whether a decision even needs an ADR.4---56# Architecture decision record (ADR) skill78Helps a developer or team create and maintain architecture decision records:9short documents that capture an important architecture decision, the context10that led to it, and its consequences.1112This skill is general-purpose: it applies to any repository the user is13working in, not just this one. `reference/templates.md` and14`reference/writing-guide.md` are self-contained — no need to read the rest of15this repo to use them.1617## 1. Decide if this decision deserves an ADR1819Not every decision needs one. Recommend an ADR when the decision:2021- Is architecturally significant (affects structure, external interfaces,22 quality attributes, or is expensive/risky to reverse).23- Needs to be understood by future developers who weren't in the room.24- Involved real trade-offs worth recording (not a one-line style choice25 already covered by a linter or style guide).2627Skip an ADR when the decision is tiny, self-contained, single-developer,28already covered by policy/standards, or purely a temporary workaround/POC.2930If the user is unsure, ask what the decision is and who needs to understand31"why" later — that usually settles it.3233## 2. Find or create the ADR directory3435Look for an existing convention first:3637```sh38git ls-files | grep -iE '(^|/)(adr|adrs|decisions?)(/|$)'39```4041- If one exists, follow its naming/format/numbering so far.42- If none exists, ask the user (or default to) a top-level `decisions/` or43 `adr/` directory. Some teams prefer `decisions/` because the word44 "architecture" and the abbreviation "ADR" put some contributors off,45 while "decisions" invites broader use (vendor, planning, scheduling46 decisions too).47- Some projects number files (`0001-choose-database.md`, adr-tools style);48 others don't. Match what's already there; otherwise unnumbered49 present-tense file names (see below) are simplest to start with.5051## 3. Name the file5253Convention used across this ecosystem:5455- A present-tense imperative verb phrase, e.g. `choose-database.md`,56 `format-timestamps.md`, `manage-passwords.md`, `handle-exceptions.md`.57- Lowercase with dashes.58- `.md` extension.59- If the project numbers ADRs, prefix with a zero-padded sequence number,60 e.g. `0007-choose-database.md`.6162## 4. Pick a template6364Ask the user's preference, or pick based on the shape of the decision — see65`reference/templates.md` for the full skeletons. Quick guide:6667| Situation | Template |68|---|---|69| Default / most teams / unsure | **Nygard** — Title, Status, Context, Decision, Consequences |70| Want lightweight options-with-pros/cons | **MADR** |71| Enterprise, need traceability to requirements/principles | **Tyree & Akerman** |72| Fast executive sign-off on a narrow technical choice (a library, a model, a CI strategy) | **ITD** (Important Technical Decision) |73| Vendor/tool selection with cost, SWOT, stakeholder opinions | **Business case** |74| Want a one-paragraph "Y-statement" style summary plus narrative | **Alexandrian pattern** |75| Need formal, testable non-functional requirements language | **Planguage** |76| Contributing to / matching EdgeX Foundry conventions | **EdgeX** |77| Full architecture documentation, ADR is one section of it | **arc42** (§9) |78| Want a lightweight traffic-light options-comparison table | **Gareth Morgan** |79| Want an "Options → Options Analysis → Recommendation" narrative flow | **GIG Cymru NHS Wales** |8081When in doubt, default to Nygard — it's the simplest, most widely recognized,82and easiest for a team to adopt without tooling.8384## 5. Write it well8586Load `reference/writing-guide.md` for the fuller checklist. The essentials:8788- **One decision per ADR.** Don't bundle multiple architecturally89 distinct decisions into one file.90- **Context** should explain the organization's situation, constraints, and91 the forces in tension — not just "we needed a database."92- **Decision** should state the chosen direction plainly, not hedge.93- **Consequences** should cover both what gets easier and what gets harder,94 plus any follow-on ADRs this decision now requires.95- **Timestamp it.** Costs, vendor pricing, and scaling numbers change —96 date anything that might go stale.97- Give the record a status: `proposed | accepted | rejected | deprecated |98 superseded by <link>`.99100## 6. Handle supersession, not silent edits101102ADRs are usually treated as immutable once accepted (some teams instead103prefer a "living document" with dated addenda — ask if unsure which this104team wants). When a new decision replaces an old one:1051061. Create a new ADR file describing the new decision.1072. Update the old ADR's Status to `Superseded by [new-adr](path)`.1083. Link back from the new ADR's Status/Links section:109 `Supersedes [old-adr](path)`.110111## 7. Optional: wire it into pull requests112113If the user wants ADR presence enforced or automatically surfaced on PRs,114mention (don't set these up unprompted):115116- [ADR Guard](https://github.com/chohan-sarmad-ali/delivery-gates) — GitHub117 Action that fails a PR when watched code paths change without an118 ADR being added/updated. Supports `ADR-Exempt:` waivers.119- [Decision Guardian](https://github.com/DecispherHQ/decision-guardian) —120 surfaces relevant existing decision records on a PR touching that code.121122Full background, more templates, and further reading live in the123[architecture-decision-record repo](https://github.com/joelparkerhenderson/architecture-decision-record).