| Identity contract |
SPIFFE IDs and SVIDs |
Open source |
Platform-specific tokens |
Standard identity format that outlives any implementation |
ADR-01 |
| Workload attestation |
SPIRE with Kubernetes PSAT; TPM DevID in Phase 3 |
Open source |
Kubernetes auth in the engine; pipeline tokens |
Identity from what the infrastructure observes, including image digest |
ADR-01 |
| Identity registration |
Registry-compiled static entries; digests from CD |
This design |
Templated entries per namespace |
No identity on first sight |
ADR-02 |
| Session |
Gateway-wrapped, key-bound, generation-stamped token |
This design |
Bearer engine token; DPoP |
A copied token is useless and restores invalidate sessions |
ADR-03 |
| Environment separation |
Trust domain and offline root per environment |
This design |
Policy on path prefixes |
Decided in the handshake, before policy exists to be wrong |
ADR-04 |
| Partitioning |
KMS, custody and broker clusters per environment and site |
This design |
One cluster with namespaces |
One memory image yields one partition |
ADR-05 |
| Tier 0 runtime |
Bare-metal enclave hosts, systemd, Ansible |
Open source |
Estate Kubernetes; dedicated Kubernetes |
Starts before anything that depends on it |
ADR-06 |
| Multi-site |
Site-local clusters; dual write before promotion |
This design |
Stretched Raft with witness |
Independent failure and compromise, custody RPO 0 |
ADR-07 |
| Secrets engine |
OpenBao (MPL 2.0) |
Open source |
Vault (BUSL); built engine |
Mature leases and plugins under an open-source licence |
ADR-08 |
| Issuance gateway |
Stateless Go service |
This design |
Envoy with external authorisation |
Holds the checks the engine cannot express |
ADR-09 |
| Key manager |
OpenBao transit cluster run by key custodians |
Open source |
Direct PKCS#11 to HSMs |
Identity-aware policy and an independent audit log |
ADR-10 |
| Hardware root |
Network HSM pair per site, FIPS 140-3 Level 3 |
Hardware |
Shamir unseal by custodians |
Root keys never exist outside hardware |
ADR-10 |
| Custodial encryption |
Per-version envelope, unwrapped per read, path-bound |
This design |
Engine barrier only |
Storage, custody and KMS each yield a bounded subset |
ADR-11 |
| Custodial storage |
OpenBao KV v2 |
Open source |
Conjur OSS |
Versioning and metadata readable without material |
ADR-12 |
| Non-exportable keys |
OpenBao transit |
Open source |
PKCS#11 per workload |
Operations are distributed, keys are not |
ADR-13 |
| Lifetimes |
Platform bounds, per-role values, shorten-only |
This design |
Fixed lifetime; caller's choice |
The trade is made where it is understood |
ADR-14 |
| Disappearance |
Leases under renewed sessions |
This design |
Pod deletion watcher |
Silence revokes |
ADR-15 |
| Database brokering |
OpenBao database plugins; PostgreSQL 16 CREATEROLE scoping |
Open source |
Superuser admin |
A broker compromise yields account creation, not data |
ADR-16 |
| Messaging and storage brokering |
OpenBao RabbitMQ plugin; built Kafka SCRAM and Ceph RGW plugins |
Open source |
Custodial static users |
Per-instance credentials with real revocation |
ADR-16 |
| Irrevocable upstreams |
15-minute unrenewable leases, registered |
This design |
Refuse; custody |
Containment bound equals the lease |
ADR-17 |
| Upstream protection |
Per-role caps and per-upstream mint budgets |
This design |
Engine rate-limit quotas |
Shed before a shared upstream is exhausted |
ADR-18 |
| Node agent |
Built Go DaemonSet with SPIRE delegated identity |
This design |
OpenBao Agent sidecars; Secrets Store CSI |
One process per node enforcing every invariant |
ADR-19 |
| Proxy delivery |
Envoy credential injector over SDS |
Open source |
Application-held API keys |
The application never sees the key |
ADR-20 |
| Outage behaviour |
Fail static until expiry; no extension |
This design |
Emergency grace |
Stated lifetimes stay true |
ADR-21 |
| Time |
Monotonic ageing; chrony; ±30 s guard |
Open source |
Wall-clock expiry |
Correct expiry on nodes with bad clocks |
ADR-22 |
| Rotation |
Built controller; dual credentials; observed-use retirement |
This design |
Push; scheduled retirement |
Never zero working credentials; stragglers bounded |
ADR-23 |
| Revocation |
Scope resolution with upstream confirmation |
This design |
Trust the API result |
Contained means observed at the source |
ADR-24 |
| Reconciliation |
Hourly per-shard reconciler |
This design |
Trust the lease store |
Orphans die within 90 minutes |
ADR-25 |
| Restore safety |
Generation in KMS; revalidation before open |
This design |
Plain restore |
The past is restored as data, not authority |
ADR-26 |
| Policy |
Forgejo registry compiled by CI, applied by one identity |
Open source |
Hand-written policy; OPA at request time |
People review intent; machines write enforcement |
ADR-27 |
| Blast radius |
Inventory service on PostgreSQL |
This design |
Manual access review |
Every claim is a query |
ADR-28 |
| Audit transport |
Kafka (KRaft) and Fluent Bit |
Open source |
NATS JetStream |
Quorum writes for custody, durable shipping for renewals |
ADR-29 |
| Audit query and archive |
ClickHouse; Ceph RGW Object Lock |
Open source |
OpenSearch; tape |
Fast who-read queries and retention no operator can shorten |
ADR-30 |
| Human access |
Keycloak with WebAuthn; built access broker |
Open source |
Standing read for security |
Two people, one use, always rotated after |
ADR-31 |
| Leak detection |
Upstream logs joined to leases; decoy accounts |
This design |
Network IDS |
Finds leaks that renewal keeps alive |
ADR-32 |
| Release |
Forgejo Actions, cosign, Ansible, Argo CD |
Open source |
Blue-green sites |
One blast radius per step, invariants tested by name |
ADR-33 |
| Observability |
Prometheus, Alertmanager, Grafana, Loki |
Open source |
OpenTelemetry collector with a commercial back end |
On-premises, scrubbed, with containment alerts routed to security |
ADR-34 |