# /finances/budget-vs-actual — EDITORIAL variance classification.
#
# This file is checked-in editorial content (spec FR-026), reviewed as a
# content change, NOT pipeline output. derive.py LOADS it; it never
# computes a classification (test_classification_loaded.py enforces this).
#
# CLASSIFICATION RULE (spec FR-006/FR-007/FR-008/FR-009; plan §"Gate
# result" resolved defaults). Applied strictly to the primary-verified
# figures in scripts/finances/budget_vs_actual/figures.yaml:
#
#   structural   — ≥3 of the line's observed years show SAME-DIRECTION
#                   variance with |variance| ≥ 5%, AND the sign does not
#                   flip across the series (a sign-flipping line is not a
#                   structural pattern — spec Edge Cases). Rationale cites
#                   the multi-year pattern with the verified percentages.
#   one-time     — a single dominant year whose cause is a NAMED event
#                   verified verbatim in a primary source (FR-007). None
#                   qualify at MVP: assigning a one-time cause requires
#                   reading the AFR MD&A/notes for that event; per the
#                   project verification rule an unverified causal label
#                   must not ship, and per spec MVP Edge Cases an honest
#                   `unclassified` is correct rather than a guess.
#   mixed        — a directional pattern AND a sign-flip / volatile
#                   component in the same line.
#   unclassified — <3 observed years (FR-009), or a real but sub-5%-in-3+-
#                   years pattern. Honest non-guess (spec: "render the
#                   classification honestly rather than guess"; the
#                   section editorially upgrades lines as evidence
#                   accumulates).
#
# Every citation is a page anchor into the primary-verified AFR figures
# (see figures.yaml `sources` for the AFR URLs + content hashes).
#
# Investment income (spec Edge Case + umbrella FR-016): explicitly
# classified `structural` — over budget 5/5 years by 24–183%. The
# rationale states plainly this is a recurring conservative-budgeting gap,
# NOT a one-time windfall, and because the underlying income is
# market-volatile it is not evidence of structural surplus health. This is
# the precise misread the page exists to reject.

classifications:
  net-municipal-taxes:
    classification: unclassified
    rationale: >-
      Over budget in 4 of 5 years (2021–2024) but the variance exceeds the
      5% materiality bar in only 2 (2022 +6.4%, 2023 +10.0%); 2020 −0.9%,
      2021 +2.1%, 2024 +3.3%. A mild conservative-budgeting lean exists but
      is below the documented structural threshold (≥3 years ≥5% same
      direction). Honestly left unclassified at MVP rather than guessed.
    citations:
      - "2020 AFR PDF p.47: budget 2,143,348 / actual 2,123,471"
      - "2024 AFR PDF p.45: budget 2,544,594 / actual 2,627,877"
  sales-of-goods-and-services:
    classification: unclassified
    rationale: >-
      Under budget all 5 years, but materially (≥5%) only in 2020 (−18.7%)
      and 2021 (−11.0%); 2022–2024 within −2.5% to −2.8%. The large early
      shortfall coincides with the pandemic service-closure years but the
      AFR MD&A causal text was not verbatim-verified, so no one-time cause
      is asserted; the post-2021 series is immaterial. Unclassified is the
      honest call at MVP.
    citations:
      - "2020 AFR PDF p.47: budget 1,391,516 / actual 1,131,088"
      - "2024 AFR PDF p.45: budget 1,377,646 / actual 1,341,457"
  government-transfers-operating:
    classification: structural
    rationale: >-
      Over budget in 4 of 5 years by ≥5% (2020 +114.1%, 2022 +61.6%, 2023
      +23.4%, 2024 +16.8%; 2021 −6.3% the only shortfall). Operating
      grants from other governments are consistently and materially
      received above the budgeted figure — a structural pattern of
      conservative budgeting for discretionary provincial/federal
      operating transfers. 2020 is an outlier-high year; the structural
      finding rests on the 2022–2024 sustained pattern, not 2020 alone.
    citations:
      - "2022 AFR PDF p.41: budget 140,991 / actual 227,830 (+61.6%)"
      - "2023 AFR PDF p.45: budget 145,324 / actual 179,306 (+23.4%)"
      - "2024 AFR PDF p.45: budget 152,909 / actual 178,613 (+16.8%)"
  investment-income:
    classification: structural
    rationale: >-
      Over budget every one of the 5 years, by a widening margin: 2020
      +23.9%, 2021 +51.8%, 2022 +51.0%, 2023 +99.1%, 2024 +183.4%. This is
      NOT a one-time 2024 windfall — it is a recurring, growing gap between
      a conservatively-set budget and realized income. Because the
      underlying income is market-volatile (bond yields, equity returns,
      portfolio rebalancing), the persistent upside must NOT be read as
      structural surplus health or treated as recurring spendable revenue
      (mirrors /finances/revenues' `volatile` stance, umbrella FR-016).
      Explicitly classified so the page cannot present it as a one-off.
    citations:
      - "2024 AFR PDF p.45: budget 110,110 / actual 312,073 (+183.4%)"
      - "2023 AFR PDF p.45: budget 110,437 / actual 219,934 (+99.1%)"
      - "2020 AFR PDF p.47: budget 82,939 / actual 102,795 (+23.9%) — over budget from the start of the series, not a 2024 event"
  fines-and-penalties:
    classification: structural
    rationale: >-
      Under budget all 5 years, materially (≥5%) in all 5: 2020 −18.1%,
      2021 −22.0%, 2022 −13.6%, 2023 −6.5%, 2024 −8.8%. A structural
      pattern of budgeting fines/penalties revenue above what is realized.
    citations:
      - "2021 AFR PDF p.45: budget 82,545 / actual 64,421 (−22.0%)"
      - "2024 AFR PDF p.45: budget 83,047 / actual 75,731 (−8.8%)"
  licences-permits-fees:
    classification: structural
    rationale: >-
      Over budget in 4 of 5 years, materially (≥5%) in 3+ same-direction
      years: 2022 +8.6%, 2023 +16.4%, 2024 +11.2% (2021 +3.3% sub-bar,
      2020 −14.5% the only shortfall). Sustained structural under-budgeting
      of licence/permit/fee revenue across 2022–2024.
    citations:
      - "2023 AFR PDF p.45: budget 115,231 / actual 134,083 (+16.4%)"
      - "2024 AFR PDF p.45: budget 138,514 / actual 153,977 (+11.2%)"
  miscellaneous-revenue:
    classification: structural
    rationale: >-
      Over budget all 5 years by very large margins (2020 +36.5%, 2021
      +84.2%, 2022 +61.6%, 2023 +44.8%, 2024 +36.1%). Residual revenue is
      structurally and substantially under-budgeted every year — a
      consistent same-direction ≥5% pattern.
    citations:
      - "2021 AFR PDF p.45: budget 28,121 / actual 51,798 (+84.2%)"
      - "2024 AFR PDF p.45: budget 32,366 / actual 44,051 (+36.1%)"
  enmax-equity-earnings:
    classification: mixed
    rationale: >-
      Directionally over budget 2020–2022 (+70.5%, +102.6%, +45.6%) then a
      hard sign-flip to large shortfalls 2023 −105.7% (an actual loss of
      15,608 vs a 275,000 budget) and 2024 −48.7%. The variance flips sign
      across the series, so it is NOT a structural pattern (spec Edge
      Cases); it is a volatile subsidiary-earnings line — optimistic in up
      years, sharply negative in down years. Classified mixed: a
      directional early lean plus a genuine volatility component.
    citations:
      - "2021 AFR PDF p.45: budget 146,000 / actual 295,777 (+102.6%)"
      - "2023 AFR PDF p.45: budget 275,000 / actual (15,608) — equity loss, −105.7%"
      - "2024 AFR PDF p.45: budget 353,000 / actual 181,248 (−48.7%)"
  developer-contributions:
    classification: structural
    rationale: >-
      Under budget all 5 years by large margins (2020 −41.4%, 2021 −49.6%,
      2022 −31.7%, 2023 −30.1%, 2024 −37.1%). Cash developer contributions
      are structurally budgeted well above what is realized — a consistent
      same-direction ≥5% pattern across the full series.
    citations:
      - "2021 AFR PDF p.45: budget 314,927 / actual 158,763 (−49.6%)"
      - "2024 AFR PDF p.45: budget 231,285 / actual 145,368 (−37.1%)"
  government-transfers-capital:
    classification: structural
    rationale: >-
      Under budget all 5 years (2020 −59.9%, 2021 −56.3%, 2022 −57.9%,
      2023 −47.7%, 2024 −10.0%). Capital grant revenue is structurally
      budgeted far above single-year realization because capital grants
      track multi-year project milestones — a known, expected timing
      pattern, not a revenue failure. Read with the capital-program
      planned-vs-actual view (single-year capital variance is normal, spec
      FR-013).
    citations:
      - "2022 AFR PDF p.41: budget 853,319 / actual 359,643 (−57.9%)"
      - "2024 AFR PDF p.45: budget 760,636 / actual 684,848 (−10.0%)"
  developer-contributions-in-kind-capital:
    classification: unclassified
    rationale: >-
      Never budgeted (the AFR prints "–" for budget every year — in-kind,
      non-cash contributions recognized on receipt). With no budget there
      is no variance to classify; rendered as "not budgeted" rather than a
      false percentage against zero (spec Edge Cases).
    citations:
      - "2024 AFR PDF p.45: budget – (not set) / actual 345,075"
  expense-planning-development:
    classification: unclassified
    rationale: >-
      Under budget all 3 observed years (2022 −1.6%, 2023 −6.9%, 2024
      −21.2%) but materially (≥5%) in only 2; the growing under-spend is
      suggestive but below the documented structural threshold. Honest
      unclassified at MVP; revisit as 2025+ accumulates.
    citations:
      - "2024 AFR PDF p.45: budget 299,794 / actual 236,089 (−21.2%)"
  expense-infrastructure:
    classification: unclassified
    rationale: >-
      Sign-flips across its 3 observed years (2022 +48.3%, 2023 +19.6%,
      2024 −6.8%) — not a same-direction pattern, and only 3 years of
      post-re-alignment history. Unclassified honestly.
    citations:
      - "2022 AFR PDF p.41: budget 265,698 / actual 394,116 (+48.3%)"
      - "2024 AFR PDF p.45: budget 260,800 / actual 243,144 (−6.8%)"
  expense-community:
    classification: unclassified
    rationale: >-
      Over budget all 3 observed years but only marginally (2022 +2.1%,
      2023 +5.8%, 2024 +1.5%) — material in only 1 year. Below the
      structural threshold; unclassified at MVP.
    citations:
      - "2024 AFR PDF p.45: budget 1,603,190 / actual 1,626,943 (+1.5%)"
  expense-operational:
    classification: structural
    rationale: >-
      Over budget all 3 observed years by very large margins (2022 +26.9%,
      2023 +37.3%, 2024 +36.4%). Operational services (transit, roads,
      water, waste) consistently and materially exceed budget — a
      structural under-budgeting pattern (≥3 years same-direction ≥5%). The
      single largest 2024 absolute variance (+$627M).
    citations:
      - "2023 AFR PDF p.45: budget 1,562,707 / actual 2,146,059 (+37.3%)"
      - "2024 AFR PDF p.45: budget 1,725,475 / actual 2,352,755 (+36.4%)"
  expense-general-government-new:
    classification: structural
    rationale: >-
      Under budget all 3 observed years materially (2022 −27.4%, 2023
      −33.2%, 2024 −11.5%). Corporate/governance functions are
      consistently under-spent against budget — a structural pattern
      (≥3 years same-direction ≥5%); candidate for budget-realism review.
    citations:
      - "2023 AFR PDF p.45: budget 550,735 / actual 367,654 (−33.2%)"
      - "2024 AFR PDF p.45: budget 594,486 / actual 526,276 (−11.5%)"
  expense-protection:
    classification: unclassified
    rationale: >-
      Only 2 observed years (2020 +1.6%, 2021 +2.9%) — the 2022
      organizational re-alignment retired this pre-2022 function taxonomy,
      so <3 years of history exist and the line cannot be carried forward.
      Unclassified per FR-009 (insufficient multi-year history).
    citations:
      - "2020 AFR PDF p.47: budget 801,772 / actual 814,277"
      - "2021 AFR PDF p.45: budget 796,162 / actual 819,110"
  expense-transportation:
    classification: unclassified
    rationale: >-
      Only 2 observed years (2020 +28.3%, 2021 +28.2%); pre-2022 taxonomy
      retired by the re-alignment. <3 years of history — unclassified per
      FR-009 (the magnitude is large but the rule requires ≥3 years and the
      taxonomy break makes more impossible at this granularity).
    citations:
      - "2020 AFR PDF p.47: budget 791,518 / actual 1,015,816"
      - "2021 AFR PDF p.45: budget 794,443 / actual 1,018,085"
  expense-utilities-environmental:
    classification: unclassified
    rationale: >-
      Only 2 observed years (2020 +5.4%, 2021 +4.5%); pre-2022 taxonomy
      retired. <3 years — unclassified per FR-009.
    citations:
      - "2020 AFR PDF p.47: budget 668,679 / actual 704,607"
      - "2021 AFR PDF p.45: budget 680,323 / actual 710,828"
  expense-community-cultural:
    classification: unclassified
    rationale: >-
      Only 2 observed years (2020 +7.5%, 2021 +4.9%); pre-2022 taxonomy
      retired. <3 years — unclassified per FR-009.
    citations:
      - "2020 AFR PDF p.47: budget 560,516 / actual 602,674"
      - "2021 AFR PDF p.45: budget 608,274 / actual 637,936"
  expense-general-government-old:
    classification: unclassified
    rationale: >-
      Only 2 observed years (2020 −22.9%, 2021 −18.1%); pre-2022 taxonomy
      retired and NOT the same scope as the post-2022 General government
      segment (kept distinct so no false continuity). <3 years —
      unclassified per FR-009.
    citations:
      - "2020 AFR PDF p.47: budget 416,946 / actual 321,630"
      - "2021 AFR PDF p.45: budget 432,285 / actual 354,054"
  expense-public-works:
    classification: unclassified
    rationale: >-
      Only 2 observed years (2020 +3.0%, 2021 +15.9%); pre-2022 taxonomy
      retired. <3 years — unclassified per FR-009.
    citations:
      - "2020 AFR PDF p.47: budget 279,233 / actual 287,582"
      - "2021 AFR PDF p.45: budget 278,462 / actual 322,733"
  expense-real-estate:
    classification: unclassified
    rationale: >-
      Only 2 observed years (2020 −8.1%, 2021 −9.6%); pre-2022 taxonomy
      retired. <3 years — unclassified per FR-009.
    citations:
      - "2020 AFR PDF p.47: budget 111,217 / actual 102,216"
      - "2021 AFR PDF p.45: budget 129,039 / actual 116,653"
