UI notes — needs outside the UI scope (for the control-plane owner)
- Lighthouse mobile LCP sits at ~3.2–3.4 s (desktop 0.7 s) under Lighthouse's simulated slow 4G: the serif web font (Newsreader, 58 KB regular + 64 KB italic even as static instances) delays the final text paint. Options if a lower simulated-mobile LCP is required: subset Newsreader with
unicode-range/ a smaller display serif, or servefont-display: optionalfor the serif (costs the serif on first slow-network visits). - SEO category < 70 locally only because
STAGING_MODE=1setsnoindex(is-crawlableaudit); production is indexable. loading.tsxboundaries were removed from/researchand/research/[slug]: with a streaming loading shell Next.js answers200beforenotFound()runs, so unknown papers returned 200 (e2e caught it). If skeletons are wanted again, wrap the slow part in<Suspense>inside the page instead of a route-level loading file.- The pdf.js worker is copied to
apps/web/public/pdf.worker.min.mjs(same-origin, CSP-safe). Keep it in sync whenpdfjs-distis bumped (cp node_modules/pdfjs-dist/build/pdf.worker.min.mjs public/). - The admin password used by the e2e suite (
Rotated-Passphrase-2026!x) is the rotated local one;tests/e2e/shots.mjstakesADMIN_PASSWORDfor admin screenshots.