Generalized from the first Town Audit review (Boonton Town, NJ, September 2026). The same ten steps run for every municipality. Scripts in tools/civic-audit/ automate the mechanical parts; judgment, certification, and publication stay human.
Identify the municipality and the school district as separate entities. Exclude records from any same-named municipality (Boonton Town is not Boonton Township; Morris Township is not Morristown). Record the exclusion explicitly. Verify the registry row against the NJDOE school directory before citing it: district name, NJDOE district code, grade span, and any sending/receiving relationship.
Script: audit.py init --town "<Name>" scaffolds the audit directory and writes the town profile plus a source checklist.
Every figure inherited from earlier research is a [LEAD] until it is independently re-checked against an original document. Leads that cannot be verified stay labeled as leads; they are never repeated as facts.
ACFRs, AMRs, adopted budgets, budget advertisements, User-Friendly Budgets, resolutions, official statements, NJDOE files, and Census data, used directly. For every file: source URL or custodian, retrieval date, file hash, and the page / exhibit / table / section behind each cited figure. A derivative never overwrites or masquerades as an original.
Budget totals, bridges, percentages, and trends are recomputed from the source documents. Run these deterministic controls before writing findings:
check-budget). A municipal budget mustbalance, so whichever revenue-sheet column totals the Sheet 3 appropriation total is the budget year. In Boonton, the 2024-2026 revenue sheets were transposed (budget-year figures in the second column, opposite the printed headings), while the appropriation sheets followed their headings. Never assume a uniform rule; arbitrate sheet by sheet, and tie every figure to its own year's document with a provenance note.
levy). Shares must sum to 100%. Keep the two"school share" concepts separate: the school share of the property-tax levy vs. property taxes as a share of school General Fund revenue.
fund-bridge). Internal transfers are eliminated onlyin consolidated totals; the fund-by-fund bridge is retained.
real). Report nominal and real figuresside by side; state the deflator and its limitations.
reproduce the adjacent year's adopted column. A break is a signal to re-read, not to smooth over.
The adoption resolution is where real adjustments appear (in Boonton: +$231,571, including a $984,178 health-care adjustment). Always verify the final adopted version.
[DOC] = stated in a cited original document. [CALC] = researcher's arithmetic on cited figures, inputs shown. [INT] = interpretation, flagged. [LEAD] = inherited and unverified. [GAP] = not found in available online records. "Not found online" is never "withheld," "denied," or nonexistent.
Status: open / partially corrected / corrected with evidence / superseded / not verifiable from available records. Give a confidence level (high / medium / low / open) per claim. A corrective-action plan adoption alone does not prove correction; implementation evidence does. No finding is evidence of missing money unless a cited document says so.
Build a contracts register from award records: awards, bid results, professional-service appointments, change orders. Screen for concentration, repeat awards, threshold clustering, change orders, bidder counts, and non-fair-and-open compliance. Without vendor-payment, invoice, purchase-order, proposal, evaluation-sheet, executed-contract, or bid-tab data, no duplicate-payment, invoice-matching, or true conflict screening can run. Say so explicitly. Continuity and reappointment are lawful and normal; they are not evidence of favoritism.
Officials are named only in their official capacity, from public records. No home addresses, personal phones/emails, private family details, or non-public information. A family relationship counts only if disclosed in an official public record; shared surnames are name-match leads, never findings. A donation, repeat award, shared history, or affiliation is not evidence of favoritism by itself. "No public evidence found" is never stated as "no connections exist." Screening leads are kept out of published results.
Each gap gets a bounded request: date range, exact records, preferred format. Scripts render the bundles (audit.py opra), but OPRA is assisted, never autonomous: certification and submission are human acts. Standing rules: maximum authorized cost $0; digital/electronic records only. Transaction-level testing (duplicate payments, three-way matching, approval completeness, late payments, stale commitments, year-end spikes, vendor concentration, change orders, bid splitting, deposit timing) runs only after the underlying exports are fulfilled, per the executable test plan in the records-request drafts.
Named or high-severity findings require controlled review. Right of reply applies as a standard step before publication, for every town audit (templates: right-of-reply-record.md for the record, right-of-reply-checklist.md for the gate):
only: the neutral claim, the evidence summary, the specific points on which a response is invited, and a bounded response window (default 14 days).
date and time, method, recipient endpoint, external reference. Preparing a document and sending it are different acts.
the responder's own artifact. If the window closes with nothing recorded, the record says only No response recorded. Silence is silence: never declined to rebut, did not dispute, or conceded.
and the residual limitations, and what changed in the report.
complete and every response is reassessed, with a date and an evidence reference per checklist line.
Published results carry methods, sources, limitations, and the evidence-vs-inference distinction. Every open item goes on a monitoring watchlist with the exact evidence that would resolve it and a re-check date. A watchlist item closes only on cited evidence, never on elapsed time. Quarterly: minutes sweeps, watchlist triage, threshold check, ELEC/ethics in election quarters, annual deep checks.
| Scripts do | Humans do |
|---|---|
| Scaffold audits, checklists, report shells | Verify entity identity and registry rows |
| Reconciliation arithmetic and controls | Judge what a figure means |
| Render OPRA bundle drafts | Certify and submit OPRA requests |
| Render watchlist and report skeletons | Decide what publishes; grant right of reply |
| Enforce claim labels in templates | Own every published sentence |
check-budget encodes the arbitration.
correction history visible instead of silently editing.