Skip to content

AI Scribe · one visit, live Illustrative words · real path

A microphone is on in an exam room. The only question the patient in that room actually has is where the sound goes — so that is the first thing this page answers, before anything about notes or codes.

  • The audio not retained anywhere Streamed from the browser straight to Azure AI Speech and converted as it arrives. The sound never reaches a Qlynic server at all, so there is nothing of it for us to keep.
  • The transcript this browser tab only scribe-session.ashx never receives it. Its own header says the text is deliberately never sent here, and the module warns you before you close the tab for exactly that reason.
  • The subscription key stays on the server The browser is handed a short-lived authorisation token and the region string. It is never given the key, so a copied token is worth nine minutes.

The sound never lands anywhere. Only the text does.

The microphone is opened in the browser, downsampled to 16 kHz mono and pushed into Azure AI Speech’s own stream, in the canadacentral region, recognised as en-CA. Qlynic’s servers are not on that path at all — they never see a frame of it. What comes back is text, and the text lives in the tab you are looking at until you turn it into a note.

Nothing starts until somebody says so. The record button is disabled until the consent box is ticked, and the moment it is pressed the visit notes who confirmed it and the second they did, with two lines written into your activity log beside it: consent given, recording started. A patient who would rather not be transcribed at all is marked once on their record, and every future session for them is refused before the microphone is ever opened.

The pass is worth mentioning because it is the part that is easy to get wrong. Azure’s passes last about ten minutes; we treat them as nine, and the browser replaces its own at eight. Two margins, neither of which is the one that actually runs out, so a long consult cannot die mid-sentence.

AI Scribe · one minute of a consult Illustrative timing · real constants

Azure charges for every second of audio it is sent. A scribe that streams a whole appointment is charging you for the examination, the typing and the silence in between — so this one does not send those.

  • Spoken Four runs of speech in the minute — 8.0 + 7.5 + 5.0 + 7.5. 28.0 s
  • Streamed Each run plus its 1.8 s hangover, and 0.6 s of pre-roll on the three times voice resumed — 28.0 + (4 × 1.8) + (3 × 0.6). 37.0 s
  • Not sent The rest of the minute. Nobody was speaking, nothing was pushed, and the panel said Paused — listening for voice. 23.0 s
  • Wall clock What a scribe that streams continuously would have sent for the same minute, and what the second timer in the panel is showing you the whole time. 60.0 s
  • Starts when it hears a voice
  • Keeps the moment before you speak
  • Waits almost two seconds of quiet
  • Sends what speech needs, no more

Silence is the cheapest thing in the room. You should not be renting it.

Every frame of microphone audio gets an RMS check in the browser before it goes anywhere. Under the threshold, nothing is pushed — and because Azure bills per second of audio it receives, a second that is never sent is a second nobody charges for. The panel tells you which state it is in while it is happening.

Two things stop that from eating your words. The gate stays open for 1.8 seconds after the last voiced frame, so a pause in the middle of a sentence never cuts the stream. And the browser keeps a rolling 600 milliseconds of the silence you are currently in, and flushes it the instant you speak again — so the syllable that woke the gate was already on its way before the gate opened. The comment above those two constants in the source explains the tuning in one line: clipping a word costs more than a second of billed silence.

What reaches the server on stop is the billed figure, not the wall clock — durationSeconds is the streamed total. It is rounded up to the minute there (Math.Ceiling) and taken off your scribe wallet; anything past the balance accrues as overage at ten cents a minute rather than stopping you mid-visit. And if you would rather it simply streamed everything, Smart listening is a switch on the panel, not a setting somewhere.

AI Scribe · the draft it hands back Illustrative note · verbatim rules

Every scribe on the market will give you a note. The question worth asking is what it is allowed to put in one, and what happens to it the moment it exists.

  • Never invent “Use ONLY facts stated in the transcript or context. Never invent vitals, exam findings, diagnoses, dosages, or history. If something is unclear or unconfirmed, append [verify].”
  • Section discipline “Symptoms the patient reports belong in S; O contains only measured vitals, examination findings, and results actually obtained.”
  • Keep what you wrote “Never drop a fact from the existing note; preserve the provider’s own wording where it appears.”
  • Contraindications “If the context marks a medication as contraindicated for this patient, never restate it as an active order — list it only under a reconciliation flag.”

The scribe has no hand that reaches your chart.

The note comes back to the browser and lands in the same box you would have typed into. That is the end of what the scribe does with it. Writing the note leaves exactly one mark on your records — a line on the session saying a note was generated and how much work it took — and it cannot touch the note in the chart at all. Your own Save Record is the only thing that ever has.

What the model is given is assembled on the server and not accepted from the browser: the AI history summary for that encounter, which already carries the allergies and contraindications, and whatever you had already written. So the page cannot smuggle context in, and it cannot leave context out either. If you record twice in one visit, the second draft is told to integrate the first rather than replace it — the rule is that no fact already in the note may be dropped.

Two smaller things, both deliberate. The credit check runs before the model is called, on an estimate, so an exhausted wallet costs you a message rather than a bill. And the metering runs after, wrapped, so that if the accounting fails the note still comes back and the response simply says it was not billed. The comment in the source is the whole design in six words: never lose the note over accounting.

AI Scribe · the second pass Illustrative codes · real rule

Having written the note, it reads it back and proposes the billing. This is the part that would be dangerous if anybody took the model’s word for it — so nothing it says about a code is used except the code itself, as a lookup key.

Every code the AI proposes is checked against Alberta’s own lists before you ever see it — the exact code first, then a ranked match on the description. Anything that does not resolve is dropped. The description and the fee always come from Alberta’s list, never from the model. The rule, as it is written into the software

It proposes the billing. Your tables decide it.

A model that has read the whole internet is good at medicine and unreliable about which code set a particular province pays on. So the second pass treats every code it returns as a guess at a lookup key, nothing more. The key is tried against your own AHCIP tables — exact code first, then the same ranked description match the billing pickers use — and if neither finds a live row, the suggestion is discarded without ever reaching your screen. Even when the code matches exactly, the description the model wrote is thrown away and the table’s own wording is used instead.

Nothing here writes anything. The doctrine comment on the method says so in one line — suggest only; the client renders chips, the doctor acts — and the caps are in the code rather than in a policy document: at most four diagnostic codes, at most four service codes, at most six medications, anything under a confidence of 50 discarded, and two proposals that resolve to the same row collapsed into one.

Two more guards worth knowing about. If the user is not allowed to manage claims, the code sections are refused twice over: the prompt is told to return empty arrays, and the block that parses them never runs. And every suggested medication is re-checked against the patient’s allergies by local code after the model answers — including whole drug classes, which is how a sulfa allergy still catches Bactrim — so the model saying allergyConflict: false is not the last word on it.

AI Scribe · stopping Two writes · one transaction

The interesting failures in billing software are not the loud ones. They are the ones where two records that should agree quietly stop agreeing, and nobody finds out for a quarter.

Finishing the session and taking the minutes off your balance used to be two separate steps. A crash in between left a session that looked finished with minutes nobody was ever charged for — the log and the balance permanently out of step, and usage that quietly went unbilled. They are one step now: both or neither. Fixed 18 August 2026

  • The session row who attested, and when Who confirmed consent, and the moment they did, are written as recording starts — alongside the visit it belongs to and the person who started it.
  • Three or four audit rows the whole life of the session scribe.consented, scribe.session_started, scribe.session_completed carrying seconds, characters and billed minutes — and scribe.note_generated if a draft was made.
  • The audio nothing at all It went from the browser to Azure and was converted. There is no file, no blob and no row, because there was never anything to write one from.
  • The transcript nothing at all It lived in the tab. What survives it is whatever you chose to keep in the note — and a character count, because minutes and characters are what the bill is made of.

Two writes that cannot come apart. That is the whole trick.

When you press stop, two things have to be true at once: the session has to be marked finished with its duration on it, and your minute wallet has to be debited for those minutes. Until August they were two separate statements, and a process recycle in the gap between them produced a session that looked complete and minutes nobody was ever charged for. They are now one transaction, so a failure anywhere leaves the session still recording and the wallet untouched — a state you can see and retry, rather than a discrepancy you find later.

Stopping only ever matches a session that is still recording. Press stop twice, double-click it, or lose the connection halfway through and the second attempt finds nothing to stop and changes nothing. A retried request, a double-click or a flaky line cannot bill you twice for the same minute.

Minutes are rounded up per session, once, at the end — not per request and not per sentence. Past your balance they accrue as overage rather than cutting you off mid-consult, and the seconds and characters are clamped on the way in so a stuck browser cannot report a four-hour visit that did not happen.

Qlynic’s scribe is a witness, not a filing clerk. It listens because you asked it to and someone said yes; it hands you a draft and never files it; it proposes billing and lets your own tables throw out anything they do not recognise. Everything it keeps is a number you can add up, and everything it heard is already gone.