How do you record and govern architecturally significant decisions so they remain useful and revisitable years later?
answer
- ADR: context, decision, consequences
- immutable, numbered, superseded
- record what was sacrificed
- assumptions + revisit trigger
- advice process, fitness functions
basics
~20 sWrite a short record for each significant decision: the context, the options, the choice, and the consequences. Keep records immutable, append new ones that supersede old ones, store them beside the code, and note the assumptions that would trigger a revisit.
solid answer
~50 sUse Architecture Decision Records: one short, numbered, immutable document per decision, versioned with the code, with a status (proposed, accepted, superseded). The valuable sections are context (forces, prioritised quality scenarios, constraints), the options rejected and why, the decision, and the consequences including which quality attribute was sacrificed. Add the assumptions and the observable signal that would invalidate them — that is what makes a record revisitable rather than archaeological. Governance is mostly about which decisions need which forum: an architecture advice process (whoever decides must seek advice from those affected and from experts, but keeps the decision) scales far better than a central approval board, provided decisions are recorded and visible. Pair records with automated enforcement — fitness functions such as dependency rules, latency budgets and contract tests — so constraints are checked continuously instead of relying on memory. Supersede rather than edit, so the reasoning history survives.
code
markdown · 24 lines# ADR-0031: Optimistic concurrency for order updates
Status: Accepted (supersedes ADR-0012)
## Context
Scenario A (high): concurrent edits from web and mobile must not lose updates.
Scenario B (high): p99 order update < 200 ms at peak load.
Pessimistic locking met A but measured 340 ms p99 in the spike.
## Decision
We will use a version column and reject stale writes with a conflict error.
## Options rejected
- Pessimistic row locks: fails Scenario B at peak.
- Last-write-wins: silently loses updates; violates Scenario A.
## Consequences
+ Meets both scenarios; no lock contention.
- Clients must handle conflict and retry; more client complexity.
- Sacrificed: simplicity of the client contract.
## Assumptions / revisit trigger
Conflict rate stays below 1% of updates. Revisit if it exceeds that,
or if a batch-editing feature is introduced.go deeper
Describe a decision record's four core sections — context, decision, options, consequences — and that it lives with the code.
Add status and superseding, explain which decisions merit a record, and stress that consequences must state what got worse, not only what got better.
Cover assumptions and revisit triggers, linking records to prioritised quality scenarios, and enforcing constraints with fitness functions such as dependency rules, contract tests and performance budgets.
Discuss the governance operating model — advice process versus board versus guild — how to keep the significant set small, how decisions flow across many teams, and how to detect assumption expiry at portfolio scale.
## Why record at all The expensive loss is not the decision, it is the **reasoning**. Two years later a team meets a strange constraint, cannot find why it exists, and either cargo-cults it forever or removes it and reintroduces the original problem. Recording rationale is what makes an architecture revisitable instead of archaeological. ## Architecture Decision Records (ADRs) Popularised by Michael Nygard, an ADR is a short document, numbered sequentially, stored in the repository so it versions with the code: - **Title** — short and decision-shaped ("Use optimistic concurrency for order updates"). - **Status** — proposed / accepted / deprecated / superseded by ADR-0042. - **Context** — the forces: prioritised quality scenarios, constraints, current state, deadline pressure. This section ages best. - **Decision** — stated in active voice: "We will ...". - **Options considered and rejected**, each with why. A record with one option is a rationalisation. - **Consequences** — both directions: what becomes easier, what becomes harder, and explicitly **which quality attribute was sacrificed**. - **Assumptions and revisit triggers** — "valid while write volume stays below X", "revisit if we add a second region." Without this, nobody knows when the decision expired. **Immutability matters.** You do not edit an accepted ADR; you write a new one that supersedes it. The chain of superseded records is the architecture's reasoning history. ## Which decisions get a record Exactly the significant ones — the same filter as everywhere else: expensive to reverse, broad impact, quality-attribute sensitive. Recording everything produces an unread archive; recording nothing produces folklore. A practical trigger set: anything that changes a module boundary, a stored data shape, an external contract, a cross-cutting mechanism (auth, tenancy, error semantics), or the runtime topology. ## Governance models - **Central approval board**: consistent, but becomes a queue, distances deciders from consequences, and gets routed around under delivery pressure. - **Architecture advice process** (Andrew Harmel-Law): anyone may make a decision, but must first seek advice from everyone meaningfully affected and from people with relevant expertise; the decider keeps the decision and must record it. This scales with the organisation, keeps decisions near context, and preserves the knowledge flow a board would provide — but it depends absolutely on records being written and visible. - **Architecture guild / review forum**: periodic, opt-in discussion of the significant queue — useful for cross-team coherence without becoming a gate. ## Making records enforceable Documents drift from reality. Pair each durable constraint with an automated **fitness function**: - module and dependency rules that fail the build on a forbidden import - contract tests that fail when a published schema breaks compatibility - performance budgets asserted in CI or in load tests - chaos or failover exercises verifying an availability claim - policy and configuration checks for security rules The record states the intent and the reasoning; the fitness function keeps it true. ## Common failures - **Write-only archive**: records exist but nothing references them. Fix by linking from code and design docs, and by citing the relevant record in review discussions. - **Decision without consequences**: the most useful half is missing; nobody learns what it cost. - **Editing history**: mutating old records erases why the previous answer was reasonable, which is exactly what a future reader needs. - **No expiry thinking**: assumptions silently lapse (traffic 10x, a second region, a new regulation) and a once-sound non-risk becomes a risk with no trigger to notice. - **Gate theatre**: heavy approval for everything, so teams stop bringing decisions forward and significant choices are made invisibly.
- What is the architecture advice process and why does it scale better than an approval board?Anyone may take an architecturally significant decision provided they first seek advice from everyone materially affected and from people with relevant expertise, then record the decision. The decider keeps authority, so there is no approval queue and decisions stay close to context, while advice-seeking preserves the cross-organisation knowledge flow a board would provide. It depends on records being written and discoverable.
- How do you stop recorded decisions from silently going stale?Record the assumptions and an explicit revisit trigger, instrument the measures behind them, and encode durable constraints as automated fitness functions so violations fail the build or raise an alert. Periodically review the top decisions against current business goals and supersede rather than edit.
saying these in an interview costs you the question
- Recording only the decision, omitting rejected options and consequences
- Editing accepted records in place instead of superseding them, destroying the reasoning history
- Documenting every decision, producing an archive nobody reads
- Relying on documents alone with no automated enforcement of the constraints they describe
- Running a central approval board as the only governance mechanism and assuming compliance
- Omitting assumptions, so nobody can tell when a decision has expired