# Cook County over-assessment target lists — 2026 roll

Built 2026-08-20. Cook County Board of Review filing closes **September 1, 2026**.

Every row is computed from the **2026 assessed values** published by the Cook
County Assessor (Socrata dataset `uzyt-m557`). Every row carries a
`value_roll_year` column stating which roll its value came from. In these seven
townships that value is `2026` on 100% of rows — nothing here is computed off a
prior year.

## What these lists claim

Illinois is a **uniformity** jurisdiction. A residential Board of Review appeal
does not argue market value; it argues that comparable properties are assessed
lower than the subject. The evidence of record is therefore the comparables'
**assessed values**, presented as assessed value per square foot of building
area. Columns are labelled accordingly. Nothing in these files is a market-value
opinion.

`implied_market_value_*` columns are the assessed value multiplied by 10 — the
Assessor's own published convention for residential property (residential AV is
10% of the Assessor's market value), not an independent valuation by us.

## How comparables are chosen

Identical to the comparable engine in the product (`findComps`), so these
numbers are the numbers the product produces:

- same Assessor neighborhood code (`nbhd`, which is township-scoped)
- building area within ±25% of the subject
- year built within ±10 years
- assessed value ≥ $25,000, building area > 0, subject excluded
- ranked by `|Δsqft|×0.001 + |Δyear|×0.1 + (3 if property class differs)`, top 10

## Tiering

| Tier | Rule |
|------|------|
| **A** | Uniformity gap 5–50%, at least 5 comparables, comparable-cohort COD ≤ 15 |
| **B** | Shows a gap but is extreme (>50%), thin (3–4 comps), or scattered (COD > 15) |

Below a 5% gap nothing is listed — that is inside the noise of any
mass-appraisal model and not worth a filing fee.

**Why the dispersion gate matters.** We hold no view, waterfront, or location
attribute. A 5–50% band alone is not enough: the first build of this run put
Sheridan Road and Lakeside Terrace — the Lake Michigan shoreline in Kenilworth
and Winnetka — in 8 of the top 10 Tier A rows by dollar gap. Those were lakefront
houses being compared to inland houses, and the "gap" was the missing attribute,
not an assessment error.

What separates them is measurable without a view field: their comparable cohorts
are scattered. Those rows carried a comp spread of 0.75–1.27× the median against
a list-wide median of 0.29×. So Tier A additionally requires the cohort's
**coefficient of dispersion** (the standard IAAO uniformity statistic: mean
absolute deviation from the median, over the median) to be ≤ 15, which is the
IAAO acceptable band for single-family residential. A subject whose own
comparables disagree with each other by more than that is not evidence of
over-assessment — it is evidence of a heterogeneous neighbourhood, and it goes
to Tier B with the reason stated in `tier_reason`.

## Scope

Single-family and townhome classes only (202–210, 234, 278, 295, 299).
Multi-family (class 211, 2–6 apartments) and mixed commercial/residential
(class 212) are **excluded from every list** and written separately to
`cook-multifamily-mixeduse-FLAGGED.csv` — they are income property and are
appealed on different evidence.

## Results

| Township | Tier A | Tier B | Tier A assessable gap (AV) | Sqft coverage |
|---|---:|---:|---:|---:|
| Evanston | 2,536 | 299 | $23,073,106 | **56%** |
| New Trier | 4,246 | 889 | $69,266,254 | 89% |
| Norwood Park | 1,466 | 20 | $6,377,291 | 90% |
| Oak Park | 2,507 | 116 | $16,963,392 | 66% |
| River Forest | 673 | 126 | $7,883,515 | 71% |
| Riverside | 1,120 | 45 | $6,127,431 | 92% |
| Rogers Park | 1,045 | 155 | $5,151,288 | **31%** |
| **Total** | **13,593** | **1,650** | **$134,842,277** | |

Assessable gap is in assessed-value dollars. At the Assessor's 10× convention
that is roughly $1.35bn of implied market value.

## Known coverage weakness — Rogers Park and Evanston

**Rogers Park is 31% and Evanston is 56% covered on building square footage.**
The missing stock is almost entirely condominiums, which Cook records without a
recorded building area. A comparable grid cannot be built without building area,
so those parcels are silently absent from these lists.

**Read that as: the Rogers Park and Evanston lists cover single-family and
townhome stock well, and condominium stock badly.** They are not a complete
census of over-assessment in those two townships. The other five townships run
66–92% and do not carry this caveat to the same degree.

This is a data limitation, not a modelling choice, and it is not fixable from
the Assessor's published characteristics file.

## Files

- `<township>-tier-a.csv` — full Tier A list
- `<township>-tier-b.csv` — full Tier B list
- `<township>-tier-a-SAMPLE-top25.csv` — free sample, top 25 by dollar gap
- `cook-all-townships-tier-a.csv` / `-tier-b.csv` — all seven combined
- `cook-tier-a-SAMPLE-top25.csv` — county-level free sample
- `cook-multifamily-mixeduse-FLAGGED.csv` — excluded income property, kept for reference
- `_stats.json` — per-township funnel counts
- `_verification.json` — live-source verification results

## Verification

35 parcels (5 per township, spread across each list rather than taken from the
head) were re-checked against the Assessor's live endpoint on 2026-08-20:

- **35 of 35** subject assessed values match the live 2026 roll exactly
- **35 of 35** building areas match the live characteristics file
- **105 of 105** sampled comparable PINs resolve to a live 2026 value

Reproduce with `node scripts/cook-verify-lists.mjs 5`.

## One open defect, disclosed

The product's `findComps` matches comparables on neighborhood code with no
county or state predicate. Cook's 5-digit codes collide with codes in other
loaded counties — 1,028 parcels in Fulton County GA and Bexar County TX share
codes with these seven townships — so the live product can return an out-of-state
comparable for a Cook subject. **These lists are not affected**: this build
scopes the comparable pool to Cook. The application-side fix is filed separately.
