Coverage audit
Last updated 30 September 2026
On this page
This audit compares three lists:
- The source inventory: routes, components and APIs read from the code.
- Browser discovery: what was opened and exercised in a real browser.
- Documentation: the feature and workflow pages in this package.
Summary#
| Measure | Count | % of features |
|---|---|---|
| Meaningful user-facing features (source inventory) | 62 | 100% |
| Found in the browser (opened at least partly) | 53 | 85.5% |
| Fully exercised in the browser with sample data | 40 | 64.5% |
| Partly exercised | 13 | 21% |
| Not opened in the browser (documented from code, marked NOT VERIFIED) | 9 | 14.5% |
| With at least one screenshot | 51 | 82.3% |
| With a feature documentation page | 62 | 100% |
| Covered by an end-to-end workflow | 27 | 43.5% |
| Checked at mobile width | 21 | 33.9% |
DOCUMENTATION COVERAGE: 75%. Each feature scores 1 if it was fully exercised in the browser and documented with screenshots, 0.5 if it was only partly exercised, and 0 if it is documented from code alone: (40 + 13 × 0.5) / 62. Every feature has a documentation entry, but documentation without browser verification does not count as coverage.
Feature-by-feature#
| Feature | Route | Found in source? | Found in browser? | Browser tested? | Sample data? | Screenshot? | Feature documentation? | Workflow documentation? | Mobile checked? | Notes |
|---|---|---|---|---|---|---|---|---|---|---|
| Landing page (features, pricing, FAQ) | / (signed out), /welcome | Yes | Yes | Yes | No | Yes | public-site-and-sign-in | n/a | Yes | |
| Sign in (email + password) | /login | Yes | Yes | Partly | No | Yes | public-site-and-sign-in | n/a | Yes | Form and empty-field validation seen; credentials not submitted (session came from the project QA script) |
| Create account | /login?mode=signup | Yes | Yes | Partly | No | Yes | public-site-and-sign-in | n/a | No | Form viewed; no account created through the UI |
| Continue with Google | /login → /auth/callback | Yes | No | No | No | No | public-site-and-sign-in | n/a | No | OAuth with a real identity provider not attempted |
| Password reset | /forgot-password, /auth/confirm, /reset-password | Yes | Yes | Partly | No | Yes | public-site-and-sign-in | n/a | No | Request form viewed; not submitted (sends a real email); reset page needs emailed link |
| Terms & Privacy pages | /terms, /privacy | Yes | Yes | Yes | No | Yes | public-site-and-sign-in | n/a | No | |
| Accept team invitation | /join/<token> | Yes | Yes | Partly | Yes | Yes | public-site-and-sign-in | 07-invite-a-team-member | No | Page viewed with a real token; not accepted (needs a second account) |
| Auth redirects & 404 | any unknown path | Yes | Yes | Yes | No | Yes | navigation | n/a | No | Signed out → /login; signed in → 404 page |
| Home workspace & credits card | / | Yes | Yes | Yes | Yes | Yes | dashboard | 01-record-to-approved-minutes | Yes | |
| Meeting search | / (search box) → /api/search | Yes | Yes | Yes | Yes | Yes | dashboard | n/a | No | Hit and no-hit states captured |
| Shared with you list | / | Yes | No | No | No | No | dashboard | n/a | No | Needs a second account sharing a meeting |
| Notifications bell | header | Yes | Yes | Yes | Yes | Yes | notifications | n/a | Yes | Meeting-ready notifications seen; real-time toasts not |
| Notification preferences | /settings → Choose | Yes | Yes | Partly | No | Yes | notifications | n/a | No | Sheet viewed; switches not toggled |
| Light / dark theme | header | Yes | Yes | Yes | No | Yes | navigation | n/a | No | |
| Dhivehi dictionary (page + quick panel) | /dictionary, floating button | Yes | Yes | Yes | No | Yes | dictionary | n/a | Yes | |
| Record in the room | /new (Record) | Yes | Yes | Partly | No | Yes | new-meeting | n/a | Yes | Only the microphone-blocked error; headless browser has no microphone |
| Capture call | /new (Capture call) | Yes | Yes | Partly | No | Yes | new-meeting | n/a | No | Instructions viewed; needs an interactive screen-share prompt |
| Upload a recording | /new (Upload file) | Yes | Yes | Yes | Yes | Yes | new-meeting | 01-record-to-approved-minutes | Yes | |
| Join online (meeting bot) | /new (Join online) | Yes | Yes | Partly | Yes | Yes | new-meeting | n/a | No | Validation verified; bot not sent (real, billed dispatch) |
| Smart Audio Prep | /new → Edit | Yes | Yes | Partly | Yes | Yes | audio-prep | n/a | No | Drawer opened; test file had no silence to cut |
| Unfinished-recording recovery | /new | Yes | No | No | No | No | new-meeting | n/a | No | Needs an interrupted recording |
| File into a series from New meeting | /new?series=<id> | Yes | Yes | Yes | Yes | Yes | series | 04-run-a-meeting-series | No | |
| Processing states | /m/<id> | Yes | Yes | Yes | Yes | Yes | processing-and-failures | 01-record-to-approved-minutes | No | Transcribing and Done seen; Summarizing and bot states passed too quickly or were not used |
| Failure card & refund | /m/<id> | Yes | Yes | Yes | Yes | Yes | processing-and-failures | 08-handle-a-failed-recording | No | no_speech reproduced; other 13 reasons from code |
| Summary tab & translation | /m/<id> | Yes | Yes | Yes | Yes | Yes | meeting-page | 01-record-to-approved-minutes | Yes | |
| Insights tab | /m/<id>?tab=insights | Yes | Yes | Yes | Yes | Yes | meeting-page | n/a | No | |
| Transcript editing & speaker naming | /m/<id>?tab=transcript | Yes | Yes | Yes | Yes | Yes | transcript | 02-review-and-correct-transcript | Yes | 'This line is someone else' and 'Same person as' not used |
| Transcript line translation | /m/<id>?tab=transcript | Yes | No | No | No | No | transcript | n/a | No | Not exercised |
| Share with your team | /m/<id> → Share | Yes | Yes | Partly | No | Yes | meeting-page | n/a | No | Only the 'nobody to share with' state (no members) |
| Download / export (PDF, Word, calendar) | /print/<id>, /api/meetings/<id>/export/docx, /ics | Yes | Yes | Yes | Yes | Yes | meeting-page | 01-record-to-approved-minutes | Yes | Files returned 200 with correct types; recording download not pressed |
| Delete meeting | /m/<id> → Delete | Yes | Yes | Yes | Yes | No | meeting-page | n/a | No | Native confirm captured as text and cancelled |
| Add meeting to a series | /m/<id> → Add to a series | Yes | Yes | Yes | Yes | Yes | series | 04-run-a-meeting-series | Yes | |
| Templates & layout editor | /m/<id>?tab=minutes | Yes | Yes | Yes | Yes | Yes | minutes | 01-record-to-approved-minutes | No | Saving a custom template not exercised |
| Agenda & reference files | /m/<id>?tab=minutes | Yes | Yes | Yes | Yes | Yes | minutes | 01-record-to-approved-minutes | No | Agenda used; reference files not |
| Minutes generation | /m/<id>?tab=minutes | Yes | Yes | Yes | Yes | Yes | minutes | 01-record-to-approved-minutes | Yes | |
| Minutes editing (fields, roster, AI rewrite, undo) | /m/<id>?tab=minutes | Yes | Yes | Yes | Yes | Yes | minutes | 01-record-to-approved-minutes | No | Regenerate (section/all) not used |
| Update minutes after transcript change | /m/<id>?tab=minutes | Yes | Yes | Yes | Yes | Yes | minutes | 02-review-and-correct-transcript | No | Stale-screen bug found here and fixed 30 Sep 2026 (lib/minutes/status-sync.ts); re-verified without reload |
| Follow-ups & minutes exports | /print/<id>/minutes, /api/meetings/<id>/minutes/docx | Yes | Yes | Yes | Yes | Yes | minutes | 01-record-to-approved-minutes | No | Sample PDF saved |
| Minutes document language | /m/<id>?tab=minutes | Yes | Yes | Yes | Yes | Yes | minutes | n/a | No | |
| Minutes approval (self) | /m/<id>?tab=minutes | Yes | Yes | Yes | Yes | Yes | minutes-approval | 01-record-to-approved-minutes | No | Wording says 'plan is for one person' on a Team plan |
| Approval by others (approve / return / withdraw) | /m/<id>?tab=minutes | Yes | No | No | No | No | minutes-approval | n/a | No | Needs a second account on the plan |
| AI draft actions (approve / dismiss) | /m/<id>?tab=todos | Yes | Yes | Yes | Yes | Yes | actions | 03-track-actions | No | Dismiss/Edit/Reword not used |
| Action tracking (due, priority, status, notes, self-assign, activity) | /m/<id>?tab=todos, /actions | Yes | Yes | Yes | Yes | Yes | actions | 03-track-actions | Yes | |
| Assign to others, acknowledgement, @mentions | /actions | Yes | No | No | No | No | actions | n/a | No | Needs team members |
| Action Centre (views, filters, buckets, menu, per-action language) | /actions | Yes | Yes | Yes | Yes | Yes | actions | 03-track-actions | Yes | |
| Decision Register | /decisions | Yes | Yes | Yes | Yes | Yes | decisions | n/a | Yes | Revoke form viewed, not submitted; supersede/restore not used |
| Series page (actions, decisions, agenda) | /series, /series/<id> | Yes | Yes | Yes | Yes | Yes | series | 04-run-a-meeting-series | Yes | |
| Rename / archive / delete series | /series/<id> | Yes | Yes | Partly | No | Yes | series | n/a | No | Buttons seen, not used |
| Ask Yaumiyya | /assistant | Yes | Yes | Yes | Yes | Yes | assistant | 05-ask-and-write | Yes | Allowance counter off by one vs Settings |
| Write (letters & emails) | /assistant?mode=write | Yes | Yes | Yes | Yes | Yes | assistant | 05-ask-and-write | No | Email in English drafted; letter mode and Word export not used |
| Library (add, read, ask about a document) | /library, /library/<id> | Yes | Yes | Yes | Yes | Yes | library | 06-library-knowledge | Yes | Rename/delete/failure states not exercised |
| Settings (profile, allowances, device audio, recordings) | /settings | Yes | Yes | Partly | Yes | Yes | settings | n/a | Yes | Viewed; display-name save and device-audio actions not pressed |
| Team members (invite / withdraw) | /settings → Members | Yes | Yes | Yes | Yes | Yes | settings | 07-invite-a-team-member | No | |
| Member-side plan view & limits | /settings, /upgrade (pooled) | Yes | No | No | No | No | settings | n/a | No | Needs a second account |
| Delete all meeting data | /settings → Delete my data | Yes | Yes | Yes | No | No | settings | n/a | No | First confirm captured as text and cancelled |
| Plans, extra hours & credit packs | /upgrade | Yes | Yes | Yes | No | Yes | plans-and-credits | 09-buy-credits-or-renew | Yes | |
| Payment slip submission & review | /upgrade → Submit slip | Yes | Yes | Partly | No | Yes | plans-and-credits | 09-buy-credits-or-renew | No | Form viewed; not submitted (would reach the real admin queue) |
| Credit activity ledger & credit breakdown | /upgrade, /settings | Yes | Yes | Yes | Yes | Yes | plans-and-credits | n/a | No | |
| Analytics | /analytics | Yes | Yes | Yes | Yes | Yes | analytics | n/a | No | |
| Shared-meeting read-only view | /m/<id> (as sharee) | Yes | No | No | No | No | roles-and-permissions | n/a | No | Needs a second account |
| Admin console | /admin | Yes | No | No | No | No | admin-console | n/a | No | Deliberately not opened: shows real customer data |
| Mobile / responsive layout | all | Yes | Yes | Yes | Yes | Yes | mobile | n/a | Yes | 17 mobile captures, no horizontal overflow |
Audit method#
- Source inventory. A full read of
app/: 28 user-facing page routes (plus 10 developer-only/devpreviews) and 86 API routes, pluscomponents/,lib/and the migrations. It produced the feature list above, with source locations. - Browser crawl. Section by section, in a real Playwright-driven Chromium (gstack
browse) at 1440 × 900, with a mobile pass at 390 × 844, using the synthetic QA account and the demonstration scenario. - Second pass for missed features. After the crawl, the source list was searched again for routes, tabs, dialogs, menus, exports, uploads, notifications and feature flags that the crawl had not touched. Items found and then walked in that pass:
- the minutes' Dhivehi document language;
- the
/tasksand/m/<id>/minutesredirects; - print views (
/print/<id>,?version=approved); - the floating dictionary panel;
- the Decision Register filters dialog;
- the per-action More menu and delete confirmation;
- the Library read view;
/join/<token>;- the signed-in 404.
- Classification. Each screen is marked walked, shallow or skipped in the Screen atlas.
Remaining gaps, and why#
| Gap | Why not verified | How to close it |
|---|---|---|
| Real sign-in, sign-up, Google OAuth, password-reset email | Entering or creating credentials on the live authentication service was outside what the run was allowed to do | A human tester signs in with a test account |
| Record and Capture call audio | The headless browser has no microphone or screen-share prompt | Manual test in desktop Chrome |
| Join online bot | Dispatches a real, billed meeting bot | Test against a throwaway Zoom meeting |
| Team features: sharing, assigning to others, acknowledgement, approval by others, member view, pooled upgrade, accepting an invitation | Need a second account on the same plan | Create a second QA account and repeat workflows 3 and 7 |
| Payment slip submission and admin review | Would place a fake payment in the real admin queue | Test on a staging database |
| Admin console | Shows real customers' emails, slips and spend | Review by an administrator; redact before capture |
| Unfinished-recording recovery, transcript line translation, Regenerate, custom template save, Library rename/delete | Not exercised for time or credit reasons | Low risk; follow the feature pages |
Notable UX findings (observed during the run)#
- Stale minutes after an update: fixed 30 Sep 2026. After "Update · free" or a section regenerate, the minutes stayed on "Building the minutes…" until a reload, while refreshing every 6 s. The panel re-synced its status only when the server status changed, and an update goes ready → ready. It is now keyed on status and generation (
lib/minutes/status-sync.ts,test/minutes-status-sync.test.ts). A related fix: tab switches wrote the address withreplaceState(window.history.state, …), which Next.js does not follow, so refreshes fetched and restored a stale?tab=(test/history-replace-state.test.ts). "Approve now" and series "Add actions" were re-tested and update on their own in ~2.5 s and ~1 s; the original notes came from checking too soon on a cold dev server. - Approved actions lose owner and deadline. The minutes extracted "Responsible: Mariyam Shifa · Deadline 9 October", but the approved action started "On nobody's list" with no due date.
- Allowance counters disagree by one. The Assistant showed one fewer free question or draft than Settings → AI allowances.
- Approval wording. On a 3-seat Team plan with no members yet, the approval drawer says "Your plan is for one person".
- Summary keeps uncorrected names. After speakers were renamed, the Summary and Ask answers still said "Mariam"; only the minutes picked up the corrections.
- Ask added an unsupported caveat, "the meeting transcript was truncated…", although the transcript was complete.
- Grammar: "Ready to transcribe · 1 credits". Wording: "You gave it to you" in action history.
- Deep link: the Actions tab is
?tab=todos;?tab=actionssilently opens the Summary. - Mobile: the floating dictionary button overlaps content, and the meeting tab bar cuts "Insights" until scrolled.
- Accessibility: the Activity drawer did not close on Escape in the automated browser (its Close button works).
Verification checklist (performed before finishing)#
- [x] All 162 screenshot files exist and are listed in
screenshots/manifest.tsv(checked by script: 0 unlisted, 0 missing). - [x] Every Markdown image and link path resolves (checked by script, see below).
- [x] Portal links and gallery images resolve (same check, run on
index.html). - [x] No secrets in screenshots: the QA email, the one-time invitation link and the bank account number are redacted with overlays. No API keys, tokens or cookies appear on any page captured.
- [x] Sample data is clearly synthetic (see Sample data).
- [x] Features not exercised are marked NOT VERIFIED or "code only"; nothing unfinished is described as working (e.g. "talk-time per speaker — coming soon").