architecture-decision-records · git:20260606.4f8d3f3 · 2026-06-06 · sha256 7c9bdbe0b4faf0b5

architecture-decision-records git:20260606.4f8d3f3A

Immutable. This exact content is served forever at /api/v1/blob/7c9bdbe0b4faf0b5.

---
name: architecture-decision-records
description: Use when a significant architectural choice is being finalized, revisited, or reversed -- technology selection, structural patterns, or trade-offs that future maintainers or agents might unknowingly undo.
---

## Purpose

Code tells you *how* a system works. ADRs tell you *why* it works that way, preventing future maintainers (and AI agents) from suggesting "improvements" that were already tried and discarded.

## When to Use

- Finalizing a major design decision (e.g., "Choosing Postgres over MongoDB", "Using custom event bus over Redis")
- Reversing or superseding a previous decision
- A reviewer or agent proposes a change that contradicts an existing constraint

## Inputs

- The decision, the alternatives considered, and the constraints that drove it
- The ADR directory (conventionally docs/adr/)

## Workflow

1. **Check for an existing ADR first** — the decision may already be recorded or superseded:

   ```bash
   ls docs/adr/                          # existing records
   rg -ln "<topic keyword>" docs/adr/    # is this decision already covered?
   ```

2. **Create the record** at `docs/adr/YYYY-MM-DD-<short-title>.md` — date-prefixed for ordering, kebab-case title.

3. **Fill the structure** — keep it under 300 words; focus on constraints, not theory:

   ```markdown
   # <Decision title>

   ## Status
   Accepted | Superseded by <newer ADR filename>

   ## Context
   What is the problem? What constraints apply?

   ## Decision
   What are we doing?

   ## Consequences
   What trade-offs are we accepting? What becomes harder?
   ```

4. **Handle supersession explicitly.** When reversing a decision, do NOT edit history: write a new ADR, mark the old one "Superseded by" with a link to the new file, and state what changed.

5. **Link from where the decision bites** — a one-line pointer near the affected module or in the architecture doc, so the *why* is discoverable from the *how*.

## Output

- A dated ADR file with Status / Context / Decision / Consequences
- Superseded ADRs updated with forward links — never deleted or rewritten

## Verification

- [ ] File saved under docs/adr/ with a date-prefixed kebab-case name
- [ ] Status, Context, Decision, and Consequences sections all present; body under ~300 words
- [ ] Consequences state real trade-offs, not just benefits
- [ ] Superseded decisions marked and forward-linked, not edited or removed
- [ ] Decision discoverable from the affected code or architecture doc

## Failure Modes

- **Retroactive rewriting** — editing an old ADR to match a new decision destroys the historical why; supersede instead.
- **Theory essays** — pages of architecture philosophy nobody reads; constraints fit in 300 words.
- **Consequence-free records** — a Decision without trade-offs is advocacy, not a record.
- **Orphaned ADRs** — records nobody can find from the code they govern.