Skip to content

Architectural Decision Records (ADRs) ​

This directory is the single source of truth for architectural decisions in RestAssured. Every agent (human or AI) must read the relevant ADRs before proposing or implementing a change that touches data model, tenancy, auth, theming, i18n, GDPR, or forecasting.

When to write an ADR ​

Write an ADR when a change:

  • Alters the data model in a way that affects tenancy, PII, or financial calculations.
  • Introduces a new dependency heavier than a small utility (see "Lightweight budget" in CLAUDE.md).
  • Changes an auth, session, permission, or isolation mechanism.
  • Changes a public API contract, URL scheme, or localisation key structure.
  • Reverses or materially amends an existing ADR.

Bug fixes, refactors inside a module, and UI tweaks do not need an ADR.

File naming ​

ADR-NNNN-short-kebab-title.md

NNNN is a zero-padded, monotonically increasing number. Numbers are never reused, even if an ADR is rejected.

Template ​

markdown
# ADR-NNNN: <Title>

- **Status:** Proposed | Active | Superseded by ADR-XXXX | Deprecated | Rejected
- **Date:** YYYY-MM-DD
- **Deciders:** <names/roles>
- **Related:** ADR-XXXX, ADR-YYYY

## Context
What problem are we solving? Which forces (requirements, constraints, risks) are in play?

## Decision
What we decided, stated in active voice ("We will…"). Include the concrete rules agents must follow.

## Consequences
### Positive
### Negative / trade-offs
### Follow-ups

Lifecycle ​

StatusMeaning
ProposedUnder discussion. Must not be implemented beyond spikes.
ActiveBinding. Code must conform; deviations require a new ADR.
SupersededReplaced by a newer ADR (link it). Kept for history — never delete.
DeprecatedNo longer relevant, not replaced.
RejectedConsidered and declined. Kept so the discussion is not repeated.

Active ADRs are immutable in substance. Typos and clarifications are fine; a change in decision requires a new ADR that supersedes the old one, and the old one's status is updated.

Protocol for AI agents ​

  1. Before designing: grep -ril "<topic>" ai-docs/decisions/ and read every Active match.
  2. If your proposal conflicts with an Active ADR, stop and surface the conflict instead of working around it. Propose a superseding ADR with status Proposed.
  3. Never mark your own ADR Active; a human maintainer promotes it.
  4. Reference ADR numbers in commit messages and PR descriptions when implementing them (e.g. feat(auth): magic-link consumption endpoint (ADR-0004)).

Index ​

#TitleStatus
0001Multi-Tenant Data Isolation & Cross-Tenant User MembershipActive
0002Dynamic CSS Variable-Based Tenant ThemingActive
0003Hierarchical Admin & Fine-Grained RBAC Permission MatrixActive
0004Magic-Link Authentication & Tenant-Admin-Mediated Password ResetActive
0005GDPR Right-to-Be-Forgotten Anonymization EngineActive
0006Predictive Cost Analytics & Depreciation ModelActive
0007Internationalization (nl/en) StrategyActive
0008Technology StackActive
0009Project Licence, Dependency Licence Policy & Zero-Cost ToolingActive
0010Documentation Strategy & Self-Hosting ModelActive
0011CI, Source Hosting & Release ProcessActive
0012Asset Maintenance & Repair HistoryProposed
0013Tenant-Defined Custom FieldsProposed
0014Spreadsheet Import & ExportProposed
0015Offline-Capable Mobile Checkout & Asset LabelsProposed
0016File Attachments & PhotosProposed
0017Audit Log Scope, Access & RetentionProposed
0018Tenant Lifecycle — Provision, Suspend, Export, DeleteProposed
0019Rental Fees, Deposits & Fiscal Retention (Deferred)Proposed
0020Minors & Guardian ContactsProposed
0021Passkeys & Two-Factor Authentication for Privileged AccountsProposed
0022Quantity-Tracked Items & Asset SetsProposed

Released under the GNU AGPL-3.0-or-later.