Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Architecture Decision Records

An ADR records one architectural decision this project has actually made — what was decided, why, and what it costs — so a future contributor doesn’t have to reconstruct the reasoning from commit messages or code comments alone.

Why this project uses ADRs

Several real, consequential decisions currently live only in scattered places — a comment in a package’s own source, a paragraph inside a larger design doc, an RBAC manifest’s own header. An ADR gives one such decision a single, indexed, discoverable home, without duplicating the reasoning that already exists elsewhere: an ADR points to the code or doc where a decision is explained in detail, it doesn’t restate it.

ADR vs. RFC

  • ADR — decided. Records a decision this project has actually made, usually already implemented. Written after the fact, not as a proposal.
  • RFC — proposed. A design under discussion, not yet decided — may end up accepted, rejected, or deferred. This project doesn’t have an RFC directory yet. When one exists, an RFC that gets accepted becomes an ADR at that point, not before — the two are never the same document at different stages, they’re different documents with a hand-off between them.

Don’t write an ADR for something still being debated — that’s an RFC’s job once this project has a place for those. Don’t leave a real, shipped decision undocumented either — that’s the gap this index exists to close.

Status and immutability

Once an ADR is Accepted, it’s a historical record — its content doesn’t change to reflect new information or a change of mind. If a later decision changes course, it gets its own new ADR, and the earlier one is marked Superseded by ADR-NNNN — never edited to pretend the original reasoning was different than it actually was.

Statuses used here: Proposed, Accepted, Superseded, Deprecated.

Index

#TitleStatusDate
0001Exit-code contract (0/1/2/3)Accepted2026-08-07
0002Generic Behavior IR as the exporter boundaryAccepted2026-08-08
0007Governed apply ordering and enforcement readinessAccepted2026-08-19
0008SPO derived-policy import boundaryAccepted2026-08-19
0009SPO merged SeccompProfile provenance and target separationAccepted2026-08-21
0021Bounded Workbench Kubernetes read authorityAccepted2026-08-31
0022Workload security projection proof levelsAccepted2026-09-01
0023Local Workbench HTTP trust boundaryAccepted2026-09-02
0024Durable ApplyAttempt mutation custodyAccepted2026-09-03
0025Explicit rollback with strict custodyAccepted2026-09-03
0026Observation identity and record decompositionAccepted2026-09-05
0027ClusterIdentity resolution modelAccepted2026-09-05
0028Workload identity, ContainerSlot, and revision splitAccepted2026-09-05
0029Observation persistence adapter boundaryAccepted2026-09-05
0030Executor claim and lease mechanismAccepted2026-09-05
0031candidate-v1 digest boundaryAccepted2026-09-05
0032Per-source EMPTY and UNKNOWN precondition ruleAccepted2026-09-05

Adding a new ADR

Copy 0000-template.md, number it sequentially (0001, 0002, …), fill it in, add a row to the index above.

Architecture governance guide

See docs/architecture/governance.md for the project’s architecture governance, review methods, identity-sensitive change policy, and ADR/RFC lifecycle guidance.