5 min read • Guide 432 of 877
Technical Decision Records
Technical decisions shape systems for years. Good decision records explain the why, not just the what. Poor documentation means repeating mistakes and confusion about design choices. This guide covers effective decision documentation.
ADR Benefits
| Benefit | Description |
|---|---|
| Historical context | Know why decisions were made |
| Onboarding | New members understand system |
| Revisiting | Know when to reconsider |
| Alignment | Team understands direction |
ADR Format
Standard Template
ADR TEMPLATE
════════════
# ADR-001: [Title of Decision]
## Status
[Proposed | Accepted | Deprecated | Superseded by ADR-XXX]
## Context
[What is the issue? Why are we making this decision?
Background, constraints, requirements.]
## Decision
[What have we decided? Be specific.]
## Consequences
### Positive
[What are the benefits?]
### Negative
[What are the trade-offs or risks?]
### Neutral
[What other effects does this have?]
## Alternatives Considered
[What other options did we evaluate?
Why didn't we choose them?]
## Related
[Links to related ADRs, issues, or docs]
Example ADR
# ADR-003: Use PostgreSQL for Primary Database
## Status
Accepted (2024-01-15)
## Context
We need a primary database for our SaaS application.
Requirements:
- ACID transactions for financial data
- JSON support for flexible schemas
- Good ecosystem and tooling
- Managed service options
## Decision
We will use PostgreSQL as our primary database.
## Consequences
### Positive
- Mature, reliable database
- Strong JSON/JSONB support
- Excellent tooling ecosystem
- Available as managed service (RDS, Cloud SQL)
- Team has PostgreSQL experience
### Negative
- More complex than SQLite for local dev
- Scaling writes requires more planning
- Need to manage connection pooling
### Neutral
- Will use migrations for schema changes
- Need monitoring for performance
## Alternatives Considered
- **MySQL**: Similar capability, less JSON support
- **MongoDB**: Flexible schema, but team less experienced
- **SQLite**: Too simple for production needs
- **CockroachDB**: Overkill for current scale
## Related
- ADR-004: Database Migration Strategy
- Infrastructure setup guide
When to Write ADRs
Decision Criteria
WHEN TO WRITE ADR
═════════════════
WRITE ADR WHEN:
─────────────────────────────────────
├── Choosing technology/framework
├── Architectural pattern decision
├── Significant trade-offs
├── Cross-cutting concerns
├── Reversing is expensive
├── Team debated options
├── Future you will ask "why?"
└── Significant decisions
EXAMPLES:
─────────────────────────────────────
├── Database selection
├── API design approach (REST vs GraphQL)
├── Authentication strategy
├── Deployment platform
├── State management approach
├── Testing strategy
├── Monitoring/observability
└── Major choices
DON'T WRITE ADR FOR:
─────────────────────────────────────
├── Trivial choices
├── Implementation details
├── Easily reversed decisions
├── Standard practices
├── Things that don't need explanation
└── Over-documenting wastes time
Managing ADRs
Lifecycle
ADR LIFECYCLE
═════════════
STATUSES:
─────────────────────────────────────
Proposed:
├── Under discussion
├── Not yet decided
├── Open for feedback
└── Work in progress
Accepted:
├── Decision made
├── Team aligned
├── Being implemented
└── Active decision
Deprecated:
├── No longer applicable
├── Technology changed
├── Better approach found
├── Keep for history
└── Historical record
Superseded:
├── Replaced by new ADR
├── Link to replacement
├── Old context still useful
└── Evolution visible
STORAGE:
─────────────────────────────────────
Options:
├── /docs/adrs/ in repo
├── Wiki/NoteVault
├── Dedicated tool
├── Near the code affected
└── Accessible location
NAMING:
─────────────────────────────────────
├── ADR-001-database-selection.md
├── ADR-002-api-versioning.md
├── Sequential numbering
├── Descriptive names
├── Easy to find
└── Organized
GitScrum Integration
ADRs in GitScrum
GITSCRUM FOR ADRs
═════════════════
NOTEVAULT:
─────────────────────────────────────
├── ADR section
├── Organized by topic
├── Searchable
├── Team access
├── Living documentation
└── Central repository
LINKING:
─────────────────────────────────────
├── Reference ADRs in tasks
├── Implementation work links to ADR
├── Context always available
├── Traceability
└── Connected decisions
DISCUSSION:
─────────────────────────────────────
├── Create task for ADR discussion
├── Team reviews proposed ADR
├── Comments and feedback
├── Decision tracked
└── Collaborative process
ONBOARDING:
─────────────────────────────────────
├── "Read the ADRs" in onboarding
├── Understand system design
├── Know the why
├── Faster ramp-up
└── Knowledge transfer
Best Practices
For Technical Decision Records
- Record the why — Reasoning matters
- Write when deciding — Not after forgotten
- Keep brief — 1-2 pages max
- Include alternatives — Show what was considered
- Update status — Mark deprecated/superseded
Anti-Patterns
ADR MISTAKES:
✗ Not documenting decisions
✗ Too verbose (novels)
✗ Only recording "what"
✗ Never updating status
✗ Decisions only verbal
✗ Hidden in email threads
✗ No alternatives listed
✗ Writing retroactively (inaccurate)