ADR reversals: prove architecture choices before they cost you
Architecture decision records are not a trophy shelf. They earn their keep on the day you need to reverse a decision, explain why it existed, and move fast without breaking trust. This post shows how to write ADRs that survive audits, migrations, and real reversals.
Nesqual Tech AI
The only day an ADR pays for itself is the day you undo it
A surprising number of teams treat ADRs like documentation theater: write once, file away, and forget. Then a migration fails, a vendor sunsets a feature, or latency blows past an SLO, and nobody can explain why the system was built that way.
That is the moment an architecture decision record earns its keep. Not when it is approved. Not when it is stored in Git. The value appears when you need to reverse the decision and do it without a week of archaeology, blame, and guesswork.
In 2026, that matters more than ever. Teams are juggling hybrid cloud, platform engineering, AI-assisted delivery, and stricter compliance expectations. The cost of a bad decision is no longer just technical debt; it is delayed releases, audit friction, and expensive rework.
If your ADR cannot help you reverse a decision in under 30 minutes, it is probably not doing its job.
Why most ADRs fail when the pressure starts
Most ADRs fail for one reason: they describe the decision, but not the conditions that would invalidate it. That leaves you with a neat historical note and no operational leverage.
A useful ADR should answer four questions:
- What did we decide?
- Why did we decide it then?
- What tradeoffs did we accept?
- What evidence would make us reverse it?
A real failure pattern: the cache that became a liability
A fintech platform in Europe adopted Redis Cluster for session state and rate limiting. The ADR said the choice reduced database load and supported 20k requests per second with sub-5 ms p95 reads.
Six months later, the team added multi-region active-active traffic. Redis Cluster introduced failover complexity and inconsistent session behavior during partial network partitions. The reversal took 11 days because the original ADR never documented the exit criteria, the fallback design, or the data ownership model.
A better ADR would have said: if we need cross-region writes with RPO under 30 seconds, revisit Redis Cluster and evaluate DynamoDB Global Tables, KeyDB, or stateless session tokens.
What a strong ADR captures
A strong ADR is compact but specific. It should include:
- Context: the constraints that existed at the time
- Decision: what you chose
- Alternatives: what you rejected and why
- Consequences: what gets better and what gets worse
- Reversal triggers: measurable conditions that force a review
That last item is the difference between a note and an instrument.
Write ADRs as if future you is under incident pressure
Your future self will not read a 900-word essay during an outage. They will scan for the decision, the constraints, and the reversal trigger. Keep the format predictable and terse.
A practical ADR template
Use a template that fits in one screen in GitHub or GitLab. This example works well for platform teams and enterprise architecture groups:
# ADR 014: Use Kafka for order event streaming
Date: 2026-03-18
Status: Accepted
Owners: Platform Engineering
## Context
We need durable event delivery for order placement, payment updates, and inventory reservation.
Current peak: 18k events/sec. Target p95 end-to-end latency: < 150 ms.
## Decision
Use Apache Kafka 4.x with 3 brokers per region and MirrorMaker 2 for cross-region replication.
## Alternatives considered
- RabbitMQ: simpler ops, weaker replay semantics at our scale
- SNS/SQS: lower ops burden, higher per-message cost at 250M messages/day
- Pulsar: strong multi-tenancy, higher platform complexity for current team size
## Consequences
- Adds broker operations and partition management
- Enables replay, consumer lag monitoring, and schema evolution
- Requires on-call runbooks for ISR shrink and disk pressure
## Reversal triggers
Revisit if p95 exceeds 150 ms for 3 consecutive weeks, if broker ops consume > 20% of platform on-call time, or if managed event streaming reduces monthly cost by > 25% at equal durability.
That format works because it is decision-oriented, not prose-oriented. It also gives you measurable reversal conditions, which is where the real value lives.
Add evidence, not just opinion
If you can, attach a benchmark, a load test, or a cost model to the ADR. For example:
k6load test: 25k virtual users, 92 ms p95 on the chosen API gateway- Cost estimate: $18,400/month on self-managed Kafka versus $24,900/month on managed streaming at the same throughput
- Reliability data: 99.95% uptime over 90 days, with 14 minutes of total consumer lag during failover
Those numbers make reversal discussions concrete. They also stop debates from drifting into preference wars.
Make reversal criteria explicit and measurable
The best ADRs are written backward from the day you may need to reverse them. If you cannot define the trigger, you are asking future teams to argue from memory.
Good reversal criteria look like this
Use thresholds that a monitoring system or a cost review can verify:
- p95 latency exceeds 120 ms for 21 days
- Monthly infrastructure cost rises above $30k without a corresponding throughput gain
- Operational incidents tied to the component exceed 3 per quarter
- A managed service reaches feature parity and lowers toil by at least 40%
- Compliance rules change and the current design blocks audit evidence collection
Bad reversal criteria look like this
Avoid vague language like:
- if it becomes hard to manage
- if the team dislikes it
- if we think something better exists
- when the market changes
Those phrases do not help during a migration review. They only create room for politics.
Example: Kubernetes ingress decision
A healthcare SaaS team chose an NGINX ingress controller on Kubernetes 1.32 because it supported custom routing, WAF integration, and predictable request handling under burst traffic. Their ADR included a reversal trigger: move to a managed gateway if 95th percentile config rollout time exceeded 10 minutes or if ingress-related incidents exceeded two per month.
Eight months later, the team migrated to a managed gateway after rollout time hit 14 minutes and certificate rotation caused two outages. The ADR made the reversal straightforward because the trigger had already been agreed.
Use ADRs to shorten migration and audit cycles
An ADR is not just for engineers. It also helps security, compliance, finance, and enterprise architecture teams understand why a system looks the way it does.
Faster reversals mean lower change cost
When you reverse a decision, the hidden cost is not just engineering time. It is coordination time.
A team that keeps ADRs current can usually cut reversal planning from 5-10 days to 1-2 days because the following are already documented:
- the original rationale
- the dependencies that will break
- the data that must be migrated
- the owners who must approve the change
That can save 40-60 engineer-hours on a moderate platform change.
ADRs also help with audits and vendor reviews
In regulated environments, auditors often ask why a control or service exists. A crisp ADR can answer that in minutes.
For example, if you chose PostgreSQL 17 with row-level security for tenant isolation, the ADR can document why you rejected schema-per-tenant or separate clusters. That matters when a security reviewer asks whether the current design still fits your risk model.
Architecture diagram for decision tracing
A simple text diagram in the ADR can show the decision boundary:
[API Gateway] -> [Auth Service] -> [Event Bus] -> [Order Service]
| |
| +--> [Analytics Sink]
|
+--> [Policy Engine]
Decision under review: Event Bus = Kafka 4.x
Reversal trigger: managed event bus reduces toil by 40% and preserves replay semantics
That is enough context for a reviewer to understand the blast radius.
Common Pitfalls
The biggest ADR mistakes are boring, which is why they survive so long.
1. Writing the ADR after the implementation is already done
If the decision is already coded, the ADR becomes a justification memo. That is not the same thing. Write it before implementation starts, or at least before irreversible dependencies land.
2. Omitting the alternatives
If you do not record the rejected options, future teams will rediscover the same debate. Include at least two real alternatives and the reason each lost.
3. Using adjectives instead of metrics
Words like simple, scalable, and modern do not age well. Replace them with numbers: throughput, cost, latency, recovery time, and on-call load.
4. Hiding the owner
An ADR without an owner becomes a museum label. Name the accountable team or role, and set a review date if the decision depends on fast-moving constraints.
5. Treating ADRs as immutable
A decision record is historical, but the system is not. If the context changes, add a new ADR that supersedes the old one. Do not edit history to make it look smarter.
A lightweight operating model that actually works
You do not need an architecture committee to make ADRs useful. You need a small habit loop.
The three-step workflow
- Create the ADR in the same pull request as the design change.
- Link the ADR to a benchmark, incident, or cost estimate.
- Review it during quarterly architecture reviews or after any major incident.
Automate the boring parts
Store ADRs in the repo next to the code they affect. Then use CI to enforce a few rules:
- every ADR must have a status
- every accepted ADR must have an owner
- every reversal trigger must include at least one measurable threshold
- every superseded ADR must link to the replacement
# .github/workflows/adr-lint.yml
name: adr-lint
on:
pull_request:
paths:
- "docs/adr/**"
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check ADR fields
run: |
python scripts/validate_adr.py docs/adr/*.md
That kind of automation keeps the standard from decaying after the first quarter.
Make reversals a normal engineering outcome
The goal is not to avoid reversals. The goal is to make reversals safe, explainable, and cheap.
A team that can reverse an architecture decision in 2 days instead of 2 weeks is a team that can move faster without gambling on memory.
Key Takeaways
- Write ADRs around reversal conditions, not just initial approval.
- Include concrete metrics: latency, cost, incident rate, recovery time, or toil.
- Keep the format short enough to scan during an incident.
- Store alternatives and rejection reasons so future teams do not repeat the same debate.
- Add ADR linting in CI to enforce owners, status, and measurable triggers.
- Review ADRs after major incidents, platform shifts, or vendor changes.
The best architecture decision record is not the one that makes the decision look brilliant. It is the one that helps you reverse the decision cleanly when reality changes.
This article was written by an AI system and published pending human review. Verify anything you intend to act on.
Written by
Nesqual Tech AI
Nesqual Tech
Have a project in mind?
Get an instant AI price estimate for it, or talk directly to our team.
One email a month on what we learn building with AI