Prodigent

ADRs and Decision Logs: Why They Go Stale, and What to Do About It

What an ADR is, a template you can copy, and an honest look at why your team's decision log stopped getting updated after the first sprint.

Every codebase is full of decisions that made perfect sense at the time. Then the person who made them moves teams, and the next engineer finds a strange lock around the billing job, assumes it's leftover junk and deletes it. ADRs exist to stop that from happening. They mostly don't, for reasons we'll get to, but the idea is sound.

What is an architecture decision record?

An architecture decision record, or ADR, is a short note about one technical decision and why your team made it. It's not a design doc or a spec. It's closer to a receipt: here's what we chose, and here's what it cost us.

The format was popularised by Michael Nygard in a 2011 post called Documenting Architecture Decisions, and most templates you'll find today are variations on his. They're usually kept as numbered markdown files in the repo, in a folder like docs/adr, so they live next to the code they explain.

A decision log is the collection of those records, or sometimes a simpler list of decisions with a line or two each. Same idea, less ceremony. Code tells you what the system does and git blame tells you who to ask. The decision log is meant to tell you why, so you don't have to ask anyone at all.

A copyable ADR template

This is Nygard's format with a few additions that pay off later, mainly the alternatives and links back to where the decision actually happened. Save it as docs/adr/0001-short-title.md and fill it in. If a section would be empty, delete it rather than writing N/A with great solemnity.

docs/adr/0001-short-title.md
# 0001. Short title of the decision

Date: YYYY-MM-DD
Status: Proposed | Accepted | Superseded by 00XX
Deciders: who made the call

## Context
What problem are we solving, and why does it need a decision now?
Constraints, deadlines, incidents, anything that rules options out.

## Decision
What we're going to do, in one or two plain sentences.

## Alternatives considered
- Option A: why we didn't pick it
- Option B: why we didn't pick it

## Consequences
What gets easier, what gets harder, and what trade-off we're accepting.

## Revisit if
The signal that would tell us this decision is now wrong.

## Links
The PR, issue, Slack thread, postmortem or benchmark behind it.

A short example

Here's what a filled-in one looks like. Note how little there is.

docs/adr/0014-billing-job-advisory-lock.md
# 0014. Use a Postgres advisory lock for the nightly billing job

Date: 2026-03-04
Status: Accepted
Deciders: Billing team

## Context
A deploy overlapped with the cron window and the nightly billing job
ran on both app servers at once. Some customers were charged twice.
We need exactly one copy of the job running at a time.

## Decision
The job takes a Postgres advisory lock before it starts, and exits
quietly if another process already holds it.

## Alternatives considered
- Redis lock: we'd be adding Redis to the stack for one job.
- Only run cron on one server: breaks the day that server is replaced.

## Consequences
No new infrastructure. The lock lives with the database connection,
so a hung job keeps it until the connection dies. That's fine for
something that runs once a day.

## Revisit if
Billing moves off Postgres, or the job needs to run in parallel.

## Links
Postmortem: double billing on 2 March. PR #482.

Nobody is going to frame it. But in a year, when someone looks at that lock and thinks they can simplify it, this is the file that stops them from double billing your customers again.

ADR, decision log or design doc?

Which one you actually need
FormatWhat it isUse it when
ADROne decision, its context and its trade-offsSomeone is going to ask why later, and you won't be around to answer
Decision logThe index of decisions, often a folder of ADRs or a running listYou want one place to check what's already been decided
Design docA proposal for how to build something, written before the workThe change is big enough to need discussion first. It often produces a few ADRs

Why most teams stop writing them after a sprint or two

Here's the honest part. Plenty of teams adopt ADRs with real enthusiasm, write a flurry of them in the first couple of weeks and feel very organised. Then the flurry stops. Ask around and you'll hear some version of the same story: the decision log was great for the first sprint and nobody has touched it since.

Where it goes wrong

  1. 1

    Writing it is a separate job

    The decision happens in a PR comment or a Slack thread. The ADR is homework you're meant to do afterwards, and homework loses to shipping pretty much every time.

  2. 2

    The moment passes

    By the time anyone remembers to write it up, the context is fuzzy and the person who made the call is on leave. So it gets put off again, and then it's too late to bother.

  3. 3

    Nobody reads them

    If the ADR folder never comes up during review or design, it's write-only storage. People stop writing things nobody reads, which is honestly quite rational of them.

  4. 4

    The process grows

    Someone adds an approval step, then a template with eleven sections. Now writing the ADR takes longer than making the decision, so people just make the decision.

  5. 5

    Old records never get updated

    The code moves on but the ADR still says Accepted. After one bad experience with an out-of-date record, people stop trusting the whole folder. Stale context is worse than none, because it looks authoritative.

None of this is really about discipline. The log sits next to the work instead of inside it, so it relies on someone remembering to go and update it. Anything that relies on someone remembering is on borrowed time.

How to keep a decision log alive

Habits that actually stick

  1. 1

    Record it at the moment of decision

    Write it when the thread converges or the PR gets approved, not at the end of the sprint. A rough record written now beats a polished one that never happens.

  2. 2

    Keep it short

    Aim for something you can write in ten minutes. The template above is a ceiling, not a target. A context and a decision on their own are still far better than nothing.

  3. 3

    Ship it with the PR

    Add the ADR in the same PR as the change it explains, or link it from the PR description. Reviewers see it while they're looking at the code, which is the one moment someone is guaranteed to be paying attention.

  4. 4

    Link every decision back to its source

    Point to the PR thread or postmortem that drove it. When someone doubts the record later, they can check the original conversation instead of taking the ADR's word for it.

  5. 5

    Supersede, don't delete

    When a decision changes, write a new record and mark the old one as superseded by it. Why you changed your mind is often more useful than what you originally decided.

  6. 6

    Bring them up in review

    If a change goes against an accepted ADR, say so in the review. Either the code is wrong or the ADR is out of date, and you want to know which.

Your team never writes docs, and Prodigent still knows why

Prodigent picks up decisions from your PRs and Slack threads as they happen, then shows them to whoever is reviewing a change that goes against one. A person still makes the call. Keep writing ADRs if you like, it just matters a lot less when someone forgets.

Try Prodigent free

Request a demo

Tell us a little about your team and we will set up a walkthrough.