Description
Audit repeated candidate IDs within each ballot and retain every within-ballot occurrence position.
A ballot record is an explicit selection or ordered list of literal candidate IDs. A tally depends on its rule: first choice, approval, positional scores and pairwise comparisons use different evidence. Partial rankings do not by themselves define a preference for or against omitted candidates. Counts and weights describe supplied records, not certified voters.
Audit repeated candidate IDs within each ballot and retain every within-ballot occurrence position.
When to use this tool
Use the repeat audit before applying tally rules that reject a candidate appearing twice within one ballot.
How to use the tool and how it works
- Enter candidates, ballotsJson using the definitions below. Serialize JSON text fields in the decoded shape shown below.
- Run the operation. Resolve input-format errors before interpreting an output.
- Read result.duplicates, using the stated boundary, ordering, sign and absence conventions.
Accept known candidate IDs even when a ballot repeats them. For each repeated ID within a ballot, report the original ballot index and all positions where that ID occurs.1
| Input field | Meaning and units | Accepted input |
|---|---|---|
| candidates | Distinct literal candidate IDs in the output row/column order. | Dense list of at most 128 literal strings, each at most 8,192 UTF-16 units. |
| ballotsJson | JSON array of ballot arrays of literal candidate IDs. Each row is a selection or partial ranking according to this operation; empty ballots are allowed. | Text, at most 8,192 UTF-16 code units; narrower grammar/range rules also apply. |
These decoded structures show the examples inside JSON text fields. Supply their serialized JSON strings as input.
{
"ballotsJson": [
[
"a",
"a"
],
[
"b"
]
]
} | Output field | Interpretation |
|---|---|
| result | Object containing the fields below. |
| result.duplicates | Per-ballot repeat groups {index,key,indexes}: ballot index, repeated candidate ID and its within-ballot positions. |
{
"input": {
"candidates": [
"a",
"b"
],
"ballotsJson": "[[\"a\",\"a\"],[\"b\"]]"
},
"output": {
"result": {
"duplicates": [
{
"index": 0,
"key": "a",
"indexes": [
0,
1
]
}
]
}
}
} Limitations and assumptions
- This audit groups repeats within one supplied ballot. It does not identify duplicate voters or deduplicate ballot records.
- Candidate banks use distinct exact string IDs. Unless an audit explicitly accepts them for reporting, unknown IDs and repeated IDs within a ballot are rejected. Rankings may be partial. These operations do not authenticate records, infer voter intent or apply jurisdiction-specific election rules.
- Every declared outer field is required and unknown outer fields are rejected. Strings and JSON text have size limits, lists are bounded to 128 entries, and JSON nesting/node counts are bounded. Tighter operation-specific bounds stated above take precedence.
- Numeric outputs must remain finite and within safe-integer magnitude. Original record indexes and cell coordinates are zero-based; stated half-open ranges exclude their end.
Alternative or Complementary methods
Choose a tally rule before comparing outcomes. Audit candidate identity and repeated entries first, retain the treatment of empty and partial ballots, and apply any election-specific eligibility or tie-breaking procedure separately.
References
Similar or alternative tools
- Ballot Candidate Occurrence Coverage Audit
Report unknown candidate occurrences and declared candidates never observed in supplied ballots.
- Approval Set Ballot Count Tally
Count approvals for each candidate from ballots containing distinct selected candidate IDs.