FEC generation and local MCP audit — September 21, 2026
The gap register consolidates remaining source, evidence, integration and deployment work, including the separate real R2 setup evidence. The coverage census reconciles all source families and bulk groups against this selected generation.
The selected FEC tables now pass the shared generation, download and MCP path
with their exact table identities intact. This continues the
Senate recovery; it adds no source records or
financial interpretation. The previous code and recovery notes were pushed to
mikewolfd/spicy-regs:main at 5c6ca0d before this continuation.
Downloaded data works directly with MCP
The CLI writes downloaded tables under download-runs/<id> and switches a
current link after the whole selected batch succeeds. Local MCP previously
looked only for loose Parquet files in the configured root, so the normal CLI
output directory exposed none of those tables. Pointing MCP at the batch itself
loaded rows but lost their generation pins.
The shared local selector now lets MCP accept the download root, current, or
an exact batch. It checks selection metadata, hashes managed files against the
captured publication index, and checks declared schemas. Discovery, descriptions
and query responses identify the selected directory and each managed table's
generation. Extra root files and unselected family siblings do not enter the
batch. Existing loose-file mode remains available and explicitly unversioned.
A connection holds resolved batch paths. Switching current affects a later
connection, while the existing one continues to use its selected batch. Ordinary
file replacement, removal or mutation is refused around tool statements. These
checks preserve ordinary local workflows; they do not make writable files an
immutable storage service. The reader needs no SpicyDocs installation.
Verified data path
The existing generation API admitted all four previously audited Parquet files,
read every data page and checked schemas, member digests and row counts. The
three observation tables form fec-observations; the inventory forms
fec-source-catalog. Every table remains byte-identical to the Senate delivery.
The actual publisher API then wrote both families into a local test object store and verified its stored bytes before each pointer switch. A loopback HTTP server exposed those objects to the actual CLI downloader. The downloader captured one publication index, verified all four files and selected the complete batch. This exercises the local path, not a live R2 bucket or external deployment.
The running MCP stdio process read the ordinary download root and verified:
| Output | Verified rows |
|---|---|
fec_source_records |
13,717,161 |
fec_collections |
649 |
fec_relationships |
183,390 |
fec_source_catalog |
26 |
All four generation pins survive discovery and queries. Every collection joins its source family; every relationship observation joins its exact source record. Nine previously raw-audited witnesses match every output cell after the roundtrip, including native headers, a narrative body, nonbreaking spaces and the malformed Senate file's first, blank and final physical lines.
From SpicyRegs, the retained downloaded batch is directly usable:
SPICY_REGS_DATA_DIR=/Users/mikewolfd/Work/corpora/supply-2026-09-02/receipts/fec-generation-readiness-2026-09-21/roundtrip-integrated/download \
uv run --frozen spicy-regs-mcp
Evidence is retained outside the repository:
- Generation identities, schemas and unchanged-byte checks
- Local publication and HTTPS download receipt
- Actual MCP calls, pins, counts and witness checks
- Source selections and coverage limits
The final audit includes the parallel fork-host and cache corrections merged
from 4d588d5. It uses the configured HTTPS data-host selection, then exercises
the downloaded batch through MCP. The integrated repository suite passed
2,085 tests, with three live integration tests deselected. A subsequent
explicit missing-pin guard passed 116 focused reader tests, type checking,
lint and formatting. The 71-table dictionary check and generated-file comparison
also passed. These are local checks; they do not report remote CI status.
Next source gap: retained committee history
A parallel read-only assessment qualified the retained PostgreSQL custom archive
as a practical next metadata source: 262,276 rows, 73 fields and 76,277 committee
IDs, with cycles 1976–2022. Its 2026 archive date is not the date of the data.
The source README shows 66 columns; the dump's actual schema has seven more.
PostgreSQL's installed pg_restore emitted schema and selected COPY text without
executing SQL or connecting to a database. The entire COPY payload matched the
earlier retained export byte-for-byte.
The remaining provider work is a bounded COPY-text reader with original-dump, table, row and decoded-stream evidence. It must preserve SQL null markers, empty strings and escaped values rather than present a local export as a publisher-downloaded original. Some arrays carry later information on earlier cycle rows, so the current-API relationship mapper cannot be applied unchanged. The assessment and manual witnesses record this next step. Those history rows are not yet in the delivered tables.
Complete FEC history, a complete Senate inventory and external data publication remain separate work. This continuation made no external data upload or service deployment.