# Architecture Decision Records

One decision per file. Template: [../adr-template.md](../adr-template.md).
Do not rewrite a decided ADR in place; mark it superseded and add a new number.

| ADR | Title | Status |
|---|---|---|
| [0001](0001-generic-party-model.md) | Generic party model | Accepted |
| [0002](0002-random-pairwise-external-ids.md) | Random pairwise external IDs | Accepted (prefix → 0013) |
| [0003](0003-session-jwt-at-boundary.md) | Session JWT at boundary | Superseded by 0015, 0016 |
| [0004](0004-async-first-ingestion.md) | Async-first ingestion | Accepted |
| [0005](0005-phased-event-log-infrastructure.md) | Phased event log | Accepted |
| [0006](0006-batch-ingestion-via-object-storage.md) | Large batches via object storage | Accepted |
| [0007](0007-versioned-campaign-configuration.md) | Versioned campaign configuration | Accepted |
| [0008](0008-at-least-once-plus-idempotency.md) | At-least-once + idempotency | Accepted |
| [0009](0009-mandatory-one-time-link-before-data-flows.md) | Mandatory one-time link | Accepted |
| [0010](0010-linking-unifies-no-separate-claim.md) | Linking unifies relationships | Accepted |
| [0011](0011-iam-authenticates-playerpal-owns-identity.md) | IAM authenticates; PlayerPal owns identity | Accepted |
| [0012](0012-never-receive-player-pii.md) | Never receive player email/name/phone | Accepted |
| [0013](0013-typed-pairwise-aliases.md) | Typed pairwise aliases | Accepted |
| [0014](0014-provider-operator-alias-scope.md) | Provider-operator alias scope | Accepted |
| [0015](0015-async-loyalty-sidecar.md) | Async loyalty sidecar | Accepted |
| [0016](0016-bff-cookies-and-machine-oauth.md) | BFF cookies and machine OAuth | Accepted |
| [0017](0017-operator-assertion-popup-linking.md) | Assertion + popup linking | Accepted |
| [0018](0018-url-isolated-portals.md) | URL-isolated portals | Accepted |
| [0019](0019-scoped-bootstrap-proofs-controlled-merge.md) | Scoped proofs and controlled merge | Accepted |
| [0020](0020-assurance-levels-provisional-password.md) | Assurance A0-A3 | Accepted |
| [0021](0021-nestjs-zitadel-local-poc.md) | NestJS control plane + ZITADEL local POC | Accepted |
| [0022](0022-official-login-app-fork.md) | Official Login app fork for portal sign-in | Accepted (player password/passkey path → [0024](0024-nest-owned-portal-auth.md)) |
| [0023](0023-typeorm-data-layer.md) | TypeORM data layer + DDL ownership | Accepted |
| [0024](0024-nest-owned-portal-auth.md) | Nest-owned portal password/passkey + social IdP | Accepted |
| [0025](0025-provider-launch-sessions-and-widget-distribution.md) | Provider launch sessions + PlayerPal widget distribution | Accepted |
| [0026](0026-analytics-subject-and-provider-cohort.md) | Random analytics subject + provider-global cohort (not alias) | Accepted |
| [0027](0027-alias-provisioning-at-link.md) | Mint aliases at link complete for listed integrations | Accepted |
| [0028](0028-v1-recovery-without-operator-assist.md) | v1 recovery without operator assist | Accepted |
| [0029](0029-application-native-authorization.md) | Application-native authorization for v1 | Accepted |
| [0030](0030-unlink-delete-on-playerpal-account.md) | Unlink and Delete Account on PlayerPal Account | Accepted |
| [0031](0031-account-connection-groups.md) | Group Connected partners; confirm names the cascade | Accepted |
| [0032](0032-unlink-partner-notice.md) | Demo Bucks unlink notice and alias reconcile | Accepted |
| [0033](0033-partner-kpi-platform.md) | Partner KPI platform: visibility tiers, anonymous comparison, Cube behind Nest | Accepted |
| [0034](0034-documentation-site.md) | Documentation site: Docusaurus + OpenAPI + Scalar, internal first | Accepted |
