Troubleshooting

What the banners mean, what to do when something looks off, and the recovery paths for the failure modes brtlb actually sees in the wild.

Diarization banner

Amber banner above the note that says one of two things, sometimes both:

"Heads up — the transcription returned fewer distinct speakers than this visit likely had."

Means AssemblyAI collapsed multiple voices into one cluster. Symptom: a parent's history-taking and a child's first-person answers end up under the same speaker label. The note may attribute the wrong person.

"Speaker B may contain more than one voice — the assistant couldn't confidently assign a single role."

Means brtlb's own analysis found register shifts within one cluster (adult clinical vocabulary mixed with child one-word answers, etc.). Often correlates with the count issue above.

What to do

  1. If brtlb proposes an Apply split button right there in the banner, that's the fastest fix. Tap it. brtlb renames the merged speaker (e.g., BB1 + B2) and seeds role chips. Click Regenerate after to get a fresh note with the new attribution.
  2. If there's no Apply split button (recovery couldn't find a confident partition), open raw json in the top-right of the Review screen. Scan the transcript for the suspect speaker. Tag the speaker chips manually if needed, then Regenerate.
  3. If both fail, the cleanest fix is to re-record with the kid sitting on the parent's lap rather than across the room, or with the mic closer to the child. Same-gender voices at similar age tiers are AAI's hardest case.
When the banner stays quiet, diarization is healthy. The banner is a warning system, not a constant fixture.

Coverage banner

Amber banner that says something like:

"Heads up — the template expected 2 sections that aren't in the note: Anticipatory Guidance, Follow-up. Was any of this discussed?"

Or alternatively: "The last section ends without final punctuation — the model may have been cut off."

The first variant flags a structural gap: your template asked for sections the note doesn't contain. Sometimes that's correct (you didn't discuss them), sometimes the LLM dropped them.

The second variant flags a likely token-cap truncation — the model ran out of room and stopped mid-sentence.

What to do

Stuck on a stage

The Review screen shows a stage banner: uploading → transcribing → generating → ready. If it's stuck:

Stuck on "uploading"

Your connection dropped during the audio upload to AssemblyAI. brtlb auto-retries once. If it's still stuck after a minute:

Stuck on "transcribing"

brtlb polls AssemblyAI every 5 seconds and waits up to 90 minutes. Most visits finish in 30 seconds to 5 minutes. If the bar's been spinning for >15 minutes on a normal-length recording:

Stuck on "generating"

Gemini (or your chosen LLM provider) is slow or struggling. Gemini 2.5 Pro can take 10–30s on long visits; the very long developmental-eval template can push 60s. If you're past 2 minutes:

Network drops / iOS Safari suspend

Common scenario: you start brtlb on an iPad, the upload is going, you switch to Elation in another tab to grab a patient name. iOS suspends the brtlb tab. The upload fails with "Load failed."

brtlb detects this and surfaces:

"The connection was interrupted. This usually means your Wi-Fi/cellular dropped, the brtlb tab was suspended (common on iOS when you switch apps mid-upload), or [vendor] is briefly unavailable. Reopen brtlb on a stable connection and tap Retry from audio."

What to do

Audio storage issues

"Browser storage is not available"

You see this in Settings or on save errors. Causes (iOS Safari is the usual culprit):

"Device storage is full"

Amber banner appears during recording. IndexedDB filled up. The in-memory recording continues but new audio chunks aren't being persisted to backup storage — a tab crash from here on would lose audio.

Lost audio mid-recording

You see: "Recording was interrupted — Xs of audio lost."

Means the iOS / Android OS suspended the brtlb tab mid-capture (screen locked, app switched, etc.) and MediaRecorder stopped. brtlb acquires navigator.wakeLock at recording start to keep the screen awake, but if iOS overrides that (low battery mode, hardware lock button), the suspend can still happen.

What to do

"The microphone became unavailable"

Mid-recording error. Causes:

Stop, re-grant permission if needed, and re-record when the mic is available. Brief mic mutes (incoming call ignored) are tolerated; permanent loss is what triggers this error.

API key errors

"401 Unauthorized" from AssemblyAI

Your key is wrong or revoked. Settings → AssemblyAI key. Re-paste from your AAI dashboard.

"Workspace org policy block" from Gemini

Your Google Cloud project doesn't permit the Gemini API call. Two common causes:

"Anthropic API blocked by CORS"

Anthropic Enterprise (BAA-covered) keys block browser CORS calls — there's no current path for browser-only Anthropic with PHI. Use Gemini or Azure OpenAI for PHI; Anthropic is fine for non-PHI testing.

Wrong template auto-picked

Auto-detection looks at the transcript and picks soap / well-child / sick-visit / etc. When it picks wrong:

Note is missing detail you discussed

Three common causes:

Browser compatibility

brtlb checks four capabilities at boot. If any are missing, you get an explicit page telling you which:

Tested baseline: Chrome 120+, Safari 17+ (iOS 17+), Firefox 121+, Edge 120+. Older browsers may render but features will be flaky.

Nuclear option — reset

If brtlb is acting weird and nothing else helps, the global error boundary's recovery screen has a "Wipe local data and reload" button. This:

You will lose all local data. If you have unfinished visits, export them first via the Download button. Use this only when brtlb genuinely won't render or save correctly.

To trigger the recovery screen manually: open the browser console and run localStorage.setItem('brtlb.crash-test', '1') — that exposes the same recovery UI without losing data.