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-PWD

228 votes, not one dissent

Two years inside the board that runs Pittsburgh's water, coded from the minutes and checkable line by line.

Load-bearing claims
7
5 Established, 1 Supported, 1 Thin
Sources independently timestamped
9 / 11
2 cited sources are not fixed in a public archive.
Verification gate
Fails
Recorded run exits non-zero on 2 of 11 Wayback citations. Published saying so rather than waiting for a green light the archive has not earned.
Weakest load-bearing claim
Thin
Named in full below.

Across 24 board meetings from October 2023 through September 2025, the Pittsburgh Water board voted on 228 resolutions, was unanimous 223 times, and split zero times, authorizing more than $871 million along the way. Of those 228 resolutions, 156 drew no recorded question from any board member. Ten residents spoke to the board in two years. Every figure here is re-derived from the board's own minutes by a script anyone can run.

The Pittsburgh Water board met 24 times between October 2023 and September 2025. It voted on 228 resolutions and authorized more than $871 million. It divided on nothing.

The record was assembled by reading the board’s own minutes and coding every resolution, every recorded question, and every public comment into a dataset that ships with the story. Anyone who wants to check it runs one command. The harness re-derives each headline figure from the coded data, then rebuilds the published CSV and compares it byte for byte against the committed copy. A figure that drifts fails the build.

What the coding surfaces is not a scandal in the ordinary sense. There is no missing money here, and nothing in the record suggests any. What the record shows is an absence: 156 of 228 resolutions moved through the board without a single question entered in the minutes, while rate increases bore down on the public the board serves. Ten residents spoke across two years. Five meetings out of 24 drew any public comment at all.

The comparison to peer boards is the softest part of the piece, and it is graded accordingly below. One of the two peer documents failed to fetch when the archive was assembled, and the arithmetic the harness checks for that claim runs against a summary row rather than the underlying minutes. That gap is in the receipts rather than smoothed over.

After the baseline story ran, the board’s next meeting produced 40 questions against a two-year average of 5.46. The package records the count without claiming the cause.

What was withdrawn

An earlier draft of this work carried different numbers: 218 resolutions, 215 unanimous, $1.78 billion authorized. Those figures did not survive the coding pass and are disavowed in the package’s own fact-check rather than quietly replaced. A framing that described the unanimity streak as a one-in-6.9-billion coin-flip result was also cut, on the ground that board votes are not independent coin flips and the arithmetic implied a randomness the situation does not have.

Reading the archive

The published package carries the coded dataset, the SQLite database with the views the assertions run against, the source archive with SHA-256 hashes, and the fact-check ledger with all 18 claims and their verdicts. The state of the archive, including what is still missing from it, is set out in the reader contract at the foot of this page.

Correction,

An earlier draft of this reporting carried 218 resolutions, 215 unanimous, and $1.78 billion authorized. The coding pass returned 228, 223, and $871.25 million. The earlier figures are disavowed rather than replaced without comment.

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-PWD-01Established

Across 24 board meetings from October 2023 through September 2025, the Pittsburgh Water board voted on 228 resolutions, was unanimous on 223 of them, and split zero times.

ReceiptCoded from the board's own published minutes for all 24 meetings. The counts are re-derived twice by the package's harness, once in build.py (lines 68–71) and again as a SQL assertion against the committed database in build_db.py (line 168). Run check.py and the arithmetic reproduces or the build fails.

Breaks ifAn independent coding pass against the same 24 minutes PDFs returns a different resolution count, or surfaces a single vote in which board members divided.

MH-PWD-02Established

156 of the 228 resolutions drew no recorded question from any board member.

Receipt72 resolutions drew at least one question; 156 is the remainder. Both figures are asserted in build.py (lines 85–86) and re-asserted against the database in build_db.py (lines 169–170). The per-resolution question total reconciles to 96 attributed questions at build.py line 95.

Breaks ifThe minutes record questions the coding pass missed, such that the count of unquestioned resolutions falls materially below 156.

MH-PWD-03Established

The board authorized more than $871 million across those 24 meetings.

Receipt$871.25 million, summed from the resolution-level dollar figures in the minutes and asserted to a tolerance of ±$0.5 million at build.py line 76, then re-derived from the database view at build_db.py lines 172–173 to ±$0.01 million.

Breaks ifA resolution carrying a material dollar figure was misread or omitted from the dataset, moving the total below $871 million.

MH-PWD-04Established

Ten residents spoke to the board across the two years, and only five of the 24 meetings drew any public speaker at all.

ReceiptCounted from the public-comment sections of the minutes; asserted at build.py lines 74–75 and re-asserted in build_db.py line 169.

Breaks ifThe minutes undercount public comment against another record of the same meetings, such as video or a sign-in sheet.

MH-PWD-05Established

At the first board meeting following publication of the baseline story, board members asked 40 questions, against a two-year average of 5.46 questions per meeting.

ReceiptThe 40-question count and the 5.46 average are both asserted in build.py (lines 122–123), and the ratio of roughly seven times the average is asserted to ±0.3 at line 124. The figure describes what happened at that meeting. It does not establish why.

Breaks ifThe meeting's minutes are revised, or the question-coding rule applied to that meeting differs from the rule applied to the preceding 24.

MH-PWD-06Supported

The board chair accounted for 47 of the 131 questions asked across the two years, roughly 36 percent.

ReceiptComputable from questions_by_member.csv in the published dataset, and listed as reproducing in the package's fact-check. The soft spot is that no assertion in build.py or build_db.py gates this figure, so it rests on the dataset without the harness re-deriving it on every run.

Breaks ifRe-tallying questions_by_member.csv against the minutes attributes materially fewer than 47 questions to the chair.

MH-PWD-07Thin

Two peer water boards, taken together, were unanimous on 20 of 29 votes, against Pittsburgh Water's 223 of 223 when all members voted.

ReceiptThe 69 percent peer figure is re-derived at build.py line 114, but only from an aggregate row that was entered by hand. The two individual peer boards carry NA in the vote columns, so the harness is checking arithmetic on a summary rather than rebuilding it from the underlying minutes. One of the two peer source documents, the North Harris County minutes, failed to fetch and is not in the archive. The package's own fact-check grades this claim "recomputed, partial archive."

Breaks ifCapturing and coding the North Harris County minutes directly returns a peer unanimity rate near Pittsburgh Water's, which would remove the comparison the contrast rests on.

The honesty flag

The conclusion turns on the vote record, which is Established and re-derived twice. The weakest claim is the peer comparison (Thin): one of its two source documents is not in the archive, and the harness checks a hand-entered summary rather than rebuilding the peer counts from minutes. If that claim falls, the contrast weakens and the vote record stands untouched.

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
2023-10-27 → 2025-09-26Pittsburgh Water board (published minutes)B. NuckolsCoding of every resolution, recorded question and public comment into the dataset.
2025-11-03 → 2025-11-17Named sources (four interviews)B. NuckolsOn-record interviews; transcripts held in the package.
2025-12-02B. NuckolsPublicSourceEdit and independent fact-check prior to publication.
2026-07-14B. NuckolsPublic archiveSources hashed and snapshotted. Two failed; the failure is logged, not smoothed.

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

Archive and dataset
https://bnuckols13.github.io/pittsburgh-water-deliberation-record/
Published with
PublicSource — read the story
State of the archive
  • Four source PDFs are captured and SHA-256 hashed in the package manifest, with a .sha256 sidecar beside each file.
  • Nine of 11 sources carry a Wayback snapshot. Two do not: the board's minutes portal, and the North Harris County minutes, whose fetch failed with an HTTP error logged in the chain of custody.
  • Because of those two gaps, the package's trustless gate does not currently pass. It reports the archive as incomplete rather than waving it through, which is the behavior the gate exists to have.
  • The 24 individual Pittsburgh Water meeting-minute PDFs are cited to the board's document portal and are the next capture step.
  • Corrections ledger: nothing to correct as of this writing.
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.