Try free
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

BenefitDescription
Historical contextKnow why decisions were made
OnboardingNew members understand system
RevisitingKnow when to reconsider
AlignmentTeam 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

  1. Record the why — Reasoning matters
  2. Write when deciding — Not after forgotten
  3. Keep brief — 1-2 pages max
  4. Include alternatives — Show what was considered
  5. 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)