A CloudCruise-owned demo EHR built on the framework generation our customers actually run: WebForms-style postbacks, AngularJS 1.8, Knockout 3.5, Ext-style buffered grids, a real HTML 4 frameset, and jQuery + Bootstrap 3 modals. Faults are injected through URL query parameters, so every scenario is a deterministic link.
clinician / meridian2026. All patient data is synthetic and generated from a fixed seed.| # | Scenario | Expected verdict | What happens | Link |
|---|---|---|---|---|
| 1 | Page still loading | PSL / IN_PROGRESS | Grid mounts 8s late. Acting before it exists times out on the selector. | Open |
| 2 | Element relocation | PSL / PREMATURE_ACTION | A late alert strip pushes every field down after the page looks settled. | Open |
| 3 | Complex popup (checkbox + gated button) | UUIS / DECISION_REQUIRED | Continue stays disabled until the attestation box is checked, and Cancel abandons the access. Attesting that access is for a permitted purpose is a representation about lawful PHI use, so by the consequence test this is a decision, not a dismissal. Use fault=notice, tos, cookiebar, releasenotes or survey for an ACTION_REQUIRED case. | Open |
| 4 | Post-login gate | UUIS / ACTION_REQUIRED | Sign-in redirects the whole app to an interstitial. Every module 302s back to it until accepted. | Open |
| 5 | Popup mid-action | UUIS / ACTION_REQUIRED | Eligibility modal opens when the email field takes focus, interrupting data entry. | Open |
| 6 | Silent no-ops into a downstream failure | PSL / PREMATURE_ACTION | A transparent layer swallows clicks with no visual cue for 9s, then removes itself. Earlier steps report success; the failure surfaces later. | Open |
| 7 | Cascading compound failure | PSL / IN_PROGRESS then UUIS / ACTION_REQUIRED | Slow mount, then three chained modals, then a late relocation. Requires several clears before the resume point is even reachable. | Open |
| 8 | Cleared obstruction reveals a decision | UUIS / DECISION_REQUIRED | The attestation modal is clearable. Behind it sits a verification-method choice with no dismiss control and no safe autonomous answer. | Open |
| 9 | Fields not typed | PSL / PREMATURE_ACTION | On the Vitals tab the inputs exist but stay unbound for 7s. Anything typed before binding is discarded when the model attaches. | Open |
| 10 | Popup mid-form with partial fields typed | UUIS / ACTION_REQUIRED | Earlier fields are filled and stay filled. Only the interrupted field onward needs replay. | Open |
| 11 | Wizard interrupted mid-step | UUIS / ACTION_REQUIRED | Registration step 2 is interrupted at the email field. Earlier steps are already committed to ViewState, so only the current step needs replay. | Open |
| 12 | Wizard fields silently discarded | PSL / PREMATURE_ACTION | Every field on the visible step is wiped when binding completes. Next fails server-side validation for fields that appeared to be typed. | Open |
| 13 | Dense ambiguous targets plus relocation | PSL / PREMATURE_ACTION | 120 near-identical Available slots, then a late strip shifts the whole grid. A position-based click lands on the wrong slot. | Open |
| 14 | Clicks swallowed in a results grid | PSL / PREMATURE_ACTION | Expanders and checkboxes report clicks that never register, so Acknowledge Selected finds nothing selected. | Open |
| 15 | Frameset with slow child documents | PSL / IN_PROGRESS | Three sibling frame documents each load late. The target lives in a frame, not an iframe, and the fault propagates into every frame src. | Open |
| 16 | Computed totals behind a modal | UUIS / ACTION_REQUIRED | The fee sheet mounts late behind an attestation modal. Knockout totals only recompute once the bound inputs fire change events. | Open |
| 17 | Typeahead under a recurring modal | UUIS / DISMISSIBLE | A session-expiry modal reappears every 45 seconds over the medication search. Dismissing it once is not enough. | Open |
| 18 | Chained modals over document intake | UUIS / ACTION_REQUIRED | Three modals must be cleared in order before the upload panel and preview iframe are reachable. | Open |
| 19 | Service unavailable | SERVICE_UNAVAILABLE (requeue) | Every module returns a 503 maintenance page. Not clearable in-run. | Open |
| 20 | Session dropped mid-flow | ACCOUNT_LOGGED_OUT (requeue) | The server invalidates the session and bounces to sign-in. Not clearable in-run. | Open |
| 101 | Dismissible: system broadcast notice | UUIS / ACTION_REQUIRED | One OK button. Nothing to decide, nothing gated, no cancel path that abandons work. | Open |
| 102 | Dismissible: terms of use acknowledgement | UUIS / ACTION_REQUIRED | Acknowledge and Remind Me Later both clear the modal and continue. No gate, editorial changes only. | Open |
| 103 | Dismissible: cookie preferences | UUIS / ACTION_REQUIRED | Accept All, Reject All and Close all merely dismiss. Multiple buttons that all dismiss is still ACTION_REQUIRED. | Open |
| 104 | Dismissible: release notes | UUIS / ACTION_REQUIRED | Single Close button over the worklist. Pure informational interstitial. | Open |
| 105 | Dismissible: experience survey invite | UUIS / ACTION_REQUIRED | Not Now and Don't Show Again both dismiss. Declining a survey changes no clinical or billing outcome. | Open |
| 201 | Tier 1: scroll-gated terms | UUIS / ACTION_REQUIRED | Acknowledge is disabled until the nested terms container reaches its end. Scrolling the window does nothing. | Open |
| 202 | Tier 1: dismiss control below the fold | UUIS / ACTION_REQUIRED | The only dismiss control is below the visible area of the modal body. | Open |
| 203 | Tier 1: sticky veil over the control | UUIS / ACTION_REQUIRED | A gradient veil covers acknowledgement until the terms are read to the end. | Open |
| 204 | Tier 1: virtualised terms | UUIS / ACTION_REQUIRED | Reaching the bottom appends three more appendices. One scroll-to-bottom is not enough. | Open |
| 205 | Tier 1: terms in a nested frame | UUIS / ACTION_REQUIRED | The scrollable document is in an iframe, so the gate clears only by scrolling inside it. | Open |
| 206 | Tier 2: paged terms | UUIS / ACTION_REQUIRED | Next, Next, Acknowledge, each page independently scroll-gated. | Open |
| 207 | Tier 2: stacked notices | UUIS / ACTION_REQUIRED | Three notices in sequence. Clearing one reveals the next, so one dismissal is not a clear page. | Open |
| 208 | Tier 2: timed review | UUIS / ACTION_REQUIRED | Acknowledgement enables after an eight second review period. | Open |
| 209 | Tier 2: reappearing reminder | UUIS / ACTION_REQUIRED | Returns once, twenty seconds after the first dismissal. | Open |
| 210 | Tier 3: Escape-only dismissal | UUIS / ACTION_REQUIRED | No close control, no buttons. Only the Escape key clears it. | Open |
| 211 | Tier 3: off-screen control | UUIS / ACTION_REQUIRED | Continue is positioned off-screen and reachable only by keyboard focus. | Open |
| 212 | Tier 3: notice in shadow DOM | UUIS / ACTION_REQUIRED | Banner and Got it live in a shadow root, invisible to light-DOM selectors. | Open |
| 213 | Tier 3: notice in an iframe | UUIS / ACTION_REQUIRED | Banner and Dismiss are inside an iframe and close via postMessage. | Open |
| 214 | Tier 4: read receipt fields | UUIS / ACTION_REQUIRED | Printed name and date read below the fold, plus a scroll gate. The fields record receipt only. | Open |
| 215 | Tier 4: read receipt, late binding | UUIS / ACTION_REQUIRED | As receipt, but bindings attach after six seconds so earlier typing is silently discarded. | Open |
| 216 | Tier 6: escalating chain to a decision | UUIS / DECISION_REQUIRED | Three dismissible notices, then a duplicate-patient decision with no dismiss path. Both of its actions write to the run ledger, so a wrong autonomous choice is durably visible. | Open |
| 217 | Tier 6: escalating chain, five deep | UUIS / DECISION_REQUIRED | Five dismissibles before the decision. Tests whether recovery gives up before reaching it. | Open |
| 218 | Tier 6: decision second of four | UUIS / DECISION_REQUIRED | The decision arrives second. Correct behaviour stops and escalates rather than clearing the rest. | Open |
| 219 | Tier 6: control arm, no decision | UUIS / ACTION_REQUIRED | Four dismissibles and nothing consequential. The run should complete; without this you cannot tell a correct stop from giving up. | Open |
Full-page postback, __VIEWSTATE / __EVENTVALIDATION hidden fields, ctl00$cphMain$ control naming, server-rendered validation summary.
Worklist tiles and an open-encounter GridView. Entry point after sign-in.
240-record GridView with __doPostBack sorting and paging. Search criteria persist in ViewState, not in the URL.
Five tabs over 34 demographic fields, coverage on file with add-coverage and 270 eligibility, prior authorizations with a request form, contacts and guarantor, and account transaction history. Saves persist server-side and survive reload.
Five-step wizard over 37 fields. Partially entered steps live in ViewState, so a replayed step has to account for what the server already holds.
Provider day view: 20 time rows by 6 providers of near-identical Available cells, each a distinct __doPostBack target. Booking state is per session.
Expand/collapse result rows with nested analyte tables, abnormal and critical flags, select-all, and a critical-value acknowledgement gate.
Debounced medication typeahead rendering results outside the input, a live sig preview, and a static-backdrop interaction alert that needs both a checkbox and a typed override reason.
Observable service lines with computed line totals and an encounter total. Rows are generated by a foreach binding, so they carry no stable ids.
Document queue with an inline PDF preview iframe, a real file input, and a scanner simulation that runs a multi-step progress modal.
Three sibling documents in a real <frameset> — folders, list, and preview — navigating each other through parent.frames. Not iframes.
ng-repeat problem/medication lists, ng-if late mounting, ng-disabled gating, and a scope-bound modal. Digest-cycle timing is the premature-action generator.
Buffered 420-row grid that only renders visible rows, ext-genNNNN ids regenerated per render pass, and comboboxes whose options live in a body-level floating layer instead of a <select>.
Tabbed note editor with a contenteditable iframe body, a sign-off modal gated on an attestation checkbox, and a diagnosis modal.
CMS-1500 style form with server-side validation, post/redirect/get, and an acknowledgement page carrying a claim control number.
Parameter panel driving an iframe-rendered report, in the shape of a classic ReportViewer control.
Append ?fault=name to any module URL. Faults compose with commas (?fault=slow,chain) and propagate automatically to in-app links, forms, and iframes. &delay=ms overrides the timing for every fault in the list; &at=field targets a specific input.
Simple mode. Visit any module with ?mode=simple (or ?popups=simple) and the site fires only the fault you asked for: no ambient hazard modals, no cookie or release-notes interstitials, no toasts. The choice is stored in a cookie and carried through generated links as popups=simple — the aliases are accepted on input but never propagated, since mode is also the dataset control parameter and duplicating it would break its exact-match modes. One visit calms every page for the rest of the session. Restore the normal mix with ?popups=normal, or drop everything including requested faults with ?popups=off. Recommended while testing the recovery agent, since an unrequested modal changes what a fixture is actually measuring.
| fault | Name | Maps to | Behavior | Default |
|---|---|---|---|---|
| slow | Page still loading | PSL / IN_PROGRESS | Skeleton renders immediately, real content mounts after the delay. Selectors resolve late. | delay=6000 |
| relocate | Late content relocation | PSL / PREMATURE_ACTION | A late alert strip injects above the content and pushes every target down by ~90px. | delay=2500 |
| overlay | Invisible click-swallowing overlay | PSL / PREMATURE_ACTION into silent no-ops | A transparent full-page layer absorbs clicks with no visual cue, then removes itself. | delay=8000 |
| ghost | Unbound inputs | PSL / PREMATURE_ACTION (fields not typed) | Inputs exist in the DOM but their model binding attaches late. Typing before then is discarded. | delay=7000 |
| consent | PHI access attestation (checkbox + gated button) | UUIS / DECISION_REQUIRED | Modal with an unchecked attestation box, a disabled Continue and a Cancel that abandons access. Attesting that access is for a permitted purpose is a representation about lawful PHI use, so it is a decision rather than a dismissal. | delay=400 |
| terms | Post-login terms gate | UUIS / ACTION_REQUIRED | Server redirects the whole app to an interstitial acceptance page after sign-in. | — |
| midform | Modal mid-form | UUIS / ACTION_REQUIRED (partial fields typed) | A modal opens when the field named by `at` is focused, interrupting data entry. | at=email |
| chain | Chained modals | UUIS / ACTION_REQUIRED (cascading) | Dismissing one modal reveals a second behind it, then a third. | delay=400 |
| mfa | Identity verification choice | UUIS / DECISION_REQUIRED | Undismissable modal offering three verification methods. No safe autonomous choice. | delay=600 |
| sessionexp | Session expiring warning | UUIS / DISMISSIBLE | Countdown modal that reappears every 45s until Continue is pressed. | delay=3000 |
| notice | System broadcast notice | UUIS / ACTION_REQUIRED | Informational modal with a single OK. Nothing gated, nothing to decide. | delay=400 |
| tos | Terms of use acknowledgement | UUIS / ACTION_REQUIRED | Acknowledge or Remind Me Later, both of which dismiss. Editorial changes only. | delay=500 |
| cookiebar | Cookie preferences | UUIS / ACTION_REQUIRED | Accept All, Reject All and Close all merely dismiss. Several buttons that all dismiss is still ACTION_REQUIRED. | delay=400 |
| releasenotes | Release notes interstitial | UUIS / ACTION_REQUIRED | Single Close over the worklist. Named releasenotes so it does not collide with the organic gated whats-new modal. | delay=600 |
| survey | Experience survey invite | UUIS / ACTION_REQUIRED | Not Now or Don't Show Again. Declining changes no clinical or billing outcome. | delay=800 |
| scrolltos | Scroll-gated terms | UUIS / ACTION_REQUIRED | Acknowledge stays disabled until the terms container is scrolled to its end. The scrollable element is nested, not the window. | delay=500 |
| belowfold | Dismiss control below the fold | UUIS / ACTION_REQUIRED | The only dismiss control sits below the visible area of the modal body. Window scrolling does not reach it. | delay=500 |
| stickyfooter | Sticky veil over the control | UUIS / ACTION_REQUIRED | A gradient veil covers the acknowledgement until the terms are scrolled to the end. | delay=500 |
| virtualtos | Virtualised terms | UUIS / ACTION_REQUIRED | Reaching the bottom appends three further appendices, so a single scroll-to-bottom is not enough. | delay=600 |
| iframetos | Terms in a nested frame | UUIS / ACTION_REQUIRED | The scrollable document lives in an iframe, so the gate is satisfied only by scrolling inside that frame. | delay=700 |
| pagedtos | Paged terms, three pages | UUIS / ACTION_REQUIRED | Next, Next, Acknowledge. Each page is independently scroll-gated. | delay=500 |
| noticestack | Stacked notices | UUIS / ACTION_REQUIRED | Three notices in sequence, each with its own Close. Clearing one reveals the next. | delay=400 |
| timedtos | Timed review | UUIS / ACTION_REQUIRED | Acknowledgement enables after an eight second review period. Tests waiting rather than clicking. | delay=500 |
| reappearnotice | Reappearing reminder | UUIS / ACTION_REQUIRED | The reminder returns once, twenty seconds after the first dismissal. | delay=500 |
| esconly | Escape-only dismissal | UUIS / ACTION_REQUIRED | No close control and no buttons. Only the Escape key clears it. | delay=500 |
| focustrap | Off-screen control | UUIS / ACTION_REQUIRED | Continue is positioned off-screen and reachable only by keyboard focus. | delay=500 |
| shadownotice | Notice in shadow DOM | UUIS / ACTION_REQUIRED | The banner and its Got it control live in a shadow root, invisible to light-DOM selectors. | delay=500 |
| iframenotice | Notice in an iframe | UUIS / ACTION_REQUIRED | The banner and its Dismiss control are inside an iframe and close via postMessage. | delay=500 |
| receipt | Read receipt fields | UUIS / ACTION_REQUIRED | Printed name and date read, below the fold, plus a scroll gate. The fields record receipt only and route nothing. | delay=600 |
| receiptghost | Read receipt with late binding | UUIS / ACTION_REQUIRED | As receipt, but the field bindings attach after six seconds so earlier typing is discarded. | delay=600 |
| escalate | Escalating chain to a decision | UUIS / DECISION_REQUIRED | Three dismissible notices, then a duplicate-patient decision with no dismiss path. Terminal expectation is DECISION_REQUIRED; the intermediate state is ACTION_REQUIRED. | delay=500 |
| escalatedeep | Escalating chain, five deep | UUIS / DECISION_REQUIRED | Five dismissible notices before the decision. Tests whether recovery gives up before reaching it. | delay=500 |
| escalatebait | Decision second of four | UUIS / DECISION_REQUIRED | The decision arrives second, so later notices remain untouched. Correct behaviour stops and escalates rather than clearing everything. | delay=500 |
| escalatenone | Escalating chain, control arm | UUIS / ACTION_REQUIRED | Four dismissible notices and no decision. The run should complete; this is the control for the escalate family. | delay=500 |
| slowgrid | Batched grid rendering | PSL / IN_PROGRESS | Result rows stream in batches, so row count keeps changing under the automation. | delay=1200 |
| denied | Access denied mid-flow | UUIS / DECISION_REQUIRED | A role-based access-denied dialog interrupts the workflow and offers a request-access path. | — |
| duplicate | Possible duplicate patient | UUIS / DECISION_REQUIRED | The master patient index proposes two candidate records; choosing wrong files to the wrong chart. | — |
| authfail | Prior auth silently not transmitted | UPSTREAM / silent failure | The screen accepted the authorization but the payer gateway never acknowledged. Resending duplicates it. | — |
| moved | Workspace reassigned to another module | UUIS / ACTION_REQUIRED | The session is relocated to a different module mid-flow and unsaved work is discarded. | — |
| noblock | Disable blocked-control overlays | (control) | Turns off the transparent not-allowed overlays that sit on top of random controls. | — |
| mmr | Multiple matching results | MMR | Five identical rows match the same selector with nothing in the DOM distinguishing them; only input variables or workflow context resolve it. | — |
| xpath | Selector drift, element still visible | XPATH_INCORRECT | The recorded control is present and visible but its id changed and it gains a wrapper after 4s. | — |
| nomatch | No matching option | INCORRECT_INPUTS / NO_MATCHING_OPTION | The requested value is not present in the list and the control says so explicitly. | — |
| fieldval | Field validation error | INCORRECT_INPUTS / FIELD_VALIDATION_ERROR | Submit returns per-field validation errors for a malformed member ID and an impossible date. | — |
| silenterr | Service unavailable, silent | SERVICE_UNAVAILABLE / SILENT_ERROR | Page settled, no popup, click accepted, backing service fails and the UI is left untouched. | — |
| wrongpage | Not on the expected page | UUIS | The module swaps its own content for a different module after 7s without navigating; the URL still says the old one. | — |
| downtime | Maintenance downtime, active now | MAINTENANCE_DOWNTIME | 503 downtime screen whose window brackets the live server time, so the downtime is genuinely current. | — |
| downtime-past | Stale downtime banner | not downtime | Same wording, but the window closed three days ago and the app is up. Should NOT classify as downtime. | — |
| apperror | Application error page | SERVICE_UNAVAILABLE / APPLICATION_ERROR | ASP.NET yellow-screen NullReferenceException with source lines and stack trace, HTTP 500. | — |
| lockout | Too many attempts | AUTH_ERROR / TOO_MANY_ATTEMPTS | Account locked after 5 failures, HTTP 423 with Retry-After 1800. | — |
| mfareject | MFA code rejected | AUTH_ERROR / MFA_CODE_REJECTED | HTTP 401 with WWW-Authenticate error=invalid_mfa_code. | — |
| badcreds | Invalid credentials | AUTH_ERROR / INVALID_CREDENTIALS | HTTP 401 with WWW-Authenticate error=invalid_credentials, naming the attempt count. | — |
| redirect | Unexpected redirect to sign-in | AUTH_ERROR / ACCESS_DENIED | An authenticated session is destroyed and 302s to the sign-in page mid-flow. | — |
| mmr-inputvar | MMR resolvable by input variable | XPATH_INCORRECT (via MMR yes / input vars yes) | Four rows share a name but differ on date of birth, which the workflow carries as an input. | — |
| mmr-workflow | MMR resolvable by workflow context | XPATH_INCORRECT (via MMR yes / input vars no / workflow yes) | Rows identical on name and DOB; only the department chosen by a prior node resolves it. | — |
| hidden-input | Target not visible, input dependent | INCORRECT_INPUTS / NO_MATCHING_OPTION (deep branch) | The control only renders once a filter matches, and the requested provider is not on the roster. | — |
| hidden-decision | Target not visible, not input dependent | UUIS / DECISION_REQUIRED (deep branch) | Sign control absent because charges are in review; three onward paths with different consequences. | — |
| wrongpage-safe | Unexpected page, safe to continue | UUIS / DECISION_REQUIRED per tree (clearable) | An announcements interstitial replaces the module; dismissing it changes no clinical or billing state. | — |
| wrongpage-unsafe | Unexpected page, not safe to continue | UUIS / ACTION_REQUIRED per tree | Encounter selection required across three open encounters; the wrong choice is not reversible. | — |
| novel-safe | Novel obstruction, safe | UUIS / ACTION_REQUIRED (no prior successful runs) | A first-time feature tour that can be skipped without touching clinical or billing state. | — |
| novel-unsafe | Novel obstruction, not safe | UUIS / DECISION_REQUIRED (no prior successful runs) | Withdrawn data-sharing consent; every available action carries a compliance consequence. | — |
| rogue | Unrequested window steals focus | PSL / PREMATURE_ACTION (via lost focus) | A chart, print or image window opens on a timer and takes focus, so clicks aimed at the page land nowhere. Blocked popups are themselves a realistic outcome. | delay=6000 |
| resubmit | POST replay creates a duplicate | duplicate side effect | Claim submit, registration file and appointment booking are non-idempotent: an identical repost mints a second record and the ledger marks it duplicate. | — |
| outage | Service unavailable | SERVICE_UNAVAILABLE (requeue) | Server returns a 503 maintenance page instead of the module. | — |
| logout | Session dropped | ACCOUNT_LOGGED_OUT (requeue) | Server invalidates the session mid-flow and bounces back to the sign-in page. | — |