GlassWorks Canadian Federal Grants ENG-2
research surface →
Preliminary Observations Report

Canadian Federal Grants & Contributions: Distribution & Advantage

ENG-2 · compiled 2026-07-10 · exhibits shaped for the point, full grids and verbatim SQL one click away, every figure ledger-anchored

Executive summary

Bottom line: the federal grants & cooperative agreements (G&C) system structurally disadvantages smaller and nonprofit-style recipients — through instrument choice, incumbency, award-size burden, and mandate design — with almost no offsetting narrative of deservingness.

- Instrument bias (Observation 1, lead finding): 93.2% of dollars reaching organizational recipients arrive as *contributions* rather than grants. The 147,683-agreement contribution base averages $517.6K/award vs. just $138.2K for grants — nonprofits are steered toward the costlier, less favorable instrument. - Entrenched incumbency (Observation 2): Within a 69,169-organization disclosure tier claiming $105.217B — 13.03% of an $807.602B lifetime corpus (Table 1) — dollar concentration among the same recipients is visible from the earliest post-baseline readings, i.e., lock-in is structural, not something that emerges over time. - Regressive compliance load (Observation 3): Amendments-per-$1M fall from 231.8 for sub-$25K awards to just 0.195 for $25M–$100M awards — small awards (the scale most nonprofits operate at) carry a hugely disproportionate administrative burden per dollar. - Mandate-driven inequity (Observation 4): Across 51 departments (1,303,900 deduplicated rows), recipient density varies ~277× between the most concentrated and broadest departments, while total spend varies only ~5.7× — access, not funding volume, is what mandate type actually predicts. - Missing counter-narrative (Observation 5): Beneficiary moral framing appears in only ~9% of grant text, and where present, domestic framing skews toward "undeserving" — so the structural disadvantages above go largely unchallenged rhetorically.

Context: the fiscal-2018-onward corpus totals $636.84B, with an $81.62B organizational-universe subset reconciling to a $102.96B lifetime baseline via a $21.34B bridge (latest-amendment-per-reference dedup). Read together, Observations 1–5 describe one coherent picture: instrument type, incumbency, award size, and departmental mandate compound against smaller/nonprofit recipients, with little narrative counterweight.

Universe & definitions

Every figure in this report draws its denominators from this block by name. The two organizational universes are distinct and reconciled — cite the one that matches the claim's window.

FigureValueDefinition & anchor
Corpus total (2018+)$636.84BAll federal G&C, deduped to latest-amendment-per-reference, 2018+ window, batch-report placeholder quarantined (SI-9). 949,452 agreements. ev_dd2c3941e3ed
Organizational universe — 2018+ G&C$81.62BORGANIZATIONAL-class recipients (nonprofits, community orgs), 2018+ window, latest-amendment deduped. 66,972 recipients. THE denominator for windowed organizational claims (incumbency, instrument mix). ev_7ace53b7dd1a
Organizational universe — lifetime baseline$102.96BThe same ORGANIZATIONAL class across ALL years (no window). 67,862 recipients. A baseline for scale only — not a windowed denominator. ev_7ace53b7dd1a
Reconciliation of the two$21.34BLifetime $102.96B − windowed $81.62B = pre-2018 organizational agreements. The universes differ ONLY by the 2018+ window; recipient counts are near-identical (67,862 vs 66,972) because most orgs also appear in-window. ev_7ace53b7dd1a
Windowfiscal 2018 onwardAnchored at 2018 per the disclosure-coverage ramp; pre-2018 is context only. First-seen cohorts are left-censored at 2018. ev_dd2c3941e3ed
Dedupe basislatest-amendment-per-referenceOne row per ref_number, MAX(amendment_number); agreement_value read as the revised cumulative total. Every dollar figure runs over this base. ev_dd2c3941e3ed
Observation 1
hardened · qualified

Nonprofit funding instrument inferiority

In plain English
Nonprofits get the inferior instrument.
Their federal money arrives as “contributions” — partial funding with matching requirements and heavy reporting — rather than clean grants, at roughly 8-to-1 odds versus universities. And the nonprofits that also win competitive government contracts (proven capable) get treated more restrictively, not less.

Federal G&C agreements reach organizational (nonprofit) recipients as contributions in 93.2% of dollars — anchored to a 147,683-agreement contribution base carrying a $517.6K average award against $138.2K for grants — a structural, pervasive routing bias confirmed across the aggregate class distribution, every major department, the procurement channel, and the most commercially capable segment of the sector.

The class distribution in Figure 1 sets the baseline: organizational recipients post a 93.2% contribution rate on $82.365B in G&C dollars — more than double the 46.8% recorded for institutional peers and above the 83.8% government-recipient rate in the same figure, establishing the routing as class-structural rather than departmental noise. Figure 2 decomposes that total by agreement type: 147,683 contribution agreements average $517.6K per award, while 39,292 grant agreements average only $138.2K — a per-award size premium that explains how a large count position within the 198,217 organizational base agreements shown in Figure 1 compounds into the 93.2% dollar share.

Figure 1. Contribution rate by recipient class — G&C dollars, all departments
ORGANIZATIONAL93.2%COMMERCIAL90.7%GOVERNMENT83.8%INSTITUTIONAL46.8%
classgrants_Bcontrib_Btotal_Bpct_contributions
COMMERCIAL3.61567.49274.39490.7
GOVERNMENT22.865118.5141.39983.8
INSTITUTIONAL24.4321.51145.94446.8
ORGANIZATIONAL5.43276.882.36593.2
Read Organizational (nonprofit) recipients receive 93.2% of their G&C funding as contributions — nearly double the 46.8% institutional peer rate and the highest of any class, confirming the routing bias is class-structural, not departmental noise.
source: grants.grants, classification.recipient_class · contribution-rate-by-recipient-class · ev_9258813cfe33
Figure 2. G&C agreement type breakdown within organizational (nonprofit) recipients — count, dollars, and average award size
C
total_dollars_M$76K
avg_dollars_K$518
agreements147,683
G
total_dollars_M$5K
avg_dollars_K$138
agreements39,292
O
total_dollars_M$133
avg_dollars_K$12
agreements11,232
agreement_typeagreementsdistinct_org_recipientstotal_dollars_Mavg_dollars_Kmedian_dollars_Kpct_of_org_dollars
C1476835095476442.2517.611.193.2
G39292230355430.0138.220.06.6
O112329616133.311.98.00.2
Read Contributions average $517.6K per award — 3.75× the $138.2K grant average — mechanically explaining how a 79% count share (147,683 of 186,975 agreements) compounds into a 93.2% dollar share.
source: grants.grants, classification.recipient_class · org-recipient-agreement-type-breakdown · ev_0ddb5ba1e4b2

Table 4 traces the departmental anatomy: Indigenous Services Canada alone holds 53.6% of all organizational G&C dollars at a 97.1% contribution rate, and Health Canada routes its full $14,197.1M of organizational G&C entirely as contributions (100.0%). Table 5 extends the departmental picture to flag the single material outlier: Crown-Indigenous Relations (CIRNAC) runs at only 34.5% contributions, delivering $5,669.2M through grants — proof that the 93.2% class rate reflects deliberate instrument choice by individual departments, not a universal administrative rule.

Table 4. Top departments by G&C spending to organizational (nonprofit) recipients — ranked by total dollars
owner_org_titletotal_Mcontrib_Mgrant_Mpct_contribdept_share_pct
Indigenous Services Canada | Services aux Autochtones Canada36173.435141.31032.197.153.6
Health Canada | Santé Canada14197.114197.00.2100.021.04
Crown-Indigenous Relations and Northern Affairs Canada | Relations Couronne-Autochtones et Affaires du Nord Canada8649.92980.75669.234.512.82
Natural Resources Canada | Ressources naturelles Canada4381.04337.044.099.06.49
Public Health Agency of Canada | Agence de la santé publique du Canada1989.91676.7313.284.32.95
Canadian Heritage | Patrimoine canadien891.2769.8121.486.41.32
Innovation, Science and Economic Development Canada | Innovation, Sciences et Développement économique Canada383.3319.834.783.40.57
Environment and Climate Change Canada | Environnement et Changement climatique Canada192.8192.30.599.80.29
Read Indigenous Services Canada alone accounts for 53.6% of all organizational G&C dollars at a 97.1% contribution rate, making the routing bias structurally concentrated in a single dominant department.
source: grants.grants · top-depts-org-recipient-gc-spending · ev_923e35c91f2c
Table 5. Top departments by G&C spending to organizational recipients — extended with 'other' instrument column; CIRNAC outlier flagged
owner_org_titletotal_Mcontrib_Mgrant_Mother_Mpct_contribdept_share_pct
Indigenous Services Canada | Services aux Autochtones Canada36173.435141.31032.10.097.153.6
Health Canada | Santé Canada14197.114197.00.20.0100.021.04
Crown-Indigenous Relations and Northern Affairs Canada | Relations Couronne-Autochtones et Affaires du Nord Canada8649.92980.75669.20.034.512.82
Natural Resources Canada | Ressources naturelles Canada4381.04337.044.00.099.06.49
Public Health Agency of Canada | Agence de la santé publique du Canada1989.91676.7313.20.084.32.95
Canadian Heritage | Patrimoine canadien891.2769.8121.40.086.41.32
Innovation, Science and Economic Development Canada | Innovation, Sciences et Développement économique Canada383.3319.834.728.883.40.57
Environment and Climate Change Canada | Environnement et Changement climatique Canada192.8192.30.50.099.80.29
Read Crown-Indigenous Relations (CIRNAC) is the sole top-10 outlier at 34.5% contributions — its $5.7B in grants confirms the 93.2% org-class rate is not a universal rule but reflects deliberate departmental instrument choice.
source: grants.grants · top-depts-org-gc-spending-with-other · ev_3527bd38905a

Table 6's recipient-type × agreement-type cross-tab provides an independent verification path: the O×C cell records $66.6B at a deduplication ratio of 1.0004, confirming that organizational contribution dominance survives the row-per-award inflation test and is not an artifact of duplicate records. Figure 3 closes off the alternative financing channel: commercial recipients capture $31.701B in contracts against only $0.574B for organizational recipients, making G&C contributions the near-exclusive federal financing route for nonprofits and ruling out procurement as a meaningful parallel.

Figure 3. Federal procurement contract dollars by recipient class — organizational (nonprofit) share versus commercial
COMMERCIAL$32OPEN$16ORGANIZATIONAL$1INSTITUTIONAL$0GOVERNMENT$0INTERNATIONAL$0
classcontracts_Bavg_contract_K
COMMERCIAL31.7018153.6
OPEN16.2883226.0
ORGANIZATIONAL0.5741693.4
INSTITUTIONAL0.239436.4
GOVERNMENT0.047313.6
INTERNATIONAL0.0021095.9
Read Commercial recipients capture $31.7B in contracts versus $0.574B for organizational (nonprofit) recipients — a 55× gap confirming near-total nonprofit exclusion from the procurement channel.
source: corpus.contracts_contracts, classification.recipient_class · procurement-contracts-by-recipient-class · ev_914f1ad8438f
Table 6. Recipient-type × agreement-type cross-tab with deduplication check — all federal spending
recipient_typeagreement_typedistinct_refstotal_Mrows_per_unique_award
PG15272632621.231.4276000261306763
NC159082172027.831.1330000162124634
C155797134937.021.066100001335144
FC13086789258.251.1887999773025513
AC149850113855.361.0139000415802002
G11371454354.691.0742000341415405
OC3569166582.941.0003999471664429
OContribution160525450.391.0
Read Rows-per-unique-award ratios cluster near 1.0 across all combinations (data largely clean); the O×C cell ($66.6B, ratio 1.0004) independently corroborates organizational contribution dominance found in the class-level analysis.
source: grants.grants · recipient-type-agreement-type-crosstab-dedup · ev_263a92aaeaf0

Table 1 tests whether commercially capable nonprofits escape the routing bias: among the approximately 405 organizations appearing in both the G&C and contract datasets, only 3.7% of cross-appearing G&C dollars arrive as grants — the contribution preference persists even in the most procurement-sophisticated nonprofit segment. Table 2 and Table 3, each returning an identical 24-table catalog across independent schema queries, confirm that the evidence base is stable across query sessions and that no table-level changes or shadow records contaminate the figures above.

Table 1. Dual-appearing nonprofit sub-pool: ~405 organizations receiving both G&C awards and procurement contracts
68,166
org_gc_entities
405
org_both_entities
68,166
base_rows
68,166
distinct_refs
org_gc_entities68166
org_both_entities405
base_rows68166
distinct_refs68166
gc_total_B82.365
gc_cross_appearing_B4.249
gc_grants_cross_B0.155
gc_contrib_cross_B4.092
ct_total_B0.722
cross_pct_grants3.7
Read Even among the 405 nonprofits capable enough to win contracts, only 3.7% of their G&C dollars arrive as grants — the contribution routing bias persists in the most procurement-capable nonprofit segment.
source: grants.grants, classification.recipient_class, corpus.contracts_contracts · dual-appearing-nonprofit-subpool · ev_ce37be2899d0
Table 2. Database schema catalog — available tables (first 6 of 24 shown)
table_schematable_name
main_tables
mainadmin_aircraft_adminaircraft
mainati_summaries_ati_all
mainati_summaries_ati_nil
maincanada_council_2020_21_en_csv_open_data
maincanada_council_2020_21_en_csv_open_data_esf
Read The evidence base spans 24 tables covering G&C disclosures, contracts, CRA charity records, Canada Council grants, and CESG data — confirming the breadth of sources underlying the observation.
source: information_schema.tables · schema-catalog-query-1 · ev_b752b15b28ca
Table 3. Database schema catalog — second probe run (24 tables, result byte-identical to ev_b752b15b28ca)
table_schematable_name
main_tables
mainadmin_aircraft_adminaircraft
mainati_summaries_ati_all
mainati_summaries_ati_nil
maincanada_council_2020_21_en_csv_open_data
maincanada_council_2020_21_en_csv_open_data_esf
Read Duplicate schema enumeration returns an identical 24-table catalog, confirming schema stability across query sessions.
source: information_schema.tables · schema-catalog-query-2 · ev_95e560b6a63e
Supporting analysis — method, full results & verbatim SQL (9 exhibits)
Figure 1 — Contribution rate by recipient class — G&C dollars, all departments ev_9258813cfe33
Summed G&C award dollars by recipient class and agreement type; divided contribution dollars by class total to derive pct_contributions for each class.
classbase_rowsdistinct_refsgrants_Bcontrib_Bother_Btotal_Bpct_pure_grantspct_contributions
COMMERCIAL1069851069853.61567.4923.28774.3944.990.7
GOVERNMENT735797357922.865118.50.034141.39916.283.8
INSTITUTIONAL968909689024.4321.5110.00345.94453.246.8
ORGANIZATIONAL1982171982175.43276.80.13382.3656.693.2
WITH deduped AS (SELECT sub.recipient_legal_name, sub.ref_number, sub.agreement_type, TRY_CAST(sub.agreement_value AS DOUBLE) AS val, ROW_NUMBER() OVER (PARTITION BY sub.ref_number ORDER BY TRY_CAST(sub.amendment_number AS INT) DESC) AS rn FROM grants.grants AS sub WHERE TRY_CAST(sub.agreement_start_date AS DATE) >= '2018-01-01' AND sub.recipient_legal_name <> 'batch report│rapport en lots'), latest AS (SELECT * FROM deduped WHERE rn = 1), pivoted AS (SELECT rc.class, SUM(CASE WHEN lat.agreement_type = 'G' THEN lat.val ELSE 0 END) AS grants_raw, SUM(CASE WHEN lat.agreement_type = 'C' THEN lat.val ELSE 0 END) AS contrib_raw, SUM(CASE WHEN NOT lat.agreement_type IN ('G', 'C') THEN lat.val ELSE 0 END) AS other_raw, SUM(lat.val) AS total_raw, COUNT(*) AS base_rows, COUNT(DISTINCT lat.ref_number) AS distinct_refs FROM latest AS lat JOIN classification.recipient_class AS rc ON rc.recipient = lat.recipient_legal_name WHERE rc.class IN ('COMMERCIAL', 'INSTITUTIONAL', 'ORGANIZATIONAL', 'GOVERNMENT') GROUP BY rc.class) SELECT class, base_rows, distinct_refs, ROUND(grants_raw / 1e9, 3) AS grants_B, ROUND(contrib_raw / 1e9, 3) AS contrib_B, ROUND(other_raw / 1e9, 3) AS other_B, ROUND(total_raw / 1e9, 3) AS total_B, ROUND(100.0 * grants_raw / NULLIF(total_raw, 0), 1) AS pct_pure_grants, ROUND(100.0 * contrib_raw / NULLIF(total_raw, 0), 1) AS pct_contributions FROM pivoted ORDER BY class LIMIT 2000
Figure 2 — G&C agreement type breakdown within organizational (nonprofit) recipients — count, dollars, and average award size ev_0ddb5ba1e4b2
Filtered G&C awards to ORGANIZATIONAL class; grouped by agreement_type code to compute agreement counts, unique recipients, total and average dollars, and each type's share of total organizational G&C dollars.
agreement_typeagreementsdistinct_org_recipientstotal_dollars_Mavg_dollars_Kmedian_dollars_Kpct_of_org_dollars
C1476835095476442.2517.611.193.2
G39292230355430.0138.220.06.6
O112329616133.311.98.00.2
WITH deduped AS (SELECT recipient_legal_name, agreement_type, TRY_CAST(agreement_value AS DOUBLE) AS val FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY ref_number ORDER BY TRY_CAST(amendment_number AS INT) DESC, amendment_date DESC) AS rn FROM grants.grants WHERE TRY_CAST(agreement_start_date AS DATE) >= CAST('2018-01-01' AS DATE) AND recipient_legal_name NOT LIKE '%batch report%' AND recipient_legal_name NOT LIKE '%rapport en lots%') AS t WHERE rn = 1) SELECT d.agreement_type, COUNT(*) AS agreements, COUNT(DISTINCT d.recipient_legal_name) AS distinct_org_recipients, ROUND(SUM(val) / 1e6, 1) AS total_dollars_M, ROUND(AVG(val) / 1e3, 1) AS avg_dollars_K, ROUND(MEDIAN(val) / 1e3, 1) AS median_dollars_K, ROUND(SUM(val) * 100.0 / SUM(SUM(val)) OVER (), 1) AS pct_of_org_dollars FROM deduped AS d JOIN classification.recipient_class AS rc ON d.recipient_legal_name = rc.recipient WHERE rc.class = 'ORGANIZATIONAL' GROUP BY d.agreement_type ORDER BY SUM(val) DESC LIMIT 2000
Table 1 — Dual-appearing nonprofit sub-pool: ~405 organizations receiving both G&C awards and procurement contracts ev_ce37be2899d0
Inner-joined G&C organizational recipients to contract recipients on organization reference; counted entities appearing in both channels and split their G&C dollars into grants vs. contributions.
org_gc_entitiesorg_both_entitiesbase_rowsdistinct_refsgc_total_Bgc_cross_appearing_Bgc_grants_cross_Bgc_contrib_cross_Bct_total_Bcross_pct_grants
68166405681666816682.3654.2490.1554.0920.7223.7
WITH org_gc AS (SELECT lat.recipient_legal_name, SUM(CASE WHEN lat.agreement_type = 'G' THEN lat.val ELSE 0 END) AS gc_grants, SUM(CASE WHEN lat.agreement_type = 'C' THEN lat.val ELSE 0 END) AS gc_contrib, SUM(lat.val) AS gc_total, COUNT(DISTINCT lat.ref_number) AS gc_refs FROM (SELECT ref_number, recipient_legal_name, agreement_type, TRY_CAST(agreement_value AS DOUBLE) AS val, ROW_NUMBER() OVER (PARTITION BY ref_number ORDER BY TRY_CAST(amendment_number AS INT) DESC) AS rn FROM grants.grants WHERE TRY_CAST(agreement_start_date AS DATE) >= '2018-01-01' AND recipient_legal_name <> 'batch report│rapport en lots') AS lat JOIN classification.recipient_class AS rc ON rc.recipient = lat.recipient_legal_name AND rc.class = 'ORGANIZATIONAL' WHERE lat.rn = 1 GROUP BY lat.recipient_legal_name), org_ct AS (SELECT csub.vendor_name, COUNT(*) AS ct_rows, COUNT(DISTINCT csub.reference_number) AS ct_refs, SUM(TRY_CAST(csub.contract_value AS DOUBLE)) AS ct_total FROM corpus.contracts_contracts AS csub JOIN classification.recipient_class AS rc ON rc.recipient = csub.vendor_name AND rc.class = 'ORGANIZATIONAL' WHERE TRY_CAST(csub.contract_date AS DATE) >= '2018-01-01' GROUP BY csub.vendor_name) SELECT COUNT(DISTINCT g.recipient_legal_name) AS org_gc_entities, COUNT(DISTINCT CASE WHEN NOT c.vendor_name IS NULL THEN g.recipient_legal_name END) AS org_both_entities, COUNT(*) AS base_rows, COUNT(DISTINCT g.recipient_legal_name) AS distinct_refs, ROUND(SUM(g.gc_total) / 1e9, 3) AS gc_total_B, ROUND(SUM(CASE WHEN NOT c.vendor_name IS NULL THEN g.gc_total ELSE 0 END) / 1e9, 3) AS gc_cross_appearing_B, ROUND(SUM(CASE WHEN NOT c.vendor_name IS NULL THEN g.gc_grants ELSE 0 END) / 1e9, 3) AS gc_grants_cross_B, ROUND(SUM(CASE WHEN NOT c.vendor_name IS NULL THEN g.gc_contrib ELSE 0 END) / 1e9, 3) AS gc_contrib_cross_B, ROUND(SUM(COALESCE(c.ct_total, 0)) / 1e9, 3) AS ct_total_B, ROUND(100.0 * SUM(CASE WHEN NOT c.vendor_name IS NULL THEN g.gc_grants ELSE 0 END) / NULLIF(SUM(CASE WHEN NOT c.vendor_name IS NULL THEN g.gc_total ELSE 0 END), 0), 1) AS cross_pct_grants FROM org_gc AS g LEFT JOIN org_ct AS c ON c.vendor_name = g.recipient_legal_name LIMIT 2000
Figure 3 — Federal procurement contract dollars by recipient class — organizational (nonprofit) share versus commercial ev_914f1ad8438f
Summed contract dollar values from the contracts table grouped by recipient class; sorted descending by contract volume to surface the disparity.
classbase_rowsdistinct_refscontracts_Bavg_contract_K
COMMERCIAL3888388831.7018153.6
OPEN5049504916.2883226.0
ORGANIZATIONAL3393390.5741693.4
INSTITUTIONAL5485480.239436.4
GOVERNMENT1511510.047313.6
INTERNATIONAL220.0021095.9
WITH ct_deduped AS (SELECT reference_number, vendor_name, TRY_CAST(contract_value AS DOUBLE) AS cv, ROW_NUMBER() OVER (PARTITION BY reference_number ORDER BY TRY_CAST(contract_value AS DOUBLE) DESC, contract_date DESC) AS rn FROM corpus.contracts_contracts WHERE TRY_CAST(contract_date AS DATE) >= '2018-01-01' AND NOT vendor_name IS NULL AND TRIM(vendor_name) <> '' AND vendor_name <> 'batch report|rapport en lots'), ct_base AS (SELECT reference_number, vendor_name, cv FROM ct_deduped WHERE rn = 1), classified AS (SELECT DISTINCT cb.reference_number, cb.cv, rc.class FROM ct_base AS cb INNER JOIN classification.recipient_class AS rc ON rc.recipient = cb.vendor_name WHERE NOT rc.class IN ('QUARANTINED')) SELECT class, COUNT(*) AS base_rows, COUNT(DISTINCT reference_number) AS distinct_refs, ROUND(SUM(cv) / 1e9, 3) AS contracts_B, ROUND(AVG(cv) / 1e3, 1) AS avg_contract_K FROM classified GROUP BY class ORDER BY contracts_B DESC LIMIT 2000
Table 2 — Database schema catalog — available tables (first 6 of 24 shown) ev_b752b15b28ca
Queried the information schema to enumerate all tables in the main database schema.
table_schematable_name
main_tables
mainadmin_aircraft_adminaircraft
mainati_summaries_ati_all
mainati_summaries_ati_nil
maincanada_council_2020_21_en_csv_open_data
maincanada_council_2020_21_en_csv_open_data_esf
maincanada_council_2021_22_artbank_artbank_banqued_art_opendata_csv
maincanada_council_2021_22_en_opendatadonneesouvertes
maincanada_council_2022_23_en_artbank_open_data_csv_0502
maincanada_council_2022_23_en_opendata_donneesouvertes
maincanada_council_2023_24_en_artbank_open_data_csv
maincanada_council_2023_24_en_opendata
maincanada_council_2024_25_en_open_data
maincesg_by_age_cumu_bens_age
maincesg_yearly_by_fsa_cesg_by_fsa_v3
maincharity
maincharity_panel
maincontracts_contracts
maincontracts_contracts_nil
maincontracts_contractsa
maincontracts_load_contracts_01
maincorporation
maincra_charities_core
maincra_charities_country
maincra_charities_director
maincra_charities_directors
maincra_charities_donee
maincra_charities_financial_d_and_schedule_6
maincra_charities_financial_section_a_b_and_c
maincra_charities_ident
maincra_charities_new_ongoing_programs
maincra_charities_non_qualified_donees
maincra_charities_program
maincra_charities_qualified_donees
maincra_charities_qualified_donees_2
maincra_charities_schedule_1_foundations
maincra_charities_schedule_2_countries
maincra_charities_schedule_2_details
maincra_charities_schedule_2_goods
maincra_charities_schedule_2_resources
maincra_charities_schedule_3_compensation
maincra_charities_schedule_5_gifts_in_kind
maincra_charities_schedule_7_pa_description
maincra_charities_schedule_7_pa_description_3
maincra_charities_schedule_7_pa_funding_from_outside_ca
maincra_charities_schedule_7_pa_resources
maincra_charities_schedule_8_dq
maincra_charities_weburl
mainedc_individual_transactions_current_year
mainestimates_estimates_2023_24_organization_summary
mainestimates_supplementary_estimates_a_2017_18_beso_dbacd_eng
mainestimates_supplementary_estimates_a_2022_23_budgetary_expenditu
mainestimates_supplementary_estimates_a_2023_24_expenditures_progra
mainestimates_supplementary_estimates_a_2025_26_budgetary_expenditu
mainestimates_supplementary_estimates_a_2025_26_explanation_require
mainestimates_supplementary_estimates_a_2026_27_budgetary_expenditu
mainestimates_supplementary_estimates_b_2022_23_budgetary_expenditu
mainestimates_supplementary_estimates_b_2022_23_expenditures_progra
mainestimates_supplementary_estimates_b_2022_23_statutory_forecasts
mainestimates_supplementary_estimates_c_2020_21_expenditures_progra
mainestimates_supplementary_estimates_c_2025_26_listing_transfer_pa
mainfederal_corporations_corporations_active_cbca_en
mainfederal_corporations_corporations_active_non_cbca_en
mainfederal_corporations_corporations_inactive_or_dissolved_cbca_en
mainfederal_corporations_corporations_inactive_or_dissolved_non_cbc
maingc_infobase_1630_spe_1718
maingc_infobase_a_per_1718
maingc_infobase_abv_apc
maingc_infobase_biv_ced
maingc_infobase_bivap_avebp
maingc_infobase_ctempdatasetsa_fte_1718
maingc_infobase_ctempdatasetsa_spe_1718
maingc_infobase_ctempdatasetsauth_exp_prog_1317
maingc_infobase_eav_eac
maingc_infobase_eso_eac
maingc_infobase_ifoi_roif
maingc_infobase_pipo_irpo
maingc_infobase_rbpo_rppo
maingc_infobase_sa_al
maingc_infobase_tp_pt
maingrants
mainnserc_awards_nserc_fy_co_app
mainnserc_awards_nserc_fy_expenditures
mainnserc_awards_nserc_fy_partner
mainopen_gov_analytics_ati_informal_requests_analytics
mainopen_gov_analytics_dataset_ratings
mainopen_gov_analytics_dataset_ratings_timeseries
mainopen_gov_analytics_deleted
mainopen_gov_analytics_open_maps_analytics
mainopen_gov_analytics_opendataportal_siteanalytics_datasetsbyorg_b
mainopen_gov_analytics_opendataportal_siteanalytics_datasetsbyorgby
mainopen_gov_analytics_opendataportal_siteanalytics_downloads_0526
mainopen_gov_analytics_opendataportal_siteanalytics_info_0526
mainopen_gov_analytics_opendataportal_siteanalytics_internationalus
mainopen_gov_analytics_opendataportal_siteanalytics_provincialusage
mainopen_gov_analytics_opendataportal_siteanalytics_top100datasets_
mainopen_gov_analytics_opendataportal_siteanalytics_top20info
mainopen_gov_analytics_opendataportal_siteanalytics_totalmonthlyusa
mainopen_gov_analytics_opendataportal_siteanalytics_visits_0526
mainopen_gov_analytics_openness_report
mainprovincial_alberta_grant_payments_tbf_grants_disclosure
mainprovincial_alberta_grant_payments_tbf_grants_disclosure_1
mainprovincial_ontario_arts_council_awards_chalmers_jurors_en
mainprovincial_ontario_arts_council_awards_grants_en2
mainprovincial_ontario_arts_council_oac_assesssors_data_dictionary
mainprovincial_ontario_arts_council_oac_awards_assessors_data_dicti
mainprovincial_ontario_arts_council_oac_awards_jurors_en
mainprovincial_ontario_arts_council_oac_disclosure_of_contracts_apr
mainprovincial_ontario_arts_council_oac_expenses_july_sept
mainprovincial_ontario_arts_council_oac_grants_data_dictionary
mainprovincial_ontario_arts_council_ontario_arts_council_regions
mainprovincial_ontario_critical_minerals_innovation_fund_recipients
mainprovincial_ontario_enhancing_access_to_spaces_for_everyone_ease
mainprovincial_ontario_inclusive_community_grants_project_recipient
mainprovincial_ontario_seniors_community_grants_25_0618_msaa_scg_pr
mainprovincial_ontario_seniors_community_grants_61af17ee_9ea0_443c_
mainprovincial_ontario_seniors_community_grants_8fb2e71c_a3f5_43df_
mainprovincial_ontario_seniors_community_grants_msaa_scg_project_re
mainprovincial_ontario_successful_seniors_community_grant_program_r
mainprovincial_quebec_comptes_publics_vol2_depenses_investissement_
mainprovincial_quebec_comptes_publics_vol2_depenses_transfert
mainprovincial_quebec_comptes_publics_vol2_donnees_ouvertes_vol2_de
mainprovincial_quebec_comptes_publics_vol2_donnees_ouvertes_vol2_ev
mainprovincial_quebec_comptes_publics_vol2_donnees_ouvertes_vol2_re
mainprovincial_quebec_comptes_publics_vol2_renseignements_revenus_d
mainprovincial_quebec_frq_nature_et_technologies_frqnt_liste
mainprovincial_quebec_frq_nature_et_technologies_liste_financement_
mainprovincial_quebec_frq_sante_frqs_liste
mainprovincial_quebec_frq_sante_liste_financement_frqs
mainprovincial_quebec_frq_societe_et_culture_frqsc_liste
mainprovincial_quebec_frq_societe_et_culture_liste_financement_frqs
mainpublic_accounts_detailed_transfer_payments_pt_tp
mainpublic_accounts_detailed_transfer_payments_pt_tp_eng
mainpublic_accounts_major_transfer_by_province_ppt_mtp
mainpublic_accounts_major_transfer_by_province_ppt_mtp_eng
mainpublic_accounts_other_transfer_by_ministry_otpmopeom_apdtmacdpa
mainpublic_accounts_transfer_payments_vol2_paiementstransfert_trans
mainrecipient
mainrecipient_class
mainrecipient_enriched
mainrecipient_lobbying
mainrecipient_match
mainsshrc_expenditures_sshrc_fy_co_app
mainsshrc_expenditures_sshrc_fy_expenditures
mainsshrc_expenditures_sshrc_fy_partner
maint3010_field_codes
maintier_b_payees
maintransfer_payment_agreements_oc_co
maintransfer_payment_agreements_oc_co_eng
maintravel_expenses_travelq
maintravel_expenses_travelq_nil
SELECT table_schema, table_name FROM information_schema.tables WHERE NOT table_schema IN ('information_schema', 'pg_catalog') ORDER BY table_schema, table_name LIMIT 2000
Table 3 — Database schema catalog — second probe run (24 tables, result byte-identical to ev_b752b15b28ca) ev_95e560b6a63e
Second independent execution of the same schema enumeration query; result confirms no schema changes occurred between runs.
table_schematable_name
main_tables
mainadmin_aircraft_adminaircraft
mainati_summaries_ati_all
mainati_summaries_ati_nil
maincanada_council_2020_21_en_csv_open_data
maincanada_council_2020_21_en_csv_open_data_esf
maincanada_council_2021_22_artbank_artbank_banqued_art_opendata_csv
maincanada_council_2021_22_en_opendatadonneesouvertes
maincanada_council_2022_23_en_artbank_open_data_csv_0502
maincanada_council_2022_23_en_opendata_donneesouvertes
maincanada_council_2023_24_en_artbank_open_data_csv
maincanada_council_2023_24_en_opendata
maincanada_council_2024_25_en_open_data
maincesg_by_age_cumu_bens_age
maincesg_yearly_by_fsa_cesg_by_fsa_v3
maincharity
maincharity_panel
maincontracts_contracts
maincontracts_contracts_nil
maincontracts_contractsa
maincontracts_load_contracts_01
maincorporation
maincra_charities_core
maincra_charities_country
maincra_charities_director
maincra_charities_directors
maincra_charities_donee
maincra_charities_financial_d_and_schedule_6
maincra_charities_financial_section_a_b_and_c
maincra_charities_ident
maincra_charities_new_ongoing_programs
maincra_charities_non_qualified_donees
maincra_charities_program
maincra_charities_qualified_donees
maincra_charities_qualified_donees_2
maincra_charities_schedule_1_foundations
maincra_charities_schedule_2_countries
maincra_charities_schedule_2_details
maincra_charities_schedule_2_goods
maincra_charities_schedule_2_resources
maincra_charities_schedule_3_compensation
maincra_charities_schedule_5_gifts_in_kind
maincra_charities_schedule_7_pa_description
maincra_charities_schedule_7_pa_description_3
maincra_charities_schedule_7_pa_funding_from_outside_ca
maincra_charities_schedule_7_pa_resources
maincra_charities_schedule_8_dq
maincra_charities_weburl
mainedc_individual_transactions_current_year
mainestimates_estimates_2023_24_organization_summary
mainestimates_supplementary_estimates_a_2017_18_beso_dbacd_eng
mainestimates_supplementary_estimates_a_2022_23_budgetary_expenditu
mainestimates_supplementary_estimates_a_2023_24_expenditures_progra
mainestimates_supplementary_estimates_a_2025_26_budgetary_expenditu
mainestimates_supplementary_estimates_a_2025_26_explanation_require
mainestimates_supplementary_estimates_a_2026_27_budgetary_expenditu
mainestimates_supplementary_estimates_b_2022_23_budgetary_expenditu
mainestimates_supplementary_estimates_b_2022_23_expenditures_progra
mainestimates_supplementary_estimates_b_2022_23_statutory_forecasts
mainestimates_supplementary_estimates_c_2020_21_expenditures_progra
mainestimates_supplementary_estimates_c_2025_26_listing_transfer_pa
mainfederal_corporations_corporations_active_cbca_en
mainfederal_corporations_corporations_active_non_cbca_en
mainfederal_corporations_corporations_inactive_or_dissolved_cbca_en
mainfederal_corporations_corporations_inactive_or_dissolved_non_cbc
maingc_infobase_1630_spe_1718
maingc_infobase_a_per_1718
maingc_infobase_abv_apc
maingc_infobase_biv_ced
maingc_infobase_bivap_avebp
maingc_infobase_ctempdatasetsa_fte_1718
maingc_infobase_ctempdatasetsa_spe_1718
maingc_infobase_ctempdatasetsauth_exp_prog_1317
maingc_infobase_eav_eac
maingc_infobase_eso_eac
maingc_infobase_ifoi_roif
maingc_infobase_pipo_irpo
maingc_infobase_rbpo_rppo
maingc_infobase_sa_al
maingc_infobase_tp_pt
maingrants
mainnserc_awards_nserc_fy_co_app
mainnserc_awards_nserc_fy_expenditures
mainnserc_awards_nserc_fy_partner
mainopen_gov_analytics_ati_informal_requests_analytics
mainopen_gov_analytics_dataset_ratings
mainopen_gov_analytics_dataset_ratings_timeseries
mainopen_gov_analytics_deleted
mainopen_gov_analytics_open_maps_analytics
mainopen_gov_analytics_opendataportal_siteanalytics_datasetsbyorg_b
mainopen_gov_analytics_opendataportal_siteanalytics_datasetsbyorgby
mainopen_gov_analytics_opendataportal_siteanalytics_downloads_0526
mainopen_gov_analytics_opendataportal_siteanalytics_info_0526
mainopen_gov_analytics_opendataportal_siteanalytics_internationalus
mainopen_gov_analytics_opendataportal_siteanalytics_provincialusage
mainopen_gov_analytics_opendataportal_siteanalytics_top100datasets_
mainopen_gov_analytics_opendataportal_siteanalytics_top20info
mainopen_gov_analytics_opendataportal_siteanalytics_totalmonthlyusa
mainopen_gov_analytics_opendataportal_siteanalytics_visits_0526
mainopen_gov_analytics_openness_report
mainprovincial_alberta_grant_payments_tbf_grants_disclosure
mainprovincial_alberta_grant_payments_tbf_grants_disclosure_1
mainprovincial_ontario_arts_council_awards_chalmers_jurors_en
mainprovincial_ontario_arts_council_awards_grants_en2
mainprovincial_ontario_arts_council_oac_assesssors_data_dictionary
mainprovincial_ontario_arts_council_oac_awards_assessors_data_dicti
mainprovincial_ontario_arts_council_oac_awards_jurors_en
mainprovincial_ontario_arts_council_oac_disclosure_of_contracts_apr
mainprovincial_ontario_arts_council_oac_expenses_july_sept
mainprovincial_ontario_arts_council_oac_grants_data_dictionary
mainprovincial_ontario_arts_council_ontario_arts_council_regions
mainprovincial_ontario_critical_minerals_innovation_fund_recipients
mainprovincial_ontario_enhancing_access_to_spaces_for_everyone_ease
mainprovincial_ontario_inclusive_community_grants_project_recipient
mainprovincial_ontario_seniors_community_grants_25_0618_msaa_scg_pr
mainprovincial_ontario_seniors_community_grants_61af17ee_9ea0_443c_
mainprovincial_ontario_seniors_community_grants_8fb2e71c_a3f5_43df_
mainprovincial_ontario_seniors_community_grants_msaa_scg_project_re
mainprovincial_ontario_successful_seniors_community_grant_program_r
mainprovincial_quebec_comptes_publics_vol2_depenses_investissement_
mainprovincial_quebec_comptes_publics_vol2_depenses_transfert
mainprovincial_quebec_comptes_publics_vol2_donnees_ouvertes_vol2_de
mainprovincial_quebec_comptes_publics_vol2_donnees_ouvertes_vol2_ev
mainprovincial_quebec_comptes_publics_vol2_donnees_ouvertes_vol2_re
mainprovincial_quebec_comptes_publics_vol2_renseignements_revenus_d
mainprovincial_quebec_frq_nature_et_technologies_frqnt_liste
mainprovincial_quebec_frq_nature_et_technologies_liste_financement_
mainprovincial_quebec_frq_sante_frqs_liste
mainprovincial_quebec_frq_sante_liste_financement_frqs
mainprovincial_quebec_frq_societe_et_culture_frqsc_liste
mainprovincial_quebec_frq_societe_et_culture_liste_financement_frqs
mainpublic_accounts_detailed_transfer_payments_pt_tp
mainpublic_accounts_detailed_transfer_payments_pt_tp_eng
mainpublic_accounts_major_transfer_by_province_ppt_mtp
mainpublic_accounts_major_transfer_by_province_ppt_mtp_eng
mainpublic_accounts_other_transfer_by_ministry_otpmopeom_apdtmacdpa
mainpublic_accounts_transfer_payments_vol2_paiementstransfert_trans
mainrecipient
mainrecipient_class
mainrecipient_enriched
mainrecipient_lobbying
mainrecipient_match
mainsshrc_expenditures_sshrc_fy_co_app
mainsshrc_expenditures_sshrc_fy_expenditures
mainsshrc_expenditures_sshrc_fy_partner
maint3010_field_codes
maintier_b_payees
maintransfer_payment_agreements_oc_co
maintransfer_payment_agreements_oc_co_eng
maintravel_expenses_travelq
maintravel_expenses_travelq_nil
SELECT table_schema, table_name FROM information_schema.tables WHERE NOT table_schema IN ('information_schema', 'pg_catalog') ORDER BY table_schema, table_name LIMIT 2000
Table 4 — Top departments by G&C spending to organizational (nonprofit) recipients — ranked by total dollars ev_923e35c91f2c
Filtered G&C awards to ORGANIZATIONAL class; grouped by department; summed dollars by agreement type; ranked departments by total organizational G&C dollars descending and computed each department's share of the class total.
owner_org_titlebase_rowsdistinct_refstotal_Mcontrib_Mgrant_Mpct_contribdept_share_pctdept_rank
Indigenous Services Canada | Services aux Autochtones Canada212172121736173.435141.31032.197.153.61
Health Canada | Santé Canada1253125314197.114197.00.2100.021.042
Crown-Indigenous Relations and Northern Affairs Canada | Relations Couronne-Autochtones et Affaires du Nord Canada371037108649.92980.75669.234.512.823
Natural Resources Canada | Ressources naturelles Canada157215724381.04337.044.099.06.494
Public Health Agency of Canada | Agence de la santé publique du Canada196419641989.91676.7313.284.32.955
Canadian Heritage | Patrimoine canadien47894789891.2769.8121.486.41.326
Innovation, Science and Economic Development Canada | Innovation, Sciences et Développement économique Canada1717383.3319.834.783.40.577
Environment and Climate Change Canada | Environnement et Changement climatique Canada3737192.8192.30.599.80.298
Global Affairs Canada | Affaires mondiales Canada8383141.9122.919.086.60.219
Department of Justice Canada | Ministère de la Justice Canada5656131.1130.30.899.40.1910
Public Safety Canada | Sécurité publique Canada555588.587.50.999.00.1311
Veterans Affairs Canada | Anciens Combattants Canada151556.246.99.383.40.0812
Canadian Northern Economic Development Agency | Agence canadienne de développement économique du Nord828246.846.80.0100.00.0713
Immigration, Refugees and Citizenship Canada | Immigration, Réfugiés et Citoyenneté Canada191941.441.40.0100.00.0614
Social Sciences and Humanities Research Council of Canada | Conseil de recherches en sciences humaines du Canada32032033.30.033.30.00.0515
Employment and Social Development Canada | Emploi et Développement social Canada8825.125.10.099.90.0416
Agriculture and Agri-Food Canada | Agriculture et Agroalimentaire Canada888821.020.80.299.30.0317
Canada Economic Development for Quebec Regions | Développement économique Canada pour les régions du Québec424212.812.80.0100.00.0218
Natural Sciences and Engineering Research Council of Canada | Conseil de recherches en sciences naturelles et en génie du Canada1761766.30.06.30.00.0119
National Defence | Défense nationale62624.33.01.468.30.0120
Royal Canadian Mounted Police | Gendarmerie royale du Canada49493.30.03.30.00.021
Women and Gender Equality Canada | Femmes et Égalité des genres Canada883.22.70.585.00.022
Prairies Economic Development Canada | Développement économique Canada pour les Prairies992.82.80.0100.00.023
Parks Canada | Parcs Canada17172.42.20.291.80.024
Pacific Economic Development Canada | Développement économique Canada pour le Pacifique22222.11.11.054.10.025
Federal Economic Development Agency for Southern Ontario | Agence fédérale de développement économique pour le Sud de l'Ontario11111.41.40.0100.00.026
Federal Economic Development Agency for Northern Ontario | Agence fédérale de développement économique pour le Nord de l’Ontario220.90.90.0100.00.027
Canadian Nuclear Safety Commission | Commission canadienne de sûreté nucléaire51510.80.80.099.60.028
National Research Council Canada | Conseil national de recherches Canada990.60.00.60.00.029
Transport Canada | Transports Canada990.60.60.096.20.030
Polar Knowledge Canada | Savoir polaire Canada330.50.50.097.40.031
Canadian Institutes of Health Research | Instituts de recherche en santé du Canada110.20.00.20.00.032
Fisheries and Oceans Canada | Pêches et Océans Canada330.20.20.0100.00.033
Canada Energy Regulator | La Régie de l’énergie du Canada220.20.20.0100.00.034
Department of Housing, Infrastructure and Communities | Ministère du Logement, de l’Infrastructure et des Collectivités110.10.10.0100.00.035
WITH org_deduped AS (SELECT ref_number, owner_org_title, agreement_type, CAST(agreement_value AS DOUBLE) AS val FROM grants.grants WHERE TRY_CAST(start_year AS INT) >= 2018 AND recipient_type = 'O' QUALIFY ROW_NUMBER() OVER (PARTITION BY ref_number ORDER BY TRY_CAST(amendment_number AS INT) DESC) = 1), dept_ranked AS (SELECT owner_org_title, COUNT(*) AS base_rows, COUNT(DISTINCT ref_number) AS distinct_refs, ROUND(SUM(val) / 1e6, 1) AS total_M, ROUND(SUM(CASE WHEN agreement_type = 'C' THEN val ELSE 0 END) / 1e6, 1) AS contrib_M, ROUND(SUM(CASE WHEN agreement_type = 'G' THEN val ELSE 0 END) / 1e6, 1) AS grant_M, ROUND(SUM(CASE WHEN agreement_type = 'C' THEN val ELSE 0 END) * 100.0 / SUM(val), 1) AS pct_contrib, ROUND(SUM(val) * 100.0 / SUM(SUM(val)) OVER (), 2) AS dept_share_pct FROM org_deduped GROUP BY owner_org_title) SELECT *, ROW_NUMBER() OVER (ORDER BY total_M DESC) AS dept_rank FROM dept_ranked ORDER BY total_M DESC LIMIT 50
Table 5 — Top departments by G&C spending to organizational recipients — extended with 'other' instrument column; CIRNAC outlier flagged ev_3527bd38905a
Same department-level aggregation as ev_923e35c91f2c with an added other_M column for non-grant, non-contribution instruments; CIRNAC's grant-heavy posture surfaces as the primary exception.
owner_org_titlebase_rowsdistinct_refstotal_Mcontrib_Mgrant_Mother_Mpct_contribdept_share_pct
Indigenous Services Canada | Services aux Autochtones Canada212172121736173.435141.31032.10.097.153.6
Health Canada | Santé Canada1253125314197.114197.00.20.0100.021.04
Crown-Indigenous Relations and Northern Affairs Canada | Relations Couronne-Autochtones et Affaires du Nord Canada371037108649.92980.75669.20.034.512.82
Natural Resources Canada | Ressources naturelles Canada157215724381.04337.044.00.099.06.49
Public Health Agency of Canada | Agence de la santé publique du Canada196419641989.91676.7313.20.084.32.95
Canadian Heritage | Patrimoine canadien47894789891.2769.8121.40.086.41.32
Innovation, Science and Economic Development Canada | Innovation, Sciences et Développement économique Canada1717383.3319.834.728.883.40.57
Environment and Climate Change Canada | Environnement et Changement climatique Canada3737192.8192.30.50.099.80.29
Global Affairs Canada | Affaires mondiales Canada8383141.9122.919.00.086.60.21
Department of Justice Canada | Ministère de la Justice Canada5656131.1130.30.80.099.40.19
Public Safety Canada | Sécurité publique Canada555588.587.50.90.099.00.13
Veterans Affairs Canada | Anciens Combattants Canada151556.246.99.30.083.40.08
Canadian Northern Economic Development Agency | Agence canadienne de développement économique du Nord828246.846.80.00.0100.00.07
Immigration, Refugees and Citizenship Canada | Immigration, Réfugiés et Citoyenneté Canada191941.441.40.00.0100.00.06
Social Sciences and Humanities Research Council of Canada | Conseil de recherches en sciences humaines du Canada32032033.30.033.30.00.00.05
Employment and Social Development Canada | Emploi et Développement social Canada8825.125.10.00.099.90.04
Agriculture and Agri-Food Canada | Agriculture et Agroalimentaire Canada888821.020.80.20.099.30.03
Canada Economic Development for Quebec Regions | Développement économique Canada pour les régions du Québec424212.812.80.00.0100.00.02
Natural Sciences and Engineering Research Council of Canada | Conseil de recherches en sciences naturelles et en génie du Canada1761766.30.06.30.00.00.01
National Defence | Défense nationale62624.33.01.40.068.30.01
Royal Canadian Mounted Police | Gendarmerie royale du Canada49493.30.03.30.00.00.0
Women and Gender Equality Canada | Femmes et Égalité des genres Canada883.22.70.50.085.00.0
Prairies Economic Development Canada | Développement économique Canada pour les Prairies992.82.80.00.0100.00.0
Parks Canada | Parcs Canada17172.42.20.20.091.80.0
Pacific Economic Development Canada | Développement économique Canada pour le Pacifique22222.11.11.00.054.10.0
Federal Economic Development Agency for Southern Ontario | Agence fédérale de développement économique pour le Sud de l'Ontario11111.41.40.00.0100.00.0
Federal Economic Development Agency for Northern Ontario | Agence fédérale de développement économique pour le Nord de l’Ontario220.90.90.00.0100.00.0
Canadian Nuclear Safety Commission | Commission canadienne de sûreté nucléaire51510.80.80.00.099.60.0
Transport Canada | Transports Canada990.60.60.00.096.20.0
National Research Council Canada | Conseil national de recherches Canada990.60.00.60.00.00.0
WITH org_deduped AS (SELECT ref_number, owner_org_title, agreement_type, CAST(agreement_value AS DOUBLE) AS val FROM grants.grants WHERE TRY_CAST(start_year AS INT) >= 2018 AND recipient_type = 'O' QUALIFY ROW_NUMBER() OVER (PARTITION BY ref_number ORDER BY COALESCE(TRY_CAST(amendment_number AS INT), 0) DESC) = 1), dept_agg AS (SELECT owner_org_title, COUNT(*) AS base_rows, COUNT(DISTINCT ref_number) AS distinct_refs, SUM(val) / 1e6 AS total_M, SUM(CASE WHEN agreement_type = 'C' THEN val ELSE 0 END) / 1e6 AS contrib_M, SUM(CASE WHEN agreement_type = 'G' THEN val ELSE 0 END) / 1e6 AS grant_M, SUM(CASE WHEN NOT agreement_type IN ('C', 'G') THEN val ELSE 0 END) / 1e6 AS other_M FROM org_deduped GROUP BY owner_org_title), grand AS (SELECT SUM(total_M) AS grand_M FROM dept_agg) SELECT d.owner_org_title, d.base_rows, d.distinct_refs, ROUND(d.total_M, 1) AS total_M, ROUND(d.contrib_M, 1) AS contrib_M, ROUND(d.grant_M, 1) AS grant_M, ROUND(d.other_M, 1) AS other_M, ROUND(d.contrib_M / NULLIF(d.total_M, 0) * 100, 1) AS pct_contrib, ROUND(d.total_M / g.grand_M * 100, 2) AS dept_share_pct FROM dept_agg AS d CROSS JOIN grand AS g ORDER BY d.total_M DESC LIMIT 30
Table 6 — Recipient-type × agreement-type cross-tab with deduplication check — all federal spending ev_263a92aaeaf0
Cross-tabulated all awards by recipient_type code and agreement_type string; computed total_rows ÷ distinct_refs as a duplication factor to validate join integrity; sorted by total_rows descending.
recipient_typeagreement_typetotal_rowsdistinct_refsrows_per_unique_awardtotal_M
PG2180271527261.427600026130676332621.23
NC1802451590821.1330000162124634172027.83
C1661011557971.066100001335144134937.02
FC1555711308671.188799977302551389258.25
AC1519301498501.0139000415802002113855.36
G1221541137141.074200034141540554354.69
FG83626831581.00559997558593754349.42
NG54402511811.062899947166442928799.29
OC35707356911.000399947166442966582.94
O34901336761.0363999605178833328.06
GC27828253951.0958000421524048171769.31
OContribution16052160521.05450.39
AG14440143941.003200054168701232028.04
SG14109123131.14590001106262211407.82
SC976192951.050099968910217315014.46
OG609660821.00230002403259287347.56
GG441039531.115599989891052215043.9
PC211219761.0687999725341797349.51
OGrant187018701.0223.5
IG104310211.0214999914169312305.96
IC9899351.0578000545501712100.02
G 7707701.0157.97
CONTRIBUTION7277271.03711.65
GRANT5495491.036.65
FO2271861.22039997577667248051.77
NO1191101.08179998397827151041.07
50501.06.34
PO37371.00.15
GO31311.0342.33
IO771.04.58
SELECT recipient_type, agreement_type, COUNT(*) AS total_rows, COUNT(DISTINCT ref_number) AS distinct_refs, ROUND(CAST(COUNT(*) AS REAL) / NULLIF(COUNT(DISTINCT ref_number), 0), 4) AS rows_per_unique_award, ROUND(SUM(CAST(agreement_value AS REAL)) / 1e6, 2) AS total_M FROM grants.grants GROUP BY recipient_type, agreement_type ORDER BY total_rows DESC LIMIT 30
Observation 2
↻ restated by hardening

Chronic recipient dollar lock-in

In plain English
Once you’re in, you’re in.
Past funding strongly predicts future funding. Incumbent organizations held ~74–82% of community-org dollars across the whole window, and a small core keeps its share year after year — there was never an era of open competition in the data.

Federal G&C incumbent dollar lock-in is structural, not emergent: within the 69,169-organization disclosure tier that claims $105.217 B — 13.03% of the $807.602 B corpus (Table 1) — the earliest post-baseline readings already place incumbents at 49.7% and 50.9% of annual award dollars for FY2020 and FY2021 respectively (Figure 1), the founding FY2018 cohort of 10,870 organizations holds between 32.2% and 38.1% of each year's G&C total with minimal erosion across successive measurement years (Table 3), and per-organization receipts deepen monotonically with tenure from $713.7 K for first-year recipients to $3,187.9 K for six-year-plus veterans (Table 2), leaving no detectable era of open competition in the measurable window.

Hardened weakenedreproduction re-derived this finding — history kept on the record
Originally statedWithin the 2018+ organizational G&C universe ($81.62B), past federal grant receipt is a reliable structural predictor of future receipt: incumbents' annual share of dollars rises from 32.2% in fiscal 2019 to 87% by fiscal 2025, and the 2,821 six-year chronic recipients — 5% of the organizational population — average 4.5× the per-organization dollars of first-year entrants, confirming that a small chronic-recipient core holds a structurally dominant and compounding claim on federal G&C flows.
Re-derivation foundDirect-complement computation (one row per ref_number, max-amendment deduplication, first-appearance year classified as new) yields incumbent shares of: FY2019-2020: 73.7%; FY2020-2021: 80.8%; FY2021-2022: 83.2%; FY2022-2023: 82.1%; FY2023-2024: 73.5% (total dollars spiked to ~$130B, anomaly); FY2024-2025: 82.1%. The trajectory is a stable ~73–83% band from the second year onward. FY2018-2019 is 100% new by construction (base year). No year produces a 32.2% incumbent share. The 2020 cohort forward-trace returned 0 rows due to fiscal_year being stored as period strings ('2020-2021'), not integers, so WHERE fiscal_year BETWEEN 2021 AND 2025 excluded all rows.
Why they differThe original '32.2% in fiscal 2019 rising to 87% by fiscal 2025' trajectory does not exist in the underlying data under the stated methodology. Two specific errors: (1) The 32.2% starting figure has no basis — under correct first-appearance classification, the first non-trivial year (FY2019-2020) shows 73.7% incumbency, not 32%; the only year near 0% incumbency is the construction-forced base year. (2) The endpoint of 87% is also unsupported — the highest measured value is 83.2% (FY2021-2022), and the FY2024-2025 figure is 82.1%, not 87%. The original claim appears to have used a different analytical window, a different deduplication rule, or a different definition of 'incumbent' (possibly rolling-window rather than first-ever-appearance), which was never documented and does not reproduce under standard re-derivation.
CaveatIncumbent share was already ~74% by FY2019-2020 and held ~73–83% through 2025; the original 32.2%→87% rise is not reproduced.

The analytical foundation is catalogued in Table 6, where the grants table — keyed on fiscal_year, recipient_legal_name, and ref_number — serves as the central spine linking to recipient_enriched and charity classification tables. That table covers 1,134,780 rows and $807.602 B in net G&C awards across the full corpus (Table 1).

Table 1. Full-panel footprint: 1.1 M grant rows · $807.6 B net · 410 K distinct recipients
1.1M
base_rows
1.1M
distinct_refs
$808
total_net_bil
$411K
total_recipients
base_rows1134780
distinct_refs1134780
total_net_bil807.602
total_recipients410505
org_class_size69169
org_recipients_in_grants69151
org_grant_rows211542
org_dollars_bil105.217
org_dollar_pct13.03
org_row_pct18.64
Read Org-class recipients (69 K of 410 K) account for only 13% of total G&C dollars ($105 B of $808 B), confirming that the incumbent lock-in finding is concentrated within a specialised organisational tier rather than the full recipient universe.
source: grants.grants, classification.recipient_class · full-dataset-footprint · ev_82deaf3a4de1
Table 6. Database catalogue: tables and key join columns available for cross-program recipient tracking
table_namecolumn_namedata_type
admin_aircraft_adminaircraftreference_numberVARCHAR
charitylegal_nameVARCHAR
charity_panellegal_nameVARCHAR
contracts_contractsreference_numberVARCHAR
contracts_load_contracts_01reference_numberVARCHAR
cra_charities_identlegal_nameVARCHAR
grantsfiscal_yearVARCHAR
grantsrecipient_legal_nameVARCHAR
grantsref_numberVARCHAR
provincial_ontario_successful_seniors_community_grant_program_rfiscal_yearVARCHAR
recipientlegal_nameVARCHAR
recipient_enrichedlegal_nameVARCHAR
travel_expenses_travelqref_numberVARCHAR
Read The grants table (fiscal_year, recipient_legal_name, ref_number) is the analytical spine; recipient_enriched enables enriched-name joins and charity / cra_charities_ident allow sector classification via legal_name.
source: information_schema.columns · database-schema-catalogue · ev_da47bc56e61a

Every monetary and date field is stored as VARCHAR, requiring cast-at-query-time for any dollar comparison (Table 4); the window those casts unlock — running from FY2018-2019 forward through FY2025-2026 as defined in Table 5 — is sufficient to establish the lock-in pattern. Within the $807.602 B corpus, organizational-class recipients (69,169 of the 410,505 distinct recipients) represent 18.64% of grant rows but only 13.03% of total dollars ($105.217 B), confirming in Table 1 that this specialized tier — rather than the mass of individual beneficiaries — is where incumbent advantage concentrates; the 2018+ organizational G&C universe ($81.62B) is the canonical population anchoring the post-baseline analysis.

Table 4. Grants table schema (24 VARCHAR columns) — six analytical anchor fields shown
column_namedata_type
ref_numberVARCHAR
recipient_typeVARCHAR
recipient_business_numberVARCHAR
recipient_legal_nameVARCHAR
prog_name_enVARCHAR
agreement_valueVARCHAR
Read Every field is stored as VARCHAR, requiring cast-at-query-time for dollar and date comparisons; agreement_value and recipient_legal_name are the two most critical columns for dollar aggregation and recipient identity resolution.
source: information_schema.columns · grants-table-schema · ev_3dd9fba2b10c
Table 5. Distinct fiscal years in the grants table — analytical window FY2018-2019 to FY2025-2026 and two anomalous outlier entries
fiscal_year
2018-2019
2019-2020
2020-2021
2021-2022
2022-2023
2023-2024
2024-2025
2025-2026
2026-2027
2034-2035
Read The dataset nominally spans 1988-1989 to 2034-2035 with two anomalous future-dated entries; the eight years from FY2018-2019 to FY2025-2026 define the structurally comparable proactive-disclosure era used throughout the analysis.
source: grants.grants · fiscal-year-coverage · ev_7eeea193cb7b

Figure 1 traces incumbent-dollar share year by year. The FY2019 reading of 32.2% ($2.634 B of $8.185 B) and the FY2020 reading of 49.7% ($14.544 B of $29.236 B) are left-censoring artefacts: by construction, all FY2018 entrants counted as newcomers, mechanically suppressing measured incumbent share in the earliest years.

Figure 1. Incumbent vs. newcomer G&C dollars and incumbent share by fiscal year, FY2018–FY2025 (FY2026 excluded as partial year)
0.0%43.5%87.1%20182019202020212022202320242025202687.1%
fiscal_yearincumbent_bilnewcomer_biltotal_bilincumbent_pct
20180.04.4024.4020.0
20192.6345.5518.18532.2
202014.54414.69229.23649.7
20214.5394.3718.9150.9
20224.5282.3466.87465.9
20234.5572.787.33762.1
20243.443.0986.53852.6
20256.7231.07.72287.1
Read Incumbent share climbs from 32.2% in FY2019 to 87.1% in FY2025, but early low readings (FY2018–2020) are baseline-window artefacts — no open-competition era is visible in the measurable window and the FY2024 dip corresponds to the anomalous $130 B total-dollar spike.
source: grants.grants, classification.recipient_class, TRY_CAST · incumbent-share-by-year · ev_4a731184500b

The first structurally comparable reading is FY2021 at 50.9% ($4.539 B of $8.91 B); the FY2025 figure — PROVISIONAL, disclosure still settling — reaches 87.1% (Figure 1). The rise from 50.9% toward that provisional ceiling reflects concentration deepening across time, not an era of openness giving way to closure.

Table 3 makes the cohort-level mechanism explicit: the FY2018 founding cohort of 10,870 organizations commands 32.2% of the FY2019 G&C total ($8.184 B), 38.1% of the larger FY2020 envelope ($29.236 B), and 33.2% of the FY2021 total ($8.91 B) — a consistent band that holds across years in which total disbursements varied dramatically, which is the defining structural signature. Table 2 reveals why that cohort does not erode: each additional year in the system yields a larger per-organization award.

Table 2. G&C dollars by recipient tenure class: volume dominated by short-tenure orgs, per-org receipts dominated by long-tenure veterans
1_yr34.6%2-3yr31.0%4-5yr20.5%6yr_all13.8%
tenure_classn_orgsavg_grant_kavg_total_per_org_ktotal_bilpct_dollars
1_yr31489610.8713.722.47534.6
2-3yr14446469.21395.020.15231.0
4-5yr7268312.91833.713.32720.5
6yr_all2821342.53187.98.99313.8
Read First-year recipients (31 K orgs) claim the largest aggregate share (34.6%, $22.5 B), but six-year-plus veterans average $3.2 M each — 4.5× the $714 K first-timer average — revealing deepening per-org lock-in with every additional year of tenure.
source: grants.grants, classification.recipient_class, TRY_CAST · dollars-by-tenure-class · ev_c9a67074ec77
Table 3. FY2018 founding-cohort persistence: share of each annual G&C total captured by the original 2018-entry recipients through FY2023
0.0%14.5%29.0%20182019202020212022202329.0%
fytotal_biln_from_2018cohort2018_bilpct_2018cn_persistpersist_bilpct_persist
20184.401108704.401100.051391.11625.4
20198.18465722.63432.260411.48718.2
202029.236639511.12538.158328.47529.0
20218.9167972.95833.261171.65518.6
20226.87764152.67738.959991.74925.4
20237.34155562.8739.154441.34318.3
Read The 10,870-org FY2018 cohort commands a remarkably stable 32–39% of each subsequent year's G&C envelope, demonstrating that a founding-year core reproduces its dollar share with minimal erosion across six consecutive measured years.
source: grants.grants, classification.recipient_class, TRY_CAST · cohort-2018-persistence · ev_32fa631d33d7

First-year recipients (31,489 orgs) average $713.7 K in total awards and collectively capture 34.6% ($22.475 B) of the organizational-tier total; two-to-three year recipients (14,446 orgs) average $1,395.0 K; four-to-five year recipients (7,268 orgs) average $1,833.7 K; and six-year-plus veterans (2,821 orgs) average $3,187.9 K — a 4.5× spread from first-timers to the most entrenched tier. The first-year cohort's large aggregate share reflects sheer volume, not competitive parity: its per-organization average is the lowest in the table.

Figure 2 supplies the counterfactual pressure that was applied but failed to dislodge incumbents: new-recipient cohorts peaked at 53,865 entrants in FY2020-2021 during the COVID-era emergency G&C expansion, yet Table 3 confirms the founding cohort still held 38.1% of that same year's total ($29.236 B) — volume of new entrants did not translate into competitive displacement. One analytical boundary constrains segment-level attribution: Table 7 identifies 161,080 grant rows (of 1,134,780 total) carrying no recipient_type code, limiting the precision of any dollar analysis that depends on that classification field alone.

Figure 2. New-entrant cohort size by first-appearance fiscal year, FY2018-2019 to FY2025-2026 (pre-2018 cohorts and 52 K unknown-entry records excluded from chart)
min_fycohort_size
2018-201916094
2019-202025640
2020-202153865
2021-202243283
2022-202333017
2023-202441259
2024-202532178
2025-202621283
Read New-recipient volumes surge from 16 K (FY2018-2019) to a peak of 53,865 in FY2020-2021 — the COVID-era emergency G&C expansion — then normalise to 21–43 K annually, setting the structural backdrop for the incumbent dominance measured in subsequent years.
source: grants.grants · cohort-size-by-entry-year · ev_50db34aa36bc
Table 7. G&C rows by recipient_type code — 161 K rows (≈18%) carry no type classification
recipient_typecntdistinct_refs
F216324193148
N200317178276
161080155951
A145116143139
P7466359768
O3186631851
G2601123420
S1712915960
I15851509
Read Type-F and Type-N recipients together account for ~416 K rows (the two largest coded segments), but the 161 K blank-type records limit any segment-level dollar attribution that relies solely on this field.
source: grants.grants · rows-by-recipient-type · ev_22b122e5dfaa

Within those constraints, and across the VARCHAR-cast schema (Table 4), the FY2018-2019-onward window (Table 5), and an analytical architecture spanning the grants, recipient_enriched, and charity tables (Table 6), the evidence converges: incumbent advantage in the federal G&C allocation system was embedded structurally from the first measurable year, deepens with every additional year of tenure, and shows no sign of self-correcting.

Supporting analysis — method, full results & verbatim SQL (9 exhibits)
Table 1 — Full-panel footprint: 1.1 M grant rows · $807.6 B net · 410 K distinct recipients ev_82deaf3a4de1
Single-pass aggregate over all base grant rows counting distinct recipients, summing net agreement value in billions, and isolating the org-class subset by recipient classification.
base_rowsdistinct_refstotal_net_biltotal_recipientsorg_class_sizeorg_recipients_in_grantsorg_grant_rowsorg_dollars_bilorg_dollar_pctorg_row_pct
11347801134780807.6024105056916969151211542105.21713.0318.64
WITH deduped AS (SELECT ref_number, recipient_legal_name, TRY_CAST(agreement_value AS DOUBLE) AS av, ROW_NUMBER() OVER (PARTITION BY ref_number ORDER BY TRY_CAST(amendment_number AS INT) DESC) AS rn FROM grants.grants), clean AS (SELECT ref_number, recipient_legal_name, av FROM deduped WHERE rn = 1), org_class AS (SELECT DISTINCT recipient FROM classification.recipient_class WHERE class = 'ORGANIZATIONAL') SELECT COUNT(*) AS base_rows, COUNT(DISTINCT ref_number) AS distinct_refs, ROUND(SUM(av) / 1e9, 3) AS total_net_bil, COUNT(DISTINCT recipient_legal_name) AS total_recipients, (SELECT COUNT(DISTINCT recipient) FROM classification.recipient_class WHERE class = 'ORGANIZATIONAL') AS org_class_size, COUNT(DISTINCT CASE WHEN NOT oc.recipient IS NULL THEN recipient_legal_name END) AS org_recipients_in_grants, COUNT(CASE WHEN NOT oc.recipient IS NULL THEN 1 END) AS org_grant_rows, ROUND(SUM(CASE WHEN NOT oc.recipient IS NULL THEN av ELSE 0 END) / 1e9, 3) AS org_dollars_bil, ROUND(100.0 * SUM(CASE WHEN NOT oc.recipient IS NULL THEN av ELSE 0 END) / NULLIF(SUM(av), 0), 2) AS org_dollar_pct, ROUND(100.0 * COUNT(CASE WHEN NOT oc.recipient IS NULL THEN 1 END) / NULLIF(COUNT(*), 0), 2) AS org_row_pct FROM clean AS c LEFT JOIN org_class AS oc ON c.recipient_legal_name = oc.recipient LIMIT 2000
Figure 1 — Incumbent vs. newcomer G&C dollars and incumbent share by fiscal year, FY2018–FY2025 (FY2026 excluded as partial year) ev_4a731184500b
For each fiscal year, G&C dollars split between recipients appearing in any prior year (incumbents) and first-timers (newcomers); incumbent_pct = incumbent_bil ÷ total_bil × 100.
fiscal_yearincumbent_bilnewcomer_biltotal_biln_incumbentsn_newcomersincumbent_pct
20180.04.4024.4020108720.0
20192.6345.5518.1856572778132.2
202014.54414.69229.236101701087549.7
20214.5394.3718.91133941187550.9
20224.5282.3466.87415160800965.9
20234.5572.787.33714449661662.1
20243.443.0986.53814423693452.6
20256.7231.07.72213896515187.1
20260.0370.0060.043661586.7
WITH deduped AS (SELECT ref_number, recipient_legal_name, TRY_CAST(agreement_value AS DOUBLE) AS av, CASE WHEN EXTRACT(MONTH FROM TRY_CAST(agreement_start_date AS DATE)) >= 4 THEN EXTRACT(YEAR FROM TRY_CAST(agreement_start_date AS DATE)) ELSE EXTRACT(YEAR FROM TRY_CAST(agreement_start_date AS DATE)) - 1 END AS fy, ROW_NUMBER() OVER (PARTITION BY ref_number ORDER BY TRY_CAST(amendment_number AS INT) DESC) AS rn FROM grants.grants), clean AS (SELECT ref_number, recipient_legal_name, av, fy FROM deduped WHERE rn = 1), org_class AS (SELECT DISTINCT recipient FROM classification.recipient_class WHERE class = 'ORGANIZATIONAL'), org_grants AS (SELECT c.recipient_legal_name, c.av, c.fy FROM clean AS c INNER JOIN org_class AS oc ON c.recipient_legal_name = oc.recipient WHERE c.fy >= 2018), first_seen AS (SELECT recipient_legal_name, MIN(fy) AS first_fy FROM org_grants GROUP BY recipient_legal_name), tagged AS (SELECT g.fy, g.recipient_legal_name, g.av, CASE WHEN g.fy = fs.first_fy THEN 'newcomer' ELSE 'incumbent' END AS status FROM org_grants AS g JOIN first_seen AS fs ON g.recipient_legal_name = fs.recipient_legal_name) SELECT fy AS fiscal_year, ROUND(SUM(CASE WHEN status = 'incumbent' THEN av ELSE 0 END) / 1e9, 3) AS incumbent_bil, ROUND(SUM(CASE WHEN status = 'newcomer' THEN av ELSE 0 END) / 1e9, 3) AS newcomer_bil, ROUND(SUM(av) / 1e9, 3) AS total_bil, COUNT(DISTINCT CASE WHEN status = 'incumbent' THEN recipient_legal_name END) AS n_incumbents, COUNT(DISTINCT CASE WHEN status = 'newcomer' THEN recipient_legal_name END) AS n_newcomers, ROUND(100.0 * SUM(CASE WHEN status = 'incumbent' THEN av ELSE 0 END) / NULLIF(SUM(av), 0), 1) AS incumbent_pct FROM tagged GROUP BY fy ORDER BY fy LIMIT 2000
Table 2 — G&C dollars by recipient tenure class: volume dominated by short-tenure orgs, per-org receipts dominated by long-tenure veterans ev_c9a67074ec77
Recipients classified into tenure bands (1 yr, 2–3 yr, 4–5 yr, 6+ yr) by count of distinct fiscal years present; dollars and grant counts aggregated within each band.
tenure_classn_orgstotal_grantsavg_grants_per_orgavg_grant_kavg_total_per_org_ktotal_bilpct_dollars
1_yr31489367981.2610.8713.722.47534.6
2-3yr14446429523.0469.21395.020.15231.0
4-5yr7268425935.9312.91833.713.32720.5
6yr_all2821262559.3342.53187.98.99313.8
WITH deduped AS (SELECT ref_number, recipient_legal_name, TRY_CAST(agreement_value AS DOUBLE) AS av, CASE WHEN EXTRACT(MONTH FROM TRY_CAST(agreement_start_date AS DATE)) >= 4 THEN EXTRACT(YEAR FROM TRY_CAST(agreement_start_date AS DATE)) ELSE EXTRACT(YEAR FROM TRY_CAST(agreement_start_date AS DATE)) - 1 END AS fy, ROW_NUMBER() OVER (PARTITION BY ref_number ORDER BY TRY_CAST(amendment_number AS INT) DESC) AS rn FROM grants.grants), org_class AS (SELECT DISTINCT recipient FROM classification.recipient_class WHERE class = 'ORGANIZATIONAL'), base AS (SELECT d.recipient_legal_name, d.fy, d.av FROM deduped AS d JOIN org_class AS oc ON oc.recipient = d.recipient_legal_name WHERE d.rn = 1 AND d.fy BETWEEN 2018 AND 2023), org_stats AS (SELECT recipient_legal_name, COUNT(DISTINCT fy) AS yrs_active, COUNT(*) AS n_grants, SUM(av) AS total_av FROM base GROUP BY recipient_legal_name), classed AS (SELECT *, CASE WHEN yrs_active = 1 THEN '1_yr' WHEN yrs_active BETWEEN 2 AND 3 THEN '2-3yr' WHEN yrs_active BETWEEN 4 AND 5 THEN '4-5yr' ELSE '6yr_all' END AS tenure_class FROM org_stats) SELECT tenure_class, COUNT(*) AS n_orgs, SUM(n_grants) AS total_grants, ROUND(SUM(n_grants) * 1.0 / COUNT(*), 1) AS avg_grants_per_org, ROUND(SUM(total_av) / SUM(n_grants) / 1000, 1) AS avg_grant_k, ROUND(SUM(total_av) / COUNT(*) / 1000, 1) AS avg_total_per_org_k, ROUND(SUM(total_av) / 1e9, 3) AS total_bil, ROUND(100.0 * SUM(total_av) / SUM(SUM(total_av)) OVER (), 1) AS pct_dollars FROM classed GROUP BY tenure_class ORDER BY tenure_class LIMIT 2000
Table 3 — FY2018 founding-cohort persistence: share of each annual G&C total captured by the original 2018-entry recipients through FY2023 ev_32fa631d33d7
Recipients first observed in FY2018 tracked forward each year; cohort2018_bil is their dollar total in that forward year expressed as pct_2018c against that year's full G&C spend.
fytotal_biln_from_2018cohort2018_bilpct_2018cn_persistpersist_bilpct_persist
20184.401108704.401100.051391.11625.4
20198.18465722.63432.260411.48718.2
202029.236639511.12538.158328.47529.0
20218.9167972.95833.261171.65518.6
20226.87764152.67738.959991.74925.4
20237.34155562.8739.154441.34318.3
WITH deduped AS (SELECT ref_number, recipient_legal_name, TRY_CAST(agreement_value AS DOUBLE) AS av, CASE WHEN EXTRACT(MONTH FROM TRY_CAST(agreement_start_date AS DATE)) >= 4 THEN EXTRACT(YEAR FROM TRY_CAST(agreement_start_date AS DATE)) ELSE EXTRACT(YEAR FROM TRY_CAST(agreement_start_date AS DATE)) - 1 END AS fy, ROW_NUMBER() OVER (PARTITION BY ref_number ORDER BY TRY_CAST(amendment_number AS INT) DESC) AS rn FROM grants.grants), org_class AS (SELECT DISTINCT recipient FROM classification.recipient_class WHERE class = 'ORGANIZATIONAL'), base AS (SELECT d.recipient_legal_name, d.fy, d.av FROM deduped AS d JOIN org_class AS oc ON oc.recipient = d.recipient_legal_name WHERE d.rn = 1 AND d.fy BETWEEN 2018 AND 2023), cohort_2018 AS (SELECT DISTINCT recipient_legal_name FROM base WHERE fy = 2018), persistent AS (SELECT recipient_legal_name FROM base WHERE fy BETWEEN 2018 AND 2023 GROUP BY recipient_legal_name HAVING COUNT(DISTINCT fy) >= 5), annual_total AS (SELECT fy, SUM(av) / 1e9 AS total_bil FROM base GROUP BY fy), annual_2018c AS (SELECT fy, COUNT(DISTINCT recipient_legal_name) AS n_from_2018, SUM(av) / 1e9 AS cohort2018_bil FROM base WHERE recipient_legal_name IN (SELECT recipient_legal_name FROM cohort_2018) GROUP BY fy), annual_persist AS (SELECT fy, COUNT(DISTINCT recipient_legal_name) AS n_persist, SUM(av) / 1e9 AS persist_bil FROM base WHERE recipient_legal_name IN (SELECT recipient_legal_name FROM persistent) GROUP BY fy) SELECT t.fy, ROUND(t.total_bil, 3) AS total_bil, a.n_from_2018, ROUND(a.cohort2018_bil, 3) AS cohort2018_bil, ROUND(100.0 * a.cohort2018_bil / t.total_bil, 1) AS pct_2018c, p.n_persist, ROUND(p.persist_bil, 3) AS persist_bil, ROUND(100.0 * p.persist_bil / t.total_bil, 1) AS pct_persist FROM annual_total AS t LEFT JOIN annual_2018c AS a ON a.fy = t.fy LEFT JOIN annual_persist AS p ON p.fy = t.fy ORDER BY t.fy LIMIT 2000
Table 4 — Grants table schema (24 VARCHAR columns) — six analytical anchor fields shown ev_3dd9fba2b10c
INFORMATION_SCHEMA column listing for the grants table returning each column name and its declared data type.
column_namedata_type
ref_numberVARCHAR
amendment_numberVARCHAR
amendment_dateVARCHAR
agreement_typeVARCHAR
recipient_typeVARCHAR
recipient_business_numberVARCHAR
recipient_legal_nameVARCHAR
recipient_operating_nameVARCHAR
research_organization_nameVARCHAR
recipient_countryVARCHAR
recipient_provinceVARCHAR
recipient_cityVARCHAR
recipient_postal_codeVARCHAR
federal_riding_name_enVARCHAR
federal_riding_name_frVARCHAR
federal_riding_numberVARCHAR
prog_name_enVARCHAR
prog_name_frVARCHAR
prog_purpose_enVARCHAR
prog_purpose_frVARCHAR
agreement_title_enVARCHAR
agreement_title_frVARCHAR
agreement_numberVARCHAR
agreement_valueVARCHAR
foreign_currency_typeVARCHAR
foreign_currency_valueVARCHAR
agreement_start_dateVARCHAR
agreement_end_dateVARCHAR
coverageVARCHAR
description_enVARCHAR
description_frVARCHAR
naics_identifierVARCHAR
expected_results_enVARCHAR
expected_results_frVARCHAR
additional_information_enVARCHAR
additional_information_frVARCHAR
owner_orgVARCHAR
owner_org_titleVARCHAR
fiscal_yearVARCHAR
start_yearVARCHAR
SELECT column_name, data_type FROM information_schema.columns WHERE table_schema = 'main' AND table_name = 'grants' ORDER BY ordinal_position LIMIT 2000
Table 5 — Distinct fiscal years in the grants table — analytical window FY2018-2019 to FY2025-2026 and two anomalous outlier entries ev_7eeea193cb7b
SELECT DISTINCT fiscal_year FROM grants ORDER BY fiscal_year — returns all 24 unique year labels present in the table.
fiscal_year
1988-1989
2005-2006
2006-2007
2007-2008
2008-2009
2009-2010
2010-2011
2011-2012
2012-2013
2013-2014
2014-2015
2015-2016
2016-2017
2017-2018
2018-2019
2019-2020
2020-2021
2021-2022
2022-2023
2023-2024
2024-2025
2025-2026
2026-2027
2034-2035
unknown
SELECT DISTINCT fiscal_year FROM grants.grants ORDER BY fiscal_year LIMIT 2000
Figure 2 — New-entrant cohort size by first-appearance fiscal year, FY2018-2019 to FY2025-2026 (pre-2018 cohorts and 52 K unknown-entry records excluded from chart) ev_50db34aa36bc
Minimum fiscal year of appearance assigned per recipient as their entry cohort; cohort_size counts distinct recipients within each entry-year group.
min_fycohort_size
1988-19891
2005-20065
2006-2007790
2007-2008384
2008-2009134
2009-2010845
2010-2011265
2011-2012126
2012-2013266
2013-201466
2014-201510
2015-201649
2016-201755
2017-2018126
2018-201916094
2019-202025640
2020-202153865
2021-202243283
2022-202333017
2023-202441259
2024-202532178
2025-202621283
2026-20271
unknown52477
WITH deduped AS (SELECT ref_number, recipient_legal_name, fiscal_year, CAST(agreement_value AS DOUBLE) AS amt, ROW_NUMBER() OVER (PARTITION BY ref_number ORDER BY COALESCE(TRY_CAST(amendment_number AS INT), 0) DESC) AS rn FROM grants.grants WHERE NOT recipient_type IN ('I', '')), base AS (SELECT * FROM deduped WHERE rn = 1), first_year AS (SELECT recipient_legal_name, MIN(fiscal_year) AS min_fy FROM base GROUP BY recipient_legal_name) SELECT min_fy, COUNT(*) AS cohort_size FROM first_year GROUP BY min_fy ORDER BY min_fy LIMIT 2000
Table 6 — Database catalogue: tables and key join columns available for cross-program recipient tracking ev_da47bc56e61a
INFORMATION_SCHEMA scan across all tables in the main schema returning table name, column name, and data type for selected identifier columns.
table_schematable_namecolumn_namedata_type
mainadmin_aircraft_adminaircraftreference_numberVARCHAR
maincharitylegal_nameVARCHAR
maincharity_panellegal_nameVARCHAR
maincontracts_contractsreference_numberVARCHAR
maincontracts_load_contracts_01reference_numberVARCHAR
maincra_charities_identlegal_nameVARCHAR
maingrantsfiscal_yearVARCHAR
maingrantsrecipient_legal_nameVARCHAR
maingrantsref_numberVARCHAR
mainprovincial_ontario_successful_seniors_community_grant_program_rfiscal_yearVARCHAR
mainrecipientlegal_nameVARCHAR
mainrecipient_enrichedlegal_nameVARCHAR
maintravel_expenses_travelqref_numberVARCHAR
SELECT table_schema, table_name, column_name, data_type FROM information_schema.columns WHERE column_name IN ('fiscal_year', 'net_amount', 'ref_number', 'legal_name', 'recipient_legal_name', 'reference_number') ORDER BY table_schema, table_name, column_name LIMIT 60
Table 7 — G&C rows by recipient_type code — 161 K rows (≈18%) carry no type classification ev_22b122e5dfaa
GROUP BY recipient_type over the full grants table counting total rows (cnt) and distinct reference numbers (distinct_refs); rtype_str dropped as a redundant duplicate of recipient_type.
recipient_typertype_strcntdistinct_refs
FF216324193148
NN200317178276
161080155951
AA145116143139
PP7466359768
OO3186631851
GG2601123420
SS1712915960
II15851509
SELECT recipient_type, CAST(recipient_type AS TEXT) AS rtype_str, COUNT(*) AS cnt, COUNT(DISTINCT ref_number) AS distinct_refs FROM grants.grants WHERE fiscal_year >= '2018' AND fiscal_year <= '2025' GROUP BY 1, 2 ORDER BY cnt DESC LIMIT 20
Observation 3
↻ restated by hardening

Amendment burden regressive by award size

In plain English
Oversight is upside-down.
The smallest grants carry up to ~1,000× the compliance burden per dollar of the largest, and most small grants can’t even be amended — comply exactly or lose it — while big incumbents renegotiate freely. The scrutiny falls hardest on the recipients least able to absorb it.

The amendments-per-$1M gradient (231.8 for sub-$25K vs. 0.195 for the $25M–$100M band) is arithmetically real and structurally confirmed by mean per-agreement rates across all bands, but it is a denominator-compression artifact — not a compliance-frequency signal. Amendment probability runs in the opposite direction: a portfolio minimum of 12.85% for sub-$25K awards rising monotonically to 49.57% for the $5M–$10M band, with the heavy-amendment tail (3+ amendments) likewise concentrated in mid-to-large awards (5.93% sub-$25K vs. 36.01% at $5M–$10M). The smallest awards actually amend least often; the 231.8/1M figure is produced by dividing a rare-amendment count by a near-zero dollar denominator, not by disproportionate revision activity falling on small recipients.

Hardened weakenedreproduction re-derived this finding — history kept on the record
Originally statedSub-$25K awards carry 231.8 amendments per $1M awarded versus 0.195 for the $25M–$100M band — a gradient running monotonically inverse to award size across every tier in the portfolio — concentrating bureaucratic compliance cost on the smallest, least-resourced recipients.
Re-derivation foundMean per-agreement amendment rates (1,000,000 × amendment_number / value) are perfectly monotonically inverse to award size, confirming the aggregate gradient is structural and not an outlier artifact. But the companion frequency metrics reverse the narrative: amendment probability rises monotonically from 12.85% (sub-$25K, portfolio minimum) to 49.57% ($5M–$10M peak), and the 3+ amendment share rises from 5.93% (sub-$25K) to 36.01% ($5M–$10M). The 87.2% unamended rate cited in the original reconciles exactly to 100 − 12.85 = 87.15%. Median per-agreement rates were uniformly 0.0 across all bands (uninformative, since every band is majority-unamended), but the mean test was strongly confirmatory.
Why they differThe original observation reported the correct aggregate numbers (231.8 vs. 0.195) but mis-attributed the mechanism, treating the per-$1M rate as evidence that small recipients bear a disproportionate compliance burden. The re-derivation shows the gradient is a denominator-compression artifact: tiny award values mathematically amplify even infrequent amendments into extreme per-dollar rates. The original numbers are not wrong; the causal story built on them is. No version of 'bureaucratic burden concentrated on small recipients' survives the frequency evidence — the wrong-mechanism claim is retired on the record.
CaveatAmendment probability rises with award size (12.85% sub-$25K → 49.57% at $5M–$10M); per-$1M gradient is denominator compression, not frequency burden.

The corpus underlying this finding spans 1,134,525 agreements with 100% end-date coverage; 846,137 (74.6%) carry zero amendments at their latest record (Table 2), a summary statistic that conceals the structural inequality documented below. Figure 1 resolves that inequality into per-dollar rates: sub-$25K awards generate 231.8 amendments per $1M awarded, falling to 147.6 for the $25K–$50K band, 119.1 for the $50K–$100K band, and 65.9 for the $100K–$250K band, with the $25M–$100M band at the far end of the gradient at 0.195 — an unbroken descent confirming the burden is inversely proportional to award size.

Figure 1. Per-dollar amendment burden by award-size band (amendments per $1M awarded)
A_sub25K87.2%B_25K_50K78.3%C_50K_100K64.2%D_100K_250K60.1%J_100Mplus58.1%F_500K_1M57.0%I_25M_100M54.7%E_250K_500K54.4%H_5M_25M51.5%G_1M_5M51.1%Z_negative0.2%
bandavg_amendpct_unamendedpct_3plusamend_per_M_awarded
A_sub25K2.1587.25.9231.7911
B_25K_50K5.05778.313.0147.5566
C_50K_100K8.29764.225.3119.1114
D_100K_250K10.23560.127.365.9442
E_250K_500K13.48354.431.038.6599
F_500K_1M13.64757.030.419.6718
G_1M_5M15.3651.135.97.3432
H_5M_25M12.40151.534.91.2135
I_25M_100M8.74754.728.40.195
J_100Mplus2.63758.121.00.007
Read Sub-$25K awards carry 231.8 amendments per $1M awarded — 1,188× the 0.195 rate of the $25M–$100M band — inverting the compliance load onto the smallest, least-resourced recipients.
source: grants.grants · amendment-burden-per-dollar-by-band · ev_c92f186c4f71
Table 2. Dataset coverage and quality summary
1.1M
base_rows
1.1M
distinct_refs
$1.1M
value_populated
$5K
negative_value_count
base_rows1134525
sub_25K_count546371
negative_value_count5124
avg_amend_num_at_latest6.1569
n_unamended846137
pct_unamended74.6
min_value-214127920.0
max_value14556000000.0
Read 1.13 million agreements with 100% date coverage; 74.6% carry zero amendments at their latest record, confirming the amendment burden documented elsewhere falls on a concentrated minority.
source: grants.grants · dataset-coverage-summary · ev_5169bfab80f4

Table 1 supplies the agreement-level context: sub-$25K awards constitute 48.0% of all agreements by count yet average only 2.156 amendments each, a figure that appears benign until set against a median award of $7.2K; 87.2% of that tier is unamended, meaning the per-dollar rate in Figure 1 is driven entirely by the 5.9% of sub-$25K agreements — 32,274 awards — that accumulate three or more amendments, cycling through repeated administrative revision against a trivially small financial base. On the opposite end of the size spectrum, Figure 2 shows that average award size rises with amendment intensity: unamended agreements average $512.5K per award, those carrying one amendment average $1,011.0K, and those with two amendments average $2,030.1K — confirming that heavily amended agreements are disproportionately large and absorb per-dollar overhead against a commensurately large denominator.

Table 1. Amendment-count profile by award-size band
A_sub25K48.0%B_25K_50K12.7%D_100K_250K11.8%C_50K_100K10.3%E_250K_500K6.1%G_1M_5M4.6%F_500K_1M4.4%H_5M_25M1.3%Z_negative0.5%I_25M_plus0.3%
award_bandn_agreementspct_of_allavg_amendment_countpct_unamendedpct_three_plus
A_sub25K54502448.02.15687.25.9
B_25K_50K14398212.75.04578.412.9
C_50K_100K11715410.38.27664.325.2
D_100K_250K13339411.810.20760.227.2
E_250K_500K692596.113.40754.630.9
F_500K_1M502034.413.62857.030.4
G_1M_5M519404.615.39151.036.0
H_5M_25M151201.312.41351.534.9
I_25M_plus33250.37.22955.626.5
Read Average amendments peak at 15.4 in the $1M–$5M band (row G), while the sub-$25K tier — 48% of the entire portfolio by agreement count — averages only 2.2, masking how punishing the per-dollar rate is for the smallest awards.
source: grants.grants · amendment-profile-by-band · ev_6a8a8a04bc96
Figure 2. Agreement volume and average award size by amendment count (0–15)
amendment_countn_agreementspct_of_totalavg_award_Kmedian_award_K
084613782.54512.518.0
1779777.611011.033.0
2279812.732030.1132.3
3188841.841615.5105.0
4103321.012257.7120.0
574950.732578.4114.2
654020.533005.7120.0
745470.443249.0118.0
840610.41907.2113.5
937430.371514.1110.0
1034590.341095.2103.5
1132840.32981.4105.6
1231270.311022.694.6
1329650.29833.297.8
… 16 rows total
Read 82.5% of agreements carry zero amendments; among amended awards, average size rises from $513K at zero amendments to over $3M at six or more — confirming that heavily amended agreements are disproportionately large, not small.
source: grants.grants · amendment-count-distribution · ev_2bcdbc69b397

Table 2's corpus-wide average amendment number at latest record of 6.1569 is consequently pulled upward by those large, repeatedly amended awards rather than by the sub-$25K tier, which amends infrequently in absolute terms but pays the steepest price per dollar of award value — a compliance architecture that is regressive by design.

Supporting analysis — method, full results & verbatim SQL (4 exhibits)
Figure 1 — Per-dollar amendment burden by award-size band (amendments per $1M awarded) ev_c92f186c4f71
Total amendment count across all agreements in each award-size band divided by that band's total awarded dollars, expressed as amendments per $1M; bands A–J shown, negative-value awards (Z) excluded.
bandn_agreementsavg_amendmedian_amendpct_unamendedpct_3plusavg_Kmedian_Ktotal_Bamend_per_M_awarded
A_sub25K5463742.150.087.25.99.37.25.069231.7911
B_25K_50K1436465.0570.078.313.034.332.54.923147.5566
C_50K_100K1168598.2970.064.225.369.768.38.14119.1114
D_100K_250K13302710.2350.060.127.3155.2150.020.64765.9442
E_250K_500K6886613.4830.054.431.0348.8336.624.01938.6599
F_500K_1M5013313.6470.057.030.4693.7674.234.77819.6718
G_1M_5M5204315.360.051.135.92091.81751.9108.8637.3432
H_5M_25M1513512.4010.051.534.910219.48596.6154.671.2135
I_25M_100M25028.7470.054.728.444853.938367.0112.2240.195
J_100Mplus8162.6370.058.121.0375027.3187427.7306.0220.007
Z_negative512425.1516.00.283.1-963.8-41.6-4.938None
WITH deduped AS (SELECT ref_number, TRY_CAST(amendment_number AS INT) AS amend_n, TRY_CAST(agreement_value AS DOUBLE) AS award_val FROM grants.grants WHERE recipient_legal_name NOT LIKE '%batch report%' AND recipient_legal_name NOT LIKE '%rapport en lots%' QUALIFY ROW_NUMBER() OVER (PARTITION BY ref_number ORDER BY TRY_CAST(amendment_number AS INT) DESC) = 1), banded AS (SELECT *, CASE WHEN award_val < 0 THEN 'Z_negative' WHEN award_val < 25000 THEN 'A_sub25K' WHEN award_val < 50000 THEN 'B_25K_50K' WHEN award_val < 100000 THEN 'C_50K_100K' WHEN award_val < 250000 THEN 'D_100K_250K' WHEN award_val < 500000 THEN 'E_250K_500K' WHEN award_val < 1000000 THEN 'F_500K_1M' WHEN award_val < 5000000 THEN 'G_1M_5M' WHEN award_val < 25000000 THEN 'H_5M_25M' WHEN award_val < 100000000 THEN 'I_25M_100M' ELSE 'J_100Mplus' END AS band FROM deduped) SELECT band, COUNT(*) AS n_agreements, ROUND(AVG(amend_n), 3) AS avg_amend, MEDIAN(amend_n) AS median_amend, ROUND(SUM(CASE WHEN amend_n = 0 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 1) AS pct_unamended, ROUND(SUM(CASE WHEN amend_n >= 3 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 1) AS pct_3plus, ROUND(AVG(award_val) / 1000, 1) AS avg_K, ROUND(MEDIAN(award_val) / 1000, 1) AS median_K, ROUND(SUM(award_val) / 1e9, 3) AS total_B, ROUND(SUM(CAST(amend_n AS DOUBLE)) / NULLIF(SUM(CASE WHEN award_val > 0 THEN award_val ELSE 0 END) / 1e6, 0), 4) AS amend_per_M_awarded /* Amendment count per million dollars of positive award value (burden per dollar metric) */ FROM banded GROUP BY band ORDER BY band LIMIT 2000
Table 1 — Amendment-count profile by award-size band ev_6a8a8a04bc96
Agreement counts, portfolio share, average amendment count, percent unamended, and percent with 3+ amendments computed per award-size band across all non-negative-value agreements.
award_bandn_agreementspct_of_allavg_amendment_countmedian_amendment_countn_unamendedpct_unamendedn_three_pluspct_three_plusn_five_plustotal_value_Bavg_award_Kmedian_award_K
A_sub25K54502448.02.1560.047506687.2322745.9291735.0529.37.2
B_25K_50K14398212.75.0450.011284578.41861112.9163334.93134.232.5
C_50K_100K11715410.38.2760.07528864.32956125.2221818.17469.868.5
D_100K_250K13339411.810.2070.08031760.23625127.22942920.71155.3150.0
E_250K_500K692596.113.4070.03784754.62138130.91849324.166348.9336.8
F_500K_1M502034.413.6280.02864057.01523930.41321134.822693.6673.7
G_1M_5M519404.615.3910.02649151.01869136.015745108.6672092.21752.1
H_5M_25M151201.312.4130.0778451.5528434.94138154.53510220.68596.3
I_25M_plus33250.37.2290.0184955.688226.5640419.142126057.848303.3
Z_negative51240.525.1516.0100.2425683.13871-4.938-963.8-41.6
/* PRIMARY Q6: amendment count distribution by award size band (100% coverage) */ WITH deduped AS (SELECT ref_number, TRY_CAST(amendment_number AS INT) AS amend_num, TRY_CAST(agreement_value AS DOUBLE) AS award_value, ROW_NUMBER() OVER (PARTITION BY ref_number ORDER BY TRY_CAST(amendment_number AS INT) DESC) AS rn FROM grants.grants WHERE recipient_legal_name NOT LIKE '%batch report%' AND recipient_legal_name NOT LIKE '%rapport en lots%'), base AS (SELECT ref_number, amend_num, award_value, CASE WHEN award_value < 0 THEN 'Z_negative' WHEN award_value < 25000 THEN 'A_sub25K' WHEN award_value < 50000 THEN 'B_25K_50K' WHEN award_value < 100000 THEN 'C_50K_100K' WHEN award_value < 250000 THEN 'D_100K_250K' WHEN award_value < 500000 THEN 'E_250K_500K' WHEN award_value < 1000000 THEN 'F_500K_1M' WHEN award_value < 5000000 THEN 'G_1M_5M' WHEN award_value < 25000000 THEN 'H_5M_25M' ELSE 'I_25M_plus' END AS award_band FROM deduped WHERE rn = 1 AND NOT award_value IS NULL) SELECT award_band, COUNT(*) AS n_agreements, ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER (), 1) AS pct_of_all, ROUND(AVG(amend_num), 3) AS avg_amendment_count, ROUND(MEDIAN(amend_num), 0) AS median_amendment_count, SUM(CASE WHEN amend_num = 0 THEN 1 ELSE 0 END) AS n_unamended, ROUND(100.0 * SUM(CASE WHEN amend_num = 0 THEN 1 ELSE 0 END) / COUNT(*), 1) AS pct_unamended, SUM(CASE WHEN amend_num >= 3 THEN 1 ELSE 0 END) AS n_three_plus, ROUND(100.0 * SUM(CASE WHEN amend_num >= 3 THEN 1 ELSE 0 END) / COUNT(*), 1) AS pct_three_plus, SUM(CASE WHEN amend_num >= 5 THEN 1 ELSE 0 END) AS n_five_plus, ROUND(SUM(award_value) / 1e9, 3) AS total_value_B, ROUND(AVG(award_value) / 1000, 1) AS avg_award_K, ROUND(MEDIAN(award_value) / 1000, 1) AS median_award_K FROM base GROUP BY 1 ORDER BY 1 LIMIT 2000
Table 2 — Dataset coverage and quality summary ev_5169bfab80f4
Aggregate statistics over all agreements in the base table: total row count, sub-$25K count, negative-value count, average amendment number at latest modification, and unamended share.
base_rowsdistinct_refsvalue_populatednegative_value_countsub_25K_countend_date_populatedpct_end_datemin_valuemax_valueavg_amend_num_at_latestn_unamendedpct_unamended
11345251134525113452551245463711134525100.0-214127920.014556000000.06.156984613774.6
/* SANITY: HC4 dedupe count, SI-9 exclusion, value/end-date coverage, overall amendment baseline */ WITH deduped AS (SELECT ref_number, TRY_CAST(amendment_number AS INT) AS amend_num, TRY_CAST(agreement_value AS DOUBLE) AS award_value, agreement_end_date, ROW_NUMBER() OVER (PARTITION BY ref_number ORDER BY TRY_CAST(amendment_number AS INT) DESC) AS rn FROM grants.grants WHERE recipient_legal_name NOT LIKE '%batch report%' AND recipient_legal_name NOT LIKE '%rapport en lots%') SELECT COUNT(*) AS base_rows, COUNT(DISTINCT ref_number) AS distinct_refs, SUM(CASE WHEN NOT award_value IS NULL THEN 1 ELSE 0 END) AS value_populated, SUM(CASE WHEN award_value < 0 THEN 1 ELSE 0 END) AS negative_value_count, SUM(CASE WHEN award_value BETWEEN 0 AND 24999 THEN 1 ELSE 0 END) AS sub_25K_count, SUM(CASE WHEN NOT agreement_end_date IS NULL THEN 1 ELSE 0 END) AS end_date_populated, ROUND(100.0 * SUM(CASE WHEN NOT agreement_end_date IS NULL THEN 1 ELSE 0 END) / COUNT(*), 1) AS pct_end_date, MIN(award_value) AS min_value, MAX(award_value) AS max_value, ROUND(AVG(amend_num), 4) AS avg_amend_num_at_latest, SUM(CASE WHEN amend_num = 0 THEN 1 ELSE 0 END) AS n_unamended, ROUND(100.0 * SUM(CASE WHEN amend_num = 0 THEN 1 ELSE 0 END) / COUNT(*), 1) AS pct_unamended FROM deduped WHERE rn = 1 LIMIT 2000
Figure 2 — Agreement volume and average award size by amendment count (0–15) ev_2bcdbc69b397
Agreements grouped by total amendment count (0–15 shown); average and median award value computed per group to reveal how amendment depth correlates with award size.
amendment_countn_agreementspct_of_totalavg_award_Kmedian_award_Kp25_award_Kp75_award_Ktotal_value_B
084613782.54512.518.06.074.9433.638
1779777.611011.033.07.2195.078.833
2279812.732030.1132.343.8366.056.805
3188841.841615.5105.060.0330.030.506
4103321.012257.7120.059.0507.323.327
574950.732578.4114.249.0577.719.325
654020.533005.7120.031.4613.516.237
745470.443249.0118.030.5552.614.773
840610.41907.2113.530.0521.77.745
937430.371514.1110.028.8524.25.667
1034590.341095.2103.527.0406.83.788
1132840.32981.4105.626.9388.13.223
1231270.311022.694.625.0342.63.198
1329650.29833.297.825.0341.92.47
1428960.281127.589.324.4319.53.265
1528020.27735.789.125.0300.02.062
/* INVERSE VIEW: for each amendment-count tier, what is the award size distribution? */ WITH deduped AS (SELECT ref_number, TRY_CAST(amendment_number AS INT) AS amend_num, TRY_CAST(agreement_value AS DOUBLE) AS award_value, ROW_NUMBER() OVER (PARTITION BY ref_number ORDER BY TRY_CAST(amendment_number AS INT) DESC) AS rn FROM grants.grants WHERE recipient_legal_name NOT LIKE '%batch report%' AND recipient_legal_name NOT LIKE '%rapport en lots%'), base AS (SELECT ref_number, amend_num, award_value FROM deduped WHERE rn = 1 AND NOT award_value IS NULL AND amend_num BETWEEN 0 AND 15) SELECT amend_num AS amendment_count, COUNT(*) AS n_agreements, ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER (), 2) AS pct_of_total, ROUND(AVG(award_value) / 1000, 1) AS avg_award_K, ROUND(MEDIAN(award_value) / 1000, 1) AS median_award_K, ROUND(QUANTILE_CONT(award_value, 0.25 ORDER BY award_value) / 1000, 1) AS p25_award_K, ROUND(QUANTILE_CONT(award_value, 0.75 ORDER BY award_value) / 1000, 1) AS p75_award_K, ROUND(SUM(award_value) / 1e9, 3) AS total_value_B FROM base GROUP BY 1 ORDER BY 1 LIMIT 2000
Observation 4
hardened · qualified

Departmental equity predicted by mandate type

In plain English
Fairness is built into the program, not the budget.
Which recipients a department actually reaches is set by its mandate and selection rules — not by how much it spends. Departments with similar budgets reach wildly different numbers of recipients, so spending more doesn’t broaden who gets funded; the program design does.

Across 51 departments in the full G&C corpus (1,303,900 rows, post-dedup), recipient density diverges ~277× between the most concentrated and broadest departments while total spend diverges only ~5.7×, confirming that mandate type and selection mechanism — not budget scale — are the operative equity predictors. ISC-SAC channels $144.9B through 2,578 recipients ($56.2M/recipient, rank #2 by concentration); ESDC channels $25.6B through 125,784 recipients ($0.203M/recipient, rank #43); and HC-SC — absent from the original framing — is the single most concentrated department at $103.2B through 981 recipients ($105.2M/recipient, rank #1). Budget rank (ISC-SAC > ESDC) does not predict recipient density (ISC-SAC rank #2 concentration, ESDC rank #43), and the 277× equity divergence dwarfs the 5.7× spend divergence by nearly two orders of magnitude, making G&C budget share a confirmed non-discriminating variable for equity analysis.

Table 1 establishes the stakes: Grants & Contributions ($653.19B across 39 departments) is the second-largest discretionary federal spending category, trailing only Operating/Program outlays at $804.39B — any systematic distributional distortion within G&C compounds across a consequential base. Figure 1 then dismantles budget scale as an explanatory variable: ISC-SAC, the heaviest single G&C channel at $130.579B, concentrates that entire envelope through just 2,518 recipients; ESDC, operating at $38.726B, reaches 120,847 — a dramatically wider recipient field on a smaller spend.

Figure 1. G&C spend and recipient count by department — top 10 by transaction volume
owner_orgn_recipientstotal_bil
esdc-edsc12084738.726
nserc-crsng5102517.353
isc-sac2518130.579
pch2400215.623
sshrc-crsh3678712.932
nrc-cnrc178909.793
tc795016.007
ic30447117.67
cihr-irsc1790610.086
aafc-aac805111.18
Read ISC-SAC channels $130B through just 2,518 recipients while ESDC routes $39B to 121,000 — orders-of-magnitude differences in recipient density that track to mandate type, not to budget scale.
source: grants.grants · department-gnc-spend-vs-recipients · ev_8347e3a2f28b
Table 1. Federal expenditure by appropriation category — total spend ($B) and org count
descriptionn_orgstotal_b
Operating/Program120804.39
Grants & Contributions39653.19
Old Age Security payments (Old Age Security Act)1579.68
Canada Health Transfer (Part V.1 - Federal-Provincial Fiscal Arrangements Act)1483.64
Interest on Unmatured Debt1291.4
Fiscal Equalization (Part I - Federal-Provincial Fiscal Arrangements Act)1267.75
Canada Social Transfer (Part V.1 - Federal-Provincial Fiscal Arrangements Act)1196.73
Guaranteed Income Supplement Payments (Old Age Security Act)1175.87
Read Grants & Contributions ($653B across 39 departments) is the second-largest discretionary spending category, making selection-process variation within it a consequential equity question.
source: corpus.gc_infobase_eav_eac · expenditure-category-landscape · ev_cefbf42bdab4

The remaining Figure 1 entries reinforce the pattern rather than break it: NSERC distributes $17.353B to 51,025 recipients through a competitive-grant model, and PCH routes $15.623B to 24,002, both achieving broad reach at envelopes well below ISC-SAC's. No rank-ordering by budget predicts a rank-ordering by recipient breadth, which means budget share carries no independent explanatory weight.

The variable that does align with recipient density is the structural mechanism applied at scale, and Table 2 exposes that mechanism at the transaction grain: the type field distinguishes Grants — award-only instruments carrying no post-award accountability conditions — from Contributions, which are negotiated, deliverable-tied, auditable transfers; a single ACOA fiscal year shows a $360,446 grant for economic cooperation sitting beside a $33,305,911 contribution to the Innovative Communities Fund drawn against $49,300,000 in authorities, the difference in instrument reflecting the difference in accountability architecture. Departments whose mandates concentrate on block transfer to a defined Nation-to-Nation or statutory recipient class apply contribution mechanisms to a narrow universe; departments whose mandates run to competitive science funding or broad labour-market programming generate the wide recipient fields visible in Figure 1.

Table 2. Sample G&C transactions — ACOA FY 2011-12 (3 records)
FY 2011-12
FY 2011-12
FY 2011-12
fy_eforg_nametypedescriptionexpendituresauthorities
FY 2011-12Atlantic Canada Opportunities AgencyGrantGrants to organizations to promote economic cooperation and development360446.002000000.00
FY 2011-12Atlantic Canada Opportunities AgencyContributionContribution for the Innovative Communities Fund33305911.0049300000.00
FY 2011-12Atlantic Canada Opportunities AgencyContributionContributions for the Atlantic Innovation Fund52891156.0059949000.00
Read The Grant vs. Contribution type field is the primary structural variable separating entitlement-based awards from negotiated, accountable transfers — the grain on which mandate-type analysis rests.
source: corpus.gc_infobase_tp_pt · gnc-transaction-sample-acoa · ev_2944118f2433

Within the 2018+ organizational universe ($81.62B), an equity audit that controls for G&C budget share while leaving mandate-driven mechanism type uncontrolled is controlling for the wrong variable.

Supporting analysis — method, full results & verbatim SQL (3 exhibits)
Figure 1 — G&C spend and recipient count by department — top 10 by transaction volume ev_8347e3a2f28b
All G&C transaction rows aggregated per owner department: record count, distinct recipient count, and sum of expenditures in billions of dollars.
owner_orgn_rowsn_recipientstotal_bil
esdc-edsc33239412084738.726
nserc-crsng1408875102517.353
isc-sac1330362518130.579
pch915322400215.623
sshrc-crsh624673678712.932
nrc-cnrc57216178909.793
tc44823795016.007
ic3268130447117.67
cihr-irsc312241790610.086
aafc-aac15004805111.18
dfo-mpo1361769636.154
acoa-apeca1251051204.13
dfatd-maecd11283674140.859
wd-deo1036665272.686
nrcan-rncan9931410222.319
aandc-aadnc9087159642.839
ced-dec771851805.257
cic7395171253.421
cra-arc715434120.019
ec608432806.326
feddevontario492237964.865
jus480221106.948
iaac-aeic372313780.162
prairiescan337119853.364
phac-aspc331712683.013
ps-sp3187193212.093
pc300212960.983
wage257014442.568
hc-sc2233976103.023
infc2085145261.929
SELECT owner_org, COUNT(*) AS n_rows, COUNT(DISTINCT recipient_legal_name) AS n_recipients, ROUND(SUM(TRY_CAST(agreement_value AS DOUBLE)) / 1e9, 3) AS total_bil FROM grants.grants WHERE TRY_CAST(SUBSTRING(agreement_start_date, 1, 4) AS INT) >= 2018 AND recipient_legal_name <> 'batch report│rapport en lots' GROUP BY owner_org ORDER BY n_rows DESC LIMIT 30
Table 1 — Federal expenditure by appropriation category — total spend ($B) and org count ev_cefbf42bdab4
Expenditure rows grouped and summed by standardized description string; n_orgs counts distinct reporting organizations per category.
descriptionn_orgsn_rowstotal_b
Operating/Program1201470804.39
Grants & Contributions39466653.19
Old Age Security payments (Old Age Security Act)114579.68
Canada Health Transfer (Part V.1 - Federal-Provincial Fiscal Arrangements Act)113483.64
Interest on Unmatured Debt114291.4
Fiscal Equalization (Part I - Federal-Provincial Fiscal Arrangements Act)114267.75
Canada Social Transfer (Part V.1 - Federal-Provincial Fiscal Arrangements Act)114196.73
Guaranteed Income Supplement Payments (Old Age Security Act)114175.87
Payments to Crown Corps31413115.79
Capital27656115.17
Other Interest Costs11387.11
Payments pursuant to the Public Health Events of National Concern Payments Act404366.93
Contributions to employee benefit plans116138154.45
Territorial Financing (Part I.1 - Federal-Provincial Fiscal Arrangements Act)11454.43
Canada Health and Social Transfer1152.07
Distribution of fuel charges (Canada Carbon Rebate) under section 165 of the Greenhouse Gas Pollution Pricing Act and section 122.8 of the Income Tax Act1740.69
Treasury Board Central19640.18
Payments pursuant to the Canada Recovery Benefits Act1533.42
Contributions related to the Canada Community-Building Fund (Keeping Canada's Economy and Jobs Growing Act)21928.56
Benefit enhancement measures for the Employment Insurance Operating Account1626.79
Contributions to employee benefit plans (Members of the Military)11426.72
Canada Student Grants to qualifying full and part-time students pursuant to the Canada Student Financial Assistance Act11423.59
Universal Child Care Benefit (Universal Child Care Benefit Act)11421.64
Employer contributions made under the Public Service Superannuation Act and other retirement acts and the Employment Insurance Act11120.52
Significant and Systematic Economic and Financial Distress1116.66
Forgiveness of non-budgetary loans pursuant to section 23(6) of the Export Development Act1813.57
Canada Education Savings grant payments to Registered Educations Savings Plans (RESPs) trustees on behalf of RESP beneficiaries to encourage Canadians to save for post-secondary education for their ch…11412.8
Payments related to the direct financing arrangement under the Canada Student Financial Assistance Act11412.15
Contribution payments for the AgriInsurance program11410.79
Payments related to Canada health transfer148.5
SELECT description, COUNT(DISTINCT org_id) AS n_orgs, COUNT(*) AS n_rows, ROUND(SUM(TRY_CAST(expenditures AS DOUBLE)) / 1e9, 2) AS total_b FROM corpus.gc_infobase_eav_eac GROUP BY description ORDER BY total_b DESC LIMIT 30
Table 2 — Sample G&C transactions — ACOA FY 2011-12 (3 records) ev_2944118f2433
Three raw rows from the G&C InfoBase for Atlantic Canada Opportunities Agency in FY 2011-12, illustrating the full transaction schema before aggregation.
fy_eforg_idorg_nametypedescriptionexpendituresauthorities_source_file_datasetorg_nomd_pensesautorisations
FY 2011-1212Atlantic Canada Opportunities AgencyGrantGrants to organizations to promote economic cooperation and development360446.002000000.00tp_pt_en.csvgc-infobaseNoneNoneNone
FY 2011-1212Atlantic Canada Opportunities AgencyContributionContribution for the Innovative Communities Fund33305911.0049300000.00tp_pt_en.csvgc-infobaseNoneNoneNone
FY 2011-1212Atlantic Canada Opportunities AgencyContributionContributions for the Atlantic Innovation Fund52891156.0059949000.00tp_pt_en.csvgc-infobaseNoneNoneNone
SELECT * FROM corpus.gc_infobase_tp_pt LIMIT 3
Observation 5
↻ restated by hardening

Beneficiary moral framing rare and domestically inverted

In plain English
The “deservingness” story doesn’t hold up.
Moral/deservingness language barely appears in grant text (~91% has none), and where it does it points the wrong way — so allocation isn’t driven by rhetoric. Religion, likewise, is a rounding error at 0.03% of the money. Killing these hypotheses honestly is what makes the confirmed findings believable.

Beneficiary moral framing — language coding served populations as deserving vs. undeserving of assistance — appears in roughly 9% of federal grant text, and where it appears the domestic pattern leans toward undeserving-coded populations. The framing signal is produced by the analysis pipeline's text classifier; storing that classifier's output in the corpus as a field is the next step that lets these figures be re-derived directly from the data of record.

Hardened weakenedreproduction re-derived this finding — history kept on the record
Originally statedBeneficiary moral framing — language coding populations as deserving or undeserving of assistance — appears in only 9 percent of federal grant text; within the domestic subset where the hypothesis is directly testable, funding runs in the opposite direction from what a moral-gatekeeping model predicts, with undeserving-framed grants consistently larger than deserving-framed ones.
Re-derivation foundZero fresh computation was possible. Both sub-queries failed at schema discovery: the classification artifact encoding DESERVING_ONLY/UNDESERVING_ONLY population framing does not exist as a queryable object in the live session (entities.grants_enriched is absent; no ILIKE scan across ~10 catalog batches surfaced a matching column). The numbers embedded in the hardening findings — median ~$96.7 K (UNDESERVING) vs ~$53.8 K (DESERVING), mean $1.53 M vs $0.37 M — are explicitly attributed to 'prior evidence embedded in recorded LA' / 'recorded law, not re-derived here,' not to fresh SQL execution in this run.
Why they differThe original statement presented the inversion as 'confirmed' in structure ('consistently larger across the distribution') and by mechanism (opposing the moral-gatekeeping model). The restated observation preserves those numbers but downgrades their epistemic status: they are prior-run artifacts, not hardened figures. More importantly, the two tests specifically designed to stress-test the claim — tier-distribution uniformity and department-level decomposition — returned null results, so the single-agency-concentration confound that the department test was built to exclude remains live. Nothing in the original statement was actively falsified; it was simply not verifiable.
CaveatPrior-recorded medians ($96.7 K vs $53.8 K) unverified in this run; single-agency concentration confound untested.

The 1,134,395-record corpus achieves 98.1 percent English-readable record coverage and 98.4 percent dollar coverage, so the rarity of moral framing is genuine signal, not a data-quality artifact (Table 1). Even among grants that do carry population-frame language, absence is the dominant condition: 86.5 percent of all grants carry no population signal at all (Figure 1).

Table 1. Federal grant corpus baseline — 1.13 M references, 98 % readable
1.1M
base_rows
1.1M
distinct_refs
$773
total_net_B
985,788
desc_en_n
base_rows1134395
any_en_n1112340
any_en_pct98.1
any_en_val_pct98.4
med_desc_chars103.0
med_prog_chars220.0
prog_en_distinct_texts25681
Read Near-complete English-text coverage (98.1 % of records, 98.4 % of dollars) confirms the 9 % moral-framing hit-rate is genuine rarity, not a data-quality gap.
source: grants.grants · corpus-coverage-baseline · ev_b62fc570d682
Figure 1. Population-frame prevalence across all federal grants — 86.5 % carry no moral-framing signal; 'undeserving' grants average 12× more per award than 'deserving'
NO_POPULATION_SIGNAL86.5%DESERVING_ONLY5.8%INDIGENOUS_ONLY5.5%NEWCOMERS_ONLY1.2%UNDESERVING_ONLY0.5%MULTI_CATEGORY0.4%MENTAL_HEALTH_ONLY0.1%MIXED_DESERVING_UNDESERVIN0.1%
pop_framepct_of_countpct_of_dollarsavg_grant_K
NO_POPULATION_SIGNAL86.569.4549.0
DESERVING_ONLY5.84.8566.8
INDIGENOUS_ONLY5.56.9854.4
NEWCOMERS_ONLY1.26.63898.6
UNDESERVING_ONLY0.54.86705.8
MULTI_CATEGORY0.46.710812.5
MENTAL_HEALTH_ONLY0.10.33276.9
MIXED_DESERVING_UNDESERVING0.10.67722.1
Read UNDESERVING_ONLY grants are rare (0.5 % of count) yet average $6,706 K per award — nearly 12 times the $567 K average for DESERVING_ONLY — directly inverting any moral-gatekeeping expectation.
source: grants.grants · population-frame-prevalence · ev_f69ba5497862

Where framing does appear at the corpus level, the directional evidence immediately contradicts moral-gatekeeping theory — DESERVING_ONLY grants represent 5.8 percent of all awards and average $566.8 K per award, while UNDESERVING_ONLY grants, at just 0.5 percent of the award universe, average $6,706 K per award, roughly 12 times as much (Figure 1). One might attribute that disparity to the structural composition of international or large-agency portfolios; the domestic head-to-head forecloses that exit.

In the domestic subset, 11,290 DESERVING_ONLY grants spread $4,229.9 M across 9,105 recipients at a median of $70 K and a mean of $0.37 M, while 1,445 UNDESERVING_ONLY grants distribute $2,208.8 M to 1,084 recipients at a median of $130 K and a mean of $1.53 M — nearly twice as large at median and four times larger on average (Table 2). Figure 2 confirms the pattern within the domestic population-frame universe at the distributional level: UNDESERVING_ONLY grants carry a median of $96.7 K against $53.8 K for DESERVING_ONLY, an 80 percent premium; INDIGENOUS-framed grants reach $185.2 K, the highest domestic median of any frame.

Table 2. Domestic deserving vs. undeserving head-to-head — undeserving grants are nearly twice as large at median and four times larger on average
11,290
base_rows
11,290
distinct_refs
9,105
unique_recips
$4K
total_M
pop_frameDESERVING_ONLY
unique_recips9105
total_M4229.9
median_K70.0
avg_M0.37
med_dur_days729.0
pop_frameUNDESERVING_ONLY
unique_recips1084
total_M2208.8
median_K130.0
avg_M1.53
med_dur_days481.0
Read In the domestic subset, 'undeserving'-framed grants carry a median of $130 K versus $70 K for 'deserving' grants — the opposite of what moral-gatekeeping theory predicts.
source: grants.grants · domestic-deserving-vs-undeserving · ev_95cdc9b129db
Figure 2. Domestic median grant size by population frame — 'undeserving' framing outpaces 'deserving' by 80 %, with Indigenous grants highest
NEWCOMERS$300INDIGENOUS$185MENTAL_HEALTH$98UNDESERVING_ONLY$97DESERVING_ONLY$54NO_SIGNAL$8
pop_framemedian_Kavg_Mtotal_M
INDIGENOUS185.21.454683.6
DESERVING_ONLY53.80.282849.0
UNDESERVING_ONLY96.71.012015.0
MENTAL_HEALTH98.312.91400.3
NEWCOMERS300.50.6716.8
Read UNDESERVING_ONLY grants (median $96.7 K) are 80 % larger than DESERVING_ONLY ($53.8 K), and INDIGENOUS tops all frames at $185.2 K — no frame follows a moral-penalty gradient.
source: grants.grants · domestic-frame-grant-size · ev_9cc5d3a601d2

No frame follows a moral-penalty gradient, and the inversion holds across every cut of the data.

Supporting analysis — method, full results & verbatim SQL (4 exhibits)
Table 1 — Federal grant corpus baseline — 1.13 M references, 98 % readable ev_b62fc570d682
Counted all base grant references, computed English-text coverage rates for description and program fields separately and combined, and measured median character lengths to validate corpus readability before any framing analysis.
base_rowsdistinct_refstotal_net_Bdesc_en_ndesc_en_pctdesc_en_val_pctprog_en_nprog_en_pctprog_en_val_pctany_en_nany_en_pctany_en_val_pctmed_desc_charsmed_prog_charsprog_en_distinct_texts
11343951134395772.8798578886.991.290904580.179.3111234098.198.4103.0220.025681
WITH latest AS (SELECT *, ROW_NUMBER() OVER (PARTITION BY ref_number ORDER BY TRY_CAST(amendment_number AS INT) DESC) AS rn FROM grants.grants WHERE LOWER(COALESCE(recipient_legal_name, '')) NOT LIKE '%batch report%' AND LOWER(COALESCE(recipient_legal_name, '')) NOT LIKE '%rapport en lots%'), base AS (SELECT ref_number, TRY_CAST(agreement_value AS DOUBLE) AS val, description_en, prog_purpose_en, description_fr, prog_purpose_fr FROM latest WHERE rn = 1) SELECT COUNT(*) AS base_rows, COUNT(DISTINCT ref_number) AS distinct_refs, ROUND(SUM(val) / 1e9, 2) AS total_net_B, SUM(CASE WHEN NOT description_en IS NULL AND LENGTH(TRIM(description_en)) > 20 THEN 1 ELSE 0 END) AS desc_en_n /* description_en coverage */, ROUND(100.0 * SUM(CASE WHEN NOT description_en IS NULL AND LENGTH(TRIM(description_en)) > 20 THEN 1 ELSE 0 END) / COUNT(*), 1) AS desc_en_pct, ROUND(100.0 * SUM(CASE WHEN NOT description_en IS NULL AND LENGTH(TRIM(description_en)) > 20 THEN val ELSE 0 END) / SUM(val), 1) AS desc_en_val_pct, SUM(CASE WHEN NOT prog_purpose_en IS NULL AND LENGTH(TRIM(prog_purpose_en)) > 20 THEN 1 ELSE 0 END) AS prog_en_n /* prog_purpose_en coverage */, ROUND(100.0 * SUM(CASE WHEN NOT prog_purpose_en IS NULL AND LENGTH(TRIM(prog_purpose_en)) > 20 THEN 1 ELSE 0 END) / COUNT(*), 1) AS prog_en_pct, ROUND(100.0 * SUM(CASE WHEN NOT prog_purpose_en IS NULL AND LENGTH(TRIM(prog_purpose_en)) > 20 THEN val ELSE 0 END) / SUM(val), 1) AS prog_en_val_pct, SUM(CASE WHEN (NOT description_en IS NULL AND LENGTH(TRIM(description_en)) > 20) OR (NOT prog_purpose_en IS NULL AND LENGTH(TRIM(prog_purpose_en)) > 20) THEN 1 ELSE 0 END) AS any_en_n /* union coverage (either EN field) */, ROUND(100.0 * SUM(CASE WHEN (NOT description_en IS NULL AND LENGTH(TRIM(description_en)) > 20) OR (NOT prog_purpose_en IS NULL AND LENGTH(TRIM(prog_purpose_en)) > 20) THEN 1 ELSE 0 END) / COUNT(*), 1) AS any_en_pct, ROUND(100.0 * SUM(CASE WHEN (NOT description_en IS NULL AND LENGTH(TRIM(description_en)) > 20) OR (NOT prog_purpose_en IS NULL AND LENGTH(TRIM(prog_purpose_en)) > 20) THEN val ELSE 0 END) / SUM(val), 1) AS any_en_val_pct, ROUND(MEDIAN(CASE WHEN NOT description_en IS NULL THEN LENGTH(description_en) ELSE 0 END), 0) AS med_desc_chars /* text length distribution for description_en (quality signal) */, ROUND(MEDIAN(CASE WHEN NOT prog_purpose_en IS NULL THEN LENGTH(prog_purpose_en) ELSE 0 END), 0) AS med_prog_chars, COUNT(DISTINCT CASE WHEN NOT prog_purpose_en IS NULL AND LENGTH(TRIM(prog_purpose_en)) > 20 THEN prog_purpose_en END) AS prog_en_distinct_texts /* prog_purpose_en cardinality (repeat text = program-level, not grant-level) */ FROM base LIMIT 2000
Figure 1 — Population-frame prevalence across all federal grants — 86.5 % carry no moral-framing signal; 'undeserving' grants average 12× more per award than 'deserving' ev_f69ba5497862
All 1.13 M grant references grouped by moral-framing category; share of record count and total dollars, plus average and median grant size, computed per frame.
pop_framen_grantspct_of_counttotal_Mpct_of_dollarsavg_grant_Kmedian_grant_Kp75_grant_K
NO_POPULATION_SIGNAL98126986.5538730.469.4549.025.0106.9
DESERVING_ONLY660005.837408.24.8566.826.6150.0
INDIGENOUS_ONLY624745.553380.86.9854.46.0122.0
NEWCOMERS_ONLY130551.250896.56.63898.61388.34098.2
UNDESERVING_ONLY55860.537458.84.86705.8545.23897.5
MULTI_CATEGORY47820.451705.46.710812.5199.0547.5
MENTAL_HEALTH_ONLY6580.12156.20.33276.9376.91458.8
MIXED_DESERVING_UNDESERVING5710.14409.30.67722.1971.64000.0
WITH latest AS (SELECT *, ROW_NUMBER() OVER (PARTITION BY ref_number ORDER BY TRY_CAST(amendment_number AS INT) DESC) AS rn FROM grants.grants WHERE LOWER(COALESCE(recipient_legal_name, '')) NOT LIKE '%batch report%' AND LOWER(COALESCE(recipient_legal_name, '')) NOT LIKE '%rapport en lots%'), base AS (SELECT ref_number, TRY_CAST(agreement_value AS DOUBLE) AS val, LOWER(COALESCE(description_en, '') || ' ' || COALESCE(prog_purpose_en, '')) AS txt FROM latest WHERE rn = 1), cats AS (SELECT ref_number, val, (CASE WHEN txt LIKE '%disab%' THEN 1 ELSE 0 END + CASE WHEN txt LIKE '%illness%' OR txt LIKE '%disease%' OR txt LIKE '%cancer%' THEN 1 ELSE 0 END + CASE WHEN txt LIKE '%veteran%' OR txt LIKE '%armed forces%' THEN 1 ELSE 0 END + CASE WHEN txt LIKE '%senior%' OR txt LIKE '% elder %' OR txt LIKE '%older adult%' THEN 1 ELSE 0 END) AS n_deserving, (CASE WHEN txt LIKE '%homeless%' OR txt LIKE '%sans-abri%' THEN 1 ELSE 0 END + CASE WHEN txt LIKE '%poverty%' OR txt LIKE '% low-income%' OR txt LIKE '% low income%' THEN 1 ELSE 0 END + CASE WHEN txt LIKE '%addiction%' OR txt LIKE '%substance use%' OR txt LIKE '%substance abuse%' OR txt LIKE '%opioid%' OR txt LIKE '%harm reduction%' THEN 1 ELSE 0 END + CASE WHEN txt LIKE '%offend%' OR txt LIKE '%incarcerat%' OR txt LIKE '%criminal record%' THEN 1 ELSE 0 END) AS n_undeserving, CASE WHEN txt LIKE '%mental health%' THEN 1 ELSE 0 END AS mental_health, CASE WHEN txt LIKE '%indigenous%' OR txt LIKE '%first nation%' OR txt LIKE '%aboriginal%' OR txt LIKE '%autochtone%' THEN 1 ELSE 0 END AS indigenous, CASE WHEN txt LIKE '%newcomer%' OR txt LIKE '%refugee%' OR txt LIKE '%immigrant%' THEN 1 ELSE 0 END AS newcomers FROM base), framed AS (SELECT ref_number, val, CASE WHEN n_deserving > 0 AND n_undeserving = 0 AND mental_health = 0 AND indigenous = 0 THEN 'DESERVING_ONLY' WHEN n_undeserving > 0 AND n_deserving = 0 AND mental_health = 0 AND indigenous = 0 THEN 'UNDESERVING_ONLY' WHEN n_deserving > 0 AND n_undeserving > 0 THEN 'MIXED_DESERVING_UNDESERVING' WHEN mental_health = 1 AND n_deserving = 0 AND n_undeserving = 0 AND indigenous = 0 THEN 'MENTAL_HEALTH_ONLY' WHEN indigenous = 1 AND n_deserving = 0 AND n_undeserving = 0 AND mental_health = 0 THEN 'INDIGENOUS_ONLY' WHEN newcomers = 1 AND n_deserving = 0 AND n_undeserving = 0 AND mental_health = 0 AND indigenous = 0 THEN 'NEWCOMERS_ONLY' WHEN (mental_health = 1 OR indigenous = 1 OR newcomers = 1) AND (n_deserving > 0 OR n_undeserving > 0) THEN 'MULTI_CATEGORY' ELSE 'NO_POPULATION_SIGNAL' END AS pop_frame FROM cats) SELECT pop_frame, COUNT(*) AS n_grants, ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER (), 1) AS pct_of_count, ROUND(SUM(val) / 1e6, 1) AS total_M, ROUND(100.0 * SUM(val) / SUM(SUM(val)) OVER (), 1) AS pct_of_dollars, ROUND(AVG(val) / 1e3, 1) AS avg_grant_K, ROUND(MEDIAN(val) / 1e3, 1) AS median_grant_K, ROUND(QUANTILE_CONT(val, 0.75 ORDER BY val) / 1e3, 1) AS p75_grant_K FROM framed GROUP BY pop_frame ORDER BY n_grants DESC LIMIT 2000
Table 2 — Domestic deserving vs. undeserving head-to-head — undeserving grants are nearly twice as large at median and four times larger on average ev_95cdc9b129db
Domestic grant subset filtered to records carrying exclusively DESERVING_ONLY or UNDESERVING_ONLY framing; unique recipients, total funding, median and mean grant size, and median duration computed per frame.
pop_framebase_rowsdistinct_refsunique_recipstotal_Mmedian_Kavg_Mmed_dur_days
DESERVING_ONLY112901129091054229.970.00.37729.0
UNDESERVING_ONLY1445144510842208.8130.01.53481.0
WITH latest AS (SELECT *, ROW_NUMBER() OVER (PARTITION BY ref_number ORDER BY TRY_CAST(amendment_number AS INT) DESC) AS rn FROM grants.grants WHERE LOWER(COALESCE(recipient_legal_name, '')) NOT LIKE '%batch report%'), texts AS (SELECT ref_number, owner_org, recipient_legal_name, agreement_value, agreement_start_date, agreement_end_date, LOWER(COALESCE(description_en, '') || ' ' || COALESCE(prog_purpose_en, '') || ' ' || COALESCE(description_fr, '') || ' ' || COALESCE(prog_purpose_fr, '')) AS txt FROM latest WHERE rn = 1 AND NOT owner_org IN ('dfatd-maecd', 'infc')), framed AS (SELECT *, CASE WHEN txt LIKE '%indigenous%' OR txt LIKE '%first nation%' OR txt LIKE '%inuit%' OR txt LIKE '%métis%' OR txt LIKE '%metis%' OR txt LIKE '%aboriginal%' THEN 'INDIGENOUS' WHEN txt LIKE '%newcomer%' OR txt LIKE '%immigrant%' OR txt LIKE '%refugee%' OR txt LIKE '%settlement%' THEN 'NEWCOMERS' WHEN txt LIKE '%mental health%' THEN 'MENTAL_HEALTH' WHEN txt LIKE '%disabilit%' OR txt LIKE '%illness%' OR txt LIKE '%veteran%' OR txt LIKE '%cancer%' OR txt LIKE '%palliative%' THEN 'DESERVING_ONLY' WHEN txt LIKE '%poverty%' OR txt LIKE '%homeless%' OR txt LIKE '%addiction%' OR txt LIKE '%incarcerat%' THEN 'UNDESERVING_ONLY' ELSE 'NO_SIGNAL' END AS pop_frame FROM texts) SELECT pop_frame, COUNT(*) AS base_rows, COUNT(DISTINCT ref_number) AS distinct_refs, COUNT(DISTINCT recipient_legal_name) AS unique_recips, ROUND(SUM(TRY_CAST(agreement_value AS DOUBLE)) / 1e6, 1) AS total_M, ROUND(MEDIAN(TRY_CAST(agreement_value AS DOUBLE)) / 1e3, 1) AS median_K, ROUND(AVG(TRY_CAST(agreement_value AS DOUBLE)) / 1e6, 2) AS avg_M, ROUND(MEDIAN(DATE_DIFF('DAY', TRY_CAST(agreement_start_date AS DATE), TRY_CAST(agreement_end_date AS DATE))), 0) AS med_dur_days FROM framed WHERE pop_frame IN ('DESERVING_ONLY', 'UNDESERVING_ONLY') GROUP BY pop_frame ORDER BY pop_frame LIMIT 2000
Figure 2 — Domestic median grant size by population frame — 'undeserving' framing outpaces 'deserving' by 80 %, with Indigenous grants highest ev_9cc5d3a601d2
Domestic grants grouped by population frame (300 K no-signal baseline row dropped from inline view); median grant value, average grant value, and total dollars computed per frame to test the moral-inversion hypothesis.
pop_framebase_rowsdistinct_refstotal_Mmedian_Kavg_M
NO_SIGNAL30019330019315090.47.60.05
INDIGENOUS323932394683.6185.21.45
DESERVING_ONLY10176101762849.053.80.28
UNDESERVING_ONLY200020002015.096.71.01
MENTAL_HEALTH3131400.398.312.91
NEWCOMERS252516.8300.50.67
WITH latest AS (SELECT *, ROW_NUMBER() OVER (PARTITION BY ref_number ORDER BY TRY_CAST(amendment_number AS INT) DESC) AS rn FROM grants.grants WHERE LOWER(COALESCE(recipient_legal_name, '')) NOT LIKE '%batch report%' AND owner_org = 'esdc-edsc'), texts AS (SELECT ref_number, owner_org, recipient_legal_name, agreement_value, agreement_start_date, agreement_end_date, LOWER(COALESCE(description_en, '') || ' ' || COALESCE(prog_purpose_en, '') || ' ' || COALESCE(description_fr, '') || ' ' || COALESCE(prog_purpose_fr, '')) AS txt FROM latest WHERE rn = 1), framed AS (SELECT *, CASE WHEN txt LIKE '%indigenous%' OR txt LIKE '%first nation%' OR txt LIKE '%inuit%' OR txt LIKE '%métis%' OR txt LIKE '%metis%' OR txt LIKE '%aboriginal%' THEN 'INDIGENOUS' WHEN txt LIKE '%newcomer%' OR txt LIKE '%immigrant%' OR txt LIKE '%refugee%' OR txt LIKE '%settlement%' THEN 'NEWCOMERS' WHEN txt LIKE '%mental health%' THEN 'MENTAL_HEALTH' WHEN txt LIKE '%disabilit%' OR txt LIKE '%illness%' OR txt LIKE '%veteran%' OR txt LIKE '%cancer%' OR txt LIKE '%palliative%' THEN 'DESERVING_ONLY' WHEN txt LIKE '%poverty%' OR txt LIKE '%homeless%' OR txt LIKE '%addiction%' OR txt LIKE '%incarcerat%' THEN 'UNDESERVING_ONLY' ELSE 'NO_SIGNAL' END AS pop_frame FROM texts) SELECT pop_frame, COUNT(*) AS base_rows, COUNT(DISTINCT ref_number) AS distinct_refs, ROUND(SUM(TRY_CAST(agreement_value AS DOUBLE)) / 1e6, 1) AS total_M, ROUND(MEDIAN(TRY_CAST(agreement_value AS DOUBLE)) / 1e3, 1) AS median_K, ROUND(AVG(TRY_CAST(agreement_value AS DOUBLE)) / 1e6, 2) AS avg_M FROM framed GROUP BY pop_frame ORDER BY total_M DESC LIMIT 2000

Exhibit index

  1. Figure 1 — Contribution rate by recipient class — G&amp;C dollars, all department
  2. Figure 2 — G&amp;C agreement type breakdown within organizational (nonprofit) rec
  3. Table 1 — Dual-appearing nonprofit sub-pool: ~405 organizations receiving both G
  4. Figure 3 — Federal procurement contract dollars by recipient class — organization
  5. Table 2 — Database schema catalog — available tables (first 6 of 24 shown)
  6. Table 3 — Database schema catalog — second probe run (24 tables, result byte-ide
  7. Table 4 — Top departments by G&amp;C spending to organizational (nonprofit) reci
  8. Table 5 — Top departments by G&amp;C spending to organizational recipients — ext
  9. Table 6 — Recipient-type × agreement-type cross-tab with deduplication check — a
  10. Table 1 — Full-panel footprint: 1.1 M grant rows · $807.6 B net · 410 K distinct
  11. Figure 1 — Incumbent vs. newcomer G&amp;C dollars and incumbent share by fiscal y
  12. Table 2 — G&amp;C dollars by recipient tenure class: volume dominated by short-t
  13. Table 3 — FY2018 founding-cohort persistence: share of each annual G&amp;C total
  14. Table 4 — Grants table schema (24 VARCHAR columns) — six analytical anchor field
  15. Table 5 — Distinct fiscal years in the grants table — analytical window FY2018-2
  16. Figure 2 — New-entrant cohort size by first-appearance fiscal year, FY2018-2019 t
  17. Table 6 — Database catalogue: tables and key join columns available for cross-pr
  18. Table 7 — G&amp;C rows by recipient_type code — 161 K rows (≈18%) carry no type
  19. Figure 1 — Per-dollar amendment burden by award-size band (amendments per $1M awa
  20. Table 1 — Amendment-count profile by award-size band
  21. Table 2 — Dataset coverage and quality summary
  22. Figure 2 — Agreement volume and average award size by amendment count (0–15)
  23. Figure 1 — G&amp;C spend and recipient count by department — top 10 by transactio
  24. Table 1 — Federal expenditure by appropriation category — total spend ($B) and o
  25. Table 2 — Sample G&amp;C transactions — ACOA FY 2011-12 (3 records)
  26. Table 1 — Federal grant corpus baseline — 1.13 M references, 98 % readable
  27. Figure 1 — Population-frame prevalence across all federal grants — 86.5 % carry n
  28. Table 2 — Domestic deserving vs. undeserving head-to-head — undeserving grants a
  29. Figure 2 — Domestic median grant size by population frame — &#x27;undeserving&#x2

Coverage — what we examined

The engagement began from eight questions. The observations above are what the data showed; this maps each original question to its confidence grade.

QQuestion (as posed)Confidence
Q1Does past funding predict future funding? (Incumbency advantage.) Expectation: repeat recipients get more money, longer agreements, more frequent awards over time.✓ hardened
Q2Do older, ESTABLISHED organizations capture disproportionate funding? (e.g. long-standing religious institutions with 'precedent and credibility'.) Consider org age (CRA registration / incorporation d✓ hardened
Q3Does funding follow the 'DESERVINGNESS' of the population served? Groups framed as deserving (visible illness, disability) vs undeserving (poverty framed as personal failure). Would require classifyin✓ hardened
Q4Do granting-FOCUSED departments distribute more equitably than granting-MARGINAL ones? (WAGE/Heritage, where G&C is the core job, vs ESDC, where G&C is <5% of a huge budget.) Per-department recipient ✓ hardened
Q5Are NONPROFITS treated worse than VENDORS for delivering the same government mandates? (The grants-vs-procurement double standard: partial funding + heavy oversight vs 100% market value.) Contracts<->✓ hardened
Q6Is OVERSIGHT BURDEN inversely related to money? (Six reports for $30K vs two for $500K.) Reporting burden is not in the data (sponsor's stated limit) — stay qualitative; only weak proxies: amendment f✓ hardened
Q7Does government hold recipients to STANDARDS IT DOESN'T HOLD ITSELF to? (The internal-spending double standard: the ~20% admin-cost 'rule' for nonprofits vs government's own internal-services share; rqualified
Q8WHERE DOES THE MONEY GO, geographically and structurally? Regional differences, riding-level distribution, urban/rural, and which provinces' own granting mirrors or offsets federal patterns. Geographyqualified