Architecture Decision Records

One file per irreversible decision, numbered, never rewritten.

Index

ADRdecisionstatus
ADR-0001Shared-schema multi-tenancy (tenant_id + RLS)accepted, amended (tenant inventory)
ADR-0002NATS JetStream as the change bus (with a local mode)accepted
ADR-0003WebSocket binding deferred out of v1accepted
ADR-0004Store ladder, redb as the file-mode durability shadowaccepted
ADR-0005AnyStore enum + synchronous Pg facadeaccepted · enum seam superseded by ADR-0013, sync facade by ADR-0022
ADR-0006RLS and Timescale compression collide on attr_instancesaccepted
ADR-0007temporal auto-recording stays in the write pathaccepted (reverses the earlier bus-consumer design)
ADR-0008The browser build: one crate, the same router, no fourth backendaccepted
ADR-0009Temporal read cutover: attr_instances becomes the read pathaccepted, implemented
ADR-0010Private-range egress allowed by defaultaccepted, implemented
ADR-0011The Via pseudonym identifies a (Context Source, Tenant) pairaccepted, implemented
ADR-0012Internal broker state lives in the store as doc kinds, keyed under reserved tenantsaccepted, implemented
ADR-0013storage drivers — current-state and temporal as separate traitsaccepted; supersedes the enum half of ADR-0005; the driver-identity consequence superseded by ADR-0017
ADR-0014extension hooks — fixed phases, batch granularityaccepted; sink paragraph superseded by ADR-0016; two phases given a named user, and rule 1 an exception, by ADR-0020
ADR-0015Notification delivery policy: one attempt by default, retries as transport, dead letters in the storeaccepted, implemented
ADR-0016Notification bindings behind the sink registryaccepted, implemented
ADR-0017A driver is identified by its name, not by an enum valueaccepted, implemented
ADR-0018CI actions are pinned by tag, third-party binaries by versionaccepted, implemented
ADR-0019The distributed-subscription notification receiver lives outside the ETSI namespaceaccepted, implemented
ADR-0020The policy seam: one trait, one built-in engine, every engine an addonaccepted, amended (the narrowing marker header)
ADR-0021A stored @context belongs to the Tenant that stored it, a Cached copy to noneaccepted, implemented
ADR-0022The storage drivers are async; nothing blocks on a store callaccepted, implemented; supersedes the sync-facade half of ADR-0005

Format

Nygard's fields — Title, Status, Context, Decision, Consequences — plus one borrowed from MADR:

  • Confirmation: how compliance with the decision can be checked — a named test, a CI job, a grep, or an explicit "manual review only". Every new ADR names its own fitness check; a decision nobody can verify drifts silently.

Shorter ADRs fold Context/Decision/Consequences into prose sections, as the existing files do; the five concerns must all be answerable from the text either way.

Immutability policy

Append-with-status. An accepted ADR's body is frozen; when a decision changes, a NEW ADR supersedes it and the old one's Status line gains superseded by ADR-00XX (see ADR-0005/ADR-0013 and the reversal recorded in ADR-0007). Never edit an old ADR's Decision to match new reality — the record of what was believed, and when it stopped being true, is the point of keeping them.