# 2022 rematch bridge: county sensitivity model

## Status and purpose

This module is a public research diagnostic. Its assumptions and stress envelope are wired into the forecast artifact for inspection, but none of its scenario endpoints or grid cells is a probability-weighted forecast input.

The narrow question is:

> Starting from Oregon's certified 2022 county result, what arithmetic outcomes follow from clearly stated assumptions about retention, crossover, residual voting, and the destination of Betsy Johnson's 2022 vote?

The analysis is useful because Tina Kotek and Christine Drazan are the same two major-party candidates as in 2022. It cannot determine how individual voters will behave in 2026. In particular, county aggregates do not reveal Johnson voters' second choices.

Implementation: `forecast/bridge.py`  
Runner: `scripts/analyze_2022_bridge.py`  
Assumption registry: `data/bridge/scenarios.json`

## Observed input

The only electoral observation used is `data/results/oregon_2022_governor_county.csv`, derived from the Oregon Secretary of State's certified November 8, 2022 General Election Abstract of Votes.

The runner refuses to proceed unless the 36 loaded counties reconcile to `data/results/oregon_2022_governor_validation.json`. The current totals are:

| 2022 source bloc | Certified votes |
|---|---:|
| Tina Kotek | 917,074 |
| Christine Drazan | 850,347 |
| Betsy Johnson | 168,431 |
| Constitution, Libertarian, and write-in/miscellaneous combined | 17,031 |
| Total | 1,952,883 |

The literal full-ballot Kotek-minus-Drazan margin was +3.416846 points. Among only Kotek and Drazan votes, it was +3.775388 points. Both measures are retained so normalization is not mistaken for the certified result.

The generated artifact records SHA-256 hashes for the county CSV, validation manifest, scenario registry, bridge implementation, analysis runner, and certified source PDF. No fallback statewide shares are permitted in this module.

## Evidence-informed production transfer prior

The exact 2022 counterfactual split of Johnson voters remains unidentified. Certified county totals provide no individual second choices, and no available survey directly asks every Johnson voter how they would have voted in a Kotek–Drazan-only contest.

The production forecast nevertheless needs to express uncertainty about this missing quantity. It uses a truncated-normal prior for **Kotek's share among Johnson-origin voters who choose either major candidate**, with mean `0.48`, standard deviation `0.16`, lower bound `0.05`, and upper bound `0.85`. A separately drawn Johnson-to-major rate controls the fraction entering that allocation. Its `0.90` center is an unvalidated judgmental participation assumption; VoteCast and Clout do not measure it. A draw of `0.48` therefore does not mean that 48% of every 2022 Johnson ballot becomes a Kotek ballot in 2026. The production bridge holds the 2022 Kotek and Drazan source blocs at 100%; retention and crossover for those blocs are examined only in the unweighted diagnostic scenarios and grid below.

The prior is a deliberately broad synthesis of two indirect sources:

- **AP VoteCast:** an individual-level relative-favorability comparison among respondents who reported or intended a Johnson vote. It offers respondent-level evidence about the two major candidates, but favorability is not a direct second-choice or counterfactual vote question.
- **Clout:** an initial Kotek–Drazan–Johnson ballot and a forced Kotek–Drazan ballot asked within the same survey sample. The two aggregate toplines constrain the arithmetic, but the missing respondent-level cross-tab means the movement cannot be attributed uniquely to Johnson voters; undecided, other-candidate, and initially major-candidate respondents may also have moved.

These sources do not identify a transfer rate, and the distribution is not presented as a posterior estimated from microdata. The repository retains only derived AP VoteCast statistics and provenance needed for audit; it does not redistribute raw public-use microdata.

## Transition accounting

Every county is collapsed into four observed source blocs:

1. `tina_kotek_2022`
2. `christine_drazan_2022`
3. `betsy_johnson_2022`
4. `other_2022`

Every scenario supplies a complete transition row from each source bloc to three destinations:

1. `to_kotek`
2. `to_drazan`
3. `residual`

Each row must contain finite values between zero and one and must sum exactly to one within a numerical tolerance of `1e-9`.

For county (c), source bloc (b), source vote units (V_{cb}), and transition share (T_{bd}), the synthetic destination units are:

\[
U_{cd} = \sum_b V_{cb} T_{bd}
\]

The accounting identity is checked for every county and statewide:

\[
U_{c,Kotek} + U_{c,Drazan} + U_{c,residual} = \sum_b V_{cb}
\]

`Residual` is deliberately broad. Depending on the source bloc, it can stand for abstention, a different candidate, ineligibility, migration, or another destination the current data cannot distinguish. It is not automatically interpreted as a 2026 minor-party vote.

The output units are named **synthetic 2022 certified ballot-equivalent units**. They are not projected 2026 turnout or votes.

Two margins are reported for every county and statewide:

\[
M_{2c} = 100 \times \frac{U_K-U_D}{U_K+U_D}
\]

\[
M_{all} = 100 \times \frac{U_K-U_D}{U_K+U_D+U_{residual}}
\]

Positive margins favor Kotek; negative margins favor Drazan.

## Named scenarios

The JSON registry is the source of truth for all numeric assumptions. Each scenario has `probability_weight: null` and an evidence-status label.

- `equal_johnson_split_anchor` retains all 2022 Kotek and Drazan units, splits Johnson units evenly, and leaves the other bloc residual. It is an arithmetic anchor, not a central estimate.
- `drazan_transfer_stress` and `kotek_transfer_stress` apply mirrored, strongly tilted Johnson destinations with symmetric major-candidate retention.
- `drazan_relative_retention_stress` and `kotek_relative_retention_stress` combine tilted Johnson destinations with a six-point relative-retention difference. They are compound stress tests.

The equal-split anchor produces a +3.446906 normalized two-candidate margin and the unchanged +3.416846 all-input margin. The normalized margin becomes slightly smaller than the observed 2022 two-candidate margin because an equal Johnson split enlarges the synthetic major-candidate denominator without changing the Kotek-minus-Drazan unit difference.

No named sensitivity scenario is identified as “most likely.” The continuous production prior described above is separate from these deterministic scenarios; no scenario endpoint or grid cell receives a probability weight.

## Deterministic sensitivity grid

The module also evaluates a full-factorial grid over:

- Major-bloc same-candidate retention midpoint: 0.90, 0.95, 0.97
- Kotek-minus-Drazan retention gap: -0.06, -0.03, 0.00, +0.03, +0.06
- Johnson-to-major-candidate rate: 0.60, 0.75, 0.90, 1.00
- Kotek share among Johnson units going to a major candidate: 0.20 through 0.80 in 0.10 increments

Major-candidate crossover is fixed at zero in the grid. Half of the small `other_2022` bloc goes to the two major candidates, split evenly; half remains residual. These values are stress-test design choices, not measured parameters.

This produces 420 deterministic cells. The current margin envelope is -5.325 to +12.101 normalized two-candidate points. The artifact reports how many cells favor each candidate solely as an audit diagnostic. Dividing cell counts by 420 would **not** produce a win probability, because:

- the grid is unweighted;
- its spacing is a design choice;
- its endpoints are not empirical confidence bounds; and
- the parameters are correlated in real electorates but are crossed mechanically here.

The model deliberately reports no median, confidence interval, posterior interval, or win probability from this grid.

## County awareness

Every scenario and grid cell is calculated from the 36 certified county records and then summed statewide. The county artifact reports:

- all four observed source blocs;
- Johnson's share of county ballots;
- synthetic Kotek, Drazan, and residual units;
- both margin definitions;
- county winner under the scenario;
- whether the synthetic result flips the county's observed Kotek-versus-Drazan winner; and
- whether any later geographic adjustment hook was applied.

This exposes geographic leverage without pretending to observe individual transitions. In the certified data, the five counties with the largest Johnson vote totals contain 55.062310% of her statewide vote. In six counties, Johnson's vote total exceeded the absolute Kotek-Drazan county margin. Those are factual sensitivity indicators, not evidence that her voters would move as a bloc.

Current named scenarios apply the same transition matrix in every county. That is an intentional uncertainty safeguard: no validated county- or precinct-specific second-choice evidence is loaded.

## Unobserved inputs and uncertainty

The artifact explicitly records these missing quantities:

- individual second choices and major-candidate crossover rates;
- candidate-specific 2026 turnout and newly eligible voters;
- the certified complete 2026 general-election ballot;
- a validated translation from 2024 county movement to the 2026 governor electorate; and
- a validated translation from 2026 registration changes to candidate support.

The main statistical limitation is ecological inference. A county with high Johnson support and a Republican major-party margin does not establish that its Johnson voters preferred Drazan, just as a Democratic county does not establish that they preferred Kotek. The module therefore widens the disclosed sensitivity range rather than estimating unsupported county transfers.

This analysis also holds the source electorate in 2022-equivalent units. It does not model deaths, migration, newly eligible voters, turnout changes, campaign effects, national environment, incumbency, economic conditions, polling, or the final minor-party field.

## Hooks for later inputs

`CountyAdjustment` is a deliberately narrow interface for future, separately validated geography work. It can accept:

- source-bloc multipliers for Kotek, Drazan, Johnson, and other 2022 units; and
- a county-specific Johnson destination delta that moves mass between Kotek and Drazan while keeping the residual share fixed.

Every applied adjustment must carry at least one `source_id` and a documented `method`. Invalid destinations or accounting failures are rejected. Current generated artifacts pass no adjustments and report `geographic_adjustments_applied: false`.

Possible later inputs and their required guardrails are registered in `data/bridge/scenarios.json`:

- **2022 precinct results:** useful for aggregation checks and geographic heterogeneity, but never proof of individual transfer.
- **2024 county or precinct results:** require a backtested transformation before changing bridge units.
- **2026 registration and turnout:** registration is not candidate support; candidate multipliers require historical calibration.
- **Certified 2026 ballot:** required before replacing the aggregate residual with named candidate destinations.

Adding an input file alone must not activate an effect. Any transformation, coefficient, provenance requirement, and validation test must be reviewed before use.

## Artifacts

Running the analysis writes only within `data/bridge/`:

- `oregon_2022_bridge_analysis.json`: input hashes, certified observations, full named assumptions, statewide scenario outputs, input gaps, and sensitivity diagnostics.
- `oregon_2022_bridge_counties.csv`: 36 county rows for each named scenario.
- `oregon_2022_bridge_sensitivity.csv`: all 420 unweighted grid cells and their statewide accounting outputs.
- `scenarios.json`: human-reviewable assumption registry and future-input status.

The JSON has schema version `bridge-analysis.v1`; the implementation has algorithm version `county-transition-accounting.v1`.

## Reproduction and checks

Reproduce the Johnson-transfer evidence calculations and committed evidence artifact:

```bash
python3 scripts/analyze_johnson_transfer.py
```

Generate artifacts:

```bash
python3 scripts/analyze_2022_bridge.py
```

Verify that committed artifacts are byte-for-byte current without writing:

```bash
python3 scripts/analyze_2022_bridge.py --check
```

Run focused tests:

```bash
python3 -m unittest tests.test_bridge
```

The test suite verifies certified totals, matrix validity, county and statewide accounting, the equal-split arithmetic anchor, monotonic Johnson-allocation sensitivity, deterministic generation, absence of probabilistic claims, and provenance requirements for geographic hooks.

## Diagnostic integration gate

The evidence-informed continuous transfer prior is a production model input. The named county scenarios and unweighted grid must remain public diagnostics rather than forecast inputs until all of the following are true:

1. A bridge parameterization is supported by source evidence or a documented historical calibration rather than scenario choice.
2. Out-of-sample tests show that the bridge improves gubernatorial forecast accuracy or calibration.
3. County and any precinct inputs have immutable provenance and reconciliation checks.
4. Correlation with polls, approval, registration, and other fundamentals is handled so evidence is not double-counted.
5. The public methodology distinguishes certified facts, fitted parameters, judgmental bounds, and unresolved inputs.
