v2.0

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

Watch the launch videoWatch

Clinical Trial Eligibility Screener

Automated patient screening system that evaluates medical criteria to determine clinical trial eligibility based on multiple health factors.

Solution

This eligibility screening system streamlines the clinical trial recruitment process by automating patient qualification assessment. It evaluates candidates against six key medical criteria: diagnosis type, disease stage, current medications, age, treatment history, and comorbidities. The system flags patients with qualifying diagnoses (breast, lung, or colorectal cancer) while excluding those with advanced stage IV disease.

The screening tool identifies medication conflicts that could compromise trial outcomes, particularly immunosuppressants, anticancer agents, and corticosteroids. Age verification ensures patients fall within the 18-75 year trial parameters. Treatment history analysis prevents enrollment of heavily pre-treated patients, limiting prior treatments to two or fewer. The system also screens for disqualifying comorbidities including autoimmune disorders, heart failure, and uncontrolled diabetes, providing detailed justification for each eligibility determination.

How it works

The eligibility assessment follows this process:

  1. Input Collection: Captures comprehensive patient data including diagnosis, disease stage, current medications, age, prior treatments, and comorbidities.
  2. Diagnosis Verification: Validates if the patient's condition matches targeted cancer types (breast, lung, colorectal).
  3. Stage Evaluation: Confirms disease progression is within acceptable parameters (stages I-III).
  4. Medication Screening: Identifies contraindicated medications that would exclude participation.
  5. Age Validation: Verifies patient age falls within protocol-defined range.
  6. Treatment History: Ensures limited prior therapy exposure (≤2 treatments).
  7. Comorbidity Assessment: Screens for exclusionary concurrent medical conditions.
  8. Eligibility Determination: Aggregates all criteria results to produce a final eligibility decision with detailed reasoning.

Where teams use it

  • Clinical research organizations
  • Pharmaceutical trial management
  • Hospital research departments
  • Oncology centers
  • Medical research institutions
  • Patient recruitment services

Inside the decision model

Clinical Trial Eligibility Screener ships as a JDM decision graph with 8 nodes, 6 decision tables and 14 rules. Download it, load it into GoRules, and run it as-is on Zen Engine.

Decision graph8 nodes · read-only
input patienttable diagnosisEligibilitytable diseaseStageEligibilitytable medicationEligibilitytable ageEligibilitytable priorTreatmentEligibilitytable comorbidityEligibilityexpression eligibilitySummary
01

Patient

input

One patient object carries all six screened attributes, diagnosis, diseaseStage, currentMedications, age, priorTreatments, and comorbidities, and the graph fans it out to six criterion checks that run in parallel before the summary merges their flags.

Sample requestJSON
{
  "patient": {
    "id": "P67890",
    "name": "John Smith",
    "age": 68,
    "diagnosis": "lung_cancer",
    "diseaseStage": "IV",
    "currentMedications": [
      "immunosuppressants",
      "albuterol",
      "omeprazole"
    ],
    "priorTreatments": 3,
    "comorbidities": [
      "autoimmune_disease",
      "COPD"
    ],
    "lastLabResults": {
      "wbc": 3.8,
      "hgb": 10.9,
      "plt": 150,
      "creatinine": 1.2
    }
  }
}
02

Diagnosis Eligibility

table

Qualifying cancers are enumerated directly: a patient.diagnosis of 'breast_cancer', 'lung_cancer', or 'colorectal_cancer' sets eligibility.diagnosis.flag true, and anything else falls to the false row with 'Diagnosis does not match trial criteria'. Enumerating target indications is exactly how oncology protocols define their study population, so this list is the first thing a protocol amendment would touch.

Decision tablefirst hit policy
Diagnosispatient.diagnosisDiagnosisFlageligibility.diagnosis.flagDiagnosisReasoneligibility.diagnosis.reason
'breast_cancer', 'lung_cancer', 'colorectal_cancer'true'Diagnosis matches trial criteria'
-false'Diagnosis does not match trial criteria'
03

Disease Stage Eligibility

table

Stages 'I', 'II', and 'III' pass with 'Disease stage matches trial criteria', 'IV' is rejected by its own row with 'Stage IV patients excluded from trial', and the blank fallback fails safe with 'Unknown or invalid disease stage'. Giving stage IV a dedicated row means the reason string names the actual exclusion instead of a generic mismatch.

Excluding metastatic disease from a stage I to III protocol reflects standard trial design, since stage IV patients differ in prognosis and treatment intent and are typically studied under separate protocols. Failing closed on an unknown stage is sound screening practice as well: eligibility must be demonstrated rather than assumed, which is how research coordinators treat incomplete records.

Decision tablefirst hit policy
Stagepatient.diseaseStageStageFlageligibility.stage.flagStageReasoneligibility.stage.reason
'I', 'II', 'III'true'Disease stage matches trial criteria'
'IV'false'Stage IV patients excluded from trial'
-false'Unknown or invalid disease stage'
04

Medication Eligibility

table

A some($, # in ['immunosuppressants', 'anticancer_agents', 'corticosteroids']) check over patient.currentMedications ?? [] fails the criterion with 'Patient taking excluded medications'; otherwise the empty row passes with 'No conflicting medications'. These three classes are classic prohibited-medication entries because immunosuppression and concurrent anticancer therapy would confound both the safety and efficacy readouts the trial exists to measure.

Decision tablefirst hit policy
Medicationspatient.currentMedications ?? []MedicationFlageligibility.medication.flagMedicationReasoneligibility.medication.reason
some($, # in ['immunosuppressants', 'anticancer_agents', 'corticosteroids'])false'Patient taking excluded medications'
-true'No conflicting medications'
05

Age Eligibility

table

The )18..75( condition matches values outside the interval, so any patient.age beyond 18 to 75 fails with 'Age outside eligible range (18-75)' while everyone else passes. An adult 18-to-75 window is typical protocol design, anchored by consent age at the bottom and rising competing health risks at the top, though the specific ceiling is a sponsor choice rather than a regulation.

Decision tablefirst hit policy
PatientAgepatient.ageAgeFlageligibility.age.flagAgeReasoneligibility.age.reason
)18..75(false'Age outside eligible range (18-75)'
-true'Age within eligible range'
06

Prior Treatment Eligibility

table

More than 2 patient.priorTreatments fails the check as 'Too many prior treatments', a count of 2 or fewer passes as an 'Acceptable number of prior treatments', and a missing value passes through its own row with 'No prior treatments recorded'. Splitting the pass into two rows keeps the reason strings honest about whether a history was actually reviewed.

Capping prior lines of therapy is standard oncology-trial design: heavily pre-treated patients respond differently and carry accumulated toxicity, which muddies attribution of the study drug's effect. A limit of two or fewer prior treatments is a common shape for this criterion, but the exact number is protocol-specific rather than mandated by any regulator.

Decision tablefirst hit policy
PriorTreatmentspatient.priorTreatmentsTreatmentFlageligibility.priorTreatment.flagTreatmentReasoneligibility.priorTreatment.reason
> 2false'Too many prior treatments'
<= 2true'Acceptable number of prior treatments'
-true'No prior treatments recorded'
07

Comorbidity Eligibility

table

Exclusionary conditions are matched with some($, # in ['autoimmune_disease', 'heart_failure', 'uncontrolled_diabetes']) over patient.comorbidities ?? [], failing with 'Excluded comorbidity present' or passing as 'No exclusionary comorbidities'. All three are realistic oncology exclusions: autoimmune disease interacts badly with immunotherapy, and uncontrolled cardiac or metabolic disease raises the odds that adverse events obscure the drug's own safety signal.

Decision tablefirst hit policy
Comorbiditiespatient.comorbidities ?? []ComorbidityFlageligibility.comorbidity.flagComorbidityReasoneligibility.comorbidity.reason
some($, # in ['autoimmune_disease', 'heart_failure', 'uncontrolled_diabetes'])false'Excluded comorbidity present'
-true'No exclusionary comorbidities'
08

Eligibility Summary

expression

Aggregation is strict conjunction: isEligible takes all(values(eligibility), #.flag), so one failed criterion disqualifies the patient. failedCriteria filters keys(eligibility) for flags equal to false, eligibilityReasons preserves every reason for the audit trail, and decisionSummary renders 'Patient is eligible for clinical trial' or its negative, the line recruitment staff read first.

Expressions4 fields
isEligibleall(values(eligibility), #.flag)
eligibilityReasonsfilter(values(eligibility), #.reason != null)
decisionSummary$.isEligible ? 'Patient is eligible for clinical trial' : 'Patient is not eligible for clinical trial'
failedCriteriafilter(keys(eligibility), eligibility[#].flag == false)

Make this template
your own.

Load Clinical Trial Eligibility Screener into GoRules, adjust the rules to your policy, and ship it behind your own API.