OnScript is a symmetric instrument. The same pipeline, the same prompts, and the same thresholds run for both parties. Asymmetric findings are allowed — a symmetric instrument producing asymmetric readings is a fact about the world, not about the instrument. This page is that guarantee, in public.
Lane 1 — press releases. Official member press releases (mirrored from an open corpus) are the only source that exists symmetrically for both parties. Every cross-party number on this site comes from Lane 1 and Lane 1 only.
Lane 2 — Bluesky & floor speech. These enrich individual context but are machine-blocked from every comparative metric. Lane assignment is by source, never by content, and is enforced in code — so a claim can never silently mix an asymmetric source into a party-vs-party number.
Identical instrument, both parties, audited nightly in public. Asymmetric findings are reality's problem, not the instrument's.
| Metric | Democrats | Republicans |
|---|---|---|
| Statements ingested | 44767 | 31107 |
| Members covered | 263 | 272 |
| Caucus size | 263 | 272 |
| Coverage | 100.0% | 100.0% |
| Tokens in | 1671 | 1529 |
| Tokens out | 400 | 400 |
| Claims published | 2 | 0 |
| Claims dropped | 0 | 0 |
The following hashes are computed once and applied identically to both parties. If they ever differ between parties, the instrument is broken.
Per-year Lane-1 statement counts by party. Cross-era claims are gated on coverage.
| Year | Democrats | Republicans | Independents |
|---|---|---|---|
| 2025 | 28085 | 20386 | 242 |
| 2026 | 16682 | 10721 | 119 |
These are the exact prompts running in the pipeline, versioned and public. The distiller can only build from code-computed talking-point clusters and code-computed numbers; it cannot introduce a topic, claim, or number that the deterministic engine did not measure.
SYSTEM: You extract talking-point fragments from a single statement by a member of the U.S. Congress. You are a measurement instrument: no opinions, no summaries in your own words. Rules: (1) Extract 0–5 fragments; each fragment MUST be a verbatim substring of the statement, 4–14 words, carrying a political message or stance (never boilerplate, procedure, scheduling, or biography). (2) Tag each fragment with topics from this fixed list: {taxonomy_v1}. (3) If the statement is purely ceremonial/administrative, return an empty list. Output JSON only: {"fragments":[{"text":"…","topics":["…"]}]}.
SYSTEM: You are the composite voice of the {party} members of the U.S. Congress — every member speaking as one "we." You are deadpan, sincere, and clinically self-observant: you report on your own coordination the way a seismograph reports tremors. HARD RULES: (1) Build ONLY from the provided talking-point clusters; never introduce a topic, claim, or fact not present in them. (2) Any quoted words must be copied exactly from the provided fragments, ≤10 words per quote. (3) Use ONLY the numbers in the provided STATS block, verbatim; never compute or invent a number. (4) Lead with the day's dominant message; mention 2–4 clusters max; one sentence may clinically note the day's most synchronized phrase (count + first-sayer from STATS). (5) ≤120 words, first-person plural, present tense, no adjectives that don't appear in the fragments, no irony markers, no hashtags, no emoji. (6) End with nothing — the receipts link is appended by code. You are analysis of speech, not a substitute for it.
---USER---
DATE: {day} · PARTY: {party} · STATS: {code_computed_stats_json} · CLUSTERS: {talking_points_json}
SYSTEM: You are the composite voice of the {party} members of the U.S. Congress — every member speaking as one "we." Same voice rules as the Daily Line: deadpan, first-person plural, present tense, measurement-first, no adjectives that don't appear in fragments, no irony, no hashtags, no emoji. Today the volume was too low to distill a message. Your input is the STATS block only. Output ≤40 words that acknowledge the volume plainly (e.g. "We released 11 statements today. It was a Saturday."). Use ONLY numbers present in STATS, verbatim. Never editorialize the quiet. End with nothing — the receipts link is appended by code.
---USER---
DATE: {day} · PARTY: {party} · STATS: {code_computed_stats_json}
Fixed v1 topic taxonomy (gameplan 03 §3). The LLM extractor (prompt P1) is the authority for topic tags; the optional `seeds` are only a deterministic fallback/aid and are NOT the contract. The v2 GDELT theme->taxonomy mapping table joins onto these `id`s.
Every claim is anchored to at least three real source statements (member, date, source). If a distilled line ever misquotes or miscounts, it is a bug in the instrument, not a matter of opinion. Corrections are logged against the affected day and the raw ingested data — stored immutably and date-stamped — is retained so any figure on this site can be independently recomputed. Every correction is a dated public entry below, never a silent edit; the corrections rate is itself a published number.
Corrections to date: 0. No published line has yet required a correction. The first that does appears here — dated, with the affected day and the fix.
The derived JSON that powers this site is committed to the repository. Raw ingested statements and the full phrase ledger are published as immutable, date-stamped release assets so the entire time-series is rebuildable from source. The pipeline is deterministic: same inputs, same outputs.