# Officeholders — v1.3 (2026-10-14)

`officeholders.csv` — who currently holds every office the site shows: U.S. Senate (2), U.S. House (2), Governor, the four
constitutional officers (Secretary of State, Attorney General, Treasurer, Auditor), all 35 State Senators and all
151 State Representatives plus the two non-voting tribal representatives. 199 rows; 197 currently serving. Members who
left mid-term stay in the table with `status = resigned` or `deceased` and a note naming their successor.

| column | meaning |
|---|---|
| `office`, `level` | U.S. Senate / U.S. House / Governor / Secretary of State / Attorney General / State Treasurer / State Auditor / State Senate / State House; federal or state |
| `district`, `district_id` | District number and an id that joins to the geography and scores tables (`SD-23`, `HD-103`, `US-HOUSE-2`; statewide offices `GOV`, `SOS`, `AG`, `TREAS`, `AUD`) |
| `name`, `party`, `hometown`, `county` | As the official source prints them. Party: D, R, U (Unenrolled), Tribal. Since v1.2 a source's "I" (Independent) is recorded as U — Maine has no Independent party (Matt's ruling, 2026-10-05). Where the roster source prints no hometown (State Senators, statewide officers) see v1.1 below |
| `party_group` | (v1.1) the cross-file party vocabulary shared with governors, SJC, constitutional officers and Legislature members: D, R, U (Unenrolled); OTH for the non-voting tribal representatives |
| `status` | serving / resigned / deceased / vacant |
| `note` | Successor or predecessor, seat class, anything unusual |
| `term_start`, `term_end`, `next_election` | Current term; 132nd Legislature runs 2024-12-04 to 2026-12-02; 119th Congress 2025-01-03 to 2027-01-03 |
| `source`, `source_url`, `last_verified` | Where the row was read from and when |

**Sources (all official):** the Maine House Clerk's member list (`legislature.maine.gov/house/MemberProfiles/List`, which
marks members "Resigned" or "Deceased" the day it happens), the Senate district listing
(`legislature.maine.gov/senate/district-listing/9526`), the U.S. Senate's `senators_cfm.xml`, the Clerk of the U.S.
House's `MemberData.xml`, and the maine.gov pages of the Governor, Secretary of State, Attorney General and Treasurer.
The State Auditor's site does not name the incumbent, so that row was checked against Ballotpedia.

**Counts as of 2026-09-30.** House: 75 D, 73 R, 1 I, 2 U (Democratic plurality; 151 voting seats all filled), plus 2
tribal. Senate: 20 D, 14 R, 1 I — Senator Richard Bennett (SD 18, Oxford) is listed by the Senate as an independent, so
any page that shows the Senate as 20 D / 15 R is out of date. Two House seats changed hands in 2025–26 special
elections: HD 29 (Kathy Javner, deceased → Nancy Theriault, R) and HD 94 (Kristen Cloutier, resigned → Scott Harriman, D).

**How it stays current.** A scheduled task ("Officeholders weekly check") runs every Monday morning: it re-reads the
same official sources, rebuilds the table, and only if anything changed writes the new `officeholders.csv` here, adds a
line to `CHANGELOG.md`, and sends Matt a notification saying exactly what changed (who left, who arrived, any party
switch). If nothing changed it only updates `last_verified`. The task needs Matt's computer to be on with the Claude
desktop app running (the sources block direct cloud access and Dropbox lives on the computer); a week it cannot run is
reported as a missed run, not silently skipped. `build_officeholders.py` and `fetch_roster.js` are the code it uses.

Since 2026-10-02 the same task also checks the **Supreme Judicial Court**: it reads the court's justices page
(courts.maine.gov) and runs `sjc/check_sjc.py` against `sjc/sjc_justices.csv`; a change is confirmed against the
Governor's releases, entered in `sjc/build.py`, rebuilt and republished, and reported in the same notification (see
`sjc/README.md`). Changelog entries from the task go in `changelog/` as one new file each, like every other chat.

**Not in v1:** county commissioners, sheriffs, district attorneys, probate judges, registers, and municipal officials.
The county officers are in the election results (last general election winners) but no official current roster was
pulled; that is a v2 item. (County commissioners were added on 2026-10-22 as a separate file — see v1.4 below; the other county offices are still not here.)

**After the November 3, 2026 election** the table must be rebuilt from scratch when the 133rd Legislature is sworn in
(early December 2026) and the 120th Congress seated (January 2027); the weekly check will catch the changeover but the
term dates in this file are hard-coded for the current terms and need updating then.

## What changed in v1.4 (2026-10-22, launch-readiness P-211)
* New **`county_commissioners.csv`** (not built by `build_officeholders.py`; hand-checked): one row per county commissioner district, 60 in all, keyed `CC-<county code>-<district>` like the election results. Columns: district_id, county, district, name, party (as on the ballot; blank for Somerset, whose ballot is non-partisan, and for an appointee whose party no source states), hometown, basis ("elected <year> …" or "interim appointee …"), elected_name / elected_year / elected_party (the last election winner, from election results v3.17), source, last_verified.
* Built from the last election winner in each district, then checked against each county's own commissioners page and local news for resignations and appointments. Four seats are held by interim appointees: Piscataquis D3 (Adam B. Coover), Somerset D2 (Don Skillings), Washington D3 (Courtney Hammond), Waldo D1 (Breanna Pinkham Bebb).
* Used by `site-design/places/build_places.py` (commissioner-district pages) and `site-design/seo/place_static.py` (county pages).
* **Not yet kept current:** the weekly officeholder check does not read this file. Until it does, re-check it by hand after the November 3, 2026 election (winners take office January 1, 2027) and whenever a county announces a vacancy. Open questions: the Secretary of State's 2026 county-office list may put Sagadahoc D2 and York D4 on the 2026 ballot [Guessing]; Franklin County's site gives Commissioner Carlton's town as Kingfield while the ballot says Freeman Township (the file uses the ballot).

## What changed in v1.3 (2026-10-14, data audit II P-11)
* `build_officeholders.py` gains `EXTRA_NOTE`: facts the official rosters do not print, keyed by district id and name (they drop away when the person leaves the table). Jared Golden (U.S. House 2): "Not seeking re-election in 2026 (announced November 2025); State Auditor Matt Dunlap is the Democratic nominee for the seat" (Roll Call, 6/19/2026). Rep. W. Edward Crockett (HD 112): left the Democratic Party about September 2025 (Maine Public, 9/25/2025). Kathy Javner (HD 29, deceased): died 1/10/2026 (WGME, 1/12/2026; Wikipedia). The Auditor's note now says Dunlap is the Democratic nominee for U.S. House District 2 (was "a candidate").
* Rebuilt from `snapshots/legislature_roster_2026-10-12.json`; only those four notes change (checked: the unchanged builder reproduced the previous file byte for byte from the same snapshot).
* Left as is: Susan Collins's `hometown` Caribou (her birthplace and the builder's value) while `congress/us_senators.csv` gives her residence as Bangor; no official source here settles which the column should hold. HD 43 "St. George" is as the House roster prints it (the Law Library writes "Saint George").

## What changed in v1.2 (2026-10-05, Matt's decisions)
* **Unenrolled, never Independent:** U.S. Sen. Angus King, State Sen. Richard Bennett (SD 18) and Rep. William Pluecker (HD 44) were I; now `party` U and `party_group` U (Pluecker's note now reads "Unenrolled", like the other unenrolled House members). The Senate listing and senate.gov still print "I"; `build_officeholders.py` maps it to U. Current counts: House 75 D, 73 R, 3 U (+2 tribal); Senate 20 D, 14 R, 1 U.
* **Tribal representatives name their tribe:** the note column now reads "Non-voting tribal representative (Passamaquoddy Tribe)" for Aaron Dana and "(Houlton Band of Maliseet Indians)" for Brian Reynolds, from the Law Library's 132nd-Legislature records (`legislature/members.csv` `positions`).
* Confirmed: Nancy Theriault (HD 29) is a Republican, as in `legislature/members.csv`.
* Checked: rebuilding with `build_officeholders.py` from `snapshots/legislature_roster_2026-09-30.json` reproduces the new file byte for byte.

## What changed in v1.1 (2026-10-05)
* **Hometowns filled** (audit 2026-10-04 H10): the 35 State Senators from the Law and Legislative Reference Library's Legislators database record for the 132nd Legislature (`legislature/members.csv` residence — the Senate district listing prints only party and county, and the Senate district pages give only the State House address); the Secretary of State (Manchester), Attorney General (Bangor), Treasurer (Bangor) and Auditor (Old Town) from the Law Library's officer lists (`legislature/constitutional_officers.csv`). **County** for the Governor and those four officers is the county of that hometown (`geography/town_attributes.csv`); Senators keep the county the Senate prints. 44 values; nothing guessed.
* `party_group` column added after `party`.
* `fix_v1_1_hometowns.py` made the change; `build_officeholders.py` now carries the same values (`FILL`, keyed by district id and name, so a new member gets a blank until checked) and writes `party_group`, so the weekly rebuild keeps them — checked: rebuilding from `snapshots/legislature_roster_2026-09-30.json` reproduces the new file byte for byte.
