Run Date: 2026-11-10 21:56:29.053735 Copyright (c) Citizens' Oversight
This report gives the results of an audit of the ballot images of the San Francisco, California, 2024 General Election. Citizens' Oversight Projects (COPs) performed the audit with AuditEngine, its ballot image auditing system.
AuditEngine reads each ballot image on its own. It then compares its reading with the cast vote record (CVR), the voting system's record of each ballot, one ballot at a time. In this report, CVR always means cast vote record, never Conditional Voter Registration.
Comparing two independent readings can expose errors in either one that would be very hard to find otherwise. Voting systems are usually accurate. Still, a mistake, a software update, a change in the election definition or malicious activity can change a result.
The report is meant for election officials and for the public. It shows how far the official result can be checked from the ballot images.
This report is produced from a fixed template. Its text was written and reviewed in advance. The numbers are filled in from the audit's own tables, which are published in the Reconciliation Report. Terms such as Non-Variant Sheets and Contest Variants are defined there.
San Francisco is a consolidated city and county in California. Its Department of Elections runs its elections, and uses a voting system from Dominion Voting Systems. Voters may mark a paper ballot by hand, or use a ballot marking device (BMD), which prints a sheet with the voter's choices. Ballots cast by mail and in person are scanned, and the scanners save an image of each sheet.
These facts come from public sources, not from the audit.
The table gives the profile of the ballot images provided and, for a partial audit, of the part audited.
| Profile | Ballot images provided | Audited |
|---|---|---|
| Voting system | Dominion | Dominion |
| Ballots cast | 412,231 | |
| Sheets per ballot | 1 | 1 |
| Ballot sheet images | 1,604,380 | 412,351 |
| Sheets printed by BMDs | 12,617 | 12,617 |
| Precincts | 510 | 510 |
| Ballot styles | 1,382 | 1,382 |
| Contests | 53 |
The map shows the precincts of the jurisdiction. The precincts audited are colored. The boundaries come from a public source, given in the job settings.

The figure shows both sides of each sheet of a hand-marked ballot, and a sheet printed by a BMD. The sheets shown are from ballots of one precinct. The ballot images do not say which sheets belong to the same voter's ballot. Each sheet is labeled Audited or Not audited. Click an image to see it full size.
| Sheet 1 Audited 00001_00008_000001 |
| ||
| BMD sheet Audited 00001_01322_000011 |
|
This audit was a demonstration of AuditEngine on part of the election. To choose a subset of the ballots for this pilot study, we used a 'profile' to reduce the number of images processed. The results apply only to those ballot sheets selected.
The audit processed 412,351 ballot sheet images, with one image for each side of that sheet in one image file. 120 sheets had no CVR record, and 0 CVR records had no sheet image. These cannot be compared, and are left out of the results below.

12,617 of the sheets were printed by ballot marking devices (BMDs). AuditEngine read the printed text of each one, not its barcode.
AuditEngine compared 412,187 Sheets, holding 3,878,114 Ballot-Contests. A Ballot-Contest is a contest provided on one ballot.
14,002 Ballot-Contests (0.4%) are Contest Variants. These have a write-in, an overvote or a mark flagged gray as ambiguous, or AuditEngine and the CVR disagree.
44 Sheets are Not Processed. AuditEngine could not read them, so they are not compared.
882 Sheets are Ballot Variants, such as a sheet that is blank.
The charts show the Sheets and the Ballot-Contests, as in the Reconciliation Report.


Contest Variants are the Ballot-Contests set aside for a closer look. Most of them are not errors. A write-in, an overvote or a mark flagged gray as ambiguous makes a Ballot-Contest a Contest Variant, even when AuditEngine and the CVR agree. A disagreement between AuditEngine and the CVR makes one too. Of the 14,002 Contest Variants:
AuditEngine flags a mark gray when it is faint or unclear. A gray flag is not a disagreement with the CVR. It is a hint that a review could help, if the contest is close.
The chart shows them by kind, as in the Contest Variants Breakdown of the Reconciliation Report.

Other is 30.7% of the Contest Variants, so the table below breaks it down by pattern. Each row gives what AuditEngine read, the CVR original record, and the CVR modified record if the Ballot-Contest was adjudicated. Votes A is the set of votes AuditEngine read. Votes B and Votes C are different sets. Undervote means fewer votes than the contest allows, often none. The Comparison column says whether AuditEngine and the CVR agree. AuditEngine is compared with the CVR modified record if there is one, else with the original. The Groups column names each pattern's groups in the Reconciliation Report.
| AuditEngine | CVR original | CVR modified | Gray-flagged | Comparison | Ballot-Contests | % of Contest Variants | Groups |
|---|---|---|---|---|---|---|---|
| Votes A | Undervote | Votes A | Agreed | 1,482 | 10.6 | x_uv_x | |
| Votes A | Votes A | Not adjudicated | Yes | Agreed, gray-flagged | 708 | 5.1 | x_x_gry |
| Votes A | Votes A | Votes A | Yes | Agreed, gray-flagged | 483 | 3.4 | x_x_x_gry |
| Votes A | Overvote | Votes A | Agreed | 477 | 3.4 | x_ov_x | |
| Votes A | Votes B | Votes A | Agreed | 337 | 2.4 | x_y_x | |
| Votes A | Undervote | Undervote | Disagreed | 170 | 1.2 | x_uv_uv | |
| Undervote | Votes A | Not adjudicated | Disagreed | 97 | 0.69 | bmd_uv_x | |
| Undervote | Undervote | Votes A | Disagreed | 82 | 0.59 | uv_uv_x | |
| Votes A | Overvote | Overvote | Disagreed | 80 | 0.57 | x_ov_ov | |
| Votes A | Votes B | Votes B | Disagreed | 75 | 0.54 | x_y_y, bmd_x_y_y | |
| Undervote | Undervote | Not adjudicated | Yes | Agreed, gray-flagged | 64 | 0.46 | uv_uv_gry |
| Undervote | Undervote | Undervote | Yes | Agreed, gray-flagged | 53 | 0.38 | uv_uv_uv_gry |
| Votes A | Votes A | Undervote | Disagreed | 50 | 0.36 | x_x_uv | |
| Votes A | Votes B | Not adjudicated | Disagreed | 40 | 0.29 | x_y, bmd_x_y | |
| Votes A | Overvote | Votes B | Disagreed | 27 | 0.19 | x_ov_y | |
| Votes A | Undervote | Not adjudicated | Disagreed | 21 | 0.15 | x_uv, bmd_x_uv | |
| Undervote | Votes A | Votes A | Disagreed | 21 | 0.15 | uv_x_x | |
| Votes A | Votes B | Votes C | Disagreed | 11 | 0.079 | x_y_z | |
| Votes A | Undervote | Votes B | Disagreed | 7 | 0.05 | x_uv_y | |
| Undervote | Votes A | Votes B | Disagreed | 4 | 0.029 | uv_x_y | |
| Votes A | Votes B | Undervote | Disagreed | 3 | 0.021 | x_y_uv | |
| Votes A | Votes A | Overvote | Disagreed | 3 | 0.021 | x_x_ov | |
| Undervote | Votes A | Undervote | Agreed | 3 | 0.021 | uv_x_uv | |
| Votes A | Votes B | Overvote | Disagreed | 2 | 0.014 | x_y_ov | |
| Votes A | Undervote | Overvote | Disagreed | 1 | 0.0071 | x_uv_ov | |
| Votes A | Votes A | Votes B | Disagreed | 1 | 0.0071 | x_x_y | |
| Undervote | Votes A | Overvote | Disagreed | 1 | 0.0071 | uv_x_ov |
The CVR has an 'original' evaluation of each ballot, and if adjudicated, the CVR has a 'modified' record after adjudication. In adjudication, election staff review ballots and may change how a contest is counted. AuditEngine compared its reading with both. In 2,299 Ballot-Contests, adjudication changed the original evaluation to agree with AuditEngine.
A disagreement can at most move one vote from the winner to the runner-up, which changes the margin by two. An overvote that AuditEngine and the CVR agree on is not a disagreement. Still, a review could find the voter's intent in it, a vote that can narrow the margin by one. So a contest is compared with its margin by twice its Disagreed Ballot-Contests, plus its agreed overvotes. In 1 of the contests audited, this is equal to or more than the margin of victory. In every other contest, the disagreements and overvotes found could not change the outcome.
The margins are among the ballots audited. Since the audit covered part of the election, they are not the margins of the whole contest.
The table below always lists the major contests on the ballot, such as President, United States Senator, United States Representative and Governor. Each contest links to its section of the Reconciliation Report.
| Contest | Disagreed | Involving a write-in | Remaining Disagreed | Agreed overvotes | Margin of victory | Could narrow the margin by | As % of margin |
|---|---|---|---|---|---|---|---|
| PRESIDENT AND VICE PRESIDENT | 113 | 21 | 92 | 992 | 261,125 | 1,176 | 0.45 |
| UNITED STATES SENATOR | 44 | 0 | 44 | 253 | 244,511 | 341 | 0.14 |
| UNITED STATES SENATOR PARTIAL TERM | 34 | 0 | 34 | 166 | 241,964 | 234 | 0.097 |
| UNITED STATES REPRESENTATIVE, DISTRICT 11 | 40 | 0 | 40 | 121 | 210,481 | 201 | 0.095 |
| UNITED STATES REPRESENTATIVE, DISTRICT 15 | 6 | 0 | 6 | 21 | 14,424 | 33 | 0.23 |
| STATE SENATOR, DISTRICT 11 | 53 | 0 | 53 | 189 | 213,179 | 295 | 0.14 |
The table below lists the contests where the Disagreed Ballot-Contests that do not involve a write-in, and the agreed overvotes, could narrow the margin the most, compared with it. Each contest links to its section of the Reconciliation Report.
| Contest | Disagreed | Involving a write-in | Remaining Disagreed | Agreed overvotes | Margin of victory | Could narrow the margin by | As % of margin |
|---|---|---|---|---|---|---|---|
| MEMBER, BOARD OF EDUCATION | 177 | 20 | 157 | 1,172 | 248 | 1,486 | 599 |
| TRUSTEE, COMMUNITY COLLEGE BOARD | 136 | 19 | 117 | 486 | 3,550 | 720 | 20.3 |
| BART BOARD OF DIRECTORS, DISTRICT 7 | 4 | 1 | 3 | 39 | 1,856 | 45 | 2.4 |
| BART BOARD OF DIRECTORS, DISTRICT 9 | 57 | 12 | 45 | 284 | 36,061 | 374 | 1 |
| STATE ASSEMBLY MEMBER, DISTRICT 19 | 34 | 0 | 34 | 155 | 38,510 | 223 | 0.58 |
| PRESIDENT AND VICE PRESIDENT | 113 | 21 | 92 | 992 | 261,125 | 1,176 | 0.45 |
| UNITED STATES REPRESENTATIVE, DISTRICT 15 | 6 | 0 | 6 | 21 | 14,424 | 33 | 0.23 |
| UNITED STATES SENATOR | 44 | 0 | 44 | 253 | 244,511 | 341 | 0.14 |
| STATE SENATOR, DISTRICT 11 | 53 | 0 | 53 | 189 | 213,179 | 295 | 0.14 |
| STATE ASSEMBLY MEMBER, DISTRICT 17 | 37 | 0 | 37 | 82 | 138,590 | 156 | 0.11 |
| Contest | Disagreed | Involving a write-in | Remaining Disagreed | Agreed overvotes | Margin of victory | Could narrow the margin by | As % of margin |
|---|---|---|---|---|---|---|---|
| MEMBER, BOARD OF EDUCATION | 177 | 20 | 157 | 1,172 | 248 | 1,486 | 599 |
| TRUSTEE, COMMUNITY COLLEGE BOARD | 136 | 19 | 117 | 486 | 3,550 | 720 | 20.3 |
| BART BOARD OF DIRECTORS, DISTRICT 7 | 4 | 1 | 3 | 39 | 1,856 | 45 | 2.4 |
| BART BOARD OF DIRECTORS, DISTRICT 9 | 57 | 12 | 45 | 284 | 36,061 | 374 | 1 |
| STATE ASSEMBLY MEMBER, DISTRICT 19 | 34 | 0 | 34 | 155 | 38,510 | 223 | 0.58 |
| PRESIDENT AND VICE PRESIDENT | 113 | 21 | 92 | 992 | 261,125 | 1,176 | 0.45 |
| UNITED STATES REPRESENTATIVE, DISTRICT 15 | 6 | 0 | 6 | 21 | 14,424 | 33 | 0.23 |
| UNITED STATES SENATOR | 44 | 0 | 44 | 253 | 244,511 | 341 | 0.14 |
| STATE SENATOR, DISTRICT 11 | 53 | 0 | 53 | 189 | 213,179 | 295 | 0.14 |
| STATE ASSEMBLY MEMBER, DISTRICT 17 | 37 | 0 | 37 | 82 | 138,590 | 156 | 0.11 |
| UNITED STATES SENATOR PARTIAL TERM | 34 | 0 | 34 | 166 | 241,964 | 234 | 0.097 |
| UNITED STATES REPRESENTATIVE, DISTRICT 11 | 40 | 0 | 40 | 121 | 210,481 | 201 | 0.095 |
| MAYOR | 158 | 154 | 4 | 0 | N/A | N/A | N/A |
| MEMBER, BOARD OF SUPERVISORS, DISTRICT 1 | 3 | 3 | 0 | 0 | N/A | N/A | N/A |
| MEMBER, BOARD OF SUPERVISORS, DISTRICT 3 | 4 | 4 | 0 | 0 | N/A | N/A | N/A |
| MEMBER, BOARD OF SUPERVISORS, DISTRICT 5 | 10 | 10 | 0 | 0 | N/A | N/A | N/A |
| MEMBER, BOARD OF SUPERVISORS, DISTRICT 7 | 3 | 3 | 0 | 0 | N/A | N/A | N/A |
| MEMBER, BOARD OF SUPERVISORS, DISTRICT 9 | 4 | 4 | 0 | 0 | N/A | N/A | N/A |
| MEMBER, BOARD OF SUPERVISORS, DISTRICT 11 | 4 | 4 | 0 | 0 | N/A | N/A | N/A |
| CITY ATTORNEY | 159 | 159 | 0 | 0 | N/A | N/A | N/A |
| DISTRICT ATTORNEY | 142 | 142 | 0 | 0 | N/A | N/A | N/A |
| SHERIFF | 115 | 115 | 0 | 0 | N/A | N/A | N/A |
| TREASURER | 105 | 105 | 0 | 0 | N/A | N/A | N/A |
| PROPOSITION 2 | 0 | 0 | 0 | 0 | N/A | N/A | N/A |
| PROPOSITION 3 | 0 | 0 | 0 | 0 | N/A | N/A | N/A |
| PROPOSITION 4 | 0 | 0 | 0 | 0 | N/A | N/A | N/A |
| PROPOSITION 5 | 0 | 0 | 0 | 0 | N/A | N/A | N/A |
| PROPOSITION 6 | 0 | 0 | 0 | 0 | N/A | N/A | N/A |
| PROPOSITION 32 | 1 | 0 | 1 | 0 | N/A | N/A | N/A |
| PROPOSITION 33 | 0 | 0 | 0 | 0 | N/A | N/A | N/A |
| PROPOSITION 34 | 1 | 0 | 1 | 0 | N/A | N/A | N/A |
| PROPOSITION 35 | 1 | 0 | 1 | 0 | N/A | N/A | N/A |
| PROPOSITION 36 | 4 | 0 | 4 | 0 | N/A | N/A | N/A |
| MEASURE A | 3 | 0 | 3 | 0 | N/A | N/A | N/A |
| MEASURE B | 4 | 0 | 4 | 0 | N/A | N/A | N/A |
| MEASURE C | 5 | 0 | 5 | 0 | N/A | N/A | N/A |
| MEASURE D | 4 | 0 | 4 | 0 | N/A | N/A | N/A |
| MEASURE E | 6 | 0 | 6 | 0 | N/A | N/A | N/A |
| MEASURE F | 10 | 0 | 10 | 0 | N/A | N/A | N/A |
| MEASURE G | 8 | 0 | 8 | 0 | N/A | N/A | N/A |
| MEASURE H | 8 | 0 | 8 | 0 | N/A | N/A | N/A |
| MEASURE I | 8 | 0 | 8 | 0 | N/A | N/A | N/A |
| MEASURE J | 10 | 0 | 10 | 0 | N/A | N/A | N/A |
| MEASURE K | 12 | 0 | 12 | 0 | N/A | N/A | N/A |
| MEASURE L | 12 | 0 | 12 | 0 | N/A | N/A | N/A |
| MEASURE M | 9 | 0 | 9 | 0 | N/A | N/A | N/A |
| MEASURE N | 13 | 0 | 13 | 0 | N/A | N/A | N/A |
| MEASURE O | 14 | 0 | 14 | 0 | N/A | N/A | N/A |
Ranked-choice contests were compared rank by rank on the ballots audited. Generating ranked-choice outcomes requires all the ballots. However, we can check the results for each rank.
RCV contests appeared only on the BMD ballots processed, while in hand-marked ballots, they were on sheet 2, which was not included.
The audit compares the votes on the ballots of each batch with those of every other batch. 9 pairs of batches hold the same ballots. Each pair is one set of paper scanned twice. A reviewer compared the two images of sample ballots in each pair, and confirmed it. The Repeated Batch Report lists the pairs.
In 6 of these pairs, both batches have cast vote records. So 335 ballots are counted twice in the CVR. The audit counts each of these papers once. The Reconciliation Report shows the audit's totals with the repeats taken out.
In 3 pairs, one batch has no cast vote records. Its images are extra, but not counted.
AuditEngine read each ballot sheet on its own and compared its reading with the CVR. 99.6% of the Ballot-Contests agreed, with no variation of any kind. In 1 contests, the disagreements and overvotes are large compared with the margin, even leaving out the disagreements that involve a write-in. These need a closer look, ballot by ballot, before their outcomes can be confirmed.
These results apply to the ballot sheets audited. An audit of every ballot sheet of an election can be done the same way, given the ballot images and the CVR.