Inspiration
Regeneron's starter sheet 40 described a problem that sounded almost too mundane to be worth $19 million: a single clinical trial's data lives in a dozen systems that don't talk to each other. The trial database, trial management, drug supply, the safety database, finance. Each one has its own IDs, its own date formats, its own refresh schedule.
The example question in the sheet stuck with us: "Which sites have open safety issues AND low drug supply AND overdue payments?" That should take seconds. Today it takes weeks — someone requests exports from each system owner, matches them by hand in Excel, and comes back with an answer nobody fully trusts, because you can't see where the numbers came from.
In a trial that costs roughly $41,000 per patient, decisions get made late or on instinct because the answer takes too long to arrive. That felt worth fixing.
What it does
One Source of Truth ingests five disagreeing system feeds, works out which records refer to the same real hospital, and answers cross-system questions in under a second — with full provenance on every number.
- Harmonises identities. The same site is
SITE-0701in the EDC,701in the CTMS,S701in drug supply, andMercy General Hospitalin finance. 96% of identifiers resolve automatically; the ambiguous ones stop at a human review queue. - Traces every number. Click any value and see the exact source rows, across systems, that produced it — file name and row number.
- Catches bad data. Duplicates, orphan records, impossible dates, stale feeds.
- Enforces who sees what. Four roles, filtered in the service layer rather than hidden in the UI.
- Catalogues itself. Every dataset has a persistent identifier, column-level profiling, licence, provenance and freshness.
How we built it
Measuring whether it actually works
The hard part of this problem is that you can't tell if you got it right. A harmonisation pipeline that silently merges the wrong two hospitals looks exactly like one that works.
So we built the problem backwards. We take a real clinical trial, fan it out into
five feeds with deliberately broken IDs, and plant a known set of defects —
duplicate site rows, orphan supply records for sites that exist nowhere else,
enrollment dates after study end, facility names mangled into abbreviations, one
feed left stale for nine days. The answer key is written to answer_key.json and
committed to the repo.
The pipeline then scores itself:
| Identifiers harmonised | 70 across 5 systems |
| Auto-matched | 96% |
| Sent to human review | 3 |
| Planted defects caught | 11 / 11 |
That number is the project. Without it, we'd just be claiming a dashboard works.
Identity resolution, with a human where it matters
Built With
- cdisc
- clinicaltrials-gov
- cloud-run
- docker
- duckdb
- fastapi
- gemini
- google-cloud
- javascript
- knowledge-graph
- networkx
- openfda
- pandas
- python
- react
- recharts
- rest-api
- sql
- tailwind
- vite
Log in or sign up for Devpost to join the conversation.