Skip to observatory content

Partial researchResearch snapshot 2026-09-13. Evidence gaps remain; see Coverage for requirements.

Definitions

Methodology and status language

Metric formulas, eligibility, ballot comparability, event selection, geographic bridges, polling limits, and status definitions. Official imported values are never overwritten by a user scenario.

Coverage dimensions

There is no single regional “percent complete.” Report registry completeness, usable vote histories, seats, actual-event review, current-control evidence, and polling availability separately. Show denominators. Unknown totals stay unknown.

Missing is not zero

Recorded zeroes are preserved. Unknown, not applicable, structurally unavailable, preliminary, disputed, and superseded values are distinct. Null metrics sort separately from zero and do not enter rankings as zero.

Dates

A date without a formal call is not confirmed. Day, month, year, and range precision are retained. March 2028 is never turned into 1 March 2028. Date-only values stay free of timezone shifts. Uncertain overlap with the release window remains conditional.

Events and result versions

Ordinary, special, repeated, and indirect elections are separate. A recount is a result version, not an extra election. An annulled result remains evidence without becoming a valid completed cycle. Replacement events need an explicit relationship to the office history. Three source files or directory snapshots are not three completed cycles.

Shares and ballots

Votes, candidate marks, list votes, blank/invalid ballots, and electors have different denominators. Display the ballot basis and share unit. History party share values may be 0–100 while office shares inputs are 0–1; convert only by field contract.

Competition index

Method ci.weighted-gap.v1. Gaps are top-two gaps in percentage points, latest first:

weighted_gap = 0.6 × latest_gap + 0.3 × previous_gap + 0.1 × oldest_gap
CI = max(0, 100 × (1 − weighted_gap / 20))

Higher values mean closer historical competition under this formula, not a probability of a change in government. score_gate: false prevents a cleared-score claim even when a numeric CI exists. Cleared CI and provisional imported-series CI stay visually distinct.

Grouped Pedersen volatility

Method pedersen.grouped.v1: 0.5 × sum(|group_share_t − group_share_previous|), in percentage points, using stated fixed party groups. It is a lower bound where residual groups conceal internal change. It is not individual voter switching. Do not average whichever intervals happen to exist when the source requires both.

Polling

Vote intention, presidential approval, and other question types stay separate. Approval/disapproval categories are not candidates. Compare waves only when population, measure, and officeholder context support it. Local polls attach only to named offices. National polls are national context. No national-to-local swing model is invented. Where no calibrated local inference exists, local government-change risk is unassessed.

Officeholders and registers

Source current: true means a tracked current office, not proof the last winner still holds it. Rosters may contain elected people, dated directories, and electoral-register observations — classify by record type. A parish register row is not a person. Do not total overlapping elector observations across mayoral, council, and regional contests.

Maps and identifiers

No invented municipal boundaries or coordinates. Tables remain fully functional without geometry. Names are not primary keys. Existing office IDs, history keys, and source IDs remain traceable.

This build

Software delivery for the observatory shell is in progress. Research coverage is not complete. The blocking input is Latin_America_Races_and_Briefings.zip.