Architecture decision records
An architecture decision record (ADR) captures one significant decision: the context, the options that were considered, the choice that was made and its consequences. Together the records explain why Agoranomos is built the way it is. ADR-0001 describes which decisions are recorded and how.
Format
Records follow the MADR 4.0 format (Markdown Architectural Decision Records). Each record is one Markdown file named NNNN-title.md, with a short metadata block (status, date, decision-makers) and these sections:
- Context and Problem Statement: what needs deciding and why.
- Decision Drivers: the forces and concerns that matter.
- Considered Options: the alternatives that were weighed.
- Decision Outcome: the chosen option and its consequences, good and bad.
- More Information: evidence, links and when to revisit the decision.
Statuses
The status in the metadata block of a record is one of these words, written in lowercase.
| Status | Meaning |
|---|---|
| proposed | The decision is under discussion. |
| accepted | The decision is in force. |
| rejected | The proposal was considered and declined. The record stays, so that the question is not reopened without its context. |
| deprecated | The decision no longer applies, and no other record replaces it. |
| superseded | A newer record replaced the decision. The status is superseded, and a line Superseded by [ADR-0123](0123-title.md). under the title names the new record. |
Accepted records keep their decision
An accepted record keeps its decision. Its status, the implementation status of what it decided (such as an "In place" or "Planned" list), factual corrections and editorial fixes may be edited, and the pull request says which. These edits leave the date unchanged: it is the day the decision was made or last changed. A changed decision needs a new ADR that supersedes the old one. The old record keeps its text. Its status becomes superseded, and one line under its title points to the new record; nothing else changes. That way the history of why things changed stays readable.
A superseded record starts like this:
---
status: superseded
date: 2026-10-02
decision-makers: Andrei Gromov
---
# Title of the old decision
Superseded by [ADR-0123](0123-title-of-the-new-decision.md).
All records
Agoranomos is pre-alpha. A record states a decision, and the components it describes arrive release by release.
| ADR | Title | Status | Date |
|---|---|---|---|
| 0001 | Record architecture decisions | accepted | 2026-10-04 |
| 0002 | Orchestrate with Apache Airflow 3 | accepted | 2026-10-02 |
| 0003 | Run two PostgreSQL instances | accepted | 2026-10-02 |
| 0004 | Ingest data with dlt | accepted | 2026-10-02 |
| 0005 | Transform data with dbt Core | accepted | 2026-10-02 |
| 0006 | Use Metabase as the BI layer | accepted | 2026-10-02 |
| 0007 | Give AI clients least-privilege access through MCP | accepted | 2026-10-02 |
| 0008 | License under Apache-2.0 with DCO sign-off | accepted | 2026-10-02 |
| 0009 | Write documentation with Zensical and Diátaxis | accepted | 2026-10-02 |
| 0010 | Support amd64 and arm64 within a memory budget | accepted | 2026-10-02 |
| 0011 | Support local and server modes | accepted | 2026-10-02 |
| 0012 | Use Python 3.13 and a pinned toolchain | accepted | 2026-10-02 |
| 0013 | Keep extensions apart from the base package | accepted | 2026-10-05 |
| 0014 | Start the stack with one script and a generated .env file | accepted | 2026-10-05 |
| 0015 | Run LocalExecutor by default | accepted | 2026-10-05 |
| 0016 | Keep the metadata of the marts as code, with a deployment's overrides in extensions | accepted | 2026-10-07 |
| 0017 | Set the access of AI clients in Metabase by levels | accepted | 2026-10-10 |
| 0018 | Keep the content of the package in Metabase as code, and view-only | accepted | 2026-10-10 |
| 0019 | Open only Metabase to the internet in server mode, through Caddy | accepted | 2026-10-09 |
| 0020 | Back up the databases every day with pg_dump, into a folder of the host | accepted | 2026-10-09 |
| 0021 | Leave the outgoing traffic of Metabase open, and close what relays it without a sign-in | accepted | 2026-10-09 |
| 0022 | Budget the memory by variant and mode | accepted | 2026-10-09 |
| 0023 | Give the network of the stack IPv6, so that Metabase sees the address of each client | accepted | 2026-10-11 |
| 0024 | One deployment is one business, and clients group its ad accounts | accepted | 2026-10-12 |
| 0025 | Model advertising statistics once, at the grain of a campaign and a day | accepted | 2026-10-12 |
| 0027 | Load the dbt project into Cosmos from a manifest | accepted | 2026-10-12 |
| 0028 | Build each node of dbt with its tests in one task | accepted | 2026-10-19 |
| 0029 | Record the runs of dbt with elementary in the schema ops, and show them in the Ops collection | accepted | 2026-10-20 |
| 0030 | Ship three MCP servers in v0.3.0, with the stdio servers in local mode only | accepted | 2026-10-21 |
| 0031 | Register and revoke the OAuth clients of Metabase with the script, and close the rest at the proxy | accepted | 2026-10-21 |