Architecture Decision Records (ADRs)
Status: Complete
Category: Architecture
Default enforcement: Soft
Author: PushBackLog team
Tags
- Topic: architecture, documentation, process
- Skillset: backend, fullstack, devops
- Technology: generic
- Stage: planning, review
Summary
An Architecture Decision Record (ADR) is a short document that captures a significant architectural decision — the context that prompted it, the options considered, the decision made, and the consequences. ADRs create a durable, searchable record of not just what was decided but why, giving future engineers the context they need to understand constraints before they work around them or ignore them. They are stored in the repository alongside the code they govern.
Rationale
Code tells you what; ADRs tell you why
Source code, comments, and diagrams can describe what a system does. They rarely capture why a particular design was chosen from among alternatives — why this database and not that one, why this pattern and not a simpler one, why this trade-off was acceptable. Over time, the team that made a decision turns over and the reasoning disappears. Decisions that originally had good justification appear arbitrary to newcomers, who may revisit them at significant cost or work around them in ways that undermine the original intent.
ADRs are the lowest-overhead mechanism for preserving architectural reasoning. A one-page document written when the decision is fresh saves hours of reverse-engineering later.
Decisions without ADRs tend to become tribal knowledge
When architectural decisions live in Slack threads, meeting notes, or nowhere at all, that knowledge is accessible only to the people who were present at the time. New team members, contractors, and future engineers inherit the architecture without the context. This leads to systems that accumulate accretion — workarounds layered on decisions nobody understands — rather than systems that evolve deliberately.
Guidance
ADR format
ADRs are intentionally lightweight. The goal is a document that takes 15–30 minutes to write, not a lengthy design specification. The standard Nygard format:
# ADR-0023: Use PostgreSQL as the primary database
**Status**: Accepted
**Date**: 2026-01-14
**Deciders**: Dayle Anderson, Marlene Sanchez, Marcus Okonkwo
## Context
We need a primary relational store for user, subscription, and billing data. We
evaluated PostgreSQL, MySQL, and DynamoDB. Our data model is relational with complex
queries; we need strong consistency and ACID transactions for financial records.
## Decision
Use PostgreSQL 16 managed via AWS RDS. We will not use DynamoDB for the primary store
because the billing and subscription domain has complex relational queries that are
awkward to model in a single-table design without significant over-engineering.
MySQL was not selected because our team has stronger operational experience with
PostgreSQL and the feature gap (JSON support, window functions, CTEs) favours PostgreSQL
for our query patterns.
## Consequences
- Strong consistency and ACID transactions for billing
- RDS managed service reduces operational overhead
- Horizontal write scaling requires additional design work (read replicas for reads only)
- Engineers should avoid MySQL-specific query syntax in migrations
- Review point: if write throughput exceeds 10,000 TPS, evaluate sharding or CQRS
ADR statuses
| Status | Meaning |
|---|---|
| Proposed | Under discussion, not yet accepted |
| Accepted | Decision made and in effect |
| Deprecated | Was accepted; now superseded or no longer recommended |
| Superseded by ADR-NNNN | Replaced by a newer decision |
What warrants an ADR
Write an ADR when the decision:
- Has long-term architectural implications that would be expensive to reverse
- Involves a meaningful trade-off between competing valid options
- Required discussion or research before reaching a conclusion
- Would not be obvious to a future engineer reading the codebase
- Involves external dependencies (libraries, services, protocols) that constrain future choices
Not every decision needs an ADR. Stick to genuinely architectural decisions — database choices, API protocols, authentication strategies, framework selections, deployment architecture, inter-service communication patterns.
Storage and discoverability
/
docs/
adr/
0001-use-postgresql.md
0002-use-event-driven-architecture.md
0003-adopt-trunk-based-development.md
README.md # index of all ADRs with status and one-line summary
Store ADRs in the source repository so they are versioned alongside the code they govern, discoverable via search, and included in code review. Avoid storing them in wikis that are not code-reviewed — they tend to drift from reality.
ADR tooling
adr-tools(command-line) — scaffolds new ADRs and manages numberinglog4brains— generates a browsable ADR site from markdown files- Lightweight option: a script or PR template that creates the next numbered file
Reviewing ADRs in pull requests
A PR that introduces a significant architectural change should link to or include the ADR it implements. Reviewers should assess whether the ADR captures the reasoning accurately, not whether the reasoning is optimal — the discussion happened before the PR.