From 24b67f85a029d31adad426f73f0141ba1bae2668 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Fri, 15 May 2026 18:04:02 +0200 Subject: [PATCH] docs(planning): mobile audit report for auth and public surfaces --- .../research/v1427-r3c-mobile-auth-public.md | 360 ++++++++++++++++++ 1 file changed, 360 insertions(+) create mode 100644 .planning/research/v1427-r3c-mobile-auth-public.md diff --git a/.planning/research/v1427-r3c-mobile-auth-public.md b/.planning/research/v1427-r3c-mobile-auth-public.md new file mode 100644 index 000000000..7954c074f --- /dev/null +++ b/.planning/research/v1427-r3c-mobile-auth-public.md @@ -0,0 +1,360 @@ +--- +file: .planning/research/v1427-r3c-mobile-auth-public.md +purpose: Mobile capability audit — auth flows, public pages, error pages +created: 2026-05-15 +auditor: MA7 +--- + +# Mobile audit — auth and public surfaces + +## Summary + +Reviewed 11 components across the auth (`/auth/login`, `/auth/register`), +public (`/privacy`, `/about`, onboarding `[step]`), and error +(`error.tsx`, `global-error.tsx`, `error-details.tsx`) surfaces, plus +shared chrome (`AuthShell`, `OnboardingShell`, shadcn `Input` / +`Button`). + +Headline finding: `/about` was added to `proxy.ts` PUBLIC_PATHS in B3 +but not to `AuthShell.tsx` PUBLIC_PATHS, so an unauthenticated visitor +is bounced to `/auth/login` before the GeoLite2 CC BY-SA 4.0 +attribution can render — a licence-compliance regression on an +otherwise-public route. Register page also missed the WCAG 2.5.5 tap- +target lift the login page received; the entire form submits through +a 36 px button. Long-form public pages have no TOC, no breakout on +hostnames / code identifiers, and no safe-area insets on their sticky +header — concrete iOS-PWA pain coming in v1.5. + +17 findings total: 2 Critical, 5 High, 7 Medium, 3 Low. + +## Findings + +### F1 — `/about` bounces unauthenticated visitors to sign-in +- Severity: Critical +- Axis: logic +- File: `src/components/layout/auth-shell.tsx:14` +- Symptom: B3 made `/about` a public path in `src/proxy.ts:35` so the + bundled GeoLite2 CC BY-SA 4.0 attribution is reachable without an + account. The client-side `AuthShell` PUBLIC_PATHS still reads + `["/auth/login", "/auth/register", "/privacy"]`. An unauthenticated + visitor hitting `/about` clears the proxy, hydrates `AuthShell`, + fails the `isPublicPage` check, and is redirected to `/auth/login`. + The CC BY-SA 4.0 attribution requirement is silently broken. +- Evidence: `src/proxy.ts:32-35` vs `src/components/layout/auth-shell.tsx:14`. +- Recommended fix: Add `"/about"` to the `PUBLIC_PATHS` constant; also + add it to `isStandalonePublicPage` (line 28) so the page renders + edge-to-edge with its own header/footer instead of inside the + centered login-card wrapper. +- Effort: S + +### F2 — Register page CTAs sit below the 44 px tap-target floor +- Severity: Critical +- Axis: visual +- File: `src/app/auth/register/page.tsx:132` +- Symptom: Login page (`src/app/auth/login/page.tsx:136-205`) bumps every + CTA to `size="lg"` + `min-h-11` after WCAG 2.5.5 work landed. Register + page shipped the same release, but its primary submit button kept the + default `h-9` (36 px). Three other auth surfaces follow this pattern + in lockstep; register is the asymmetric outlier. +- Evidence: Grep `min-h-11` shows zero matches in `register/page.tsx`. +- Recommended fix: Mirror login — `size="lg" className="min-h-11 w-full"` + on the submit `