Skip to content
ޔައުމިއްޔާDocumentation
Menu

Coverage audit

Last updated 30 September 2026

On this page

This audit compares three lists:

  1. The source inventory: routes, components and APIs read from the code.
  2. Browser discovery: what was opened and exercised in a real browser.
  3. Documentation: the feature and workflow pages in this package.

Summary#

MeasureCount% of features
Meaningful user-facing features (source inventory)62100%
Found in the browser (opened at least partly)5385.5%
Fully exercised in the browser with sample data4064.5%
Partly exercised1321%
Not opened in the browser (documented from code, marked NOT VERIFIED)914.5%
With at least one screenshot5182.3%
With a feature documentation page62100%
Covered by an end-to-end workflow2743.5%
Checked at mobile width2133.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#

FeatureRouteFound in source?Found in browser?Browser tested?Sample data?Screenshot?Feature documentation?Workflow documentation?Mobile checked?Notes
Landing page (features, pricing, FAQ)/ (signed out), /welcomeYesYesYesNoYespublic-site-and-sign-inn/aYes
Sign in (email + password)/loginYesYesPartlyNoYespublic-site-and-sign-inn/aYesForm and empty-field validation seen; credentials not submitted (session came from the project QA script)
Create account/login?mode=signupYesYesPartlyNoYespublic-site-and-sign-inn/aNoForm viewed; no account created through the UI
Continue with Google/login → /auth/callbackYesNoNoNoNopublic-site-and-sign-inn/aNoOAuth with a real identity provider not attempted
Password reset/forgot-password, /auth/confirm, /reset-passwordYesYesPartlyNoYespublic-site-and-sign-inn/aNoRequest form viewed; not submitted (sends a real email); reset page needs emailed link
Terms & Privacy pages/terms, /privacyYesYesYesNoYespublic-site-and-sign-inn/aNo
Accept team invitation/join/<token>YesYesPartlyYesYespublic-site-and-sign-in07-invite-a-team-memberNoPage viewed with a real token; not accepted (needs a second account)
Auth redirects & 404any unknown pathYesYesYesNoYesnavigationn/aNoSigned out → /login; signed in → 404 page
Home workspace & credits card/YesYesYesYesYesdashboard01-record-to-approved-minutesYes
Meeting search/ (search box) → /api/searchYesYesYesYesYesdashboardn/aNoHit and no-hit states captured
Shared with you list/YesNoNoNoNodashboardn/aNoNeeds a second account sharing a meeting
Notifications bellheaderYesYesYesYesYesnotificationsn/aYesMeeting-ready notifications seen; real-time toasts not
Notification preferences/settings → ChooseYesYesPartlyNoYesnotificationsn/aNoSheet viewed; switches not toggled
Light / dark themeheaderYesYesYesNoYesnavigationn/aNo
Dhivehi dictionary (page + quick panel)/dictionary, floating buttonYesYesYesNoYesdictionaryn/aYes
Record in the room/new (Record)YesYesPartlyNoYesnew-meetingn/aYesOnly the microphone-blocked error; headless browser has no microphone
Capture call/new (Capture call)YesYesPartlyNoYesnew-meetingn/aNoInstructions viewed; needs an interactive screen-share prompt
Upload a recording/new (Upload file)YesYesYesYesYesnew-meeting01-record-to-approved-minutesYes
Join online (meeting bot)/new (Join online)YesYesPartlyYesYesnew-meetingn/aNoValidation verified; bot not sent (real, billed dispatch)
Smart Audio Prep/new → EditYesYesPartlyYesYesaudio-prepn/aNoDrawer opened; test file had no silence to cut
Unfinished-recording recovery/newYesNoNoNoNonew-meetingn/aNoNeeds an interrupted recording
File into a series from New meeting/new?series=<id>YesYesYesYesYesseries04-run-a-meeting-seriesNo
Processing states/m/<id>YesYesYesYesYesprocessing-and-failures01-record-to-approved-minutesNoTranscribing and Done seen; Summarizing and bot states passed too quickly or were not used
Failure card & refund/m/<id>YesYesYesYesYesprocessing-and-failures08-handle-a-failed-recordingNono_speech reproduced; other 13 reasons from code
Summary tab & translation/m/<id>YesYesYesYesYesmeeting-page01-record-to-approved-minutesYes
Insights tab/m/<id>?tab=insightsYesYesYesYesYesmeeting-pagen/aNo
Transcript editing & speaker naming/m/<id>?tab=transcriptYesYesYesYesYestranscript02-review-and-correct-transcriptYes'This line is someone else' and 'Same person as' not used
Transcript line translation/m/<id>?tab=transcriptYesNoNoNoNotranscriptn/aNoNot exercised
Share with your team/m/<id> → ShareYesYesPartlyNoYesmeeting-pagen/aNoOnly the 'nobody to share with' state (no members)
Download / export (PDF, Word, calendar)/print/<id>, /api/meetings/<id>/export/docx, /icsYesYesYesYesYesmeeting-page01-record-to-approved-minutesYesFiles returned 200 with correct types; recording download not pressed
Delete meeting/m/<id> → DeleteYesYesYesYesNomeeting-pagen/aNoNative confirm captured as text and cancelled
Add meeting to a series/m/<id> → Add to a seriesYesYesYesYesYesseries04-run-a-meeting-seriesYes
Templates & layout editor/m/<id>?tab=minutesYesYesYesYesYesminutes01-record-to-approved-minutesNoSaving a custom template not exercised
Agenda & reference files/m/<id>?tab=minutesYesYesYesYesYesminutes01-record-to-approved-minutesNoAgenda used; reference files not
Minutes generation/m/<id>?tab=minutesYesYesYesYesYesminutes01-record-to-approved-minutesYes
Minutes editing (fields, roster, AI rewrite, undo)/m/<id>?tab=minutesYesYesYesYesYesminutes01-record-to-approved-minutesNoRegenerate (section/all) not used
Update minutes after transcript change/m/<id>?tab=minutesYesYesYesYesYesminutes02-review-and-correct-transcriptNoStale-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/docxYesYesYesYesYesminutes01-record-to-approved-minutesNoSample PDF saved
Minutes document language/m/<id>?tab=minutesYesYesYesYesYesminutesn/aNo
Minutes approval (self)/m/<id>?tab=minutesYesYesYesYesYesminutes-approval01-record-to-approved-minutesNoWording says 'plan is for one person' on a Team plan
Approval by others (approve / return / withdraw)/m/<id>?tab=minutesYesNoNoNoNominutes-approvaln/aNoNeeds a second account on the plan
AI draft actions (approve / dismiss)/m/<id>?tab=todosYesYesYesYesYesactions03-track-actionsNoDismiss/Edit/Reword not used
Action tracking (due, priority, status, notes, self-assign, activity)/m/<id>?tab=todos, /actionsYesYesYesYesYesactions03-track-actionsYes
Assign to others, acknowledgement, @mentions/actionsYesNoNoNoNoactionsn/aNoNeeds team members
Action Centre (views, filters, buckets, menu, per-action language)/actionsYesYesYesYesYesactions03-track-actionsYes
Decision Register/decisionsYesYesYesYesYesdecisionsn/aYesRevoke form viewed, not submitted; supersede/restore not used
Series page (actions, decisions, agenda)/series, /series/<id>YesYesYesYesYesseries04-run-a-meeting-seriesYes
Rename / archive / delete series/series/<id>YesYesPartlyNoYesseriesn/aNoButtons seen, not used
Ask Yaumiyya/assistantYesYesYesYesYesassistant05-ask-and-writeYesAllowance counter off by one vs Settings
Write (letters & emails)/assistant?mode=writeYesYesYesYesYesassistant05-ask-and-writeNoEmail in English drafted; letter mode and Word export not used
Library (add, read, ask about a document)/library, /library/<id>YesYesYesYesYeslibrary06-library-knowledgeYesRename/delete/failure states not exercised
Settings (profile, allowances, device audio, recordings)/settingsYesYesPartlyYesYessettingsn/aYesViewed; display-name save and device-audio actions not pressed
Team members (invite / withdraw)/settings → MembersYesYesYesYesYessettings07-invite-a-team-memberNo
Member-side plan view & limits/settings, /upgrade (pooled)YesNoNoNoNosettingsn/aNoNeeds a second account
Delete all meeting data/settings → Delete my dataYesYesYesNoNosettingsn/aNoFirst confirm captured as text and cancelled
Plans, extra hours & credit packs/upgradeYesYesYesNoYesplans-and-credits09-buy-credits-or-renewYes
Payment slip submission & review/upgrade → Submit slipYesYesPartlyNoYesplans-and-credits09-buy-credits-or-renewNoForm viewed; not submitted (would reach the real admin queue)
Credit activity ledger & credit breakdown/upgrade, /settingsYesYesYesYesYesplans-and-creditsn/aNo
Analytics/analyticsYesYesYesYesYesanalyticsn/aNo
Shared-meeting read-only view/m/<id> (as sharee)YesNoNoNoNoroles-and-permissionsn/aNoNeeds a second account
Admin console/adminYesNoNoNoNoadmin-consolen/aNoDeliberately not opened: shows real customer data
Mobile / responsive layoutallYesYesYesYesYesmobilen/aYes17 mobile captures, no horizontal overflow

Audit method#

  1. Source inventory. A full read of app/: 28 user-facing page routes (plus 10 developer-only /dev previews) and 86 API routes, plus components/, lib/ and the migrations. It produced the feature list above, with source locations.
  2. 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.
  3. 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 /tasks and /m/<id>/minutes redirects;
    • 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.
  4. Classification. Each screen is marked walked, shallow or skipped in the Screen atlas.

Remaining gaps, and why#

GapWhy not verifiedHow to close it
Real sign-in, sign-up, Google OAuth, password-reset emailEntering or creating credentials on the live authentication service was outside what the run was allowed to doA human tester signs in with a test account
Record and Capture call audioThe headless browser has no microphone or screen-share promptManual test in desktop Chrome
Join online botDispatches a real, billed meeting botTest against a throwaway Zoom meeting
Team features: sharing, assigning to others, acknowledgement, approval by others, member view, pooled upgrade, accepting an invitationNeed a second account on the same planCreate a second QA account and repeat workflows 3 and 7
Payment slip submission and admin reviewWould place a fake payment in the real admin queueTest on a staging database
Admin consoleShows real customers' emails, slips and spendReview by an administrator; redact before capture
Unfinished-recording recovery, transcript line translation, Regenerate, custom template save, Library rename/deleteNot exercised for time or credit reasonsLow risk; follow the feature pages

Notable UX findings (observed during the run)#

  1. 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 with replaceState(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.
  2. 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.
  3. Allowance counters disagree by one. The Assistant showed one fewer free question or draft than Settings → AI allowances.
  4. Approval wording. On a 3-seat Team plan with no members yet, the approval drawer says "Your plan is for one person".
  5. Summary keeps uncorrected names. After speakers were renamed, the Summary and Ask answers still said "Mariam"; only the minutes picked up the corrections.
  6. Ask added an unsupported caveat, "the meeting transcript was truncated…", although the transcript was complete.
  7. Grammar: "Ready to transcribe · 1 credits". Wording: "You gave it to you" in action history.
  8. Deep link: the Actions tab is ?tab=todos; ?tab=actions silently opens the Summary.
  9. Mobile: the floating dictionary button overlaps content, and the meeting tab bar cuts "Insights" until scrolled.
  10. 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").