Email as the Primary Login Identifier
Context
Coexisting username and email identifiers caused login ambiguity and unique-constraint conflicts.
Decision
Login identifiers are dispatched by whether they contain @ (the username charset and email are mutually exclusive, guaranteeing no ambiguity); email is required, and registration/login share normalizeEmail; username is optional but keeps its UNIQUE constraint (NULL exempt); the login path validates most leniently (regex applies only to registration/password change); the API field name stays username for compatibility; the OIDC name falls back to email.
Consequences and Current State
The V020 migration is in the repository; the login semantics in operational documents such as verification-checklist follow this ADR.