Correction 0001 · issued 2026-08-06 · applied
The headline figure on this site was computed over a denominator that included recorded absences and pairings. Those are rows in the source table. They are not votes. The rate was understated by about a fifth, and the error was quietly producing a partisan finding that is not in the record.
01 — The record
/design carry the corrected figures. /discipline does not — it is generated from a set of twelve queries that all share the fault, and it is still serving the withdrawn denominator as of this writing. Rebuilding it correctly is a careful pass, not a find-and-replace, and it is not being done in the same hour as the discovery. It now carries a banner on the page itself giving the correct denominator and stating that every rate below it is understated, and it is labelled as unrebuilt wherever it is linked. It is left up rather than taken down so the withdrawn figures stay checkable against the corrected ones. This line changes when it is true.02 — What was published, and what is correct
1,814 members broke with their own caucus. That count was right and is unchanged. What it was divided by was not.
The withdrawn figure is shown at the size it was published at. A correction set in smaller type than the error is a retraction pretending to be a footnote.
03 — The cause
Every row in bills_membervote was treated as a vote. Two of the four
codes are not votes — they are the House recording that a member was not there,
or was formally paired with an absent member of another party so that neither vote counts.
| Code | Meaning | Rows | Dissents | Is it a vote? |
|---|---|---|---|---|
| Y | Yea | 736,396 | 1,287 | Yes |
| N | Nay | 533,992 | 527 | Yes |
| A | Absent | 224,729 | 0 | No |
| P | Paired | 12,826 | 0 | No |
237,555 rows — 15.8% of the table — are not votes. The
dissent flag is false on every single one of them, which is
the upstream data agreeing that they are not votes. The published figure drew its
numerator from the first two rows of that table and its denominator from all four.
04 — What was actually wrong
There is a real question you could answer with the larger denominator: of every occasion on which a member could have broken ranks, on how many did they? On that reading an absence is a way of not standing with your caucus, and counting it is arguable. It is a different question, and someone will want it asked one day.
That is not what the page said. The page said individual votes, and one in every 831. A recorded absence is not an individual vote. The denominator and the words beside it described two different populations, and the reader was given no way to tell.
There is no single neutral way to define a rate like this — there are several defensible ones, and choosing quietly is itself an editorial act. The fix here is the narrow one: make the number match its caption. The general fix is to publish every defensible definition side by side and let the spread be the finding. That page does not exist yet. This correction is the argument for building it.
05 — Both queries, in full
Against a restore of the same dump, at the hash above, these produce exactly the numbers on this page.
SELECT vote,
count(*) AS rows,
count(*) FILTER (WHERE dissent) AS dissents
FROM bills_membervote
GROUP BY vote
ORDER BY rows DESC;
SELECT count(*) FILTER (WHERE dissent) AS dissents,
count(*) AS denominator,
round(100.0 * count(*) FILTER (WHERE dissent) / count(*), 4) AS pct
FROM bills_membervote;
SELECT count(*) FILTER (WHERE dissent) AS dissents,
count(*) AS denominator,
round(100.0 * count(*) FILTER (WHERE dissent) / count(*), 4) AS pct
FROM bills_membervote
WHERE vote IN ('Y', 'N'); -- exclude 'A' (absent) and 'P' (paired)
06 — Everything downstream
The correction raises every dissent rate on the site by roughly 19%, because every one of them was divided by a denominator inflated with that party's own absences. Parties do not absent themselves at the same rate, so the shifts are not identical.
| Subject | Published | Correct | Non-votes |
|---|---|---|---|
| All members | 0.120% | 0.143% | 15.75% |
| Conservative | 0.140% | 0.163% | 13.80% |
| Liberal | 0.137% | 0.162% | 15.54% |
| New Democratic | 0.054% | 0.067% | 19.14% |
| Bloc Québécois | 0.022% | 0.026% | 15.16% |
| Nathaniel Erskine-Smith | 2.713% | 3.363% | 19.32% |
The last column is A and P together as a share of
all rows for that subject — the portion of the inflated denominator that was never
a vote. It is published here because it is the size of the error, subject by
subject. It is also, separately, a number about Parliament that nobody in Canada
currently publishes.
Read it carefully: this is not an attendance record. A covers
every reason a member was not in the chamber for a division — illness, bereavement,
parental leave, committee travel, ministerial duty abroad — and the source does not
distinguish between them. It is not offered here as a measure of diligence and should
not be read as one. It is here because it is the arithmetic.
The first draft of this table used A alone for the party rows and
A plus P for the total row, under a single heading reading
“absence rate”. Two definitions, one label — the identical mistake
this correction is about, inside the correction about it, caught before publication
rather than after. It is recorded here because a corrections page that only admits
the errors that escaped is not being honest about how errors work.
07 — The finding this erased
Read as published, the Conservative caucus broke ranks measurably more often than the Liberal caucus — 0.140% against 0.137%. That is the kind of gap a reader notices, and the kind a partisan quotes.
This is the part worth being uncomfortable about. The error was not random with respect to politics — it was mechanically converting a difference in attendance into an apparent difference in independence, in the direction of one party. Nobody chose that. It fell out of a denominator. That is precisely why the query goes on the page.
08 — What this does not change
An earlier draft of this record listed /beaches-east-york among the affected pages. It is not, and the reason is worth printing. That page publishes no rate at all — it publishes six counts, which sum: 1,492 Yea and 679 Nay cast, 417 did not vote and 103 paired not cast, 2,691 recorded positions in total. And it already carries the sentence this correction is about:
Published on /beaches-east-york, before this error was found
“Only Yea and Nay ballots can be flagged — an absence or a paired vote never is.”
The distinction was never unknown here. It was stated correctly on the page that showed its work, and dropped on the page that summarised. Publishing counts made the error impossible; publishing a single rate made it invisible. A count carries its own audit: six numbers that must sum cannot quietly disagree about what they are counting, and a reader who wants a different denominator can build one. The standing rule that counting is the product was written as an argument about scorecards. This is a second reason for it that we did not have to construct.
09 — What it does change, that was not obvious
The first draft of this page claimed the ordering of members was unaffected, on the reasoning that the correction is close to a common factor. Checked rather than assumed, that is false, and the reason is the whole point: members are not absent at the same rate as each other, so the inflation was never uniform.
| Member | Was | Now | Dissents | Non-votes |
|---|---|---|---|---|
| Nicola Di Iorio | 108 | 35 | 3 | 50.2% |
| Lisa Raitt | 107 | 49 | 7 | 43.6% |
| Anthony Rota | 83 | 31 | 9 | 44.9% |
| Jim Karygiannis | 10 | 6 | — | — |
| Michael Chong | 11 | 8 | — | — |
| Terence Young | 7 | 10 | — | — |
Members with at least 500 cast votes, ranked by dissent rate. The 500-vote floor is our cutoff, not the record's, chosen to keep members with a handful of votes out of the top of a percentage table. It is the kind of choice this project intends to publish every time rather than bury, and a different floor gives a different table.
The mechanism is visible in the first three rows. Anthony Rota was Speaker of the House from 2019 to 2023, and a Speaker votes only to break a tie — in 2020, 2021 and 2022 every single one of his rows is a non-vote. Nicola Di Iorio was recorded absent for more than half of all divisions in his time in the House, which was itself the subject of national reporting at the time. Dividing their dissents by rows that include those absences pushed all three far down a list they belong higher on. The old denominator was penalising members for not being in the room, inside a statistic that claims to be about what they did when they were.
10 — Note
Nothing here has been announced. There is no audience yet, no traffic, and no one who was misled. The cheapest available option was to fix the number silently and never mention it, and on a site with no readers that would have cost nothing at all.
The reason not to is that a project whose entire claim is arithmetic performed in public has to establish what it does when the arithmetic is wrong before anything is at stake, not after. A corrections process first used under pressure is not a process. It is a press release.
So: correction 0001 is an error found by the operator, in his own numbers, before publication, and it is filed at full size with the bad query printed beside the good one. A year from now the useful measure of this site will not be that it has no corrections. It will be how many it has, how fast they were issued, and how many were found here rather than by someone else.
One practical finding, recorded because it will matter again. /design
was the last affected page identified, and it was not identified by anyone remembering it
existed — it was found by grepping every file on the site for the string 1,507,943
after the correction was otherwise written. It carries real figures because the design system
forbids placeholder numbers in a type specimen, which means the page that documents the rules
silently inherits every arithmetic error the data has. Its party table had also formed the same
bad denominator independently: 591,840 Conservative “votes” and one in 712, where
the corrected figures are 510,183 and one in 614. Scope on the next correction gets determined
by search before it gets determined by memory.
11 — Issued by
This disclosure is not a disclaimer. The machine is going to be doing more of this work, not less, and a reader is entitled to know which parts of a public record were produced by something that does not get tired at 2am and does not have a preferred outcome — and to weigh that against the fact that it also does not understand what it is doing in the way a person would.
12 — This record
The canonical form of correction 0001 is a JSON file. Its identity is the SHA-256 of those bytes exactly as served. Everything on this page is derived from it.