The Housing Audit

We rebuilt eight years of Berkeley's housing-completion record from raw public permits — independently of the city's official filings — then examined every line of disagreement between the two records. This page is what we found.

As of 2026-07-03i · baseline reconciliation_baseline_2026-07-03i.json · berkeleybuild.com

4,229
units completed 2018–2025
(our independent count, from raw permits)
4,099
the city's record, adjudicated
(state database + city PDF filings, per-row)
+130
difference — every unit named
(see the table below)
The claim this page makes: not that our number is bigger or smaller — that zero rows remain unexplained, in either direction. Each unit of difference is attributed to a specific building, with the evidence. Two independent reconstructions of the same eight years, disagreeing only where one record is demonstrably incomplete — and the receipts say which.

Why two "city" numbers?

The state's public database (HCD/CKAN) says Berkeley completed 4,022 units. But we checked that database against the city's own published PDF filings, year by year, row by row — and the state copy drops real completions the city filed (an entire 44-unit building among them) and inflates others. The adjudicated figure of 4,099 is the per-row union: state database, corrected by the city's own documents. The recent years (2022, 2024, 2025) reconcile perfectly; the mess lives in the early filings.

What the audit caught — on the city's side

FindingWhat happened
The double-submissionBerkeley's CY2025 report was accidentally submitted twice to the state (474 rows where ~126 belonged); later cleaned upstream. We keep dated snapshots proving it.
A 41-unit building's completion never filed2435 San Pablo Ave (affordable co-living, completed March 2025): the city filed its building permit in 2022, then omitted the completed building's certificate from the CY2025 report.
A whole building missing from the state copyThe Overture (1812 University, 44 units) — in the city's CY2021 PDF, absent from the state database. The Den (2510 Channing) likewise, and under-counted 36 vs its actual 40.
A credit for an eliminated unit1023 Cragmont: the city counted a JADU whose own revision permit states "Proposed JADU has been eliminated."
Double-crediting mechanisms (five distinct classes)Units credited at permit issuance and again at completion; utility-meter permits re-crediting the units they serve; a zoning approval counted as a completion; the same permit credited in two consecutive years; a garage/workshop credited as a single-family dwelling.

What the audit caught — on our side

Independent verification cuts both ways, or it is worthless. The city's enumeration exposed our own largest error: our classifier deliberately parks "alteration with conversion language" for inspection, and that inspection queue went unworked — roughly 190 units of garage conversions, basement ADUs, and legalizations the city correctly credited and we initially did not. We also retracted, in writing: a mis-adjudication of the Overture (we blamed the city; the state copy was the problem), an early "the city mis-filed El Jardin" hypothesis (the city was right — 55 co-living apartments), and a phased-building demotion premised on a permit that turned out to be expired. The audit trail keeps our mistakes alongside the city's.

The remaining +130, named

DirectionWhat it is
We count, the city's record doesn't (~150u)The unfiled 41-unit certificate (2435 San Pablo); The Den's 40 (they logged 36, and the state copy dropped even that); conversions and legalizations whose completion the state copy never carried; buildings counted from their own architectural documents.
The city counts, we don't (~20u)The five error classes above (8u, with receipts); designation changes (existing units relabeled as ADUs) that create no net-new housing; a short-term-rental conversion (not permanent stock); one three-lot subdivision entitled but never built.

Watch items: the city may revise its CY2025 filing to add the missing certificate — our revision monitoring will catch it, and these numbers will converge further.

How this is possible (and how to check us)

Every count traces to a primary document: the permit's own text, the building's architectural plan set, the developer's records — never the city's report (which we use only to know which buildings to examine). Every correction lives in a versioned, public adjudication ledger (190 entries, each with its evidence), and every change appends a new timestamped baseline — nothing is ever silently edited. The entire pipeline — raw permit files to the numbers on this page — rebuilds from scratch in about twenty seconds, and re-verifies itself against the live record after every change:

JN-A (ingest) → JN-B (dedup) → JN-C (classify) → JN-F (corrections) → JN-E (reconcile)

The notebooks, the ledger, the baselines, and every audit memo — including our retractions — are in the public repository. The methods are city-agnostic; the Berkeley-specific knowledge is data files. The curriculum teaches you to do this for your own city.

Generated 2026-07-03i by scripts/v4/build_audit_page.py from the baseline and ledger — the figures on this page are derived, not typed. 4 formerly-held items resolved with document provenance; 0 items currently held.