How these records are built
Source
Votes are extracted automatically from the official City Council minutes (PDF). Each record links to the page it came from.
Named positions
Minutes usually record the tally (“8 yeas, 1 nay”) and name only the members in the minority. Everyone else is shown as “not individually listed”, never as an assumed yes.
“On a motion made by Councilor Canuel and seconded by Councilor Pereira, it was voted 2 yeas, 7 nays, that the proposed ordinance be granted leave to withdraw, with Councilors Canuel and Pereira voting in the affirmative, and the motion failed to carry.”
2–7 2 yeas, 7 nays Pereira and Canuel: named yes. The others: not individually listed. Minutes p. 5
Unanimous votes
Most council decisions are recorded simply as passing “unanimously.” That tells you nobody objected. It doesn’t say who was in the room when that motion came up.
Councilors arrive late, step out, and leave early; our attendance comes only from the opening roll call. So when a motion is unanimous, a councilor’s record shows Unanimous · not named instead of a yes. These votes count toward a councilor’s motions, but never toward their named yes or no totals, and they appear under “Not named” in the position filter. If the minutes do name a member on a unanimous motion (for example, recording an abstention or recusal), we show that recorded position instead.
Attendance
Attendance is measured against verified roll calls. Meetings we couldn’t verify are shown alongside it, never counted as absences.
Meetings held counts the City Council meetings in the selected date range whose minutes we have and where the councilor was seated: named in that meeting’s roll call or on any of its votes. It can’t include meetings whose minutes haven’t been published or that we couldn’t process (listed under Coverage & known gaps).
For each of those meetings we read the opening roll call. A meeting is verified when the councilor’s present/absent record passed our source check or review; that does not necessarily mean someone visually checked the PDF. Attendance is present divided by verified meetings. Meetings we couldn’t verify (no record, an unclear scan, or a record held for review) are shown separately and never counted as absences. Roll calls to check lists every one, with a link to the page of the minutes, so anyone can check it and send a correction. Opening attendance does not measure time spent in a meeting. The procedural toggle does not change attendance.
Coverage, errors & known gaps
- Documents indexed
- 153
- Published motions
- 3,546
- Motions held for review
- 82
- Documents with review flags
- 112
- Attendance records held
- 849
- Documents without a linked video
- 151
53 documents have held motions; 102 have held attendance. These groups overlap. A flagged record is excluded from public statistics while it awaits review; the rest of its document may still be published. A flag is not a confirmed error, and passing a check is not proof of accuracy or human review.
Known documents not yet indexed
Our archive inventory checked Oct 4, 2026, 12:58 PM Eastern identified 132 PDFs from November 2021 onward, all attempted, plus one Word document. This is a dated inventory—not a guarantee that every meeting or later upload has been found.
0 unresolved PDF processing failures · 1 Word document awaiting processing. Entries below are removed when a matching source is indexed.
| Meeting date | Format | Why it is missing |
|---|---|---|
| Apr 11, 2023 | DOCX | Word document awaits separate processing; not indexed. |
Why motions are held
| Reason | Motions |
|---|---|
| Source excerpt not found on cited pages | 34 |
| Joint-body motions and council-only roster require operator review | 15 |
| Session type disagrees with inventory | 13 |
| Named evidence missing or mismatched | 9 |
| Procedural classification disagreement | 6 |
| Individual position wording not recognized | 5 |
| Meeting date disagrees with inventory | 5 |
| Councilor identity requires review before publishing | 2 |
| Candidate election needs a different ballot representation | 1 |
| Unresolved explicit absence in motion | 1 |
What these numbers cannot tell you
The total number of errors or omitted votes is unknown. We have not manually checked every motion against every page and recording. The model can miss a motion entirely, mix up names, or accept incorrect OCR text without raising a flag. Councilor identities are matched to the historical roster below, with known aliases consolidated. That does not certify every attribution; totals may change as records are reviewed.
3,183 published motions have no named individual Yes/No ballots in our index. That is missing attribution, not evidence that no vote occurred. We do not fill gaps by assigning an unnamed majority or a unanimous result to individual councilors. Missing minutes, held records, and missing video links can all limit coverage.
From minutes to searchable records
- Find and preserve the source. We collect official City Council minutes from the city website and archive the original PDF with its source URL and a file fingerprint. Attached agendas and supporting documents are not themselves proof that a vote occurred.
- Read each page. Minutes indexed before October 2026 were read on our own computer: we first extract text already embedded in the PDF, and if a page has very little (fewer than 50 characters), we recognize the printed words with OCR (optical character recognition). That reader flattens the page layout into a single stream of text, which can mix up two-column lists such as the opening roll call. New minutes are read with a layout-aware OCR service (Firecrawl) that keeps columns and lists apart; some older roll calls were re-checked with it as well. Any OCR can misread names, numbers, and punctuation, and an existing PDF text layer can be faulty. Page numbers are always retained.
- Turn text into structured data. An AI model reads the page-numbered text and produces structured JSON: meeting details, motions, issues, recorded outcomes and tallies, procedural classifications, explicitly named individual positions, and opening attendance. Issue labels and classifications are generated interpretations; source excerpts are retained separately.
- Check and flag. Code checks page references, matching excerpts, supported position wording, and tally consistency where possible. A second AI pass looks for omissions and attribution problems. Both passes currently read the same extracted text—not an independent visual inspection—so they can share mistakes. Flagged records remain out of public results until resolved; some clear wording issues can be resolved by tested rules, while others require operator review.
- Store and report. Original files and extraction artifacts are stored in R2; structured records are indexed in D1 for search, filters, meeting tables, and councilor statistics. Page views query stored records, rather than rerunning OCR or AI. Corrections retain an audit history, and operational reports, warnings, and errors go to our existing Slack channel.
Historical councilor identities
The site’s historical roster was supplied and approved by the project operator on October 4, 2026. Titles, known name variants, and source-checked OCR misspellings resolve to one profile per person. Original excerpts remain unchanged. Unrecognized names and conflicting identities stop an import for review rather than creating another public profile.
These service ranges retain the year or month precision supplied to us; exact transition days are not verified. They are a consistency check—not proof of attendance or an individual vote. “Present” means as of the roster review date. Correcting an identity does not automatically publish its held records.
| Councilor | Service | Other recorded names |
|---|---|---|
| Shawn E. Cadime | 2021–present | — |
| Joseph D. Camara | 2022–present | — |
| Michael G. Canuel | 2026–present | — |
| Michelle M. Dionne | 2021–present | — |
| Paul B. Hart | 2024–present | — |
| Bradford L. Kilby | 2021–2025 | — |
| Pamela S. Laliberte | 2021–2023 | Pam Laliberte-Lebeau / Pamela S. Laliberte-Lebeau / Pamela Laliberte-Lebeau |
| Trott Lee | 2021–June 2022 | — |
| Christopher M. Peckham, Sr. | 2021; returned in 2026 | Christopher M. Peckham |
| Leo O. Pelletier | 2021–2023 | — |
| Linda M. Pereira | 2021–present | — |
| Cliff A. Ponte | 2021; returned 2024–present | Cliff Ponte |
| Andrew J. Raposo | 2022–present | — |
| Laura-Jean Washington | June 2022–April 2025 | Laura-Jean Sampson |
| Ricky T. Tith | April/May 2025–December 2025 | — |
How statistics are calculated
More than four in five council decisions are recorded as unanimous, so comparing councilors on every motion mostly measures how many meetings they attended. The councilor directory and profiles compare them on split votes instead: published decisions with recorded nays, or with a member named as voting no, in the selected date range and procedural setting. A split vote counts toward a councilor if they were seated for that meeting and the minutes don’t name them as absent.
In the minority counts the split votes where the minutes name the councilor on the losing side: voting no on a motion that carried (passed, referred, tabled, or withdrawn), or yes on a motion that failed. The minority rate is that count divided by their split votes, shown only once a councilor has at least 20 split votes. The minutes usually name only the losing side, so a councilor not named on a split vote is not counted either way; we never infer a personal yes or no from a tally.
Decisions on a profile is every published motion while the councilor was seated, with the share decided unanimously. A unanimous result is not an inferred personal Yes (see Unanimous votes).
On the votes page, Notable is a default view, not a ranking: split votes, failed motions, contracts, and ordinances at final passage (second reading or ordination). It is a mechanical rule applied to the indexed data and can miss decisions that matter to you. Searching or filtering by councilor, subject, or outcome switches to all decisions, and All decisions is always one click away.
Substantive decisions are shown by default. Procedural votes handle meeting business such as taking items out of order, suspending rules, or adjourning. Classification can be disputed and is subject to review. Votes for competing candidates are not automatically treated as Yes/No ballots.
Attendance source documents (62)
These documents contain at least one usable opening-attendance record, not necessarily a fully verified roster. All dates are shown here, regardless of directory filters.
- Sep 8, 2026 · minutes, page 1 · Meeting video
- Aug 11, 2026 · minutes, page 1 · Meeting records
- Jul 28, 2026 · minutes, page 1 · Meeting records
- Jul 14, 2026 · minutes, page 1 · Meeting records
- Jun 30, 2026 · minutes, page 1 · Meeting records
- Jun 23, 2026 · minutes, page 1 · Meeting records
- Jun 9, 2026 · minutes, page 1 · Meeting records
- Jun 3, 2026 · minutes, page 1 · Meeting records
- May 26, 2026 · minutes, page 1 · Meeting records
- May 19, 2026 · minutes, page 1 · Meeting records
- May 12, 2026 · minutes, page 1 · Meeting records
- Apr 28, 2026 · minutes, page 1 · Meeting records
- Apr 14, 2026 · minutes, page 1 · Meeting records
- Mar 24, 2026 · minutes, page 1 · Meeting records
- Mar 10, 2026 · minutes, page 1 · Meeting records
- Feb 10, 2026 · minutes, page 1 · Meeting records
- Jan 27, 2026 · minutes, page 1 · Meeting records
- Jan 13, 2026 · minutes, page 1 · Meeting records
- Dec 23, 2025 · minutes, page 1 · Meeting records
- Dec 9, 2025 · minutes, page 1 · Meeting records
- Oct 28, 2025 · minutes, page 1 · Meeting records
- Oct 14, 2025 · minutes, page 1 · Meeting records
- Oct 14, 2025 · minutes, page 1 · Meeting records
- Sep 23, 2025 · minutes, page 1 · Meeting records
- Sep 9, 2025 · minutes, page 1 · Meeting records
- Aug 12, 2025 · minutes, page 1 · Meeting records
- Jul 15, 2025 · minutes, page 1 · Meeting records
- Jun 24, 2025 · minutes, page 1 · Meeting records
- Jun 17, 2025 · minutes, page 1 · Meeting records
- Jun 4, 2025 · minutes, page 1 · Meeting records
- Feb 25, 2025 · minutes, page 1 · Meeting records
- Feb 11, 2025 · minutes, page 1 · Meeting records
- Dec 17, 2024 · minutes, page 1 · Meeting records
- Nov 19, 2024 · minutes, page 1 · Meeting records
- Nov 5, 2024 · minutes, page 1 · Meeting records
- Oct 22, 2024 · minutes, page 1 · Meeting records
- Oct 8, 2024 · minutes, page 1 · Meeting records
- Sep 24, 2024 · minutes, page 1 · Meeting records
- Aug 22, 2024 · minutes, page 1 · Meeting records
- May 14, 2024 · minutes, page 1 · Meeting records
- Mar 12, 2024 · minutes, page 1 · Meeting records
- Feb 15, 2024 · minutes, page 1 · Meeting records
- Jan 9, 2024 · minutes, page 1 · Meeting records
- Sep 12, 2023 · minutes, page 1 · Meeting records
- Jul 18, 2023 · minutes, page 1 · Meeting records
- Jun 6, 2023 · minutes, page 1 · Meeting records
- May 30, 2023 · minutes, page 1 · Meeting records
- May 16, 2023 · minutes, page 1 · Meeting records
- Mar 28, 2023 · minutes, page 1 · Meeting records
- Jan 24, 2023 · minutes, page 1 · Meeting records
- Jan 10, 2023 · minutes, page 1 · Meeting records
- Jan 3, 2023 · minutes, page 1 · Meeting records
- Nov 22, 2022 · minutes, page 1 · Meeting records
- Jun 14, 2022 · minutes, page 1 · Meeting records
- Jun 6, 2022 · minutes, page 1 · Meeting records
- Mar 22, 2022 · minutes, page 1 · Meeting records
- Mar 8, 2022 · minutes, page 1 · Meeting records
- Feb 22, 2022 · minutes, page 1 · Meeting records
- Feb 15, 2022 · minutes, page 1 · Meeting records
- Jan 3, 2022 · minutes, page 1 · Meeting records
- Nov 30, 2021 · minutes, page 1 · Meeting records
- Nov 16, 2021 · minutes, page 1 · Meeting records
Verify a result or report a correction
Follow a vote’s page link to the cited page of the minutes. Read the surrounding motion, amendments, and recorded outcome—not just the overall tally. Follow the meeting link to watch the recording where available; a vote-specific timestamp may not be available.
If you find a discrepancy, use Report an error on the minutes page (mark the spot and describe the problem), use Report it on the meeting page where available, or email a correction. Include the meeting date, motion, PDF page, video timestamp if known, and what you believe should change. A missing individual vote should remain unassigned unless the source explicitly supports it.