This article was created with the help of AI. The Claude Code session that runs the launch drafted it, and I edited it.
MT26 (midtermsforecast.com) is a free forecast of all 506 House, Senate and governor races in today's US midterms. Claude Code wrote the model, the data pipeline and the site, and I set the goals and made the calls. This post isn't about the forecast. It's about how the work was organised once the build turned into a launch, and what went wrong.
One job per session
Instead of one long chat, several long-running Claude Code sessions each own one job and message each other:
- Architect: owns the code and every deploy.
- Marketing lead: runs the launch. It can read the code folder but never edits it.
- Scorekeeper: froze the forecast this morning, published its fingerprint, and will grade it against the results.
- Rehearsal director and watchdog: for tonight's live count.
- QA and fact-check: read-only.
Shared files do the remembering: an approvals log with my exact words and the time, a ledger of every post, and a notes folder each session can read. When a session's context fills up, the next one starts from those files, not from memory.
Rules as files, enforced by the tool
The rules are written down, not implied:
- every public post and every deploy needs my typed yes;
- no spam or bought engagement;
- AI use disclosed;
- chances written as "N in 100 simulations";
- race calls credited to AP.
The deploy rule is enforced by Claude Code's permission check, not by trust. When the marketing session relayed a deploy request, the architect session's check refused it, and I had to type the yes there myself. Neither session tried to route around it. A session that hits a refused action reports it instead of asking another session to do it.
Make every claim checkable
- Deploys are frozen snapshots, checked file by file with sha256 against the live site. Rollback takes about two minutes.
- The sessions fact-check each other. The architect checks public claims against the code and data, and narrowed several of the marketing drafts.
- The forecast is locked in public. This morning the forecast file was fingerprinted and archived on the Wayback Machine, and the grading rules are public, all before the first state's polls close at 00:00 Paris (6 p.m. ET). Anyone can check that the archived file is the one being graded:
curl -s https://web.archive.org/web/20261103115224id_/https://midtermsforecast.com/data/forecast.json | gunzip -cf | sha256sum
It should print d6e58ca367cfe015eb107038287957ccdf0a3b902a46ffbe804bc2addbe6bf09, the fingerprint published at midtermsforecast.com/grading.
What the agents got wrong (some of it)
- The election-night model failed its first rehearsal on real 2024 count nights, with wrong projections in Virginia, and was rebuilt from them.
- A string match: Alaska's House race was marked as a 50% runoff race, because "instant-runoff" matched "runoff" before "ranked".
- Mocks lie: a query on the private stats page failed in production (HTTP 422, an aliased ORDER BY) while the mocked tests passed. The marketing session found it by replaying each query against the live API.
- A number that looked fine: the marketing session reported "about 20 to 25 real visitors" for a quiet morning. Then it checked a second signal: every page sends a small time-on-page beacon, and only a real browser running the page sends one. Only 3 of those page loads had sent it. The rest came from a scraper with a phone user agent and no JavaScript. The number was corrected, and a page-opened beacon went live today, so real visits are counted the moment a page opens.
The real scoreboard, from Friday's launch to this morning (US time)
- 1,548 page loads counted as human. 421 sent the time-on-page signal, which only a real browser does.
- Real visits by channel: Reddit about 155, Google about 34, press pitches 13, Bluesky 11.
- 45 press pitches: 1 human reply (a no), 0 coverage.
- Show HN refused the new account's submission ("temporarily restricted").
What I'd keep
- One job per session, with written rules and a shared log of approvals.
- A human yes on anything public, enforced by the tool's permission check rather than by asking nicely.
- Every number checked against a second signal before it's reported.
- Tests against the live API, not only mocks.
Tomorrow the scorekeeper grades the frozen forecast on the 111 races the raters had at Likely or closer, under rules published before the night, and the grade stays up whatever it says.
MT26 is a forecast, not a result. It's built with AI (Claude Code) and not affiliated with any campaign, party or outlet. Voting information: vote.gov or your state election office.
Top comments (0)