Purpose: Full platform human test checklist for LeadrWispr App Version: 0.5.65 Last Updated: 2026-02-13 Estimated Time: ~4 hours (full), ~15 min (smoke test)
Quick sanity check before deeper testing:
-
npm startlaunches without crash - Sign in with email/password succeeds
- Org loads, settings accessible
- Start AI session with any profile — audio captures, responses stream
- End session — history saves
- DevTools console has no critical errors
- Sign up with new email + password creates account
- Duplicate email shows error
- Invalid email format rejected
- Sign in with valid credentials succeeds
- Wrong password shows error
- Unregistered email shows error
- Session persists across app restart (refresh token in keytar)
- Sign out clears session, returns to auth view
- "Sign in with Google" opens browser to Google consent screen
- After consent, redirects to
leadrwispr.vercel.app/auth/callback - Callback page shows 3-state flow: redirecting (300ms) → success (2s) → manual fallback
- Deep link
leadrwispr://auth/callback#access_token=...opens app - App receives tokens, signs in successfully
- Manual fallback button works if deep link fails
- "Forgot password" link shows reset form
- Submit sends reset email
- Reset link in email allows setting new password
- New password works for sign in
- View profile shows email + name
- Update name saves and persists
- Change password with correct current password works
- Change password with wrong current password fails
- Create new org succeeds, appears in switcher
- Org name editable by owner/admin
- Delete org (owner only) removes org
- Non-owner cannot delete org
- Org switcher dropdown shows all orgs
- Switch org reloads preferences, API keys, subscription
-
lastSelectedOrgIdpersisted — correct org loads on relaunch - Runtime config cache cleared on switch (no stale provider config)
- Admin: invite member by email — invite email sent
- Admin: invite with role (admin, member) — role set correctly
- Invitee: accept invite from pending invites dialog
- Invitee: decline invite removes it
- Admin: update member role works
- Admin: remove member kicks user
- Member: leave org removes self
- Admin: cancel pending invite deletes it
- Admin: regenerate invite token creates new token
- Pending invite dialog shows on app launch if invites exist
- Accept invite adds user to org
- Dismissed invites don't re-show until new invites arrive
- Admin: audit log section shows preference changes
- Log entries include: user, timestamp, old/new values, setting key
- Subscription card shows plan type + status
- Free plan limits visible
- Paid plan shows seat count + renewal date
- "Upgrade" button opens Stripe checkout
- "Manage subscription" opens Stripe portal
- Seat management: preview proration before changing seats
- Plan change: preview proration before upgrade/downgrade
- Sync subscription refreshes status from Stripe
- Session count tracked in
limits.json - Launch modal (expired trial): appears on app startup, shows session count, dismissible via X/backdrop/ESC/"Maybe Later", "Upgrade Now" opens browser, only appears once per launch
- Session blocker modal (expired trial): appears on session start attempt, NOT dismissible (no X, no backdrop/ESC close), "Upgrade Now" opens browser, "Maybe Later" returns to main view, blocks session repeatedly
- Session count = 0: fallback message shown
- Session count = 1: singular "1 AI session"
- Both modals display correctly in dark mode
- Get call usage returns session count + reset date
- Session start increments count
- Can-start-session check blocks when over limit
- Correct provider used per feature (liveAudio, imageAnalysis, insights, promptEnhancer, callGrading)
- Changing provider in settings → used in next session
- Runtime config cache invalidated after settings change (no stale provider)
- Enable fallback toggle in settings
- Missing API key → fallback to other provider
- API error → fallback to other provider
- Renderer receives
provider-fallback-notificationwith{ feature, from, to, reason } - Both providers fail → "both providers failed" notification
- Initialize session starts Gemini Live API connection
- Audio streams as PCM chunks
- Proactive audio toggle works (provider speaks unprompted)
- Context compression toggle works
- Session ends gracefully on stop
- Session error triggers fallback to OpenAI
- Initialize session starts WebSocket Realtime API
- Audio streams correctly
- Whisper transcription returns text
- WebSocket reconnects on disconnect
- Session ends gracefully
- Gemini:
generateContentStream()returns streaming response - OpenAI: Chat Completions with vision returns response
- Screenshot sent with prompt → AI describes/analyzes it
- Insights enabled toggle in preferences
- Gemini: Gemma model generates insight chips
- OpenAI: GPT-4o-mini generates insight chips
- Chip types render with correct styling:
next_step(emerald/green, ArrowRightIcon)avoid(red/rose, XCircleIcon)opportunity(blue/indigo, StarIcon)warning(amber/yellow, AlertTriangleIcon)tip(violet/purple, LightbulbIcon)
- Chips hidden when
insightsEnabledis false
- Grade session analyzes conversation → returns score 0-100 + categories
- Grade includes strengths, weaknesses, quotes
- Grade saved to cloud
- Grade badge shows letter grade (A/B/C/D/F) with color
- Grade detail modal shows rubric breakdown
- Get rubric returns profile-specific criteria
- Gradable profiles: interview, sales, meeting, presentation, negotiation
- User average grade calculation works
- Grading completion toast appears, click navigates to session
- AudioWorkletProcessor registers on page load
- Audio samples buffered at target chunk duration (~100ms)
- Float32 → Int16 PCM conversion works
- Base64-encoded chunks sent to main process
- No
ScriptProcessorNodedeprecation warnings in console - Audio capture starts/stops cleanly with session
- Get capture sources returns available screens/windows
- Screen capture with system audio works
- Screen capture without audio works (video only)
- Capture protection toggle (macOS): hide window from capture
- Auto mode + auto trigger: context frames sent to realtime automatically
- Auto mode + camera trigger + text: context + query + UI update
- Manual mode + camera trigger: silent context send (no streaming response)
- Camera button triggers screenshot analysis
- Select profile → "Start Session" button enabled
- Custom prompt field accepts text
- Language dropdown changes language
- Session creates cloud session (if sync enabled)
- AI provider initializes
- View switches to Assistant view
- Session blocked if trial expired (blocker modal)
- Audio capture running — visualizer shows waveform
- Processing stage indicator: listening / responding
- AI responses stream in real-time with teleprompter formatting
- Markdown renders: bold, bullets, code blocks
- Insight chips appear after responses (when enabled)
- Response navigation (prev/next) works
- Screenshot analysis triggered by capture mode settings
- "End Session" stops AI connection + audio capture
- Session saved to local history (IndexedDB)
- Cloud session marked complete (if sync enabled)
- Post-session grading triggers (if gradable profile)
- All sessions load (local + cloud)
- Session cards show: date, profile, duration, message count
- Cloud sessions show "Synced" badge
- Click session → detail view with messages
- Delete session removes from list + storage
- Empty state shown when no sessions
- User messages on right, assistant on left
- Screen analysis messages interleaved correctly
- Odd message counts (orphaned user/assistant) don't crash
- Export transcript downloads .txt file
- Session grade badge shown if graded
- Grade detail modal shows rubric scores + quotes
- Custom session title editable
- "Sessions syncing to cloud" badge visible when sync enabled
- Cloud session details load immediately on initial open (no empty state)
- Partial load failure: one session fails → others still show (Promise.allSettled)
- Message counts in Supabase match actual (DB trigger, not client-side)
- 5 feature cards: liveAudio, imageAnalysis, insights, promptEnhancer, callGrading
- Provider dropdown per feature (Gemini / OpenAI)
- Model dropdown per feature (updates based on provider)
- AI provider fallback toggle
- Gemini Live coupling: Image Analysis disabled when liveAudio is Gemini
- Changes persist after reload
- 6 profile sections: interview, sales, meeting, presentation, negotiation, exam
- Custom prompt textarea per profile
- Magic Prompt button (sparkle icon): opens modal, accepts context, generates prompt, preview with try-again/use-this
- Quick Setup with AI button on all profiles → opens Profile Setup Wizard
- Tier 1 — Constrained controls:
- Response format: quick_bullets / conversational / framework_based
- Tone: assertive / balanced / consultative
- Language complexity: technical / balanced / simple
- Framework dropdown (shown when framework_based selected): SPIN, BANT, Challenger, MEDDIC, Sandler
- DiSC style: D / i / S / C
- Behavior rules checkboxes: acknowledge_objections, social_proof, no_unprompted_discount, confirm_decision_maker, timeline_before_pricing, summarize_next_steps
- Tier 2 — Guided context: productInfo, customerProfile, talkTrackExamples (textareas)
- Tier 3 — Advanced: customRules, systemPromptOverride (collapsible section)
- Auto-save on change with "saving" indicator
- System prompt override bypasses all other config when set
- API key check — shows error if no key configured
- Confirmation dialog if existing config would be overwritten
- Profile-specific questions:
- Interview: 4 questions (STAR Method)
- Sales: 5 questions (SPIN/BANT)
- Meeting: 3 questions (SCQA)
- Presentation: 4 questions (Monroe's Sequence)
- Negotiation: 4 questions (Harvard Principled)
- Exam: 2 questions (Feynman Technique)
- Keyboard navigation: Enter to advance, Escape to cancel
- Loading state shows profile-specific emoji
- Generated config applies correctly
- Generated prompt text applies correctly
- Capture mode: auto / manual
- Camera trigger toggle
- Google search toggle
- Gemini API key input — masked display
- OpenAI API key input — masked display
- Key validation on blur — shows success/error
- Keys encrypted via
electron.safeStoragebefore disk write - Keys synced to cloud (org-wide)
- Non-admin: cannot see/edit API keys
- AI Models section mirrors personal settings structure
- Set org default → members inherit as baseline
- Sales profile config section shows when sales profile expanded
- Org defaults persist to Supabase
- Lock toggle per setting prevents member overrides
- Lock requires org API key configured — error if missing
- Member views locked setting → lock indicator visible
- Member tries to save locked setting → alert, save rejected
- Admin unlocks → member's previous override reactivates
- Atomic lock check via
set_personal_override_with_lock_check()RPC
- Member list shows all members with roles
- Invite member sends email
- Update member role works (admin only)
- Remove member kicks user (admin only)
- Subscription status card
- Upgrade/manage buttons
- Seat management with proration preview
- Toggle "Session History Sync" ON/OFF
- Privacy notice on enable
- Audit log entry created for toggle
- Sync status indicator shows online/offline/error
- Profile & Security: email, name, change password
- Appearance: dark mode toggle — smooth transition
- Keyboard shortcuts: view + remap all keybinds
- Sign out button
- Audio device selection
- Advanced/debug options
- Bug report submission
- Current version display
- Check for updates button
- Personal override → org default → system default
- Personal workspace mode: loads/saves via local IPC
- Org workspace mode: receives from parent, respects locks
- Badge shows "Personal override" vs "Org default"
- Switch control to enable/disable override
- Whole-object override (not field-level merge)
- Override toggle auto-saves
-
isLockedOR!isOverrideEnabled→ controls disabled
- Different org defaults load per org
- Personal overrides specific to each org
- Device-local settings unchanged across orgs
- Soft delete preserves overrides on org leave/rejoin
- Default size: 1000x680
- Saved bounds restored on relaunch
- Centers at top of screen if no saved bounds
- Frameless window with custom title bar
- Always-on-top during active session
- Resizable within bounds: min 700x500, max 1400x900
- Stealth mode hides from taskbar (Windows) / dock (macOS)
- Minimize button works
- Maximize/restore button works
- Close button quits app
- Title bar drag region allows window dragging
Test each shortcut (default keybinds, verify remapped ones too):
- Toggle visibility (Cmd/Ctrl+Shift+W): show/hide window
- Toggle click-through (Cmd/Ctrl+Shift+X): ignore mouse events
- Next step (Cmd/Ctrl+Shift+N): advance tour step
- Previous response (Cmd/Ctrl+Shift+[): navigate response history
- Next response (Cmd/Ctrl+Shift+]): navigate response history
- Scroll up (Cmd/Ctrl+Shift+Up): scroll content
- Scroll down (Cmd/Ctrl+Shift+Down): scroll content
- Emergency erase (Cmd/Ctrl+Shift+E): clear session content
- Movement (Cmd/Ctrl+Shift+Arrows): move window position
- Custom keybind remapping works and persists
- Triggers on first app launch
- Org setup steps show if no orgs
- API key setup steps show for all users
- Admin-only steps skipped for non-admins
- Progress saved to storage
- Can skip tour
- Confetti on completion
- Triggers on first session start
- Profile selection step highlights profiles
- Start session step triggers demo mode
- Demo mode streams fake responses (variable delays)
- Demo respects
insightsEnabledpreference - Progress saved
- Triggers after first session ends
- History tab step highlights history
- Completion flag set
- Overlay dims background
- Tooltip positions correctly (auto above/below/left/right based on viewport)
- Skip button works
- "Finish later" adds step to list
- "Check for updates" queries update server
- Update available → notification in renderer
- Download progress shown
- "Quit and install" restarts with new version
- Auto-download disabled (manual trigger only)
- Rollback available check returns info
- Download rollback downloads previous version
- Install rollback installs previous version
- Rollback progress shown in renderer
- What's New dialog shows on version update
- Release notes from
release-notes.jsondisplayed - Dialog dismissible
- Extract text from PDF → returns content
- Extract text from DOCX → returns content
- Extract text from TXT → returns content
- Unsupported format → error message
- Toggle ON → privacy notice → syncing begins
- Toggle OFF → new sessions stay local only
- Audit log entries for enable/disable
- Start session → check
synced_sessionstable in Supabase - Send messages → check
synced_session_messagestable - Message count auto-incremented by DB trigger
- End session → session marked complete in cloud
- Users who leave org can't insert messages into old sessions (RLS)
- Failed sync operations queued → retry works
- Clear failed operations works
- Sync status indicator reflects state
- Migrate local sessions to cloud copies data
- Has local data check works
- Migrate local credentials copies API keys to cloud
- API keys encrypted via
electron.safeStoragebefore disk write - Format:
{ encrypted: base64_string, version: 1 }incredentials.json - Decryption on read
- Plaintext auto-migration to encrypted on first launch after upgrade
- Fallback to plaintext if encryption unavailable
- Legacy
apiKeyfield migrated togeminiApiKey
- Window navigation blocked for non-
file://URLs -
window.open()denied — external links open in system browser - External URLs from renderer open via
shell.openExternal()
- User-provided prompt text sanitized before interpolation
- System-level instruction patterns stripped
- Injection phrases removed
- Field length limits enforced
- Non-admins can't access admin features (org defaults, locks, API keys)
- Users can't access other users' data
- Credentials INSERT/UPDATE/DELETE restricted to owner/admin
- Locked settings can't be overridden via API
- Atomic lock check prevents race conditions
- Light mode: all screens render correctly
- Dark mode: all screens render correctly
- Toggle dark mode: smooth transition, no flash
- OKLCH color space renders correctly
- Typography: correct sizes, weights, spacing
- Narrow window (700px): layout adapts, no overflow
- Wide window (1400px): content doesn't stretch awkwardly
- Modals center correctly at all sizes
- Sidebar navigation works at all widths
- Buttons: hover states, active states, disabled states
- Toggles: visual feedback on change
- Dropdowns: open/close smoothly, correct options
- Tooltips: appear on hover (InfoTooltip auto-positions above/below based on viewport)
- Form validation: inline errors shown
- Corner ribbon badges render correctly (
absolute -top-1 -right-8 rotate-45) - Icon buttons: indigo theming with hover states
- App startup time: < 3 seconds
- Settings page load: < 1 second
- Session start time: < 2 seconds
- AI response latency: reasonable for streaming
- History load (50+ sessions): < 2 seconds
- No memory leaks after 30 min usage (check Task Manager / Activity Monitor)
- No console warnings/errors during normal usage
- Runtime config cache reduces repeated API calls (check network tab)
- Lazy-loaded provider modules don't slow startup
- App launches from installer/shortcut
- Taskbar visibility controlled by stealth mode
- Global shortcuts register correctly
- Screen capture works (select screen/window)
- System audio capture works
- Auto-update downloads .exe installer
- Tray icon works (if applicable)
- App launches from .app bundle
- Dock visibility controlled by stealth mode
- Screen recording permission requested on first capture
- Microphone permission requested on first audio capture
- System audio capture works (after permission)
- Auto-update downloads .dmg
- Capture protection hides window from screen recording
- AppImage runs correctly
- .deb package installs and launches
- Global shortcuts register
- Screen capture works
- Audio capture works
- Homepage loads at
leadrwispr.vercel.app - SEO metadata: Open Graph, Twitter Card present
- Sitemap + robots.txt accessible
- Sales-focused headline renders
- Stats row with icons visible
- Interactive stacked screenshots:
- Left image (
app-light.png) rotates on hover (-6deg → 0) - Right image (
app-session.png) rotates on hover (-3deg → 0) - Scale transitions (1.05 active, 0.95 sibling)
- Z-index switches (z-30 active)
- Floating labels below each
- Left image (
- CTA button links to download section
- Features: 8 cards with sales-specific copy + Lucide icons
- Profiles: 6 cards, Sales has "Most Popular" badge + emerald ring
- How It Works: 4 steps render
- Download: platform-specific buttons, version from GitHub Releases API
- Footer: links work, copyright year correct
-
/auth/callbackextracts hash fragment from URL - Redirects to
leadrwispr://auth/callback#access_token=... - 3-state flow: redirecting → success → manual fallback
- Manual fallback button retries deep link
- Latest release fetched from
hmseeb/leadrwispr-releases - ISR revalidation: 1 hour
- Asset detection: .exe (Windows), .dmg (macOS), .AppImage/.deb (Linux)
- Missing release: "Latest Release" without version number
- Encryption migration doesn't crash on first launch (plaintext → encrypted)
- History loads sessions with odd message counts
- History loads sessions with screen analysis messages
- Cloud session details load immediately (not empty on first open)
- Message counts in Supabase accurate (DB trigger)
- Ex-org-members can't insert messages into old sessions (RLS)
- History shows partial results when one session fetch fails (Promise.allSettled)
- Provider selection respected after settings change (cache cleared)
- AI generation handlers find org-level API keys (org context set)
- SalesProfileConfig doesn't error when no org default exists (system defaults fallback)
- No
ScriptProcessorNodedeprecation warnings - Audio capture works with new
AudioWorkletProcessor - Audio quality unchanged (same PCM format)
- Old config files migrate correctly
- Plaintext credentials auto-migrate to encrypted
- No data loss during app updates
- Legacy
apiKeyfield migrated togeminiApiKey
- Offline: app functions with cached/local data
- Network loss during session: graceful degradation, error shown
- Network restored: sync resumes
- Slow connection: loading states visible
- Missing API key → clear error message (not cryptic)
- Invalid API key → validation error on settings page
- Rate limit → user-friendly message
- Provider timeout → fallback (if enabled) or error
- Empty org (no members): app doesn't crash
- Empty history: proper empty state
- Large history (100+ sessions): performance OK
- Special characters in messages: display correctly
- Emoji in messages: render correctly
- Promoted to admin: Org Defaults section appears
- Demoted from admin: Org Defaults section disappears
- Removed from org: fallback to personal workspace
- Org deleted: graceful handling
Test Date: ________ Tester: ________ Platform: Windows / macOS / Linux Version: 0.5.65
| # | Area | Status | Critical Issues | Notes |
|---|---|---|---|---|
| 1 | Authentication | ⬜ Pass / Fail | ||
| 2 | Org Management | ⬜ Pass / Fail | ||
| 3 | Subscription & Billing | ⬜ Pass / Fail | ||
| 4 | AI Providers & Sessions | ⬜ Pass / Fail | ||
| 5 | Audio Capture | ⬜ Pass / Fail | ||
| 6 | Screen Capture | ⬜ Pass / Fail | ||
| 7 | Session Flow (E2E) | ⬜ Pass / Fail | ||
| 8 | History View | ⬜ Pass / Fail | ||
| 9 | Settings — Personal | ⬜ Pass / Fail | ||
| 10 | Settings — Workspace | ⬜ Pass / Fail | ||
| 11 | Settings — Account | ⬜ Pass / Fail | ||
| 12 | Preference Hierarchy | ⬜ Pass / Fail | ||
| 13 | Window Management | ⬜ Pass / Fail | ||
| 14 | Tour / Onboarding | ⬜ Pass / Fail | ||
| 15 | Updates & Rollback | ⬜ Pass / Fail | ||
| 16 | Session Sync (Cloud) | ⬜ Pass / Fail | ||
| 17 | Security | ⬜ Pass / Fail | ||
| 18 | UI/UX | ⬜ Pass / Fail | ||
| 19 | Performance | ⬜ Pass / Fail | ||
| 20 | Platform-Specific | ⬜ Pass / Fail | ||
| 21 | Website | ⬜ Pass / Fail | ||
| 22 | Regressions | ⬜ Pass / Fail | ||
| 23 | Error Handling | ⬜ Pass / Fail | ||
| 24 | Call Grading | ⬜ Pass / Fail |
| # | Severity | Area | Issue | Steps to Reproduce | Status |
|---|---|---|---|---|---|
| 1 | |||||
| 2 | |||||
| 3 |
Severity: Critical / High / Medium / Low
- All critical tests pass
- No blocking issues found
- Known issues documented
- Performance acceptable
- Ready for release
Approved by: ________ Date: ________
Use this space for additional observations, context, or recommendations: