Population-health pipeline

Five supplier feeds, a validated warehouse, nine quality measures, longitudinal patient documents and a de-identified copy - run on a synthetic network of 5,000 patients over five scheduled days, and graded against an answer key. This page is built from that run. Repository · run evidence · design decisions

Rows delivered
51,485
18 files from 6 supplier sources
Planted defects caught
269 / 269
by the rule each was planted for
Measure cells matching
117 / 117
dbt vs an independent implementation
dbt nodes passing
54 / 54
models, seed and tests, last build
Leak-gate checks
12 / 12
before the demo copy is released

Five scheduled days

Each run sees only the files that had arrived by its date.

daywhat happensfiles loadedrows heldgatefreshnessmeasures rebuilt
2026-02-16First weekly extract: a year of history from all five suppliers.690all publishedall on timeyes
2026-02-23Second extract: late registrations released, appointment statuses updated, late 2025 lab results and claims restate the closed year.615 (released 35)all publishedall on timeyes
2026-03-02Third extract: the laboratory's new layout (IFCC units) is recognised; the clinic appointments file arrives truncated and is stopped; the pharmacy file is due.4 + 1 stopped5held: appointmentsappointments stuck; pharmacy dueyes
2026-03-03The clinic file is re-delivered and published; the pharmacy file is now late.10all publishedpharmacy lateyes
2026-03-03The same day again: nothing new, nothing changes.00nothing newpharmacy lateno (nothing changed)

What the rules caught

Every planted defect, by the rule it was planted for, held, repaired or flagged by that rule - and, graded separately, nothing else touched.

Planted defects caught, by rule

02040RX-01240LAB-00330ROS-01130LAB-01326APT-00915ROS-00715SCR-01015RX-01012ROS-0089ROS-0108SCR-0128APT-0066SCR-0076APT-0115LAB-0085LAB-0115RX-0065duplicates5LAB-0104SCR-0094APT-0073RX-0083APT-0082LAB-0092ROS-0052SCR-0062SCR-0112
Table
rulewhat it checksplantedcaught
RX-012Late claims for a closed measurement year are announced4040
LAB-003Medical record numbers keep their leading zeros3030
ROS-011Phone numbers that cannot be standardised are blanked3030
LAB-013Late rows for a closed measurement year are announced2626
APT-009Patient is on the roster1515
ROS-007Clinic codes are upper case1515
SCR-010Patient is on the roster1515
RX-010Patient is on the roster1212
ROS-008Attributed clinic exists99
ROS-010One row per record number88
SCR-012Platform totals agree with the item responses88
APT-006Status code is mapped66
SCR-007Item responses are whole numbers within the instrument's range66
APT-011Visit type is mapped55
LAB-008Result is a number or a censored number55
LAB-011Patient is on the roster55
RX-006Days supply is a whole number from 1 to 36555
duplicatesExact duplicates inside a file are merged, counted once55
LAB-010Result is clinically plausible44
SCR-009Administration mode is recognised44
APT-007Clinic exists33
RX-008Drug is in a tracked class33
APT-008Completed or missed appointments are not in the future22
LAB-009Unit is valid for the analyte22
ROS-005Birth date is a real date22
SCR-006Screening date is not after the extract22
SCR-011One version of each screening per file22

Measures, 2025

Network rates from the dbt marts. Each is also computed by an independent Python implementation from the generator's own data; the two agree at every clinic, and adherence agrees patient by patient.

Network rate by measure

0.0%25.0%50.0%75.0%100.0%Adherence: diabetes medications63.2%Adherence: RAS antagonists62.9%Adherence: statins63.1%Follow-up after a positive depression screen70.0%Depression screening74.2%Diabetes: HbA1c below 8.0%45.9%Diabetes: HbA1c above 9.0% or not tested37.1% (lower is better)Diabetes: HbA1c tested88.9%Social needs screening40.0%
Table
measurenumeratordenominatorrate
Adherence: diabetes medications20432363.2%
Adherence: RAS antagonists43469062.9%
Adherence: statins34955363.1%
Follow-up after a positive depression screen28540770.0%
Depression screening2,6123,52074.2%
Diabetes: HbA1c below 8.0%14130745.9%
Diabetes: HbA1c above 9.0% or not tested11430737.1%
Diabetes: HbA1c tested27330788.9%
Social needs screening1,3163,28940.0%

Restated by late data (day 2)

Late lab results and late-adjudicated claims for 2025 arrived after the year was reported.

measureday 1day 2
Diabetes: HbA1c tested272 / 307 (88.6%)273 / 307 (88.9%)
Adherence: diabetes medications203 / 322 (63.0%)204 / 323 (63.2%)
Adherence: statins346 / 553 (62.6%)349 / 553 (63.1%)

Depression screening, by language and payer

Relative rate compares a group with everyone else in its stratifier. Small cells are hidden, with a complementary cell where needed.

groupeligibleraterelative rate
language group: English2,39178.4%1.199
language group: Other–suppressed (complementary)
language group: Spanish70665.9%0.863
language group: Unknown–suppressed (small cell)
payer type: commercial1,16673.8%0.993
payer type: government1,69273.6%0.985
payer type: marketplace34575.4%1.017
payer type: self_pay31777.3%1.046

Freshness

Per supplier source: did the delivery arrive on time, and did what arrived reach published? Day 3 and day 4.

2026-03-02

feedsourcedeliverypipelinenewest publisheddetail
appointmentsclinic_schedulingon timestuck2026-02-20appointments_main_20260302.csv blocked by APT-001
appointmentsmobile_uniton timestuck2026-02-20appointments_mobile_20260302.csv waiting at merged
labsreference_labon timeok2026-02-27
pharmacypharmacy_claimsdueok2026-02-22expected today (2026-03-02), not yet arrived
rosterehr_rosteron timeok2026-03-02
screeningsscreening_platformon timeok2026-02-27

2026-03-03

feedsourcedeliverypipelinenewest publisheddetail
appointmentsclinic_schedulingon timeok2026-02-27
appointmentsmobile_uniton timeok2026-02-27
labsreference_labon timeok2026-02-27
pharmacypharmacy_claimslateok2026-02-22expected by 2026-03-02, 1 day(s) late
rosterehr_rosteron timeok2026-03-02
screeningsscreening_platformon timeok2026-02-27

De-identification

The same patient in the restricted documents and in the released demo copy (both synthetic). Every date moved by one shift; clinical values unchanged.

Restricted

{
 "_id": "01301982",
 "demographics": {
  "firstName": "Katherine",
  "lastName": "Allen",
  "birthDate": "1959-09-25",
  "phone": "5555665004",
  "email": "katherine.allen23@example.org"
 },
 "address": {
  "city": "Easton",
  "line1": "70 Sunset Ln",
  "zip": "70303"
 },
 "careTeam": [
  {
   "name": "Aisha Ramirez",
   "role": "primary_care"
  },
  {
   "name": "Ana Flores",
   "role": "care_manager"
  }
 ],
 "latestPHQ9": {
  "band": "minimal",
  "complete": true,
  "date": "2025-01-21",
  "positive": false,
  "score": 1
 }
}

Released demo copy

{
 "_id": "D9395744",
 "demographics": {
  "firstName": "Kai",
  "lastName": "Stonebridge",
  "birthDate": "1959-09-19",
  "phone": "5559506210",
  "email": "kai.stonebridge71@example.org"
 },
 "address": {
  "city": "Easton",
  "line1": "1791 Foundry Walk",
  "zip": "70316"
 },
 "careTeam": [
  {
   "name": "Marlow Birchmore",
   "role": "primary_care"
  },
  {
   "name": "Arden Jessamine",
   "role": "care_manager"
  }
 ],
 "latestPHQ9": {
  "band": "minimal",
  "complete": true,
  "date": "2025-01-15",
  "positive": false,
  "score": 1
 }
}

Leak gate

checkresultdetail
no real record number anywherepasssearched 301,620 strings
no real full name anywherepasssearched 301,620 strings
no real e-mail anywherepasssearched 301,620 strings
no real phone anywherepasssearched 301,620 strings
no real street address anywherepasssearched 301,620 strings
every demo patient differs from the real onepass4,997 patients compared
dates moved by one consistent, non-zero shiftpassbirth dates checked against shifts
policy transforms every registered identifier pathpass17 paths covered
patients point at clinics, worklists at patientspassall references resolve
extract carries only allowed columnspassok
no age above 89 and no birth year for 90+passok
restricted ZIP3 prefixes replaced by 000passok

Synthetic data only. Built by python -m pophealth demo --docs docs. LOINC content (codes only) is copyright Regenstrief Institute, Inc., used under the LOINC licence.