From e2366e5e145266a0a0a734a3a3450af0622153d2 Mon Sep 17 00:00:00 2001 From: DC Date: Fri, 3 Jul 2026 14:23:12 -0600 Subject: [PATCH] docs: add in-browser UI verification convention to AGENTS.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Require confirming UI root causes in-browser before fixing, and verifying at mobile + desktop breakpoints after — targets redo cycles from breakpoint/root-cause assumptions. Co-Authored-By: Claude Fable 5 --- AGENTS.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index ff83729..0a124b3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -63,6 +63,10 @@ Why all three fields rather than just `member_num`: VisualAX's `member_num` is f - **App:** Next.js App Router, server components by default; gated routes use `export const dynamic = "force-dynamic"`. Key routes: `/events/[slug]`, `/leaderboard[/year]`, `/drivers/[id]`, `/admin` + `/admin/ingest`, `/me`. Leaderboard logic lives in `src/lib/leaderboard.ts`, `season-leaderboard.ts`, `entry-best.ts`, `driver-history.ts` — pages call these, not inline Prisma aggregation. - **Auth:** MSR (MotorsportReg) OAuth 1.0a (`src/lib/msr.ts`, `msr-endpoints.ts`) + `iron-session` cookies (`src/lib/session.ts`). Member gating checks the user's MSR orgs against `MSR_RMR_ORG_ID`; admin gating checks `ADMIN_MSR_UIDS` (`src/lib/admin.ts`). Full surnames are never stored in the session. +## UI changes + +Before implementing a UI/layout fix, confirm the actual root cause in-browser first (chrome-devtools MCP is configured) — don't fix the element you assume is responsible. After implementing, verify at both mobile and desktop breakpoints and confirm the responsive layout matches the existing pages. + ## Domain invariants (easy to get wrong) - **One class per driver per event.** A co-drive is a *separate* `Driver` row (number-suffix convention, e.g. `34` + `34X`), never the same driver in two classes at one event. `Entry` is intentionally **not** unique on `(eventId, driverId)`.