{
  "name": "Vultax Polymarket 2026 US midterm scorecard: frozen scoring protocol",
  "version": "v1",
  "status": "frozen before the election; changes after publication appear only as dated corrections, never as silent edits",
  "responsible": "Vultax Research, OmniOS OÜ, Tallinn (research@vultax.com)",
  "venue": "Polymarket only, read from its public Gamma and CLOB endpoints without an account. No other venue's prices enter this scorecard.",
  "universe": {
    "manifest": "manifest-v1.json, hash in manifest_sha256; every discovered contract keeps a row, scored or not",
    "inclusion": "every market of every Gamma event tagged `midterms`, open or closed at the freeze, plus events confirmed by hand in manual-review.json",
    "freeze": "the manifest is frozen at the sweep time recorded in frozen_at; nothing is added to or removed from version 1 afterwards",
    "supplement": "markets listed by Polymarket after the freeze and found by the re-sweep inside each checkpoint capture are recorded as a separately versioned supplement (s27 for 27 October, s02 for 2 November). They are scored and reported on their own and never merged into the version-1 figures.",
    "tiers": {
      "A": "race winners and chamber control: senate_winner, house_winner, governor_winner, chamber_control. The headline set.",
      "B": "other contracts settled by the general-election result: margin, seat_count, county_winner, turnout, ballot_measure, other_office, election-only combinations, electorate shares read from exit polls. Scored and reported separately from Tier A.",
      "C": "listed, not scored: contracts already determined before the freeze (primaries, resolved markets), contracts settled by something other than an election outcome (a forecaster's published odds, a resignation, a bill), combinations with a non-election leg, and contracts whose classification could not be settled by hand before the freeze"
    },
    "placeholder_outcomes": "a listed outcome whose label is a lettered stand-in (Candidate A, Party B, Person C) is flagged placeholder_outcome in the manifest. It keeps its row and is scored in the all-contracts tables, but it is left out of the Tier A means and the calibration bins, because a stand-in that never names a person is a near-certain No and would flatter the average."
  },
  "clocks": {
    "primary_checkpoint": "2026-11-02T23:59:59Z",
    "secondary_checkpoint": "2026-10-27T23:59:59Z",
    "election_day": "2026-11-03 (polls close from 23:00 UTC on 3 November to 06:00 UTC on 4 November depending on the state)",
    "checkpoint_rule": "the checkpoint reading of a contract is taken from the latest capture whose finished_at is at or before the checkpoint instant and whose order-book requests answered for at least 99% of manifest tokens (a token the venue holds no order book for is an answered request, recorded as no_orderbook, and counts as covered; it is then a contract without a two-sided quote). If no such capture exists, the capture with the highest answered share before the instant is used and the shortfall is reported. A capture that finishes after the instant is never used for that checkpoint, whatever it shows.",
    "capture_cadence": "hourly from 2026-10-25T00:00Z to 2026-11-04T12:00Z, and every five minutes from 23:00Z to 00:15Z around both checkpoint days; each capture is one gzip NDJSON file with a receipt (sha256, start, finish, coverage)"
  },
  "price": {
    "primary_field": "midpoint of the best bid and best ask of the Yes token's order book in the checkpoint capture: p = (best_bid + best_ask) / 2",
    "two_sided_requirement": "a contract has a checkpoint price only if the Yes book shows at least one bid and one ask. A one-sided or empty book is `no_two_sided_quote`: the row stays in every table, counted as missing, and is not scored.",
    "wide_flag": "if best_ask - best_bid > 0.10 the price is kept and the row is flagged `wide`; the sensitivity table reports Tier A with and without wide rows",
    "secondary_fields": [
      "last_trade_price from the same book record",
      "displayed price: Gamma outcomePrices[0] in the same capture",
      "CLOB midpoint endpoint reading in the same capture, as a cross-check of the book midpoint"
    ],
    "staleness": "staleness is defined by quote presence and width, not by time: no reading is carried forward from an earlier capture, and no later trade or revised end date may choose the forecast timestamp",
    "normalisation": "none in the primary analysis. For multi-outcome (negRisk) events a sensitivity divides each Yes midpoint by the event's sum of Yes midpoints when that sum lies between 0.90 and 1.10."
  },
  "outcomes": {
    "record_1_official": {
      "what": "the externally established election result for the race or question the contract is about",
      "sources": "the state or territorial election authority's published results (unofficial counts, then certified totals); the Associated Press call is recorded as an interim status, never as the official record",
      "statuses": [
        "pending",
        "called",
        "unofficial_complete",
        "certified",
        "recount",
        "runoff_pending",
        "contested"
      ],
      "fields": [
        "race_key",
        "winner_or_value",
        "status",
        "source_url",
        "retrieved_at"
      ]
    },
    "record_2_venue": {
      "what": "Polymarket's own contractual payout for the market",
      "sources": "Gamma market record: outcomePrices of exactly 1 and 0 with umaResolutionStatus resolved, closedTime, umaResolutionStatuses; disputes are kept as recorded",
      "statuses": [
        "open",
        "proposed",
        "disputed",
        "resolved_yes",
        "resolved_no",
        "resolved_split",
        "voided"
      ],
      "fields": [
        "market_id",
        "payout_yes",
        "status",
        "resolved_at",
        "retrieved_at"
      ]
    },
    "scoring_outcome": "the official record decides o (1 or 0) for every contract where it can; the venue record is reported beside it and any disagreement is flagged `records_differ` and listed. Where only the venue record exists (a question no election authority answers, such as a turnout bucket read from the venue's named source), o comes from the venue record and the row is flagged `venue_only`.",
    "voids_and_splits": "voided, cancelled or split (50/50) resolutions are excluded from every mean and counted in the status table",
    "pending": "a contract without an outcome at a scoring run is `pending` and appears in the tables with its checkpoint price; it is excluded from the means of that run. Runs are dated and versioned; a later run fills pending rows and never changes an earlier run's file.",
    "rule_change": "if a market's rules_text in a checkpoint capture differs from the frozen manifest, the row is flagged `rules_changed` and scored on the frozen text's reading with the change listed"
  },
  "score": {
    "primary_metric": "Brier score per contract: (p - o)^2, with p the primary checkpoint price and o the scoring outcome",
    "aggregation": {
      "contract_level": "mean Brier over scored contracts, by tier and in total; Tier A means exclude placeholder outcomes, the all-contracts mean includes them",
      "race_level": "each race_key's contracts are averaged first; the race-level score is the mean over races with equal weight, so a race with many contracts does not count as many independent results",
      "event_level_multi_outcome": "for negRisk events, the multi-class Brier sum over the event's outcomes of (p_i - o_i)^2, reported as a secondary table"
    },
    "calibration": "ten bins of width 0.10 on p; each bin reports contract count, mean p and the share resolved Yes, for Tier A and for all scored contracts",
    "baselines": [
      "constant 0.5 (Brier 0.25) on the same contracts",
      "the secondary checkpoint (27 October) price scored on the same contracts, so the last week's information is measured on matched questions"
    ],
    "no_external_comparison": "no comparison with polls, forecasters or another venue is made in this release; none has a matched, rights-cleared benchmark",
    "uncertainty": "cluster bootstrap over race_key: 2,000 resamples of races with replacement, seed 20261103, 90% interval on every mean; the text says that one election supplies limited independent information",
    "log_loss": "reported as a secondary metric with p clipped to [0.01, 0.99]; the clip is stated beside every log-loss figure",
    "fees_and_execution": "probability scoring only; no fees, order sizes, executable profit or trading strategy are computed or implied",
    "favourites": "for every Tier A race, the contract with the highest primary checkpoint price is its favourite. The favourites table reports, per 10¢ band of the favourite price, how many favourites there were and how many won, plus the Brier mean over favourites. One row per race; placeholders can never be the favourite."
  },
  "runs": {
    "run_1": "4 to 6 November 2026: a first cut labelled by status, using called and unofficial-complete results where they exist; contracts without them are pending",
    "later_runs": "after certifications, recounts and runoffs, each run adds a dated file; the original checkpoint files and manifest are never rewritten",
    "release": "scores, per-contract rows, calibration tables and the bootstrap intervals are published with field definitions, the capture receipts and this file"
  },
  "code": {
    "enumeration": "universe/enumerate.mjs",
    "capture": "capture/capture.mjs",
    "scoring": "scoring/score.mjs",
    "note": "sha256 of each file at the freeze is recorded in rules-hashes-v1.json beside this file"
  },
  "corrections": "a dated corrections list is kept on the public page; a correction states what changed, why, and which figures moved",
  "manifest_note": "manifest-v1.json carries an events array (one record per event with its description) and a rows array (one record per market); the hash covers both"
}
