Files
vigilcare-records/docs/digitization-workstation-guide.md
T

205 lines
8.8 KiB
Markdown

```markdown
# VigilCare Records — Digitization Workstation Guide
## Overview
This guide describes three primary clinical workflows supported by the VigilCare
Records digitization platform: historical backfill, live bedside capture, and
corrections. Each workflow maps to a real operational scenario in a paper-based
hospital or clinic.
---
## Workflow 1: Historical Backfill (Track A)
**Scenario:** District General Hospital has 200 active patients with paper charts.
The facility is deploying VigilCareClinical for real-time alerting. Before alerts
can fire, historical vital signs and lab results must be digitized into the system.
**Actors:** Intake Clerk, Data Entry Clerk, Verifier, Clinical Approver (for
high-stakes batch types)
**Steps:**
### 1. Intake (Intake Clerk)
The intake clerk receives a stack of patient charts from the ward. For each chart
section:
1. Scan the page(s) using a flatbed scanner or document camera
2. Log in to the workstation as `intake1`
3. Navigate to **Intake** view
4. Upload the scan (PDF, JPEG, or PNG; max 25 MB)
5. Select the batch type:
- **Vitals Sheet** — vital signs from nursing observation charts
- **Lab Results** — laboratory test result reports
- **Patient Registration** — face sheet with demographics
- **Encounter Summary** — admission/discharge summaries
- **Allergy Update** — allergy documentation
- **Medication List** — current medication records
6. Set track to **Backfill** (default)
7. Optionally link to an existing patient by searching MRN or name
8. Click **Upload and Create Batch**
The batch is created in `uploaded` status. The SHA-256 hash prevents duplicate
uploads of the same document for the same patient within 24 hours.
### 2. Data Entry (Data Entry Clerk)
The entry clerk opens the batch from their **Entry** queue:
1. Log in as `entry1`
2. Click the batch to open the split-pane workstation
3. **Left pane:** The scanned document is displayed with zoom, pan, and rotate
controls. The clerk reads the handwritten or printed values from the scan.
4. **Right pane:** Structured form fields for:
- Patient demographics (name, DOB, sex, blood type, emergency contact)
- Encounter context (admission date, department, room/bed, admission reason)
- Observations (one row per vital sign or lab result)
**Observation entry rules:**
- Each observation requires a code (e.g., `HEART_RATE`), numeric value, unit, and
`recordedAt` timestamp taken from the chart (not scan time)
- Plausibility validation fires on save:
- Heart rate: 20-300 bpm
- Temperature: 25-45 C
- SpO2: 0-100 %
- Potassium: 1.5-10.0 mEq/L
- Glucose: 20-800 mg/dL
- Out-of-range values return `422 OBSERVATION_OUT_OF_PLAUSIBLE_RANGE`
- This catches the most common digitization error: decimal misplacement (5.2 vs 52)
5. Click **Submit for Verification** when all fields are complete
6. The batch transitions to `pending_verification`
### 3. Verification (Verifier)
The verifier reviews the entry against the original scan:
1. Log in as `verifier1` (must be a different person than the entry clerk)
2. Open the batch from the **Verification** queue
3. **Left pane:** Same scan viewer
4. **Right pane:** Each field has a verification checkbox
- Compare each entered value against the scan
- Check the checkbox when the value matches
- Progress bar shows completion percentage
5. If all fields match: click **Approve - Verified**
6. If any field is wrong: click **Reject** with a mandatory reason
**Separation of duties:** The system enforces that `enteredByUserId !== verifiedByUserId`.
If the entry clerk tries to verify their own batch, the API returns `409
SEPARATION_OF_DUTIES_VIOLATION`.
**On rejection:** The batch returns to `rejected` status. The entry clerk sees the
rejection reason and can correct the draft, then resubmit for verification.
### 4. Approval and Promotion
Track A has **two human gates** before live records exist:
1. **Verifier** — scan comparison (`verify` / `reject` on `pending_verification`)
2. **Clinical approver** — promotion authorization (`approve` on `verified` or `awaiting_clinical_approval`)
After verification passes, site configuration routes the batch:
| batchType | Default: next status after verify |
|---|---|
| `patient_registration`, `allergy_update` | `verified` → clinical approver calls `approve` |
| `encounter_summary`, `vitals_sheet`, `lab_results`, `medication_list`, `mixed` | `awaiting_clinical_approval` → clinical approver reviews in **Clinical Approval** queue, then calls `approve` |
Log in as `approver1` for the approval step. Verifiers (`verifier1`) never call `approve`.
On approval:
1. The promotion service runs atomically:
- Create or update Patient in VigilCareClinical
- Create or match Encounter
- Insert each DraftObservation as a live Observation
- Write outbox events (alerting suppressed for backfill unless
`enableRetroactiveAlerts: true`)
2. Batch status transitions to `promoted`
3. All observations are now visible in VigilCareClinical's ward dashboard
**Alert suppression for backfill:** By default, backfilled observations do not
trigger real-time alerts. A historical potassium of 6.2 mEq/L from three days ago
should not page the on-call physician today. The facility can override this per
batch by setting `enableRetroactiveAlerts: true`.
---
## Workflow 2: Live Bedside Capture (Track B)
**Scenario:** A nurse or physician enters vital signs at the bedside using a tablet.
The observation needs to reach VigilCareClinical's alert pipeline immediately.
**Actor:** Clinician
**Steps:**
1. Log in as `clinician1`
2. Navigate to the live capture endpoint
3. Select or create the encounter
4. Enter observation values with `clinicianAttestation: true`
5. Confirm with password re-entry or PIN
**What happens:**
- A `DigitizationBatch` is created with `track: live_capture` and lands in `promoted` immediately (workflow states skipped, audit unit retained)
- `DraftObservation` rows and `DigitizationEvent` entries (`live_capture_attested`, `promoted`) are written in the same transaction as live observations
- No verification queue — the clinician's attestation replaces verify + approve for that batch only
- The batch is promoted synchronously
- If a critical value is entered (e.g., potassium 6.8 mEq/L), the synchronous
alert fires before the response returns
- The observation appears in VigilCareClinical's ward dashboard immediately
**When to use Track B vs Track A:**
- Track B: Current patient encounter, values just measured, clinician is at bedside
- Track A: Historical charts, bulk digitization, values from past encounters
---
## Workflow 3: Corrections
**Scenario:** After promotion, a reviewer discovers that the SpO2 value was entered
as 94% but the chart actually shows 95%. The promoted observation must be corrected.
**Rule:** Approved records are never silently edited. Corrections go through the
full pipeline.
**Steps:**
1. Create a new batch with `supersedesBatchId` pointing to the original batch
2. Re-enter the corrected values
3. Submit for verification (new entry, new verifier review)
4. On approval and promotion:
- The corrected observations are inserted as new live records
- The original observations are marked `superseded` (soft flag, not deleted)
- The audit trail shows: original values, correction request, new values,
who made each change and when
**Why not just edit the original?** Clinical audit integrity. A regulator must be
able to see what was originally entered, when it was corrected, and by whom. Silent
edits destroy this chain.
---
## Staffing Considerations
- In a small facility, one person may serve as both intake clerk and data entry clerk
- The system **never** allows one person to both enter and verify the same batch,
even if they hold both roles
- Minimum staff for full workflow: 2 people (one enters, one verifies)
- The system tracks clerk throughput via the work queue overview endpoint and
Prometheus metrics
---
## Common Issues and Resolution
| Issue | Cause | Resolution |
|---|---|---|
| `409 DUPLICATE_DOCUMENT` | Same PDF uploaded for same patient within 24h | Check if batch already exists; use a different scan if needed |
| `409 SEPARATION_OF_DUTIES_VIOLATION` | Entry clerk trying to verify own batch | Assign to a different verifier |
| `422 OBSERVATION_OUT_OF_PLAUSIBLE_RANGE` | Value outside allowed range | Check for decimal misplacement (52 vs 5.2) |
| `409 ILLEGAL_STATUS_TRANSITION` | Trying to skip a workflow step | Follow the status machine: uploaded -> in_entry -> pending_verification -> verified -> approved -> promoted |
| High rejection rate (>15%) | Scan quality or training issues | Review rejection reasons; improve scanner resolution or provide entry clerk training |
| Batch stuck in `approved` | VigilCareClinical unreachable | Promotion retry worker handles this automatically with exponential backoff |
```