Architecture Decision Records (ADR) Framework
What are ADRs?
Architecture Decision Records (ADRs) are short documents that capture important architecture decisions along with their context and consequences. They create a historical record of why decisions were made.
Why Use ADRs?
Benefits
- Knowledge Preservation: Decisions outlive the people who made them
- Onboarding: New team members understand the “why” behind the architecture
- Prevent Rework: Avoid revisiting already-settled decisions
- Accountability: Clear record of who decided what and why
- Learning: Reflect on past decisions and improve future ones
When to Create an ADR
Create an ADR for decisions that:
- Are architecturally significant
- Affect multiple teams or systems
- Are difficult or expensive to reverse
- Involve trade-offs between competing concerns
- Set precedents for future decisions
- Are contentious or require consensus
When NOT to Create an ADR
Don’t create ADRs for:
- Trivial or easily reversible decisions
- Implementation details within a single component
- Obvious or universally accepted choices
- Temporary workarounds
ADR Format
We use the Markdown Architectural Decision Records (MADR) format.
Template
# [Short title of solved problem and solution]
- **Status**: [proposed | accepted | rejected | deprecated | superseded by ADR-XXXX]
- **Date**: YYYY-MM-DD
- **Decision Makers**: [List of people involved]
- **Technical Story**: [Optional: Link to ticket/epic]
## Context and Problem Statement
[Describe the context and problem statement in free form.
What is the issue we're trying to solve? What factors are influencing this decision?]
## Decision Drivers
- [Driver 1: e.g., performance requirements]
- [Driver 2: e.g., team expertise]
- [Driver 3: e.g., cost constraints]
## Considered Options
- [Option 1]
- [Option 2]
- [Option 3]
## Decision Outcome
**Chosen option**: "[Option X]"
### Rationale
[Explanation of why this option was chosen]
### Positive Consequences
- [Positive consequence 1]
- [Positive consequence 2]
### Negative Consequences
- [Negative consequence 1]
- [Negative consequence 2]
## Pros and Cons of the Options
### [Option 1]
[Short description]
**Pros**:
- [Pro 1]
- [Pro 2]
**Cons**:
- [Con 1]
- [Con 2]
### [Option 2]
[Repeat for each option...]
## Links
- [Link to related ADRs]
- [Link to documentation]
- [Link to RFC, if applicable]
ADR Lifecycle
1. Proposed
- Initial draft created
- Under discussion and review
- May be revised based on feedback
2. Accepted
- Decision has been made
- Approved by appropriate stakeholders
- Ready to implement
3. Rejected
- Option was considered but not chosen
- Document kept for historical reference
- Explains why it was rejected
4. Deprecated
- Decision is no longer valid
- Superseded by new context or requirements
- Points to new ADR if applicable
5. Superseded
- Replaced by a newer ADR
- Links to the new ADR
- Kept for historical reference
Numbering Convention
ADRs are numbered sequentially:
ADR-0001-use-kubernetes-for-orchestration.mdADR-0002-adopt-event-driven-architecture.mdADR-0003-select-postgresql-as-primary-database.md
Storage and Organization
Repository Structure
/docs/decisions/
├── README.md (index of all ADRs)
├── ADR-0001-example-decision.md
├── ADR-0002-another-decision.md
└── templates/
└── adr-template.md
Version Control
- Store ADRs in the same repository as code (when project-specific)
- Store in architecture repository (when enterprise-wide)
- Use pull requests for review process
- Never delete ADRs, only deprecate them
Review Process
1. Draft Creation
- Author creates ADR from template
- Fills in context, options, and initial recommendation
- Marks status as “proposed”
2. Peer Review
- Share with relevant architects and stakeholders
- Gather feedback through PR comments
- Refine based on input
3. Approval
- Present to Architecture Review Board if required
- Update with final decision
- Mark as “accepted”
- Merge to main branch
4. Communication
- Announce decision to affected teams
- Link from project documentation
- Update architecture diagrams
Writing Good ADRs
Do’s ✅
Be Clear and Concise
- Use simple language
- Avoid jargon where possible
- Be specific, not vague
Provide Context
- Explain the problem thoroughly
- List all constraints and requirements
- Describe the current situation
Compare Options Objectively
- Present all viable alternatives
- Be fair in pros/cons
- Use data when available
Document Consequences
- Both positive and negative
- Short-term and long-term impact
- Dependencies and risks
Update as Needed
- Mark status changes
- Link to superseding ADRs
- Add lessons learned
Don’ts ❌
Don’t Be Vague
- ❌ “We chose X because it’s better”
- ✅ “We chose X because it provides 50% better throughput based on our benchmarks”
Don’t Skip Options
- ❌ Only document the chosen option
- ✅ Document all options considered
Don’t Make It Too Long
- ❌ 10 pages of detailed analysis
- ✅ 1-2 pages hitting key points
Don’t Hide Trade-offs
- ❌ Only list positives
- ✅ Be honest about downsides
Don’t Forget to Update Status
- ❌ Leave as “proposed” forever
- ✅ Update to “accepted” or “rejected”
Example ADRs
Example 1: Technology Selection
# Use PostgreSQL for Primary Database
- **Status**: accepted
- **Date**: 2025-01-15
- **Decision Makers**: John Doe (Lead Architect), Jane Smith (DBA)
- **Technical Story**: ARCH-123
## Context and Problem Statement
Our new customer management system requires a robust, scalable database.
We need ACID compliance, complex query support, and JSON capabilities.
## Decision Drivers
- ACID compliance required for financial data
- Need for complex relational queries
- JSON support for flexible schemas
- Team has PostgreSQL expertise
- Budget constraints favor open source
- Must support 100K+ transactions per second
## Considered Options
- PostgreSQL
- MySQL
- MongoDB
- Amazon Aurora PostgreSQL
## Decision Outcome
**Chosen option**: "PostgreSQL 15 on Amazon RDS"
### Rationale
PostgreSQL provides the best balance of features, performance, and cost.
The team has deep expertise, and RDS provides managed infrastructure.
### Positive Consequences
- Strong ACID compliance
- Excellent JSON support via JSONB
- Mature ecosystem and tooling
- Team expertise reduces risk
- Open source with no licensing costs
### Negative Consequences
- Need to manage scaling strategy
- RDS costs can grow with data volume
- Migration from legacy Oracle DB required
## Pros and Cons of the Options
### PostgreSQL
**Pros**:
- ACID compliant
- Advanced indexing (B-tree, GIN, GIST)
- JSONB support
- Strong community
- Team expertise
**Cons**:
- Horizontal scaling requires sharding
- Write scaling limitations
### MySQL
**Pros**:
- Good performance
- Wide adoption
- Multiple storage engines
**Cons**:
- Limited JSON support
- Less feature-rich than PostgreSQL
- Team less familiar
### MongoDB
**Pros**:
- Flexible schema
- Easy horizontal scaling
- Native JSON
**Cons**:
- No ACID across documents (pre-4.0)
- Not ideal for complex joins
- Different mental model from SQL
### Amazon Aurora PostgreSQL
**Pros**:
- PostgreSQL compatible
- Better write scaling
- Automated backups
**Cons**:
- Vendor lock-in
- Higher cost
- Some feature lag behind PostgreSQL
## Links
- [Database Comparison Analysis](../analysis/db-comparison.md)
- [Performance Benchmarks](../analysis/db-benchmarks.md)
- [Migration Plan](../implementation/db-migration-plan.md)
Example 2: Architectural Pattern
# Adopt Event-Driven Architecture for Order Processing
- **Status**: accepted
- **Date**: 2025-02-01
- **Decision Makers**: Architecture Review Board
- **Technical Story**: ARCH-456
## Context and Problem Statement
Our order processing system is tightly coupled, making it difficult to scale
individual components. We experience bottlenecks during peak loads, and
adding new features requires changes across multiple services.
## Decision Drivers
- Need to scale order processing independently
- Reduce coupling between services
- Enable async processing for long-running tasks
- Support audit trail and event sourcing
- Improve system resilience
- Enable easier addition of new features
## Considered Options
- Event-Driven Architecture with message broker
- Synchronous REST API calls
- Batch processing
- Hybrid approach (events + synchronous)
## Decision Outcome
**Chosen option**: "Event-Driven Architecture with AWS EventBridge and SQS"
### Rationale
Event-driven architecture provides the loose coupling, scalability, and
flexibility we need. EventBridge offers built-in routing and filtering,
while SQS provides reliable queue processing.
### Positive Consequences
- Services can scale independently
- Loose coupling enables team autonomy
- Built-in retry and error handling
- Easy to add new event consumers
- Complete audit trail of all events
- Improved resilience (async processing)
### Negative Consequences
- Increased complexity in debugging
- Eventual consistency to manage
- Need for event schema management
- Monitoring and observability more complex
- Learning curve for team
## Pros and Cons of the Options
### Event-Driven Architecture
**Pros**:
- Loose coupling
- Independent scaling
- Resilience
- Flexibility
- Audit trail
**Cons**:
- Complexity
- Eventual consistency
- Debugging harder
- Schema management
### Synchronous REST
**Pros**:
- Simpler to understand
- Immediate consistency
- Easier debugging
**Cons**:
- Tight coupling
- Scaling bottlenecks
- Cascading failures
- Synchronous dependencies
### Batch Processing
**Pros**:
- Simple model
- Efficient for bulk operations
**Cons**:
- High latency
- Not real-time
- Doesn't solve coupling
## Links
- [Event-Driven Architecture Pattern](../patterns/event-driven.md)
- [EventBridge Architecture](../designs/eventbridge-setup.md)
- Supersedes: [ADR-0010-synchronous-microservices.md](ADR-0010-synchronous-microservices.md)
Tools
ADR Tools
- adr-tools - Command-line tool for ADRs
- log4brains - ADR management with UI
- ADR Manager - Web-based ADR browser
Templates
Resources
Further Reading
- Documenting Architecture Decisions - Michael Nygard
- ADR GitHub Organization
- Markdown ADR (MADR)
- Architecture Decision Records Guide
Internal Resources
| Back to Frameworks | Home |