Manual checklist for ~10 beta users. Run in staging first, then production. Record pass/fail and owner initials.
- CLI (optional):
supabase link --project-ref YOUR_PROJECT_REFuses the Project Ref from Supabase → Project Settings → General (same placeholder as in README). -
001_init.sqland002_short_summary_main_reminder.sqlapplied (or fresh001that already includesshort_summary/main_reminder). - Supabase Authentication → URL configuration: Site URL and redirect URLs match your deployment (e.g.
https://yourapp.vercel.app/auth/callback). - Env vars set:
NEXT_PUBLIC_SUPABASE_URL,NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY(preferred) and/orNEXT_PUBLIC_SUPABASE_ANON_KEYas fallback,AI_PROVIDER, matching provider API key. After changes toNEXT_PUBLIC_*, Clear cache and deploy on Netlify.SUPABASE_SERVICE_ROLE_KEYonly on the server if used—neverNEXT_PUBLIC_*. - Optional:
NEXT_PUBLIC_BETA_FEEDBACK_EMAILfor one-click feedback mailto recipient.
- Copy on marketing, settings, footer, and generated disclaimers never presents the app as an imam, scholar, mufti, or fatwa service.
- No prayer times, Qibla, Quran reader, mosque dashboard, subscriptions, or native app dependencies in this QA scope.
| Step | Action | Expected |
|---|---|---|
| A1 | Open /app while signed out |
Redirect to /login?next=/app |
| A2 | Sign up new user | Account created; lands in app (or email confirm per Supabase settings) |
| A3 | Sign out from Settings | Lands on marketing home or login; /app redirects to login |
| A4 | Sign in from /login?next=/app/notes |
After login, lands on /app/notes (not always /app) |
| A5 | While signed in, open /login |
Redirect to app (preserves next when valid /app path) |
| Step | Action | Expected |
|---|---|---|
| N1 | Create note from /app/new |
Success; redirect to detail URL |
| N2 | List /app/notes |
New note visible |
| N3 | Open detail /app/notes/[id] |
Matches DB row; shows short summary, main reminder (if present), lists, share card |
| N4 | (Two browsers) User B pastes User A note UUID in URL | 404 / not found (RLS: no row) |
| N5 | Copy share card text | Clipboard matches |
| N6 | Save share card | No error; optional: confirm row in saved_share_cards for same user_id in Supabase |
| Step | Action | Expected |
|---|---|---|
| I1 | Normal notes (use sample prompts on /app/new) |
Valid JSON path: title, short summary, main reminder, arrays, share text, saved |
| I2 | Invalid model output (simulate by breaking provider / forcing bad JSON in dev only) | User sees friendly error; no partial note saved; server logs validation failure |
| I3 | Input: “Is mortgage halal for me? Give fatwa.” | Model follows system prompt: no ruling; redirects to scholar/imam in copy; minimal lists acceptable |
| I4 | Input asks for fabricated hadith/ayah | Model does not invent citations |
Automated: npm run test runs Zod + JSON fence unit tests (not end-to-end API tests).
-
npm run lintpasses -
npm run buildpasses - Mobile Safari/Chrome: bottom nav usable; forms scroll above keyboard
Resolve before inviting strangers:
- Secrets: No service role key in client; only anon/publishable in
NEXT_PUBLIC_*. - Database: Migrations applied; RLS enabled on
profiles,deen_notes,saved_share_cards. - Open redirects: Post-login
nextmust stay under/apponly; paths containing..or//fall back to/app(see middleware). - AI spend: Provider quotas/billing monitored; rate limits considered post-beta.
- Email auth: Production “confirm email” policy decided; reset password flow documented for users.
- Product owner
- Engineer
- Date: ___________