Skip to content

Add elections profile for elections and results - #3

Merged
lukefretwell merged 1 commit into
mainfrom
elections-profile
Sep 7, 2026
Merged

lukefretwell merged 1 commit into
mainfrom
elections-profile

Conversation

@lukefretwell

Copy link
Copy Markdown
Member

schema.org has no Election, Candidate, Ballot or constituency of any kind - the concepts do not exist in the vocabulary. Only PoliticalParty is reusable, and it is used unchanged. Everything else is minted over NIST SP 1500-100 and VIP.

Closes a loop the org profile left open. org records that a Post is filled by election and how long a term runs, but nothing about the election that produced the officeholder. A contest for an office must now name the Post it fills, so a result traces to the office and the office to the person who then held it. The fixtures also connect a scheduled District 5 special election to the vacancy org records and to the meetings agenda item where scheduling it was deferred.

electoralSystem is required on every contest, because a result cannot be interpreted without it: 40% of the vote wins outright under first past the post, triggers a runoff under a two-round system, and yields a proportion of seats under a party list. Ten systems are enumerated including STV, MMP and parallel. This is what lets the profile travel, the same role COFOG plays in budget.

Candidacy rather than candidate: the same person may stand in several contests, and party, ballot position and result belong to the standing rather than to the person. ballotName is separate because what appears on a ballot is frequently not someone's full legal name.

Withdrawn and disqualified are distinguished from losing and excluded from the vote reconciliation, since a candidate who never faced the voters is not the same as one who did and lost. Invalid votes are reported separately because spoiled ballots are a real signal. Turnout is not stored - registeredVoters and ballotsCast are, so it can be recomputed against a corrected register.

Five arithmetic guards: counts sum to validVotes, valid plus invalid equals totalVotes, no more elected than seats, office contests name their post, and ballot measures carry options rather than candidates.

Individual voter records and the electoral register are out of scope.

11 profiles, 33 schemas, 37 code lists, 330 namespace URLs.

schema.org has no Election, Candidate, Ballot or constituency of any kind - the
concepts do not exist in the vocabulary. Only PoliticalParty is reusable, and it
is used unchanged. Everything else is minted over NIST SP 1500-100 and VIP.

Closes a loop the org profile left open. org records that a Post is filled by
election and how long a term runs, but nothing about the election that produced
the officeholder. A contest for an office must now name the Post it fills, so a
result traces to the office and the office to the person who then held it. The
fixtures also connect a scheduled District 5 special election to the vacancy org
records and to the meetings agenda item where scheduling it was deferred.

electoralSystem is required on every contest, because a result cannot be
interpreted without it: 40% of the vote wins outright under first past the post,
triggers a runoff under a two-round system, and yields a proportion of seats
under a party list. Ten systems are enumerated including STV, MMP and parallel.
This is what lets the profile travel, the same role COFOG plays in budget.

Candidacy rather than candidate: the same person may stand in several contests,
and party, ballot position and result belong to the standing rather than to the
person. ballotName is separate because what appears on a ballot is frequently
not someone's full legal name.

Withdrawn and disqualified are distinguished from losing and excluded from the
vote reconciliation, since a candidate who never faced the voters is not the
same as one who did and lost. Invalid votes are reported separately because
spoiled ballots are a real signal. Turnout is not stored - registeredVoters and
ballotsCast are, so it can be recomputed against a corrected register.

Five arithmetic guards: counts sum to validVotes, valid plus invalid equals
totalVotes, no more elected than seats, office contests name their post, and
ballot measures carry options rather than candidates.

Individual voter records and the electoral register are out of scope.

11 profiles, 33 schemas, 37 code lists, 330 namespace URLs.
@lukefretwell
lukefretwell merged commit 0ed1b5a into main Sep 7, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant