← Back to Manual
How to use: Open /test/index.html in a browser. Use an incognito window for fresh-install tests. Check each box as you verify. Priority levels: Critical = must pass before any release High = should pass Medium = nice to verify Low = edge case.
| ✓ | ID | Priority | Test Description | Expected Result |
|
FI-01 |
Critical |
Open app in fresh incognito window
- Open new incognito tab
- Navigate to
/test/index.html
|
Welcome screen appears with three options: Join Existing Club, Create New Club, Just Exploring |
|
FI-02 |
Critical |
TEST CLUB seeded in background
- From welcome screen tap Just Exploring
|
App opens on main menu showing "TEST CLUB (Practice)" as active club with Timer and Ah-Counter tabs |
|
FI-03 |
High |
TEST CLUB has sample speakers
- From menu tap New Timer or Start Tracking
- Check speaker roster
|
Roster shows: JANE DOE, JOHN SMITH, MARY JOHNSON, ROBERT BROWN, SUSAN DAVIS |
|
FI-04 |
High |
No sync option visible for TEST CLUB
- Go to Settings → Clubs
- Find TEST CLUB entry
|
TEST CLUB shows "⚗ Practice club — local only, no cloud sync" instead of Enable Cloud Sync button |
|
FI-05 |
Medium |
Second fresh open still shows welcome screen
- Close and reopen incognito
- Navigate to app again
|
Welcome screen appears again (incognito cleared storage) |
| ✓ | ID | Priority | Test Description | Expected Result |
|
WS-01 |
Critical |
Create New Club flow
- Fresh incognito, tap Create New Club
- Enter "Test Org"
- Leave Practice Only off
- Tap OK
|
App opens on main menu with "Test Org" as active club. No sync enabled yet. |
|
WS-02 |
Critical |
Create New Club — Practice Only
- Fresh incognito, tap Create New Club
- Enter "Practice Org"
- Toggle Practice Only ON
- Tap OK
|
App opens. Settings → Clubs shows "Practice Org" with practice label, no sync button. |
|
WS-03 |
Critical |
Join Existing Club flow
- Fresh incognito, tap Join Existing Club
- Enter valid 8-char sync code from your club
- Tap OK
|
App opens with club name, roster populated, filler words populated, API key synced (check Settings) |
|
WS-04 |
High |
Join with invalid code
- Fresh incognito, tap Join Existing Club
- Enter "XXXX-XXXX"
- Tap OK
|
Error modal: "No club found with that code." |
|
WS-05 |
High |
Create Club with empty name
- Tap Create New Club
- Leave name blank
- Tap OK
|
Error modal: "Please enter a club name." Modal stays open. |
| ✓ | ID | Priority | Test Description | Expected Result |
|
CM-01 |
High |
Add second club
- Settings → Clubs → New Club
- Enter "Second Club"
- Tap OK
|
"Second Club" appears in club list. Can be switched to from club switcher. |
|
CM-02 |
High |
Switch active club
- Tap club name on main menu
- Select a different club
|
Header updates to new club name. Roster updates to that club's speakers. Auto-sync pulls if sync enabled. |
|
CM-03 |
High |
Delete a club
- Settings → Clubs
- Tap delete on a non-active club
- Confirm
|
Club removed from list. Its local data cleared. |
|
CM-04 |
Medium |
Rename a club
- Settings → Clubs
- Tap rename on a club
- Enter new name
|
Club name updates everywhere — menu header, footer, settings label. |
|
CM-05 |
High |
Data isolation between clubs
- Switch to Club A, add speaker "ALICE"
- Switch to Club B
- Go to Setup, check roster
|
Club B roster does not contain ALICE. Each club's roster is fully separate. |
|
CM-06 |
High |
Cannot delete active club
- Settings → Clubs
- Tap delete (✕) on the currently active club
|
Error modal: "Switch to a different club before deleting this one." Club is not deleted. |
|
CM-07 |
Medium |
Sync code masked by default
- Settings → Clubs
- Check sync code display for a synced club
- Tap 👁 icon
|
Sync code shows as ••••-•••• by default. Tap 👁 reveals full code. Tap again to re-mask. |
| ✓ | ID | Priority | Test Description | Expected Result |
|
SY-01 |
Critical |
Enable cloud sync generates code
- Settings → Clubs
- Tap Enable Cloud Sync on a non-practice club
|
8-character code appears (format XXXX-XXXX). Sync status shows "Pushed [time]". |
|
SY-02 |
Critical |
Manual Push sends roster and fillers
- Club has sync enabled
- Tap Push ↑
|
Status shows "Pushed [time]". Check Firestore console — speakers and fillers arrays updated. |
|
SY-03 |
Critical |
Manual Push includes API key
- Add API key in Settings
- Go to Clubs → Push ↑ on synced club
- Check Firestore console
|
Firestore document has apiKey field populated. |
|
SY-04 |
Critical |
Manual Pull receives API key
- Open incognito, join club by code
- Check Settings → ChatGPT API Key
|
API key field is pre-filled. Placeholder shows "Shared by club ☁". |
|
SY-05 |
Critical |
Auto-sync on app open
- On Device A: add speaker "AUTO SYNC TEST"
- On Device B (or incognito): reload app
|
"AUTO SYNC TEST" appears on Device B's roster without any manual pull. |
|
SY-06 |
Critical |
Auto-push on speaker add
- Add new speaker to synced club
- Immediately check Firestore console
|
Firestore document's speakers array updated within seconds. No manual push needed. |
|
SY-07 |
High |
Practice club never syncs
- Add speaker to TEST CLUB
- Check Firestore — no TEST CLUB document should exist or be updated
|
No Firestore activity for practice clubs. App functions normally. |
|
SY-08 |
High |
Auto-sync on club switch
- Have two clubs, one synced
- Switch to the synced club
|
Roster and fillers update from cloud automatically on switch. No manual pull needed. |
| ✓ | ID | Priority | Test Description | Expected Result |
|
WD-01 |
Critical |
Random WOD with API key
- Add valid OpenAI key in Settings
- Ah-Counter tab → Word of the Day
- Tap Random
|
Word displays with AI-generated definition and usage example. "● CHATGPT READY" indicator visible. |
|
WD-02 |
High |
Search custom word
- Type "Perspicacity" in search field
- Tap 🔍
|
Definition and example shown for "Perspicacity" specifically. |
|
WD-03 |
Critical |
Select WOD activates in tally
- Random or search a word
- Tap Select
- Go to Start Tracking → pick speaker and role
- Tap START
|
Tally grid shows word at top with gold "WORD OF DAY" badge. |
|
WD-04 |
Medium |
WOD without API key
- Clear API key in Settings
- Go to WOD screen, tap Random
|
Word displays but no definition. Prompt to add API key in Settings. |
|
WD-05 |
High |
Select WOD writes to Firestore
- Open Firebase Console → club doc
- In app, select a WOD
- Confirm modal
- Refresh console
|
Club document has wod field with word/definition/example and wodDate matching today's date string. Cloud report will use this data. |
| ✓ | ID | Priority | Test Description | Expected Result |
|
WD-01 |
Critical |
WOD accessed from Meeting Planner
- Club tab → Meeting Planner
- Tap Word of the Day card
|
WOD screen opens. Back button returns to Meeting Planner (not main menu). |
|
WD-02 |
Critical |
Random WOD with API key
- Add valid OpenAI key in Settings
- Club tab → Meeting Planner → Word of the Day
- Tap Random
|
Word displays with AI-generated definition and usage example. "● CHATGPT READY" indicator visible. |
|
WD-03 |
High |
Search custom word
- Type "Perspicacity" in search field
- Tap 🔍
|
Definition and example shown for "Perspicacity" specifically. |
|
WD-04 |
Critical |
Select WOD activates in tally
- Random or search a word
- Tap Select
- Go to Start Tracking → pick speaker and role
- Tap START
|
Returns to Meeting Planner. Tally grid shows word at top with gold "WORD OF DAY" badge. |
|
WD-05 |
Critical |
WOD banner appears on Verbal tab
- Select a WOD via Meeting Planner
- Switch to Verbal tab
|
Gold banner appears at top of Verbal tab showing word, definition, and usage example. Banner absent if no WOD is set. |
|
WD-06 |
Medium |
WOD without API key
- Clear API key in Settings
- Go to WOD screen, tap Random
|
Word displays but no definition. Prompt to add API key in Settings. |
|
WD-07 |
High |
Select WOD writes to Firestore
- Select a WOD
- Open Firebase Console → club doc
|
Club document has wod field with word/definition/example and wodDate matching today's date string. |
| ✓ | ID | Priority | Test Description | Expected Result |
|
MP-01 |
Critical |
Meeting Planner accessible from Club tab
- Switch to Club tab
- Tap Meeting Planner card
|
Meeting Planner screen opens showing WOD card, date input with instruction text, and Suggest button. |
|
MP-02 |
Critical |
Theme generation
- Open Meeting Planner
- Enter a meeting date
- Tap Suggest
|
Spinner shows briefly, then 5 theme cards appear each with a title and one-sentence relevance explanation. |
|
MP-03 |
Critical |
Theme selection reveals Table Topics section
- Generate themes
- Tap one theme card
|
Selected card highlights in blue. Table Topics section appears below with the selected theme name and Generate button. |
|
MP-04 |
Critical |
Table Topics generation
- Select a theme
- Tap Generate Table Topics
|
8 numbered questions appear, varied in style. Copy and Share buttons appear below the list. |
|
MP-05 |
High |
Copy button — plain text
- Generate table topics
- Ensure Markdown toggle is OFF
- Tap Copy
- Paste into any text field
|
Pasted text shows theme title, one-sentence description, a divider line, "Table Topics" subheading, and 8 numbered questions. No markdown symbols. |
|
MP-06 |
High |
Copy button — markdown
- Enable Markdown Export in Settings
- Generate table topics
- Tap Copy and paste
|
Output uses ## for theme title, > for reason, ### for Table Topics subheading, numbered list for questions. |
|
MP-07 |
Medium |
Selecting new theme resets Table Topics
- Generate topics for one theme
- Tap a different theme card
|
Table Topics results clear, Copy/Share buttons hide, selected theme label updates. |
|
MP-08 |
Medium |
No API key
- Remove OpenAI key from Settings
- Open Meeting Planner and tap Suggest
|
Error modal: directs user to add OpenAI key in Settings. |
|
MP-09 |
Medium |
No date entered
- Leave date field empty
- Tap Suggest
|
Error modal: "Please select a meeting date." |
| ✓ | ID | Priority | Test Description | Expected Result |
|
SA-01 |
Critical |
Admin section visible in Settings
- Open Settings
- Scroll to bottom
|
Administrator section visible with "Admin Sign In" card. No signed-in state visible. |
|
SA-02 |
Critical |
Authorized sign-in
- Tap Admin Sign In
- Sign in with authorized Google account
|
Popup completes. Settings shows green "Signed In" card with email address. Active Clubs list loads below. |
|
SA-03 |
Critical |
Unauthorized sign-in rejected
- Tap Admin Sign In
- Sign in with a Google account NOT in superAdmins collection
|
"Not Authorized" modal. User is signed out immediately. Login card reappears. |
|
SA-04 |
High |
Active Clubs list loads
- Sign in as admin
- Observe club list
|
All clubs from Firestore listed with name, sync key ID, and last updated date. |
|
SA-05 |
High |
Club filter
- Sign in as admin
- Type a club name fragment in filter
|
List narrows in real time to matching clubs. Clear filter restores full list. |
|
SA-06 |
Critical |
Delete club with confirmation
- Sign in as admin
- Tap Delete on a test club
- Confirm in modal
|
Club removed from Firestore. Row disappears from list immediately without reload. Count footer updates. |
|
SA-07 |
High |
Sign out
- Sign in as admin
- Tap Sign Out
|
Green signed-in card disappears. Login card reappears. Admin panel hidden. |
|
SA-08 |
High |
Auth persists on page reload
- Sign in as admin
- Reload the page
- Navigate to Settings
|
Admin panel shows signed-in state automatically without re-authenticating. |
| ✓ | ID | Priority | Test Description | Expected Result |
|
TM-01 |
Critical |
Full timer flow — Table Topics
- Timer tab → New Timer
- Enter "TEST SPEAKER", select TABLE TOPICS
- Tap START
- Wait through 1:00, 1:30, 2:00
- Tap Commit & Exit
|
Background: green at 1:00, yellow at 1:30, red at 2:00. Time committed to report. |
|
TM-02 |
High |
Pause and resume
- Start any timer
- At ~15 seconds tap PAUSE
- Wait 5 seconds
- Tap RESUME
|
Timer freezes exactly at pause point. Button label changes to RESUME. Tap again — resumes from exact same elapsed time. Button returns to PAUSE. Background holds color state. |
|
TM-03 |
High |
Custom timer thresholds
- Setup → select CUSTOM
- Enter Green: 1, Yellow: 2, Red: 3
- Tap OK and START
|
Background changes at exactly 1:00, 2:00, 3:00. |
|
TM-04 |
Critical |
Result saves to report
- Complete a timer with Commit & Exit
- Return to menu → Meeting Report
|
Report shows the speaker name, role, and elapsed time formatted correctly. |
|
TM-05 |
Critical |
Background resets on exit
- Run timer past red threshold
- Tap Commit & Exit
|
Background returns to default grey immediately on exit. Red does not persist to menu. |
|
TM-06 |
High |
Timer session writes to Firestore
- With synced club, complete a timer
- Check Firestore sessions subcollection
|
New session document with speaker, role, result, elapsedSeconds, type: "timer". |
|
TM-07 |
Medium |
No Firestore write for practice club
- Switch to TEST CLUB
- Complete a timer
- Check Firestore
|
No new session document in Firestore. |
|
TM-08 |
High |
Validation — no name or role
- Setup screen with empty name
- Tap START
|
Error modal: "Enter Name & Role." |
|
TM-09 |
High |
Reset button
- Start a timer, let it run to ~30 seconds
- Tap RESET
|
Clock resets to 00:00. Background returns to default. Timer immediately restarts from zero for the same speaker. |
| ✓ | ID | Priority | Test Description | Expected Result |
|
AC-01 |
Critical |
Full counter flow
- Counter tab → Start Tracking
- Select speaker and AH COUNTER role
- Tap START
- Tap AH 3 times, UM 2 times
- Tap SAVE RESULTS
|
Counts register correctly. Save confirmation modal. Session in Counter Report shows "AH: 3, UM: 2". |
|
AC-02 |
High |
Decrement does not go below zero
- Start a counter session
- Tap − on a filler that is at 0
|
Count stays at 0. No negative values. |
|
AC-03 |
High |
Session merge for same speaker
- Save a session for "KEVIN SHAN" with UM: 3
- Start a new counter session for "KEVIN SHAN"
- Tap UM 2 times
- Save Results
|
Report shows KEVIN SHAN with UM: 5 (merged, not duplicated). |
|
AC-04 |
High |
WOD card in tally grid
- Select a WOD first
- Start a counter session
|
WOD card appears at top of grid with gold border and "WORD OF DAY" badge. |
|
AC-05 |
High |
Delete filler from session
- Start counter session
- Tap red ✕ on ER card
- Confirm deletion
|
ER card removed from grid for this session only. Other fillers unaffected. |
|
AC-06 |
Medium |
Full name warning
- Setup screen, type "Kevin" (single name)
- Tap Add
|
Warning modal asking to confirm single name or go back to add last name. |
|
AC-07 |
High |
Add filler word on the fly
- Start a live counter session
- Tap the + ADD WORD card at the end of the grid
- Enter "BASICALLY", leave "Save to club list" toggled on
- Tap OK
|
BASICALLY card appears in grid with count of 1. Word added to club filler list permanently and auto-pushed to cloud. |
|
AC-08 |
Medium |
Add filler on the fly — don't save permanently
- Start a live counter session
- Tap + ADD WORD
- Enter word, toggle "Save to club list" OFF
- Tap OK
|
Word appears in current session grid at count 1. Not added to club filler list — will not appear in next session. |
|
AC-09 |
Medium |
Name input clear button
- Setup screen
- Type any text in the name field
- Tap the ✕ button inside the field
|
Field clears. Clear button disappears. Full roster list resets. |
| ✓ | ID | Priority | Test Description | Expected Result |
|
TR-01 |
Critical |
Full transcription flow
- Counter tab → Start Tracking
- Toggle Record Speech ON
- Select speaker and role, tap START
- Tap Start Recording, say "Um I think like you know this is a test"
- Tap End Speech
|
Transcript appears with filler words highlighted in red. Score and stats displayed. |
|
TR-02 |
Critical |
Merge to Counter
- Complete transcription
- Tap Merge to Counter
|
Navigates to counter display with tally pre-populated from auto-detected fillers. |
|
TR-03 |
High |
WOD highlighted in gold
- Select a WOD (e.g. "Tenacious")
- Transcribe a speech that uses the word
|
The WOD appears in gold highlight in the transcript. Other fillers appear in red. |
|
TR-04 |
High |
Filler score calculation
- Complete a transcription
- Note total words and total fillers
|
Score = fillers/words × 100. Under 5% = Excellent (green), 5–10% = Good (yellow), over 10% = Needs Work (red). |
|
TR-05 |
Medium |
No API key — transcription blocked
- Clear API key
- Enable Record Speech and try to start
|
Error shown prompting user to add OpenAI key in Settings. |
|
TR-06 |
High |
Transcription session writes to Firestore
- Merge a transcription to counter and save with a synced club
- Check Firestore
|
Session document contains fillerPct, fillerScore, totalWords, fillersPerMin, durationMins. |
| ✓ | ID | Priority | Test Description | Expected Result |
|
TS-01 |
High |
Transcript saved after merge
- Complete a transcription and merge to counter
- Save counter session
- Counter tab → Transcripts
|
Transcript list shows the speaker with date and role. |
|
TS-02 |
High |
Open and view a transcript
- Transcripts screen
- Tap a speaker name
|
Full highlighted transcript shows with filler summary, score, and Share button. |
|
TS-03 |
Medium |
Share transcript — plain text
- Markdown Export OFF in Settings
- Open a transcript, tap Share
|
Plain text shared with **double asterisks** around filler words. |
|
TS-04 |
Medium |
Share transcript — markdown
- Markdown Export ON in Settings
- Open a transcript, tap Share
|
Markdown formatted text with headers, blockquotes, bold fillers. |
|
TS-05 |
High |
Transcripts cleared with meeting data
- Have at least one saved transcript
- Settings → Clear Meeting Data → confirm
- Counter tab → Transcripts
|
Transcript list is empty. |
| ✓ | ID | Priority | Test Description | Expected Result |
|
PR-01 |
High |
Progress list loads
- Synced club with multiple sessions in Firestore
- Counter tab → Progress
|
List of speakers each showing latest filler rate, trend indicator, and session count. |
|
PR-02 |
High |
Speaker detail view
- Progress screen
- Tap a speaker with multiple sessions
|
Shows Latest, Average, Best percentages. Session-by-session log with date, role, and stats. |
|
PR-03 |
High |
Progress prompts for sync
- Practice club active
- Go to Counter tab → Progress
|
Screen shows prompt to enable cloud sync with explanation. |
|
PR-04 |
Medium |
Trend indicator accuracy
- Speaker with improving sessions (lower filler % over time)
- Check trend indicator
|
↑ Improving shown in green. ↓ Worsening in red. → Steady in grey. |
|
PR-05 |
High |
Progress filters to current roster
- Ensure a session exists for a speaker
- Delete that speaker from the roster
- Open Progress screen
|
Deleted speaker no longer appears in Progress list. Their Firestore history is preserved but hidden. |
|
PR-06 |
Medium |
Manual counter sessions in progress detail
- Save a counter session manually (no transcription)
- Open that speaker's detail in Progress
|
Session appears in detail list showing "X fillers (manual)" with per-word breakdown. Not counted in filler % average. |
| ✓ | ID | Priority | Test Description | Expected Result |
|
ST-01 |
High |
API key persists across reload
- Enter API key in Settings
- Reload page
- Return to Settings
|
API key field is still populated. |
|
ST-02 |
High |
Markdown toggle persists
- Toggle Markdown Export ON
- Reload page
- Return to Settings
|
Toggle is still ON after reload. |
|
ST-03 |
High |
Filler manager — add word
- Settings → Filler Words
- Tap Add, enter "BASICALLY"
- Confirm
|
"BASICALLY" appears in filler manager list and in counter tally grid next session. |
|
ST-04 |
High |
Filler manager — delete word
- Settings → Filler Words
- Delete "ER"
- Confirm
|
"ER" gone from list. Auto-push to cloud if sync enabled. Does not appear in next tally session. |
|
ST-05 |
Medium |
Filler changes auto-push
- Synced club
- Add a new filler word
- Immediately check Firestore
|
Firestore fillers array updated within seconds. |
| ✓ | ID | Priority | Test Description | Expected Result |
|
DM-01 |
High |
Export backup
- Settings → Backup Data
|
JSON file downloads. Contains speakers, fillers, and apiKey for active club. |
|
DM-02 |
High |
Import backup restores data
- Export backup
- Clear all data manually in DevTools
- Reload and set up fresh
- Settings → Restore Data, select the file
|
Roster, filler words, and API key all restored. Page reloads automatically. |
|
DM-03 |
Critical |
Clear Meeting Data
- Have logs, transcripts, and WOD set
- Settings → Clear Meeting Data → confirm
|
Logs cleared. WOD cleared. Transcripts cleared. Roster and filler words unchanged. |
|
DM-04 |
High |
Stale data banner appears
- Commit a session
- Manually set
last_session_ts in DevTools to 4 hours ago - Navigate to menu
|
Yellow banner appears below tabs: "Meeting data from 4h ago still saved. Clear before your next meeting?" with inline Clear button. |
|
DM-05 |
Medium |
Stale banner not shown for recent data
- Commit a session
- Return to menu immediately
|
No banner shown — data is less than 3 hours old. |
|
DM-06 |
Medium |
Stale banner Clear button works
- Trigger stale banner (see DM-04)
- Tap Clear in the banner
- Confirm
|
Meeting data cleared. Banner disappears. Roster and fillers unchanged. |
|
DM-07 |
High |
Report copy
- Have at least one logged session
- Report screen → Copy
- Paste into a text editor
|
Full report text pasted correctly, formatted per markdown toggle state. |
|
DM-08 |
Medium |
Markdown report format
- Enable Markdown Export
- Copy report
|
Report has markdown table with | Name | Role | Result | header row. |
| ✓ | ID | Priority | Test Description | Expected Result |
|
CR-01 |
Critical |
Report screen shows two tabs
- Timer tab → Meeting Report
|
Report screen shows "This Device" and "☁ Cloud" tabs. "This Device" is active by default. Local report content is visible. |
|
CR-02 |
Critical |
Cloud tab loads today's sessions from all devices
- Record at least two sessions on two different devices (or two different browsers) for the same club
- On either device, open Report → ☁ Cloud tab
|
"Loading from cloud…" briefly appears, then all today's sessions from both devices display in Name | Role | Result | By columns. Status line shows session count and load timestamp. |
|
CR-03 |
High |
WOD appears in cloud report when selected today
- Ah-Counter → Word of the Day → select any word
- Open Report → ☁ Cloud tab
|
Cloud report header includes WOD word and definition above the session table. |
|
CR-04 |
Medium |
WOD does not appear if selected on a different day
- In Firebase Console, set
wodDate on the club doc to yesterday's date string - Open Report → ☁ Cloud tab
|
Cloud report loads without a WOD section — only today's date matches. |
|
CR-05 |
High |
Refresh button re-queries Firestore
- Open Report → ☁ Cloud tab
- On a second device, commit a new session
- Tap ↺ Refresh on first device
|
Cloud report reloads. New session from second device now appears. Status line timestamp updates. |
|
CR-06 |
High |
Copy on Cloud tab copies cloud content
- Open Report → ☁ Cloud tab (with data loaded)
- Tap Copy
- Paste into a text editor
|
Pasted text is the cloud report content (not the local report). Includes all sessions from all devices. |
|
CR-07 |
Medium |
Practice-only club shows clear message
- Switch to a Practice Only club
- Open Report → ☁ Cloud tab
|
Cloud panel shows "Cloud sync is not enabled for this club. Enable it in Settings > Clubs to use Cloud Report." No Firestore query is attempted. |
|
CR-08 |
Medium |
Report tab resets to This Device on re-open
- Open Report → tap ☁ Cloud tab
- Tap Done → navigate back to Report
|
"This Device" tab is active on re-entry. Local report is shown. Cloud tab does not auto-load. |
| ✓ | ID | Priority | Test Description | Expected Result |
|
MF-01 |
Critical |
Score card shown after session ≥15 seconds
- Start a counter session for any speaker
- Wait 15+ seconds, tap 2–3 fillers
- Tap SAVE RESULTS
|
Modal shows a color-coded score card with filler %, EXCELLENT / GOOD / NEEDS WORK label, duration, and rate. Labeled "Filler Score (estimated)" with "Word count estimated at 130 wpm" footnote. Button reads "Done". |
|
MF-02 |
Critical |
No score card for sessions under 15 seconds
- Start a counter session
- Immediately tap SAVE RESULTS (under 15s)
|
Modal shows plain "Counts saved." text — no score card, no percentage. Raw counts are saved normally. |
|
MF-03 |
High |
Score color reflects filler rate
- Run a 20-second session with 0 fillers (EXCELLENT expected)
- Run a 30-second session with 3 fillers (rate ~6/min = ~GOOD)
- Run a 20-second session with 10 fillers (NEEDS WORK expected)
|
Card border and text color are green for EXCELLENT (<5%), yellow/amber for GOOD (5–10%), red for NEEDS WORK (>10%). |
|
MF-04 |
High |
Scored session appears in Progress tracker
- Complete a scored manual session (MF-01)
- Open Ah-Counter → Progress → tap the speaker
|
Session appears in history with color-coded filler percentage — same display as a transcription session. Not labeled "counted, no score". |
|
MF-05 |
High |
Scored session appears in Cloud Report counter section
- Complete a scored manual session
- Open Report → ☁ Cloud tab
|
Counter Report section shows the session. Filler breakdown visible. |
|
MF-06 |
Medium |
Unscored sessions labeled "counted, no score" in Progress
- View a speaker who has older sessions from before v3.2.3 (no fillerPct field)
- Open their progress history
|
Old sessions display as "X fillers (counted, no score)" — distinct from new sessions which show a percentage. No crashes or blank entries. |
|
MF-07 |
Medium |
Transcription path not affected
- Run a full transcription session (Record Speech on)
- Merge to Counter → Save Results
|
Transcription score card shows exact word count and exact percentage (not estimated). No "estimated" label. sessionFromTranscript prevents duplicate writeSession call. |
| ✓ | ID | Priority | Test Description | Expected Result |
|
OE-01 |
Critical |
App works fully offline
- Enable airplane mode or use DevTools offline
- Complete a full timer session
- Complete a full counter session
|
Both sessions complete normally. No errors shown to user. Results save to local logs. |
|
OE-02 |
High |
Sync fails silently offline
- Enable airplane mode
- Add a speaker to a synced club
|
Speaker added locally. No error modal. Sync failure is silent (console log only). |
|
OE-03 |
High |
Very long speaker name
- Add speaker with 50+ character name
|
Name added. UI handles long name gracefully — no overflow breaking layout. |
|
OE-04 |
Medium |
Duplicate speaker name
- Add "KEVIN SHAN" to roster
- Try to add "KEVIN SHAN" again
|
Second add is silently ignored. No duplicate in roster. |
|
OE-05 |
Medium |
Test/prod data isolation
- Add speaker "TEST ONLY" in /test/ version
- Open root / version in same browser
|
"TEST ONLY" does not appear in prod roster. Keys are fully isolated by prefix. |
|
OE-06 |
Medium |
Empty report
- Clear Meeting Data
- Open Meeting Report
|
Report shows "No data recorded." — no errors or blank screen. |
|
OE-07 |
High |
Back navigation from all screens
- Navigate to each screen
- Use Back or Cancel buttons
|
Every screen has a valid back path. No dead ends. Timer screen stops interval on exit. |
| ✓ | ID | Priority | Test Description | Expected Result |
|
PW-01 |
High |
Install to home screen (iOS)
- Open in Safari
- Share → Add to Home Screen
- Launch from home screen icon
|
App opens fullscreen, no Safari chrome. Timer icon appears on home screen. |
|
PW-02 |
High |
No horizontal scroll
- Open on phone
- Check all screens
|
No horizontal scrolling on any screen. All content fits within viewport. |
|
PW-03 |
High |
Safe area insets respected
- Open on iPhone with notch or Dynamic Island
- Check header and bottom buttons
|
Content not obscured by notch or home indicator. Bottom buttons have safe area padding. |
|
PW-04 |
Medium |
Version label displays correctly
- Check bottom of main menu
|
Shows "Version 3.2.2 (TEST)" at /test/ or "Version 3.2.2" at root. |
|
PW-05 |
Medium |
New deploy loads fresh
- Deploy a new version
- Hard refresh in existing tab
|
New version loads. Service worker network-first strategy serves fresh file. |