Use this checklist before each MVP release. Record browser, device, viewport, app version, and tester name at the top of the test run.
Test run:
- Date:
- Tester:
- App version:
- Browser/device:
- Build/commit:
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Run
npm installif dependencies are not installed. - Run
npm run build. - Review terminal output.
- Run
- Expected result:
- Build completes successfully.
- No fatal Vite, SvelteKit, PWA, or TypeScript errors.
- Static output is written to
build/.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Run
npm run check. - Review
svelte-checkdiagnostics.
- Run
- Expected result:
svelte-checkreports 0 errors and 0 warnings.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Run
npm run lint. - Review output.
- Run
- Expected result:
- Lint command completes successfully.
- No blocking diagnostics are reported.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Run
npm test -- --run. - Review test output.
- Run
- Expected result:
- All Vitest suites pass.
- No skipped or failing tests unless explicitly documented for the release.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Run
npm run build. - Run
npm run preview. - Open the preview URL in Chrome.
- Open DevTools Console.
- Run
- Expected result:
- App loads the dashboard.
- No console errors appear on first load.
- Main navigation is visible and usable.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Create a target if none exists.
- Open Timer or tap the dashboard start session action.
- Select a target.
- Leave duration at 25 minutes.
- Start the session.
- Expected result:
- Session starts immediately.
- Countdown displays
25:00or begins at the correct remaining time. - Target name is visible.
- Pause, Abandon, and Complete Early controls are available.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Start a new session.
- Select Custom duration.
- Enter a valid custom duration.
- Start the session.
- Expected result:
- Timer starts with the custom duration.
- Planned duration is persisted on the session.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Start a new session.
- Select a vulnerability template such as SSRF or XSS.
- Start and complete the session early.
- Check the session history and stats grouping.
- Expected result:
- Selected template is shown during the timer.
- Completed session is associated with the selected template.
- Vulnerability stats include the selected template.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Start a session.
- Let it run for at least 5 seconds.
- Tap Pause.
- Wait 10 seconds.
- Tap Resume.
- Expected result:
- Timer freezes while paused.
- Resume continues from the paused remaining time.
- Session status returns to running.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Start a session.
- Tap Complete Early.
- Fill an optional quick note.
- Select one or more tags.
- Save session.
- Expected result:
- Completion modal appears.
- Saved session status is completed.
- Dashboard stats update after saving.
- Quick note and tags are visible in session history/details.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Start a short custom session suitable for manual testing.
- Leave the timer running until it reaches zero.
- Observe the completion flow.
- Expected result:
- Timer reaches zero without going negative.
- Completion modal opens automatically.
- Saved session is counted in completed sessions and streak stats.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Start a session.
- Abandon before half the planned duration has elapsed.
- Confirm the abandon action if prompted.
- Review session history and stats.
- Expected result:
- Session status is abandoned.
- Session appears in history with abandoned status.
- Session does not count toward completed stats, streak, or testing time.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Start a short custom session.
- Wait until more than half the planned duration has elapsed.
- Try to abandon the session.
- Expected result:
- App prevents invalid abandoned state or handles it as a completion/early completion path.
- No invalid session is saved.
- No console errors occur.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Start a short session.
- Background the browser tab or switch apps for at least 60 seconds.
- Return to HuntFlow.
- Expected result:
- Timer reflects elapsed wall-clock time.
- Timer does not simply pause because the tab was backgrounded.
- If duration elapsed while backgrounded, completion flow appears.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Start a 25-minute session.
- Start an external stopwatch at the same time.
- Let the session run to completion without pausing.
- Compare HuntFlow elapsed time to the stopwatch.
- Expected result:
- Drift is not noticeable for user workflow.
- Completion occurs within a small tolerance of real wall-clock time.
- UI updates about once per second without jank.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Enable sound notifications in Settings.
- Start a short session that can reach the one-minute remaining point.
- Keep browser audio permissions enabled.
- Wait until one minute remains.
- Expected result:
- User receives the configured one-minute warning if supported.
- Sound respects the Settings toggle.
- No repeated or overlapping sounds occur.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Create completed and abandoned sessions across available dates.
- Open session history.
- Apply Today, This Week, This Month, and All Time filters.
- Delete one session and confirm.
- Expected result:
- Sessions are newest first.
- Filters show the correct session sets.
- Deleted session is removed from history and stats.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open Targets.
- Tap the add target action.
- Enter name, platform, program URL, scope, notes, and priority.
- Save.
- Expected result:
- Target is saved to IndexedDB.
- Target appears in the list.
- Default status is Recon.
- No required field is missing.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Try saving a target with an empty name.
- Try saving a target with an invalid program URL.
- Try entering very long scope or notes content.
- Expected result:
- Invalid data is rejected or clearly indicated.
- Valid existing data is not corrupted.
- No console errors occur.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open an existing target detail page.
- Edit name, scope, notes, priority, and platform.
- Navigate away and return.
- Expected result:
- Edits persist.
updatedAtbehavior is reflected by last activity/order where visible.- Target detail and list show consistent data.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Create a disposable target.
- Delete it.
- Confirm the action.
- Refresh the page.
- Expected result:
- Target is removed.
- Deleted target does not reappear after refresh.
- Linked disposable data is handled consistently.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Create targets with distinct names.
- Search by exact name.
- Search by partial lowercase and uppercase terms.
- Clear search.
- Expected result:
- Matching targets appear.
- Non-matching targets are hidden.
- Search is case-insensitive.
- Clearing search restores the full list.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Create targets across multiple platforms, priorities, and statuses.
- Apply each filter individually.
- Combine filters if supported.
- Clear filters.
- Expected result:
- Filter results match the selected platform, priority, and status.
- Empty states are understandable.
- Clearing filters restores the list.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Create targets with different priorities.
- Add sessions to some targets.
- Return to the target list.
- Expected result:
- List is ordered by priority and last activity as specified.
- Session count and last session date are correct.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Create a new target and confirm Recon status.
- Start and save a completed session for that target.
- Manually move status through Testing, Reported, Paid, and Closed.
- Archive the target.
- Expected result:
- Status can follow Recon -> Testing -> Reported -> Paid -> Closed.
- First session sets or allows Testing behavior as specified.
- Archived target is hidden from the main list and visible in Archived if available.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open a target detail page.
- Use Start Session.
- Start the timer.
- Expected result:
- Timer is pre-filled with the target.
- Completed session links back to that target.
- Target session count and last session date update.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open Notes.
- Create a new blank note.
- Select a required target.
- Enter title and markdown content.
- Save.
- Expected result:
- Note is saved.
- Note appears newest first in the note list.
- Target link is persisted.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Create a new note.
- Open the template selector.
- Check all built-in templates: Subdomain Takeover, IDOR, SSRF, SQL Injection, XSS, Authentication Bypass, Information Disclosure, Business Logic Flaw.
- Select each template in turn on a disposable note.
- Expected result:
- All 8 templates are available.
- Template content populates the editor.
- Template badge/id is stored with the note where supported.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open a note editor.
- Use toolbar actions for bold, italic, inline code, code block, link, bullet list, and numbered list.
- Save and reopen the note.
- Expected result:
- Toolbar inserts valid markdown.
- Content persists after save and reopen.
- Editor remains focused and usable after toolbar actions.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Enter headings, lists, links, code blocks, and inline code in a note.
- Toggle markdown preview.
- Toggle back to edit mode.
- Expected result:
- Preview renders markdown correctly.
- Edit content is unchanged when toggling.
- Links and code are visually distinct.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open a saved note.
- Make a visible edit.
- Wait at least 3 seconds.
- Refresh the page.
- Expected result:
- Edit survives refresh.
- No duplicate note is created.
- Last edited timestamp updates if shown.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open a note.
- Make an edit.
- Click Save.
- Navigate away and return.
- Expected result:
- Explicit save commits the latest content immediately.
- No data is lost after navigation.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Add comma-separated tags to a note.
- Save the note.
- Filter the note list by one of the tags.
- Try invalid or very long tag values.
- Expected result:
- Valid tags persist and display on the note card.
- Tag filter returns matching notes.
- Invalid tags are rejected or normalized consistently.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Create notes with unique title and body text.
- Search by title.
- Search by body text.
- Filter by target, template, and tag.
- Expected result:
- Full-text search returns relevant notes.
- Filters return only matching notes.
- Clearing search and filters restores the full note list.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Complete a timer session.
- Create or save a note from the completion flow if available.
- Open session details.
- Open the note detail.
- Expected result:
- Note is linked to the completed session.
- Session detail shows linked notes.
- Note detail shows linked session.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Paste a large markdown note with code blocks and lists.
- Save.
- Toggle preview.
- Refresh and reopen.
- Expected result:
- Editor remains responsive.
- Content persists without truncation within model limits.
- Preview does not crash or freeze.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Complete one or more sessions today.
- Open dashboard/stats.
- Compare displayed testing time and completed count to session history.
- Expected result:
- Today's testing time equals completed session duration total.
- Completed session count is correct.
- Abandoned sessions are excluded from completed totals.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Seed or create completed sessions on consecutive days including today.
- Open stats.
- Add a gap day scenario if test data tools are available.
- Expected result:
- Current streak counts consecutive days with at least one completed session.
- Streak stops at the first missing day.
- Abandoned/running/paused sessions do not count.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Seed or create sessions that form at least two completed streaks of different lengths.
- Open stats.
- Compare displayed best streak to expected longest run.
- Expected result:
- Best streak shows the longest all-time consecutive completed-day run.
- Multiple sessions on one day count as one streak day.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Create completed sessions with varying durations across the last 7 days.
- Open stats/dashboard.
- Inspect the activity calendar.
- Tap a day if day drill-down is supported.
- Expected result:
- Each day appears in the correct weekday position.
- Color intensity matches testing minutes: 0, 1-15, 16-45, 46-90, 90+.
- Day drill-down shows that day's sessions.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Create completed sessions this week, this month, and all time.
- Open stats.
- Compare total testing time cards against manual sums.
- Expected result:
- All-time, monthly, and weekly totals are correct.
- Durations are formatted clearly as hours/minutes.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Complete sessions with different templates.
- Complete one session without a template.
- Open the vulnerability type chart.
- Expected result:
- Chart groups sessions by template.
- Untemplated sessions are grouped as uncategorized or equivalent.
- Counts match session history.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Create targets in active, completed/closed, and archived states.
- Open stats.
- Inspect target progress visualization.
- Expected result:
- Active, completed/closed, and archived counts match target list data.
- Chart remains readable with zero-count categories.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Complete sessions with known durations.
- Include an abandoned session.
- Open stats.
- Expected result:
- Average uses completed session durations.
- Abandoned sessions do not inflate average completed-session length.
- Trend text is understandable.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Create completed sessions across morning, afternoon, evening, and night.
- Open stats.
- Compare the most active time insight/chart to the test data.
- Expected result:
- Grouping by session start hour is correct.
- Most active time matches the highest-count time bucket.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Create data that should trigger streak, average session, specialization, and inactivity insights.
- Open stats/dashboard after each data setup.
- Expected result:
- Insights match the current stats data.
- Insights update after session completion or deletion.
- No stale or contradictory insight remains visible.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open Settings.
- Change default duration, break duration, long-break interval, sound, and vibration settings.
- Refresh the app.
- Start a new session.
- Expected result:
- Settings persist after refresh.
- New session uses the configured defaults.
- Sound and vibration toggles affect timer behavior.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Switch theme to Light.
- Switch theme to Dark.
- Switch theme to System.
- Refresh after each change.
- Expected result:
- Theme changes apply immediately.
- Theme persists across reloads.
- System mode follows OS/browser preference.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Change accent color through all supported values.
- Change font size through Small, Medium, and Large.
- Visit dashboard, timer, targets, notes, and stats pages.
- Expected result:
- Accent color applies consistently.
- Font size changes remain readable and do not break layout.
- Settings persist after refresh.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Create at least one target, session, note, and modified setting.
- Open Settings.
- Click Export Data.
- Inspect the downloaded JSON file.
- Expected result:
- File downloads successfully.
- Filename follows
huntflow-export-YYYY-MM-DD.json. - JSON includes sessions, notes, targets, and settings.
- JSON parses without errors.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Export valid data.
- Clear or use a fresh browser profile.
- Import the exported JSON.
- Review targets, sessions, notes, stats, and settings.
- Expected result:
- Import validates schema.
- Data is restored and merged/replaced according to UI copy.
- Stats recalculate from imported sessions.
- No duplicate or corrupted records appear unexpectedly.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Create a malformed JSON file.
- Create a JSON file with missing required fields.
- Try importing each file.
- Expected result:
- Import fails gracefully with a clear error.
- Existing data remains unchanged.
- No console errors or unhandled promise rejections occur.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Create sample data.
- Open Settings.
- Click Clear All Data.
- Cancel once.
- Repeat and confirm.
- Expected result:
- Cancel leaves data intact.
- Confirm removes user data.
- App returns to a clean state without crashing.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open Settings.
- Review storage usage indicator.
- Review About section.
- Expected result:
- Storage usage is visible or clearly unavailable if unsupported.
- App version, changelog/what's new, feedback link, and privacy information are present.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open DevTools Application panel.
- Inspect Manifest.
- Check app name, short name, icons, colors, display, and orientation.
- Expected result:
- Name and short name are HuntFlow.
- 192x192 and 512x512 icons are present.
- Theme/background color is dark slate.
- Display mode is standalone.
- Orientation is portrait-primary.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open DevTools Application > Service Workers.
- Load the production preview.
- Refresh once.
- Expected result:
- Service worker is registered and activated.
- No service worker errors appear.
- App assets are precached.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Load the app online once.
- In DevTools Network, enable Offline.
- Refresh the app.
- Expected result:
- App shell loads from cache.
- Main navigation and previously stored data remain available.
- Offline banner/indicator appears.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Enable offline mode.
- Create or edit a target, note, and setting.
- Refresh while still offline.
- Return online.
- Expected result:
- Local changes persist offline.
- Online/offline indicator updates.
- Back-online toast/sync messaging appears if implemented.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Use a clean browser profile.
- Visit the app once, close it, and visit again.
- Observe the install banner.
- Dismiss the banner and reload.
- Expected result:
- Custom install prompt appears on second visit when eligible.
- Prompt is dismissible.
- Dismiss choice is remembered.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open the app in Chrome Android.
- Install to home screen.
- Launch from the home screen icon.
- Navigate through the app.
- Expected result:
- App opens without browser chrome.
- Status bar matches theme.
- Splash screen and icon are correct.
- Back button navigates back and exits from root.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open the app in Safari iOS.
- Add to Home Screen.
- Launch from the home screen icon.
- Check safe areas on a notched device.
- Expected result:
- App uses Apple touch icon.
- App launches in web-app capable mode where supported.
- Content does not overlap notch, status bar, or home indicator.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Load one production build.
- Deploy or preview a new build.
- Refresh the app.
- Inspect Service Worker state.
- Expected result:
- New service worker installs and activates without breaking the app.
- Old caches are cleaned up.
- User data remains intact.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Run Lighthouse against production preview.
- Test mobile mode.
- Record Performance, Accessibility, Best Practices, and PWA scores.
- Expected result:
- Each score is 90 or higher.
- No high-severity Lighthouse diagnostics remain unresolved.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open Chrome DevTools Network.
- Enable Fast 3G or comparable throttling.
- Hard reload the app.
- Record first paint and time to interactive.
- Expected result:
- First paint is under 1.5 seconds.
- Time to interactive is under 3 seconds.
- App remains usable during startup.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Run
npm run build. - Review generated chunk sizes.
- Compare route chunks to tech-spec budgets.
- Run
- Expected result:
- Initial app + layout <= 80KB.
- Timer page <= 30KB.
- Notes page <= 25KB.
- Stats page with Chart.js <= 50KB.
- Settings page <= 15KB.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Start a timer.
- Open Performance panel and record 30 seconds.
- Interact with pause/resume during the recording.
- Expected result:
- Timer UI updates once per second.
- No long repeated main-thread stalls affect usability.
- Controls respond promptly.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Create or seed more than 100 notes.
- Open Notes.
- Scroll from top to bottom and back.
- Record performance if needed.
- Expected result:
- Scrolling is smooth near 60fps.
- List virtualization or equivalent mitigation is used if needed.
- No visible layout thrashing or freezes occur.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open Chrome DevTools Memory/Performance Monitor.
- Navigate repeatedly among dashboard, timer, targets, notes, stats, and settings for 5 minutes.
- Start and complete a session.
- Edit and preview a large note.
- Expected result:
- Memory usage stabilizes after navigation.
- No obvious memory leak appears.
- App remains responsive.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Load app once online.
- Enable offline mode.
- Hard reload.
- Observe startup time.
- Expected result:
- Cached app shell loads quickly.
- Offline startup does not hang on network requests.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Reload the app.
- Use only Tab, Shift+Tab, Enter, Space, Escape, and arrow keys.
- Navigate every main page and major modal.
- Expected result:
- All interactive controls are reachable.
- Focus order is logical.
- Modals trap focus and close correctly.
- No keyboard trap exists.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Navigate with keyboard through buttons, links, form fields, tabs, filters, and cards.
- Test light and dark themes.
- Expected result:
- Focus indicator is visible in all themes.
- Focus is not hidden behind fixed nav or modals.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Enable NVDA, VoiceOver, or browser accessibility inspection.
- Navigate icon-only buttons and form controls.
- Open timer, note editor, target form, settings, and modals.
- Expected result:
- Icon-only buttons have useful names.
- Form fields have labels.
- Timer state and modal titles are announced clearly.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Run Lighthouse or axe contrast checks.
- Manually inspect badges, charts, disabled buttons, and secondary text.
- Test all accent colors in light and dark themes.
- Expected result:
- Text and interactive controls meet WCAG AA contrast.
- Chart colors remain distinguishable.
- Status badges are not color-only.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Enable reduced motion at OS/browser level.
- Reload the app.
- Navigate pages and start timer.
- Expected result:
- Motion is reduced where appropriate.
- Timer remains understandable.
- No essential information depends on animation only.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Submit invalid target, note, import, and settings forms.
- Navigate errors with keyboard and screen reader.
- Expected result:
- Error messages are clear and associated with fields.
- Focus moves to or near the problem when appropriate.
- User can correct and resubmit without losing data.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Use responsive mode at 375px width.
- Test bottom navigation, toolbar icons, filters, and timer controls.
- Expected result:
- Touch targets are easy to tap.
- Controls do not overlap.
- Text remains readable at all supported font sizes.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open production preview in Chrome.
- Run a smoke test: create target, start/complete session, create note, view stats, export data.
- Expected result:
- Full functionality works.
- PWA install and service worker features work.
- No browser-specific console errors appear.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open production preview in Firefox.
- Run the same smoke test as CB-01.
- Test offline reload after first online load.
- Expected result:
- Full core functionality works.
- IndexedDB persistence works.
- Offline app shell loads after caching.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open production preview in Safari.
- Run the same smoke test as CB-01.
- Test theme, note editor, IndexedDB persistence, and export/import.
- Expected result:
- Full core functionality works.
- No Safari-specific layout, storage, or download issues block MVP use.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open the app on iPhone Safari.
- Test dashboard, timer, target create/edit, note edit/preview, settings, and offline reload.
- Add to Home Screen and launch.
- Expected result:
- Layout works at mobile width.
- Keyboard input does not obscure important fields.
- Home screen launch works within iOS PWA limits.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open the app on Android Chrome.
- Install the PWA.
- Start a session, background the app, and return.
- Test offline mode and export.
- Expected result:
- App is installable.
- Background timer remains accurate.
- Offline data remains available.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open production preview in Edge.
- Run the same smoke test as CB-01.
- Test install prompt if available.
- Expected result:
- Full core functionality works.
- PWA install path behaves correctly.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open the app in Samsung Internet.
- Run a reduced smoke test: dashboard, timer, target, note, stats, settings.
- Test add-to-home-screen if available.
- Expected result:
- Best-effort support is acceptable.
- Core data workflows function.
- Any browser limitation is documented.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Open the app in Opera.
- Run a reduced smoke test: dashboard, timer, target, note, stats, settings.
- Check console for browser-specific errors.
- Expected result:
- Best-effort support is acceptable.
- Core data workflows function.
- Any browser limitation is documented.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Test at 320px, 375px, 768px, 1024px, and desktop widths.
- Visit every main route.
- Open forms, modals, filters, charts, and note preview.
- Expected result:
- No horizontal overflow appears.
- Text does not overlap controls.
- Navigation adapts correctly between mobile and desktop.
- Pass/Fail: [ ] Pass [ ] Fail
- Steps:
- Leave the app closed for at least one day after creating data.
- Reopen the app.
- Start a session and edit an existing note.
- Expected result:
- Existing data is restored.
- Stores and IndexedDB initialize correctly.
- App remains usable without manual cache clearing.