Architecture decision records
Architecture decision records
All decisions for orbit-rs and for Symphony live here. Symphony’s repository holds no copy; it points to this folder. Each record states one decision, why it was made, and what it commits us to. They are the single source for how the project describes itself: README, specifications, whitepapers and release notes quote them and must not contradict them.
Index
One series for orbit-rs and Symphony. Scope says which project a record governs.
| ADR | Title | Scope | Status | Date |
|---|---|---|---|---|
| 0001 | The goal is full compatibility with PostgreSQL 18 | orbit-rs | Accepted | 2026-10-24 |
| 0002 | Compatibility is stated only as a conformance pass rate | orbit-rs | Accepted | 2026-10-24 |
| 0003 | Schemas are first-class catalog namespaces | orbit-rs | Accepted | 2026-10-24 |
| 0004 | PostgreSQL SQL runs on a durable RocksDB engine replicated by Raft | orbit-rs | Accepted | 2026-10-23 |
| 0005 | Each wire protocol is a separate compatibility layer with its own conformance corpus | orbit-rs | Accepted | 2026-10-24 |
| 0006 | Reference server and version for each protocol layer | orbit-rs | Accepted | 2026-10-24 |
| 0007 | The desktop app stays on SQLite with no Postgres dependency | Symphony | Accepted | 2026-10-23 |
| 0008 | orbit-rs is adopted for hosted data only after an exit gate passes | Symphony | Accepted | 2026-10-23 |
| 0009 | Tenant databases on orbit-rs are isolated by schema | Symphony | Accepted | 2026-10-24 |
| 0010 | Hosted recovery does not use a Queues write-ahead log or multi-master sync | Symphony | Accepted | 2026-10-23 |
| 0011 | Symphony describes orbit-rs with the orbit-rs wording | Symphony | Accepted | 2026-10-24 |
| 0012 | pg_catalog and information_schema are real catalog schemas | orbit-rs | Accepted | 2026-10-24 |
| 0013 | Roles, ownership and privileges follow PostgreSQL | both | Accepted | 2026-10-24 |
| 0014 | Schema records are emitted only when the operator attests every node can apply them | orbit-rs | Accepted | 2026-10-24 |
| 0015 | A maturity label is earned by a checklist, not asserted | orbit-rs | Proposed | 2026-10-25 |
| 0016 | A performance number is quoted only with its reproducible benchmark | orbit-rs | Proposed | 2026-10-25 |
| 0017 | One project statement, and counts come from a script | orbit-rs | Proposed | 2026-10-25 |
| 0018 | The Redis layer gets a keyspace engine before more commands | orbit-rs | Proposed | 2026-10-25 |
Rules
- Statuses: Proposed, Accepted, Superseded, Deprecated, Rejected. Only the owner moves a record to Accepted; an assistant drafts records as Proposed.
- A record is never rewritten to change its meaning. To change a decision, add a new record that supersedes it: set the old one to Superseded with a
**Superseded by:** ADR NNNNline, and give the new one**Supersedes:** ADR NNNN. Typo and link fixes are fine. A narrow change to one item of an accepted record may instead be an amendment: the new record carries**Amends:** ADR NNNNand names the item, and the old record gets an**Amended by:** ADR NNNNline and stays Accepted. - Change code or claims that touch a decision in the same change as its record. If a pull request changes what the project says about PostgreSQL compatibility, replication, storage or schemas, it updates or adds the record.
- Quote, don’t paraphrase. Each record has a Canonical wording section. Documents reuse that wording.
- Retire wording mechanically. When a decision forbids a claim, add its pattern to
RETIREDinscripts/check_adr.py. - Run
make adr-checkbefore committing. Symphony runs the same script from its ownmake adr-check, which also scans Symphony’s Markdown for retired wording. It verifies the format, that every record is in this index with the right status, that cross-references resolve, and that no tracked Markdown file uses retired wording.
New record: copy TEMPLATE.md to NNNN-short-title.md, number it next, and add an index row.