CATCH

Methodology & limitations

CATCH applies explicit, deterministic rules. Every flag traces back to the readings and records that triggered it, with no prediction and no opaque scoring.

Engine 0.1.0 · built 2026-07-22 · reference 2026-05-15 · 348,120 records · 238,629 adults · systolic ≥ 140 mmHg

What data was analyzed

The full SyntheticRI / Synthea bundle: patient demographics and geography, blood-pressure and lab observations (systolic, diastolic, BMI, LDL, A1c), hypertension and comorbidity diagnoses, antihypertensive medications with start dates, and encounters. Claims and imaging files were not needed and were skipped.

What the rules do

Undiagnosed care gap. An adult (alive, age ≥ 18) with at least 2 systolic readings ≥ 140 mmHg on distinct adult-age days, and no hypertension diagnosis on file.

Treated but uncontrolled. A hypertension diagnosis plus non-ambiguous antihypertensive medication plus at least 2 elevated readings after treatment began (so a single high during titration does not qualify).

Priority. Urgent / high / routine, derived from severity (≥ 180), reading count, and stacked comorbidities (obesity, high LDL, hyperlipidemia, prediabetes, metabolic syndrome). Every priority shows its contributing factors.

How the engine decides

Every record walks the same fixed decision tree. The first branch that matches ends the walk, so each outcome is reachable by exactly one path and can be replayed by hand. The two shaded leaves are the only flagged categories.

  1. Adult and alive? (age ≥ 18)

    NoNot reviewed
    Yescontinue to next check
  2. 2+ systolic ≥ 140 mmHg on distinct days?

    NoNot flagged
    Yescontinue to next check
  3. Hypertension diagnosis on file?

    NoFlagUndiagnosed care gap
    Yescontinue to next check
  4. On a non-ambiguous antihypertensive?

    NoDiagnosed, no medication evidence
    Yescontinue to next check
  5. 2+ elevated readings after treatment began?

    NoManaged (controlled or titrating)
    YesFlagTreated but uncontrolled

Priority (flagged records only)

  • urgentsevere reading (≥ 180 mmHg), or repeated highs with 2+ stacked risks
  • high3+ elevated readings, or 1+ stacked risk
  • routinerepeated highs without additional stacked risks

What the rules do not do

CATCH does not diagnose or predict. It flags records that match an explicit review rule for a human to check, and every flag can be dismissed by a clinician in seconds. Pediatric readings are excluded. Loop diuretics (furosemide) and ARNI (sacubitril/valsartan) are treated as ambiguous heart-failure agents and are not counted as antihypertensive treatment.

Validation

Sixteen engine unit fixtures cover the edge cases (minors, same-day duplicates, diagnosis timing, titration lag, missing values). On the 1,000-patient sample the engine reproduces the exploratory pattern and matches the 45-59 and 60+ age-band miss rates exactly. Restricting to adult-age readings gives about half of repeated-high adults undiagnosed (~49% in the sample), slightly more conservative than an earlier count that included pre-adult readings.

Known limitations & honesty

  • SyntheticRI is synthetic. The numbers show the method works, not a real Rhode Island rate.
  • The disparity we can defend is age (younger adults missed most). We did not test protected-group disparities and make no such claim.
  • A diagnosed-but-untreated stage was essentially empty in the data, so we dropped it.
  • Some synthetic records carry artifacts (very high visit counts, implausible ages). These are flagged with a data-quality note and demoted in the queue.
  • Outreach messages are drafts only. CATCH never sends anything.