Architecture decision records

A decision record says what was decided, when, against what alternatives, and what it costs. It is historical by construction: it carries a date, and it is never rewritten to match today. When a decision is reversed, a new record supersedes the old one and says so; the old one stays.

Why this directory exists

The comments in this repository explain a great deal, and that is what makes them worth reading: “we had found that…”, “at the start there were fifteen modules…”. The reasoning carries across; the number goes stale. Three docstrings still said “575 tests” when there were six hundred and thirteen; another said “46 modules” when the collection publishes fifty. None was wrong the day it was written.

So the rule, and mise run histoire is its executable form:

A number counting things in this repository does not belong in a sentence. If it is true, something must go red when it changes: an assertion, a golden, a derived block. If it is history, it belongs in a decision record, which carries its date.

Code says the current invariant. This directory says what happened.

The records

record

decision

ADR-001

No operation disappears; what no rule settles is UNKNOWN and fails the build

ADR-002

Terraform provisions, Ansible operates: no create, no delete, no wiring

ADR-003

A managing module reads the resource, computes the difference, and writes only that

ADR-004

ansible-test sanity that examined zero files is a failure, not a pass

ADR-005

Generated documentation is refused, not merely reported, when it is unusable

ADR-006

The local emulator proves the shape of a run, never the real cloud

ADR-007

A measured number is derived, an assertion, or dated history, never a sentence

ADR-008

A contract constraint is translated, or counted, or measured absent, never guessed

ADR-009

The type decides the comparison it can, an override decides the rest, nothing is guessed

ADR-010

After writing, what was asked is compared with what is observed, and a gap fails the module

ADR-011

A product passes a gate before entering the index, and enters with its price known

ADR-012

An explicit null on a clearable field fails the module, and never passes for an omitted option (superseded by ADR-016)

ADR-013

When a module, option or return appeared is read from a journal, never from the current version

ADR-014

The runtime composes its own HTTP request, and no private attribute of a third-party library is shipped

ADR-015

A claim about the real API is a recorded exchange, not a green assertion

ADR-016

A clearable field is cleared with the empty value of its type, and an explicit null is refused with that value named

ADR-017

On a failed destruction the launcher removes what blocks it, once, only within the run’s own platform, and says what it removed

ADR-018

A retry policy belongs to the operation: a read replays, a write only when the server says it did nothing, an action never

ADR-019

An API name filter narrows a listing, it never selects: the exact comparison is local, and two matches refuse

ADR-020

A plan describes the fleet as it was read, and is never replayed: the execution reads again