* feat: add adr-authoring skill Signed-off-by: Magnus Hedemark <magnus919@pm.me> * fix: remove host-specific port assumptions Signed-off-by: Magnus Hedemark <magnus919@pm.me> --------- Signed-off-by: Magnus Hedemark <magnus919@pm.me>
22 KiB
ADR Format & Authoring Guide
Complete catalog of Architecture Decision Record formats from the community ADR repository (https://github.com/architecture-decision-record/architecture-decision-record), with selection guidance by decision type and worked examples.
Template Selection Guide
| Decision Type | Recommended Template | Why |
|---|---|---|
| Routine technology choice (library, framework) | Nygard | Lightweight: Status, Context, Decision, Consequences |
| Multi-option trade-off with explicit comparison | MADR | Decision Drivers + Considered Options with pros/cons |
| High-stakes / regulatory / compliance | Tyree & Akerman | 12 sections covering Issue, Assumptions, Constraints, Positions, Argument, Implications, Related decisions/requirements/artifacts/principles |
| Vendor / procurement / build-vs-buy | Business Case | Evaluation criteria, cost analysis, SWOT, opinions/recommendations |
| QA-contract / SLAs / non-functional requirements | Planguage | Tag, Gist, Priority, Stakeholders, Risks, Defined terms |
| Quick internal consensus, no formal review | Alexandrian | Context-specific, minimal structure |
| C-suite / executive review | ITD (Important Technical Decisions) | Decision-first, optimized for fast executive scanning |
Template Catalog
1. Michael Nygard (Simple & Popular)
Origin: http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions
When to use: Everyday decisions where the rationale is straightforward and options are few. The default choice unless you need more structure.
# Title (present tense imperative verb phrase)
## Status
proposed | accepted | rejected | deprecated | superseded by ADR-NNN
## Context
What is the issue that we're seeing that motivates this decision or change?
## Decision
What is the change we're proposing and/or doing?
## Consequences
What becomes easier or more difficult to do because of this change?
Section guidance:
- Title: Short imperative phrase like "Use PostgreSQL for transaction storage" or "Adopt event-driven messaging between services"
- Status: Single value. Use lifecycle stages for more precision.
- Context: The forces at play — business need, technical constraint, team capability, timeline pressure. Include why this decision is being made now.
- Decision: The outcome. Concrete and unambiguous. "We will use X" not "We considered using X."
- Consequences: Both positive and negative. What trade-offs are being accepted? What follow-up decisions does this create?
Pitfalls:
- Too terse for multi-stakeholder decisions where options need explicit comparison
- No natural place for decision driver documentation
- Temptation to skip "Consequences" when they're the most important section
2. MADR — Markdown Any Decision Records (Structured)
Origin: https://adr.github.io/madr/
When to use: Most decisions that involve multiple options with explicit trade-off comparison. The best default for most engineering teams.
# [short title of solved problem and solution]
* Status: proposed | rejected | accepted | deprecated | superseded by ADR-NNN
* Deciders: [list everyone involved in the decision]
* Date: YYYY-MM-DD
Technical Story: [description | ticket/issue URL]
## Context and Problem Statement
[Describe the context and problem statement. You may want to articulate the
problem in form of a question.]
## Decision Drivers
* [driver 1, e.g., a force, facing concern]
* [driver 2]
* ...
## Considered Options
* [option 1]
* [option 2]
* [option 3]
## Decision Outcome
Chosen option: "[option 1]", because [justification].
### Positive Consequences
* [e.g., improvement of quality attribute satisfaction]
* ...
### Negative Consequences
* [e.g., compromising quality attribute]
* ...
## Pros and Cons of the Options
### [option 1]
* Good, because [argument a]
* Good, because [argument b]
* Bad, because [argument c]
### [option 2]
* Good, because [argument a]
* Bad, because [argument b]
## Links
* Refined by [ADR-0005](0005-example.md)
* Supersedes [ADR-0002](0002-example.md)
Section guidance:
- Decision Drivers: The non-negotiable constraints that any solution must satisfy. These are your selection criteria. If the decision doesn't need explicit criteria, consider using Nygard instead.
- Considered Options: Exhaustive enough that no reviewer asks "Did you think about X?" but not so exhaustive it becomes noise. 3-5 options is typical.
- Pros and Cons: Each option gets its own subsection with bullet-point pros and cons. Be specific — "Good, because reduces latency by 40% under peak load" not "Good, because faster."
- Links: Bidirectional links to related ADRs. Use semantic link types: supersedes, refines, contradicts, extends.
Pitfalls:
- "Considered Options" sections can balloon. Cap at 5 options; group similar alternatives.
- Decision Drivers are often just listed not ranked. Prioritize them (Must-have vs Nice-to-have).
3. Jeff Tyree & Art Akerman (Heavyweight / Enterprise)
Origin: https://www.utdallas.edu/~chung/SA/zz-Impreso-architecture_decisions-tyree-05.pdf
When to use: High-stakes decisions with regulatory, compliance, or cross-team implications. Decisions that will be audited or referenced for years.
| Section | Purpose |
|---|---|
| Issue | The architectural design issue being addressed, with clear rationale for why now |
| Decision | The architecture's direction — the position selected |
| Status | pending, decided, approved |
| Group | Ontology grouping: integration, presentation, data, event, calendar, location |
| Assumptions | Underlying environmental assumptions (cost, schedule, technology, accepted standards) |
| Constraints | Additional constraints the chosen alternative imposes |
| Positions | Viable options considered. Include models, diagrams. This prevents "Did you think about X?" in review |
| Argument | Why you selected the position: implementation cost, TCO, time-to-market, resource availability. As important as the decision itself |
| Implications | Follow-on effects: new required decisions, new/modified requirements, additional constraints, scope/ schedule changes, training needs |
| Related decisions | Traceability matrix, decision trees, or metamodels. Links to related AD decisions |
| Related requirements | Direct mapping to business objectives. If a decision doesn't contribute to a requirement, don't make it |
| Related artifacts | Architecture, design, or scope documents this decision impacts |
| Related principles | Enterprise principles this decision is consistent with. Ensures cross-system alignment |
| Notes | Running notes from the socialization process |
When to skip: Routine choices, single-developer decisions, temporary workarounds.
4. Business Case (Procurement / Vendor)
When to use: Build-vs-buy, vendor selection, technology procurement — decisions where cost and organizational impact are primary drivers.
Top-level structure:
- Title
- Status
- Evaluation criteria
- Candidates to consider
- Research and analysis of each candidate
- Does/doesn't meet criteria
- Cost analysis (licensing, training, operating, metering)
- SWOT analysis (Strengths, Weaknesses, Opportunities, Threats)
- Internal and external opinions/feedback
- Recommendation
Cost analysis dimensions:
- Licensing: contract agreements, legal commitments, vendor lock-in risk
- Training: upskilling, change management, ramp time
- Operating: support, maintenance, incident response
- Metering: bandwidth, CPU, API calls, data egress
Pitfalls:
- External opinions can be biased toward whatever the vendor recommends. Cross-reference.
- Cost estimates age fast — include date stamps on all pricing references.
5. Planguage (QA / NFR Focused)
Origin: Tom Gilb, https://www.iaria.org/conferences2012/filesICCGI12/Tutorial%20Specifying%20Effective%20Non-func.pdf
When to use: Decisions driven by quality attributes, SLAs, or non-functional requirements where precision and measurability matter.
| Keyword | Purpose |
|---|---|
| Tag | Unique, persistent identifier |
| Gist | Brief summary of the requirement or area |
| Requirement | The requirement text |
| Rationale | Reasoning justifying the requirement |
| Priority | Statement of priority and claim on resources |
| Stakeholders | Parties materially affected |
| Status | Draft, reviewed, committed |
| Owner | Person responsible for implementing |
| Author | Person who wrote it |
| Revision | Version number |
| Date | Most recent revision date |
| Assumptions | Things that could cause problems if untrue |
| Risks | Things that could cause malfunction or delay |
| Defined | Glossary terms |
6. Alexandrian Pattern (Context-First)
When to use: Decisions where the context is the main driver and the solution space is tightly constrained.
## [Title]
## Context
[The forces at play — when does this pattern apply?]
## Problem
[The specific problem this decision addresses]
## Solution
[The decision, stated as the resolution of the forces]
## Consequences
[What follows from applying this solution]
7. Important Technical Decisions — ITD (Executive)
Origin: Ignacio Larrañaga
When to use: Decisions that need executive sign-off. Lean and decision-first — optimized for fast scanning, not detailed deliberation.
# [Decision title]
## Decision
[One-line statement of what was decided]
## Why
[Brief rationale — why this decision, why now]
## Impact
[What changes as a result — one paragraph]
8. arc42 ADR Template (Full Documentation Structure)
Origin: https://arc42.org/overview — License: CC-BY-SA 4.0
When to use: Decisions that need to be documented within the full arc42 architecture documentation framework. This is the ADR-specific template by the arc42 team, distinct from the arc42 full documentation template (used by the arc42-context skill for system context/constraint documentation).
Sections:
| arc42 Section | Purpose |
|---|---|
| 1. Introduction & Goals | Requirements, driving forces, quality goals, stakeholders |
| 2. Constraints | Anything constraining design/implementation freedom |
| 3. Context & Scope | System boundary, external interfaces, business/technical context |
| 4. Solution Strategy | Fundamental decisions shaping the architecture |
| 5. Building Block View | Static decomposition — modules, components, layers |
| 6. Runtime View | Behavior via scenarios — use cases, errors, operations |
| 7. Deployment View | Infrastructure, environments, mapping of building blocks |
| 8. Crosscutting Concepts | Patterns, rules, regulations spanning multiple building blocks |
| 9. Architectural Decisions | Important decisions including rationale (this is the ADR proper) |
| 10. Quality Requirements | Quality scenarios, quality tree |
| 11. Risks & Technical Debt | Known risks, debt; ordered by priority |
Relationship to arc42-context skill: Our arc42-context skill uses the full arc42 template for documenting system constraints at the project level. This ADR template is a lightweight version focused on a single decision within that framework. Use this when documenting a decision inside existing arc42 documentation.
9. EdgeX Template (Platform / IoT)
Origin: https://docs.edgexfoundry.org/2.3/design/adr/template/
When to use: Decisions involving platform components, service boundaries, or API changes — especially IoT/edge contexts where multiple services are impacted.
# [Title]
## Submitters
- Name (Organization)
## Change Log
- [Status](URL of PR) YYYY-MM-DD
Status: pending, approved, amended, deprecated.
## Referenced Use Case(s)
- [Use Case Name](URL)
## Context
- How the design is architecturally significant
- High-level design approach
## Proposed Design
Details without implementation:
- Services/modules impacted (changed)
- New services/modules to be added
- Model and DTO impact (additions/removals)
- API impact (additions/removals)
- Configuration impact
- DevOps impact
## Considerations
Alternatives, concerns, issues from debate. Resolution status.
## Decision
Caveats, future considerations, remaining or deferred issues.
Requirements not satisfied by the proposed design.
## Other Related ADRs
- [ADR Title](URL) — Relevance
## References
Distinctive features: Change Log with state/date/PR URL; Referenced Use Case(s); unusually detailed Proposed Design (model/DTO/API/config/devops). Good for when the ADR serves as both decision record AND preliminary design document.
10. Gareth Morgan Template (Summary-Driven)
Origin: Gareth Morgan
When to use: Decisions needing an executive summary first, followed by structured option analysis. Summary → Drivers → Options → Analysis → Recommendation structure mirrors modern product decision-making.
# [Title]
**Status:** Proposed | Under Review | Accepted | Rejected | Superseded | Deprecated
**Updated:** YYYY-MM-DD
## Summary
Executive summary / elevator pitch. 2-4 sentences stating the core problem
and a hint at the decision. Think abstract of a technical paper.
## Drivers
Why this decision is being made now:
- {We are developing a new feature that needs...}
- {We need to improve performance, accessibility...}
- {The current approach imposes limitations...}
## Options
List of options with facts, links:
### {Option 1}
Description
### {Option n}
...
## Options Analysis
### {Option 1 Assessment}
- Pro: {Specific advantage}
- Con: {Specific disadvantage, risk, or cost}
- Other: {Relevant point}
### {Option n Assessment}
...
## Recommendation
Clear statement of the final decision and why it best addresses the Drivers.
### Consequences
- Pro: {Positive outcome}
- Con: {Accepted downside or risk}
- Other: {Matter-of-fact consequence}
### Confirmation
- How implementation will be verified (reviews, tests, demos)
- How compliance will be maintained (automated checks, audits)
- Metrics/indicators showing intended outcomes
- Responsible owner
## More Information
Supplementary info, links, re-evaluation timeframe.
Distinctive features: Summary-first (elevator pitch before detail); explicit Drivers section (why now); Consequences classified as Pro/Con/Other; Confirmation section — a verification plan with compliance monitoring, metrics, and ownership. Rare in ADR templates and essential for high-stakes decisions.
11. GIG Cymru NHS Wales Template (Governance-Focused)
Origin: NHS Wales / GIG Cymru
When to use: Regulated environments (healthcare, finance, infrastructure) where compliance monitoring, governance, and visual options analysis are required.
# [Title]
**Status:** DRAFT | ACTIVE | DEPRECATED by [000] | SUPERSEDES [000]
## Context
Problem(s) this ADR addresses and why they exist.
## Decided Approach
Architecturally significant decision and how it solves the problem.
## Consequences
Impact on architecture characteristics and functional requirements.
## Governance
How will outcomes be monitored? How will compliance be ensured?
## Options Analysis
Trade-off analysis with traffic-light comparison tables.
### Key
Green = good fit Amber = moderate Red = poor fit
+ = positive comment - = negative comment
### High-Level Overview
| Summary | Option 1 | Option 2 | Option 3 |
|---|---|---|---|
| Ease of Implementation | + Quick (green) | - Tricky (amber) | - Complex (red) |
| Timescales | + Fast (green) | - Slow (amber) | - Very slow (red) |
| Strategic Value | - Tactical (red) | + Improves (amber) | + Ideal (green) |
### Functional Requirements
| Scenario | Option 1 | Option 2 | Option 3 |
|---|---|---|---|
| Scenario 1 | | | |
### Non-Functional Requirements
| Characteristic | Option 1 | Option 2 | Option 3 |
|---|---|---|---|
| Scalability | | | |
| Performance | | | |
| Availability | | | |
Distinctive features: Governance section — unique among templates, asks explicitly about compliance monitoring. Traffic-light comparison tables — color-coded visual evaluation across summary, functional, and NFR dimensions. Designed for audited environments where decisions must be enforced, not just recorded.
Template Selection Decision Tree
Is the decision quick, single-rationale?
→ YES → Nygard
→ NO → Multiple options being compared?
→ YES → Regulatory/governance requirement?
→ YES → Compliance monitoring needed?
→ YES → NHS Wales (governance + traffic-light tables)
→ NO → Cost a primary driver?
→ YES → Business Case (cost/SWOT)
→ NO → Platform/service boundary change?
→ YES → EdgeX (Change Log + Proposed Design)
→ NO → MADR (structured option comparison)
→ NO → MADR (default for multi-option)
→ NO → QA/NFR-driven? → Planguage
→ NO → C-suite consumption? → ITD
→ NO → Context-first? → Alexandrian
Examples Reference
The community ADR repository includes ~50+ worked examples across multiple domains for learning and inspiration:
| Domain | Example Topics |
|---|---|
| Frameworks | CSS framework, React, Svelte, Vue, Rails, SvelteKit, Tailwind CSS |
| Databases | MySQL, PostgreSQL, Database technology choice |
| Languages | Go, Rust, Java, Python |
| Infrastructure | Docker Swarm, Kubernetes, AWS, GCP, Azure, CI, Secrets storage |
| APIs & Protocols | JSON vs gRPC, snake_case vs camelCase, Timestamp format |
| Team & Process | 4-day work week, Agile, High-trust teamwork, Work from home |
| Cross-cutting | Monorepo vs multirepo, Environment variable config, Metrics |
Browse the full collection at: https://github.com/architecture-decision-record/architecture-decision-record/tree/main/locales/en/examples/
Study 2-3 examples from your domain before writing a first ADR to internalize the conventions.
Worked Example: MADR Format
# Use PostgreSQL for Service Transaction Storage
* Status: accepted
* Deciders: Magnus Hedemark, Sarah Chen, DevOps Team
* Date: 2026-06-05
Technical Story: Service requires durable, ACID-compliant storage for
customer transaction records across geographic regions.
## Context and Problem Statement
The service needs to store customer transaction data with strong consistency
guarantees. The current prototype uses in-memory storage which is unacceptable
for production. We need a database that supports ACID transactions, replication
across regions, and has a proven operational track record.
## Decision Drivers
* Must support ACID transactions (non-negotiable — regulatory requirement)
* Must support active-passive replication across 2 regions
* Team has existing PostgreSQL expertise (3 senior DBAs)
* Must fit within existing $500/mo infrastructure budget
## Considered Options
* PostgreSQL — relational, ACID, mature replication (pglogical / Patroni)
* MySQL — relational, ACID, Group Replication
* CockroachDB — distributed SQL, natively multi-region
* DynamoDB + transactions — managed NoSQL with limited ACID
## Decision Outcome
Chosen option: "PostgreSQL", because it satisfies all decision drivers,
eliminates team learning curve, and has the lowest operational cost for our
scale.
### Positive Consequences
* ACID compliance guaranteed within existing team expertise
* Active-passive replication via Patroni (deploy this week)
* No licensing costs; fits within infrastructure budget
### Negative Consequences
* Manual sharding may be needed above 5TB (unlikely in year 1)
* Single-writer limitation in active-passive mode
## Pros and Cons of the Options
### PostgreSQL
* Good, because full ACID with serializable isolation
* Good, because existing team expertise eliminates ramp time
* Good, because mature replication tooling (Patroni, repmgr)
* Bad, because single-writer topology limits write throughput
### MySQL
* Good, because ACID with InnoDB
* Good, because Group Replication supports multi-writer
* Bad, because less team expertise (1 DBA vs 3 for Postgres)
* Bad, because Group Replication has known stability issues in async mode
### CockroachDB
* Good, because natively multi-region with strong consistency
* Bad, because 2x infrastructure cost for equivalent hardware
* Bad, because operational complexity requires dedicated SRE support
### DynamoDB + Transactions
* Good, because zero operations overhead
* Bad, because transaction API has 25-item / 4MB limits
* Bad, because vendor lock-in to AWS
* Bad, because $0.50/hr per replica is over budget at scale
## Links
* Refined by [ADR-0010](0010-patroni-cluster-configuration.md)
* Supersedes [ADR-0003](0003-in-memory-storage-poc.md)
Architecture Decision Log (ADL) Conventions
File Naming
NNN-short-present-tense-phrase.md
Rules:
- Number: Zero-padded sequence (001, 002, ... 010). Avoid gaps; renumber on conflict.
- Phrase: Present tense imperative verb phrase — like a good commit message.
- Good:
012-use-postgresql-for-transaction-storage.md - Bad:
012-postgresql.md(no verb),012-decided-to-use-postgresql.md(past tense)
- Good:
- Case: Lowercase with hyphens (kebab-case).
- Extension:
.mdfor easy rendering.
Directory Naming
Consider naming the directory decisions/ instead of adr/ — some teams respond better to plain language. The template is content-neutral; you can document vendor decisions, planning decisions, and scheduling decisions in the same format.
Numbering Scheme
- Sequential across the entire project (not per-category)
- Never reuse a number — if an ADR is rejected, leave the number retired
- Consider prefix for multi-project orgs:
PLAT-012-use-postgresql.md