# Dashboard `auth.verification` page — Ory Elements verification flow

w4/m7 turned Kratos's verification flow on (`selfservice.flows.verification.enabled: true`, courier live) and both kratos values files point `verification.ui_url` at `/auth/verification` — but `dashboard/src/routes/` has **no** `auth.verification` route, so the verification email's link dead-ends on the catch-all (`$.tsx` 404). m7 proved verification via the API flow only (`scripts/auth-mail-e2e.sh`); this note closes the remaining human-facing gap.

Scope: add `dashboard/src/routes/auth.verification.tsx` — a mirror of `auth.reset-password.tsx`/`auth.forgot-password.tsx` rendering `@ory/elements-react`'s verification flow component (a `VerificationPage` under `src/features/auth/pages/`, using `useOryFlow`/`useOryConfig` like the sibling pages), reading the `flow`/`code` search params Kratos appends. Don't hand-roll the form — Ory Elements already tracks the enabled methods (`dashboard/CLAUDE.md`).

Sub-hour, so an inbox note rather than a milestone: one route + one page component + i18n keys + a route test, no bex-api surface (Kratos-owned, like login/recovery). Verify by driving a browser through signup → click the emailed verification link → lands on a working page → address shows verified (the manual click-through m7 deferred).

**Promote to a milestone only if** scope grows past ~1h (e.g. a "resend verification" affordance, or a post-verification onboarding redirect).

Source: w4/m7 closeout (README 2026-07-11 note); see `docs/ADR012-auth.md` §11.

---

**Done 2026-07-12.** Shipped `src/routes/auth.verification.tsx` + `src/features/auth/pages/verification-page/` rendering `@ory/elements-react`'s `<Verification>` via `useOryFlow("verification", …)` (extended `use-ory-flow.ts`'s `OryFlowMap`/`getFlow`/`createFlow` for the verification kind — no auth guard, since a just-registered user may hold no session and the email link opens from anywhere), with en/zh i18n keys and a 3-case page test (requests the verification flow; skeleton→form states). `yarn typecheck` clean for the new files (two pre-existing unrelated errors in `slider.tsx`/`autoscaling-section.tsx` from a missing `@radix-ui/react-slider` dep), eslint clean, 87 auth+hook tests green. The live browser click-through (signup → emailed link → verified) remains the standing manual check, as with m7.
