The first edges in the repo. Every US county now links to the districts it
sits in, weighted by area overlap, and every legislator links to the district
they represent — county → district → representative, traversable.
Data (PostGIS, no Atlas dependency — computed directly from geometry):
- data/county_district_edges.jsonl — 16,328 weighted edges. area_weight =
ST_Area(ST_Intersection(county, district))/ST_Area(county) over ST_MakeValid
Census TIGER 2024 geometries, overlaps <0.5% dropped. Uses area-intersection,
NOT centroid-in-polygon, so urban districts that carve through counties
(e.g. GA CD-5 / Atlanta across Clayton+DeKalb+Fulton) are captured, not
silently dropped. Per-county weights sum to ~1.0 per district type.
build.py:
- ~6,896 new district nodes: 435 CD (ACS demographics where available; sparse
for the 8 states missing from acs_cd) + 4,927 state-house + 1,897 state-senate
(geometry-only). GEOID/number-keyed, stable.
- county index.md gains a `districts:` block (frontmatter) + a ## Districts
section (body links, so link-integrity checks them).
- legislators + US House members gain `represents:` pointing at their district
node; edge stored once on the person, inverse left to the view.
- schemas/jurisdiction: classification enum + chamber/districts fields.
Honest gaps (logged, not hidden): ID + NH have no state-house geometry, so
their house districts get nodes (represents resolves) but no county edges;
CD nodes for acs_cd-missing states are demographically sparse.
Deterministic (byte-identical rebuild); validate.py passes 26,617 records,
link-integrity clean (every district/represents link resolves).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Pull Atlas's place→county crosswalk (Census TIGER 2024 places × county
geometries, 32,041 places) into the build as a committed raw input, and
use it to resolve municipal officeholders whose county was unknown.
- data/place_county_crosswalk.jsonl — new raw input (place_geoid → county_geoid)
- build.py — place-name+state → county_geoid → ACS county slug as a fallback
in county_slug(); city_slug() generalized to non-FL bare place labels
- data/sources/sources.yaml — provenance entry for the crosswalk
_unresolved municipals: 1919 → 58. The remainder are genuine: CT planning
regions (post-county), county-level rows mislabeled municipal upstream,
consolidated city-counties (null label), Wikidata-QID placeholder names,
and ambiguous same-name places — left unresolved rather than guessed.
Join key is county_geoid (5-digit FIPS); the directory slug is taken from
the ACS county node so municipals nest under the exact existing county dir.
Deterministic (byte-identical rebuild); validate.py passes 19,721 records.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The README described intent; the repo is now real. Rewrote it to reflect
what actually exists — 17,506 validated files across four entity types,
the deterministic pipeline, the commands — and added the /docs tree:
government-as-code.md the philosophy: git primitives -> government
data-model.md entity types, IDs, file format, the tree, determinism
sources.md where every fact comes from, and how current
roadmap.md done / next / later, honest about what isn't built
contributing.md the disciplines, and how to add a source
Plus data/sources/sources.yaml — the machine-readable source registry.
Every count, path, and source claim is grounded in the current tree, not
the aspirational brief. Internal links verified; validation still clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>