PatientMD test report

2026-08-11 15:42:21 UTC · branch master at 7333e37 · Mac156.local · triggered by console:mac156

passed run 20260811T154221Z-56d17d0e
Tests run
674
across 1 tier(s)
Passed
674
100.0% of those run
Failed
0
assertions that were evaluated and did not hold
Could not run
0
never reached an assertion
Skipped
0
deliberately not executed
Wall clock
4.1 s
whole run

Tiers

Backend · unit

Pure in-process tests — no database. These use the repo's `_FakeDB` or call functions directly, so they prove logic, not wiring.

Not selected for this run.
not run

Backend · integration

Tests that drive the mounted FastAPI app against a real Mongo. These are the ones that prove a route exists, is reachable, and is authorised — the class of defect unit tests have repeatedly passed straight through.

Not selected for this run.
not run

Frontend · unit

Node's built-in runner over the pure logic extracted into `lib/`. Fast and exhaustive over what it sees; it does not render a component or touch a route.

674 tests · 674 passed · 4.0 s

passed

Frontend · component

Renders real React components and asserts on the produced markup — the tier that can catch a screen that never reaches its data or an overlay that is not a dialog.

Not selected for this run.
not run

End-to-end · Playwright

Drives a real browser against a running frontend and backend. Opt-in: it needs both servers up, and a tier that cannot reach them is reported as an error, never as a pass.

Not selected for this run.
not run

Static analysis

ruff, mypy and the TypeScript compiler — findings that need no test to run.

Not selected for this run.
not run

Coverage

Frontend · unit
99.17%

6,594 of 6,649 statements · branches 90.4%. The vertical rule marks the 90% target.

Read this percentage with its scope. This runner measures only the files a test imported — an untested module is absent from the denominator rather than scored 0%, so this number cannot fall when untested code is added. File reach is the honest headline: 63 of 493 source files reached (13%).

API surface reached

No route measurement in this run — the backend tier did not execute, so nothing can be said about which endpoints are exercised.

Coverage over time

A trend needs at least two runs. This is run 1 — the line appears once there is something to compare.

Failures and tests that could not run

No test failed and none errored. Note that this is a statement about the tiers that ran — check the tier list above for any marked “could not run”.

All tests

Show every test in this run (674)
TestOutcomeTimeTier
lib/a11y-structure.test.ts::the scan finds the pages — otherwise everything below passes vacuouslypassed147 msFrontend · unit
lib/a11y-structure.test.ts::the dashboard offers a skip link to a real targetpassed1 msFrontend · unit
lib/a11y-structure.test.ts::the skip link is reachable by keyboard but not visible by defaultpassed0 msFrontend · unit
lib/a11y-structure.test.ts::every navigation landmark is namedpassed0 msFrontend · unit
lib/a11y-structure.test.ts::no page renders a select with neither a label nor an aria-labelpassed523 msFrontend · unit
lib/a11y-structure.test.ts::the unlabelled-select allow-list has no stale entriespassed589 msFrontend · unit
lib/a11y-structure.test.ts::every select in the app has an accessible namepassed0 msFrontend · unit
lib/a11y-structure.test.ts::the select scanner actually finds selectspassed281 msFrontend · unit
lib/a11y-structure.test.ts::a rendered failure banner is announced, not just colouredpassed245 msFrontend · unit
lib/a11y-structure.test.ts::no page hangs a click handler on a plain div or spanpassed235 msFrontend · unit
lib/a11y-structure.test.ts::the clickable-non-control list has no stale entriespassed240 msFrontend · unit
lib/a11y-structure.test.ts::no form control draws its boundary with the decorative border tokenpassed245 msFrontend · unit
lib/a11y-structure.test.ts::the form-control border scanner actually finds controlspassed238 msFrontend · unit
lib/a11y-structure.test.ts::the comment stripper leaves comment-like text inside strings alonepassed0 msFrontend · unit
lib/a11y-structure.test.ts::the comment stripper removes both comment formspassed0 msFrontend · unit
lib/a11y-structure.test.ts::the comment stripper keeps a comment marker inside a template literalpassed0 msFrontend · unit
lib/a11y-structure.test.ts::an escaped quote does not end the stringpassed0 msFrontend · unit
lib/a11y-structure.test.ts::every form control has a programmatic accessible namepassed267 msFrontend · unit
lib/a11y-structure.test.ts::the unnamed-control allow-list has no stale entriespassed264 msFrontend · unit
lib/a11y-structure.test.ts::a placeholder is not accepted as an accessible namepassed0 msFrontend · unit
lib/account-kinds.test.ts::the console does not offer to create a platform adminpassed2 msFrontend · unit
lib/account-kinds.test.ts::no option names a raw hanTypepassed1 msFrontend · unit
lib/account-kinds.test.ts::every option explains what the account can dopassed0 msFrontend · unit
lib/account-kinds.test.ts::email is normalised the same way the server normalises itpassed0 msFrontend · unit
lib/account-kinds.test.ts::a clinician account asks for the role that decides billingpassed0 msFrontend · unit
lib/account-kinds.test.ts::the form states one reason at a time, in filling orderpassed0 msFrontend · unit
lib/account-kinds.test.ts::a kind the console cannot create is refused before it is sentpassed0 msFrontend · unit
lib/account-kinds.test.ts::a reused account is never reported as createdpassed0 msFrontend · unit
lib/account-kinds.test.ts::an account created without its invite says sopassed0 msFrontend · unit
lib/account-kinds.test.ts::the happy path is the only outcome that claims the invite wentpassed0 msFrontend · unit
lib/account-kinds.test.ts::a response that created nothing is not dressed up as progresspassed1 msFrontend · unit
lib/account-kinds.test.ts::kindLabel never renders an internal token to a userpassed0 msFrontend · unit
lib/account-type.test.ts::every spelling of an account type resolves the same waypassed2 msFrontend · unit
lib/account-type.test.ts::an unrecognised code holds nothing rather than the nearest matchpassed0 msFrontend · unit
lib/account-type.test.ts::a session carrying only `role` is still recognisedpassed0 msFrontend · unit
lib/account-type.test.ts::hanType wins when both claims are presentpassed0 msFrontend · unit
lib/account-type.test.ts::staff are not owners and the owner-only nav stays hiddenpassed0 msFrontend · unit
lib/account-type.test.ts::globalAdmin grants business administration but not the platformpassed0 msFrontend · unit
lib/account-type.test.ts::a patient holds nothingpassed0 msFrontend · unit
lib/account-type.test.ts::the client and server capability tables agree on the shapepassed0 msFrontend · unit
lib/affiliation.test.ts::an address is required, and so is a branchpassed2 msFrontend · unit
lib/affiliation.test.ts::a malformed address is refused before the round-trippassed0 msFrontend · unit
lib/affiliation.test.ts::a well-formed invitation passespassed0 msFrontend · unit
lib/affiliation.test.ts::addresses are normalised so one person is one affiliationpassed0 msFrontend · unit
lib/affiliation.test.ts::an existing affiliation at ANOTHER branch does not block this onepassed0 msFrontend · unit
lib/affiliation.test.ts::re-inviting somebody with a pending invitation is allowed and recognisedpassed0 msFrontend · unit
lib/affiliation.test.ts::a pending invitation is never counted as a providerpassed0 msFrontend · unit
lib/affiliation.test.ts::removing an accepted affiliation and revoking an invitation are different actspassed0 msFrontend · unit
lib/affiliation.test.ts::the empty state says what would fill it, and counts what is waitingpassed0 msFrontend · unit
lib/alert-metrics.test.ts::alerts and escalations are counted separatelypassed6 msFrontend · unit
lib/alert-metrics.test.ts::an escalation is counted from either producerpassed0 msFrontend · unit
lib/alert-metrics.test.ts::patient counts are the caseload, not the volumepassed0 msFrontend · unit
lib/alert-metrics.test.ts::alerts outside the month are excludedpassed0 msFrontend · unit
lib/alert-metrics.test.ts::a branch filter narrows the reportpassed0 msFrontend · unit
lib/alert-metrics.test.ts::addressed and unaddressed always sum to the totalpassed0 msFrontend · unit
lib/alert-metrics.test.ts::the report names who to look at, worst firstpassed0 msFrontend · unit
lib/alert-metrics.test.ts::an empty month reports zeros rather than blankspassed1 msFrontend · unit
lib/alert-metrics.test.ts::monthKey and monthBounds round-trippassed0 msFrontend · unit
lib/alert-metrics.test.ts::the CSV quotes anything that could break a columnpassed0 msFrontend · unit
lib/alert-metrics.test.ts::the CSV states the ladder breakdown, not just a totalpassed0 msFrontend · unit
lib/alert-metrics.test.ts::a reading with no breach gets no highlight at allpassed0 msFrontend · unit
lib/alert-metrics.test.ts::a critical breach is red and says so in wordspassed0 msFrontend · unit
lib/alert-metrics.test.ts::low and high are distinguished by words, not by shadepassed0 msFrontend · unit
lib/alert-metrics.test.ts::every tone carries a text label and a descriptionpassed0 msFrontend · unit
lib/alert-metrics.test.ts::the severity vocabularies from the different ingest paths all normalisepassed0 msFrontend · unit
lib/alert-metrics.test.ts::direction comes from the rule relation, and MAX wins a mixed breachpassed0 msFrontend · unit
lib/alerts-scope.test.ts::the patient scope is read from the query stringpassed2 msFrontend · unit
lib/alerts-scope.test.ts::an encoded patient id round-tripspassed0 msFrontend · unit
lib/alerts-scope.test.ts::scoping keeps only that patient's alertspassed0 msFrontend · unit
lib/alerts-scope.test.ts::both id fields are matched, because the two producers disagreepassed0 msFrontend · unit
lib/alerts-scope.test.ts::no scope means no filtering at allpassed0 msFrontend · unit
lib/alerts-scope.test.ts::the banner names the patient, falling back to a readable idpassed0 msFrontend · unit
lib/alerts-scope.test.ts::clearing the scope preserves the rest of the query statepassed0 msFrontend · unit
lib/alerts-scope.test.ts::patient ids render readablypassed0 msFrontend · unit
lib/alerts-scope.test.ts::the empty state says which question it is answeringpassed1 msFrontend · unit
lib/automation-audit.test.ts::modeTone / modeLabel map the three modespassed21 msFrontend · unit
lib/automation-audit.test.ts::groupByArea preserves area order and groups itemspassed2 msFrontend · unit
lib/billing-provider.test.ts::a branch with billing providers lists thempassed3 msFrontend · unit
lib/billing-provider.test.ts::the row states why it qualifiespassed0 msFrontend · unit
lib/billing-provider.test.ts::a row from an older backend says what it knows, not morepassed0 msFrontend · unit
lib/billing-provider.test.ts::no providers and no billable providers are different statespassed0 msFrontend · unit
lib/billing-provider.test.ts::an empty branch offers no busyworkpassed0 msFrontend · unit
lib/billing-provider.test.ts::a gap always carries the action that closes itpassed0 msFrontend · unit
lib/billing-provider.test.ts::a mixed branch reports both countspassed0 msFrontend · unit
lib/billing-provider.test.ts::singular and plural both read correctlypassed0 msFrontend · unit
lib/billing-provider.test.ts::billable requires BOTH an NPI and a taxonomypassed0 msFrontend · unit
lib/billing-provider.test.ts::undefined from the server is not a crashpassed0 msFrontend · unit
lib/billing-provider.test.ts::clinical staff are never described as providerspassed0 msFrontend · unit
lib/billing-provider.test.ts::an employed clinician who may render is surfaced, not hiddenpassed0 msFrontend · unit
lib/billing-provider.test.ts::a provider row states either its basis or its gap, never nothingpassed0 msFrontend · unit
lib/branch-filter.test.ts::the global option comes first and is the empty valuepassed31 msFrontend · unit
lib/branch-filter.test.ts::the global label is the same string everywherepassed0 msFrontend · unit
lib/branch-filter.test.ts::archived branches are never offeredpassed2 msFrontend · unit
lib/branch-filter.test.ts::same-named branches are disambiguated, not collapsedpassed20 msFrontend · unit
lib/branch-filter.test.ts::a branch with no name falls back to its id, never to blankpassed0 msFrontend · unit
lib/branch-filter.test.ts::options are sorted so the list is scannablepassed0 msFrontend · unit
lib/branch-filter.test.ts::an empty branch list yields just the global optionpassed0 msFrontend · unit
lib/branch-filter.test.ts::global matches every row; a branch matches only its ownpassed0 msFrontend · unit
lib/branch-filter.test.ts::a row with no branch is excluded by a specific branch filterpassed0 msFrontend · unit
lib/branch-filter.test.ts::shortId is stable and short enough to readpassed0 msFrontend · unit
lib/branch-filter.test.ts::an empty branch list explains itself instead of rendering nothingpassed0 msFrontend · unit
lib/branch-filter.test.ts::same-named branches are told apart by CITY, not by an id suffixpassed0 msFrontend · unit
lib/branch-filter.test.ts::the id suffix survives where the city cannot disambiguatepassed0 msFrontend · unit
lib/branch-filter.test.ts::a city is read from either shape the record carries it inpassed0 msFrontend · unit
lib/branch-filter.test.ts::a unique name is never decoratedpassed0 msFrontend · unit
lib/branch-filter.test.ts::duplicate names are reported so a human can resolve thempassed0 msFrontend · unit
lib/branch-filter.test.ts::an archived branch is not counted as a duplicatepassed0 msFrontend · unit
lib/branch-filter.test.ts::branches with no name at all are not reported as duplicates of each otherpassed0 msFrontend · unit
lib/call-list.test.ts::dormant and at-risk are the bands that read as urgentpassed12 msFrontend · unit
lib/call-list.test.ts::a clinic never called says so rather than rendering a dashpassed0 msFrontend · unit
lib/call-list.test.ts::last-called wording is relative and plainpassed0 msFrontend · unit
lib/call-list.test.ts::an overdue next-call says how overduepassed0 msFrontend · unit
lib/call-list.test.ts::filter matches contact names and talking points, not just the clinicpassed0 msFrontend · unit
lib/call-list.test.ts::filter ANDs terms so two words narrow rather than widenpassed0 msFrontend · unit
lib/call-list.test.ts::tel href strips formatting so the click actually dialspassed0 msFrontend · unit
lib/care-autopilot.test.ts::consent item is a communication gatepassed4 msFrontend · unit
lib/care-autopilot.test.ts::careplan item is a clinical gate with a friendly plan labelpassed0 msFrontend · unit
lib/care-autopilot.test.ts::ops_comm surfaces the cadence label + subjectpassed0 msFrontend · unit
lib/care-autopilot.test.ts::monitoring escalation shows severity + reading typepassed0 msFrontend · unit
lib/care-autopilot.test.ts::recruit is a communication invitepassed0 msFrontend · unit
lib/care-autopilot.test.ts::careteam item is a clinical one-click team assignment (P1)passed0 msFrontend · unit
lib/care-autopilot.test.ts::adherence nudge is a communication item (P2)passed0 msFrontend · unit
lib/care-autopilot.test.ts::BHI screening is a communication item (Phase B)passed0 msFrontend · unit
lib/care-autopilot.test.ts::billing item summarizes plan/month/codes/route and sits in the billing gatepassed0 msFrontend · unit
lib/care-autopilot.test.ts::route + adapter labels are human-readablepassed0 msFrontend · unit
lib/care-autopilot.test.ts::planLabel humanizes the combined planpassed0 msFrontend · unit
lib/care-autopilot.test.ts::gateOf prefers the backend-stamped gatepassed0 msFrontend · unit
lib/care-autopilot.test.ts::splitByGate routes items into three columns (incl. careteam + adherence)passed1 msFrontend · unit
lib/care-autopilot.test.ts::level helpers describe the manual→autopilot ramppassed0 msFrontend · unit
lib/care-ownership.test.ts::an ineligible clinician is listed and disabled, never hiddenpassed2 msFrontend · unit
lib/care-ownership.test.ts::an eligible clinician is selectable and carries no warningpassed0 msFrontend · unit
lib/care-ownership.test.ts::the owner list has no credential gate — that is why the role existspassed0 msFrontend · unit
lib/care-ownership.test.ts::no eligible supervisor anywhere is a different problem from none assignedpassed0 msFrontend · unit
lib/care-ownership.test.ts::billable says so plainlypassed0 msFrontend · unit
lib/care-ownership.test.ts::not billable always carries the next steppassed0 msFrontend · unit
lib/care-ownership.test.ts::a missing billing payload is treated as not billable, not as billablepassed0 msFrontend · unit
lib/care-ownership.test.ts::escalation always names somebody, or says plainly that nobody is namedpassed0 msFrontend · unit
lib/care-ownership.test.ts::a fallback to the supervisor SAYS it is a fallbackpassed0 msFrontend · unit
lib/care-ownership.test.ts::an unknown repId still renders — the id beats a blank linepassed0 msFrontend · unit
lib/care-ownership.test.ts::assigning one role does not clear the otherpassed1 msFrontend · unit
lib/care-ownership.test.ts::clearing a role is expressible, and distinct from not touching itpassed0 msFrontend · unit
lib/care-ownership.test.ts::both roles can be set in one callpassed0 msFrontend · unit
lib/care-team-options.test.ts::roleOptions filters the provisioned roster by role, case-insensitivelypassed2 msFrontend · unit
lib/care-team-options.test.ts::a saved member missing from the roster is KEPT, not droppedpassed0 msFrontend · unit
lib/care-team-options.test.ts::a saved member still on the roster is not duplicated or flaggedpassed0 msFrontend · unit
lib/care-team-options.test.ts::an unknown saved id still renders rather than disappearingpassed0 msFrontend · unit
lib/care-team-options.test.ts::stale options say why they are unusualpassed0 msFrontend · unit
lib/care-team-options.test.ts::seedFromRows rehydrates a single saved planpassed0 msFrontend · unit
lib/care-team-options.test.ts::bulk edit seeds only the fields every selected row agrees onpassed0 msFrontend · unit
lib/care-team-options.test.ts::conflicting care plans leave the plan unset rather than guessingpassed0 msFrontend · unit
lib/care-team-options.test.ts::an unprovisioned branch offers NO ONE — no corp-staff fallbackpassed0 msFrontend · unit
lib/care-team-options.test.ts::the hard block does not erase an assignment already on the recordpassed0 msFrontend · unit
lib/care-team-options.test.ts::seedFromRows tolerates empty input and missing teampassed0 msFrontend · unit
lib/care-team-options.test.ts::staleAssignments names the roles the roster can no longer supplypassed0 msFrontend · unit
lib/consent-gate.test.ts::consent state is derived from the onboardFlow stampspassed1 msFrontend · unit
lib/consent-gate.test.ts::a declined consent outranks an earlier signaturepassed0 msFrontend · unit
lib/consent-gate.test.ts::assignment is refused outright when nobody in the selection consentedpassed3 msFrontend · unit
lib/consent-gate.test.ts::an empty selection is refused with a different messagepassed0 msFrontend · unit
lib/consent-gate.test.ts::a consented patient may be assigned, silentlypassed0 msFrontend · unit
lib/consent-gate.test.ts::a mixed batch proceeds with the consented rows and names the skipped countpassed0 msFrontend · unit
lib/consent-gate.test.ts::an id with no matching row is skipped, not assumed consentedpassed0 msFrontend · unit
lib/consent-gate.test.ts::once consent is recorded, sending and uploading both closepassed30 msFrontend · unit
lib/consent-gate.test.ts::a merely sent consent leaves both actions openpassed0 msFrontend · unit
lib/consent-gate.test.ts::a manual upload counts as consent for the lockoutpassed0 msFrontend · unit
lib/consent-gate.test.ts::refMedia is recognised whether it is a list or a single valuepassed0 msFrontend · unit
lib/consent-gate.test.ts::single and bulk assignment land on the same dedicated pagepassed0 msFrontend · unit
lib/consent-gate.test.ts::the ids survive the round trip through the query stringpassed0 msFrontend · unit
lib/consent-gate.test.ts::a malformed or absent ids param yields nothing rather than a phantom rowpassed0 msFrontend · unit
lib/consent-media.test.ts::reads the single-object refMedia the upload handler writespassed2 msFrontend · unit
lib/consent-media.test.ts::reads the legacy CRefWithMedia list shape toopassed0 msFrontend · unit
lib/consent-media.test.ts::skips malformed entries rather than returning a broken linkpassed0 msFrontend · unit
lib/consent-media.test.ts::a stored document links to the served filepassed0 msFrontend · unit
lib/consent-media.test.ts::a digital e-consent links to the signed record insteadpassed0 msFrontend · unit
lib/consent-media.test.ts::ids are encodedpassed0 msFrontend · unit
lib/consent-media.test.ts::the link label reflects what will actually openpassed0 msFrontend · unit
lib/consent-media.test.ts::a failed consent fetch says WHY, not just that it failedpassed0 msFrontend · unit
lib/consent-validation.test.ts::validateConsentFile rejects a missing file (Ticket 1.1)passed1 msFrontend · unit
lib/consent-validation.test.ts::validateConsentFile rejects an empty filepassed0 msFrontend · unit
lib/consent-validation.test.ts::validateConsentFile accepts a PDF by MIME typepassed0 msFrontend · unit
lib/consent-validation.test.ts::validateConsentFile accepts a JPEG by extension when type is blankpassed0 msFrontend · unit
lib/consent-validation.test.ts::validateConsentFile rejects a non-PDF/JPEG documentpassed0 msFrontend · unit
lib/constitution-faq.test.ts::the constitution is reachable from the frontend repopassed1 msFrontend · unit
lib/constitution-faq.test.ts::the register parses and is not emptypassed2 msFrontend · unit
lib/constitution-faq.test.ts::every defect names a frontend test that existspassed3 msFrontend · unit
lib/constitution-faq.test.ts::every defect names a frontend test that actually contains testspassed10 msFrontend · unit
lib/constitution-faq.test.ts::no defect leaves either side blankpassed1 msFrontend · unit
lib/constitution-faq.test.ts::defect ids are uniquepassed0 msFrontend · unit
lib/constitution-faq.test.ts::every row describes what went wrong, not what is now finepassed1 msFrontend · unit
lib/contact-patient.test.ts::a bound patient is used immediately, with no picking steppassed2 msFrontend · unit
lib/contact-patient.test.ts::a bound patient is never widened into a pick-listpassed2 msFrontend · unit
lib/contact-patient.test.ts::without a bound patient, a supplied list is offeredpassed0 msFrontend · unit
lib/contact-patient.test.ts::precedence falls through fetched then seedpassed0 msFrontend · unit
lib/contact-patient.test.ts::an empty fetch falls back rather than leaving the modal blankpassed1 msFrontend · unit
lib/contact-patient.test.ts::rows without an id are discarded, not shown as blank entriespassed0 msFrontend · unit
lib/contact-patient.test.ts::a bound patient with no id does not lock an empty contextpassed0 msFrontend · unit
lib/contact-patient.test.ts::the active patient is the bound one, whatever the list sayspassed0 msFrontend · unit
lib/contact-patient.test.ts::a stale selection resolves to null rather than to someone elsepassed0 msFrontend · unit
lib/contact-patient.test.ts::the modal has exactly the two tabs QA specified, in orderpassed0 msFrontend · unit
lib/contact-patient.test.ts::names come from either the row or its demog blockpassed0 msFrontend · unit
lib/contact-patient.test.ts::a nameless row shows its id, and an anonymous row says Patientpassed0 msFrontend · unit
lib/contact-patient.test.ts::ids are read from any of the three key names in usepassed0 msFrontend · unit
lib/contact-patient.test.ts::a missing phone stays empty instead of inheriting a demo numberpassed0 msFrontend · unit
lib/contact-patient.test.ts::toContact produces exactly what the modal needspassed0 msFrontend · unit
lib/contrast-tokens.test.ts::the palette parses — otherwise every check below passes vacuouslypassed3 msFrontend · unit
lib/contrast-tokens.test.ts::body text meets 4.5:1 on both surfacespassed2 msFrontend · unit
lib/contrast-tokens.test.ts::the primary colour works as TEXT, which is how links use itpassed0 msFrontend · unit
lib/contrast-tokens.test.ts::a white label ON the primary colour also meets 4.5:1passed0 msFrontend · unit
lib/contrast-tokens.test.ts::destructive actions are legible in both directionspassed0 msFrontend · unit
lib/contrast-tokens.test.ts::form field boundaries meet the 3:1 non-text thresholdpassed0 msFrontend · unit
lib/contrast-tokens.test.ts::the focus ring is visible against the surfaces it appears onpassed0 msFrontend · unit
lib/contrast-tokens.test.ts::large text still needs 3:1 and headings clear it comfortablypassed0 msFrontend · unit
lib/contrast-tokens.test.ts::the ratio is order-independent and bounded, as WCAG defines itpassed0 msFrontend · unit
lib/contrast-tokens.test.ts::relative luminance matches the known anchorspassed0 msFrontend · unit
lib/contrast-tokens.test.ts::oklch converts to the sRGB a browser would renderpassed0 msFrontend · unit
lib/contrast-tokens.test.ts::an unparseable colour scores 0 rather than passingpassed0 msFrontend · unit
lib/conveyor.test.ts::toneFor maps statuses to colour tonespassed1 msFrontend · unit
lib/conveyor.test.ts::statusLabel is human-readablepassed0 msFrontend · unit
lib/conveyor.test.ts::conveyorPercent computes progresspassed0 msFrontend · unit
lib/conveyor.test.ts::needsApproval flags pending human stepspassed0 msFrontend · unit
lib/data-state.test.ts::a signed-out visitor gets labelled sample datapassed2 msFrontend · unit
lib/data-state.test.ts::a signed-in user with real rows sees them and no bannerpassed1 msFrontend · unit
lib/data-state.test.ts::a signed-in user with NO rows is told so — never given sample rowspassed1 msFrontend · unit
lib/data-state.test.ts::a failed fetch surfaces an error and a retry — never sample rowspassed0 msFrontend · unit
lib/data-state.test.ts::an error outranks whatever rows happened to be in handpassed0 msFrontend · unit
lib/data-state.test.ts::a signed-in session can NEVER be shown sample rowspassed1 msFrontend · unit
lib/data-state.test.ts::a signed-out visitor with no sample data is told to sign inpassed0 msFrontend · unit
lib/data-state.test.ts::the empty message names something the user can actually dopassed0 msFrontend · unit
lib/data-state.test.ts::without a hint, the empty message still names the screenpassed0 msFrontend · unit
lib/data-state.test.ts::an expired session says to sign in again, not 'error 401'passed0 msFrontend · unit
lib/data-state.test.ts::a server fault and a client fault read differentlypassed0 msFrontend · unit
lib/data-state.test.ts::a rate limit tells the user to wait rather than to retry nowpassed0 msFrontend · unit
lib/data-state.test.ts::a network failure points at the connectionpassed0 msFrontend · unit
lib/data-state.test.ts::an unrecognised error never leaks a stack or a bare codepassed0 msFrontend · unit
lib/demographics-quality.test.ts::a complete record raises nothingpassed2 msFrontend · unit
lib/demographics-quality.test.ts::a pre-1970 date of birth is NOT an issuepassed0 msFrontend · unit
lib/demographics-quality.test.ts::a missing identity blocks; missing detail only warnspassed0 msFrontend · unit
lib/demographics-quality.test.ts::a nameless record cannot be assigned topassed0 msFrontend · unit
lib/demographics-quality.test.ts::issues name the patient so the user knows who to fixpassed0 msFrontend · unit
lib/demographics-quality.test.ts::summary distinguishes blocked from merely incompletepassed0 msFrontend · unit
lib/demographics-quality.test.ts::raw epoch detection recognises an unformatted timestamppassed0 msFrontend · unit
lib/device-filter.test.ts::a device is findable by the patient holding itpassed2 msFrontend · unit
lib/device-filter.test.ts::the hardware fields still search as beforepassed0 msFrontend · unit
lib/device-filter.test.ts::search is case- and whitespace-insensitivepassed0 msFrontend · unit
lib/device-filter.test.ts::an unassigned device does not crash the patient-name searchpassed0 msFrontend · unit
lib/device-filter.test.ts::the placeholder names every field actually searchedpassed1 msFrontend · unit
lib/device-filter.test.ts::the branch filter narrows to that branchpassed0 msFrontend · unit
lib/device-filter.test.ts::'all' and an absent filter both mean no branch narrowingpassed0 msFrontend · unit
lib/device-filter.test.ts::a device with no branch is excluded by a specific branch, not by 'all'passed0 msFrontend · unit
lib/device-filter.test.ts::filters compose — branch AND text togetherpassed0 msFrontend · unit
lib/device-filter.test.ts::the category tab narrows by device grouppassed0 msFrontend · unit
lib/device-filter.test.ts::a device with no received date is excluded from a dated windowpassed1 msFrontend · unit
lib/device-filter.test.ts::the window is bounded at both endspassed0 msFrontend · unit
lib/device-filter.test.ts::patients filter by name, email, device status and branchpassed0 msFrontend · unit
lib/device-filter.test.ts::status 'all' keeps everyone regardless of device countpassed0 msFrontend · unit
lib/device-filter.test.ts::the row type survives filtering, so callers keep their own fieldspassed0 msFrontend · unit
lib/device-stock.test.ts::an empty inventory says so rather than showing a row of zerospassed1 msFrontend · unit
lib/device-stock.test.ts::the headline states each category it actually haspassed0 msFrontend · unit
lib/device-stock.test.ts::stock nobody has allocated is named, not silently absentpassed0 msFrontend · unit
lib/device-stock.test.ts::a partial allocation reads differently from a total onepassed0 msFrontend · unit
lib/device-stock.test.ts::a device out with a patient names the patient and the reasonpassed0 msFrontend · unit
lib/device-stock.test.ts::a retired device is not movedpassed0 msFrontend · unit
lib/device-stock.test.ts::moving a device where it already is is refused before the requestpassed0 msFrontend · unit
lib/device-stock.test.ts::no destination chosen asks for one rather than failing silentlypassed0 msFrontend · unit
lib/device-stock.test.ts::an available device movespassed0 msFrontend · unit
lib/device-stock.test.ts::a branch holding nothing says sopassed0 msFrontend · unit
lib/device-stock.test.ts::unallocated stock sorts last, real branches by namepassed13 msFrontend · unit
lib/device-stock.test.ts::the totals a screen renders are the ones the server sentpassed0 msFrontend · unit
lib/dicom-metadata.test.ts::canEditDicom: clinician/owner/admin yes; patient/staff no; globalAdmin overridepassed5 msFrontend · unit
lib/dicom-metadata.test.ts::cleanOverrides: only whitelisted + changed + trimmed non-emptypassed1 msFrontend · unit
lib/dicom-metadata.test.ts::cleanOverrides: nothing changed → empty objectpassed0 msFrontend · unit
lib/dicom-metadata.test.ts::correctedSet: from meta.correctedpassed0 msFrontend · unit
lib/dicom-metadata.test.ts::seedForm: every editable tag present, stringified, blanks for missingpassed0 msFrontend · unit
lib/dur-alerts.test.ts::severityTone maps severity to tonepassed1 msFrontend · unit
lib/dur-alerts.test.ts::rankAlerts orders most-severe firstpassed1 msFrontend · unit
lib/dur-alerts.test.ts::alertSummary + blocksSubmitpassed0 msFrontend · unit
lib/dur-alerts.test.ts::hasContra: only absolute contraindicationspassed0 msFrontend · unit
lib/dur-alerts.test.ts::highCodes: codes of high-severity alerts onlypassed0 msFrontend · unit
lib/dur-alerts.test.ts::alertText: prefers message, then detail/title/codepassed0 msFrontend · unit
lib/ein.test.ts::formatEin inserts the dash after 2 digitspassed4 msFrontend · unit
lib/ein.test.ts::isValidEinFormat requires 9 digitspassed0 msFrontend · unit
lib/enrolment-readiness.test.ts::eligibility and consent are never collapsed into one answerpassed1 msFrontend · unit
lib/enrolment-readiness.test.ts::both present is the only ready statepassed0 msFrontend · unit
lib/enrolment-readiness.test.ts::a received paper consent counts as consentpassed0 msFrontend · unit
lib/enrolment-readiness.test.ts::unchecked coverage is not reported as ineligiblepassed0 msFrontend · unit
lib/enrolment-readiness.test.ts::a decline outranks everything elsepassed3 msFrontend · unit
lib/enrolment-readiness.test.ts::consent in flight reads differently from consent never sentpassed0 msFrontend · unit
lib/enrolment-readiness.test.ts::both outstanding names both, and the action depends on which kindpassed0 msFrontend · unit
lib/enrolment-readiness.test.ts::status matching is case and whitespace tolerantpassed1 msFrontend · unit
lib/enrolment-readiness.test.ts::the summary names what is blocking, not just how manypassed5 msFrontend · unit
lib/enrolment-readiness.test.ts::every patient lands in exactly one bucketpassed1 msFrontend · unit
lib/enrolment-readiness.test.ts::an empty pipeline says so rather than showing zerospassed0 msFrontend · unit
lib/enrolment-readiness.test.ts::the merge keeps every lens the four screens offeredpassed0 msFrontend · unit
lib/entity-context-carried.test.ts::no drill-down target is linked with a bare, context-free hrefpassed4 msFrontend · unit
lib/entity-context-carried.test.ts::the guard is actually reading a page with links in itpassed0 msFrontend · unit
lib/entity-context-carried.test.ts::an up-navigation link is not required to carry contextpassed0 msFrontend · unit
lib/entity-context-carried.test.ts::no detail page carries a corporate id in a linkpassed0 msFrontend · unit
lib/entity-context-carried.test.ts::no screen reads carried context from window.location in a state initialiserpassed3 msFrontend · unit
lib/entity-context-carried.test.ts::the representatives screen reads its branch from the routerpassed0 msFrontend · unit
lib/entity-context.test.ts::a branch drilled into is readable on the next screenpassed3 msFrontend · unit
lib/entity-context.test.ts::no context reads as no context, not as an empty onepassed0 msFrontend · unit
lib/entity-context.test.ts::a corporate is NEVER carried in a linkpassed0 msFrontend · unit
lib/entity-context.test.ts::carrying a context replaces any context already on the hrefpassed0 msFrontend · unit
lib/entity-context.test.ts::switching entity kind does not leave the previous kind behindpassed0 msFrontend · unit
lib/entity-context.test.ts::clearing context removes only the contextpassed0 msFrontend · unit
lib/entity-context.test.ts::an unresolved name shows the identifier, never blankpassed0 msFrontend · unit
lib/entity-context.test.ts::screens whose actions change someone's standing are markedpassed0 msFrontend · unit
lib/entity-context.test.ts::every carriable kind has a distinct parameter namepassed0 msFrontend · unit
lib/entity-context.test.ts::a href with no query survives a null context unchangedpassed0 msFrontend · unit
lib/epoch-date.test.ts::a pre-1970 date of birth formats instead of rendering a dashpassed52 msFrontend · unit
lib/epoch-date.test.ts::post-1970 dates still formatpassed0 msFrontend · unit
lib/epoch-date.test.ts::numeric strings are accepted, as the API sometimes returns thempassed0 msFrontend · unit
lib/epoch-date.test.ts::genuinely absent values render the fallbackpassed0 msFrontend · unit
lib/epoch-date.test.ts::ISO date strings still workpassed0 msFrontend · unit
lib/epoch-date.test.ts::date input keeps the local calendar daypassed0 msFrontend · unit
lib/epoch-date.test.ts::date input is empty, never a bogus date, when absentpassed0 msFrontend · unit
lib/epoch-date.test.ts::age is computed from a pre-1970 birthpassed0 msFrontend · unit
lib/epoch-date.test.ts::age is null rather than a wrong number when unknownpassed0 msFrontend · unit
lib/error-boundary.test.ts::the dashboard has an error boundarypassed1 msFrontend · unit
lib/error-boundary.test.ts::the error boundary is a Client Componentpassed1 msFrontend · unit
lib/error-boundary.test.ts::the error boundary offers recovery through unstable_retrypassed0 msFrontend · unit
lib/error-boundary.test.ts::the headline says the screen failed, not that records are absentpassed0 msFrontend · unit
lib/error-boundary.test.ts::the error boundary explicitly separates 'failed' from 'none'passed0 msFrontend · unit
lib/error-boundary.test.ts::the error boundary states plainly that nothing was changedpassed0 msFrontend · unit
lib/error-boundary.test.ts::the error boundary surfaces the digest for supportpassed0 msFrontend · unit
lib/error-boundary.test.ts::the dashboard has route-level loading UIpassed0 msFrontend · unit
lib/error-boundary.test.ts::the loading skeleton announces itself to assistive technologypassed2 msFrontend · unit
lib/escalation-ladder.test.ts::the default ladder is three rungspassed1 msFrontend · unit
lib/escalation-ladder.test.ts::the selectable lengths come from the server's bounds, not from guessespassed1 msFrontend · unit
lib/escalation-ladder.test.ts::the consequence is stated in DAYS, which is the clinician's unitpassed0 msFrontend · unit
lib/escalation-ladder.test.ts::the consequence names the window the breach-days are counted inpassed0 msFrontend · unit
lib/escalation-ladder.test.ts::the window is the server's number, never recomputed herepassed0 msFrontend · unit
lib/escalation-ladder.test.ts::same-day readings counting once is said, not assumedpassed0 msFrontend · unit
lib/escalation-ladder.test.ts::a one-rung ladder is refused with the clinical reason, not a rangepassed0 msFrontend · unit
lib/escalation-ladder.test.ts::an over-long ladder is refused because it reads as switched offpassed0 msFrontend · unit
lib/escalation-ladder.test.ts::a value inside the range has no complaintpassed0 msFrontend · unit
lib/escalation-ladder.test.ts::the top rung is labelled as the toppassed0 msFrontend · unit
lib/escalation-ladder.test.ts::a non-default policy is flagged as deliberatepassed0 msFrontend · unit
lib/escalation.test.ts::slaTone maps SLA status to colourpassed4 msFrontend · unit
lib/escalation.test.ts::slaLabel reads clearly in each statepassed0 msFrontend · unit
lib/focus-trap.test.ts::Tab wraps from the last element back to the firstpassed2 msFrontend · unit
lib/focus-trap.test.ts::Shift+Tab wraps from the first element to the lastpassed0 msFrontend · unit
lib/focus-trap.test.ts::mid-list Tab is left to the browserpassed0 msFrontend · unit
lib/focus-trap.test.ts::focus outside the dialog is pulled back to the right edgepassed0 msFrontend · unit
lib/focus-trap.test.ts::a single focusable keeps focus on itself in both directionspassed0 msFrontend · unit
lib/focus-trap.test.ts::an empty dialog does not intercept Tabpassed0 msFrontend · unit
lib/focus-trap.test.ts::Tab can never land outside the dialogpassed0 msFrontend · unit
lib/focus-trap.test.ts::focus starts on the first focusablepassed0 msFrontend · unit
lib/focus-trap.test.ts::data-autofocus wins when presentpassed0 msFrontend · unit
lib/focus-trap.test.ts::an out-of-range autofocus falls back rather than focusing nothingpassed0 msFrontend · unit
lib/focus-trap.test.ts::a dialog with no focusable content yields null so the panel takes focuspassed0 msFrontend · unit
lib/focus-trap.test.ts::the selector excludes tabindex=-1passed0 msFrontend · unit
lib/focus-trap.test.ts::the selector excludes disabled controlspassed0 msFrontend · unit
lib/focus-trap.test.ts::the selector covers the interactive elements this app actually usespassed0 msFrontend · unit
lib/focus-trap.test.ts::a dialog is labelled by an id derived from its ownpassed0 msFrontend · unit
lib/focus-trap.test.ts::dialog ids are stable and sequential, not randompassed0 msFrontend · unit
lib/global-search.test.ts::empty query returns nothingpassed4 msFrontend · unit
lib/global-search.test.ts::matches label + href, multi-term ANDpassed0 msFrontend · unit
lib/guest-join.test.ts::isPinFormat: 4-8 digits onlypassed1 msFrontend · unit
lib/guest-join.test.ts::msUntil + expiryLabelpassed0 msFrontend · unit
lib/guest-join.test.ts::joinUrl: no double slashpassed0 msFrontend · unit
lib/guest-join.test.ts::guestStep: loading/pin/ready/joinedpassed0 msFrontend · unit
lib/lead-funnel.test.ts::buildFunnel counts stages + win ratepassed2 msFrontend · unit
lib/lead-funnel.test.ts::buildFunnel handles emptypassed0 msFrontend · unit
lib/manual-reading.test.ts::a round trip through the pickers preserves the instantpassed10 msFrontend · unit
lib/manual-reading.test.ts::an unparseable value yields empty pickers rather than NaNpassed1 msFrontend · unit
lib/manual-reading.test.ts::a missing date or time is refused with which one is missingpassed0 msFrontend · unit
lib/manual-reading.test.ts::31 February is refused, not rolled forward into Marchpassed0 msFrontend · unit
lib/manual-reading.test.ts::a reading cannot be recorded in the futurepassed0 msFrontend · unit
lib/manual-reading.test.ts::a reading taken earlier today is acceptedpassed0 msFrontend · unit
lib/manual-reading.test.ts::the picker's max is today, so the future is unreachable by mousepassed0 msFrontend · unit
lib/manual-reading.test.ts::malformed shapes are refused rather than coercedpassed0 msFrontend · unit
lib/manual-reading.test.ts::a patient label reads either roster keypassed0 msFrontend · unit
lib/manual-reading.test.ts::a patient with no name is never labelled with their raw idpassed0 msFrontend · unit
lib/manual-reading.test.ts::the DOB disambiguates two patients with the same namepassed0 msFrontend · unit
lib/modal-a11y.test.ts::the dialog primitives declare full dialog semanticspassed6 msFrontend · unit
lib/modal-a11y.test.ts::the primitives contain Tab and restore focus on closepassed1 msFrontend · unit
lib/modal-a11y.test.ts::no NEW overlay ships without dialog semanticspassed47 msFrontend · unit
lib/modal-a11y.test.ts::the frozen list does not outlive the overlays it namespassed21 msFrontend · unit
lib/modal-a11y.test.ts::the not-a-dialog exemptions still name real overlay-shaped regionspassed20 msFrontend · unit
lib/modal-a11y.test.ts::every hand-rolled overlay has been migratedpassed0 msFrontend · unit
lib/nav.test.ts::no standalone Ops heading survives in the business sidebarpassed2 msFrontend · unit
lib/nav.test.ts::the care programme is one module ordered by the patient journeypassed1 msFrontend · unit
lib/nav.test.ts::clinical and operational screens sit in the SAME modulepassed0 msFrontend · unit
lib/nav.test.ts::the Rules Engine is reachable from the business sidebarpassed0 msFrontend · unit
lib/nav.test.ts::every business href is still reachable and uniquepassed0 msFrontend · unit
lib/nav.test.ts::staff still lose exactly the owner-only surfaces, nothing morepassed0 msFrontend · unit
lib/nav.test.ts::the permission-derived nav mirrors the same structurepassed0 msFrontend · unit
lib/nav.test.ts::regrouping the permission nav granted no new pagepassed0 msFrontend · unit
lib/nav.test.ts::no duplicate hrefs within a single role's menupassed0 msFrontend · unit
lib/nav.test.ts::the Care-Time redirect is not offered as its own menu itempassed0 msFrontend · unit
lib/nav.test.ts::Communications is a parent group, not a loose sidebar itempassed0 msFrontend · unit
lib/nav.test.ts::Contact Patient sits inside Communications, not on its ownpassed0 msFrontend · unit
lib/nav.test.ts::there is no second ops module beside Care Programpassed0 msFrontend · unit
lib/no-raw-api-fetch.test.ts::the scanner sees the files it is meant to scanpassed37 msFrontend · unit
lib/no-raw-api-fetch.test.ts::no new screen calls the API with a bare fetchpassed98 msFrontend · unit
lib/no-raw-api-fetch.test.ts::the frozen list carries no stale entriespassed79 msFrontend · unit
lib/no-raw-api-fetch.test.ts::apiFetch is exported for them to migrate ontopassed2 msFrontend · unit
lib/no-raw-api-fetch.test.ts::the shared client applies a deadlinepassed1 msFrontend · unit
lib/no-seed-on-failure.test.ts::clinical, billing and privacy screens NEVER seed on failurepassed17 msFrontend · unit
lib/no-seed-on-failure.test.ts::these screens use the shared data-state rulepassed4 msFrontend · unit
lib/no-seed-on-failure.test.ts::no NEW screen starts seeding on failurepassed147 msFrontend · unit
lib/no-seed-on-failure.test.ts::the frozen list does not outlive the screens it namespassed181 msFrontend · unit
lib/no-seed-on-failure.test.ts::the settings form cannot save what it could not loadpassed1 msFrontend · unit
lib/no-seed-on-failure.test.ts::the widened scanner catches the lowercase-seed shape it was written forpassed0 msFrontend · unit
lib/no-seed-on-failure.test.ts::the scanner does not flag an ordinary length checkpassed0 msFrontend · unit
lib/no-unguarded-refetch.test.ts::the scanner finds effects at allpassed60 msFrontend · unit
lib/no-unguarded-refetch.test.ts::patient-identified screens drop stale responsespassed71 msFrontend · unit
lib/no-unguarded-refetch.test.ts::a patient-identified screen may never be added to the frozen listpassed0 msFrontend · unit
lib/no-unguarded-refetch.test.ts::no new unguarded refetch appearspassed43 msFrontend · unit
lib/no-unguarded-refetch.test.ts::the frozen list carries no stale entriespassed42 msFrontend · unit
lib/npi.test.ts::the check digit is computed over the 80840 issuer prefixpassed1 msFrontend · unit
lib/npi.test.ts::a valid NPI is acceptedpassed0 msFrontend · unit
lib/npi.test.ts::a transposed pair is caught — the whole reason this runs at the keyboardpassed0 msFrontend · unit
lib/npi.test.ts::a repdigit string is refused even when it passes Luhnpassed0 msFrontend · unit
lib/npi.test.ts::punctuation is stripped, so a pasted 123-456-7893 workspassed0 msFrontend · unit
lib/npi.test.ts::an empty NPI is not an error — people are hired before the NPI arrivespassed0 msFrontend · unit
lib/npi.test.ts::a wrong length says how many digits were givenpassed0 msFrontend · unit
lib/npi.test.ts::a taxonomy code may carry letters anywhere — 363LP2300N is realpassed0 msFrontend · unit
lib/npi.test.ts::a taxonomy code of the wrong length is refusedpassed0 msFrontend · unit
lib/npi.test.ts::eligibility needs BOTH an NPI and a taxonomy, and says which is missingpassed0 msFrontend · unit
lib/npi.test.ts::every ineligible answer carries a next steppassed0 msFrontend · unit
lib/npi.test.ts::a stored NPI that fails its check digit is reported, not silently ignoredpassed0 msFrontend · unit
lib/patient-detail.test.ts::a blood-pressure reading yields all three of its metricspassed18 msFrontend · unit
lib/patient-detail.test.ts::each device family contributes its own metricspassed0 msFrontend · unit
lib/patient-detail.test.ts::a reading with no recognised payload contributes nothingpassed0 msFrontend · unit
lib/patient-detail.test.ts::a non-numeric value is dropped, not coercedpassed0 msFrontend · unit
lib/patient-detail.test.ts::the summary reports count, highest, lowest and average per metricpassed2 msFrontend · unit
lib/patient-detail.test.ts::averages are rounded to one decimalpassed0 msFrontend · unit
lib/patient-detail.test.ts::trend points come out chronological, whatever order they arrived inpassed0 msFrontend · unit
lib/patient-detail.test.ts::a reading with no timestamp is excluded from the trendpassed0 msFrontend · unit
lib/patient-detail.test.ts::an over-long range is clamped and says sopassed0 msFrontend · unit
lib/patient-detail.test.ts::a range inside the cap is left exactly alonepassed0 msFrontend · unit
lib/patient-detail.test.ts::the default range is the last 30 dayspassed0 msFrontend · unit
lib/patient-detail.test.ts::inRange is inclusive of both endspassed0 msFrontend · unit
lib/patient-detail.test.ts::the CSV has one row per metric reading and quotes defensivelypassed13 msFrontend · unit
lib/patient-detail.test.ts::the patient header never renders a blank cellpassed0 msFrontend · unit
lib/patient-detail.test.ts::age is computed in whole years and omitted when unknowablepassed0 msFrontend · unit
lib/patient-detail.test.ts::readingTime accepts either timestamp fieldpassed0 msFrontend · unit
lib/pdf-sign.test.ts::placement: each corner, inset by margin, origin bottom-leftpassed2 msFrontend · unit
lib/pdf-sign.test.ts::placement: clamps a box bigger than the page to 0passed0 msFrontend · unit
lib/pdf-sign.test.ts::signatureBlock: name + date, reason only when presentpassed0 msFrontend · unit
lib/pdf-sign.test.ts::clampPage: in-range, over, under/NaN → lastpassed0 msFrontend · unit
lib/pdf-sign.test.ts::receiptId: stable format ES-XXXXXX-YYYYpassed0 msFrontend · unit
lib/pdf-sign.test.ts::CORNERS covers all fourpassed0 msFrontend · unit
lib/phone-format.test.ts::the country code is rendered, not strippedpassed9 msFrontend · unit
lib/phone-format.test.ts::a stored number with no country code assumes US rather than rendering unusablepassed0 msFrontend · unit
lib/phone-format.test.ts::a country code already inside the number is not doubledpassed0 msFrontend · unit
lib/phone-format.test.ts::non-US numbers keep their own code and are not forced into US groupingpassed0 msFrontend · unit
lib/phone-format.test.ts::an absent number shows the fallback, never a stray '+1'passed0 msFrontend · unit
lib/phone-format.test.ts::tel href carries the country code so mobile dialers accept itpassed0 msFrontend · unit
lib/phone-format.test.ts::country code normalizes from any stored spellingpassed0 msFrontend · unit
lib/phone-format.test.ts::digits are extracted from any formattingpassed0 msFrontend · unit
lib/phone-format.test.ts::record helper accepts the field spellings actually storedpassed0 msFrontend · unit
lib/rbac.test.ts::isBusinessAdmin: owner (B) and admin (A) pass; staff/clinician/patient failpassed12 msFrontend · unit
lib/rbac.test.ts::isBusinessAdmin: an explicit globalAdmin flag grants access regardless of hanTypepassed1 msFrontend · unit
lib/rbac.test.ts::filterOwnerOnly hides owner-only items from staff, keeps them for adminpassed8 msFrontend · unit
lib/rbac.test.ts::pageAccessFor: staff readonly on Manage Business/Branches, denied on owner-onlypassed0 msFrontend · unit
lib/rbac.test.ts::canAccessHref blocks staff from owner-only surfaces onlypassed0 msFrontend · unit
lib/rcm-billing.test.ts::engine choices: the three the UI offers, deterministic default listed firstpassed3 msFrontend · unit
lib/rcm-billing.test.ts::footingStatus: foots vs does-not-foot with a specific mismatch reasonpassed17 msFrontend · unit
lib/rcm-billing.test.ts::engineNote: null when honored; explains a fallbackpassed0 msFrontend · unit
lib/rcm-billing.test.ts::money: two-decimal currency; em-dash for nullpassed0 msFrontend · unit
lib/rcm-billing.test.ts::pdfsOnly: keeps only PDFs from a directory selectionpassed0 msFrontend · unit
lib/rcm-flatview.test.ts::rowText: flattens nested objects + arrays, lowercasedpassed1 msFrontend · unit
lib/rcm-flatview.test.ts::rowText: null/undefined values are skipped, no throwpassed0 msFrontend · unit
lib/rcm-flatview.test.ts::filterRows: empty query returns all rows unchangedpassed0 msFrontend · unit
lib/rcm-flatview.test.ts::filterRows: single term substring match on nested fieldpassed0 msFrontend · unit
lib/rcm-flatview.test.ts::filterRows: multiple terms are AND-edpassed0 msFrontend · unit
lib/rcm-flatview.test.ts::matchLabel: total when all shown, 'n of m' when filteredpassed0 msFrontend · unit
lib/rcm-remit.test.ts::eraPullSummary: error / empty / postedpassed1 msFrontend · unit
lib/rcm-remit.test.ts::priorAuthTone: approved / denied / pendedpassed0 msFrontend · unit
lib/registry-actions.test.ts::chart actions are gated on registration, not disabled outrightpassed1 msFrontend · unit
lib/registry-actions.test.ts::message to doctor needs a registered, affiliated patientpassed0 msFrontend · unit
lib/registry-actions.test.ts::free patients cannot be contacted without consentpassed0 msFrontend · unit
lib/registry-actions.test.ts::contact needs at least one channelpassed0 msFrontend · unit
lib/registry-actions.test.ts::move to onboarding only on the Qualified tab for qualifying patientspassed0 msFrontend · unit
lib/registry-actions.test.ts::the synthetic rpm.patientmd.com handle never renders as an addresspassed0 msFrontend · unit
lib/registry-actions.test.ts::CSV upload accepts any .csv, not one exact filenamepassed0 msFrontend · unit
lib/registry-actions.test.ts::CSV validation is on columns, with header aliasespassed21 msFrontend · unit
lib/registry-insurance.test.ts::isSelfPay: explicit self_pay typepassed2 msFrontend · unit
lib/registry-insurance.test.ts::isSelfPay: explicit insured type wins over blank payerpassed0 msFrontend · unit
lib/registry-insurance.test.ts::isSelfPay: no coverage type + no payer => cash (US default)passed0 msFrontend · unit
lib/registry-insurance.test.ts::isSelfPay: cash / self-pay free textpassed3 msFrontend · unit
lib/registry-insurance.test.ts::isSelfPay: named payer is insuredpassed0 msFrontend · unit
lib/registry-insurance.test.ts::classifyPayer: Medicare vs Medicare Advantagepassed0 msFrontend · unit
lib/registry-insurance.test.ts::classifyPayer: Medicaid / TRICARE / commercial / blankpassed0 msFrontend · unit
lib/registry-insurance.test.ts::coveragePayload: self-pay flag + normalized typepassed7 msFrontend · unit
lib/registry-onboarding.test.ts::board body defaults: 20 per page, no filter params when all='all'passed2 msFrontend · unit
lib/registry-onboarding.test.ts::branch + doctor cascade map to branchId + ownerUserIdpassed0 msFrontend · unit
lib/registry-onboarding.test.ts::consent status maps correctly (incl. not-received → recd:false)passed0 msFrontend · unit
lib/registry-onboarding.test.ts::consent type + plan + search map throughpassed0 msFrontend · unit
lib/registry-onboarding.test.ts::missingQualifiedFields lists the blanks, empty when completepassed1 msFrontend · unit
lib/registry-onboarding.test.ts::addFormError: branch required, then phone (email OPTIONAL — QA 7/27), then namepassed0 msFrontend · unit
lib/registry-onboarding.test.ts::isValidEmailpassed0 msFrontend · unit
lib/registry-onboarding.test.ts::isValidPhone: NANP for +1passed0 msFrontend · unit
lib/registry-onboarding.test.ts::dobError: future + too-old rejected, valid ok, empty allowedpassed1 msFrontend · unit
lib/registry-onboarding.test.ts::pastDateError: last completed appointment cannot be in the futurepassed0 msFrontend · unit
lib/registry-onboarding.test.ts::validatePatientForm: phone required, email optional, aggregates field errorspassed0 msFrontend · unit
lib/rep-form.test.ts::representative: requires first name + emailpassed2 msFrontend · unit
lib/rep-form.test.ts::representative: every row needs a branchpassed0 msFrontend · unit
lib/rep-form.test.ts::practitioner: clinical role IS the designation (row designation cleared)passed1 msFrontend · unit
lib/rep-form.test.ts::non-clinical staff: designation is preservedpassed0 msFrontend · unit
lib/rep-form.test.ts::self-as-operator: needs a branch, emits an Operator responsibility, no personal infopassed0 msFrontend · unit
lib/rep-form.test.ts::edit: existing repId is carried throughpassed0 msFrontend · unit
lib/rep-form.test.ts::new doctor login: clinician-app portal + temp password toastpassed7 msFrontend · unit
lib/rep-form.test.ts::new staff login: business-app portal + invite-sent when no temp password (prod)passed0 msFrontend · unit
lib/rep-form.test.ts::reused account: link message, not a new-login toastpassed0 msFrontend · unit
lib/rep-form.test.ts::care-team count pluralizespassed0 msFrontend · unit
lib/rep-form.test.ts::a fresh Add-representative modal opens emptypassed0 msFrontend · unit
lib/rep-form.test.ts::closing after a save cannot leave the next rep holding the last one's branchespassed0 msFrontend · unit
lib/rep-form.test.ts::a default branch is preselected — that is a choice, not leftover statepassed0 msFrontend · unit
lib/rep-form.test.ts::editing an existing rep opens on THEIR values, not blankpassed0 msFrontend · unit
lib/rep-form.test.ts::a self-as-operator rep is recognised and its branches gatheredpassed0 msFrontend · unit
lib/rep-form.test.ts::the Operator grant is not shown as an editable admin rolepassed0 msFrontend · unit
lib/rep-form.test.ts::a rep with no responsibilities still opens with one editable rowpassed0 msFrontend · unit
lib/rep-form.test.ts::the country code defaults to +1 rather than emptypassed3 msFrontend · unit
lib/rep-form.test.ts::a clinician's NPI and taxonomy reach the payloadpassed6 msFrontend · unit
lib/rep-form.test.ts::a pasted NPI is normalised, and a lowercase taxonomy is upper-casedpassed0 msFrontend · unit
lib/rep-form.test.ts::a blank credential saves — hiring precedes the NPIpassed0 msFrontend · unit
lib/rep-form.test.ts::a transposed NPI is refused BEFORE the round-trip, not afterpassed0 msFrontend · unit
lib/rep-form.test.ts::a malformed taxonomy is refusedpassed0 msFrontend · unit
lib/rep-form.test.ts::a non-clinical person never carries a credentialpassed0 msFrontend · unit
lib/rep-form.test.ts::switching to non-clinical does not smuggle a stale credential throughpassed0 msFrontend · unit
lib/rep-form.test.ts::self-mode clears the credential explicitlypassed0 msFrontend · unit
lib/rep-form.test.ts::the form opens with the credential already on filepassed0 msFrontend · unit
lib/rep-form.test.ts::reopening for a different person does not retain the previous credentialpassed0 msFrontend · unit
lib/rep-labels.test.ts::a practitioner's badge names their clinical rolepassed1 msFrontend · unit
lib/rep-labels.test.ts::a non-clinical rep says so rather than showing a placeholderpassed0 msFrontend · unit
lib/rep-labels.test.ts::NO label ever degrades to a hyphenpassed0 msFrontend · unit
lib/rep-labels.test.ts::an uncatalogued value stays readable instead of blankpassed0 msFrontend · unit
lib/rep-labels.test.ts::a value the catalog has never heard of is humanized, not echoed rawpassed0 msFrontend · unit
lib/rep-labels.test.ts::an empty value yields an empty label, so the badge can be omittedpassed0 msFrontend · unit
lib/rep-labels.test.ts::a row lists its designation and admin grants togetherpassed0 msFrontend · unit
lib/rep-labels.test.ts::a directory-only row reads as Staff, which is a real statepassed0 msFrontend · unit
lib/rep-labels.test.ts::multiple admin grants are all shownpassed0 msFrontend · unit
lib/request-timeout.test.ts::an ordinary call gets the default deadlinepassed2 msFrontend · unit
lib/request-timeout.test.ts::a call may set its own deadlinepassed0 msFrontend · unit
lib/request-timeout.test.ts::zero or negative disables the deadline deliberatelypassed0 msFrontend · unit
lib/request-timeout.test.ts::the deadline aborts a request that never answerspassed48 msFrontend · unit
lib/request-timeout.test.ts::dispose stops the timer so a finished request leaves nothing pendingpassed61 msFrontend · unit
lib/request-timeout.test.ts::a caller cancelling is NOT reported as a timeoutpassed5 msFrontend · unit
lib/request-timeout.test.ts::an already-aborted caller signal aborts immediatelypassed0 msFrontend · unit
lib/request-timeout.test.ts::with the deadline disabled the caller's signal still passes throughpassed0 msFrontend · unit
lib/request-timeout.test.ts::with no deadline and no caller signal, fetch gets no signalpassed0 msFrontend · unit
lib/request-timeout.test.ts::dispose is safe to call twicepassed0 msFrontend · unit
lib/request-timeout.test.ts::the timeout message names the limit in seconds and says what to dopassed0 msFrontend · unit
lib/request-timeout.test.ts::timeouts carry 408 so callers can tell slow from wrongpassed0 msFrontend · unit
lib/role-assignment.test.ts::only the server's allowed targets are offeredpassed3 msFrontend · unit
lib/role-assignment.test.ts::an account with nowhere to go offers nothing, and says sopassed0 msFrontend · unit
lib/role-assignment.test.ts::no targets loaded is distinguished from an empty list of targetspassed0 msFrontend · unit
lib/role-assignment.test.ts::an unknown user id is reported as unknown, not as a disallowed movepassed0 msFrontend · unit
lib/role-assignment.test.ts::assigning to the current realm is refused with the reasonpassed0 msFrontend · unit
lib/role-assignment.test.ts::a target outside the server's list is refused even if it is a known realmpassed0 msFrontend · unit
lib/role-assignment.test.ts::a permitted move is allowed with no complaintpassed0 msFrontend · unit
lib/role-assignment.test.ts::an empty user id asks for one rather than showing a broken formpassed0 msFrontend · unit
lib/role-assignment.test.ts::a no-op is reported as a no-op, never as successpassed0 msFrontend · unit
lib/role-assignment.test.ts::a real change explains what it does and does not affectpassed0 msFrontend · unit
lib/role-assignment.test.ts::an unknown realm falls back to its raw value, never to blankpassed0 msFrontend · unit
lib/roster-badges.test.ts::a doctor gets a badge — the defect QA reportedpassed3 msFrontend · unit
lib/roster-badges.test.ts::every practitioner role has a human label, not an enum valuepassed0 msFrontend · unit
lib/roster-badges.test.ts::an unknown role is title-cased rather than rendered raw or droppedpassed0 msFrontend · unit
lib/roster-badges.test.ts::clinical identity is listed before dutiespassed0 msFrontend · unit
lib/roster-badges.test.ts::duties from OTHER branches never appear on this branch's rosterpassed0 msFrontend · unit
lib/roster-badges.test.ts::a duplicated designation is shown oncepassed0 msFrontend · unit
lib/roster-badges.test.ts::a designation echoing the clinical role is not shown twicepassed0 msFrontend · unit
lib/roster-badges.test.ts::administrative grants are badged and distinguishable from clinical onespassed0 msFrontend · unit
lib/roster-badges.test.ts::a non-clinical staff member still gets their designationpassed0 msFrontend · unit
lib/roster-badges.test.ts::a missing phone is a stated absence, not an empty cellpassed0 msFrontend · unit
lib/roster-badges.test.ts::a phone is shown with its country code, normalised to +passed0 msFrontend · unit
lib/roster-badges.test.ts::a nameless row falls back to the email local-part, never to blankpassed0 msFrontend · unit
lib/rpm-listing.test.ts::todayYmd is local, not UTCpassed4 msFrontend · unit
lib/rpm-listing.test.ts::an upcoming appointment cannot be in the pastpassed0 msFrontend · unit
lib/rpm-listing.test.ts::Set TMS carries the patient so Care Time opens on thempassed1 msFrontend · unit
lib/rpm-listing.test.ts::alerts deep-link is scoped to the patientpassed0 msFrontend · unit
lib/rpm-listing.test.ts::alert tone escalates with countpassed0 msFrontend · unit
lib/rpm-listing.test.ts::branch filter matches the registry's semanticspassed1 msFrontend · unit
lib/rpm-listing.test.ts::care team summary names the lead and counts the restpassed0 msFrontend · unit
lib/rpm-listing.test.ts::care team summary handles an empty or roleless teampassed0 msFrontend · unit
lib/rpm-listing.test.ts::send-document needs a channel to send onpassed0 msFrontend · unit
lib/rpm-listing.test.ts::view-measurements needs measurementspassed0 msFrontend · unit
lib/rpm-listing.test.ts::remove-patient needs an enrolment to endpassed0 msFrontend · unit
lib/rpm-listing.test.ts::the clinical-team hover never renders a raw database idpassed0 msFrontend · unit
lib/rpm-listing.test.ts::a real name still wins over the role placeholderpassed0 msFrontend · unit
lib/rule-scope.test.ts::the cascade runs corp → branch → doctor → patientpassed15 msFrontend · unit
lib/rule-scope.test.ts::every level has a label a clinician would recognisepassed0 msFrontend · unit
lib/rule-scope.test.ts::each level states what else an edit would changepassed0 msFrontend · unit
lib/rule-scope.test.ts::the badge names the NARROWEST level that set anythingpassed0 msFrontend · unit
lib/rule-scope.test.ts::a rule nobody has overridden reports the protocol defaultpassed0 msFrontend · unit
lib/rule-scope.test.ts::mixed provenance is detectablepassed0 msFrontend · unit
lib/rule-scope.test.ts::the per-field breakdown puts the narrowest overrides firstpassed0 msFrontend · unit
lib/rule-scope.test.ts::field paths are rendered readably, not as dotted keyspassed0 msFrontend · unit
lib/rule-scope.test.ts::an unknown level degrades to default rather than rendering rawpassed0 msFrontend · unit
lib/rule-scope.test.ts::each level is visually distinctpassed0 msFrontend · unit
lib/rule-scope.test.ts::a replacement names the rule it replaced and how much movedpassed0 msFrontend · unit
lib/rule-scope.test.ts::an override identical to what it replaced says sopassed0 msFrontend · unit
lib/rule-scope.test.ts::no override at all is stated as the protocol defaultpassed0 msFrontend · unit
lib/sms-delivery.test.ts::normalizeStatus: lowercase, blank → unknownpassed1 msFrontend · unit
lib/sms-delivery.test.ts::statusTone: good/bad/pendingpassed0 msFrontend · unit
lib/sms-delivery.test.ts::statusLabel: Title case, unknown → Queuedpassed0 msFrontend · unit
lib/sms-delivery.test.ts::deliveryRateTextpassed0 msFrontend · unit
lib/sms-delivery.test.ts::STATUS_FILTERS includes All + delivered + failedpassed0 msFrontend · unit
lib/soap-context.test.ts::noteTs: reads dtAppt, tolerates string dates, 0 when absentpassed3 msFrontend · unit
lib/soap-context.test.ts::latestSoapNote: picks max timestamppassed0 msFrontend · unit
lib/soap-context.test.ts::latestSoapNote: empty list → null; undated list → first rowpassed0 msFrontend · unit
lib/soap-context.test.ts::soapSections: only non-empty sections, charted order, chief complaint firstpassed1 msFrontend · unit
lib/soap-context.test.ts::hasSoapContent: false when null or all-blank, true otherwisepassed0 msFrontend · unit
lib/stale-guard.test.ts::a fresh guard applies its resultpassed1 msFrontend · unit
lib/stale-guard.test.ts::a cancelled guard drops the resultpassed0 msFrontend · unit
lib/stale-guard.test.ts::cancel is idempotent — React may call cleanup more than oncepassed0 msFrontend · unit
lib/stale-guard.test.ts::guards are independent — one run cancelling does not affect anotherpassed0 msFrontend · unit
lib/stale-guard.test.ts::the slow response for the PREVIOUS patient never renderspassed33 msFrontend · unit
lib/stale-guard.test.ts::without the guard, the same sequence renders the wrong patientpassed32 msFrontend · unit
lib/stale-guard.test.ts::latestOnly keeps the newest of out-of-order responsespassed32 msFrontend · unit
lib/stale-guard.test.ts::latestOnly passes a lone response throughpassed0 msFrontend · unit
lib/stale-guard.test.ts::latestOnly discards by identity, not by valuepassed23 msFrontend · unit
lib/stale-guard.test.ts::a rejected newer request does not resurrect an older onepassed22 msFrontend · unit
lib/stale-guard.test.ts::a payload naming another patient is refusedpassed0 msFrontend · unit
lib/stale-guard.test.ts::a payload naming the current patient is acceptedpassed0 msFrontend · unit
lib/stale-guard.test.ts::an unstamped payload is acceptedpassed0 msFrontend · unit
lib/stale-guard.test.ts::an empty subjectId is not treated as a claimpassed0 msFrontend · unit
lib/stale-guard.test.ts::subject comparison is by value, not by reference typepassed0 msFrontend · unit
lib/statement-print.test.ts::fmtUSD: two decimals + separators, safe on junkpassed18 msFrontend · unit
lib/statement-print.test.ts::fmtStmtDate: em dash when absent, formats when presentpassed5 msFrontend · unit
lib/statement-print.test.ts::statusTone: paid / overdue / openpassed0 msFrontend · unit
lib/statement-print.test.ts::amountDue: positive balance only, else 0passed0 msFrontend · unit
lib/telemetry-sim.test.ts::simEnabled requires an explicit truepassed1 msFrontend · unit
lib/telemetry-sim.test.ts::simEnabled fails closed on unknown or failed statuspassed0 msFrontend · unit
lib/telemetry-sim.test.ts::clampWindow keeps requests inside the server's boundspassed1 msFrontend · unit
lib/telemetry-sim.test.ts::clampWindow survives a blank number inputpassed0 msFrontend · unit
lib/telemetry-sim.test.ts::clampWindow truncates fractional inputpassed0 msFrontend · unit
lib/telemetry-sim.test.ts::runSummary pluralises alertspassed0 msFrontend · unit
lib/telemetry-sim.test.ts::purgeTotal sums per-collection countspassed0 msFrontend · unit
lib/tenant-scope.test.ts::global scope sends no tenant keys at allpassed2 msFrontend · unit
lib/tenant-scope.test.ts::a picked branch and corp are sent; nulls are omittedpassed0 msFrontend · unit
lib/tenant-scope.test.ts::extra fields survive alongside the scopepassed0 msFrontend · unit
lib/tenant-scope.test.ts::a JWT is never accepted as a tenant idpassed0 msFrontend · unit
lib/tenant-scope.test.ts::empty and non-string values are refusedpassed0 msFrontend · unit
lib/tenant-scope.test.ts::forbidden stays distinct from emptypassed0 msFrontend · unit
lib/tenant-scope.test.ts::rows are counted, failures are failurespassed0 msFrontend · unit
lib/tenant-scope.test.ts::a non-array success body counts as empty, not as one rowpassed0 msFrontend · unit
lib/tenant-scope.test.ts::every outcome has a line, and none of them invents datapassed0 msFrontend · unit
lib/threshold-trends.test.ts::a sane field passespassed3 msFrontend · unit
lib/threshold-trends.test.ts::crossed min/max is caught at entrypassed0 msFrontend · unit
lib/threshold-trends.test.ts::urgent bounds must sit outside the normal bandpassed0 msFrontend · unit
lib/threshold-trends.test.ts::partially-specified fields are finepassed0 msFrontend · unit
lib/threshold-trends.test.ts::validateFields reports every bad field, not just the firstpassed0 msFrontend · unit
lib/threshold-trends.test.ts::a trend number of zero is rejected because it silently disables the rulepassed0 msFrontend · unit
lib/threshold-trends.test.ts::negative trend numbers are rejectedpassed0 msFrontend · unit
lib/threshold-trends.test.ts::a count that cannot fit its window is rejectedpassed0 msFrontend · unit
lib/threshold-trends.test.ts::the protocol defaults themselves validate cleanpassed0 msFrontend · unit
lib/threshold-trends.test.ts::only numeric keys are editable — action is a label, not a numberpassed0 msFrontend · unit
lib/threshold-trends.test.ts::labels and units are human-readablepassed0 msFrontend · unit
lib/threshold-trends.test.ts::emptied trends are pruned so they do not shadow the default with nothingpassed0 msFrontend · unit
lib/threshold-trends.test.ts::validateOverride covers fields and trends togetherpassed0 msFrontend · unit
lib/tms.test.ts::the suite is gated until a patient is chosenpassed1 msFrontend · unit
lib/tms.test.ts::every child section inherits the one selectionpassed0 msFrontend · unit
lib/tms.test.ts::an id outside the roster still binds, but names nobody it cannot namepassed0 msFrontend · unit
lib/tms.test.ts::no selection means no context for any child to act onpassed0 msFrontend · unit
lib/tms.test.ts::care plan drives the activity listpassed1 msFrontend · unit
lib/tms.test.ts::encode then decode is losslesspassed0 msFrontend · unit
lib/tms.test.ts::an empty note round-trips as empty, not as the meta stringpassed0 msFrontend · unit
lib/tms.test.ts::a note containing the separator survives decodingpassed0 msFrontend · unit
lib/tms.test.ts::legacy rows with separate fields still decodepassed0 msFrontend · unit
lib/tms.test.ts::whenToMs handles both the modern epoch and the legacy objectpassed1 msFrontend · unit
lib/tms.test.ts::roleFor labels the actor without echoing the idpassed0 msFrontend · unit
lib/tms.test.ts::CPT ladder: 99457 at 20 minutes, 99458 per further 20, capped at twopassed1 msFrontend · unit
lib/tms.test.ts::the PDF patient block carries the associated branchpassed0 msFrontend · unit
lib/tms.test.ts::a missing field prints a dash rather than vanishingpassed0 msFrontend · unit
lib/tms.test.ts::age is appended only when the DOB parsespassed0 msFrontend · unit
lib/tms.test.ts::column widths sum to the usable width, so nothing spills past the marginpassed0 msFrontend · unit
lib/tms.test.ts::notes are appended only for the reported patient, in the reported windowpassed0 msFrontend · unit
lib/tms.test.ts::notes come out in chronological orderpassed0 msFrontend · unit
lib/tms.test.ts::the window is inclusive of both end datespassed0 msFrontend · unit
lib/tms.test.ts::the TMS-notes toggle defaults to OFFpassed0 msFrontend · unit

Run history

Nothing queued. POST /api/runs with a valid token to request a run.

StartedStatusTestsFailed Could not runBE covFE covCommit
2026-08-11T15:42:21passed6740099.2%7333e37
2026-08-11T14:50:31passed6740099.2%e18343b