{
  "schema": "thefire.corrections/v0",
  "record": "correction",
  "id": "0001",
  "slug": "dissent-rate-denominator",
  "title": "The dissent rate was computed over a denominator that included non-votes",
  "status": "partially_applied",
  "status_note": "The front page and /design carry the corrected figures. /discipline does not: it is generated from twelve queries that all share the fault, and as of issue it still serves the withdrawn denominator. Rebuilding it correctly is a careful pass rather than a find-and-replace, and it was not done in the same hour as the discovery. The page now carries a banner at the top of the page itself stating the correct denominator and 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 that the withdrawn figures stay checkable against the corrected ones. This field changes when it is true.",
  "pages_applied": ["/", "/design", "/corrections", "/corrections/0001"],
  "pages_pending": ["/discipline"],
  "class": "arithmetic",
  "severity": "headline",
  "issued_utc": "2026-08-06T06:39:24Z",
  "issued_local": "2026-08-06 02:39 EDT",
  "found_by": "operator",
  "found_before_announcement": true,
  "found_by_note": "Found by re-running the query during an unrelated architecture review, before the site had been announced to anyone.",

  "snapshot": {
    "source": "local restore of the public openparliament.ca database dump",
    "sha256": "aebf367313e7caf115fb2cd564a238153556cf96310af2f08bed0fd51e34bc3f",
    "divisions_through": "2026-06-18",
    "divisions_from": "2006-05-08"
  },

  "cause": {
    "table": "bills_membervote",
    "column": "vote",
    "distribution": [
      { "code": "Y", "meaning": "yea",     "rows": 736396, "dissents": 1287 },
      { "code": "N", "meaning": "nay",     "rows": 533992, "dissents":  527 },
      { "code": "A", "meaning": "absent",  "rows": 224729, "dissents":    0 },
      { "code": "P", "meaning": "paired",  "rows":  12826, "dissents":    0 }
    ],
    "explanation": "224,729 recorded absences and 12,826 pairings are rows in bills_membervote but are not votes cast. The dissent flag is false on all 237,555 of them, which is upstream openparliament agreeing they are not votes. The published rate therefore drew its numerator from cast votes only and its denominator from cast votes plus non-votes.",
    "mislabel": "The figure was captioned 'individual votes' and 'one in every 831'. A recorded absence is not an individual vote. The denominator and the label described different populations."
  },

  "published": {
    "dissents": 1814,
    "denominator": 1507943,
    "pct": 0.1203,
    "one_in": 831
  },

  "corrected": {
    "dissents": 1814,
    "denominator": 1270388,
    "pct": 0.1428,
    "one_in": 700
  },

  "queries": {
    "diagnostic": "SELECT vote,\n       count(*)                        AS rows,\n       count(*) FILTER (WHERE dissent) AS dissents\nFROM bills_membervote\nGROUP BY vote\nORDER BY rows DESC;",
    "as_published": "SELECT count(*) FILTER (WHERE dissent) AS dissents,\n       count(*)                        AS denominator,\n       round(100.0 * count(*) FILTER (WHERE dissent) / count(*), 4) AS pct\nFROM bills_membervote;",
    "corrected": "SELECT count(*) FILTER (WHERE dissent) AS dissents,\n       count(*)                        AS denominator,\n       round(100.0 * count(*) FILTER (WHERE dissent) / count(*), 4) AS pct\nFROM bills_membervote\nWHERE vote IN ('Y', 'N');   -- exclude 'A' (absent) and 'P' (paired)"
  },

  "downstream": [
    { "subject": "All members",                  "published_pct": 0.120, "corrected_pct": 0.143, "nonvote_pct": 15.75 },
    { "subject": "Conservative Party of Canada", "published_pct": 0.140, "corrected_pct": 0.163, "nonvote_pct": 13.80 },
    { "subject": "Liberal Party of Canada",      "published_pct": 0.137, "corrected_pct": 0.162, "nonvote_pct": 15.54 },
    { "subject": "New Democratic Party",         "published_pct": 0.054, "corrected_pct": 0.067, "nonvote_pct": 19.14 },
    { "subject": "Bloc Quebecois",               "published_pct": 0.022, "corrected_pct": 0.026, "nonvote_pct": 15.16 },
    { "subject": "Nathaniel Erskine-Smith",      "published_pct": 2.713, "corrected_pct": 3.363, "nonvote_pct": 19.32 }
  ],
  "downstream_note": "nonvote_pct is codes A and P together as a share of all rows for that subject. It is not an attendance record: A covers every reason a member was not in the chamber, including illness, bereavement, parental leave, committee travel and ministerial duty, and the source does not distinguish between them.",

  "erased_finding": "Under the published figures the Conservative caucus read as measurably more independent than the Liberal caucus — 0.140 against 0.137. Corrected, it is 0.163 against 0.162, which is a dead heat. The arithmetic error was silently converting a difference in attendance into an apparent difference in independence, in the direction of one party.",

  "ranking_effect": {
    "population": "members with at least 500 cast votes",
    "population_n": 762,
    "cutoff_note": "The 500-cast-vote floor is our cutoff, not the record's. A different floor gives a different table.",
    "members_changing_rank": 397,
    "largest_move_within_corrected_top_50": 73,
    "top_five_unchanged": true,
    "examples": [
      { "name": "Nicola Di Iorio", "rank_published": 108, "rank_corrected": 35, "dissents": 3, "nonvote_pct": 50.2 },
      { "name": "Lisa Raitt",      "rank_published": 107, "rank_corrected": 49, "dissents": 7, "nonvote_pct": 43.6 },
      { "name": "Anthony Rota",    "rank_published":  83, "rank_corrected": 31, "dissents": 9, "nonvote_pct": 44.9 },
      { "name": "Jim Karygiannis", "rank_published":  10, "rank_corrected":  6 },
      { "name": "Michael Chong",   "rank_published":  11, "rank_corrected":  8 },
      { "name": "Terence Young",   "rank_published":   7, "rank_corrected": 10 }
    ],
    "note": "An earlier draft of this record claimed the ranking was unaffected, reasoning that the correction is close to a common factor. That was asserted rather than checked, and it is false: members are not absent at the same rate as each other, so the inflation was never uniform. Anthony Rota was Speaker from 2019 to 2023 and a Speaker votes only to break a tie — in 2020, 2021 and 2022 every one of his rows is a non-vote. The old denominator was penalising members for not being in the room, inside a statistic about what they did when they were."
  },

  "near_miss": "The first draft of the downstream table used code A alone for the party rows and A plus P for the total row, under a single heading reading 'absence rate' — two definitions under one label, which is the identical mistake this correction is about. Caught before publication. Recorded because a corrections page that only admits the errors that escaped is not being honest about how errors work.",

  "unaffected": [
    "1,814 — the count of votes cast against one's own caucus. Numerator unchanged.",
    "4,116 of 4,654 — divisions with zero dissent. A count of divisions, not of votes.",
    "1,002 — members with at least one recorded vote.",
    "2006-05-08 to 2026-06-18 — the covered range.",
    "The snapshot hash. The record did not move; the arithmetic over it did."
  ],

  "pages_affected": ["/", "/design", "/discipline"],
  "pages_affected_note": "/design was found last, and only by grepping every page for the withdrawn figures rather than by remembering. It carries real numbers as type specimens because the design system forbids lorem ipsum in a specimen \u2014 which means the design page inherits every arithmetic error the data has. Its party table also inherited the same fault independently: 591,840 Conservative 'votes' was cast plus non-cast, giving 1 in 712 where the corrected figure is 510,183 and 1 in 614.",
  "pages_checked_unaffected": [
    {
      "page": "/beaches-east-york",
      "reason": "Publishes six counts and no rate: 1,492 Yea and 679 Nay cast, 417 did not vote and 103 paired, 2,691 recorded positions, 73 flagged dissents. No denominator was ever formed on this page, so there was nothing to form it wrongly.",
      "note": "An earlier draft of this record listed it as affected. It also already carried the sentence this correction is about \u2014 'Only Yea and Nay ballots can be flagged \u2014 an absence or a paired vote never is.' The distinction 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."
    }
  ],

  "issued_by": {
    "agent": "\u2460",
    "agent_note": "an autonomous agent operating on the maintainer's own infrastructure, under instruction",
    "model_self_reported": "claude-opus-5",
    "model_vendor": "Anthropic",
    "model_configured": "claude-opus-5[1m]",
    "harness": "Claude Code / Agent SDK 0.2.39",
    "role": "identified the error, ran all three queries against the snapshot, drafted this record",
    "human": "Daniel Colin James",
    "human_role": "reviewed and published",
    "attestation": "Self-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."
  },

  "notarization": {
    "anchored": false,
    "chain": null,
    "frozen": false,
    "frozen_note": "This file was revised repeatedly within the hour of issue as errors inside the record itself were found and fixed: the mixed-definition absence column, the false claim of ranking stability, the incorrect inclusion of /beaches-east-york among affected pages. Its hash is therefore not yet stable, and each revision superseded the one printed on the rendering before it. It freezes when the site is announced; after that, a changed hash is itself a correction.",
    "note": "This file is the record; the HTML at /corrections/0001 is a rendering of it. Its identity is the sha256 of these bytes exactly as served. Anchoring the hash later would prove the record existed no later than the anchor. It would not prove the record existed on the issue date above. That weaker claim is the honest one and it is the only one this file makes."
  }
}
