Architecture reviews
coreadvancedAn architecture review evaluates a proposed system-level design — usually written up as an ADR (Architecture Decision Record: context, decision, consequences) — before any code is written, so a costly structural mistake is caught on paper instead of after months of implementation.
Think of it as
A code review asks "is this diff correct and clear?" An architecture review asks a much bigger question one level up: "is this the right shape for the system, before a single line commits us to it?" It happens on a document (an ADR), not a diff, precisely because the whole point is to be cheap to change — reversing a paragraph is nothing compared to reversing three months of implementation built on the wrong foundation.
What we're doing: Model an architecture review as a list of reviewer concerns against an ADR, where any concern tagged "blocker:" prevents the decision from being approved.
- 11
- Any reviewer can raise a concern — most are discussion, not a veto.
- 14
- A concern prefixed "blocker:" is different in kind: is_blocked() checks specifically for that prefix, not just for any concern existing at all.
ADR-014: 2 concerns, blocked=TrueWhy this works: is_blocked() only trips on the explicit "blocker:" prefix, not on concern count — a design with five minor suggestions and zero blockers is still approvable, while one blocking concern (missing ordering guarantees, here) holds up approval even alone. That distinction is what keeps a review from either rubber-stamping everything or grinding to a halt over every nitpick.
- Context — the problem and forces at play — why a decision is even needed
- Decision — what was chosen, written down before implementation starts
- Consequences — at least one real cost named — "None" means it was not actually reviewed
- blocker: concern — any reviewer can raise one — it alone gates approval, regardless of concern count
Approving a design with no consequences listed
Wrong
Better
What you see: The team discovers the real cost (an operational dependency, an eventual-consistency change client code silently relied on being synchronous) only after it ships and something downstream breaks — nobody road-tested the tradeoff on paper because the ADR claimed there wasn't one.
Why: Every real architectural decision trades something for something — "no downsides" almost always means the downsides were not looked for, not that none exist. A review that accepts a Consequences section reading "None" has not actually reviewed the tradeoff; it has rubber-stamped the Decision section and skipped the part of the ADR that is supposed to prevent exactly this kind of surprise.
Remember: An architecture review happens on an ADR (Context, Decision, Consequences) before implementation, and it is only a real review if it can name at least one real cost and can raise a blocking concern that actually blocks.
See also: code review and readability · service layer

