Radiology + HL7 Interchange
A radiologist who finds a pulmonary embolism and files the report is not done. The loop closes when the ordering provider acknowledges the finding.
The healthcare module that sits closest to the SaMD line — and stays on the operational side of it. The AI scans drafted findings for critical-finding *language*. The radiologist confirms. The system tracks communication. Never adjudicates clinical care.
The three views
Worklist — imaging orders sorted STAT → urgent → routine. Inline Acquire and Sign-report actions per row.
Critical findings — open critical-finding records with their 60-minute communication clock. Orange ≥45min elapsed, red ≥60min (the ACR PRIORITY 100 rule).
Interchange log — every inbound/outbound HL7 v2 / FHIR / X12 / EDIFACT message logged with partner, type, status, control id. The audit log is the system of record for what came in and went out.
The 60-minute rule
ACR practice guidelines: critical findings must be communicated to the ordering provider within 60 minutes of detection.
RULE critical_finding_communication {
WHEN ReportingContext.critical_finding_not_communicated_60m == true
THEN FLAG "critical_finding_communication_overdue_60_minutes_ACR_guideline_violated"
SEVERITY critical
PRIORITY 100
}
The clock starts at detected_at. It stops at communicated_at (clinician → ordering provider). It closes at acknowledged_at (ordering provider confirms receipt). All three timestamps are required for the loop to close.
Critical-finding language scanner
When you sign a report, the deterministic pattern matcher scans the findings + impression text for the canonical ACR critical-finding set:
| Type | Triggers on language like | |---|---| | pneumothorax | "pneumothorax", "collapsed lung", "PTX" | | pulmonary embolism | "pulmonary embolism", "saddle embolus", "filling defect in pulmonary" | | intracranial hemorrhage | "intracranial hemorrhage", "subdural hematoma", "ICH" | | aortic dissection | "aortic dissection", "type A/B dissection", "intimal flap" | | unexpected fracture | "unexpected fracture", "acute fracture cervical/thoracic/lumbar" | | new malignancy | "new malignancy", "biopsy recommended", "BIRADS 4/5" | | free air | "free air", "pneumoperitoneum" | | bowel obstruction | "bowel obstruction", "SBO", "closed loop obstruction" |
The matcher is regex. The radiologist confirms. The system flags for review; it does not auto-escalate. This is the same posture as the legal hygiene scanner.
DICOM accession integrity
RULE accession_number_collision {
WHEN RISContext.accession_number_collision == true
THEN FLAG "accession_number_collision_imaging_filed_against_wrong_patient"
SEVERITY critical
PRIORITY 100
}
create_study rejects duplicate accession numbers within a tenant *before* the study record is written. Two orders generating the same accession number gets caught before images are linked to the wrong patient.
Interchange log
Every HL7 ADT, ORM, ORU; every X12 270/271/837/835; every FHIR Patient/Encounter — logged. The log is the system of record for what came in and went out. Production wires inbound listeners to call log_interchange_message; the UI gives you a manual entry form for testing the round-trip.
| Standard | Common messages | |---|---| | HL7v2 | ADT^A01 (admit), ADT^A03 (discharge), ORM^O01 (order), ORU^R01 (result) | | FHIR R4 | Patient, Encounter, Claim, Coverage, Observation | | X12 | 270/271 (eligibility), 837 (claim), 835 (remittance), 997 (ack) | | EDIFACT | ORDERS, INVOIC, DESADV, REMADV, CONTRL | | RosettaNet | PIP 3A4 (PO), PIP 3B2 (ASN), PIP 3C3 (invoice) |
The validation rules and parser modules from the README — hl7_pid_required, x12_always_send_997, reject_duplicate_message — land on top of this log surface in future slices.
What's wired
| Entity | Purpose | |---|---| | ImagingOrder | The CPOE-equivalent order with modality, body part, priority | | Study | Images-acquired record with unique accession number | | RadiologyReport | Findings + impression, scanner runs on sign | | CriticalFinding | 60-minute communication clock, three-state machine | | InterchangeMessage | Inbound/outbound HL7 / X12 / FHIR / EDIFACT log |
Tools (11): list_imaging_orders, create_imaging_order, create_study, list_studies, sign_radiology_report, create_critical_finding, acknowledge_critical_finding, list_critical_findings, identify_critical_findings, log_interchange_message, list_interchange_messages.
What's coming (future slices)
- DICOM modality worklist emitter — pushes the
ModalityWorklistPacketto the scanner so techs don't type patient names - Dose tracking — CTDIvol / DLP / fluoroscopy time per study, DRL comparison, the 3× alert
- Peer review (RADPEER) — 5% sampling, reviewer independence enforcement, concordance scoring
- Contrast safety blocks — known allergy + premedication consent guard, creatinine check
- HL7/X12 parsers proper —
hl7_pid_required/x12_always_send_997/ dedup rules wired against the log
The operational spine — orders, studies, reports, critical-finding communication, interchange log — ships first. The validation engines and clinical-physics modules build on top.