The Fire  /  Corrections  /  0001

Correction 0001 · issued 2026-08-06 · applied

One in 700,
not one in 831.

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

Issued2026-08-06 02:39 EDT  ·  06:39:24 UTC
StatusPartially applied The front page and /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.
ClassArithmetic. A denominator that did not match its own label.
SeverityHeadline. The figure appeared on the front page.
Found byThe operator, by re-running the query During an unrelated architecture review, before the site had been announced to anyone. Nobody reported this.
Pages affected/  ·  /design  ·  /discipline The first two are rebuilt. /discipline is not. Not /beaches-east-york — see section 08.
Snapshotaebf3673…4bc3f  ·  divisions through 2026-06-18 Unchanged. The record did not move. The arithmetic over it did.

02 — What was published, and what is correct

Same numerator. Wrong denominator.

1,814 members broke with their own caucus. That count was right and is unchanged. What it was divided by was not.

Published — withdrawn 0.120% One in every 831 1,814 ÷ 1,507,943
Correct 0.143% One in every 700 1,814 ÷ 1,270,388

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

The vote column has four values, not two.

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.

CodeMeaningRowsDissentsIs it a vote?
YYea736,3961,287Yes
NNay533,992527Yes
AAbsent224,7290No
PPaired12,8260No

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

Two defensible denominators. One indefensible caption.

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.

What this establishes for later

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

Run them yourself.

Against a restore of the same dump, at the hash above, these produce exactly the numbers on this page.

The diagnostic — what is actually in the column
SELECT vote,
       count(*)                        AS rows,
       count(*) FILTER (WHERE dissent) AS dissents
FROM bills_membervote
GROUP BY vote
ORDER BY rows DESC;
Y | 736396 | 1287 N | 533992 | 527 A | 224729 | 0 P | 12826 | 0
As published — withdrawn
SELECT count(*) FILTER (WHERE dissent) AS dissents,
       count(*)                        AS denominator,
       round(100.0 * count(*) FILTER (WHERE dissent) / count(*), 4) AS pct
FROM bills_membervote;
1814 | 1507943 | 0.1203
Correct
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)
1814 | 1270388 | 0.1428

06 — Everything downstream

Every derived rate moves by the same factor.

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.

SubjectPublishedCorrectNon-votes
All members0.120%0.143%15.75%
Conservative0.140%0.163%13.80%
Liberal0.137%0.162%15.54%
New Democratic0.054%0.067%19.14%
Bloc Québécois0.022%0.026%15.16%
Nathaniel Erskine-Smith2.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.

A near miss, filed rather than hidden

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

It was manufacturing a result.

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.

0.163%Conservative was 0.140% — understated by a caucus that is absent least
0.162%Liberal was 0.137% — understated more, absent more
0.001ppThe actual gap A dead heat. There is no finding here.

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

The scope of the error, stated as narrowly as it actually is.

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 ranking is not stable under the correction.

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.

397Of 762 members change position when the denominator is corrected
73Largest move places gained, within the corrected top fifty
5Top five unchanged, in the same order
MemberWasNowDissentsNon-votes
Nicola Di Iorio10835350.2%
Lisa Raitt10749743.6%
Anthony Rota8331944.9%
Jim Karygiannis106
Michael Chong118
Terence Young710

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

Why this is on the front page and not in a changelog.

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

Who found this, and what it was.

AgentAn autonomous agent running on the maintainer's own infrastructure, under instruction. Not a third party, and not independent of this project.
Modelclaude-opus-5  ·  Anthropic
Configured asclaude-opus-5[1m]  ·  Claude Code, Agent SDK 0.2.39
DidIdentified the error, ran all three queries against the snapshot, drafted this record
HumanDaniel Colin James Reviewed and published. Responsible for it either way.
AttestationSelf-reported. Not cryptographically attested. There is at present no mechanism by which a reader can verify which model produced this text, or that a model produced it at all. It is stated because the alternative is not stating it. If a way to attest it properly appears, this line gets replaced and the replacement gets its own correction number.

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 record is the JSON. This page is a rendering of it.

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.

Schemathefire.corrections/v0
SHA-2564af31a1608d2c89190197fbd0ff8d0c542955db9401e7e055ee844feefb638fc
Verifycurl -s https://thefire.computer/corrections/0001.json | sha256sum
StabilityNot yet frozen. This hash has been superseded several times already, within the hour of issue, as errors inside the record itself were found and fixed — see sections 06, 08 and 09. It is published anyway, because a hash that first appears once a document is finished says nothing about how the document got there. It freezes when the site is announced. After that, a changed hash is itself a correction.
AnchoredNo. The hash is published now so that a future anchor can commit to bytes that already exist, with no reformatting. Anchoring later would prove this record existed no later than the anchor. It would not prove it existed on 2026-08-06. That weaker claim is the honest one, and it is the only one this file makes.