v2.0

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

Watch the launch videoWatch

Care Team Assignment System

Automated system for assigning optimal healthcare providers to patients based on medical conditions, age, care complexity, and personal needs.

Solution

This intelligent care coordination system transforms the patient-provider matching process by creating personalized care teams based on comprehensive assessment of patient needs. The system evaluates each patient's medical conditions, age demographics, mobility limitations, and care complexity to determine the optimal mix of healthcare providers.

For patients with multiple chronic conditions like diabetes or heart disease, the system automatically incorporates appropriate specialists. When mental health needs are identified, psychiatric professionals are seamlessly included. The system accounts for patient mobility scores, requiring physical therapy integration when necessary, while also considering language preferences to eliminate communication barriers.

Advanced complexity scoring ensures high-needs patients receive additional support through care coordinators, creating right-sized teams that balance comprehensive care with efficiency. This systematic approach eliminates manual provider selection, reduces care gaps, and ensures every patient receives appropriate specialized attention.

How it works

The decision graph processes patient information through these key steps:

  1. Complexity Assessment: Evaluates the patient's care complexity level (high, medium, low) and determines appropriate team size
  2. Age Categorization: Classifies patients as pediatric, adult, or senior to match with age-appropriate providers
  3. Needs Evaluation: Identifies specific requirements including specialist care for chronic conditions, mental health support, nutrition guidance, and mobility assistance
  4. Provider Assignment: Matches qualified healthcare professionals based on the patient's conditions, applying appropriate priority levels to each role
  5. Coordination Determination: For complex cases with multiple providers, adds a care coordinator or case manager to ensure integrated care delivery

Where teams use it

  • Hospital discharge planning and transition management
  • Primary care practices managing complex chronic conditions
  • Integrated health systems with diverse specialist networks
  • Home health agencies assigning appropriate care resources
  • Telehealth networks matching remote providers to patient needs
  • Long-term care facilities optimizing staffing assignments

Inside the decision model

Care Team Assignment System ships as a JDM decision graph with 6 nodes, 4 decision tables and 22 rules. Download it, load it into GoRules, and run it as-is on Zen Engine.

Decision graph6 nodes · read-only
input requesttable determine_complexitytable age_categoryexpression evaluate_patient_needstable assign_providerstable assign_coordinator
01

Request

input

Three request blocks come in: a patient record with careComplexity, mobilityScore, a conditions list, and care preferences, a facility descriptor, and an availableProviders roster whose roles, specialties, and languages describe who could staff the team.

Sample requestJSON
{
  "patient": {
    "id": "PT12345",
    "name": "John Smith",
    "age": 67,
    "gender": "male",
    "careComplexity": "high",
    "mobilityScore": 35,
    "conditions": [
      "diabetes",
      "heart_disease",
      "hypertension",
      "depression"
    ],
    "primaryLanguage": "english",
    "insuranceType": "medicare",
    "carePreferences": {
      "preferredGender": "any",
      "preferredLanguage": "english",
      "requiresTranslator": false
    }
  },
  "facility": {
    "id": "FAC789",
    "name": "Memorial Medical Center",
    "department": "Internal Medicine"
  },
  "availableProviders": [
    {
      "id": "DR001",
      "name": "Dr. Sarah Johnson",
      "role": "primary_physician",
      "specialties": [
        "internal_medicine",
        "geriatrics"
      ],
      "languages": [
        "english",
        "spanish"
      ]
    },
    {
      "id": "DR002",
      "name": "Dr. Michael Chen",
      "role": "cardiologist",
      "specialties": [
        "cardiology"
      ],
      "languages": [
        "english",
        "mandarin"
      ]
    },
    {
      "id": "DR003",
      "name": "Dr. Lisa Peterson",
      "role": "diabetes_specialist",
      "specialties": [
        "endocrinology"
      ],
      "languages": [
        "english"
      ]
    },
    {
      "id": "NP001",
      "name": "Nancy Williams",
      "role": "nurse_practitioner",
      "specialties": [
        "primary_care"
      ],
      "languages": [
        "english"
      ]
    },
    {
      "id": "RN001",
      "name": "Robert Garcia",
      "role": "nurse",
      "specialties": [
        "geriatric_care"
      ],
      "languages": [
        "english",
        "spanish"
      ]
    },
    {
      "id": "MH001",
      "name": "Dr. Emily Cohen",
      "role": "mental_health_provider",
      "specialties": [
        "psychiatry",
        "geriatric_psychiatry"
      ],
      "languages": [
        "english"
      ]
    },
    {
      "id": "PT001",
      "name": "James Wilson",
      "role": "physical_therapist",
      "specialties": [
        "geriatric_physical_therapy"
      ],
      "languages": [
        "english"
      ]
    },
    {
      "id": "CC001",
      "name": "Maria Rodriguez",
      "role": "care_coordinator",
      "specialties": [
        "complex_care_coordination"
      ],
      "languages": [
        "english",
        "spanish"
      ]
    }
  ]
}
02

Determine Complexity

table

Care intensity maps one-to-one here: patient.careComplexity values of "high", "medium", and "low" set careTeam.complexityLevel and a teamSize of "3", "2", or "1", and a blank fallback row repeats the low result so a missing complexity value never blocks assignment.

Tiering team size to a three-level complexity flag mirrors how care-management programs size caseloads, with high-complexity patients justifying a multi-provider team while stable ones keep a single clinician. Defaulting the unknown case to the smallest team is a conservative operational choice that avoids over-committing scarce staff before an assessment confirms need.

Decision tablefirst hit policy
Care Complexitypatient.careComplexityComplexity LevelcareTeam.complexityLevelTeam SizecareTeam.teamSize
"high""high""3"
"medium""medium""2"
"low""low""1"
-"low""1"
03

Age Category

table

Age brackets stay minimal: patient.age under 18 maps to "pediatric", under 65 to "adult", and the blank fallback row labels everyone else "senior". Because rows resolve first-match, the middle row effectively covers 18 through 64 without stating both bounds.

The 18 and 65 boundaries are the customary edges of pediatric and geriatric medicine, with 65 also aligning to Medicare eligibility in the US, and the categories translate directly into staffing since the provider table keys on ageCategory to add a geriatric specialist or a pediatrician. Publishing the bracket as its own field keeps that downstream rule readable.

Decision tablefirst hit policy
Patient agepatient.ageAge categoryageCategory
< 18"pediatric"
< 65"adult"
-"senior"
04

Evaluate Patient Needs

expression

Need flags get precomputed before matching: requiresSpecialist scans patient.conditions for 'diabetes', 'heart_disease', or 'kidney_disease', requiresMentalHealthSupport for 'depression', 'anxiety', or 'ptsd', requiresNutritionSupport for 'obesity', 'diabetes', or 'malnutrition', and mobilityIssues fires when patient.mobilityScore < 50. The same node then nulls patient, availableProviders, and facility, slimming the payload down to the derived flags and the careTeam object.

Expressions7 fields
requiresSpecialistsome(patient.conditions, # in ['diabetes', 'heart_disease', 'kidney_disease'])
requiresMentalHealthSupportsome(patient.conditions, # in ['depression', 'anxiety', 'ptsd'])
requiresNutritionSupportsome(patient.conditions, # in ['obesity', 'diabetes', 'malnutrition'])
mobilityIssuespatient.mobilityScore < 50
patientnull
availableProvidersnull
facilitynull
05

Assign Providers

table

Collect turns this table into a roster builder: every matching row appends a role, priority, and specialtyFocus entry into careTeam.providers. Complexity picks the backbone, pairing a "primary_physician" with a "nurse_practitioner" at "high" priority for high-complexity patients versus a physician-and-nurse pair at "medium" for lower tiers, while ageCategory == "senior" or "pediatric" adds a "geriatric_specialist" or "pediatrician". Condition rows contribute a "diabetes_specialist", "cardiologist", or "nephrologist" at high priority with a matching specialtyFocus, and the derived flags pull in a "mental_health_provider", "nutritionist", or "physical_therapist".

Team composition tracks the patient-centered medical home model, where a primary clinician and nursing support form the core and specialists attach per condition. Escalating diabetes, cardiac, and renal disease to named specialist roles reflects chronic-disease co-management norms, and staffing physical therapy off a mobility score below 50 or behavioral health off a depression diagnosis mirrors how integrated-care programs plan for functional and mental health needs, not just diagnoses. The priority labels exist for downstream schedulers, not as clinical rankings from any regulation.

Decision tablecollect hit policy
Complexity LevelcareTeam.complexityLevelPatient ConditionProvider RolerolePriorityprioritySpecialty FocusspecialtyFocus
"high"-"primary_physician""high"-
"medium", "low"-"primary_physician""medium"-
-ageCategory == "senior""geriatric_specialist""medium"-
-ageCategory == "pediatric""pediatrician""medium"-
-"diabetes" in patient.conditions"diabetes_specialist""high""diabetes"
-"heart_disease" in patient.conditions"cardiologist""high""heart_disease"

+6 more rows in the downloadable template

06

Assign Coordinator

table

Oversight is assigned last: "high" complexity with len(careTeam.providers) > 5 earns a dedicated "care_coordinator" at high priority, any remaining high or medium case gets a "case_manager", and low-complexity teams record "none". First hit ordering means the coordinator row is tested before the broader case-manager row can claim a complex patient.

Adding a coordinator only when the roster exceeds five providers is realistic: fragmentation and handoff risk grow with team size, and absorbing that overhead is what coordination roles in programs like Medicare chronic care management exist to do. Splitting coordinator from case manager by caseload intensity is a sensible operational distinction rather than a regulatory requirement.

Decision tablefirst hit policy
Complexity LevelcareTeam.complexityLevelTeam Size$Coordinator RolecareTeam.coordinator.roleCoordinator PrioritycareTeam.coordinator.priority
"high"len(careTeam.providers) > 5"care_coordinator""high"
"high", "medium"-"case_manager""medium"
--"none""low"

Make this template
your own.

Load Care Team Assignment System into GoRules, adjust the rules to your policy, and ship it behind your own API.