# Zero-vote sections in Brazil's 2026 presidential runoff: findings v2

Date: 2026-10-29. Status: version 2, final, published 2026-10-29 after four full rechecks.

This is version 2 of the lab. It replaces an earlier internal version that I found wrong in eight places when I rechecked it. The changes are listed below. Every number here comes from a CSV in `results/`, written by the scripts `01` to `11` (`run_all.sh`). Lists that name individual sections or small places are kept in a private data folder and are not published. `EXPERIMENT.md` holds the questions and the rules U1 to U5, as written before any result, plus every later deviation, dated and explained. Anything added after results is marked so.

## The answer in five lines

1. **The press counts replicate.** Flávio Bolsonaro had 0 votes in 106 sections, where Lula had 14,860. Lula had 0 votes in 4 sections, where Flávio Bolsonaro had 296.
2. **Zero sections occur in every runoff.** The non-PT side had 328 in 2018, 143 in 2022 and 106 in 2026. The PT side had 4 in each year.
3. **Against official registers** (IBGE 2022 Census localities and sectors, FUNAI indigenous lands and villages, INCRA quilombola territories, matched to the TSE polling-place coordinates within 1 km): of the 106, 67 are at indigenous villages or communities, 16 at quilombola communities, 2 in prisons, 20 at other rural or riverside places and 1 in an urban sector. Lula's 4 are at 3 rural places and 1 urban place. The register labels were written before the lab's own text labels were read. On the 106 sections not labelled from text (105 from registers and 1 prison from its official place type), the two agree on 103 about whether a place is indigenous (kappa 0.94). Most quilombola labels rest only on lying within 1 km of an IBGE quilombola locality point, and that category was not validated separately. See M5.
4. **No model we fitted predicts which sections end at zero.** In 2026 every model expects fewer zeros than were seen, on both sides. Under the municipality and EB models the ratio of observed to expected is higher than in 2022 on both sides. Under the place models it is lower for the non-PT side. Where it rose, it is because the models expect fewer zeros in 2026, not because there were more zero sections: the non-PT count fell from 143 to 106. In polling places that are indigenous villages by official registers and can be followed from 2022 to 2026, the non-PT zero rate barely moved: 3.6% to 3.4% (added after results). The PT side rests on 4 sections a year.
5. **Every consistency check we ran between the published files passed.** That shows the files agree with each other. It does not show what voters typed. The 14,860 votes are 0.34% of the 4,430,191-vote margin.

## What changed from v1, and why

- **v2 changes how the place dispersion is fitted** (deviation 6, decided after results). v1 fitted it one way and expected 94.7 zeros against 106, inside its bound. v2 fits it on a different set of sections and expects 65.4, outside its bound. The change took this result from inside its bound to outside it, so both versions are shown, and the v1 code is kept as a row that reproduces 94.705 exactly. Under either version, most of the expected zeros fall on sections that were not zero (M1).
- **v1 summarised the rules instead of showing them.** It said U2 fired "for one model only". It fired in 10 of 72 checks. v1 also didn't apply the same history test to the PT side.
- **v1's composition explanation does not hold** (Must 4 below).
- **v1's place classifier had errors, and v1 missed the prison sections.**
- **v1's interactive file named 408 sections with coordinates.** v2 names none.
- **v1 said Lula never had a zero at an indigenous-named place.** The PT candidate in 2018, Haddad, had 1.

## M1. What the models predict

The models, as before: B-mun and B-place (binomial), BB-mun and BB-place (beta-binomial), at the municipality or the polling place, leaving each section out. Two models are **added after results** (deviation 8):
- **EB-place** uses an empirical-Bayes beta-binomial at the polling place.
- **EB-r1** starts from the municipality's round-2 share, leaving the section out, and updates it with the same section's round-1 votes. It uses no round-2 outcome of the section itself. It does use the round-2 results of every other section in the municipality and state.

"Best" now means the highest log score over all sections (`results/model_scores.csv`). EB-r1 has the best score in every year and on both sides.

Expected zero sections, with observed in the first column:

| Year | Side | Observed | B-mun | B-place | BB-mun | BB-place | EB-place | EB-r1 (best) |
|---|---|---:|---:|---:|---:|---:|---:|---:|
| 2026 | non-PT | 106 | 0.4 | 48.9 | 5.4 | 65.4 | 8.0 | 10.8 |
| 2022 | non-PT | 143 | 0.7 | 43.6 | 14.8 | 64.0 | 14.5 | 32.7 |
| 2018 | non-PT | 328 | 3.5 | 133.5 | 109.2 | 206.6 | 79.1 | 184.6 |
| 2026 | PT | 4 | 0.1 | 1.9 | 0.4 | 2.3 | 0.4 | 0.4 |
| 2022 | PT | 4 | 2.4 | 2.4 | 2.6 | 2.7 | 2.6 | 2.4 |
| 2018 | PT | 4 | 2.1 | 3.3 | 4.6 | 4.8 | 3.5 | 4.9 |

U1 is now tested with the exact Poisson-binomial 99.9% bound (deviation 7), not a normal approximation.

**Where the expectation falls** (`results/m1_expectation_decomposition.csv`). Even when a model's total comes near the observed count, it doesn't put that expectation on the sections that were zero:
- BB-place 2026, non-PT: only 18.2 of its 65.4 expected zeros fall on the 106 observed zero sections.
- The 73 zero sections that are alone at their polling place get 0.20 in total.
- 24 sections take their "place" share from place-mates that themselves gave 0, and 11 of those were zero.

**Plainly:** these models capture how shares vary, but not unanimity in small communities. They are descriptive tools, not a test of any mechanism.

## M2 and M3. Both sides under the same rules

`results/u2_history_check.csv` lists all 72 checks: 3 events × 3 minimum sizes × 4 pre-registered models × 2 sides.
- **U2 as pre-registered** (2026 ratio outside the pooled 2018 and 2022 range by more than 1.5 times) fired in **10 of 72**: 10 on the non-PT side, 0 on the PT side.
- **U2 per side, added after results** (each side against its own history, deviation 10), fired in **21 of 72**: 12 non-PT, 9 PT.

The municipality beta-binomial, observed over expected:

| Side | 2018 | 2022 | 2026 | 2026 over own earlier maximum |
|---|---:|---:|---:|---:|
| non-PT | 3.0 | 9.7 | 19.7 | 2.0 times |
| PT | 0.9 | 1.5 | 9.1 | 5.9 times |

The best model, EB-r1, observed over expected: non-PT 1.8 (2018), 4.4 (2022), 9.8 (2026). PT 0.8, 1.7, 10.9.

Place-cluster bootstrap 95% intervals for observed over expected (`results/ratio_bootstrap_places.csv`, deviation 11):

| Model | non-PT 2022 | non-PT 2026 | PT 2022 | PT 2026 |
|---|---|---|---|---|
| B-place | 3.28 (2.58 to 4.48) | 2.17 (1.76 to 2.84) | 1.65 (0 to 15.96) | 2.15 (0.62 to 28.78) |
| BB-mun | 9.67 (8.02 to 11.44) | 19.71 (15.73 to 24.21) | 1.53 (0 to 9.18) | 9.07 (2.08 to 21.74) |
| BB-place | 2.23 (1.82 to 2.81) | 1.62 (1.34 to 2.03) | 1.50 (0 to 8.32) | 1.73 (0.52 to 10.00) |
| EB-r1 | 4.37 (3.72 to 5.08) | 9.81 (7.90 to 11.85) | 1.66 (0 to 15.78) | 10.95 (2.45 to 26.60) |

For the non-PT side, the 2026 intervals lie above 2022 under BB-mun and EB-r1, and below 2022 under both place models. For the PT side every 2026 interval overlaps 2022, because the counts are 4 sections a year. Two limits: the bootstrap resamples places but holds each model fixed without refitting, and overlapping intervals are not a formal test.

**Plainly:** in 2026 every model expects fewer zeros than were seen, on both sides. Whether 2026 is more unusual than earlier runoffs depends on the model. The municipality and EB models say yes on both sides. The place models say no for the non-PT side. Where the ratio rose, the cause is a smaller expected count, not more zeros.

Two cautions. Of the per-side U2 fires, 5 of 9 on the PT side and 5 of 12 on the non-PT side rest on a 2026 expected count below 1. Each per-side baseline has only two earlier points.

The EB-r1 ratios across years also mix two things: change in the zero sections, and change in how round 1 maps to round 2. The top two candidates held 75.3% of round-1 votes in 2018, 91.6% in 2022 and 92.2% in 2026. The non-PT share of the top two moved from 61.1% to 55.1% between rounds in 2018, from 47.1% to 49.1% in 2022, and from 51.0% to 48.2% in 2026 (`results/round_mapping_by_year.csv`).

## M4. Does the mix of places explain it?

**No, not on its own** (`results/m4_*.csv`, deviation 13).
- **Reweighting.** Weighted back to the 2022 mix, the 2026 BB-mun ratio for the non-PT side is 17.5 with register villages, 16.6 with the v2 text flag, and 17.2 with the v1 text flag. The pre-registered threshold is 14.5, so it stays above under all three. The PT side's ratio is 9.1 actual and 9.1 at the 2022 register mix. In register villages, the non-PT zero rate was 3.22% of sections in 2022 and 3.86% in 2026. Outside them, the BB-mun ratio was 6.95 in 2022 and 7.94 in 2026 (`results/m4_counterfactual_reweighting.csv`).
- **The denominator outside flagged places shrank.** Outside them, BB-mun expected 14.7 zeros in 2022 and 5.3 in 2026, while 97 and 38 were observed. The ratio outside flagged places is 6.6 in 2022 and 7.1 in 2026 (v2 flags). Much of the 2026 rise in the total ratio comes from the smaller expected count, not from more zeros.
- **Municipal share around the zeros.** The median non-PT municipal share around the zero sections rose from 0.201 in 2022 to 0.274 in 2026 (`results/diag_local_share_in_zero_sections.csv`). The models therefore expected fewer zeros there.
- **Flags are not comparable across years.** The district text "ZONA RURAL INDÍGENA" appears in 0 sections in 2018, 178 in 2022 and 217 in 2026. Counts of indigenous-flagged sections across years partly reflect how places are labelled.
- **Indigenous-flagged places followed across years** (added after results). 347 polling places were flagged as indigenous in both 2022 and 2026, and matched by municipality and place name. Their non-PT zero rate was 5.81% in 2022 and 6.12% in 2026, and the non-PT pooled share there was 12.3% and 11.6%. The PT side had no zero in them in either year. This panel is not national: the national zero rate is about 0.02% of sections. Nor is the rate stable in general. In the 378 places flagged in both 2018 and 2022, it fell from 11.7% to 4.0% (`results/m4_stable_panel_zero_rates.csv`). The same panel with the register definition (`results/m5b_panel_2022_2026.csv`, place-cluster bootstrap 95%):
  - 503 places that are indigenous villages by the registers: non-PT zero rate 3.63% in 2022 (35 of 964 sections, 2.4 to 5.0) and 3.37% in 2026 (36 of 1,067, 2.1 to 4.7)
  - 904 places with any register signal: 1.02% and 0.98%
  - the PT side: 0 in every row
  - the register panel was built for 2022 to 2026 only

**Plainly:** in the indigenous-flagged places that can be followed from 2022 to 2026, zeros came at about the same rate in both years. What changed is what the municipality-level models expect, because the municipal shares around those places were different.

## M5. Classifying the places

Two classifications exist. Neither was done by a person.

**1. The lab's text reading** (private labels, summarised in `results/m5_label_category_counts.csv`, `m5_classifier_agreement_zero_sections.csv` and `m5_precision_sample.csv`).
- **Who and how:** the lab's analyst, an AI agent, read the TSE text fields (place name, address, district, official place type) for all 110 zero sections and recorded a reason for each. It was not blind, because the analyst also wrote the automatic text rule, and it used no outside register.
- **Result, for the 106:** 68 indigenous (10 only from the district label), 5 quilombola by text, 2 prison ("Preso provisório"), 31 rural or riverside with no marker.
- **The precision sample of this rule restates the rule.** 181 of its 189 "indigenous" labels give the rule's own reason. It measures only how often the marker is a street or road name, and it is superseded by the register check below.

**2. The register check** (`11_external_check.py`, `EXTERNAL-CHECK-PLAN.md`, `results/m5b_*.csv`), added after results.
- **Sources:**
  - IBGE 2022 Census: indigenous localities (10,958 points), places of indigenous concentration (6,151), quilombola localities (8,441), and the census sector mesh with each sector's urban or rural status and type
  - FUNAI indigenous lands (665 polygons) and villages (4,731 points)
  - INCRA quilombola territories (446 polygons)
  - Each file's URL, date and SHA-256 are in `results/m5b_registers.csv`. No download page states a licence. Treating them as open public data is an inference.
- **Categories,** defined before classifying: indigenous village or community, urban indigenous school, quilombola community, prison or detention, other rural or riverside, urban.
- **Rule:** inside a FUNAI land or INCRA territory, inside a census sector of that type, or within 1 km of an IBGE locality. 5 km is a sensitivity check, and it is too wide because it takes in whole towns.
- **Blindness:** the register labels for the 110 were written and hashed before the lab's labels were read.

**Coordinates.** 92,773 of 94,260 polling places in 2026 have a usable coordinate (`results/m5b_coordinate_coverage.csv`). Of the 110 zero sections, 105 do. Of the other 5, 4 fall back to text and 1, a prison section, is labelled by its official place type. Text fallbacks are not counted in any agreement figure. In 2022, 6,743 places (8.4 million voters) have no coordinate.

**The 110 zero sections:**

| Zero for | Indigenous village | Quilombola | Prison | Other rural or riverside | Urban |
|---|---:|---:|---:|---:|---:|
| Flávio Bolsonaro (106) | 67 | 16 | 2 | 20 | 1 |
| Lula (4) | 0 | 0 | 0 | 3 | 1 |

- **Agreement with the lab's text reading:**
  - on indigenous yes or no, over the 106 sections not labelled from text (105 from registers, 1 prison from its official place type): 103 agree, kappa 0.941. 63 are indigenous by both, 1 by the registers only, 2 by the text only
  - on the full category: 95 of 110
- **The three indigenous disagreements:**
  - one place lies inside a FUNAI indigenous land that the text did not mark
  - one is 1.01 km from the nearest IBGE locality, just past the 1 km rule
  - one has an indigenous word in its name but sits in an urban census sector 11 km from any locality
- **The other category differences:** 11 places in two states are quilombola by the registers and plain rural by text. One of the PT side's sections is in an urban census sector.
- **No zero section is an urban indigenous school.** Across all text-flagged places, 16 places (57 sections) are urban indigenous schools.

**The text rule, measured against the registers, at the place level:**

| Measure | Estimate | 95% interval |
|---|---|---|
| Precision: flagged places with a register signal | 95.9% (188 of 196) | 92.7 to 98.4 (municipality bootstrap) |
| Recall, in municipalities with an indigenous land or locality | 41.2% | 26.4 to 60.6 |
| Kappa, same municipalities | 0.57 | 0.39 to 0.74 |

Run on every place instead of a sample: precision 95.9%, recall 40.8%, kappa 0.57. For villages only: precision 93.9%, recall 66.3%.

Neither the registers nor the text are ground truth. Registers can be out of date, and coordinates can be wrong or missing.

**Plainly:** when the text says indigenous, it almost always is. But the text misses more than half of the places the registers mark, so counts of "indigenous-flagged" places by text are lower bounds, and their changes across years partly reflect labelling.

**Prison sections across years:** non-PT zero sections in prison sections (official type "Preso provisório") were 27 in 2018, 14 in 2022 and 2 in 2026. The PT side had none in any year (`results/zero_by_official_place_type_<year>.csv`).

## M6. What the consistency checks show

`results/consistency_summary.csv`:

| Check | Result |
|---|---|
| SHA-512 of the 28 round-2 bulletin files | 28 of 28 match the published hashes. This shows the download is intact. |
| Bulletin against section file, per section and candidate | 1,931,103 pairs, 0 differ |
| Electorate and turnout, bulletin against section file | 0 differ |
| Turnout above electorate | 0 sections in 2026, 2022 and 2018 |
| Turnout against valid + blank + null | 0 mismatches in all three years |
| Sum of sections against published municipality-zone totals | 0 differ in all three years |
| National round-2 report against the sum of sections | 6 of 6 lines match |

**What these checks are:** consistency checks between files published from one system. They show the published numbers agree with each other at every level.

**What they cannot show:**
- whether a machine recorded what each voter typed
- whether the signed machine files match the published tables

The signed machine files (`bu`, `rdv`, logs) were not checked. Every check not run is listed in `results/consistency_checks_not_run.csv`. tse.jus.br returns 403 to scripts, and we found no public verifier or format specification. The atlas download now includes these files for later work.

## M7. Privacy

`interactive/` is rebuilt (deviation 14, `interactive/README.md`):
- 0 section rows, 0 place names, 0 coordinates
- 5,707 municipal rows
- 9 small cities abroad pooled into one row
- place categories given as national totals only

The rule is written in the header of every file: no published unit with fewer than 50 voters, no prison or detention section below national totals, no unanimous section below the municipality, no named small community.

## M8. Correction

In 2018 the PT candidate, Haddad, had 1 zero section at an indigenous-named place. v1 said the PT side had none in any year.

## Scale (unchanged from v1)

`results/scale.csv`:
- **2026 round 2:** 499,248 sections and 124,082,273 valid votes. Lula had 64,256,232 and Flávio Bolsonaro 59,826,041, a margin of 4,430,191.
- **The 106 zero sections** hold 0.012% of valid votes. Lula's 14,860 votes there are 0.34% of the margin.
- **To change the outcome,** 2,215,096 votes would have to move, about 149 times all the valid votes in these sections.

## Limits

- Public files show agreement between published tables, not what voters typed.
- The signed machine files were not checked.
- The place categories rest on registers matched by coordinates, with text as a fallback. Coordinates are missing for 5 of the 110 zero sections, and for 8.4 million voters' places in 2022. The text rule's recall is about 41%.
- The models describe vote shares. None of them models a community deciding together, so none can predict unanimity at the level of one section.
- EB-place, EB-r1, the per-side U2, the bootstrap and the composition diagnostics were all added after seeing results.
- **Model assumptions:**
  - The exact bounds treat sections as independent.
  - The place bootstrap holds each model fixed and does not refit it.
  - The beta-binomial dispersion is one value per state and year, fitted to the bulk of sections, not the tails.
  - No model here can produce a whole community voting one way.
  - The place models use place-mates from the same round, which is circular when those place-mates are all zero.
  - The EB prior strength is the state's municipality dispersion, which is a choice.
  - EB-r1 treats round-1 counts as draws from the round-2 share.
  - Shares are clipped at 1e-4, and log scores floor probabilities at 1e-15.
- The PT-side results rest on 4 sections each year.
- Places matched across years: 347 for 2022 and 2026, by municipality and place name. Section numbers change between elections.

## Reproduce

Run `./run_all.sh` (see `REPRODUCE.md`). A clean rerun matched all 63 published tables. A fresh-folder test, with no private labels, matched 56 and skipped the 7 that depend on the private place labels, which are not published (`REPRODUCE.md`, section 9). One TSE source (`votacao_candidato_munzona_2022.zip`) was republished on 2026-10-29. Our archived copy matches the lock, and REPRODUCE.md explains what a fresh download does.
