Scope freeze — regulated_facility DIRECTORYDEX (EPA FRS national registry)
Frozen 2026-07-03. First Directorydex — a NEW dex family (Mike's coinage,
2026-07-03). Built from a chat-pasted EPA URL
(feedback_integrate_sources_via_chat).
What a Directorydex is (the new family)
The six existing dex families (event, Yeardex, Locationdex, CelestialObject, YearLocationdex, MovingPlatform) all organize a measured phenomenon — the slot is an event, a year, a station you read, a (place, year) cell. A Directorydex is different in kind: it is a reference / crosswalk layer. The slot is a directory ENTRY you resolve against — an entity registered somewhere — not a phenomenon you measure. It exists to power other dexes and papers (resolve a facility to coordinates and to which programs regulate it), not to stand alone as a per-phenomenon series. This is the "reference layer, maybe call it a directorydex" call (Mike, 2026-07-03), chosen over making FRS a giant Locationdex.
What it is
The EPA Facility Registry Service (FRS) national single file: the
administrative registry of every EPA-regulated facility/site. One entry per
facility, keyed by a national REGISTRY_ID, carrying name, address, coordinates
(NAD83, with the facility's own coordinate accuracy, reference-point, collection
method, and source fields), the EPA program systems that touch it (NPDES water
permits, RCRA waste, Safe Drinking Water, TRI, air, Superfund, state programs,
...), and NAICS/SIC industry codes.
- 5,279,715 facilities, 60 states/territories, 100 program systems.
- 4,169,115 (79%) carry coordinates; 1,110,600 do not (kept anyway).
- Top programs by facility count: RCRAINFO (1.58 M), NPDES (1.19 M), SFDW (0.61 M), state systems (NJ-NJEMS, CA-ENVIROVIEW, MN-TEMPO), AIR, ICIS, EIS.
- Largest states: CA (916 k), TX (335 k), NJ (334 k), NY (295 k), MN (249 k).
Source + bright line
- IN: the whole registry. EPA FRS national single-file CSV,
https://www.epa.gov/frs/epa-frs-facilities-state-single-file-csv-download(national zip served from EPA's ownordsext.epa.gov, the advertised download off the page). FRS records facilities that physically exist and the regulatory programs that reference them. That is measured administrative reality on the same footing as the FEMA disaster declarations and the eGRID power-plant registry (feedback_measured_reality_only) — a record of real places, not a model estimate of a physical quantity. Nothing is held out. - The program / NAICS crosswalk is classification, not a model. FRS links each
facility to the program-system IDs and industry codes it already carries; that
is a categorization of real records, not a modeled estimate. We carry the raw
pgm_sys_acrnms,interest_types, and NAICS/SIC codes + descriptions so the crosswalk is transparent.
Slot = facility (data is data)
Per feedback_data_is_data_partial_coverage ("data is data"):
- A facility whose coordinate cells are blank is kept with null lat/lon (1,110,600 of them) — it is still a registered facility; only the location is unknown. It is not dropped.
- Only rows with no
REGISTRY_IDare dropped (a directory needs a key): 0 in this pull. The key is deduplicated keep-first (0 duplicates here) so the directory resolves exactly one entry per key.
Storage + validation
A Directorydex is stored like a YearLocationdex (spine-parquet), NOT like a
Locationdex (per-slot JSON). At 5.3 M facilities, per-slot dossiers would detonate
the storehouse index; the spine leaves the location_storehouse index untouched.
data/directory_storehouse/regulated_facility/:
regulated_facility_spine.parquet— 5,279,715 entries (244 MB), 30 curated columns (identity, place, coordinates + coordinate provenance, program/industry crosswalk), sorted by(state_code, registry_id)so a state reads contiguously.regulated_facility_index.json— totals (n_entries, coord coverage, drop counts), the column list, and by-program / by-state cross-sections.
The build self-validates via dex_validator.validate_directorydex_or_raise — the
new shared validator for this family. Its integrity identity: the index
n_entries equals the spine parquet row count, and the directory key
(registry_id) is non-null and unique (a directory whose keys collide can't
resolve). 5,279,715 = 5,279,715, key unique, 0 errors. pytest logic tests pin the
parse path (normalize_frame, program_counts, build_index) in
tests/test_monitor/test_regulated_facility_directorydex.py.
Provenance
KIND_SOURCES["regulated_facility"] = ["epa_frs_facility_registry"], registered
in KNOWN_SOURCES with the FRS download page as the citable URL.
Deferred
No live edge: EPA refreshes FRS as a periodic bulk file, so a re-pull is a manual re-run. The state single files are an alternative if a per-state refresh is ever wanted. The obvious downstream use is enrichment — join a paper's facilities to FRS coordinates + program membership — which is exactly the reference role the Directorydex family is for.