data/bills.json + data/bills-es.json | Decoded bill corpus (Congress.gov bills + AI plain-language summaries, English and Spanish) | Nightly sync (scripts/sync-bills.mjs via sync-bills.yml): statuses refresh freely; new bills are decode-before-publish, entering the corpus only once their EN and ES summaries exist. Each record also stores which text version its decode was produced from, and a bill whose text Congress replaces β an amendment in committee changes the document without changing the title or the status β is re-read from the new text on a later nightly, at most 10 a night (REDECODE_MAX_PER_NIGHT, a cost ceiling; the backlog of older records drains a few a night, urgent bills first) |
data/legislators.json | unitedstates/congress-legislators (public domain) + district offices | scripts/process-data.py |
data/zip-districts.json | OpenSourceActivismTech/us_zipcodes_congress | same |
data/vacancies.json | Derived, not fetched: scripts/vacancy_diff.py diffs seat sets against the currently-committed data every run, so a departed member with no successor surfaces as an explicit vacancy (reps page, /api/reps, MCP lookup_representatives) instead of silently disappearing or being backfilled from a stale term record | scripts/process-data.py (same run as legislators.json) |
data/special-elections.json | Each vacant seat's special-election dates exactly as the Federal Election Commission's election-dates API lists them (date + the FEC's election-type code), with the day they were checked. No row means an empty list, never a guessed date; no member-elect is recorded, because no official machine-readable source names one before the oath. Shown on the vacant-seat card on /reps and the seat's own page | scripts/sync-special-elections.mjs, weekly via refresh-legislators.yml right after the vacancy diff (api.data.gov's public DEMO_KEY, no secret; a failed request keeps the last entry and its old checked date) |
data/redistricting-watch.json | Human-authored (status/note) for the 10 states with contested-or-recent 2025β26 mid-decade map changes; rdh_lastmod is a tripwire baseline against the Redistricting Data Hub's own state-page sitemap β see docs/solutions/two-clock-district-boundaries.md | scripts/check-redistricting-watch.mjs, weekly via refresh-legislators.yml; on change it comments on ONE standing, pinned redistricting-watch issue whose body is a rewritten 10-state status board (it used to open one issue per changed state β ten accumulated in six weeks, eight of them from a single RDH site-wide republish), never auto-updates status/note |
data/nominations.json | Civilian Senate nominations (PNs) of the 119th Congress β Congress.gov's own citation, description sentence, and latest action, plus a status derived from that action text by lib/nomination-status.mjs's rule table. No AI touches this file β Oravan does not decode or rewrite a nomination, because Congress.gov's description is already one plain English sentence, so /nominations/[slug] renders the Senate's own record verbatim and says so on the page. The one piece of AI is the call script, labeled where it is generated. A nomination can be a Big Question's vehicle; the card, the page, and the call are live. It stays English on /es like the coverage titles below (see Known v1 caveats). Military promotion lists are excluded (no description, no nameable nominee). No MCP tool exposes nominations yet. | scripts/sync-nominations.mjs (nightly, one free request; gated by scripts/check-nominations.mjs) |
data/coverage.json | Real news articles about top-band bills via TheNewsAPI, AI-relevance-filtered (Haiku) | scripts/sync-coverage.mjs (nightly, gated on NEWS_API_KEY) |
data/media-bias.json | Outlet political-lean ratings by AllSides, used under CC BY-NC with attribution | Vendored snapshot |