← Back to articles

March 21, 2026

7 min read

ADRs That Keep Systems Sane

How to document technical decisions with context, tradeoffs, and consequences without writing an endless wiki.

Leer en espanol

ADRs are not general documentation

An ADR is useful when the team needs to remember why it chose a technical direction and what costs it accepted in return. It does not replace a README, onboarding notes, or API documentation. Its job is to capture an architectural decision before it turns into folklore.

Months later, when someone asks “why are we still using async jobs for this workflow?” or “why did we separate billing from identity?”, a good ADR prevents the team from reopening the entire discussion from scratch.

What a useful ADR should contain

The best ADRs are short and specific. They describe context, decision, alternatives considered, and consequences. That is enough for another engineer to understand the original problem and judge whether the decision still holds.

An ADR fails when it tries to document the whole system or declares a solution without explaining the pain it was addressing. Without context, the decision looks arbitrary. Without consequences, it looks free.

Minimal structure for an ADR that actually helps.

# ADR-007: Use application services for publish workflows

## Status
Accepted

## Context
Publish flows currently split rules across route handlers and UI actions.

## Decision
Move publish orchestration into application services behind explicit ports.

## Consequences
Improves testability and consistency, but adds one extra composition layer.

When to write one

Not every change deserves an ADR. A small library swap or a local refactor usually does not need one. But once a decision affects structure, important dependencies, module boundaries, persistence, external integration, or operational behavior, writing it down becomes worthwhile.

A simple rule works well here: if another engineer is likely to question the decision in three months, or reversing it later would be expensive, capture it now.

  • Write ADRs for durable decisions.
  • Link them to the PR or code that implements the choice.
  • Supersede them with a new ADR when the decision changes.

ADRs as a speed tool

Used well, ADRs increase velocity. They reduce repeated debates, make tradeoffs visible, and keep code from being the only source of truth for structural decisions. They also improve onboarding because new people can tell what is intentional and what is merely inherited debt.

The goal is not to produce more writing. The goal is to give the system memory so that evolution does not mean rediscovering the same argument every quarter.

More articles

Back to articles