How we measure accuracy.
Transcription accuracy and documentation hallucination are tested as one thing: one harness, one versioned corpus, one end-to-end run per recording — then graded through two complementary layers. Layer A (Word Error Rate) measures how the speech-to-text pipeline performed against verbatim ground-truth. Layer B (LLM jury) measures whether the generated clinical document captured the facts that were declared important up front, and whether it added anything that wasn't said. Reasoning split across two layers, not collapsed into a single score that hides the trade-offs.
Why this is one methodology, not two
It's tempting to publish a WER number and a separate "hallucination rate" on different pages. We don't, because they share everything that matters: the same audio, the same end-to-end run, the same versioned corpus, the same release cadence, and the same set of reviewers signing off the underlying ground truth. Splitting them into two pages would suggest two independent programmes — in fact a single run produces both numbers, and a regression in one usually shows up in the other. Each recording flows through the production pipeline once; the artefacts from that one run feed every layer of evaluation below.
- 1Recording — audio + verbatim ground-truth + pre-registered fact list, version-pinned in the repo.
- 2End-to-end run — clinician sign-up, patient creation, recording, document generation. Same paths a production user takes.
- 3Layer A — WER compares the captured transcript to ground truth.
- 4Layer B — LLM jury grades the generated document against the fact list, atomically, one fact per call.
- 5Aggregate & publish — single
aggregate.jsonrenders the public transparency page.
The corpus
A fixed, version-pinned set of recordings the methodology runs against. Each recording is paired with a verbatim transcript and a hand-authored fact list of the clinical points that should appear in the generated note (and the points that must not).
v1 — synthetic, multi-vendor TTS
Synthetic audio sounds artificial; we use it deliberately. The script is the reference transcript, so ground truth is exact rather than transcriber-approximated. The whole corpus can be published byte-for-byte alongside the validation report — auditors can re-run the harness against the same input and reproduce the published numbers.
-
✅
Multi-vendor accent sweep
Each accent / cohort cell is sampled from at least two TTS vendors — ElevenLabs, OpenAI TTS, Google Cloud TTS, Azure Neural — so single-vendor voice-library artefacts surface as cross-vendor disagreement rather than absorbing silently into the headline number. Coverage spans NZ, AU, UK, US, Indian, and Pacific-influenced English plus L2 speaker profiles, across allied-health, primary-care, and outpatient appointment types.
-
✅
Pre-registered fact list per recording
Drafted by the script author, signed off by the Clinical Lead before any model sees the audio. Three buckets: positive facts (must appear in the note), negative facts (must not be falsely asserted), and allow-listed boilerplate (clinical safety-net language permitted even when not in the transcript). Fact lists are version-pinned; changes bump the version and trigger a re-run.
-
🟡
What v1 does and does not claim
v1 measures regression, upper-bound WER on clean audio, end-to-end pipeline correctness, repeatability, and per-cohort STT variance across English-accent cells. v1 does not claim performance on real-world environmental noise, te reo Māori, authentic code-switching, dysfluency, dysarthria, or paediatric speech — synthetic TTS is unrepresentative for those. LLM-layer bias on real cohort content graduates to v2/v3.
Graduation roadmap
| Version | Audio source | Bias claim | Target |
|---|---|---|---|
| v1 | Multi-TTS, multi-accent synthetic — 10 recordings spanning the accent and appointment-type sets | Substantive Layer A bias signal across English-accent variation; LLM-layer bias remains a v2/v3 gate | Delivered |
| v2 | Role-play: NZ clinicians + clinical actors in clinical-realistic environments | First cohort-specific bias signal — limited by scripted content | Contract +60 days |
| v3 | Real consent-based recordings, AU production cohort first, then partner NZ clinics | Real-world bias measurement on AU / partner-NZ cohorts | Contract +120 days |
| v4 | Joint clinical validation cohort with Health New Zealand | HNZ-deployment-representative bias claims | Per HNZ deployment milestone |
Layer A — Word Error Rate
The mechanical layer. Word Error Rate is a long-established speech-recognition metric: the count of substitutions, insertions, and deletions between what was transcribed and what was actually said, divided by the reference word count. Lower is better; 0% means the transcript matched ground truth word-for-word.
WER = (substitutions + insertions + deletions) / reference word count
- Library.
jiwer, version-pinned in the harness lockfile, so the exact numbers are reproducible from any commit. - Normalisation. Lowercase, strip punctuation, expand common abbreviations (mg → milligram, etc.), Unicode NFKC. Normalisation rules are version-pinned; cosmetic differences don't get penalised, real errors do.
- Confidence intervals. Bootstrap resampling (10,000 resamples) at 95% confidence; published as
WER% [lower, upper], not a bare point estimate. - Per-cohort breakdown. Computed overall and per cohort tag (accent, age band, gender, specialty, audio condition, language). The variance across cohorts is the bias signal — even when the absolute numbers are upper bounds.
- Per-recording WER. Published so a regression can be traced back to a specific recording, not buried under an average.
Industry baseline anchor. Published WER ranges for ambient scribe products in healthcare typically sit in the 6–12% range for clean-audio English on technical content. Hanah's v1 numbers are presented alongside this range so reviewers have context, rather than evaluating a bare number against an undefined "clinically acceptable" bar.
Honest limitation. A high-impact substitution (10mg → 100mg) and a low-impact one
(okay → OK) count the same in raw WER. That's why Layer B exists — clinical-content correctness
cannot be inferred from token-level WER alone.
Layer B — LLM jury for coverage and hallucination
The qualitative layer. The generated clinical document is graded against the recording's pre-registered fact list by a panel of independent LLM evaluators drawn from multiple vendors. Two properties are measured separately so they can be reported separately:
Did the note capture each clinical fact the recording asked for? One jury call per pre-registered expectation in detailsThatMustBeCaptured, per output, per juror, repeated for an internal majority vote. Yes / partial / no.
Does the note contain clinically-meaningful claims that are not supported by the transcript? One jury call per generated output, per juror, returning a list of fabricated claims — content the model invented. Cross-juror agreement is preserved in the panel union.
The exact prompt every juror sees
System prompt and user-message template are version-pinned in the harness repo
(app/next/tests/accuracy/lib/juror.ts) and synced to this page on
every results refresh. Both are reproduced verbatim below — auditors see exactly
what the model was asked, not a paraphrase. Reruns and panel composition vary;
the prompt envelope itself does not.
REGION=uk website/publish-trust.sh.Atomic single-question calls
Every judgment the harness asks of the jury is one fact, one question, one call. Asking a model to grade an entire note in a single call is well-known to produce "looks fine" averaging where individual errors get smoothed over. Atomic calls are also auditable — anyone can re-run a single judgment and see all three juror responses plus the panel verdict.
What counts as a hallucination
For each output, the jury is given the transcript and the generated document. Each juror enumerates every clinically-meaningful claim in the output that is not supported by the transcript — the model invented it. The panel result is the cross-juror union, deduped by claim text. The headline metric counts only confirmed flags — claims flagged by ≥2 jurors; single-juror flags are surfaced as "provisional" in the per-output drill-down but excluded from the headline. The two-juror agreement bar is what makes the metric robust against a single juror's strict-interpretation false positives.
| Counts as a hallucination | Does not count |
|---|---|
| A symptom, finding, history item, dose, medication, side (left vs right), measurement, or temporal detail asserted in the output but not grounded in anything actually said in the transcript. | Boilerplate, document headings, formatting, or section labels. |
| A wrong-dose, wrong-side, or wrong-medication claim, even when surface-similar to something said. | Phrasing variations and paraphrases that preserve the clinical meaning of something the transcript actually contained. |
| An invented finding presented as fact ("patient denies fever" when the transcript was silent on fever). | Reasonable structuring of grounded content into note sections (e.g. moving a symptom into "History of presenting complaint"). |
| A clinical statement that goes beyond reasonable paraphrasing of the transcript. | Standard safety-net language that does not assert a new clinical fact ("recommend review if symptoms worsen"). |
We deliberately do not flag content that is grounded in the transcript but
outside the expectations list. detailsThatMustBeCaptured is a must-have list,
not a "this is everything the document should contain" contract — penalising every grounded
claim that wasn't on it produced too many false positives, especially for SOAP-style notes
whose Objective and Assessment sections legitimately go beyond the named must-haves.
Jury composition
Independent models from multiple vendors, so failure modes are uncorrelated. The harness is provider-agnostic: any model exposed through a supported adapter can sit on the panel, and panel size grows over time as adapters land. The pattern is published as Replacing Judges with Juries (Verga et al., 2024, Cohere) — we use it because triangulation across independent models lands more cleanly in clinical-safety contexts than single-model trust.
| Slot | Vendor | Notes |
|---|---|---|
| Juror A | Anthropic (Claude, Sonnet or Opus tier) | Strong instruction-following; conservative on hallucination calls. |
| Juror B | OpenAI (GPT-4 family) | Different training corpus and alignment approach to A. |
| Juror C | Open-weight (Llama or Mistral) | Transparency lever — HNZ or any reviewer can re-run this slot themselves. |
| Juror D (optional) | Google (Gemini) | Same vendor as the production generation pipeline. Reported separately — see caveat below. |
Same-vendor caveat. Gemini may participate in the jury, but the production document-generation pipeline also uses Gemini, and same-vendor judging can produce correlated blind spots — a fabrication produced by Gemini-as-generator may be more likely to be considered plausible by Gemini-as-judge. The mitigation is operational: Gemini's verdicts are reported separately from the multi-vendor panel verdict, so a reader sees what Gemini-only would have said versus what the multi-vendor panel said. When the panel is N=1 and that single juror is Gemini (e.g. early dev runs), the validation report names this explicitly so readers don't over-read those numbers.
Decision rule (scales with panel size)
| Panel size | Decision rule |
|---|---|
| N = 1 | The single juror's verdict stands; juror-internal repeat-and-vote is the variance-reduction lever. |
| N = 2 | Both must agree; on disagreement the call is logged as a split and the conservative verdict (partial) is recorded. |
| N ≥ 3 | Majority vote per Verga et al.; unanimous verdicts are recorded as high confidence; majority-but-not-unanimous is logged as a split. |
| Any size | Disagreement on hallucination severity is promoted to Clinical Lead manual review on the published subset. |
Reports include the per-recording jury agreement rate: the fraction of calls where the jury was unanimous (when N ≥ 2). High unanimity signals clear-cut cases dominate; high split rate signals the methodology is operating in the hard zone. Both are useful information for evaluators, not flaws to hide.
Repeat-and-vote per juror
Each juror is called R times at temperature 0 (default R = 3, configurable per run); the juror's vote is the majority of its own R responses. This kills the 5–10% of calls where a single juror has a flaky response. Cost is N × R calls per judgment; the model classes used are cheap relative to the generation pipeline, and the variance reduction is the point. Lower R for fast development iteration; raise R for higher-confidence published numbers.
Calibration and inter-rater agreement
- Calibration sanity check (per harness version). A hand-crafted obviously-good note and an obviously-bad note are run through the jury. The jury must score these correctly — if it doesn't, the methodology is broken before any real evaluation runs and the harness is paused for investigation.
- Inter-rater agreement against humans (per report). A 20% subset of recordings is independently graded by the Clinical Lead. Cohen's κ is computed between jury verdicts and clinical-expert verdicts on that subset and published in the validation report.
| Cohen's κ | Treatment |
|---|---|
| ≥ 0.7 | Jury verdicts are defensible as a proxy for clinical-expert judgement. |
| 0.5 ≤ κ < 0.7 | Published with explicit caveat; methodology iteration triggered. |
| < 0.5 | Methodology fails this report; results are not published as accuracy claims; harness is investigated. |
Cohen's κ is not a vibe metric — it controls for chance agreement. Including it converts the jury from "trust the LLMs" to "the LLMs were measured against a clinician on every report".
Layer C — Semantic drift scheduled
A bridge metric between raw WER (token-level) and the LLM jury (clinical-content level). Both the reference transcript and the generated documentation are embedded with a shared embedding model; cosine similarity gives a drift score per recording. Captures restructuring fidelity — documentation is meant to abstract from the source, but should preserve clinical meaning. Useful as a cheap continuous metric without per-recording annotation, and trends easily over time. Outliers (drift > N σ from mean) are flagged for human review. On the roadmap; not in the v1 published numbers.
Repeatability
A pipeline can be accurate-on-average but inconsistent — the same audio producing different documentation each time is a clinical-safety concern, not a curiosity. A subset of corpus recordings is processed N times per CI run (default 3). All evaluation layers run on each rerun; variance across reruns is the repeatability score, reported alongside the headline accuracy numbers.
Reporting cadence
| Artefact | Audience | Cadence |
|---|---|---|
| CI summary | Engineers | Per pull request — pass/fail with diff against main, ~10 minutes runtime, fails on regression beyond threshold (overall WER > 2 pp, any cohort > 5 pp). |
| Nightly trend | Engineering + leadership | Continuous — full corpus, full per-cohort breakdown, repeatability evaluation. |
| Public transparency report | Customers, evaluators, auditors, regulators, the public | Quarterly — every recording, transcript, generated document, per-juror verdict and reasoning. Live page renders directly from the harness's aggregate.json. |
Reproducibility
- Versioned everything. Audio + transcripts + fact lists + jury prompts + judge model versions are all committed to the repository. The harness is re-runnable from the repository state at any commit.
- Single-script publish. A new harness run is published end-to-end with one script (
./publish.shfrom the transparency directory). It copies the harness'saggregate.jsoninto the page's data file and rsyncs the audio files for in-browser playback. No build step, no framework, no editorial layer. - Open under NDA, then open-source. The harness code is open to HNZ under NDA during technical due diligence, with a longer-term goal of open-sourcing it (target: 12 months post-deployment) so external auditors can re-run the methodology end-to-end.
- Public corpus where it can be. v1 (synthetic) and v2 (role-play, performer-released) corpora can be open-sourced. v3 (real consent-based) recordings remain restricted due to PHI sensitivity even after PHI minimisation; aggregate per-cohort numbers are published, raw audio and transcripts are not.
Statistical methodology
Boring but defensible. Specifying these explicitly converts every report from "we ran the harness" into "we ran the harness with this method, others can reproduce".
| Element | Choice |
|---|---|
| WER computation | jiwer Python library, version-pinned in the lockfile. |
| Text normalisation | Lowercase, strip punctuation, expand common abbreviations, Unicode NFKC. Rules version-pinned. |
| WER confidence intervals | Bootstrap resampling (10,000 resamples) at 95% confidence; reported as WER% [lower, upper]. |
| Per-cohort comparison | Paired bootstrap on the same recording set across versions; permutation test for cross-cohort differences. |
| Inter-rater agreement | Cohen's κ between jury and Clinical Lead on the 20% human-graded subset, reported per metric (coverage, hallucination), not just overall. |
| Hallucination rate denominator | Sentences in the generated note (so the rate is comparable across notes of different length). |
| Coverage rate denominator | Pre-registered positive facts (so 100% means every required fact is captured). |
| Per-juror disagreement | Fleiss' κ across the jury per call, aggregated per recording — a juror-consistency check (computable when N ≥ 2). |
| Multiple-comparison handling | Benjamini-Hochberg FDR correction when testing per-cohort differences across many cohorts simultaneously. |
| Variance reduction | Repeat-and-vote (3× per juror at temperature 0); jury-of-three majority per Verga et al. |
Limitations stated up front
These appear on page 1 of every validation report so consumers understand the scope of what's being measured.
- Overall WER on synthetic audio is an upper bound on real-world WER. Real audio has environmental noise, overlapping speech, dysfluency, and clinical-environment artefacts absent from synthetic.
- Per-cohort STT WER variance across English-accent cells produced by multiple TTS vendors is a substantive Layer A bias signal — using more than one vendor per cell surfaces single-vendor voice-library artefacts as cross-vendor disagreement rather than absorbing them silently into the headline number.
- v1 does not establish LLM-layer bias (omission, stereotyping, cultural fit) or performance on te reo Māori, authentic code-switching, dysfluency, dysarthria / AAC, or paediatric speech — those remain real-cohort gates and graduate to v2 (role-play with NZ clinicians + actors) and v3 (real consent-based audio).
- Synthetic NZ-accent and Māori-accent voices are trained on small, potentially unrepresentative corpora; cross-vendor sampling reduces but does not eliminate that risk. They are not a substitute for real Māori speakers and the harness does not present them as such.
- v1 hallucination rate is an under-bound. Clean input gives the LLM less noise to confabulate from; real-world rates will be higher.
- The LLM jury is itself imperfect. Cohen's κ against Clinical Lead grading is the published bound on how far jury verdicts are trusted. κ < 0.5 means the report is not published as an accuracy claim.
- Allow-listed boilerplate is a judgement call. A permissive list reduces false hallucination flags but could mask genuine drift. Allow-list changes require Clinical Lead approval and are logged.
- Pre-registered fact lists encode a clinician's view of what matters. Reasonable disagreement on what a note "should" capture is possible.
- HNZ-deployment-specific accuracy can only be confirmed by deployment-specific validation. v3 covers the AU production cohort; v4 (joint with HNZ) is the path to NZ-deployment-representative numbers.
- Repeatability tests catch within-run variance; cross-version drift is reported separately as a quarter-over-quarter paired comparison.
- Sample-size honesty. With n = 10 recordings spread across 4–5 cohorts, per-cohort confidence intervals are wide. Wide intervals are reported transparently with growth plans, rather than presenting narrow-but-unrealistic intervals.
Where the evidence lives
Per-recording transcripts, generated documents, and per-LLM jury verdicts against the v1 corpus. Drill into any recording.
Open transparency report →The full machine-readable artefact the transparency page renders from. Every published number is computable directly from this file.
Open raw data →Security and privacy controls, subprocessors, and Privacy Act 2020 / HIPC 2020 alignment for the broader programme this methodology sits inside.
Trust Center home →References
- Verga, P. et al. (2024). Replacing Judges with Juries: Evaluating LLM Generations with a Panel of Diverse Models. Cohere. Published basis for the panel-of-LLM (PoLL) jury pattern used in Layer B.
- Zheng, L. et al. (2023). Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena. Documents single-judge limitations the jury pattern addresses.
- Cohen, J. (1960). A Coefficient of Agreement for Nominal Scales. Educational and Psychological Measurement. The κ statistic used for jury-vs-clinician agreement.
- Fleiss, J. L. (1971). Measuring Nominal Scale Agreement Among Many Raters. Psychological Bulletin. Used for per-juror consistency.
jiwer— open-source Python library for WER and related metrics; version-pinned in the harness lockfile.
Methodology v1.1 · last updated 2026-04-29 · maintained by CEO + Clinical Lead + engineering. The published validation report cites the methodology version it was produced under so claims are always traceable to the exact rules they were graded by.
