Implement real EIA-860M ingestion in sync-power-plants-monthly.ts
completedThe current scripts/sync-power-plants-monthly.ts is a stub (TODO: Download and parse monthly updates) with a stale filename regex /eia860m(\d{4})\.xlsx/gi that wont match EIAs current pattern <month>_generator<year>.xlsx. Tasks: (1) fix regex to match e.g. march_generator2026.xlsx, (2) download to data/eia-860m/ (baseline already at march_generator2026.xlsx, sha256 93f2b2501cd42ba1290136ec04fd616346d974e0dfd6020cd8ec5e532ef7cec6), (3) parse all 7 sheets (Operating, Planned, Retired, Canceled or Postponed, Operating_PR, Planned_PR, Retired_PR) via xlsx/exceljs, (4) merge generator-level updates into data/power-plants.json using EIA Plant Code + Generator ID as join key, (5) update manifest.json on each run, (6) write data/.eia860m-last-sync marker. Open PR on branch meridian/eia-860m-ingest. Next EIA release is 2026-05-22 (April data) — good first real-world test.
Event Timeline
created
status_change
queued → in_progress
failed
lease expired — re-queued for retry
in_progress → queued
progress
PR #248 opened: full EIA-860M ingestion. Parses all 7 sheets (39,331 rows), merges 845 inserts + 11,537 updates into power-plants.json. Tests + build green. Awaiting CI + Claude Code review.
status_change
queued → in_progress
failed
lease expired — re-queued for retry
in_progress → queued
status_change
queued → in_progress
status_change
in_progress → completed