Skip to content

The standard, published first

Oath & Record

Two yardsticks, and both of them belong to the official: the constitutional oath they swore, and the specific commitments they made on the record while in office. Same standard for everyone, of every party.

No official has been rated yet

This page is the method, published before the first verdict exists. That order is deliberate. A yardstick released in advance cannot have been bent around a result, and you can hold us to it later. When ratings begin, the absence of one will never mean an official has a clean record โ€” only that we have not done the work.

What we measure

The oath

The constitutional duties of the office the official swore to uphold. Not our reading of what a good official does โ€” the duties in the oath they raised their hand and took.

Their word

Specific, documented commitments the official stated on the record, while in office, about how they would conduct that office. Their sentence, their receipt.

What we refuse to measure

These are not omissions. Each one is a thing the code will not let us do, on purpose.

  • No ideology, no spectrum, no placement.

    The moment you place someone on a left-right line, you have published an opinion about where the middle is. There is no neutral version of that.

    How this is enforced: assert_no_ideology() rejects any payload carrying a placement field.

  • Party affiliation is not an input.

    A standard that can see party is a standard that can be applied unevenly without anyone noticing, including us.

    How this is enforced: No party field exists anywhere in oath_core.py. A verdict cannot read what was never passed in.

  • Sitting officials only. Never candidates.

    Rating challengers is where accountability stops being education and becomes electioneering โ€” legally and honestly.

    How this is enforced: _require_ratable() raises CandidateContextError on a non-sitting official.

  • Official conduct only. Never the campaign trail.

    What someone promises to get a job and what they do in the job are different subjects. Only the second one is a record.

    How this is enforced: _require_ratable() raises on any campaign-context material.

  • No overall grade. No single number.

    A letter grade is an editorial wearing a number's clothes. A tally of kept, broken, mixed, and unrated โ€” each with its receipts โ€” is a record you can argue with line by line.

    How this is enforced: assert_no_single_score() rejects grade, score, overall, letter, and rank fields.

How a verdict is earned

Four verdicts exist: KEPT, BROKEN, MIXED, UNRATED. Most of the rules below exist to make the fourth one easy to reach.

  • Receipts, or it stays UNRATED.

    A kept, broken, or mixed verdict requires documented or historically supported evidence with citations. Everything weaker stays unrated โ€” and unrated is published as unrated, not quietly dropped.

    How this is enforced: Finding.validate() refuses a non-UNRATED verdict without a strong evidence tier and record references.

  • A verdict you cannot explain is a verdict you have not earned.

    Every finding carries a written rationale. Not a label โ€” a sentence a reader can disagree with.

    How this is enforced: Finding.validate() rejects a rationale under eight words.

  • Two sets of eyes. Neither can act alone.

    The person who writes a rating can never be the person who approves it, and nothing publishes anonymously. Both names travel with the record.

    How this is enforced: OathConsole.publish() raises if approved_by is empty or equals drafted_by.

  • Nothing publishes or changes within 60 days of that official's election.

    Timing is most of what separates voter education from campaign intervention โ€” in the IRS's analysis and in plain fairness. A rating that lands three weeks before a vote is a campaign ad no matter how carefully it was written.

    How this is enforced: _require_outside_election_window(), ELECTION_FREEZE_DAYS = 60.

  • Supersede, never delete.

    When we get something wrong we publish the correction and keep the original readable. An archive that quietly edits itself is not a record of anything.

    How this is enforced: publish() marks the prior record superseded; history() still returns it.

Where this sits

Outpost is non-partisan civic infrastructure operated by an Illinois nonprofit. It does not endorse, oppose, fund, or campaign for any party or candidate. Oath & Record exists to report what officials did against what they themselves said they would do โ€” which is the one comparison that requires no opinion from us at all.

The machine-readable version of this standard is served at /api/oath/standard. It is generated from the same constants the rating code enforces, so it cannot describe a rule the system does not actually apply.