ProudAuthDocs

Architecture decision records#

These records implement GOV-001: architecture and compatibility decisions are versioned with their rationale, alternatives and migration implications. Each ADR corresponds to one row of the decision register in docs/plan.md §37.1 and records what the code actually does today, including where it falls short of the register.

ADRDecisionStatus
0001Product form: modular monolith with worker processesAccepted
0002Implementation language and libraries: GoAccepted
0003First-party license: Apache-2.0Accepted
0004Durable store: PostgreSQLAccepted
0005Cache and broker: none required; transactional outbox in PostgreSQLAccepted
0006Identity boundaries: realm = issuer and user namespace; organization = business tenantAccepted
0007Stable account key: immutable local IDs; external identity keyed by issuer and subjectAccepted
0008Interactive protocol: authorization code with PKCE onlyAccepted
0009Ordinary access tokens: short-lived asymmetric JWTs with one audienceAccepted
0010High-risk and support tokens: opaque, validated onlineAccepted
0011Refresh model: opaque, rotated, client-bound familiesAccepted
0012Organization context: one organization per business tokenAccepted
0013Authorization: scoped RBAC with delegation ceilings and a decision APIAccepted
0014Impersonation: explicit, short, actor-preserving support grantsAccepted
0015Keys: root keys, HKDF purpose keys, AES-256-GCM, wrapped signing keysAccepted
0016Email and SMS: replaceable operator-configured adaptersAccepted
0017Browser integration: external login UI and headless transactionsAccepted
0018Federation and enterprise protocols: ship each only when completeAccepted
0019HA topology: one authoritative write regionAccepted
0020Compliance posture: evidence and controls, no certification claimsAccepted
0021Custom logic: out of process only, no embedded code execution (EXT-013; not a §37.1 register row)Accepted
0022Security-event exchange: an audit-log adapter out, explicit action policies in (AUD-016, ADV-007; not a §37.1 register row)Accepted

Format#

Each record has: Status, Context, Decision, Alternatives considered, Consequences, Migration implications and Related requirement IDs (from docs/plan.md).

Changing a decision#

A decision is replaced, not edited: add a new ADR with the next number, set the old record's status to Superseded by NNNN, and update the threat model, tests and operations documents in the same pull request. docs/plan.md §37.1 requires that a substituted decision preserve the security invariant it protects (for example, choosing another database does not remove atomic one-time proof consumption).

ProudAuth · Self-hosted identityBuilt 2026-10-13 · d9cc813ae809 · content snapshot
⌕

Search all guides and the API contract.

↑ ↓ to navigate Enter to open · Esc to close