🩺 Record Detail
Patient Info
Name: Unknown
Age: Unknown
Date: 2026-08-12 17:56:18
Transcript
================================================================================
SESSION (CLINICAL SCRIBE) MODULE - MANUAL TEST SCRIPT
================================================================================
Module : Clinical Scribe / Patient Engagement ("Session")
Backend : /api/v1/scribe/* (app/api/scribe.py, services/session_service.py)
Frontend : ClinicalRecordingFlow.tsx, NotesOutputStage.tsx,
CodingOutputPanel.tsx, MainPage.tsx / SessionsPage.tsx,
ResultsPage.tsx
Version : v1 - 2026-08-12
Tester : ______________________ Build / commit : ______________________
Environment : [ ] Local [ ] Staging [ ] Production
================================================================================
--------------------------------------------------------------------------------
0. TEST ENVIRONMENT SETUP (do this before anything else)
--------------------------------------------------------------------------------
ENV-1 Postgres is up on port 55432.
ENV-2 Backend is running and reachable on port 8100.
ENV-3 Frontend dev server is running.
ENV-4 AI engine (PY_ENGINE_URL) is running and reachable.
NOTE: several tests below deliberately require the AI engine to be
STOPPED. Those are marked [AI-ENGINE-DOWN].
ENV-5 A working microphone is available and the browser has permission to
use it. Test in Chrome first; repeat section 3 in Firefox / Safari.
TEST ACCOUNTS REQUIRED
A. Doctor account - has scribe:use (main test account)
B. Second Doctor account - has scribe:use (for isolation tests)
C. Reception or Nurse acct - does NOT have scribe:use (for denial tests)
D. Clinic Admin account - does NOT have scribe:use
E. A doctor with a temporary password (must-change-password not yet done)
TEST DATA REQUIRED
- At least 2 patients assigned to Doctor A, with patient_code values noted.
- At least 1 patient belonging to Doctor B only.
- At least 1 patient WITH past visits, allergies and medications recorded.
- At least 1 patient with NO history at all (for empty-state checks).
- At least 1 active clinical note template and 1 active visit type.
- At least 1 scheduled appointment for Doctor A (to test session-from-
appointment linking).
- A .txt transcript file with real clinical content (~20 lines).
- An empty .txt file.
- A .png or .pdf file (to test the "wrong file type" path).
- An audio file (.mp3/.wav) with a few minutes of speech.
LEGEND
[P] Pass [F] Fail [B] Blocked [NA] Not applicable
Priority: P1 = blocker / core flow, P2 = important, P3 = nice to have
================================================================================
SECTION 1 - ACCESS CONTROL AND PERMISSIONS
================================================================================
--------------------------------------------------------------------------------
TC-ACC-01 | P1 | Doctor can reach the session module
--------------------------------------------------------------------------------
Pre : Logged in as Doctor A.
Steps: 1. Look at the sidebar.
2. Click "New Session" / "Start Recording".
Exp : Session entries are visible in the sidebar. The "Choose Recording
Method" modal opens with three options.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-ACC-02 | P1 | Role without scribe:use is blocked
--------------------------------------------------------------------------------
Pre : Logged in as Reception / Nurse (account C).
Steps: 1. Check whether Sessions appears in the sidebar.
2. If it does, open it. Also try navigating directly to the sessions
URL by pasting it in the address bar.
3. Open browser DevTools > Network and watch the calls.
Exp : The module is not offered. If reached directly, every /scribe/* call
returns 403 "Insufficient permissions".
KNOWN RISK: the list loaders swallow non-OK responses and render an EMPTY
LIST instead of a permission error. Record exactly what the user sees.
An empty "No sessions yet" screen for a user who is actually forbidden
should be raised as a defect.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-ACC-03 | P2 | Clinic Admin without scribe:use is blocked
--------------------------------------------------------------------------------
Pre : Logged in as Clinic Admin (account D).
Steps: Repeat TC-ACC-02.
Exp : Same as TC-ACC-02 - no access to session recording.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-ACC-04 | P2 | Temporary password blocks the module
--------------------------------------------------------------------------------
Pre : Log in as account E (temp password, not yet changed).
Steps: 1. Attempt to open the session module without changing the password.
Exp : Blocked with "You must change your temporary password before
continuing." After changing the password, access works.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-ACC-05 | P1 | Doctors cannot see each other's sessions
--------------------------------------------------------------------------------
Pre : Doctor B has at least one saved session. Note its session ID from the
URL or from DevTools.
Steps: 1. Log in as Doctor A.
2. Open the session history list - confirm Doctor B's session is absent.
3. Navigate directly to Doctor B's session ID.
Exp : List shows only Doctor A's sessions. Direct navigation returns
404 "Session not found" (NOT 403 - a 403 would leak existence).
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-ACC-06 | P2 | Session expiry mid-flow
--------------------------------------------------------------------------------
Pre : Doctor A is mid-session with a transcript on screen.
Steps: 1. Clear the auth cookie in DevTools (or wait for expiry).
2. Click "Save Draft".
Exp : A clear authentication error or redirect to login. The work is NOT
silently lost - verify the crash-recovery backup still offers to
restore it after logging back in (see TC-REC-01).
Result: [ ] Notes: _______________________________________________
================================================================================
SECTION 2 - STARTING A SESSION
================================================================================
--------------------------------------------------------------------------------
TC-START-01 | P1 | Recording method modal
--------------------------------------------------------------------------------
Steps: 1. Click "New Session".
Exp : Modal "Choose Recording Method" with exactly three options:
- Live Recording ("Record your consultation in real-time")
- Upload Audio / Video
- Upload Transcript (.txt)
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-START-02 | P1 | Patient is required before recording
--------------------------------------------------------------------------------
Steps: 1. Open the modal WITHOUT selecting a patient.
2. Click "Live Recording".
3. Repeat for "Upload Audio / Video" and "Upload Transcript".
Exp : Each click shows the toast "Patient required - Please select a patient
before you start recording." and opens the patient selection dialog.
Recording does NOT start.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-START-03 | P1 | Cancelling the modal
--------------------------------------------------------------------------------
Steps: 1. Open the modal, then click the overlay outside it. Reopen, then
click the X.
Exp : Both cancel the entire flow and return to the previous screen with no
orphan draft created. Check the Drafts tab to confirm nothing appeared.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-START-04 | P1 | Start session from an appointment
--------------------------------------------------------------------------------
Pre : Doctor A has a scheduled appointment today.
Steps: 1. Open the appointment and start a session from it.
2. Complete a short recording and use "Save Session".
3. Go back to the Appointments module and find that appointment.
Exp : Toast "Starting session from appointment". The patient is pre-filled.
After the FINAL save the appointment status becomes "completed" with
the note "Closed after scribe session".
IMPORTANT: after only a DRAFT save the appointment must still be open.
Verify that separately.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-START-05 | P2 | Change patient mid-session
--------------------------------------------------------------------------------
Steps: 1. Start a session with Patient 1 and produce a transcript.
2. Click the patient chip in the header > choose Patient 2.
Exp : Header chip updates. Confirm the transcript and notes are still the
ones you recorded and were not silently cleared or mixed with
Patient 2's data. Save and reopen - the session belongs to Patient 2.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-START-06 | P2 | Change template mid-session
--------------------------------------------------------------------------------
Steps: 1. Reach the Outputs stage with generated notes.
2. Click the template chip and select a DIFFERENT template.
Exp : Sections are wiped and regenerated for the new template. Any note
generation already in flight is cancelled - watch for stale content
from the OLD template appearing after the switch. That would be a bug.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-START-07 | P3 | Patient not selected indicator
--------------------------------------------------------------------------------
Exp : With no patient chosen the header chip reads "Patient: Not Selected"
and is styled as a red dashed chip.
Result: [ ] Notes: _______________________________________________
================================================================================
SECTION 3 - RECORDING AND TRANSCRIPTION
================================================================================
--------------------------------------------------------------------------------
TC-REC-01 | P1 | Happy path live recording
--------------------------------------------------------------------------------
Steps: 1. Select a patient, choose Live Recording.
2. Speak a realistic consultation for at least 60 seconds.
3. Click Stop.
Exp : Recording starts immediately on click. "Recording in progress" state
with a live mic level meter. Live captions appear as you speak. On
Stop: "Transcribing audio..." then "Processing recording..." then the
amber card "Generating SOAP note, coding, and pre-auth in the
background...". A readable transcript appears.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-REC-02 | P1 | Pause and resume
--------------------------------------------------------------------------------
Steps: 1. Start recording, speak, click Pause, wait 10 s, speak (should NOT be
captured), click Resume, speak again, Stop.
Exp : State shows "Recording paused". Audio spoken while paused does NOT
appear in the transcript. Speech before and after the pause both do.
The timer does not advance while paused.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-REC-03 | P1 | Recording too short
--------------------------------------------------------------------------------
Steps: 1. Start recording and Stop after ~1 second of silence.
Exp : Toast "Recording too short - Speak for at least a few seconds." No
empty session is created and the app does not hang in "Transcribing".
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-REC-04 | P1 | Microphone permission denied
--------------------------------------------------------------------------------
Steps: 1. Deny mic permission in the browser.
2. Click Live Recording.
Exp : Toast "Microphone access denied". The UI returns to a usable state -
it must not be stuck on a spinner.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-REC-05 | P1 | Upload an audio file
--------------------------------------------------------------------------------
Steps: 1. Choose "Upload Audio / Video" and pick the prepared audio file.
Exp : File uploads, transcription runs, transcript appears. The audio player
is available afterwards and plays the uploaded audio back.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-REC-06 | P2 | Upload a transcript (.txt)
--------------------------------------------------------------------------------
Steps: 1. Choose "Upload Transcript" and pick the prepared .txt file.
Exp : Toast "Transcript imported". Content appears as the transcript. The
stage moves on without attempting audio transcription.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-REC-07 | P2 | Upload wrong file type / empty file
--------------------------------------------------------------------------------
Steps: 1. In "Upload Transcript" pick the .png or .pdf file.
2. Retry with the empty .txt file.
Exp : Toast "Unsupported file" for the wrong type; "Empty file" for the empty
one. No session state is corrupted; you can retry immediately.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-REC-08 | P2 | Edit the transcript manually
--------------------------------------------------------------------------------
Steps: 1. Click "Show Transcript", then "Edit".
2. Change some text, click Save.
3. Repeat but click Cancel instead.
Exp : Save shows toast "Transcription saved" and keeps the edit. Cancel
discards the edit and restores the original text. Continue to Outputs -
generated notes reflect the EDITED transcript, not the original.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-REC-09 | P2 | Non-English transcription
--------------------------------------------------------------------------------
Steps: For each supported language - en, hi, pa, fr, es - set the language and
record a short sample in that language.
Exp : Transcription returns text in the selected language. The language
selection persists when you save a draft and reopen it.
Result: en [ ] hi [ ] pa [ ] fr [ ] es [ ]
Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-REC-10 | P2 | [AI-ENGINE-DOWN] Transcription failure
--------------------------------------------------------------------------------
Pre : Stop the AI engine.
Steps: 1. Record and stop.
Exp : Toast "Transcription failed" (or "No transcript returned"). The UI is
NOT stuck on the spinner. You can retry or fall back to uploading a
transcript. The raw audio is not lost - confirm you can still save a
draft and recover the recording later.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-REC-11 | P1 | Next requires patient and template
--------------------------------------------------------------------------------
Steps: 1. With a transcript ready, clear the template (if possible) and click
"Next".
Exp : Blocked with a clear message naming what is missing. With both set,
"Next" moves to the Outputs stage.
Result: [ ] Notes: _______________________________________________
================================================================================
SECTION 4 - MEDICATIONS AND LAB ORDERS
================================================================================
--------------------------------------------------------------------------------
TC-ORD-01 | P1 | Extraction from the transcript
--------------------------------------------------------------------------------
Pre : Dictate a consultation that clearly prescribes 2 medications with
dosages AND orders 2 lab tests.
Exp : The "Medication and Labs Review" card lists the medications and the lab
orders separately. Medications are not listed as labs or vice versa.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-ORD-02 | P1 | No invented orders
--------------------------------------------------------------------------------
Pre : Dictate a consultation that mentions medication only HISTORICALLY
("she has been on metformin for years") and HYPOTHETICALLY
("we could consider starting a statin, but not today").
Exp : Neither is extracted as a new order. This is a clinical-safety check -
any invented or historical order is a P1 defect.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-ORD-03 | P2 | Add / edit / remove a medication manually
Steps: 1. Add a medication with BOTH name and dosage - expect toast
"Medication added".
2. Try to add one with the name blank, then with the dosage blank.
3. Edit an existing entry, then remove it.
Exp : Blank name or dosage is refused with "Please enter medication name and
dosage". Edit and remove show their toasts and persist after save.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-ORD-04 | P2 | Add / remove a lab order manually
Steps: 1. Add a lab order with a test name; set priority, fasting flag and
specimen if offered.
2. Try to add one with a blank test name.
Exp : Blank name refused with "Please enter a test name". Added order
persists through save and reopen with its priority / fasting values.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-ORD-05 | P2 | No duplicate orders on regeneration
Steps: 1. With orders already extracted, trigger extraction again (re-process
or regenerate).
Exp : The list is NOT duplicated. Manually added orders survive.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-ORD-06 | P2 | Download orders as PDF
Steps: 1. Click "Download as PDF" on the Medication and Labs Review card.
Exp : A PDF downloads containing the correct patient name, doctor, date,
medications and labs. Open it and check nothing is blank or truncated.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-ORD-07 | P2 | Send to EMR
Steps: 1. Click "Send to EMR". Review the confirmation dialog.
2. Cancel. Then repeat and click "Confirm Send".
3. Repeat on a session with no medications and no labs.
Exp : Dialog "Send to EMR System" with Cancel / Confirm Send. Cancel sends
nothing. Confirm shows "Sending..." then a success or a clear failure
("OpenEMR sync failed - OpenEMR is not configured."). With nothing to
send the dialog shows "No medications or laboratory orders to send."
Result: [ ] Notes: _______________________________________________
================================================================================
SECTION 5 - OUTPUTS: NOTES, SUMMARY, INTERNAL NOTES
================================================================================
--------------------------------------------------------------------------------
TC-OUT-01 | P1 | Outputs tabs render
Exp : Six tabs present - Clinical Notes, Summary, Internal Notes, Orders,
Coding, Insurance Pre-Auth. Each opens without error.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-OUT-02 | P1 | Clinical note generation
Steps: 1. On the Clinical Notes tab click "Generate {template}".
Exp : Loading state "Generating soap note...", then the template's sections
are filled with content that matches what was actually said. Each
section is individually editable.
CHECK: no section contains leftover template placeholder text.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-OUT-03 | P1 | Change output format
Steps: 1. Use the format dropdown to switch between SOAP Note, H&P Note and
Progress Note.
Exp : The note structure changes appropriately. Content is regenerated, not
merely relabelled.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-OUT-04 | P1 | [AI-ENGINE-DOWN] Note generation failure and retry
Pre : Stop the AI engine.
Steps: 1. Click Generate.
2. Restart the AI engine and click the retry panel.
Exp : Red panel "Note generation failed. Click to retry." The transcript is
untouched. Retry after the engine returns succeeds.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-OUT-05 | P2 | Edit note sections manually
Steps: 1. Type into several sections. Save a draft, reopen it.
Exp : Manual edits persist exactly. Regenerating warns before overwriting, or
if it overwrites silently record that as a defect - lost physician
edits are serious.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-OUT-06 | P1 | Vitals extraction and editing
Steps: 1. Dictate vitals aloud (e.g. BP 138/86, HR 78, temp 98.6, SpO2 97).
2. On the Summary tab check the extracted vitals.
3. Click Edit, change a value, Save. Then Edit and Cancel.
Exp : Dictated vitals appear with an "AI Generated" badge. After a manual
edit the badge becomes "Doctor Edited". Cancel discards. Values persist
after save and reopen.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-OUT-07 | P1 | Vitals range validation
Steps: Enter each out-of-range value and try to save:
BP systolic 350 / diastolic 5, HR 500, Temp 50 F, RR 90, SpO2 20,
Height 500 cm, Weight 900 kg, glucose 2000.
Exp : Each is rejected with a clear message. Valid boundary values ARE
accepted: BP 40-300 / 20-200, HR 20-300, Temp 85-115 F, RR 4-60,
SpO2 50-100, Height 20-300 cm, Weight 0.5-500 kg, glucose 10-800.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-OUT-08 | P2 | Out-of-range dictated vitals
Steps: 1. Dictate an impossible vital ("blood pressure four hundred over ten").
Exp : It is dropped rather than stored. Confirm nothing absurd reaches the
patient's vitals history.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-OUT-09 | P2 | Patient summary generation
Steps: 1. Open the Summary tab and generate the patient-facing summary.
Exp : Plain-language summary. Placeholders are substituted with real values -
search the text for PATIENT_NAME, DOCTOR_NAME, CLINIC_NAME,
SESSION_DATE, CLINIC_CONTACT. Any literal placeholder left in the text
is a defect.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-OUT-10 | P2 | Internal notes
Steps: 1. On Internal Notes click Generate, then Regenerate.
2. Edit manually and save.
3. Reopen the session and confirm the notes are still there.
Exp : Content generates, the lock icon and privacy footnote are shown, and
saving gives "Internal notes saved". Internal notes must NOT appear in
the patient-facing summary or in any exported patient document -
verify by exporting.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-OUT-11 | P3 | Empty states
Exp : With nothing generated yet the tabs show their empty states, e.g.
"No orders generated yet for this session." and the coding placeholder
text. No blank white panels or spinners that never resolve.
Result: [ ] Notes: _______________________________________________
================================================================================
SECTION 6 - MEDICAL CODING AND BILLING
================================================================================
--------------------------------------------------------------------------------
TC-COD-01 | P1 | Coding suggestions generate
Exp : ICD-10, CPT and (for dental) CDT suggestions appear in review stacks,
relevant to the dictated content. Each code has Approve / Reject.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-COD-02 | P1 | [AI-ENGINE-DOWN] Coding failure does not damage notes
Pre : Stop the AI engine, then trigger coding generation.
Exp : Message "Coding generation failed. Clinical notes were not affected."
The clinical notes remain intact and the session is still saveable.
This is the critical guarantee for this test case.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-COD-03 | P1 | Approve / reject / set primary
Steps: 1. Approve two ICD codes, reject one.
2. Set one ICD as Primary, then set a different one as Primary.
Exp : Rejected codes leave the selection. Exactly ONE ICD is Primary at any
time - setting a new Primary clears the old one.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-COD-04 | P2 | Manual code entry validation
Steps: Attempt each of the following:
a) Add ICD with a blank code or blank description
b) Add ICD "XYZ123" (invalid shape)
c) Add ICD "E11.9" twice (duplicate)
d) Add valid ICD "E11.9", "I10", "U07.1"
e) Add CPT "ABCDE" (invalid shape)
f) Add valid CPT "99214" and "G0008"
g) Add the same CPT with the SAME modifier twice (duplicate)
h) Add the same CPT with a DIFFERENT modifier (should be allowed)
i) Add CDT "1234" (missing the D)
j) Add valid CDT "D2740"
k) CDT tooth number 45 and tooth letter "Z" (out of range)
l) CDT surfaces "XYZ" (invalid letters)
Exp : a-c, e, g, i, k, l are refused with the specific message shown in the
UI. d, f, h, j are accepted. Record the exact wording of each message.
Result: a[ ] b[ ] c[ ] d[ ] e[ ] f[ ] g[ ] h[ ] i[ ] j[ ] k[ ] l[ ]
Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-COD-05 | P2 | Modifier and price editing
Steps: 1. Edit a CPT modifier and a price. Enter a price with a currency
symbol and with a comma (e.g. "1,250.00").
Exp : Values are parsed and stored correctly, and survive save and reopen.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-COD-06 | P2 | Dental session shows CDT only
Pre : A session whose specialty resolves to dental.
Exp : Empty ICD and CPT stacks are hidden; CDT is shown. The finalize guard
message uses the dental wording.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-COD-07 | P1 | Finalize requires a saved session
Steps: 1. In a brand-new unsaved session reach Coding and click
"Finalize Billing Details".
Exp : Blocked with "Save the session before finalizing billing details."
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-COD-08 | P1 | Finalize requires at least one code
Steps: 1. On a saved session with NO codes selected, click Finalize.
Exp : Blocked with "Select at least one ICD-10 or CPT code before
finalizing." (dental variant on a dental session).
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-COD-09 | P1 | Finalize happy path
Steps: 1. Select codes with one Primary ICD, click "Finalize Billing Details".
Exp : Green banner "Billing details finalized - Locked by {your name} on
{date}. Coding is read-only until reopened." Buttons "Download Billing
Document" and "Reopen Billing" appear. All code editing and the search
box are disabled.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-COD-10 | P1 | Finalized coding is genuinely locked
Steps: 1. On a finalized session try to change a code through the UI.
2. Then reopen the SAME session in a second browser tab that was loaded
BEFORE the finalize, and try to save coding changes from that stale
tab.
Exp : UI editing is disabled. The stale tab is rejected with 409 "Medical
coding is finalized and locked. Reopen billing to make changes." and
the finalized codes are NOT overwritten. Verify by reloading.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-COD-11 | P2 | Finalize twice
Steps: 1. Finalize, then attempt to finalize again (stale tab or back button).
Exp : "Medical coding is already finalized. Reopen billing to edit."
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-COD-12 | P1 | Reopen billing
Steps: 1. Click "Reopen Billing" on a finalized session.
2. Change a code and finalize again.
Exp : Toast "Billing reopened". Editing is enabled again. Refinalizing
produces an updated billing document reflecting the change.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-COD-13 | P1 | Download the billing document
Steps: 1. Click "Download Billing Document".
2. Also try downloading on a session that was never finalized.
Exp : A PDF downloads and opens correctly with the right patient, doctor,
date and codes. On a never-finalized session:
"Billing document not found. Finalize billing details first."
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-COD-14 | P3 | Billing evidence and audit alerts
Exp : Billing evidence cards render. "Missing Data" and "Audit Risk - High
complexity code requires additional documentation." appear when a
high-complexity code lacks supporting documentation. Verify by
selecting a high-level E/M code on a thin note.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-COD-15 | P2 | Finalize from the live flow leaves a draft
Steps: 1. In an UNSAVED live session, finalize billing (it auto-saves a draft
first).
2. Go to the session list.
Exp : KNOWN BEHAVIOUR: the session is finalized but still sits in the DRAFTS
tab until you use "Save Session" or "Save Session" on the draft row.
Confirm this is what the business wants - a finalized-but-still-draft
session is easy to lose. Flag if it reads as wrong.
Result: [ ] Notes: _______________________________________________
================================================================================
SECTION 7 - SAVING: DRAFTS AND FINAL SESSIONS
================================================================================
--------------------------------------------------------------------------------
TC-SAVE-01 | P1 | Save Draft from the transcription stage
Steps: 1. Mid-transcription click "Save Draft".
Exp : Button shows "Saving...", then toast "Draft saved successfully" and the
dialog "Draft Saved Successfully" showing the session name and
timestamp, with "Continue Editing" and "Go to Sessions". Continue
Editing returns you exactly where you were.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-SAVE-02 | P1 | Draft round-trip fidelity
Steps: 1. Build a rich session: transcript, edited notes, vitals, 2 meds,
2 labs, some coding selections, internal notes.
2. Save Draft, leave the module entirely, reopen the draft from the
Drafts tab.
Exp : EVERY field comes back exactly: transcript text, each note section,
vitals with their badges, medications, lab orders, coding selections,
internal notes, the selected template, and the language. You also land
back on the correct stage and tab.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-SAVE-03 | P1 | Deliberately clearing a field on a draft
Steps: 1. On a draft with internal notes, delete all the internal-notes text
and save the draft again. Reopen.
Exp : The field is EMPTY, not restored to the old value. (Omitted fields are
preserved; explicitly emptied fields must be cleared.)
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-SAVE-04 | P1 | Save Session (final)
Steps: 1. From Outputs click "Save Session".
Exp : Button shows "Saving...", then the dialog "Session Saved Successfully!"
with "Close" and "Go to History". The session appears in the Completed
Sessions tab and disappears from Drafts.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-SAVE-05 | P1 | Final save requires a patient
Steps: 1. Attempt a final save with no patient selected.
Exp : Blocked with a clear message; nothing is saved.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-SAVE-06 | P1 | Save failure handling
Steps: 1. Stop the backend (or block the request in DevTools) and click
"Save Session".
Exp : Toast "Session save failed" and the success dialog does NOT appear.
The work stays on screen and can be retried once the backend returns.
Confirm the retry succeeds and does not create a duplicate session.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-SAVE-07 | P2 | Buttons disabled while saving
Steps: 1. Click "Save Session" and immediately try to click it again and also
click "Save Draft".
Exp : Both are disabled while a save is in flight. Only ONE session is
created - check the list for duplicates.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-SAVE-08 | P2 | Empty draft placeholder
Steps: 1. Save a draft with no notes at all.
Exp : The draft still appears in the Drafts tab (it stores a "Draft Notes"
placeholder) and reopening it lands you on the transcription stage, not
on a notes stage full of the placeholder text.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-SAVE-09 | P1 | Two tabs, same session - last write wins
Steps: 1. Open the same draft in two browser tabs.
2. In tab A change the Assessment section, save.
3. In tab B (loaded earlier, unaware of A) change the Plan section and
save.
4. Reload.
Exp : KNOWN BEHAVIOUR: there is no version check, so tab B's save overwrites.
Record precisely what is lost. If tab A's edit silently disappears with
no warning, raise it - this is the most likely source of "my notes
vanished" reports from doctors.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-SAVE-10 | P2 | Patient by code vs UUID
Steps: 1. Save a session selecting the patient normally.
2. If the UI allows entering a patient_code, use that instead.
Exp : Both resolve to the same patient. Junk values ("n/a", "unknown",
"null") are refused with "patient_id is required" rather than creating
an orphan session.
Result: [ ] Notes: _______________________________________________
================================================================================
SECTION 8 - CRASH RECOVERY
================================================================================
--------------------------------------------------------------------------------
TC-RCV-01 | P1 | Recover after a browser crash
Steps: 1. Build up a session with a transcript and notes but do NOT save.
2. Kill the browser tab (or the whole browser) without saving.
3. Reopen the app.
Exp : Toast "Unsaved session recovered" with Resume and Discard actions,
visible for about 20 seconds.
- Resume restores the transcript, notes, patient and stage.
- Discard removes the backup and the toast does not reappear on the
next reload.
Result: Resume [ ] Discard [ ] Notes: __________________________
--------------------------------------------------------------------------------
TC-RCV-02 | P2 | No recovery prompt while a session is live elsewhere
Steps: 1. Keep an active session open in tab A.
2. Open the app in tab B.
Exp : Tab B does NOT show the recovery toast while tab A is alive (a
heartbeat suppresses it). Otherwise two tabs fight over one session.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-RCV-03 | P3 | Recovery window expiry
Steps: 1. Create an unsaved backup and leave it for more than 24 hours (or
edit the stored timestamp in localStorage to simulate).
Exp : The stale backup is not offered for recovery.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-RCV-04 | P2 | Recent keystrokes are captured
Steps: 1. Type into a note section and crash the tab within about 1 second.
Exp : KNOWN LIMIT: the backup is debounced at roughly 600 ms, so the last
moment of typing can be lost. Confirm the loss is at most the last
second - anything larger is a defect.
Result: [ ] Notes: _______________________________________________
================================================================================
SECTION 9 - SESSION LIST AND HISTORY
================================================================================
--------------------------------------------------------------------------------
TC-LIST-01 | P1 | Completed and Drafts tabs
Exp : Header "Session History", both tabs present, the Drafts tab carries a
count badge that matches the actual number of drafts.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-LIST-02 | P1 | Row content
Exp : Each row shows patient name, type badge, recording-source badge,
Patient ID, purpose or description, and "Date Recorded". Nothing shows
"undefined", "null" or a raw UUID where a name belongs.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-LIST-03 | P2 | Search
Steps: Search by patient name, by patient code, and by session name. Then
search for a string that matches nothing.
Exp : All three match. No match shows "No sessions found matching your
search." Search is not case-sensitive.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-LIST-04 | P2 | Sort and date filters
Steps: Toggle newest/oldest. Apply date-from and date-to filters.
Exp : Order changes correctly. Date filtering includes the boundary dates.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-LIST-05 | P2 | Pagination
Pre : More sessions than one page.
Steps: Page through to the last page and back.
Exp : No duplicated or skipped rows across page boundaries. Page size is
capped at 100.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-LIST-06 | P1 | Promote a draft with "Save Session"
Steps: 1. On a draft row click "Save Session".
Exp : Spinner, then toast "Session saved" and the view switches to the
Completed tab with the session there and gone from Drafts. If the
draft was linked to an appointment, that appointment is now completed.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-LIST-07 | P2 | Promote an already-saved session
Steps: 1. Trigger promote twice (double-click, or a stale tab).
Exp : No error and no duplicate. The second call reports it was already
saved.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-LIST-08 | P1 | Delete a draft
Steps: 1. Click the trash icon on a draft row. Then reload the page.
Exp : Toast "Draft deleted successfully" and the row is gone AFTER a reload
too (i.e. it really was deleted on the server, not just hidden).
Failure shows "Could not delete draft on server".
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-LIST-09 | P1 | Delete from the "..." menu on a COMPLETED session
Steps: 1. Open the ... menu on a completed session row and click Delete.
2. RELOAD the page and look for the session again.
Exp : SUSPECTED DEFECT - the menu item appears to only show the toast
"Session deleted successfully!" without calling the API, so the session
REAPPEARS after a reload. Confirm and log this. Also check whether any
confirmation prompt is shown before deleting clinical data at all.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-LIST-10 | P2 | Deleted sessions stay gone
Steps: 1. After deleting a session, search for it and check the patient's
visit history and vitals history.
Exp : It does not appear anywhere - list, search, patient summary, or vitals
history.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-LIST-11 | P3 | Empty states
Pre : A doctor account with no sessions at all.
Exp : "No completed sessions yet. Finish a recording to see it here." and
"No draft sessions yet. Save a session as draft to see it here."
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-LIST-12 | P2 | List loads fail silently
Steps: 1. Block the sessions list request in DevTools and reload.
Exp : KNOWN RISK: the loader may fall back to an empty list, so a network
failure looks identical to "you have no sessions". Record what the user
sees. An error state should be shown instead - log a defect if not.
Result: [ ] Notes: _______________________________________________
================================================================================
SECTION 10 - VIEWING A PAST SESSION
================================================================================
--------------------------------------------------------------------------------
TC-VIEW-01 | P1 | Open a completed session
Steps: 1. Click "View" on a completed session.
Exp : All six tabs render with the saved content. Everything matches what was
saved - no missing sections, no content from a different session.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-VIEW-02 | P2 | Hydration failure
Steps: 1. Block the single-session GET and click View.
Exp : Toast "Could not load full session details" and the list-level data is
still shown rather than a blank screen.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-VIEW-03 | P1 | Cross-patient guard
Steps: 1. Select Patient 1 in the patient context, then open a session that
belongs to Patient 2.
Exp : Toast "Session Mismatch - The session does not belong to the selected
patient." Patient 2's clinical data is NOT displayed under Patient 1.
This is a PHI-leak check - treat any failure as P1.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-VIEW-04 | P2 | Edit coding from the view screen
Steps: 1. On a non-finalized session, change a code in the Coding tab.
2. Reload.
Exp : The change auto-saves and survives the reload. On failure:
"Could not save coding changes".
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-VIEW-05 | P2 | Assign a patient to an unsaved session
Exp : Blocked with "Session not saved yet - Save the session before assigning
a patient." On a saved one it succeeds with "Patient set to {name}".
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-VIEW-06 | P2 | Reassign a session to another patient
Steps: 1. Reassign a saved session from Patient 1 to Patient 2.
2. Check both patients' visit histories.
Exp : The session moves cleanly - it appears under Patient 2 and no longer
under Patient 1. Vitals move with it.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-VIEW-07 | P2 | Download PDF and copy note
Exp : The PDF contains the full note with correct patient and doctor details.
Copy note puts the text on the clipboard - paste it somewhere to check
formatting is not mangled.
Result: [ ] Notes: _______________________________________________
================================================================================
SECTION 11 - PAST-VISIT CONTEXT AND PATIENT CONTEXT
================================================================================
--------------------------------------------------------------------------------
TC-CTX-01 | P2 | Import a past visit
Pre : Patient with several past visits.
Steps: 1. Open "Import Past Visit", tick one or more visits, preview and edit
the SOAP, then import.
Exp : A block headed "Previous Visit (date)" is prepended to the note. The
current visit's content is not overwritten. Importing twice does not
duplicate the block uncontrollably.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-CTX-02 | P2 | Import from a patient with no past visits
Exp : Clear empty state ("No written notes were saved for this visit." or
similar). No crash and no blank dialog.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-CTX-03 | P2 | Patient Context dialog
Steps: 1. Open Patient Context for a patient WITH allergies, medications,
vitals and history.
2. Repeat for the patient with no history.
Exp : Full data renders for the first. The second shows "No allergies
recorded", "No medications recorded", "No clinical history available
for this patient." - not blank panels or errors.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-CTX-04 | P2 | Allergy extraction on final save
Steps: 1. Dictate a new allergy ("she's allergic to penicillin, comes up in
hives").
2. Save the session finally, then open the patient's record.
Exp : The allergy is added to the patient. Re-saving does not duplicate it.
Nothing that was NOT stated is added.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-CTX-05 | P2 | Vitals reach the patient record
Steps: 1. Save a session with vitals finally, then open the patient's vitals
history.
Exp : The vitals appear against the correct date. Vitals from a DRAFT session
must NOT appear - verify with a draft that has vitals.
Result: [ ] Notes: _______________________________________________
================================================================================
SECTION 12 - DOWNSTREAM EFFECTS ON FINAL SAVE
================================================================================
--------------------------------------------------------------------------------
TC-DWN-01 | P2 | Follow-up appointment draft
Steps: 1. Dictate a follow-up instruction ("let's see her again in two weeks").
2. Save finally, then open the Appointments module.
Exp : Toast "Draft created in Appointments" and a DRAFT follow-up appointment
exists for the right patient at roughly the right date. It is a draft,
not a confirmed booking.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-DWN-02 | P2 | Referral drafts
Steps: 1. Dictate a referral ("I'm referring him to cardiology").
2. Save finally and open the Referrals module.
Exp : A draft referral exists. Saving the same session again does NOT create
a duplicate referral.
CHECK: referrals must be derived from the CLINICAL NOTES, not the raw
transcript. Test by dictating a referral, then DELETING the referral
sentence from the generated note before saving - no referral should be
created.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-DWN-03 | P2 | Downstream failures do not block the save
Steps: 1. Break or stop the AI engine, then do a final save on a session that
would normally trigger appointment / allergy / referral extraction.
Exp : The SESSION STILL SAVES. The extras are skipped silently or with a
warning. A failed referral extraction must never lose the note.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-DWN-04 | P3 | Analytics counts
Steps: 1. Note the dashboard session / patient / draft counts.
2. Save one new session and one new draft, then recheck.
Exp : Counts increase correctly and are scoped to the logged-in doctor only.
Result: [ ] Notes: _______________________________________________
================================================================================
SECTION 13 - SECURITY AND NEGATIVE TESTS
================================================================================
--------------------------------------------------------------------------------
TC-SEC-01 | P1 | Audio file path traversal
Steps: 1. Request the audio endpoint with a filename such as
../../etc/passwd and with an absolute path.
Exp : 400 "Invalid audio filename". No file outside the upload directory is
ever served.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-SEC-02 | P1 | Another doctor's audio
Steps: 1. As Doctor A, request the audio filename belonging to Doctor B's
session.
Exp : Access denied or not found. Recorded consultations must not be
readable across doctors. Any success here is a P1 PHI leak.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-SEC-03 | P2 | CSRF protection
Steps: 1. Using DevTools, replay a save request with the X-CSRF-Token header
removed, and again with a wrong value.
Exp : 403 "CSRF validation failed" in both cases.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-SEC-04 | P2 | Invalid language code
Steps: 1. Send a transcription request with language "zz".
Exp : 422 rejection, not a crash and not a silent switch to English on a
NEW request. (An invalid value stored on an OLD draft may fall back to
English on load - that is acceptable; note which behaviour you see.)
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-SEC-05 | P2 | Empty transcription rejected
Steps: 1. Trigger note / summary / internal-notes / order extraction with an
empty transcript.
Exp : 400 "transcription is required" in each case. The UI shows a sensible
message rather than an empty generated note.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-SEC-06 | P2 | Delete then save race
Steps: 1. Open a draft in two tabs. Delete it in tab A. In tab B click Save.
Exp : KNOWN BEHAVIOUR: saving can RESURRECT a deleted session. Confirm and
record. Deleted clinical data reappearing is worth raising even if it
is intentional.
Result: [ ] Notes: _______________________________________________
--------------------------------------------------------------------------------
TC-SEC-07 | P3 | Long and special-character input
Steps: 1. Paste a very long transcript (50k+ characters).
2. Put emoji, quotes, angle brackets and a script tag into a note
section and a session name; save and reopen.
Exp : No truncation of clinical content without warning; special characters
render literally and are not executed anywhere, including in the
generated PDFs.
Result: [ ] Notes: _______________________________________________
================================================================================
SECTION 14 - CROSS-BROWSER AND RESPONSIVE
================================================================================
TC-BRW-01 | P2 | Run TC-REC-01, TC-OUT-02 and TC-SAVE-04 in each browser.
Chrome [ ] Firefox [ ] Safari [ ] Edge [ ]
Note especially microphone capture and live captions, which differ most
between browsers.
Notes: _______________________________________________
TC-BRW-02 | P3 | Tablet / narrow viewport: the recording controls, the tabs
and the footer action row all remain reachable; nothing overlaps and no
button is pushed off-screen.
Result: [ ] Notes: _______________________________________________
================================================================================
REGRESSION SMOKE TEST (the 10-minute run before any release)
================================================================================
1. Log in as a doctor. [ ]
2. Start a session, select a patient, record 60 s of speech. [ ]
3. Transcript appears and is correct. [ ]
4. Generate clinical notes - sections are filled. [ ]
5. Vitals, medications and lab orders extracted. [ ]
6. Save Draft - success dialog appears. [ ]
7. Leave, reopen the draft - everything is intact. [ ]
8. Generate coding, approve codes, set a Primary ICD. [ ]
9. Save Session - success dialog appears. [ ]
10. Session is in Completed, not in Drafts. [ ]
11. View it - all tabs show the saved content. [ ]
12. Finalize billing and download the billing document. [ ]
13. The linked appointment shows as completed. [ ]
================================================================================
DEFECT LOG
================================================================================
ID | TC ref | Severity | Summary | Steps to reproduce | Actual vs expected
---+--------+----------+---------+--------------------+-------------------
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
================================================================================
SUMMARY
================================================================================
Section Total Pass Fail Blocked N/A
1 Access control 6 ____ ____ ______ ____
2 Starting a session 7 ____ ____ ______ ____
3 Recording and transcription 11 ____ ____ ______ ____
4 Medications and lab orders 7 ____ ____ ______ ____
5 Outputs 11 ____ ____ ______ ____
6 Coding and billing 15 ____ ____ ______ ____
7 Saving 10 ____ ____ ______ ____
8 Crash recovery 4 ____ ____ ______ ____
9 Session list 12 ____ ____ ______ ____
10 Viewing a session 7 ____ ____ ______ ____
11 Past-visit / patient context 5 ____ ____ ______ ____
12 Downstream effects 4 ____ ____ ______ ____
13 Security and negative 7 ____ ____ ______ ____
14 Cross-browser 2 ____ ____ ______ ____
---- ---- ---- ------ ----
TOTAL 108 ____ ____ ______ ____
Sign-off: ____________________ Date: ____________
Release recommendation: [ ] Go [ ] No-go [ ] Go with known issues
================================================================================
Clinical Notes
I'm sorry, but the provided transcription does not contain any clinical content or doctor-patient conversation that can be converted into clinical notes. Please provide a transcript of a medical consultation for me to assist you in generating clinical notes.