← All work
Energy & Power Markets · Prototype

U.S. Data Center Registry

Entity Resolution Across Three Public Sources

Four thousand records, three sources, one registry — measured against a frozen benchmark.

Status
Complete, runs locally
Timeframe
August 2026
Role
Sole author — resolver, benchmark design, evaluation
Built with
Node.js · Entity resolution · Compute Atlas · PeeringDB · OpenStreetMap
4.3×
coverage vs. best single source
97.7%
F1 on a hand-labelled benchmark
698
duplicate records collapsed

The question

No single public source knows where America's data centers are. The best one lists 780 facilities. Others hold thousands more under different names, at differently formatted addresses, with overlapping and contradictory coverage. Fusing them is the only route to a usable picture — and fusing them badly is worse than not fusing them at all.

What I built

A resolver that fuses Compute Atlas, PeeringDB and OpenStreetMap into one registry with per-record provenance and per-field lineage: 4,017 source records resolved to 3,319 distinct facilities, collapsing 698 duplicates — 4.3 times the coverage of the best single source. It exports directly into GridScale.

A frozen, stratified, hand-labelled benchmark of 90 candidate pairs, each adjudicated against the raw source records with the reasoning written down, scoring the current resolver at 100% precision and 95.5% recall.

The hard part — A benchmark that moves when the thing under test moves measures nothing

The first version numbered its pairs sequentially and regenerated them on every run. The first resolver change silently re-pointed all ninety labels at different pairs. The benchmark was still reporting confident numbers; they meant nothing. It is now keyed by pair identity, written once, and only redrawn deliberately.

The fixed benchmark immediately caught two bugs that manual inspection had missed. Suite numbers were breaking address matching — "8851 Park Central Dr. Suite 100" and "8851 Park Central Drive" read as different buildings, an estimated 1,170 missed matches from that alone. And a "merge anything within 50 metres" rule violated the resolver's own first principle; it now fires only when one side has no operator.

The sample is stratified, with vetoes drawn at roughly 1-in-1,170 against accepts at 1-in-27, so every rate is weighted back to its population. That makes precision tight and recall an order of magnitude — one veto labelled differently moves the recall estimate by about 55 points. The evaluator prints that caveat alongside the number, because a 95.5% quoted without it would be misleading.

What this does not tell you

  • Recall is an order-of-magnitude estimate, not a point estimate — by construction.
  • Coverage is bounded by what the three sources publish; none is complete.