# Ohio, redrawn

A reproducible, neutral comparison of the March 2, 2022 congressional plan and the October 31, 2025 adopted plan first used in the 2026 election cycle. Built locally for Esshan's portfolio review. **This is an AI-assisted working project, not a claim of independent student research or public impact.**

## Verified findings

| Measure | Reproduced result |
|---|---:|
| Common 2020 Census blocks | 276,428 |
| Ohio 2020 population | 11,799,448 |
| Population in reassigned blocks | **1,478,290 (12.53%)** |
| Reassigned blocks, including zero-population blocks | 47,697 |
| Reassigned Census land area | 24,737.632802 km² (23.38%) |
| Counties split across populated district pieces | 14 → 15 |
| Census places split across populated district pieces | 41 → 55 |
| Largest minus smallest district population, each plan | 1 person |

An optimal one-to-one population-overlap matching pairs every old district with the same-numbered new district. The calculation does not assume this in advance. These are **2020 Census counts assigned to changing boundaries**, not present-day residents, registered voters, or people who moved. No precinct-vote interpolation or election predictions are used.

The sources are the [Ohio Secretary of State map catalog](https://www.ohiosos.gov/elections/district-maps), the [commission's adopted 2022 plan archive](https://archive.redistricting.ohio.gov/maps), the [commission's 2025 adopted-plan catalog](https://redistricting.ohio.gov/maps), and official Census downloads. See [source provenance](docs/sources.md), [checksums](data/manifest.json), and [methods](docs/methods.md).

## Open the explorer

Open `outputs/explorer.html` directly in a browser; it works offline. Or, from this directory:

```sh
python3 -m http.server 8766 --bind 127.0.0.1
```

Then visit <http://127.0.0.1:8766/outputs/explorer.html>. Keep the server bound to loopback and stop it with Ctrl+C. No website has been deployed. Local downloaded tables sit alongside the explorer, so retain that folder when moving it.

## Reproduce

Tested with Python 3.9 on macOS ARM64. Dependencies are pinned in `requirements.txt`; other Python/OS versions may need compatible wheels.

```sh
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python src/fetch.py
.venv/bin/python src/analyze.py
.venv/bin/python src/geometry.py
.venv/bin/python src/explorer.py
.venv/bin/python -m unittest discover -s tests -v
```

Original inputs are present in the build workspace (about 339 MB), but excluded from the small private-review ZIP. `fetch.py` restores missing files from official URLs and requires identical SHA-256 hashes. It does not bypass a denial or replace a changed source. The geometry stage can take a few minutes and uses appreciable memory; keep at least several GB free. Run commands in order; stop on errors rather than treating old outputs as a successful new run.

`src/build.py` provides the same analysis → geometry → explorer → tests sequence, with a run-status marker and output checksums. Run `.venv/bin/python src/build.py`. A successful marker is `outputs/build-status.json` with `status: complete`; an interrupted build has `status: running` or `failed` and must be rerun before review.

## Project layout

| Folder | Purpose |
|---|---|
| `src/` | Download verification, analysis, geometry, explorer, build runner |
| `tests/` | Counterexamples and independent aggregate reconciliation |
| `data/raw/` | Unmodified official downloads; not committed |
| `data/processed/` | Derived block joins and exact reconstructed polygons |
| `outputs/` | Explorer, aggregate CSVs, simplified GeoJSON, summary, checks |
| `docs/` | Methods, sources, code guide, review checkpoints, feedback plan |

This independent source folder follows the requested README/src/tests/outputs/docs pattern. Other three portfolio projects were not available in this workspace, so cross-project compatibility beyond the folder convention has not been verified. No commits, pushes, outreach, deployment, credentials, or voter/person-level data collection occurred.

## Start your review

Read [the beginner code guide](docs/code-guide.md), work through [Esshan's checkpoints](docs/review-checkpoints.md), and record your actual contributions in [the contribution log](docs/contributions.md). A [private feedback plan](docs/feedback-plan.md) is proposed only; no one has been contacted.

Remaining review decisions: confirm the Census-place community proxy, review map reconstruction against the official PDFs, decide which story you can personally explain, and review redistribution terms before any later public release. The direct Secretary of State SHAPE/XLSX endpoints returned 403. Commission assignments are used instead; no claim is made that their bytes equal the inaccessible SoS copies or that reconstructed geometry is identical to the inaccessible SHAPE files.
