The methodReceipts v1.0EJ-1CorrectionsRepublish usRSSSubscribe
MemoryHoleHesitation Media

Every claim graded, with the receipt behind it and the one thing that would prove it wrong.

Investigation · MH-IZR

The units nobody counted

Pittsburgh has argued about inclusionary zoning for six years without agreeing on how many affordable units it has produced. This is the record, rebuilt so anyone can check it.

Load-bearing claims
7
3 Established, 1 Supported, 1 Reported, 1 Thin, 1 Disputed
Sources independently timestamped
0 / 12
12 cited sources are not fixed in a public archive.
Verification gate
Not run
All 12 sources are captured and hashed, and no failing run is on record, but no passing run is on record either. The gate is reported as not run rather than assumed green from reading the code.
Weakest load-bearing claim
Disputed
Named in full below.

Six years after Pittsburgh's first inclusionary zoning district took effect, the city has published no definitive count of the affordable units the policy has produced, and both sides of the argument cite contested studies. This package compiles the project-level dataset nobody had: 35 completed IZ-attributable affordable units, 16 more under construction, and three projects documented as downsized to 19 units, one below the 20-unit trigger.

Pittsburgh passed its first inclusionary zoning district in 2019 and has argued about it ever since. The argument has a hole in the middle of it. Six years in, nobody had published a project-level count of the affordable units the policy produced, and both sides were citing studies the other side rejected.

The count, assembled here from permit and project records, is 35 completed affordable units attributable to inclusionary zoning, with 16 more under construction. Units at Sixth Ward Flats are excluded because they come through LIHTC rather than the ordinance, which is the kind of decision that moves the headline number and therefore sits in the receipts below rather than in a footnote.

Three projects appear in the record at 19 units. The threshold that triggers the affordability requirement is 20.

The dataset does not settle the economics. A study cited against the policy reports a roughly 30 percent drop in Lawrenceville construction and states in its own text that the result is not statistically significant. A competing reading disputes the method. Both documents are archived and hashed in the package, both are graded, and the claim is marked Disputed because that is what the evidence supports.

What the archive does not do

The package documents the units and the dispute. It does not resolve whether inclusionary zoning raises or lowers housing supply, and the methodology says so in those words. A reader looking for that answer will not find it here, and any account of this work that suggests otherwise is overstating it.

Reading the archive

The published package carries the project-level dataset, the parameters file, the 13-claim contested ledger with each claim’s coded verdict and what its source actually says, and the source archive with SHA-256 hashes for all 12 captured files, including a hashed capture of the published story itself. The state of the archive is set out in the reader contract at the foot of this page.

Correction,

An early draft put the income ceiling for a qualifying individual at 50 percent of area median income at roughly $28,600. The published figure is $37,600.

The 7 claims this piece carries

Each is graded, shown with the source it rests on, and marked with the one thing that would overturn it.

MH-IZR-01Established

Six years after the first inclusionary zoning district took effect, the city has published no definitive count of the affordable units the policy has produced.

ReceiptThe absence is corroborated across sides in the package's contested-claims ledger (claim C5, coded corroborated_across_sides), including by City Controller Rachael Heisler. Every claim in that ledger is required by verify.py (lines 81–86) to resolve to a source file captured and SHA-256 hashed in the archive, or the check fails.

Breaks ifThe city, or the Planning Department, publishes an itemized project-level count.

MH-IZR-02Established

Thirty-five completed, occupiable affordable units are attributable to inclusionary zoning.

ReceiptCompiled project by project from the permit and project record, and hard-asserted at build.py line 64. The number is the reason the dataset exists; if it drifts, the build stops. Units at Sixth Ward Flats are excluded as LIHTC-exempt rather than folded in, which is what keeps the figure at 35.

Breaks ifA completed project carrying IZ-attributable affordable units is absent from the dataset, or a project counted in it turns out to be exempt.

MH-IZR-03Established

Three projects are documented as downsized to 19 units, one unit below the 20-unit threshold that triggers the requirement.

ReceiptHard-asserted at build.py line 65 and documented with addresses and plan dates in the contested-claims ledger (claim C12, coded documented_with_addresses_and_plan_dates).

Breaks ifThe plan records show a project was sized at 19 units before the district applied to it, which would remove the threshold as the explanation.

MH-IZR-04Supported

Sixteen further affordable units are under construction, 16 of 159 at The Caroline.

ReceiptRe-derived from the project dataset at build.py line 45, and gated at one remove: the check rebuilds iz_summary.csv and fails on any difference from the committed file (lines 68–82). The soft spot is that no standalone assertion pins this figure the way lines 64 and 65 pin the completed count, and it rests on a single project's record.

Breaks ifThe Caroline's affordable-unit commitment changes, or the project does not complete.

MH-IZR-05Thin

A further 100 affordable units are described as in the proposed pipeline.

ReceiptThe figure comes from hearing testimony by Andrea Boykowycz and is carried in the dataset as such. The package's own summary file marks it "attributed to testimony, not itemized," and the methodology states that two of the five projects are named in the public record while three are not. The harness reproduces the number; nothing corroborates it project by project.

Breaks ifAn itemized accounting of the five projects returns materially fewer than 100 affordable units, or the three unnamed projects cannot be identified.

MH-IZR-06Disputed

Construction in Lawrenceville fell roughly 30 percent after the inclusionary zoning district took effect, from about 94 to about 66 units a year.

ReceiptThe figure comes from the Pro-Housing Pittsburgh study, archived and hashed in the package. The study itself states the result is not statistically significant, and the package codes the claim accurately_reflects_source_but_not_statistically_significant (C1). A competing reading from Lawrenceville United disputes the method outright and is coded as an unresolved methodological dispute (C3). Both sides are in the archive.

Breaks ifAn analysis controlling for the citywide construction cycle either establishes the drop as significant or removes it, which would resolve a dispute the record currently leaves open.

MH-IZR-07Reported

The income ceiling for a qualifying individual at 50 percent of area median income is $37,600.

ReceiptCarried in the parameters file with a source_id that verify.py requires to resolve to an archived, hashed document. It is not re-derived by any assertion in build.py. An early draft of this reporting used roughly $28,600; the published figure of $37,600 is the corrected one, and the correction is recorded in the package's fact-check rather than made silently.

Breaks ifThe published AMI schedule for the relevant year sets a different figure for a one-person household.

The honesty flag

The conclusion is the vacuum itself, and that claim is Established and corroborated by people on opposite sides of the argument. The weakest claim in the piece is the 100-unit proposed pipeline (Thin), which rests on hearing testimony and is not itemized. Nothing in the conclusion rests on it: if it falls, the count of what has actually been built is unaffected and the vacuum is wider, not narrower.

The reader contract

You are not asked to trust this. Every source behind the claims above was archived where it was read and fingerprinted with a SHA-256 hash, so you can confirm the copy you pull is the copy the reporting used. The dataset, the code that re-derives every figure, and the chain of custody are published in full.

How this record reached you

DateReleased byReceived byPurpose of change of custody
2019 → 2025City permit and project recordsB. NuckolsProject-level compilation of affordable units attributable to inclusionary zoning.
2025-09-10B. NuckolsPublicSourceEdit and independent fact-check prior to publication.
2025-09-10PublicSourcePublic archiveAll 12 sources captured and SHA-256 hashed, including the published story itself.

The final row is blank because the chain has not closed.

Archive and dataset
https://bnuckols13.github.io/pittsburgh-inclusionary-zoning-record/
Published with
PublicSource — read the story
State of the archive
  • All 12 sources are captured and SHA-256 hashed, including a hashed capture of the published story itself. The manifest is generated deterministically, so an unchanged archive regenerates to identical bytes and the gate diffs it.
  • Every one of the 13 contested claims is required to resolve to a captured, hashed source, and the verification script prints that count each time it runs.
  • The archive is hash-trustless but not Wayback-redundant: provenance records the origin and the local capture, and carries no public web-archive snapshots. If an origin URL rots, the hashed local copy remains and the public mirror does not.
  • Corrections ledger: no corrections recorded.
If we got something wrong
Corrections are appended, never silent, and each one has its own permanent address. See thecorrections ledger and the EJ-1 standard.

Get the next investigation

One email when a piece runs, plus the weekly wire. Every claim in it will carry its grade and the thing that would prove it wrong, the same as everything else here.

Not yet wiredNo email provider is configured, so this form is not rendered rather than shown as a control that silently does nothing. Set NEWSLETTER.endpoint in src/site.tsonce a provider is chosen.

No tracking pixels, no list sales, and one click unsubscribes without a survey.