Convention specification

Decision Records

Architecture decision records are a last resort, written only when the repository’s structure, code, tests, and owner documentation cannot make a choice clear.

Applies at
docs/pdlc/decisions/
Status
Stable

01 Defines

When and how a separate decision record is written: a short, numbered ADR copied from a template, whose “Repository Expression” section points back to the files that make the decision visible in practice.

02 Applies when

  • Important context behind a choice cannot be read from the repository’s structure, implementation, or tests.
  • A tradeoff or constraint would be lost if it lived only in a pull request or conversation.
  • Owner documentation beside the affected files is not enough to explain why.

03 Boundaries

  • Conventions a directory, command, or module owns are described there, not in a record.
  • Records do not replace tests that enforce a convention through routine change.
  • The directory keeps only the template until a record is genuinely needed.

Expected behaviour

  1. 01
    A record is a copy of TEMPLATE.md named ADR-NNN-short-title.md.
  2. 02
    Records stay short and specific.
  3. 03
    Every record has a “Repository Expression” section pointing at code, owner documentation, tests, and runtime behaviour.
  4. 04
    Status, Context, Decision, and Consequences sections frame the choice and what it makes easier or harder.

Behaviour#

Most decisions in a repository are already written down — in the shape of the tree, in a make module, in a workflow, in a test. A decision record that restates one of those becomes a second source of truth that can drift. So the default is to express a convention where it lives, and to reach for a record only when that is not enough.

FlowWhere a decision is expressed
  1. 01 Structure Directories explain their layout in local README.md files Owner Documentation
  2. 02 Commands Makefile modules, scripts, and workflow files explain behaviour Make Module Registries
  3. 03 Infrastructure Roots and modules document their runtime contract locally Environments
  4. 04 Tests Architectural conventions that must survive routine change are enforced
  5. 05 Decision record Only what none of the above can make clear

That is why docs/pdlc/decisions/ is expected to be nearly empty. An empty directory with a template is the convention working, not a gap.

The template#

The template is deliberately small. Its distinguishing section is Repository Expression: a record has to name the places where its decision is visible, so a reader can check that the repository still agrees with it.

SectionAnswers
StatusProposed, or where the decision now stands
ContextWhat cannot be expressed by structure, code, tests, or owner docs alone
DecisionThe durable choice being made
Repository ExpressionCode, owner documentation, tests, and runtime behaviour that show it
ConsequencesWhat becomes easier, harder, safer, or intentionally out of scope

Examples#

docs/pdlc/decisions/TEMPLATE.md
# ADR-NNN: Title

## Status

Proposed.

## Repository Expression

Where does the repository make this choice visible in practice?

- Code:
- README or owner documentation:
- Tests or validation:
- Workflow or runtime behavior: