The safeguards behind every chart — what's checked automatically, what a person reviews, and where the limits are.
A budget analysis is only as trustworthy as a reader's ability to check it. Numbers about taxes and schools are easy to slant — by picking a flattering comparison, rounding in a convenient direction, or stating a conclusion more confidently than the data supports. So rather than ask you to trust the author, this project tries to make the work checkable, and to put guardrails between a draft and what gets published.
There are three layers, described below: you can find every number's origin, an automatic check refuses to let objectively wrong figures through, and the analysis was put through a deliberate effort to disprove its own conclusions. A single rule runs through all of them: the automatic checks handle plain facts; people handle the judgment calls.
Nothing on this site is a number you have to take on faith:
Before any update to this site goes live, it passes through an automatic check — a small built-in helper that re-does the math and compares the numbers against each other. Think of it like a spell-checker, but for figures instead of spelling. If it finds something objectively wrong, it stops the update until the problem is fixed. It runs on its own, so nobody has to remember to start it.
The check happens at three different moments, so a mistake would have to slip past all three to ever reach you:
The check was built around one rule: a machine should decide facts, never judgment. That rule shows up as four deliberate limits.
It stops a change only for objective, checkable problems — bad arithmetic, a figure that disagrees with its source data or with another page, a dead source link. Nothing else can stop a change.
Whether a sentence reads as slanted is an editorial call. The review can flag it for a person to look at, but it is never allowed to block publication on its own. Tone is a person's decision, not a machine's.
If a number on a page disagrees with the source document, the gate flags it for a human instead of "correcting" it automatically — because the document could be the stale side. A person decides which is right.
If anything is ever corrected as part of a review, it's limited to low-risk mechanics — an arithmetic typo, a rounding slip, a unit label, a broken link — and only when a person runs the review and the right value is unambiguous. Anything substantive goes to a human to decide.
The checker and the full list of rules it follows are kept out in the open alongside the rest of the project's files, so anyone can read exactly what it does. If you find a number it should be guarding but isn't, that's worth reporting — see below.
budget-reviewTo be concrete about what "the automatic check" is: it's a named, open-source review skill — budget-review — kept in the project repository where anyone can read every line of it. Its number-checking half is a standalone script that runs on its own — on the author's computer and automatically whenever the public site is updated — and the skill as a whole is what the AI assistant, Claude Code, follows when it helps review the site. It is deliberately split into two halves that do not mix:
check_numbers.py. It re-does the documented calculations and reconciles the numeric data series across the web pages and the source data file, and scans the spreadsheet for drift. There is no opinion in it — a number either ties out or it doesn't — and it is the only part allowed to block a change from being published.That split is the rule stated above — facts to the machine, judgment to a person — made literal: the part that can stop a change is plain code with no view of its own, and the part that has a view can only suggest. The complete skill, including the exact instructions the AI is given, is published in the repository as SKILL.md.
The most important safeguard isn't automatic. After the first draft, the analysis was put through several deliberate review passes whose job was to disprove it: a number-by-number audit (recomputing every headline from the raw figures), a "skeptical citizen" pass that worked through seventeen specific challenges a doubtful reader would raise, and a final read of the whole site as if by a political opponent looking for anything to attack. The rule throughout: when better data contradicts a flattering claim, the claim changes — not the data.
Several conclusions did not survive, and the site now reflects the corrected, less-flattering versions:
| Claim in an earlier draft | What the deeper data showed |
|---|---|
| Colchester's property tax rate is "3rd lowest of 7" nearby towns. | Once adjusted so towns at different points in their revaluation cycle are compared fairly, Colchester ranks 9th of 15 — middle of the pack, not "well below average." Both the raw and adjusted rankings are now shown. |
| Colchester has the "lowest per-capita spending" among demographic peers. | On an apples-to-apples basis across all the originally considered towns, Colchester is 4th-lowest of 15 — three towns spend less. The "lowest" framing was an artifact of which towns happened to have data; that's now disclosed. |
| A specific accusation that the schools "quietly" raised an insurance-reserve draw rate without justification. | The claim couldn't be substantiated from the source documents, so it was removed entirely rather than left as an unsupported allegation. |
| The state-aid shortfall is a single confident dollar figure. | It's now presented as a range, because the answer depends on which inflation measure you use — and the originally published figure is openly labeled the conservative end. |
| "No administrative bloat" — staffing held flat. | True at the endpoints, but the middle years saw a real (since-reversed) expansion in central-office director roles. The fuller, more nuanced picture is now shown instead of the clean headline. |
| Cheerleading phrases in the summary — "Spending is Under Control," "leading in fiscal efficiency," "disciplined fiscal management." | Removed and replaced with plain description. Reading the site as a hostile critic would made it obvious these read as advocacy, not analysis. |
A complete log of every challenge raised and how it was resolved is kept with the project — in the reviewers' notes and in a dated change log that records each correction.
Beyond catching outright errors, the analysis is built to show more than one side of a question wherever a single framing could mislead:
A chart can mislead without a single wrong number — just by where its axis starts. The rule this site follows is standard practice, and it cuts both ways:
A bar's length is how the eye reads its value, so the value axis begins at zero — starting it higher stretches a small gap into a big-looking one. Four bar charts that had begun above zero were reset to a zero baseline: the two per-capita spending comparisons and the "state ECS aid as a share of the school budget" chart on the Budget Trends page, and the Board of Education insurance chart on the Insurance page. Only the axis changed; the numbers did not.
Some charts legitimately don't start at zero. Indexed charts set every series to 100 in a base year to compare growth rates — there the reference point is 100, not 0. Time-trend lines in real dollars or percentages frame the axis to the data's own range to show the direction of a trend. In both, the axis is not a bar's height, and every value is labeled on the axis and in the hover tooltip so a reader can check the real magnitude.
The dividing line: if a bar's length stands for a quantity, the axis starts at zero; if an indexed or time-trend line is showing a rate or a direction over time, it is framed to the data and the numbers are always labeled.
Being honest about the guardrails means being honest about their gaps.
Found a number that looks wrong? Please say so. The single best check on this analysis is a resident who recomputes something and challenges it.
Email john.e.farrell@gmail.com — that's the surest way to reach the author. Every correction is recorded in the change log with the date and what changed, including the times the analysis had to walk back a conclusion it would rather have kept.