v2.0

GoRules Version 2 is here - redesigned, now with managed cloud.GoRules Version 2 is here!

Watch the launch videoWatch

Patient Triage System

Rules-based medical triage system that prioritizes patients in emergency departments based on vital signs, symptoms, and chief complaints.

Solution

This triage system quickly identifies the appropriate care priority for patients in emergency departments. Using medical best practices, it evaluates vital signs including temperature, heart rate, respiratory rate, blood pressure, and oxygen saturation. The system analyzes reported symptoms, assigning higher scores for severe conditions like chest pain or difficulty breathing, while giving lower scores to mild symptoms like coughs or minor injuries.

Chief complaints are categorized by severity, with life-threatening conditions like stroke or cardiac arrest receiving immediate attention. The system calculates a comprehensive priority score by combining vital signs, symptoms, and complaint assessments. Each patient is then assigned a specific priority level from 1 (Immediate) to 5 (Non-Urgent), with recommended maximum wait times ranging from immediate treatment to 120 minutes based on medical urgency.

How it works

The decision graph evaluates patients through four distinct assessment phases:

  1. Vital Signs Assessment: Analyzes key physiological indicators including temperature, heart rate, respiratory rate, blood pressure, and oxygen saturation, assigning scores and flags based on deviation from normal ranges.

  2. Symptom Evaluation: Reviews reported symptoms, categorizing them into severity levels from severe (red flag) to minor (green flag) with corresponding scores.

  3. Chief Complaint Analysis: Assesses the patient's primary complaint, with life-threatening conditions receiving highest priority scores.

  4. Priority Calculation: Combines all assessment scores and flags to determine final priority level (1-5), establishing maximum wait times and identifying the highest risk factors.

Where teams use it

  • Hospital emergency departments
  • Urgent care centers
  • Disaster response triage
  • Military field hospitals
  • Telehealth initial assessment
  • Mass casualty incident management

Inside the decision model

Patient Triage System ships as a JDM decision graph with 5 nodes, 4 decision tables and 21 rules. Download it, load it into GoRules, and run it as-is on Zen Engine.

Decision graph5 nodes · read-only
input requesttable vital_signs_assessmenttable symptom_assessmenttable chief_complaint_assessmenttable calculate_priority_level
01

Request

input

Every downstream table reads from three top-level request fields: a vitals object carrying the five measured signs, a symptoms array of reported complaints, and a chiefComplaint string naming the presenting problem.

Sample requestJSON
{
  "vitals": {
    "temperature": 38.7,
    "heartRate": 115,
    "respiratoryRate": 24,
    "systolicBP": 165,
    "oxygenSaturation": 94
  },
  "symptoms": [
    "moderate pain",
    "fever",
    "dizziness"
  ],
  "chiefComplaint": "fracture"
}
02

Vital Signs Assessment

table

Five vital-sign columns are checked worst-first under a first hit policy. The red row requires a temperature above 39.5 together with heart rate outside 40 to 160, respiratory rate outside 8 to 30, systolic pressure outside 80 to 200, and oxygen saturation below 90, writing 30 to scores.vitalScore and 'red' to flags.vitalFlag. The orange and yellow rows repeat the pattern with tighter bands, fever above 38.5 or 38.0 and saturation below 93 or 95, scoring 20 and 10, and the empty catch-all row scores 0 with a 'green' flag.

The bands track standard adult reference ranges: saturation under 90 percent signals hypoxemia needing prompt attention, 95 percent sits at the lower edge of normal, and the fever gradations separate high-grade from low-grade pyrexia. The red-to-green flag ladder mirrors the color coding of five-level triage scales such as the Manchester Triage System, so later steps can combine the flag and the score without re-reading raw vitals.

Decision tablefirst hit policy
Temperature (°C)vitals.temperatureHeart Rate (bpm)vitals.heartRateRespiratory Rate (bpm)vitals.respiratoryRateSystolic BP (mmHg)vitals.systolicBPO2 Saturation (%)vitals.oxygenSaturationScorescores.vitalScoreFlagflags.vitalFlag
> 39.5)40..160()8..30()80..200(< 9030'red'
> 38.5)50..150()10..25()90..180(< 9320'orange'
> 38.0)55..140()12..22()100..170(< 9510'yellow'
-----0'green'
03

Symptom Assessment

table

Reported complaints are matched with some(symptoms, # in [...]) expressions rather than a single field, so one hit anywhere in the list is enough to fire a row. Severe findings such as chest pain, difficulty breathing, unconscious, and active bleeding score 30 with a 'red' flag, the moderate list (vomiting, dehydration, fever, head injury) scores 20 with 'orange', minor items like rash and cough score 10 with 'yellow', and the first hit policy guarantees the most severe matching tier wins before the empty fallback row scores 0 as 'green'.

Grouping symptoms into red, orange, and yellow tiers reflects how nurse triage protocols separate immediately life-threatening presentations, chiefly airway, breathing, and circulation problems, from complaints that can safely wait. The 30/20/10 weights are a business calibration chosen so that a single severe symptom outweighs any combination of minor ones in the final sum.

Decision tablefirst hit policy
ExpressionScorescores.symptomScoreFlagflags.symptomFlag
some(symptoms, # in ["severe pain", "chest pain", "difficulty breathing", "unconscious", "unresponsive", "active bleeding"])30'red'
some(symptoms, # in ["moderate pain", "vomiting", "dehydration", "fever", "dizziness", "head injury"])20'orange'
some(symptoms, # in ["mild pain", "nausea", "minor injury", "rash", "cough"])10'yellow'
-0'green'
04

Chief Complaint Assessment

table

A single chiefComplaint field drives this table, each row listing its accepted matches. Life-threatening presentations (stroke, heart attack, cardiac arrest, trauma, anaphylaxis, overdose, seizure) score 40, the highest single score in the graph, with a 'red' flag. Urgent but stable complaints such as fracture, deep cut, burn, and pregnancy complication score 20 with 'orange', routine ones like sprain, cold, flu, and medication refill score 10 with 'yellow', and an unrecognized complaint falls through to 0 with 'green'.

Weighting this tier at 40 instead of 30 means a stated stroke or cardiac arrest alone can push the total into Level 2 territory even with unremarkable vitals, which matches emergency practice: outcomes for stroke and cardiac events are strongly time-dependent, so triage errs toward over-prioritizing the stated complaint before vitals confirm it. The middle and lower lists are sensible operational groupings rather than a regulated taxonomy.

Decision tablefirst hit policy
Chief ComplaintchiefComplaintScorescores.complaintScoreFlagflags.complaintFlag
"stroke", "heart attack", "cardiac arrest", "trauma", "anaphylaxis", "overdose", "seizure"40'red'
"fracture", "deep cut", "burn", "allergic reaction", "infection", "pregnancy complication"20'orange'
"sprain", "minor cut", "cold", "flu", "ear pain", "medication refill"10'yellow'
-0'green'
05

Calculate Priority Level

table

Both inputs here are derived: values(flags) collects the three color flags and the second column sums scores.vitalScore + scores.symptomScore + scores.complaintScore. Under the first hit policy, a 'red' flag with a total of at least 60 yields 'Level 1 - Immediate' and a 0-minute wait, red or orange with at least 40 yields 'Level 2 - Very Urgent' at 10 minutes, totals of 20 or more map to 'Level 3 - Urgent' at 30 minutes, 10 or more to 'Level 4 - Standard' at 60 minutes, and the final empty row assigns 'Level 5 - Non-Urgent' with a 120-minute maximum wait.

A five-level output with explicit maximum wait times follows the structure of established ED acuity scales such as the Emergency Severity Index and the Manchester Triage System, which likewise run from immediate to non-urgent. Requiring both a red flag and a score of 60 for Level 1 stops one noisy input from consuming resuscitation resources, while the paired flag-plus-threshold rows (contains($, 'red') alongside the score cut) let either strong signal escalate a borderline patient one level.

Decision tablefirst hit policy
All flagsvalues(flags)Total Scorescores.vitalScore + scores.symptomScore + scores.complaintScorePriority LevelpriorityLevelMax Wait Time (minutes)maxWaitTimeMinutesHighest FlaghighestFlag
contains($, 'red')>= 60'Level 1 - Immediate'0'red'
contains($, 'red')>= 40'Level 2 - Very Urgent'10'red'
contains($, 'orange')>= 40'Level 2 - Very Urgent'10'orange'
->= 40'Level 2 - Very Urgent'10'orange'
contains($, 'orange')>= 20'Level 3 - Urgent'30'orange'
->= 20'Level 3 - Urgent'30'yellow'

+3 more rows in the downloadable template

Make this template
your own.

Load Patient Triage System into GoRules, adjust the rules to your policy, and ship it behind your own API.