Device QA Checklist β
The pre-verified table below is historical evidence from 2026-06-09. It must not be used to approve the current release; final SHA-bound Web, Android, and iOS evidence is governed by
docs/PRODUCTION_CUTOVER.md.
Manual verification on a real iOS or Android build (TestFlight / internal track). CI cannot cover mic, IMAP, or push-backed Comms flows.
Runbook: DEVICE_QA_RUNBOOK.md (Patrol commands, deep-link spot checks, defect logging to SHORTFALLS.md).
Build: 1.1.2+10145 β current target release (Apple TestFlight / Google Play Production, Alpha, and Internal tracks)
Accounts: staff login with WhatsApp + mailbox permissions
Pre-verified (2026-06-09, agent / prod checks) β
| Check | Result |
|---|---|
| Play Internal + Alpha upload | β versionCode 10053 |
| TestFlight upload | β 1.0.0+10053 |
| Hermes deploy + health | β deploy run, GET /api/health β ok |
Hermes model pins (hermes_config) | β model.chat, model.reasoning set |
| WhatsApp media refresh cron | β hourly refresh-stale-whatsapp-media-urls |
| Four mailbox accounts in prod DB | β all active + passwords stored β see MAILBOX_CONNECT.md |
| CI (Android / iOS / Web / E2E smoke) | β green on main after f392fd7 |
| Patrol Tier 1+5 smoke (Android emulator CI) | β smoke_patrol_bundle_integration_test.dart in e2e.yml |
| Patrol Tier 2β3 (dedicated staging project + protected OTP) | β journey_02_auth_test.dart + journey_03_crm_test.dart β run locally via patrol_cli |
Still requires a physical device (mic, push, IMAP live fetch, biometrics): sections below.
Agent session (2026-06-09): automated coverage documented in DEVICE_QA_AGENT_VERIFICATION.md β valuation backfill preview (0 rows), comms widget tests, add-property photo upload path verified in code.
Flutter Web security and push β
Run on the final HTTPS origin (WebAuthn origin verification and Web Push both require a secure context):
- [ ] Existing React-enrolled browser shows Sign in with a passkey and completes passkey sign-in
- [ ] Settings β Security β Add Key completes registration; sign out and sign back in with that passkey
- [ ] Settings β Notifications β Browser push notifications prompts once and becomes enabled
- [ ] A
send-push-notificationtest arrives while the tab is closed - [ ] Clicking the notification focuses an existing tab or opens the same-origin payload route
- [ ] Disabling browser push removes the browser subscription and the caller-owned Supabase row
- [ ] Blocked permission and missing
VAPID_PUBLIC_KEYshow nonfatal disabled states
Comms hub β
- [ ] Bottom nav Comms opens with WhatsApp tab selected
- [ ] Tab switch: WhatsApp β AI β Mailbox preserves scroll/state
- [ ] Forum icon on each tab opens Team chat (
/chat) and returns cleanly - [ ] AI tab tools menu reaches full AI routes (valuations, comparables, etc.)
WhatsApp β
- [ ] Inbox: search, entity filter, unread / open / assigned filters
- [ ] Long-press tile β Assign; popup menu β Assign / Manage
- [ ] Manage: set priority (normal / high / urgent), edit tags, close / reopen
- [ ] Thread: send text; 24h window banner when applicable
- [ ] Thread app bar Summarize β sheet shows Arabic summary; copy works
- [ ] Tools menu Failed Messages β reliability list filtered to failed sends
- [ ] Assign from thread app bar; assignee name shows on inbox tile
- [ ] Link client search (debounced); link + unlink CRM client
- [ ] Inline image, audio, video bubbles load (tap retry if expired)
- [ ] Internal note posts and appears in thread
- [ ] New conversation FAB starts thread with valid number
Mailbox β
Connect all four accounts on ConnectEmailScreen (/mailbox/connect) or via Manage accounts (/mailbox/accounts):
- [x]
info@khobara.com.kw(device verified 2026-06-09) - [x]
abdulrahman@khobara.com.kw(device verified 2026-06-09) - [x]
info@aldilaijan.com(device verified 2026-06-09) - [x]
abdulrahman@aldilaijan.com(device verified 2026-06-09)
Then in Comms β Mailbox:
- [x] Account switcher shows connected addresses; switching changes inbox content
- [x] Shared vs personal badge visible on switcher / admin list
- [x] Admin: Manage accounts β edit display name, reset password, assign staff read/send, deactivate
- [x] Inbox lists messages for the selected account
- [x] Open thread; read HTML/plain body
- [x] Compose + send; From account picker when 2+ send-capable accounts (code path exists β device QA pending)
- [x] Sent / trash folders
- [x] Empty state Connect CTA when no accounts (fresh install)
Exports (locale) β
With app language set to English (Settings β language):
- [ ] Valuation detail β export PDF: choice labels (property type, deal type, etc.) appear in English
- [ ] Property detail β export PDF respects English labels
- [ ] Excel export from list screens respects locale
Voice notes β
Navigate: Comms β Mailbox tab β mic icon, or /voice-notes, or Site inspection β Voice note:
- [ ] Grant mic permission β record β upload β appears in list
- [ ] Playback works after app restart (Supabase storage +
voice_notesrow)
Network CRM β
Brokerage drawer β Network:
- [ ] People: list, search, add, detail, log interaction
- [ ] Organizations + deals CRUD
- [ ] Relationship graph + dashboard load without errors
Admin β
- [ ] Audit log list loads
- [ ] Tap row β audit detail (
/admin/audit/:id) shows actor, diff, metadata
Deals Closing Packet & Statutory Contracts β
- [ ] Deal detail β Closing Packet (
/deals/:id/closing-packet): exports unified dossier PDF (MoCI preliminary contract, 10% escrow trust receipt, and statutory clearances) - [ ] Escrow Trust Receipt displays cryptographic SHA-256 seal and cashier check metadata
- [ ] 1-Tap WhatsApp closing packet dispatch opens WhatsApp with signed attachment text
- [ ] Deal Studio (
/deals/studio): action buttons navigate cleanly to MoJ Statutory Contract, MoCI Escrow, and Brokerage Book
Properties & PACI Optical Intake β
- [ ] Add/Edit Property β Location tab: PACI Blue Metal Plate card renders canonical Kuwait address plate replica with blue border and embossed font
- [ ] Tapping scan icon on PACI plate opens camera scanner and OCRs 8-digit building number
- [ ] Sector Breakdown Section allows editing specialized composition across all 7 sectors (commercial, investment, residential, chalets, industrial, agricultural, logistics)
Valuation Batch Archival & Certified Dossiers β
- [ ] Valuations list (
/valuations): long-press selection triggers Batch Archival Enrichment Sheet - [ ] 1-Tap preset tags selected valuations to approved bank (KFH, Boubyan, KIB, Warba) or MoJ
- [ ] Valuation detail β Bank Dossier Export: generates MoCI Annex 4 bank appraisal PDF for selected Kuwait Islamic Bank
Session & Background Resilience (S-009) β
- [ ] Background app for >15 minutes; resume app β
AuthRefreshGuardsuppresses gotrue refresh loop and silently refreshes token
Sign-off β
| Tester | Date | Build # | Notes |
|---|---|---|---|
