Prioritized Checklist
Blockers
Core UX
Nice-to-have
Repro Steps
- Checkout codes
- Log in as student, progress to checkout
- Apply
NP12345 or MENTO12345
- Observe price mismatch and failed completion
- Intake loop
- Complete required intake steps
- Attempt to open
/dashboard/student
- Note redirect back to intake flow
- Student messages
- Open student dashboard messages panel
- Enter text and click "Send"
- Console shows no network call, message not persisted
- Admin CSV export
- Navigate to admin finance view
- Adjust filters and click "Export CSV"
- Button does nothing, no download initiated
- Preceptor match actions
- Open preceptor dashboard matches list
- Click "Accept" or "Decline"
- Button remains disabled and no toast appears
Acceptance Criteria
- Discounts
NP12345 and MENTO12345 reliably update totals, succeed end-to-end, and grant access without manual intervention
- Checkout flow produces deterministic idempotency keys; repeated submissions succeed without
idempotency_error
- Intake completion flips access flag and RoleGuard routes users correctly per role
- Dashboard actions (messages, billing, finance filters, match actions) trigger Convex mutations/actions, update UI optimistically, and surface success/error toasts
- Loading, empty, and error states display accessible skeletons/placeholders; no console errors in happy paths
- Stripe, Netlify, and Sentry telemetry verified clean after fixes (no new dashboard-route errors)
- Playwright happy-path coverage exists for checkout (both codes), messaging send/read, and admin discount init
Local & CI Commands
npm run type-check
npm run lint
npm run test:unit:run
npm run test:e2e
Prioritized Checklist
Blockers
NP12345should yield $0.00 and immediate dashboard access → currently reports partial balance and leaves user in pending state → ensure promotion logic zeroes total and bypasses payment-required gatesMENTO12345should apply 99.9% reduction and surface updated total in UI → currently shows full price and fails on confirmation → wire promotion code lookup and totals displayidempotency_error→ currently duplicate attempts fail after partial session creation → derive idempotency keys from hashed payloadCore UX
Nice-to-have
data-testidattributes to critical actionsRepro Steps
NP12345orMENTO12345/dashboard/studentAcceptance Criteria
NP12345andMENTO12345reliably update totals, succeed end-to-end, and grant access without manual interventionidempotency_errorLocal & CI Commands