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
Five scheduled days
Each run sees only the files that had arrived by its date.
| day | what happens | files loaded | rows held | gate | freshness | measures rebuilt |
|---|---|---|---|---|---|---|
| 2026-02-16 | First weekly extract: a year of history from all five suppliers. | 6 | 90 | ✓all published | ✓all on time | yes |
| 2026-02-23 | Second extract: late registrations released, appointment statuses updated, late 2025 lab results and claims restate the closed year. | 6 | 15 (released 35) | ✓all published | ✓all on time | yes |
| 2026-03-02 | Third 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 stopped | 5 | ✕held: appointments | ⚠appointments stuck; pharmacy due | yes |
| 2026-03-03 | The clinic file is re-delivered and published; the pharmacy file is now late. | 1 | 0 | ✓all published | ⚠pharmacy late | yes |
| 2026-03-03 | The same day again: nothing new, nothing changes. | 0 | 0 | –nothing new | ⚠pharmacy late | no (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
Table
| rule | what it checks | planted | caught |
|---|---|---|---|
| RX-012 | Late claims for a closed measurement year are announced | 40 | 40 |
| LAB-003 | Medical record numbers keep their leading zeros | 30 | 30 |
| ROS-011 | Phone numbers that cannot be standardised are blanked | 30 | 30 |
| LAB-013 | Late rows for a closed measurement year are announced | 26 | 26 |
| APT-009 | Patient is on the roster | 15 | 15 |
| ROS-007 | Clinic codes are upper case | 15 | 15 |
| SCR-010 | Patient is on the roster | 15 | 15 |
| RX-010 | Patient is on the roster | 12 | 12 |
| ROS-008 | Attributed clinic exists | 9 | 9 |
| ROS-010 | One row per record number | 8 | 8 |
| SCR-012 | Platform totals agree with the item responses | 8 | 8 |
| APT-006 | Status code is mapped | 6 | 6 |
| SCR-007 | Item responses are whole numbers within the instrument's range | 6 | 6 |
| APT-011 | Visit type is mapped | 5 | 5 |
| LAB-008 | Result is a number or a censored number | 5 | 5 |
| LAB-011 | Patient is on the roster | 5 | 5 |
| RX-006 | Days supply is a whole number from 1 to 365 | 5 | 5 |
| duplicates | Exact duplicates inside a file are merged, counted once | 5 | 5 |
| LAB-010 | Result is clinically plausible | 4 | 4 |
| SCR-009 | Administration mode is recognised | 4 | 4 |
| APT-007 | Clinic exists | 3 | 3 |
| RX-008 | Drug is in a tracked class | 3 | 3 |
| APT-008 | Completed or missed appointments are not in the future | 2 | 2 |
| LAB-009 | Unit is valid for the analyte | 2 | 2 |
| ROS-005 | Birth date is a real date | 2 | 2 |
| SCR-006 | Screening date is not after the extract | 2 | 2 |
| SCR-011 | One version of each screening per file | 2 | 2 |
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
Table
| measure | numerator | denominator | rate |
|---|---|---|---|
| Adherence: diabetes medications | 204 | 323 | 63.2% |
| Adherence: RAS antagonists | 434 | 690 | 62.9% |
| Adherence: statins | 349 | 553 | 63.1% |
| Follow-up after a positive depression screen | 285 | 407 | 70.0% |
| Depression screening | 2,612 | 3,520 | 74.2% |
| Diabetes: HbA1c below 8.0% | 141 | 307 | 45.9% |
| Diabetes: HbA1c above 9.0% or not tested | 114 | 307 | 37.1% |
| Diabetes: HbA1c tested | 273 | 307 | 88.9% |
| Social needs screening | 1,316 | 3,289 | 40.0% |
Restated by late data (day 2)
Late lab results and late-adjudicated claims for 2025 arrived after the year was reported.
| measure | day 1 | day 2 |
|---|---|---|
| Diabetes: HbA1c tested | 272 / 307 (88.6%) | 273 / 307 (88.9%) |
| Adherence: diabetes medications | 203 / 322 (63.0%) | 204 / 323 (63.2%) |
| Adherence: statins | 346 / 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.
| group | eligible | rate | relative rate |
|---|---|---|---|
| language group: English | 2,391 | 78.4% | 1.199 |
| language group: Other | – | –suppressed (complementary) | |
| language group: Spanish | 706 | 65.9% | 0.863 |
| language group: Unknown | – | –suppressed (small cell) | |
| payer type: commercial | 1,166 | 73.8% | 0.993 |
| payer type: government | 1,692 | 73.6% | 0.985 |
| payer type: marketplace | 345 | 75.4% | 1.017 |
| payer type: self_pay | 317 | 77.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
| feed | source | delivery | pipeline | newest published | detail |
|---|---|---|---|---|---|
| appointments | clinic_scheduling | ✓on time | ✕stuck | 2026-02-20 | appointments_main_20260302.csv blocked by APT-001 |
| appointments | mobile_unit | ✓on time | ✕stuck | 2026-02-20 | appointments_mobile_20260302.csv waiting at merged |
| labs | reference_lab | ✓on time | ✓ok | 2026-02-27 | |
| pharmacy | pharmacy_claims | ⚠due | ✓ok | 2026-02-22 | expected today (2026-03-02), not yet arrived |
| roster | ehr_roster | ✓on time | ✓ok | 2026-03-02 | |
| screenings | screening_platform | ✓on time | ✓ok | 2026-02-27 |
2026-03-03
| feed | source | delivery | pipeline | newest published | detail |
|---|---|---|---|---|---|
| appointments | clinic_scheduling | ✓on time | ✓ok | 2026-02-27 | |
| appointments | mobile_unit | ✓on time | ✓ok | 2026-02-27 | |
| labs | reference_lab | ✓on time | ✓ok | 2026-02-27 | |
| pharmacy | pharmacy_claims | ✕late | ✓ok | 2026-02-22 | expected by 2026-03-02, 1 day(s) late |
| roster | ehr_roster | ✓on time | ✓ok | 2026-03-02 | |
| screenings | screening_platform | ✓on time | ✓ok | 2026-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
| check | result | detail |
|---|---|---|
| no real record number anywhere | ✓pass | searched 301,620 strings |
| no real full name anywhere | ✓pass | searched 301,620 strings |
| no real e-mail anywhere | ✓pass | searched 301,620 strings |
| no real phone anywhere | ✓pass | searched 301,620 strings |
| no real street address anywhere | ✓pass | searched 301,620 strings |
| every demo patient differs from the real one | ✓pass | 4,997 patients compared |
| dates moved by one consistent, non-zero shift | ✓pass | birth dates checked against shifts |
| policy transforms every registered identifier path | ✓pass | 17 paths covered |
| patients point at clinics, worklists at patients | ✓pass | all references resolve |
| extract carries only allowed columns | ✓pass | ok |
| no age above 89 and no birth year for 90+ | ✓pass | ok |
| restricted ZIP3 prefixes replaced by 000 | ✓pass | ok |
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.