| title | ADR process |
|---|
Architecture Decision Records (ADRs) are lightweight, numbered, immutable records of cross-cutting decisions for the AzureLocal platform and its consumer repos.
Open an ADR when your change:
- Touches standards — any substantive edit to
standards/*.mdx(not typo fixes) - Adds, changes, or removes a reusable workflow — new workflow, new input, or breaking change
- Modifies IIC canon — any change to
testing/iic-canon/*.json(treated as frozen post-v1) - Adds or removes a template variant
- Affects the contract between platform and consumers — metadata schema, breadcrumb rules, version pinning strategy
- Deprecates anything that consumer repos currently rely on
You do NOT need an ADR for:
- Typo fixes in standards
- Bug fixes in reusable workflows that don't change inputs or behavior
- Adding a new page to
docs/that describes existing behavior - Internal refactors of
modules/powershell/AzureLocal.Common/that don't change public surface
Every ADR follows template.md. Four required sections:
- Context — what problem, what constraints, what prompted this
- Decision — what we chose, one paragraph max, explain why
- Consequences — positive, negative, neutral, affected repos/owners
- Status — Proposed, Accepted, or Superseded by ADR XXXX
Plus:
- Alternatives considered — options we rejected with one-line reasons
NNNN-kebab-case-title.md where NNNN is a zero-padded sequential integer. Example: 0005-iic-canon-version-schema.md.
Numbers are never reused. If an ADR is withdrawn before acceptance, still increment — subsequent ADRs don't renumber.
stateDiagram-v2
[*] --> Proposed: PR opened
Proposed --> Accepted: PR merged
Proposed --> Withdrawn: PR closed without merge
Accepted --> Superseded: replaced by new ADR
Superseded --> [*]
Withdrawn --> [*]
- Proposed — PR is open, review in progress
- Accepted — PR merged, decision is binding
- Superseded — an accepted ADR is replaced by a later ADR. The original ADR stays in the repo, with its Status updated to link to the replacement. Never delete ADRs.
- Withdrawn — PR closed without merge; numbered but not part of history
Accepted ADRs are immutable except for corrections to the Status field when superseded. Don't silently edit an accepted ADR — write a new ADR that supersedes it.
- Open a draft PR with the new ADR at
decisions/NNNN-title.md, StatusProposed - Reference the ADR from the code change (if any) in the same PR, or in a follow-up PR that links to the ADR
- Review — CODEOWNER review, plus self-review documentation if solo-maintained
- Merge — update Status to
Accepted, updatedecisions/README.mdindex table - Implement — follow-up PRs reference the ADR number in commit messages
For purely-informational ADRs (no code follow-up), step 5 is skipped.
The authoritative index lives in decisions/README.md. Keep it sorted by number.
"Can an ADR span multiple repos?" Yes — that's exactly what they're for. The ADR lives in platform regardless of which product repo it affects.
"What if the decision is reversed?" Write a new ADR that supersedes the old one. The old ADR's Status becomes Superseded by NNNN. Both remain.
"How long should an ADR be?" 200-600 words for most decisions. 1000+ only for genuinely complex cross-cutting calls with many alternatives.
"Do ADRs go in a CHANGELOG?" Yes — each accepted ADR gets an entry in CHANGELOG.md under the release that included it.