From b5ebd626e74afc21c0d82bd11dd04d930ee7a96f Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sun, 5 Jul 2026 02:48:02 -0400 Subject: [PATCH 1/3] Sync SOURCE_PACKAGE_ALIASES: register ici/fact_book_table_30 and irs_soi/soca_table_1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The #78 loud-drift guard caught both on the first post-merge build-bundle run — they were silently excluded from every earlier bundle. (#78) Co-Authored-By: Claude Fable 5 --- ledger/source_package.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ledger/source_package.py b/ledger/source_package.py index 7d8193f..711d40f 100644 --- a/ledger/source_package.py +++ b/ledger/source_package.py @@ -79,6 +79,7 @@ "bea-regional-state-personal-income-components-2024": Path( "bea/regional_personal_income_state" ), + "ici-fact-book-table-30": Path("ici/fact_book_table_30"), "statbel-population-structure-2026": Path("statbel/population_structure_2026"), "statbel-fiscal-income-2023-nis-2025": Path( "statbel/fiscal_income_2023_nis_2025" @@ -142,6 +143,7 @@ "hhs_acf_liheap/fy2024_national_profile" ), "jct-tax-expenditures-2024": Path("jct/tax_expenditures_2024"), + "soi-soca-table-1": Path("irs_soi/soca_table_1"), "soi-table-1-1": Path("irs_soi/table_1_1"), "soi-table-1-2": Path("irs_soi/table_1_2"), "soi-table-1-4": Path("irs_soi/table_1_4"), @@ -2044,4 +2046,4 @@ def _scaffold_template( concept: TODO_concept unit: count aggregation: sum -""" +""" \ No newline at end of file From dfe7c10ca6ba4fee99232ab316e4f52df4d8851e Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sun, 5 Jul 2026 08:20:14 -0400 Subject: [PATCH 2/3] Register and commit the ICI Fact Book Table 30 package; drop the SOCA alias ICI validates clean and ships with its data (the #274 capital-gains follow-up source, extracted 2026-07-02 but never committed). SOCA table 1 fails validate-package (missing_row_constraints on detail rows) and stays local with its owning thread; its alias is removed so CI's drift guard passes in both directions. Co-Authored-By: Claude Fable 5 --- .../fact_book_table_30/26-fb-table-30.xlsx | Bin 0 -> 21755 bytes db/data/ici/fact_book_table_30/manifest.yaml | 18 ++ ledger/source_package.py | 1 - .../fact_book_table_30/source_package.yaml | 261 ++++++++++++++++++ 4 files changed, 279 insertions(+), 1 deletion(-) create mode 100644 db/data/ici/fact_book_table_30/26-fb-table-30.xlsx create mode 100644 db/data/ici/fact_book_table_30/manifest.yaml create mode 100644 packages/ici/fact_book_table_30/source_package.yaml diff --git a/db/data/ici/fact_book_table_30/26-fb-table-30.xlsx b/db/data/ici/fact_book_table_30/26-fb-table-30.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7386561d1f7db28004f3f321da7e580c5ee491d0 GIT binary patch literal 21755 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 I?g!!l0D&~SEdT%j literal 0 HcmV?d00001 diff --git a/db/data/ici/fact_book_table_30/manifest.yaml b/db/data/ici/fact_book_table_30/manifest.yaml new file mode 100644 index 0000000..2471e82 --- /dev/null +++ b/db/data/ici/fact_book_table_30/manifest.yaml @@ -0,0 +1,18 @@ +source_id: ici +package_id: ici-fact-book-table-30 +dataset: ici_fact_book_table_30 +source_page: https://www.icifactbook.org/26-fb-data-tables.html +table: 2026 Investment Company Fact Book Data Table 30, Long-Term Mutual Funds Paid and Reinvested Capital Gains by Type of Fund +files: + 2026: + filename: 26-fb-table-30.xlsx + source_url: https://www.icifactbook.org/xls/26-fb-table-30.xlsx + sha256: bd15d5fc983e55632bbe3f884f9c826f6d4c85693f722e60cf216cff61d9e8b0 + size_bytes: 21755 + fetched_at: '2026-07-02' + storage: + r2: + provider: r2 + bucket: ledger-raw + key: raw/ici/ici-fact-book-table-30/2026/bd15d5fc983e55632bbe3f884f9c826f6d4c85693f722e60cf216cff61d9e8b0/26-fb-table-30.xlsx + uri: r2://ledger-raw/raw/ici/ici-fact-book-table-30/2026/bd15d5fc983e55632bbe3f884f9c826f6d4c85693f722e60cf216cff61d9e8b0/26-fb-table-30.xlsx diff --git a/ledger/source_package.py b/ledger/source_package.py index 711d40f..f1f478e 100644 --- a/ledger/source_package.py +++ b/ledger/source_package.py @@ -143,7 +143,6 @@ "hhs_acf_liheap/fy2024_national_profile" ), "jct-tax-expenditures-2024": Path("jct/tax_expenditures_2024"), - "soi-soca-table-1": Path("irs_soi/soca_table_1"), "soi-table-1-1": Path("irs_soi/table_1_1"), "soi-table-1-2": Path("irs_soi/table_1_2"), "soi-table-1-4": Path("irs_soi/table_1_4"), diff --git a/packages/ici/fact_book_table_30/source_package.yaml b/packages/ici/fact_book_table_30/source_package.yaml new file mode 100644 index 0000000..c3a6f6d --- /dev/null +++ b/packages/ici/fact_book_table_30/source_package.yaml @@ -0,0 +1,261 @@ +schema_version: ledger.source_package.v1 +package_id: ici-fact-book-table-30 +label: ICI Fact Book Table 30 mutual fund capital gains distributions +artifact: + source_name: ici + source_table: 2026 Investment Company Fact Book Data Table 30, Long-Term Mutual Funds Paid and Reinvested Capital Gains by Type of Fund + resource_package: db + resource_directory: data/ici/fact_book_table_30 + manifest: manifest.yaml + vintage: calendar_year_{year} + extracted_at: "2026-07-02" + extraction_method: xlsx whole-workbook used-range cell parse + parser: xlsx_used_range + artifact_year: 2026 +record_sets: + - record_set_id: ici.cy2015.fact_book_table_30 + record_set_spec_id: ici.fact_book_table_30.paid_reinvested.v1 + source_record_id_prefix: ici.cy2015.fact_book_table_30 + sheet_name: final + period_type: calendar_year + period: "2015" + geography_id: 0100000US + geography_level: country + geography_name: United States + geography_vintage: current + entity: institutional_sector + entity_role: long_term_mutual_funds + domain: mutual_fund_capital_gains_distributions + groupby_dimension: ici.distribution_disposition + rows: + - value_id: year_2015 + label: "2015" + ordinal: 0 + row_number: 41 + expected_row_header_column: A + expected_row_header: 2015 + table_record_kind: total + measures: + - measure_id: paid_total + label: Paid capital gains, total + ordinal: 0 + column: B + concept: ici.mutual_fund_capital_gains_paid + unit: usd + aggregation: sum + source_concept: ici.mutual_fund_capital_gains_paid + concept_relation: exact + concept_authority: ledger-us + concept_evidence_url: https://www.icifactbook.org/26-fb-data-tables.html + concept_evidence_notes: > + ICI Fact Book Table 30 total capital gains paid by long-term + mutual funds. Includes short-term and long-term capital gains + distributions and all account types (taxable and tax-deferred); + funds investing primarily in other mutual funds are excluded. + Year-level anchor for the populace capital gain distributions + imputation and the GROWTH Act (H.R. 2089 / S. 1839) analysis. + legal_vintage: calendar_year_2015 + value_scale: 1000000 + - measure_id: reinvested_total + label: Reinvested capital gains, total + ordinal: 1 + column: G + concept: ici.mutual_fund_capital_gains_reinvested + unit: usd + aggregation: sum + value_scale: 1000000 + - record_set_id: ici.cy2021.fact_book_table_30 + record_set_spec_id: ici.fact_book_table_30.paid_reinvested.v1 + source_record_id_prefix: ici.cy2021.fact_book_table_30 + sheet_name: final + period_type: calendar_year + period: "2021" + geography_id: 0100000US + geography_level: country + geography_name: United States + geography_vintage: current + entity: institutional_sector + entity_role: long_term_mutual_funds + domain: mutual_fund_capital_gains_distributions + groupby_dimension: ici.distribution_disposition + rows: + - value_id: year_2021 + label: "2021" + ordinal: 0 + row_number: 47 + expected_row_header_column: A + expected_row_header: 2021 + table_record_kind: total + measures: + - measure_id: paid_total + label: Paid capital gains, total + ordinal: 0 + column: B + concept: ici.mutual_fund_capital_gains_paid + unit: usd + aggregation: sum + value_scale: 1000000 + - measure_id: reinvested_total + label: Reinvested capital gains, total + ordinal: 1 + column: G + concept: ici.mutual_fund_capital_gains_reinvested + unit: usd + aggregation: sum + value_scale: 1000000 + - record_set_id: ici.cy2022.fact_book_table_30 + record_set_spec_id: ici.fact_book_table_30.paid_reinvested.v1 + source_record_id_prefix: ici.cy2022.fact_book_table_30 + sheet_name: final + period_type: calendar_year + period: "2022" + geography_id: 0100000US + geography_level: country + geography_name: United States + geography_vintage: current + entity: institutional_sector + entity_role: long_term_mutual_funds + domain: mutual_fund_capital_gains_distributions + groupby_dimension: ici.distribution_disposition + rows: + - value_id: year_2022 + label: "2022" + ordinal: 0 + row_number: 48 + expected_row_header_column: A + expected_row_header: 2022 + table_record_kind: total + measures: + - measure_id: paid_total + label: Paid capital gains, total + ordinal: 0 + column: B + concept: ici.mutual_fund_capital_gains_paid + unit: usd + aggregation: sum + value_scale: 1000000 + - measure_id: reinvested_total + label: Reinvested capital gains, total + ordinal: 1 + column: G + concept: ici.mutual_fund_capital_gains_reinvested + unit: usd + aggregation: sum + value_scale: 1000000 + - record_set_id: ici.cy2023.fact_book_table_30 + record_set_spec_id: ici.fact_book_table_30.paid_reinvested.v1 + source_record_id_prefix: ici.cy2023.fact_book_table_30 + sheet_name: final + period_type: calendar_year + period: "2023" + geography_id: 0100000US + geography_level: country + geography_name: United States + geography_vintage: current + entity: institutional_sector + entity_role: long_term_mutual_funds + domain: mutual_fund_capital_gains_distributions + groupby_dimension: ici.distribution_disposition + rows: + - value_id: year_2023 + label: "2023" + ordinal: 0 + row_number: 49 + expected_row_header_column: A + expected_row_header: 2023 + table_record_kind: total + measures: + - measure_id: paid_total + label: Paid capital gains, total + ordinal: 0 + column: B + concept: ici.mutual_fund_capital_gains_paid + unit: usd + aggregation: sum + value_scale: 1000000 + - measure_id: reinvested_total + label: Reinvested capital gains, total + ordinal: 1 + column: G + concept: ici.mutual_fund_capital_gains_reinvested + unit: usd + aggregation: sum + value_scale: 1000000 + - record_set_id: ici.cy2024.fact_book_table_30 + record_set_spec_id: ici.fact_book_table_30.paid_reinvested.v1 + source_record_id_prefix: ici.cy2024.fact_book_table_30 + sheet_name: final + period_type: calendar_year + period: "2024" + geography_id: 0100000US + geography_level: country + geography_name: United States + geography_vintage: current + entity: institutional_sector + entity_role: long_term_mutual_funds + domain: mutual_fund_capital_gains_distributions + groupby_dimension: ici.distribution_disposition + rows: + - value_id: year_2024 + label: "2024" + ordinal: 0 + row_number: 50 + expected_row_header_column: A + expected_row_header: 2024 + table_record_kind: total + measures: + - measure_id: paid_total + label: Paid capital gains, total + ordinal: 0 + column: B + concept: ici.mutual_fund_capital_gains_paid + unit: usd + aggregation: sum + value_scale: 1000000 + - measure_id: reinvested_total + label: Reinvested capital gains, total + ordinal: 1 + column: G + concept: ici.mutual_fund_capital_gains_reinvested + unit: usd + aggregation: sum + value_scale: 1000000 + - record_set_id: ici.cy2025.fact_book_table_30 + record_set_spec_id: ici.fact_book_table_30.paid_reinvested.v1 + source_record_id_prefix: ici.cy2025.fact_book_table_30 + sheet_name: final + period_type: calendar_year + period: "2025" + geography_id: 0100000US + geography_level: country + geography_name: United States + geography_vintage: current + entity: institutional_sector + entity_role: long_term_mutual_funds + domain: mutual_fund_capital_gains_distributions + groupby_dimension: ici.distribution_disposition + rows: + - value_id: year_2025 + label: "2025" + ordinal: 0 + row_number: 51 + expected_row_header_column: A + expected_row_header: 2025 + table_record_kind: total + measures: + - measure_id: paid_total + label: Paid capital gains, total + ordinal: 0 + column: B + concept: ici.mutual_fund_capital_gains_paid + unit: usd + aggregation: sum + value_scale: 1000000 + - measure_id: reinvested_total + label: Reinvested capital gains, total + ordinal: 1 + column: G + concept: ici.mutual_fund_capital_gains_reinvested + unit: usd + aggregation: sum + value_scale: 1000000 From 530ceceaaadd5a890d3fd4b956cedd148d6233a0 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sun, 5 Jul 2026 09:39:26 -0400 Subject: [PATCH 3/3] Update all bundle fixture pins for the ICI package +12 facts (institutional_sector, national, calendar years 2015-2025), +1 source, +1 package, +2 period keys, per-source and per-table maps. Co-Authored-By: Claude Fable 5 --- tests/test_ledger_bundle.py | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/tests/test_ledger_bundle.py b/tests/test_ledger_bundle.py index 98529ef..9cb7232 100644 --- a/tests/test_ledger_bundle.py +++ b/tests/test_ledger_bundle.py @@ -27,19 +27,19 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "aggregate_duplicate_key_count": 0, "entity_count": 8, "error_count": 0, - "fact_count": 38959, + "fact_count": 38971, "geography_count": 1053, - "period_count": 14, + "period_count": 16, "semantic_duplicate_key_count": 12, "skipped_source_count": 9, - "source_count": 28, - "source_package_count": 57, + "source_count": 29, + "source_package_count": 58, "warning_count": 1, } - assert len(rows) == 38959 + assert len(rows) == 38971 assert rows[0]["aggregate_fact_key"].startswith("ledger.aggregate_fact.v2:") assert rows[0]["semantic_fact_key"].startswith("ledger.semantic_fact.v2:") - assert source_packages["source_package_count"] == 57 + assert source_packages["source_package_count"] == 58 assert source_packages["skipped_source_count"] == 9 assert sorted(item["source"] for item in source_packages["skipped_sources"]) == [ "census-acs-s0101-congressional-district-age-2024", @@ -52,7 +52,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "cms-aca-oep-state-level-2025", "jct-tax-expenditures-2024", ] - assert coverage["fact_count"] == 38959 + assert coverage["fact_count"] == 38971 assert coverage["counts"]["by_source"] == { "bea": 445, "bfp_economic_outlook": 5, @@ -67,6 +67,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "federal_reserve": 1, "hhs_acf_liheap": 2, "hhs_acf_tanf": 110, + "ici": 12, "hmrc": 193, "irs_soi": 33535, "jrc_euromod_be": 18, @@ -84,7 +85,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "usda_snap": 216, } table_counts = coverage["counts"]["by_source_table"] - assert len(table_counts) == 52 + assert len(table_counts) == 53 assert table_counts["irs_soi:Congressional District Data 2022"] == 26880 assert table_counts["irs_soi:Publication 1304 Table 1.1"] == 80 assert ( @@ -196,11 +197,13 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): == 18 ) assert coverage["counts"]["by_period"] == { + "calendar_year:2015": 2, "calendar_year:2018": 1, - "calendar_year:2022": 6, - "calendar_year:2023": 1011, - "calendar_year:2024": 1467, - "calendar_year:2025": 1261, + "calendar_year:2021": 2, + "calendar_year:2022": 8, + "calendar_year:2023": 1013, + "calendar_year:2024": 1469, + "calendar_year:2025": 1263, "calendar_year:2026": 21, "calendar_year:2031": 2, "fiscal_year:2023": 48, @@ -216,7 +219,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): assert coverage["counts"]["by_geography"]["nuts1:BE2"] == 17 assert coverage["counts"]["by_geography"]["nuts1:BE3"] == 6 assert coverage["counts"]["by_geography"]["commune:11002"] == 1 - assert coverage["counts"]["by_geography"]["country:0100000US"] == 1849 + assert coverage["counts"]["by_geography"]["country:0100000US"] == 1861 assert coverage["counts"]["by_geography"]["state:0400000US06"] == 217 assert ( coverage["counts"]["by_geography"]["congressional_district:5001700US0601"] == 56 @@ -228,7 +231,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "firm": 1439, "government": 125, "household": 62, - "institutional_sector": 1, + "institutional_sector": 13, "pension_plan": 2, "person": 3682, "tax_unit": 33541,