| Authored source of truth |
Forgejo — prompts and fragments as reviewable text in the repository that owns the feature |
Open source, self-hosted |
A database-backed editor as the only authoring path |
Prompt changes need line-by-line review by people who already review code, and a repository gives that for free. The database-backed console still exists for non-engineering authors; it writes through the same build, so neither path is privileged. |
ADR-11 |
| Build and validation |
Argo Workflows — flatten, validate, lint, scan, pin, canonicalise, digest, sign |
Open source on Kubernetes |
A bespoke build service inside the Config API |
The build is a directed pipeline of steps with retries and artefacts, which is what a workflow engine is. Building it into the API would couple authoring availability to build availability, which ADR-01 spends effort separating. |
ADR-08 |
| Artefact store |
OCI registry with blobs in MinIO under Object Lock |
Open source, self-hosted |
A purpose-built blob store keyed by digest |
Content addressing, immutability, referring artefacts for signatures, replication and mirroring are already solved in OCI, and operators already know how to run one. A bespoke store means re-solving all of it and getting garbage collection wrong. |
ADR-06 |
| Pointer store |
etcd, 3-node quorum — key+environment to digest, rollout percentage, kill switch |
Open source, self-hosted |
The PostgreSQL authoring database, with a pointer table |
The pointer store is the only thing the fleet polls and the only thing promotion writes; it needs linearisable writes, a tiny dataset and independence from the authoring store's availability. Putting pointers in PostgreSQL would couple the two planes in exactly the place ADR-01 separates them. |
ADR-01 |
| Change propagation |
NATS JetStream for the notice, with a 30 s poll against etcd as the guarantee |
Open source, self-hosted |
Kafka for the notice, or push-only with acknowledgements |
The notice is small, per-key, and needs no retention: JetStream is right-sized where Kafka is not. The poll is load-bearing, so the bus is allowed to be ordinary infrastructure. |
ADR-05 |
| Authoring store |
PostgreSQL with Patroni — drafts, reviews, ownership, experiment definitions |
Open source, self-hosted |
The same store used for pointers and artefacts |
Authoring is genuinely relational and genuinely transactional, and it is allowed to be unavailable. Keeping it separate is what makes a 5-minute RPO acceptable here and RPO 0 mandatory next door. |
ADR-01 |
| Signing and key custody |
OpenBao transit with an HSM seal; the signer holds a sign-only role |
Open source, self-hosted |
A signing key mounted into the build controller |
A mounted key can be exfiltrated by anything that compromises the build; a sign-only role can be used but not read. The difference is the whole value of signing. |
ADR-12 |
| Workload identity |
SPIRE — short-lived SVIDs for every resolver pulling artefacts |
Open source, self-hosted |
A long-lived pull credential distributed with the application |
A long-lived credential in ~300 deployments is 300 opportunities to leak one, and rotating it is a fleet campaign. SVIDs make the pull credential a property of where the workload runs. |
ADR-12 |
| Human identity |
Keycloak — OIDC for the console and CLI, groups as the grant subject |
Open source, self-hosted |
Registry-local accounts and roles |
Authoring, approval and promotion grants must follow people as they change teams, which means they belong to the organisation's directory rather than to this platform's own user table. |
ADR-11 |
| Exposure telemetry |
OpenTelemetry collection, Kafka buffer, ClickHouse store |
Open source, self-hosted |
Writing exposures directly to the transactional store |
500 million append-only events a day with 90-day hot retention is a columnar workload. Putting it in PostgreSQL would make the largest, least important data the constraint on the smallest, most important. |
ADR-16 |
| Audit ledger |
Hash-chained append-only records in MinIO under Object Lock, 7-year retention |
Open source, self-hosted |
An audit table in the authoring database |
The claim is that the ledger is readable but not mutable by anyone including platform operators. A table an operator can update does not support that claim, however carefully the application is written. |
ADR-12 |
| Resolution |
Go, Python and TypeScript SDKs against a shared conformance suite |
Built |
A sidecar, or a central resolution service |
Sub-millisecond resolution and resolution context that never leaves the caller, at the cost of three implementations and slow upgrades. The alternatives and their triggers are recorded rather than dismissed. |
ADR-02 |
| Runtime and delivery |
Kubernetes with Argo CD reconciling the platform's own manifests |
Open source, self-hosted |
Whatever the estate already uses for stateful services |
The registry is an ordinary platform service and gets no special treatment. Its own configuration is delivered the way everything else is, so the team operating it learns nothing bespoke. |
ADR-17 |
| Observability |
Prometheus, Loki and existing tracing; convergence and staleness as first-class metrics |
Open source, self-hosted |
A registry-specific dashboard and alerting path |
The two signals that matter — convergence and staleness — are ordinary gauges, and putting them in the estate's existing stack means on-call sees them beside everything else rather than in a tool they open once a quarter. |
ADR-05 |