Status: Accepted
Date: 2026-04-30 UTC
Deciders: Kristerpher (product owner)
Refs: epic #651, sub-card #670, docs/security/auth-posture.md §11
Raxx customer accounts authenticate exclusively with WebAuthn passkeys (ADR-0001). There is no password. There is no SMS OTP. There is no email login factor.
This creates a real failure mode: a customer who loses all enrolled devices has no credential to present to the application. The question is what — if anything — the platform does in response.
The industry default for fintech and consumer auth products is to add a secondary recovery surface:
Raxx explicitly rejects all three. This ADR records that decision, why it was made, and what it requires from the rest of the system.
A+B only — no other recovery surface exists.
Customers must enroll at least two passkeys before their account is activated. Signup cannot complete with a single passkey. If only one device is available at signup time, the customer can pause and resume — but the account does not go live until a second passkey is enrolled.
This is not a recommendation. It is a hard gate enforced at the API layer.
Ten single-use backup codes are generated at signup. The signup flow blocks until the customer has:
Using a backup code does not restore normal access — it opens a forced passkey re-enrollment flow that must complete before the session can do anything else. Each code is single-use and its consumption is audit-logged. Customers can regenerate backup codes from the dashboard at any time; regeneration invalidates the entire previous batch.
The account is permanently inaccessible. Raxx cannot help. This is stated in plain language at signup. It is a deliberate posture choice.
docs/ops/runbooks/support/ when the support epic work begins. No runbook directory exists yet; this ADR points to where it should go.)customer.passkey.added, customer.passkey.revoked, customer.backup_code.used, and customer.backup_codes.regenerated events must all be written to the audit log. These are the only signals Raxx has of a customer's recovery state.The most common industry recovery path. A time-limited link is sent to the verified email address; clicking it grants access and triggers passkey re-enrollment.
Rejected. Email is the single largest account-takeover surface for fintech accounts. An attacker who compromises a customer's email inbox — through phishing, credential stuffing against the email provider, or session hijacking — gets full access to the Raxx account as a consequence. Email access tokens are phishable; passkeys are origin-scoped and not. Adding email as a fallback to a passkey-only auth system reintroduces the entire phishable-credential threat model via the recovery path.
The risk is asymmetric. The number of customers who will lose all devices and backup codes is small. The number of customers whose email accounts will be compromised over the account lifetime of the platform is not small. We do not make the majority vulnerable to protect the minority.
There is an additional GDPR angle: the email magic-link recovery flow must store a recovery token against the user record. Tokens can be compromised in transit, in storage, or through log exposure. This creates a credential-replay surface that ADR-0002 (no stored credentials) is specifically designed to eliminate.
A support agent collects identity-verification signals (date of birth, last four of payment card, account history, recent activity details) and, after a threshold of confidence, manually triggers a passkey re-enrollment link or session.
Rejected. Social engineering is a known attack against fintech support workflows. A sufficiently motivated attacker can acquire personal details (DOB, last four digits of a public card, account history gleaned from breached datasets) and use them to convince an agent that they are the legitimate account holder. At Raxx's current scale, there is no dedicated, trained trust-and-safety team capable of running this verification safely. Building the procedure before the team exists is building the vulnerability before the defense.
More concretely: the support team is the weakest link in any agent-mediated flow. Adding a procedure that requires agents to make high-stakes identity judgments under time pressure (frustrated customers, social pressure) is a procedure that will eventually be abused. We are too small to staff this safely.
A code sent to a verified phone number on file.
Rejected on three independent grounds:
A more rigorous version of agent-mediated re-enrollment, requiring more signals and a second-operator approval gate.
Not built for the same reasons as agent-mediated re-enrollment, compounded. More rigorous verification procedures create more friction in the legitimate case and do not eliminate the social-engineering risk in the attack case — they raise the bar, but a sufficiently determined attacker clears a higher bar if the reward is high enough. Financial accounts are high-reward targets. We decline to build a verification procedure that creates a documented attack recipe.
docs/security/auth-posture.md §11 — Customer account recovery policy