diff --git a/FETCH-MANIFEST-EUROSTAT.json b/FETCH-MANIFEST-EUROSTAT.json
index df260f57..0aa532c5 100644
--- a/FETCH-MANIFEST-EUROSTAT.json
+++ b/FETCH-MANIFEST-EUROSTAT.json
@@ -14,6 +14,12 @@
"destination": "db/data/eurostat/spr_exp_func/spr_exp_func.json",
"sha256": "24ad3c0115efef790ff8cb2ff8fb269d4ceb7de70ac3fad673ebd1340e4f650f"
},
+ {
+ "dataset_id": "nasa_10_nf_tr",
+ "source_url": "https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/nasa_10_nf_tr?format=JSON&lang=en&freq=A&unit=CP_MEUR§or=S14_S15&na_item=B2G&na_item=B3G&na_item=B3N&na_item=B6G&na_item=D1&na_item=D11&na_item=D12&na_item=D4&na_item=D41&na_item=D42&na_item=D44&na_item=D45&na_item=D5&na_item=D61&na_item=D62&direct=RECV&direct=PAID&geo=BE&time=2022&time=2023&time=2024",
+ "destination": "db/data/eurostat/nasa_10_nf_tr/nasa_10_nf_tr.json",
+ "sha256": "30d3f5bf3d1414c78633d13f505558b837b84e92c24b17050249ab19cec20a6d"
+ },
{
"dataset_id": "ilc_li02",
"source_url": "https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/ilc_li02?format=JSON&lang=en&freq=A&statinfo=MED_EI&unit=PC&rskpovth=B_60&sex=T&age=TOTAL&geo=BE&geo=DE&geo=FR&time=2024",
@@ -27,4 +33,4 @@
"sha256": "1c3bb1277f98f257d00725ded6b6d8b1678834329eb6b66954b8f42c19a0ad17"
}
]
-}
\ No newline at end of file
+}
diff --git a/LANE_C2_REPORT.md b/LANE_C2_REPORT.md
new file mode 100644
index 00000000..6873346f
--- /dev/null
+++ b/LANE_C2_REPORT.md
@@ -0,0 +1,446 @@
+# Lane C2 — Belgium national accounts and JRC external rows
+
+## Outcome and source-boundary decisions
+
+This lane adds the hash-pinned Eurostat `nasa_10_nf_tr` package and extends the
+JRC EUROMOD Belgium comparator. The Eurostat build preserves all 84 JSON-stat
+cube positions and emits facts for exactly the 78 populated publisher
+observations. The JRC build now contains 41 facts: 25 administrative External
+statistics, 14 model-output values, and 2 EU-SILC survey aggregates. No R2
+upload was performed; both manifests record only the content-addressed keys.
+
+The cached PDF resolves three material ambiguities in the task shorthand:
+
+- The Annex columns put most requested External series in publisher periods
+ 2021–2023, not 2022–2024. Chronicle preserves the printed periods. A consumer
+ that needs another period must supply an explicit `PeriodAlignmentDeclaration`;
+ Chronicle returns the published level and never an aligned number.
+- The `poa=2,273k` and `psu=79k` observations are in the SILC column. Their
+ External cells are `NaN`, so they are stored as `survey_aggregate` and are
+ validation-only.
+- The Annex names NBB for child-benefit amounts, not FAMIFED or a regional
+ agency. It names FPD/SFPD only for elderly-income-support recipient counts,
+ whose External cells are absent. The `yse` source continuation is a dash, so
+ no primary issuer was invented.
+
+These findings come from commands C1–C3 below. All fact-table values and source
+coordinates come mechanically from command C4; all build and validation counts
+come from commands C5–C8.
+
+## Artifact pins
+
+| Artifact | SHA-256 | Bytes | Command |
+|---|---|---:|---|
+| `nasa_10_nf_tr.json` | `30d3f5bf3d1414c78633d13f505558b837b84e92c24b17050249ab19cec20a6d` | 5,098 | C1 |
+| curated JRC CSV | `2ef69251a72caaab042706c77143fa4f86dde2f800747ebb421b5f7b9a45e394` | 6,956 | C1 |
+| cached JRC PDF | `7c4b0aa4f1f96161e1ce7e4ad300a3fa56cdad7241f82fb650eeec03d30f087b` | 4,184,683 | C1 |
+
+Recorded storage pointers (metadata only; not uploaded in this lane):
+
+- `raw/eurostat/eurostat-nasa-10-nf-tr/2024/30d3f5bf3d1414c78633d13f505558b837b84e92c24b17050249ab19cec20a6d/nasa_10_nf_tr.json`
+- `raw/belgium/jrc-euromod-be-baseline-statistics-2025/2025/2ef69251a72caaab042706c77143fa4f86dde2f800747ebb421b5f7b9a45e394/jrc_euromod_be_baseline_statistics_2025.csv`
+
+The JRC CSV's original header plus 18 rows are byte-for-byte unchanged; 23 rows
+were appended. After stripping its trailing newline, the Eurostat
+`SOURCE_URL.txt` equals the manifest `source_url`. The request included B3N,
+but the returned cube has no B3N category. Its six null coordinates are
+PAID/D42 and RECV/D5 for each of 2022–2024; none was turned into a fact.
+
+## Eurostat fact table
+
+Command C4 emitted this inventory. “Parsed row” is the 1-based row in the
+complete 84-coordinate JSON-stat parse; `H…` is the selected-row virtual-sheet
+value cell. Source values are current-price million euro (`CP_MEUR`); compiled
+facts apply the declared `value_scale: 1000000`. Eurostat marks every populated
+2024 observation provisional (`status=p`).
+
+| Concept (`layout.groupby_value_id`) | ESA item | Direction | Year | Compiled value (EUR) | Source coordinate |
+|---|---:|---|---:|---:|---|
+| `belgium_household_operating_surplus_gross` | B2G | PAID | 2022 | 36,960,000,000 | `source_index=0`, parsed row 1, `H2` |
+| `belgium_household_mixed_income_gross` | B3G | PAID | 2022 | 36,718,000,000 | `source_index=3`, parsed row 4, `H3` |
+| `belgium_household_disposable_income_gross` | B6G | PAID | 2022 | 329,780,000,000 | `source_index=6`, parsed row 7, `H4` |
+| `belgium_household_compensation_of_employees_paid` | D1 | PAID | 2022 | 6,011,000,000 | `source_index=9`, parsed row 10, `H5` |
+| `belgium_household_wages_and_salaries_paid` | D11 | PAID | 2022 | 4,758,000,000 | `source_index=12`, parsed row 13, `H6` |
+| `belgium_household_employers_social_contributions_paid` | D12 | PAID | 2022 | 1,253,000,000 | `source_index=15`, parsed row 16, `H7` |
+| `belgium_household_property_income_paid` | D4 | PAID | 2022 | 4,940,000,000 | `source_index=18`, parsed row 19, `H8` |
+| `belgium_household_interest_paid` | D41 | PAID | 2022 | 4,572,000,000 | `source_index=21`, parsed row 22, `H9` |
+| `belgium_household_other_investment_income_paid` | D44 | PAID | 2022 | 0 | `source_index=27`, parsed row 28, `H10` |
+| `belgium_household_rents_paid` | D45 | PAID | 2022 | 368,000,000 | `source_index=30`, parsed row 31, `H11` |
+| `belgium_household_current_taxes_on_income_paid` | D5 | PAID | 2022 | 69,114,000,000 | `source_index=33`, parsed row 34, `H12` |
+| `belgium_household_net_social_contributions_paid` | D61 | PAID | 2022 | 99,704,000,000 | `source_index=36`, parsed row 37, `H13` |
+| `belgium_household_social_benefits_paid` | D62 | PAID | 2022 | 64,000,000 | `source_index=39`, parsed row 40, `H14` |
+| `belgium_household_operating_surplus_gross` | B2G | RECV | 2022 | 36,960,000,000 | `source_index=42`, parsed row 43, `H15` |
+| `belgium_household_mixed_income_gross` | B3G | RECV | 2022 | 36,718,000,000 | `source_index=45`, parsed row 46, `H16` |
+| `belgium_household_disposable_income_gross` | B6G | RECV | 2022 | 329,780,000,000 | `source_index=48`, parsed row 49, `H17` |
+| `belgium_household_compensation_of_employees_received` | D1 | RECV | 2022 | 277,464,000,000 | `source_index=51`, parsed row 52, `H18` |
+| `belgium_household_wages_and_salaries_received` | D11 | RECV | 2022 | 209,481,000,000 | `source_index=54`, parsed row 55, `H19` |
+| `belgium_household_employers_social_contributions_received` | D12 | RECV | 2022 | 67,983,000,000 | `source_index=57`, parsed row 58, `H20` |
+| `belgium_household_property_income_received` | D4 | RECV | 2022 | 40,867,000,000 | `source_index=60`, parsed row 61, `H21` |
+| `belgium_household_interest_received` | D41 | RECV | 2022 | 6,334,000,000 | `source_index=63`, parsed row 64, `H22` |
+| `belgium_household_distributed_income_of_corporations_received` | D42 | RECV | 2022 | 23,090,000,000 | `source_index=66`, parsed row 67, `H23` |
+| `belgium_household_other_investment_income_received` | D44 | RECV | 2022 | 10,463,000,000 | `source_index=69`, parsed row 70, `H24` |
+| `belgium_household_rents_received` | D45 | RECV | 2022 | 980,000,000 | `source_index=72`, parsed row 73, `H25` |
+| `belgium_household_net_social_contributions_received` | D61 | RECV | 2022 | 64,000,000 | `source_index=78`, parsed row 79, `H26` |
+| `belgium_household_social_benefits_received` | D62 | RECV | 2022 | 108,435,000,000 | `source_index=81`, parsed row 82, `H27` |
+| `belgium_household_operating_surplus_gross` | B2G | PAID | 2023 | 41,351,000,000 | `source_index=1`, parsed row 2, `H28` |
+| `belgium_household_mixed_income_gross` | B3G | PAID | 2023 | 38,850,000,000 | `source_index=4`, parsed row 5, `H29` |
+| `belgium_household_disposable_income_gross` | B6G | PAID | 2023 | 359,164,000,000 | `source_index=7`, parsed row 8, `H30` |
+| `belgium_household_compensation_of_employees_paid` | D1 | PAID | 2023 | 6,174,000,000 | `source_index=10`, parsed row 11, `H31` |
+| `belgium_household_wages_and_salaries_paid` | D11 | PAID | 2023 | 4,919,000,000 | `source_index=13`, parsed row 14, `H32` |
+| `belgium_household_employers_social_contributions_paid` | D12 | PAID | 2023 | 1,255,000,000 | `source_index=16`, parsed row 17, `H33` |
+| `belgium_household_property_income_paid` | D4 | PAID | 2023 | 11,584,000,000 | `source_index=19`, parsed row 20, `H34` |
+| `belgium_household_interest_paid` | D41 | PAID | 2023 | 11,184,000,000 | `source_index=22`, parsed row 23, `H35` |
+| `belgium_household_other_investment_income_paid` | D44 | PAID | 2023 | 0 | `source_index=28`, parsed row 29, `H36` |
+| `belgium_household_rents_paid` | D45 | PAID | 2023 | 400,000,000 | `source_index=31`, parsed row 32, `H37` |
+| `belgium_household_current_taxes_on_income_paid` | D5 | PAID | 2023 | 72,794,000,000 | `source_index=34`, parsed row 35, `H38` |
+| `belgium_household_net_social_contributions_paid` | D61 | PAID | 2023 | 108,000,000,000 | `source_index=37`, parsed row 38, `H39` |
+| `belgium_household_social_benefits_paid` | D62 | PAID | 2023 | 62,000,000 | `source_index=40`, parsed row 41, `H40` |
+| `belgium_household_operating_surplus_gross` | B2G | RECV | 2023 | 41,351,000,000 | `source_index=43`, parsed row 44, `H41` |
+| `belgium_household_mixed_income_gross` | B3G | RECV | 2023 | 38,850,000,000 | `source_index=46`, parsed row 47, `H42` |
+| `belgium_household_disposable_income_gross` | B6G | RECV | 2023 | 359,164,000,000 | `source_index=49`, parsed row 50, `H43` |
+| `belgium_household_compensation_of_employees_received` | D1 | RECV | 2023 | 299,696,000,000 | `source_index=52`, parsed row 53, `H44` |
+| `belgium_household_wages_and_salaries_received` | D11 | RECV | 2023 | 226,018,000,000 | `source_index=55`, parsed row 56, `H45` |
+| `belgium_household_employers_social_contributions_received` | D12 | RECV | 2023 | 73,677,000,000 | `source_index=58`, parsed row 59, `H46` |
+| `belgium_household_property_income_received` | D4 | RECV | 2023 | 52,674,000,000 | `source_index=61`, parsed row 62, `H47` |
+| `belgium_household_interest_received` | D41 | RECV | 2023 | 15,962,000,000 | `source_index=64`, parsed row 65, `H48` |
+| `belgium_household_distributed_income_of_corporations_received` | D42 | RECV | 2023 | 25,012,000,000 | `source_index=67`, parsed row 68, `H49` |
+| `belgium_household_other_investment_income_received` | D44 | RECV | 2023 | 10,605,000,000 | `source_index=70`, parsed row 71, `H50` |
+| `belgium_household_rents_received` | D45 | RECV | 2023 | 1,094,000,000 | `source_index=73`, parsed row 74, `H51` |
+| `belgium_household_net_social_contributions_received` | D61 | RECV | 2023 | 62,000,000 | `source_index=79`, parsed row 80, `H52` |
+| `belgium_household_social_benefits_received` | D62 | RECV | 2023 | 116,832,000,000 | `source_index=82`, parsed row 83, `H53` |
+| `belgium_household_operating_surplus_gross` | B2G | PAID | 2024 | 41,447,000,000 | `source_index=2`, parsed row 3, `H54` |
+| `belgium_household_mixed_income_gross` | B3G | PAID | 2024 | 39,700,000,000 | `source_index=5`, parsed row 6, `H55` |
+| `belgium_household_disposable_income_gross` | B6G | PAID | 2024 | 369,313,000,000 | `source_index=8`, parsed row 9, `H56` |
+| `belgium_household_compensation_of_employees_paid` | D1 | PAID | 2024 | 6,359,000,000 | `source_index=11`, parsed row 12, `H57` |
+| `belgium_household_wages_and_salaries_paid` | D11 | PAID | 2024 | 4,978,000,000 | `source_index=14`, parsed row 15, `H58` |
+| `belgium_household_employers_social_contributions_paid` | D12 | PAID | 2024 | 1,381,000,000 | `source_index=17`, parsed row 18, `H59` |
+| `belgium_household_property_income_paid` | D4 | PAID | 2024 | 10,622,000,000 | `source_index=20`, parsed row 21, `H60` |
+| `belgium_household_interest_paid` | D41 | PAID | 2024 | 10,226,000,000 | `source_index=23`, parsed row 24, `H61` |
+| `belgium_household_other_investment_income_paid` | D44 | PAID | 2024 | 0 | `source_index=29`, parsed row 30, `H62` |
+| `belgium_household_rents_paid` | D45 | PAID | 2024 | 396,000,000 | `source_index=32`, parsed row 33, `H63` |
+| `belgium_household_current_taxes_on_income_paid` | D5 | PAID | 2024 | 77,033,000,000 | `source_index=35`, parsed row 36, `H64` |
+| `belgium_household_net_social_contributions_paid` | D61 | PAID | 2024 | 112,346,000,000 | `source_index=38`, parsed row 39, `H65` |
+| `belgium_household_social_benefits_paid` | D62 | PAID | 2024 | 86,000,000 | `source_index=41`, parsed row 42, `H66` |
+| `belgium_household_operating_surplus_gross` | B2G | RECV | 2024 | 41,447,000,000 | `source_index=44`, parsed row 45, `H67` |
+| `belgium_household_mixed_income_gross` | B3G | RECV | 2024 | 39,700,000,000 | `source_index=47`, parsed row 48, `H68` |
+| `belgium_household_disposable_income_gross` | B6G | RECV | 2024 | 369,313,000,000 | `source_index=50`, parsed row 51, `H69` |
+| `belgium_household_compensation_of_employees_received` | D1 | RECV | 2024 | 310,278,000,000 | `source_index=53`, parsed row 54, `H70` |
+| `belgium_household_wages_and_salaries_received` | D11 | RECV | 2024 | 233,080,000,000 | `source_index=56`, parsed row 57, `H71` |
+| `belgium_household_employers_social_contributions_received` | D12 | RECV | 2024 | 77,198,000,000 | `source_index=59`, parsed row 60, `H72` |
+| `belgium_household_property_income_received` | D4 | RECV | 2024 | 52,437,000,000 | `source_index=62`, parsed row 63, `H73` |
+| `belgium_household_interest_received` | D41 | RECV | 2024 | 13,943,000,000 | `source_index=65`, parsed row 66, `H74` |
+| `belgium_household_distributed_income_of_corporations_received` | D42 | RECV | 2024 | 26,144,000,000 | `source_index=68`, parsed row 69, `H75` |
+| `belgium_household_other_investment_income_received` | D44 | RECV | 2024 | 11,223,000,000 | `source_index=71`, parsed row 72, `H76` |
+| `belgium_household_rents_received` | D45 | RECV | 2024 | 1,128,000,000 | `source_index=74`, parsed row 75, `H77` |
+| `belgium_household_net_social_contributions_received` | D61 | RECV | 2024 | 86,000,000 | `source_index=80`, parsed row 81, `H78` |
+| `belgium_household_social_benefits_received` | D62 | RECV | 2024 | 124,608,000,000 | `source_index=83`, parsed row 84, `H79` |
+
+## JRC requested fact table
+
+This table includes the 23 appended rows plus the two pre-existing 2023
+child-benefit and unemployment-benefit External amount rows needed to show the
+complete requested series. The rest of the original 18-row curated file was not
+rewritten. Publisher and compiled values are generated by C4; PDF locations and
+issuers are verified by C2.
+
+| Fine series | Metric | Year | Publisher value | Compiled fact | Provenance | Source row and report evidence |
+|---|---|---:|---:|---:|---|---|
+| `a3_1_self_employment_income_external_2022` | `self_employment_income_yse` | 2022 | 1,257 thousand | 1,257,000 count | administrative | CSV 22 / `G22`; A3.1 report 112, PDF 114; source row is `-` on PDF 115, so no issuer is identified |
+| `a3_2_employment_income_external_2021` | `employment_income_yem` | 2021 | 147,112 million EUR | 147,112,000,000 EUR | administrative | CSV 27 / `G27`; A3.2 report 114, PDF 116; RSZ/ONSS on PDF 115 |
+| `a3_2_employment_income_external_2022` | `employment_income_yem` | 2022 | 161,644 million EUR | 161,644,000,000 EUR | administrative | CSV 33 / `G33`; A3.2 report 114, PDF 116; RSZ/ONSS on PDF 115 |
+| `a3_2_employment_income_external_2023` | `employment_income_yem` | 2023 | 175,998 million EUR | 175,998,000,000 EUR | administrative | CSV 39 / `G39`; A3.2 report 114, PDF 116; RSZ/ONSS on PDF 115 |
+| `a3_4_capital_income_tax_external_2021` | `capital_income_tax_tinkt_s` | 2021 | 3,522 million EUR | 3,522,000,000 EUR | administrative | CSV 28 / `G28`; A3.4 report 118, PDF 120; NBB on PDF 118 |
+| `a3_4_capital_income_tax_external_2022` | `capital_income_tax_tinkt_s` | 2022 | 4,152 million EUR | 4,152,000,000 EUR | administrative | CSV 34 / `G34`; A3.4 report 118, PDF 120; NBB on PDF 118 |
+| `a3_5_income_support_external_2021` | `income_support_bsa_s` | 2021 | 215 thousand | 215,000 count | administrative | CSV 20 / `G20`; A3.5 report 120, PDF 122; POD MI/SPP IS recipients on PDF 124 |
+| `a3_5_income_support_external_2022` | `income_support_bsa_s` | 2022 | 241 thousand | 241,000 count | administrative | CSV 23 / `G23`; A3.5 report 120, PDF 122; POD MI/SPP IS recipients on PDF 124 |
+| `a3_5_unemployment_benefits_external_2021` | `unemployment_benefits_bun` | 2021 | 992 thousand | 992,000 count | administrative | CSV 21 / `G21`; A3.5 report 120, PDF 122; RVA/ONEM on PDF 125 |
+| `a3_5_unemployment_benefits_external_2022` | `unemployment_benefits_bun` | 2022 | 813 thousand | 813,000 count | administrative | CSV 24 / `G24`; A3.5 report 120, PDF 122; RVA/ONEM on PDF 125 |
+| `a3_5_old_age_pension_silc_2022` | `old_age_pension_poa` | 2022 | 2,273 thousand | 2,273,000 count | survey_aggregate | CSV 25 / `G25`; A3.5 report 120, PDF 122; SILC column, External is `NaN`, source is `-` on PDF 124 |
+| `a3_5_survivor_pension_silc_2022` | `survivor_pension_psu` | 2022 | 79 thousand | 79,000 count | survey_aggregate | CSV 26 / `G26`; A3.5 report 120, PDF 122; SILC column, External is `NaN`, source is `-` on PDF 124 |
+| `a3_6_income_support_external_2021` | `income_support_bsa_s` | 2021 | 1,656 million EUR | 1,656,000,000 EUR | administrative | CSV 29 / `G29`; A3.6 report 125, PDF 127; NBB amounts on PDF 124 |
+| `a3_6_income_support_external_2022` | `income_support_bsa_s` | 2022 | 1,809 million EUR | 1,809,000,000 EUR | administrative | CSV 35 / `G35`; A3.6 report 125, PDF 127; NBB amounts on PDF 124 |
+| `a3_6_income_support_external_2023` | `income_support_bsa_s` | 2023 | 2,049 million EUR | 2,049,000,000 EUR | administrative | CSV 41 / `G41`; A3.6 report 125, PDF 127; NBB amounts on PDF 124 |
+| `a3_6_income_support_elderly_external_2021` | `income_support_elderly_bsaoa_s` | 2021 | 767 million EUR | 767,000,000 EUR | administrative | CSV 30 / `G30`; A3.6 report 125, PDF 127; NBB amounts on PDF 124 |
+| `a3_6_income_support_elderly_external_2022` | `income_support_elderly_bsaoa_s` | 2022 | 824 million EUR | 824,000,000 EUR | administrative | CSV 36 / `G36`; A3.6 report 125, PDF 127; NBB amounts on PDF 124 |
+| `a3_6_income_support_elderly_external_2023` | `income_support_elderly_bsaoa_s` | 2023 | 941 million EUR | 941,000,000 EUR | administrative | CSV 42 / `G42`; A3.6 report 125, PDF 127; NBB amounts on PDF 124 |
+| `a3_6_child_benefits_external_2021` | `child_benefits_bch_s` | 2021 | 7,305 million EUR | 7,305,000,000 EUR | administrative | CSV 31 / `G31`; A3.6 report 125, PDF 127; NBB on PDF 124 |
+| `a3_6_child_benefits_external_2022` | `child_benefits_bch_s` | 2022 | 7,738 million EUR | 7,738,000,000 EUR | administrative | CSV 37 / `G37`; A3.6 report 125, PDF 127; NBB on PDF 124 |
+| `a3_6_child_benefits_external_2023` | `child_benefits` | 2023 | 8,191 million EUR | 8,191,000,000 EUR | administrative | Existing CSV 7 / `G7`; A3.6 report 125, PDF 127; NBB on PDF 124 |
+| `a3_6_unemployment_benefits_external_2021` | `unemployment_benefits_bun` | 2021 | 8,197 million EUR | 8,197,000,000 EUR | administrative | CSV 32 / `G32`; A3.6 report 125, PDF 127; RVA/ONEM on PDF 125 |
+| `a3_6_unemployment_benefits_external_2022` | `unemployment_benefits_bun` | 2022 | 6,670 million EUR | 6,670,000,000 EUR | administrative | CSV 38 / `G38`; A3.6 report 125, PDF 127; RVA/ONEM on PDF 125 |
+| `a3_6_unemployment_benefits_external_2023` | `unemployment_benefits` | 2023 | 6,391 million EUR | 6,391,000,000 EUR | administrative | Existing CSV 9 / `G9`; A3.6 report 125, PDF 127; RVA/ONEM on PDF 125 |
+| `a3_6_old_age_survivor_pension_external_2023` | `old_age_survivor_pension_il_ext_poapsu` | 2023 | 64,443 million EUR | 64,443,000,000 EUR | administrative | CSV 40 / `G40`; A3.6 continuation report 127, PDF 129; NBB on PDF 126 |
+
+The other two administrative JRC facts are the pre-existing 2023 national-
+income-tax and employee-SIC External sums. They were moved out of the formerly
+mixed `model_output` record set into the administrative record set without
+changing their CSV rows or values.
+
+## Microcosm mapping
+
+Chronicle does not activate targets. For Microcosm consumption, the eligible
+source facts and the hard exclusions are:
+
+- Candidate calibration-grade source sums: all 78 Eurostat facts
+ (`administrative`, `aggregation: sum`) and all 25 JRC External administrative
+ facts (5 recipient-count sums and 20 annual-amount sums). Each remains subject
+ to the exact definition and period below.
+- Validation-only: the 2 SILC `poa`/`psu` recipient-count facts and all 14 JRC
+ `model_output` facts, including EUROMOD values, ratios, Gini, and poverty
+ statistics. A `sum` aggregation never overrides survey/model provenance.
+- Do not simultaneously target overlapping national-account rows: B2G/B3G/B6G
+ are duplicate balancing levels under PAID and RECV; D1 equals the D11+D12
+ hierarchy; D4 overlaps its components; D62 overlaps benefit-specific sums.
+- The YSE External count is stored exactly as JRC's External statistic, but the
+ report gives no primary issuer. That unknown issuer is a downstream caveat.
+- Any selection, reconciliation, aging, period alignment, support-aware
+ activation, or solver construction belongs to Microcosm, never Chronicle.
+
+### National-account definitional gaps
+
+Every row covers institutional sector `S14_S15`, which includes NPISH alongside
+households. That is a common scope gap against household/person microdata. PAID
+and RECV are sector-account uses/resources, not person-level signs.
+
+| ESA item | Likely Axiom/EUROMOD target | Known gap |
+|---|---|---|
+| B2G | household gross operating surplus | Gross production balance for household/NPISH producers, not generic cash capital income; repeated under both directions. |
+| B3G | `yse` / mixed income | Gross of consumption of fixed capital and combines labour and capital returns of unincorporated enterprises; broader than survey self-employment cash income; repeated under both directions. |
+| B6G | gross disposable income | National-account balancing item with imputed components and NPISH, not a simple sum of survey cash disposable income; repeated under both directions. |
+| D1 | compensation of employees | D11 + D12; do not target alongside both components. PAID is households/NPISH as employers; RECV is the resident-sector resource. |
+| D11 | `yem` / wages and salaries | ESA cash-and-in-kind wages under residence/sector accounting differ from EUROMOD/SILC and ONSS wage concepts. |
+| D12 | employers' social contributions | Includes actual and imputed contributions. On the resource side it is imputed to households and is not cash wages or disposable income. |
+| D4 | property income | Overlaps D41, D42, D44, D45 and may contain other ESA components; not an independent survey capital-income target if components are used. |
+| D41 | interest | FISIM-adjusted ESA interest, not gross bank interest and not taxable movable income. |
+| D42 | distributed corporate income | Broader than a taxable-dividend variable; only RECV cells are populated. |
+| D44 | insurance/pension/fund investment income | Income attributed to policyholders, pension-entitlement holders, and collective-fund shareholders; not taxable movable income and not necessarily cash received. |
+| D45 | rent | Rent on natural resources, not tenant housing rent or ordinary dwelling rental income. |
+| D5 | personal/current tax | Current taxes on income, wealth, etc.; broader than personal income tax alone. Only PAID cells are populated. |
+| D61 | social contributions | Broad ESA net-social-contribution aggregate across actual/imputed and contributor classes; not employee contributions alone. |
+| D62 | cash social benefits | All social benefits other than social transfers in kind; broader than any individual EUROMOD benefit. PAID is a household/NPISH-sector use, not a benefit deduction. |
+
+### JRC comparator gaps
+
+- `yem`: ONSS excludes a substantial portion of holiday pay, performance
+ bonuses, and meal vouchers that EUROMOD employment income includes (report
+ 100, PDF 102; C2).
+- `yse`: the report attributes the survey/external gap to insufficient EU-SILC
+ coverage and underreporting of small self-employment incomes; no External
+ issuer is identified (reports 100/113, PDFs 102/115; C2).
+- `tinkt_s`: the NBB comparator is the advance levy on movable property and
+ covers more sources than capital income alone (report 101, PDF 103; C2).
+- `bsa_s`: validation covers regular support only and excludes equivalent
+ support received by precarious foreign populations; the family-income
+ condition also differs from administration (report 101, PDF 103; C2).
+- `bsaoa_s`: stored values are NBB annual amounts. FPD/SFPD is listed only for
+ recipient counts, for which External values are absent (report 122, PDF 124;
+ C2).
+- `bch_s`: child disability is unobserved in the input, so higher disability
+ allowances cannot be simulated. The Annex amount source is NBB, not
+ FAMIFED/regional agencies (reports 102/122, PDFs 104/124; C2).
+- `bun`: ONEM/RVA recipient and amount concepts differ from SILC reporting,
+ especially for short unemployment spells (reports 101–102, PDFs 103–104;
+ C2).
+- `il_ext_poapsu`: NBB publishes one combined old-age-plus-survivor-pension
+ amount; it cannot support separate `poa` and `psu` amount targets.
+- `poa`/`psu` counts: 2,273k/79k are SILC observations with External `NaN` and
+ cannot be relabelled as SFPD administrative totals (report 120, PDFs 122/124;
+ C2).
+
+## Command ledger
+
+All commands ran from
+`/Users/maxghenis/TheAxiomFoundation/_cape-prep/chronicle-be` with network
+disabled. The repository's default uv cache was not writable in the sandbox,
+so repository commands use a task-specific cache plus `--offline --no-sync`.
+
+### C1 — artifact hashes, sizes, unchanged JRC prefix, and URL equality
+
+```sh
+shasum -a 256 \
+ db/data/eurostat/nasa_10_nf_tr/nasa_10_nf_tr.json \
+ db/data/jrc/euromod_be_baseline_statistics_2025/jrc_euromod_be_baseline_statistics_2025.csv \
+ /Users/maxghenis/TheAxiomFoundation/_cape-prep/Y15_CR_BE_final.pdf
+wc -c \
+ db/data/eurostat/nasa_10_nf_tr/nasa_10_nf_tr.json \
+ db/data/jrc/euromod_be_baseline_statistics_2025/jrc_euromod_be_baseline_statistics_2025.csv \
+ /Users/maxghenis/TheAxiomFoundation/_cape-prep/Y15_CR_BE_final.pdf
+diff -u \
+ <(git show origin/main:db/data/jrc/euromod_be_baseline_statistics_2025/jrc_euromod_be_baseline_statistics_2025.csv | sed -n '1,19p') \
+ <(sed -n '1,19p' db/data/jrc/euromod_be_baseline_statistics_2025/jrc_euromod_be_baseline_statistics_2025.csv)
+UV_CACHE_DIR=/tmp/chronicle-c2-uv-cache uv run --offline --no-sync python - <<'PY'
+from pathlib import Path
+import json
+import yaml
+
+base = Path("db/data/eurostat/nasa_10_nf_tr")
+manifest = yaml.safe_load((base / "manifest.yaml").read_text())
+file_spec = manifest["files"][2024]
+fetches = json.loads(Path("FETCH-MANIFEST-EUROSTAT.json").read_text())["fetches"]
+fetch = next(item for item in fetches if item["dataset_id"] == "nasa_10_nf_tr")
+print((base / "SOURCE_URL.txt").read_text().strip() == file_spec["source_url"])
+print(fetch["source_url"] == file_spec["source_url"])
+print(fetch["sha256"] == file_spec["sha256"])
+PY
+```
+
+Output: the three pins and byte counts in the artifact table; the `diff` had no
+output; both URL equalities and fetch-manifest hash equality printed `True`.
+
+### C2 — cached-PDF verification
+
+The requested `uv run --with pdfplumber` resolver could not write its cache in
+this detached sandbox. No package was downloaded: the already-cached
+pdfplumber 0.11.10 interpreter was invoked directly.
+
+```sh
+/Users/maxghenis/.cache/uv/archive-v0/HLlfXwC9DMcE0Q6gCdMwl/bin/python -c \
+ 'import pdfplumber; print(pdfplumber.__version__)'
+/Users/maxghenis/.cache/uv/archive-v0/HLlfXwC9DMcE0Q6gCdMwl/bin/python -c \
+ 'import pdfplumber; path="/Users/maxghenis/TheAxiomFoundation/_cape-prep/Y15_CR_BE_final.pdf"; pages=(102,103,104,114,115,116,118,120,122,124,125,126,127,129); p=pdfplumber.open(path); [print(f"=== PDF PAGE {n} ===\\n"+(p.pages[n-1].extract_text(x_tolerance=2,y_tolerance=3) or "")) for n in pages]'
+```
+
+This printed the Annex headers, all table rows in the JRC fact table, the
+issuer continuations, and the narrative definition warnings cited above.
+
+### C3 — cube structure and populated-coordinate check
+
+```sh
+UV_CACHE_DIR=/tmp/chronicle-c2-uv-cache uv run --offline --no-sync python - <<'PY'
+import json
+from pathlib import Path
+
+data = json.loads(Path("db/data/eurostat/nasa_10_nf_tr/nasa_10_nf_tr.json").read_text())
+print(data["id"], data["size"], len(data["value"]), data["dimension"]["na_item"]["category"]["index"])
+PY
+```
+
+The dimension sizes multiply to 84, `value` contains 78 populated entries, and
+the returned `na_item` index contains 14 categories with no B3N.
+
+### C4 — fact and lineage inventory used by both tables
+
+```sh
+UV_CACHE_DIR=/tmp/chronicle-c2-uv-cache uv run --offline --no-sync python - <<'PY'
+from chronicle.source_package import load_source_package
+from chronicle.sources.cells import build_source_cell_key
+from chronicle.sources.rows import build_source_row_key
+
+for alias, year, value_column in (
+ ("eurostat-nasa-10-nf-tr", 2024, 8),
+ ("jrc-euromod-be-baseline-statistics-2025", 2025, 7),
+):
+ package = load_source_package(alias)
+ rows = package.build_source_rows(year)
+ cells = package.build_source_cells(year, source_rows=rows)
+ facts = package.build_facts(year, cells=cells, source_rows=rows)
+ rows_by_key = {build_source_row_key(row): row for row in rows}
+ cells_by_key = {build_source_cell_key(cell): cell for cell in cells}
+ print(alias, len(rows), len(cells), len(facts))
+ for fact in facts:
+ row = rows_by_key[fact.source_row_keys[0]]
+ value_cell = next(
+ cells_by_key[key]
+ for key in fact.source_cell_keys
+ if cells_by_key[key].column_number == value_column
+ )
+ print(
+ fact.layout.groupby_value_id,
+ fact.filters,
+ fact.value,
+ fact.period.value,
+ fact.provenance_class,
+ row.row_number,
+ row.values.get("source_index"),
+ value_cell.address,
+ )
+PY
+```
+
+Header output: Eurostat `84 1343 78`; JRC `41 294 41`.
+
+### C5 — package validators
+
+```sh
+UV_CACHE_DIR=/tmp/chronicle-c2-uv-cache uv run --offline --no-sync \
+ python -m chronicle.cli validate-package eurostat-nasa-10-nf-tr --year 2024
+UV_CACHE_DIR=/tmp/chronicle-c2-uv-cache uv run --offline --no-sync \
+ python -m chronicle.cli validate-package jrc-euromod-be-baseline-statistics-2025 --year 2025
+```
+
+### C6 — full package build suites
+
+```sh
+EUROSTAT_SUITE_DIR=$(mktemp -d /tmp/chronicle-c2-eurostat.XXXXXX)
+JRC_SUITE_DIR=$(mktemp -d /tmp/chronicle-c2-jrc.XXXXXX)
+UV_CACHE_DIR=/tmp/chronicle-c2-uv-cache uv run --offline --no-sync \
+ python -m chronicle.cli build-suite eurostat-nasa-10-nf-tr \
+ --year 2024 --out "$EUROSTAT_SUITE_DIR" --replace
+UV_CACHE_DIR=/tmp/chronicle-c2-uv-cache uv run --offline --no-sync \
+ python -m chronicle.cli build-suite jrc-euromod-be-baseline-statistics-2025 \
+ --year 2025 --out "$JRC_SUITE_DIR" --replace
+```
+
+### C7 — emitted-row, cell, and fact validators
+
+Run in the same shell as C6 so its two task-specific output variables remain
+defined.
+
+```sh
+for VALIDATION_KIND in source-rows source-cells facts; do
+ VALIDATION_FILE=$(printf '%s' "$VALIDATION_KIND" | tr '-' '_').jsonl
+ UV_CACHE_DIR=/tmp/chronicle-c2-uv-cache uv run --offline --no-sync \
+ python -m chronicle.cli "validate-$VALIDATION_KIND" \
+ --input "$EUROSTAT_SUITE_DIR/$VALIDATION_FILE"
+ UV_CACHE_DIR=/tmp/chronicle-c2-uv-cache uv run --offline --no-sync \
+ python -m chronicle.cli "validate-$VALIDATION_KIND" \
+ --input "$JRC_SUITE_DIR/$VALIDATION_FILE"
+done
+```
+
+### C8 — repository tests
+
+```sh
+UV_CACHE_DIR=/tmp/chronicle-c2-uv-cache uv run --offline --no-sync pytest -q
+```
+
+### C9 — clean-diff and branch checks
+
+```sh
+git diff --check
+git status --short --branch
+git branch --show-current
+```
+
+## Validation output
+
+| Check | Result | Command |
+|---|---|---|
+| Eurostat package structure | valid; 6 record sets, 78 selected rows, 6 measures, 78 source records, 6 regions; 0 errors, 0 warnings | C5 |
+| JRC package structure | valid; 10 record sets, 41 selected rows, 10 measures, 41 source records, 10 regions; 0 errors, 0 warnings | C5 |
+| Eurostat build suite | valid; 84 complete-cube rows, 1,343 cells, 78 facts, 78 consumer facts, 546 constraints, lineage 1.0, 0 acceptance errors | C6 |
+| JRC build suite | valid; 41 rows, 294 cells, 41 facts, 41 consumer facts, 82 constraints, lineage 1.0, 0 acceptance errors | C6 |
+| Eurostat row/cell/fact validators | all valid; counts 84 / 1,343 / 78; 0 errors and warnings | C7 |
+| JRC row/cell/fact validators | all valid; counts 41 / 294 / 41; 0 errors and warnings | C7 |
+| Repository test suite | 691 passed, 1 skipped, 14 warnings in 991.52s (0:16:31); exit 0 | C8 |
+| `ledger-source-fidelity` judge | PASS; selected coordinates exactly equal all 78 populated cube observations, all JRC additions match cached PDF rows and publisher periods | independent judge review after C1–C7 |
+| `ledger-boundary` judge | PASS; provenance split is correct and no target values, aging, alignment, reconciliation, activation, or solver construction entered Chronicle | independent judge review after C1–C7 |
+
+Both acceptance reports contain one non-fatal environmental warning:
+`concept_alignment_validation_skipped`, because no Axiom CLI command is
+configured. Evidence presence, manual concept review, row semantics, package
+acceptance, and both required Chronicle judge reviews pass.
+
+## Handoff
+
+- Final C9 checks reported no whitespace errors and confirmed branch
+ `be-national-accounts-packages`.
+- The local commit message is
+ `Add Belgium national accounts and JRC external facts`.
+- No push and no R2 upload were performed. The two manifests merely declare the
+ required content-addressed R2 keys.
+- A consumer using a fact outside its publisher period must supply an explicit
+ `PeriodAlignmentDeclaration`; Chronicle returns the published value and does
+ not compute an aligned value.
+
+LANE C2 DONE
diff --git a/chronicle/source_package.py b/chronicle/source_package.py
index 3d9d2e03..25d9e89f 100644
--- a/chronicle/source_package.py
+++ b/chronicle/source_package.py
@@ -266,6 +266,7 @@
),
"eurostat-gov-10a-taxag": Path("eurostat/gov_10a_taxag"),
"eurostat-spr-exp-func": Path("eurostat/spr_exp_func"),
+ "eurostat-nasa-10-nf-tr": Path("eurostat/nasa_10_nf_tr"),
"eurostat-ilc-li02": Path("eurostat/ilc_li02"),
"eurostat-ilc-di01": Path("eurostat/ilc_di01"),
"kff-marketplace-effectuated-enrollment": Path(
diff --git a/db/data/eurostat/nasa_10_nf_tr/SOURCE_URL.txt b/db/data/eurostat/nasa_10_nf_tr/SOURCE_URL.txt
new file mode 100644
index 00000000..75d1ee5e
--- /dev/null
+++ b/db/data/eurostat/nasa_10_nf_tr/SOURCE_URL.txt
@@ -0,0 +1 @@
+https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/nasa_10_nf_tr?format=JSON&lang=en&freq=A&unit=CP_MEUR§or=S14_S15&na_item=B2G&na_item=B3G&na_item=B3N&na_item=B6G&na_item=D1&na_item=D11&na_item=D12&na_item=D4&na_item=D41&na_item=D42&na_item=D44&na_item=D45&na_item=D5&na_item=D61&na_item=D62&direct=RECV&direct=PAID&geo=BE&time=2022&time=2023&time=2024
diff --git a/db/data/eurostat/nasa_10_nf_tr/manifest.yaml b/db/data/eurostat/nasa_10_nf_tr/manifest.yaml
new file mode 100644
index 00000000..9cf0822b
--- /dev/null
+++ b/db/data/eurostat/nasa_10_nf_tr/manifest.yaml
@@ -0,0 +1,26 @@
+source_id: eurostat-nasa-10-nf-tr
+source_name: Eurostat nasa_10_nf_tr non-financial transactions
+publisher: Eurostat
+source_page: https://ec.europa.eu/eurostat/databrowser/view/nasa_10_nf_tr/default/table?lang=en
+files:
+ 2024:
+ filename: nasa_10_nf_tr.json
+ source_url: https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/nasa_10_nf_tr?format=JSON&lang=en&freq=A&unit=CP_MEUR§or=S14_S15&na_item=B2G&na_item=B3G&na_item=B3N&na_item=B6G&na_item=D1&na_item=D11&na_item=D12&na_item=D4&na_item=D41&na_item=D42&na_item=D44&na_item=D45&na_item=D5&na_item=D61&na_item=D62&direct=RECV&direct=PAID&geo=BE&time=2022&time=2023&time=2024
+ source_table: Eurostat nasa_10_nf_tr Non-financial transactions - annual data for Belgian households and NPISH
+ sha256: 30d3f5bf3d1414c78633d13f505558b837b84e92c24b17050249ab19cec20a6d
+ size_bytes: 5098
+ storage:
+ r2:
+ provider: r2
+ bucket: ledger-raw
+ key: raw/eurostat/eurostat-nasa-10-nf-tr/2024/30d3f5bf3d1414c78633d13f505558b837b84e92c24b17050249ab19cec20a6d/nasa_10_nf_tr.json
+ uri: r2://ledger-raw/raw/eurostat/eurostat-nasa-10-nf-tr/2024/30d3f5bf3d1414c78633d13f505558b837b84e92c24b17050249ab19cec20a6d/nasa_10_nf_tr.json
+ source_urls:
+ - https://ec.europa.eu/eurostat/databrowser/view/nasa_10_nf_tr/default/table?lang=en
+ - https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/nasa_10_nf_tr?format=JSON&lang=en&freq=A&unit=CP_MEUR§or=S14_S15&na_item=B2G&na_item=B3G&na_item=B3N&na_item=B6G&na_item=D1&na_item=D11&na_item=D12&na_item=D4&na_item=D41&na_item=D42&na_item=D44&na_item=D45&na_item=D5&na_item=D61&na_item=D62&direct=RECV&direct=PAID&geo=BE&time=2022&time=2023&time=2024
+ notes: >-
+ Real Eurostat dissemination API bytes for the filtered request in
+ source_url; hash-pinned and content-addressed. Different bytes at
+ the mutable API endpoint are a new vintage, never a pin update. The
+ request includes B3N, but the returned cube contains no B3N category;
+ PAID D42 and RECV D5 are present as cube coordinates with null values.
diff --git a/db/data/eurostat/nasa_10_nf_tr/nasa_10_nf_tr.json b/db/data/eurostat/nasa_10_nf_tr/nasa_10_nf_tr.json
new file mode 100644
index 00000000..abd1d2b4
--- /dev/null
+++ b/db/data/eurostat/nasa_10_nf_tr/nasa_10_nf_tr.json
@@ -0,0 +1 @@
+{"version":"2.0","class":"dataset","label":"Non-financial transactions - annual data","source":"ESTAT","updated":"2026-07-27T11:00:00+0200","value":{"0":36960,"1":41351,"2":41447,"3":36718,"4":38850,"5":39700,"6":329780,"7":359164,"8":369313,"9":6011,"10":6174,"11":6359,"12":4758,"13":4919,"14":4978,"15":1253,"16":1255,"17":1381,"18":4940,"19":11584,"20":10622,"21":4572,"22":11184,"23":10226,"27":0,"28":0,"29":0,"30":368,"31":400,"32":396,"33":69114,"34":72794,"35":77033,"36":99704,"37":108000,"38":112346,"39":64,"40":62,"41":86,"42":36960,"43":41351,"44":41447,"45":36718,"46":38850,"47":39700,"48":329780,"49":359164,"50":369313,"51":277464,"52":299696,"53":310278,"54":209481,"55":226018,"56":233080,"57":67983,"58":73677,"59":77198,"60":40867,"61":52674,"62":52437,"63":6334,"64":15962,"65":13943,"66":23090,"67":25012,"68":26144,"69":10463,"70":10605,"71":11223,"72":980,"73":1094,"74":1128,"78":64,"79":62,"80":86,"81":108435,"82":116832,"83":124608},"status":{"2":"p","5":"p","8":"p","11":"p","14":"p","17":"p","20":"p","23":"p","29":"p","32":"p","35":"p","38":"p","41":"p","44":"p","47":"p","50":"p","53":"p","56":"p","59":"p","62":"p","65":"p","68":"p","71":"p","74":"p","80":"p","83":"p"},"id":["freq","unit","direct","na_item","sector","geo","time"],"size":[1,1,2,14,1,1,3],"dimension":{"freq":{"label":"Time frequency","category":{"index":{"A":0},"label":{"A":"Annual"}}},"unit":{"label":"Unit of measure","category":{"index":{"CP_MEUR":0},"label":{"CP_MEUR":"Current prices, million euro"}}},"direct":{"label":"Direction of flow","category":{"index":{"PAID":0,"RECV":1},"label":{"PAID":"Paid","RECV":"Received"}}},"na_item":{"label":"National accounts indicator (ESA 2010)","category":{"index":{"B2G":0,"B3G":1,"B6G":2,"D1":3,"D11":4,"D12":5,"D4":6,"D41":7,"D42":8,"D44":9,"D45":10,"D5":11,"D61":12,"D62":13},"label":{"B2G":"Operating surplus, gross","B3G":"Mixed income, gross","B6G":"Disposable income, gross","D1":"Compensation of employees","D11":"Wages and salaries","D12":"Employers' social contributions","D4":"Property income","D41":"Interest","D42":"Distributed income of corporations","D44":"Other investment income","D45":"Rents","D5":"Current taxes on income, wealth, etc.","D61":"Net social contributions","D62":"Social benefits other than social transfers in kind"}}},"sector":{"label":"Sector","category":{"index":{"S14_S15":0},"label":{"S14_S15":"Households; non-profit institutions serving households"}}},"geo":{"label":"Geopolitical entity (reporting)","category":{"index":{"BE":0},"label":{"BE":"Belgium"}}},"time":{"label":"Time","category":{"index":{"2022":0,"2023":1,"2024":2},"label":{"2022":"2022","2023":"2023","2024":"2024"}}}},"extension":{"lang":"EN","description":"
Annual non-financial transactions cover production, income generation, distribution and use, as well as consumption and capital investments.
The data is available broken down by institutional sectors (households, government, financial and non-financial corporations, and the rest of the world), illustrating their economic behaviour and interactions between them.
The series are calculated following the European System of Accounts (ESA 2010) methodology.
","id":"NASA_10_NF_TR","agencyId":"ESTAT","version":"1.0","datastructure":{"id":"NASA_10_NF_TR","agencyId":"ESTAT","version":"109.0"},"annotation":[{"type":"CREATED","date":"2014-10-13T17:05:33+0200"},{"type":"DISSEMINATION_DOI_XML","title":"10.2908/NASA_10_NF_TR2023-01-19"},{"type":"DISSEMINATION_OBJECT_TYPE","title":"DATASET"},{"type":"DISSEMINATION_TIMESTAMP_DATA","date":"2026-07-27T11:00:00+0200"},{"type":"DISSEMINATION_TIMESTAMP_GLOBAL","date":"2026-07-27T11:00:00+0200"},{"type":"DISSEMINATION_TIMESTAMP_PLANNED","date":"2026-07-27T11:00:00+0200"},{"type":"ESMS_HTML","title":"Explanatory texts (metadata)","href":"https://ec.europa.eu/eurostat/cache/metadata/en/nasa_10_nf_tr_esms.htm"},{"type":"ESMS_SDMX","title":"Explanatory texts (metadata)","href":"https://ec.europa.eu/eurostat/api/dissemination/files?file=metadata/nasa_10_nf_tr_esms.sdmx.zip"},{"type":"OBS_COUNT","title":"2088821"},{"type":"OBS_PERIOD_OVERALL_LATEST","title":"2025"},{"type":"OBS_PERIOD_OVERALL_OLDEST","title":"1949"},{"type":"SOURCE_INSTITUTIONS","text":"Eurostat"},{"type":"UPDATE_DATA","date":"2026-07-27T11:00:00+0200"},{"type":"UPDATE_STRUCTURE","date":"2026-07-03T11:00:00+0200"}],"status":{"label":{"p":"provisional"}},"positions-with-no-data":{"freq":[],"unit":[],"direct":[],"na_item":[],"sector":[],"geo":[],"time":[]}}}
\ No newline at end of file
diff --git a/db/data/jrc/euromod_be_baseline_statistics_2025/jrc_euromod_be_baseline_statistics_2025.csv b/db/data/jrc/euromod_be_baseline_statistics_2025/jrc_euromod_be_baseline_statistics_2025.csv
index 5070a044..5359c8bf 100644
--- a/db/data/jrc/euromod_be_baseline_statistics_2025/jrc_euromod_be_baseline_statistics_2025.csv
+++ b/db/data/jrc/euromod_be_baseline_statistics_2025/jrc_euromod_be_baseline_statistics_2025.csv
@@ -17,3 +17,26 @@ a3_8_poverty_60_total_euromod_2022,2022,at_risk_poverty_60_median_total,euromod,
a3_8_poverty_60_total_external_2022,2022,at_risk_poverty_60_median_total,external,A3.8,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,12.30
a3_7_gini_ratio_2022,2022,gini,ratio,A3.7,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,0.92
a3_8_poverty_60_total_ratio_2022,2022,at_risk_poverty_60_median_total,ratio,A3.8,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,0.91
+a3_5_income_support_external_2021,2021,income_support_bsa_s,external,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,215
+a3_5_unemployment_benefits_external_2021,2021,unemployment_benefits_bun,external,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,992
+a3_1_self_employment_income_external_2022,2022,self_employment_income_yse,external,A3.1,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,1257
+a3_5_income_support_external_2022,2022,income_support_bsa_s,external,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,241
+a3_5_unemployment_benefits_external_2022,2022,unemployment_benefits_bun,external,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,813
+a3_5_old_age_pension_silc_2022,2022,old_age_pension_poa,silc,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,2273
+a3_5_survivor_pension_silc_2022,2022,survivor_pension_psu,silc,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,79
+a3_2_employment_income_external_2021,2021,employment_income_yem,external,A3.2,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,147112
+a3_4_capital_income_tax_external_2021,2021,capital_income_tax_tinkt_s,external,A3.4,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,3522
+a3_6_income_support_external_2021,2021,income_support_bsa_s,external,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,1656
+a3_6_income_support_elderly_external_2021,2021,income_support_elderly_bsaoa_s,external,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,767
+a3_6_child_benefits_external_2021,2021,child_benefits_bch_s,external,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,7305
+a3_6_unemployment_benefits_external_2021,2021,unemployment_benefits_bun,external,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,8197
+a3_2_employment_income_external_2022,2022,employment_income_yem,external,A3.2,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,161644
+a3_4_capital_income_tax_external_2022,2022,capital_income_tax_tinkt_s,external,A3.4,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,4152
+a3_6_income_support_external_2022,2022,income_support_bsa_s,external,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,1809
+a3_6_income_support_elderly_external_2022,2022,income_support_elderly_bsaoa_s,external,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,824
+a3_6_child_benefits_external_2022,2022,child_benefits_bch_s,external,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,7738
+a3_6_unemployment_benefits_external_2022,2022,unemployment_benefits_bun,external,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,6670
+a3_2_employment_income_external_2023,2023,employment_income_yem,external,A3.2,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,175998
+a3_6_old_age_survivor_pension_external_2023,2023,old_age_survivor_pension_il_ext_poapsu,external,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,64443
+a3_6_income_support_external_2023,2023,income_support_bsa_s,external,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,2049
+a3_6_income_support_elderly_external_2023,2023,income_support_elderly_bsaoa_s,external,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,941
diff --git a/db/data/jrc/euromod_be_baseline_statistics_2025/manifest.yaml b/db/data/jrc/euromod_be_baseline_statistics_2025/manifest.yaml
index e4e1be17..a0ae1710 100644
--- a/db/data/jrc/euromod_be_baseline_statistics_2025/manifest.yaml
+++ b/db/data/jrc/euromod_be_baseline_statistics_2025/manifest.yaml
@@ -8,16 +8,19 @@ files:
filename: jrc_euromod_be_baseline_statistics_2025.csv
source_url: https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf
source_table: EUROMOD Country Report Belgium 2025 validation tables
- sha256: 2ed1f8a677799fefe7cc2f092b4f30221940a2a2fc9deecbf29e7a5f7d71b69f
- size_bytes: 3024
+ sha256: 2ef69251a72caaab042706c77143fa4f86dde2f800747ebb421b5f7b9a45e394
+ size_bytes: 6956
storage:
r2:
provider: r2
bucket: ledger-raw
- key: raw/belgium/jrc-euromod-be-baseline-statistics-2025/2025/2ed1f8a677799fefe7cc2f092b4f30221940a2a2fc9deecbf29e7a5f7d71b69f/jrc_euromod_be_baseline_statistics_2025.csv
- uri: r2://ledger-raw/raw/belgium/jrc-euromod-be-baseline-statistics-2025/2025/2ed1f8a677799fefe7cc2f092b4f30221940a2a2fc9deecbf29e7a5f7d71b69f/jrc_euromod_be_baseline_statistics_2025.csv
+ key: raw/belgium/jrc-euromod-be-baseline-statistics-2025/2025/2ef69251a72caaab042706c77143fa4f86dde2f800747ebb421b5f7b9a45e394/jrc_euromod_be_baseline_statistics_2025.csv
+ uri: r2://ledger-raw/raw/belgium/jrc-euromod-be-baseline-statistics-2025/2025/2ef69251a72caaab042706c77143fa4f86dde2f800747ebb421b5f7b9a45e394/jrc_euromod_be_baseline_statistics_2025.csv
source_urls:
- https://euromod-web.jrc.ec.europa.eu/resources/country-reports
- https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf
- notes: Curated comparator rows from Annex 3 validation tables in the 2025 EUROMOD
- Country Report for Belgium. Each row carries the report PDF URL.
+ notes: >-
+ Curated comparator rows from Annex 3 validation tables in the 2025
+ EUROMOD Country Report for Belgium. Each row carries the report PDF URL;
+ publisher periods are preserved exactly, including the administrative
+ External series ending in 2023.
diff --git a/packages/eurostat/nasa_10_nf_tr/source_package.yaml b/packages/eurostat/nasa_10_nf_tr/source_package.yaml
new file mode 100644
index 00000000..3fecec49
--- /dev/null
+++ b/packages/eurostat/nasa_10_nf_tr/source_package.yaml
@@ -0,0 +1,667 @@
+schema_version: ledger.source_package.v1
+package_id: eurostat-nasa-10-nf-tr
+label: Eurostat nasa_10_nf_tr Belgian household-sector non-financial transactions
+artifact:
+ source_name: eurostat
+ source_table: Eurostat nasa_10_nf_tr Non-financial transactions - annual data for Belgian households and NPISH
+ resource_package: db
+ resource_directory: data/eurostat/nasa_10_nf_tr
+ manifest: manifest.yaml
+ vintage: eurostat_nasa_10_nf_tr_2024
+ extracted_at: "2026-08-23"
+ extraction_method: >-
+ Eurostat dissemination API v1.0 JSON-stat 2.0 full-cube row parse of
+ the filtered request recorded in the manifest source_url
+ parser: json_stat_2_full_rows
+ artifact_year: 2024
+ sheet_name: nasa_10_nf_tr
+ # The returned cube has 84 positions. Chronicle preserves every position
+ # as a source row, including null PAID D42 and RECV D5 cells, but selects
+ # only the 78 publisher-populated observations as facts. B3N was requested
+ # but is absent from the returned na_item dimension and is not fabricated.
+ selected_rows:
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: B2G, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: B3G, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: B6G, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D1, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D11, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D12, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D4, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D41, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D44, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D45, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D5, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D61, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D62, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: B2G, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: B3G, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: B6G, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D1, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D11, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D12, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D4, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D41, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D42, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D44, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D45, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D61, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D62, sector: S14_S15, geo: BE, time: "2022"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: B2G, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: B3G, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: B6G, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D1, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D11, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D12, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D4, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D41, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D44, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D45, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D5, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D61, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D62, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: B2G, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: B3G, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: B6G, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D1, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D11, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D12, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D4, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D41, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D42, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D44, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D45, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D61, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D62, sector: S14_S15, geo: BE, time: "2023"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: B2G, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: B3G, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: B6G, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D1, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D11, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D12, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D4, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D41, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D44, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D45, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D5, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D61, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D62, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: B2G, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: B3G, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: B6G, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D1, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D11, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D12, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D4, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D41, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D42, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D44, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D45, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D61, sector: S14_S15, geo: BE, time: "2024"}
+ - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D62, sector: S14_S15, geo: BE, time: "2024"}
+record_sets:
+ - &paid_record_set
+ record_set_id: eurostat.nasa_10_nf_tr.cy2022.household_non_financial_transactions.paid.be
+ provenance_class: administrative
+ record_set_spec_id: eurostat.nasa_10_nf_tr.household_non_financial_transactions.direction.country.v1
+ source_record_id_prefix: eurostat.nasa_10_nf_tr.cy2022.household_non_financial_transactions.paid.be
+ sheet_name: nasa_10_nf_tr
+ period_type: calendar_year
+ period: 2022
+ geography_id: BE
+ geography_level: country
+ geography_name: Belgium
+ geography_vintage: current
+ entity: household
+ entity_role: resident_households_and_npish
+ domain: national_accounts
+ groupby_dimension: na_item
+ shared_filters:
+ freq: A
+ unit: CP_MEUR
+ direct: PAID
+ sector: S14_S15
+ geo: BE
+ time: "2022"
+ shared_constraints:
+ - {variable: freq, operator: "==", value: A, label: annual frequency}
+ - {variable: unit, operator: "==", value: CP_MEUR, label: current-price million euro source unit}
+ - {variable: direct, operator: "==", value: PAID, label: paid direction}
+ - {variable: sector, operator: "==", value: S14_S15, label: households and NPISH institutional sector}
+ - {variable: geo, operator: "==", value: BE, label: Belgium}
+ - {variable: time, operator: "==", value: "2022", label: source time}
+ rows:
+ - &paid_b2g_row
+ value_id: belgium_household_operating_surplus_gross
+ label: Operating surplus, gross (B.2G), paid-direction cell
+ ordinal: 0
+ row_number: 2
+ expected_row_header_column: D
+ expected_row_header: B2G
+ filters: {na_item: B2G}
+ constraints:
+ - {variable: na_item, operator: "==", value: B2G, label: ESA 2010 operating surplus gross}
+ guard_cells: &paid_2022_guards
+ - {column: A, expected_value: A, label: annual frequency}
+ - {column: B, expected_value: CP_MEUR, label: current-price million euro source unit}
+ - {column: C, expected_value: PAID, label: paid direction}
+ - {column: E, expected_value: S14_S15, label: households and NPISH institutional sector}
+ - {column: F, expected_value: BE, label: Belgium}
+ - {column: G, row: 1, expected_value: time, label: time dimension header}
+ - &paid_b3g_row
+ value_id: belgium_household_mixed_income_gross
+ label: Mixed income, gross (B.3G), paid-direction cell
+ ordinal: 1
+ row_number: 3
+ expected_row_header_column: D
+ expected_row_header: B3G
+ filters: {na_item: B3G}
+ constraints:
+ - {variable: na_item, operator: "==", value: B3G, label: ESA 2010 mixed income gross}
+ guard_cells: *paid_2022_guards
+ - &paid_b6g_row
+ value_id: belgium_household_disposable_income_gross
+ label: Disposable income, gross (B.6G), paid-direction cell
+ ordinal: 2
+ row_number: 4
+ expected_row_header_column: D
+ expected_row_header: B6G
+ filters: {na_item: B6G}
+ constraints:
+ - {variable: na_item, operator: "==", value: B6G, label: ESA 2010 disposable income gross}
+ guard_cells: *paid_2022_guards
+ - &paid_d1_row
+ value_id: belgium_household_compensation_of_employees_paid
+ label: Compensation of employees paid (D.1)
+ ordinal: 3
+ row_number: 5
+ expected_row_header_column: D
+ expected_row_header: D1
+ filters: {na_item: D1}
+ constraints:
+ - {variable: na_item, operator: "==", value: D1, label: ESA 2010 compensation of employees}
+ guard_cells: *paid_2022_guards
+ - &paid_d11_row
+ value_id: belgium_household_wages_and_salaries_paid
+ label: Wages and salaries paid (D.11)
+ ordinal: 4
+ row_number: 6
+ expected_row_header_column: D
+ expected_row_header: D11
+ filters: {na_item: D11}
+ constraints:
+ - {variable: na_item, operator: "==", value: D11, label: ESA 2010 wages and salaries}
+ guard_cells: *paid_2022_guards
+ - &paid_d12_row
+ value_id: belgium_household_employers_social_contributions_paid
+ label: Employers' social contributions paid (D.12)
+ ordinal: 5
+ row_number: 7
+ expected_row_header_column: D
+ expected_row_header: D12
+ filters: {na_item: D12}
+ constraints:
+ - {variable: na_item, operator: "==", value: D12, label: ESA 2010 employers' social contributions}
+ guard_cells: *paid_2022_guards
+ - &paid_d4_row
+ value_id: belgium_household_property_income_paid
+ label: Property income paid (D.4)
+ ordinal: 6
+ row_number: 8
+ expected_row_header_column: D
+ expected_row_header: D4
+ filters: {na_item: D4}
+ constraints:
+ - {variable: na_item, operator: "==", value: D4, label: ESA 2010 property income}
+ guard_cells: *paid_2022_guards
+ - &paid_d41_row
+ value_id: belgium_household_interest_paid
+ label: Interest paid (D.41)
+ ordinal: 7
+ row_number: 9
+ expected_row_header_column: D
+ expected_row_header: D41
+ filters: {na_item: D41}
+ constraints:
+ - {variable: na_item, operator: "==", value: D41, label: ESA 2010 interest}
+ guard_cells: *paid_2022_guards
+ - &paid_d44_row
+ value_id: belgium_household_other_investment_income_paid
+ label: Other investment income paid (D.44)
+ ordinal: 8
+ row_number: 10
+ expected_row_header_column: D
+ expected_row_header: D44
+ filters: {na_item: D44}
+ constraints:
+ - {variable: na_item, operator: "==", value: D44, label: ESA 2010 other investment income}
+ guard_cells: *paid_2022_guards
+ - &paid_d45_row
+ value_id: belgium_household_rents_paid
+ label: Rents paid (D.45)
+ ordinal: 9
+ row_number: 11
+ expected_row_header_column: D
+ expected_row_header: D45
+ filters: {na_item: D45}
+ constraints:
+ - {variable: na_item, operator: "==", value: D45, label: ESA 2010 rents}
+ guard_cells: *paid_2022_guards
+ - &paid_d5_row
+ value_id: belgium_household_current_taxes_on_income_paid
+ label: Current taxes on income, wealth, etc. paid (D.5)
+ ordinal: 10
+ row_number: 12
+ expected_row_header_column: D
+ expected_row_header: D5
+ filters: {na_item: D5}
+ constraints:
+ - {variable: na_item, operator: "==", value: D5, label: ESA 2010 current taxes on income, wealth, etc.}
+ guard_cells: *paid_2022_guards
+ - &paid_d61_row
+ value_id: belgium_household_net_social_contributions_paid
+ label: Net social contributions paid (D.61)
+ ordinal: 11
+ row_number: 13
+ expected_row_header_column: D
+ expected_row_header: D61
+ filters: {na_item: D61}
+ constraints:
+ - {variable: na_item, operator: "==", value: D61, label: ESA 2010 net social contributions}
+ guard_cells: *paid_2022_guards
+ - &paid_d62_row
+ value_id: belgium_household_social_benefits_paid
+ label: Social benefits other than social transfers in kind paid (D.62)
+ ordinal: 12
+ row_number: 14
+ expected_row_header_column: D
+ expected_row_header: D62
+ filters: {na_item: D62}
+ constraints:
+ - {variable: na_item, operator: "==", value: D62, label: ESA 2010 social benefits other than social transfers in kind}
+ guard_cells: *paid_2022_guards
+ measures: &transaction_measure
+ - measure_id: amount
+ label: Household-sector national-accounts non-financial transaction amount
+ ordinal: 0
+ column: H
+ source_column_id: value
+ expected_column_header_row: 1
+ expected_column_header: value
+ concept: belgium_household_national_accounts_non_financial_transaction_amount
+ source_concept: eurostat.nasa_10_nf_tr.non_financial_transaction_amount
+ concept_relation: exact
+ concept_authority: ledger-be
+ concept_evidence_url: https://ec.europa.eu/eurostat/databrowser/view/nasa_10_nf_tr/default/table?lang=en
+ concept_evidence_notes: >-
+ Each row is the exact current-price ESA 2010 amount published by
+ Eurostat for Belgium and institutional sector S14_S15, which combines
+ households and non-profit institutions serving households. B.2G,
+ B.3G, and B.6G are balancing items, not independent paid and received
+ flows; the API repeats their published levels under both directions.
+ Eurostat marks the populated 2024 observations provisional in the
+ returned status dimension.
+ B.3G is mixed income before deducting consumption of fixed capital
+ and combines labour and capital returns of household unincorporated
+ enterprises. D.1 comprises D.11 wages and salaries plus D.12 actual
+ and imputed employers' social contributions; on the resources side,
+ D.12 is imputed to households and is not cash wages. D.4 and its
+ components overlap: D.41 is ESA interest after the FISIM adjustment;
+ D.42 is distributed income of corporations; D.44 is investment
+ income attributable to insurance policyholders, pension entitlement
+ holders, and collective investment fund shareholders, not taxable
+ movable income; and D.45 is rent on natural resources, not tenant
+ housing rent. D.5 covers current taxes on income, wealth, etc., not
+ personal income tax alone. D.61 is the broad ESA net social
+ contribution aggregate, and D.62 covers social benefits other than
+ social transfers in kind. Chronicle stores every published aggregate
+ without reconciling overlapping totals or constructing calibration
+ targets.
+ unit: eur
+ aggregation: sum
+ value_scale: 1000000
+ expected_cell_type: number
+ - &received_record_set
+ record_set_id: eurostat.nasa_10_nf_tr.cy2022.household_non_financial_transactions.received.be
+ provenance_class: administrative
+ record_set_spec_id: eurostat.nasa_10_nf_tr.household_non_financial_transactions.direction.country.v1
+ source_record_id_prefix: eurostat.nasa_10_nf_tr.cy2022.household_non_financial_transactions.received.be
+ sheet_name: nasa_10_nf_tr
+ period_type: calendar_year
+ period: 2022
+ geography_id: BE
+ geography_level: country
+ geography_name: Belgium
+ geography_vintage: current
+ entity: household
+ entity_role: resident_households_and_npish
+ domain: national_accounts
+ groupby_dimension: na_item
+ shared_filters:
+ freq: A
+ unit: CP_MEUR
+ direct: RECV
+ sector: S14_S15
+ geo: BE
+ time: "2022"
+ shared_constraints:
+ - {variable: freq, operator: "==", value: A, label: annual frequency}
+ - {variable: unit, operator: "==", value: CP_MEUR, label: current-price million euro source unit}
+ - {variable: direct, operator: "==", value: RECV, label: received direction}
+ - {variable: sector, operator: "==", value: S14_S15, label: households and NPISH institutional sector}
+ - {variable: geo, operator: "==", value: BE, label: Belgium}
+ - {variable: time, operator: "==", value: "2022", label: source time}
+ rows:
+ - &received_b2g_row
+ value_id: belgium_household_operating_surplus_gross
+ label: Operating surplus, gross (B.2G), received-direction cell
+ ordinal: 0
+ row_number: 15
+ expected_row_header_column: D
+ expected_row_header: B2G
+ filters: {na_item: B2G}
+ constraints:
+ - {variable: na_item, operator: "==", value: B2G, label: ESA 2010 operating surplus gross}
+ guard_cells: &received_2022_guards
+ - {column: A, expected_value: A, label: annual frequency}
+ - {column: B, expected_value: CP_MEUR, label: current-price million euro source unit}
+ - {column: C, expected_value: RECV, label: received direction}
+ - {column: E, expected_value: S14_S15, label: households and NPISH institutional sector}
+ - {column: F, expected_value: BE, label: Belgium}
+ - {column: G, row: 1, expected_value: time, label: time dimension header}
+ - &received_b3g_row
+ value_id: belgium_household_mixed_income_gross
+ label: Mixed income, gross (B.3G), received-direction cell
+ ordinal: 1
+ row_number: 16
+ expected_row_header_column: D
+ expected_row_header: B3G
+ filters: {na_item: B3G}
+ constraints:
+ - {variable: na_item, operator: "==", value: B3G, label: ESA 2010 mixed income gross}
+ guard_cells: *received_2022_guards
+ - &received_b6g_row
+ value_id: belgium_household_disposable_income_gross
+ label: Disposable income, gross (B.6G), received-direction cell
+ ordinal: 2
+ row_number: 17
+ expected_row_header_column: D
+ expected_row_header: B6G
+ filters: {na_item: B6G}
+ constraints:
+ - {variable: na_item, operator: "==", value: B6G, label: ESA 2010 disposable income gross}
+ guard_cells: *received_2022_guards
+ - &received_d1_row
+ value_id: belgium_household_compensation_of_employees_received
+ label: Compensation of employees received (D.1)
+ ordinal: 3
+ row_number: 18
+ expected_row_header_column: D
+ expected_row_header: D1
+ filters: {na_item: D1}
+ constraints:
+ - {variable: na_item, operator: "==", value: D1, label: ESA 2010 compensation of employees}
+ guard_cells: *received_2022_guards
+ - &received_d11_row
+ value_id: belgium_household_wages_and_salaries_received
+ label: Wages and salaries received (D.11)
+ ordinal: 4
+ row_number: 19
+ expected_row_header_column: D
+ expected_row_header: D11
+ filters: {na_item: D11}
+ constraints:
+ - {variable: na_item, operator: "==", value: D11, label: ESA 2010 wages and salaries}
+ guard_cells: *received_2022_guards
+ - &received_d12_row
+ value_id: belgium_household_employers_social_contributions_received
+ label: Employers' social contributions received (D.12)
+ ordinal: 5
+ row_number: 20
+ expected_row_header_column: D
+ expected_row_header: D12
+ filters: {na_item: D12}
+ constraints:
+ - {variable: na_item, operator: "==", value: D12, label: ESA 2010 employers' social contributions}
+ guard_cells: *received_2022_guards
+ - &received_d4_row
+ value_id: belgium_household_property_income_received
+ label: Property income received (D.4)
+ ordinal: 6
+ row_number: 21
+ expected_row_header_column: D
+ expected_row_header: D4
+ filters: {na_item: D4}
+ constraints:
+ - {variable: na_item, operator: "==", value: D4, label: ESA 2010 property income}
+ guard_cells: *received_2022_guards
+ - &received_d41_row
+ value_id: belgium_household_interest_received
+ label: Interest received (D.41)
+ ordinal: 7
+ row_number: 22
+ expected_row_header_column: D
+ expected_row_header: D41
+ filters: {na_item: D41}
+ constraints:
+ - {variable: na_item, operator: "==", value: D41, label: ESA 2010 interest}
+ guard_cells: *received_2022_guards
+ - &received_d42_row
+ value_id: belgium_household_distributed_income_of_corporations_received
+ label: Distributed income of corporations received (D.42)
+ ordinal: 8
+ row_number: 23
+ expected_row_header_column: D
+ expected_row_header: D42
+ filters: {na_item: D42}
+ constraints:
+ - {variable: na_item, operator: "==", value: D42, label: ESA 2010 distributed income of corporations}
+ guard_cells: *received_2022_guards
+ - &received_d44_row
+ value_id: belgium_household_other_investment_income_received
+ label: Other investment income received (D.44)
+ ordinal: 9
+ row_number: 24
+ expected_row_header_column: D
+ expected_row_header: D44
+ filters: {na_item: D44}
+ constraints:
+ - {variable: na_item, operator: "==", value: D44, label: ESA 2010 other investment income}
+ guard_cells: *received_2022_guards
+ - &received_d45_row
+ value_id: belgium_household_rents_received
+ label: Rents received (D.45)
+ ordinal: 10
+ row_number: 25
+ expected_row_header_column: D
+ expected_row_header: D45
+ filters: {na_item: D45}
+ constraints:
+ - {variable: na_item, operator: "==", value: D45, label: ESA 2010 rents}
+ guard_cells: *received_2022_guards
+ - &received_d61_row
+ value_id: belgium_household_net_social_contributions_received
+ label: Net social contributions received (D.61)
+ ordinal: 11
+ row_number: 26
+ expected_row_header_column: D
+ expected_row_header: D61
+ filters: {na_item: D61}
+ constraints:
+ - {variable: na_item, operator: "==", value: D61, label: ESA 2010 net social contributions}
+ guard_cells: *received_2022_guards
+ - &received_d62_row
+ value_id: belgium_household_social_benefits_received
+ label: Social benefits other than social transfers in kind received (D.62)
+ ordinal: 12
+ row_number: 27
+ expected_row_header_column: D
+ expected_row_header: D62
+ filters: {na_item: D62}
+ constraints:
+ - {variable: na_item, operator: "==", value: D62, label: ESA 2010 social benefits other than social transfers in kind}
+ guard_cells: *received_2022_guards
+ measures: *transaction_measure
+ - <<: *paid_record_set
+ record_set_id: eurostat.nasa_10_nf_tr.cy2023.household_non_financial_transactions.paid.be
+ provenance_class: administrative
+ source_record_id_prefix: eurostat.nasa_10_nf_tr.cy2023.household_non_financial_transactions.paid.be
+ period: 2023
+ shared_filters:
+ freq: A
+ unit: CP_MEUR
+ direct: PAID
+ sector: S14_S15
+ geo: BE
+ time: "2023"
+ shared_constraints:
+ - {variable: freq, operator: "==", value: A, label: annual frequency}
+ - {variable: unit, operator: "==", value: CP_MEUR, label: current-price million euro source unit}
+ - {variable: direct, operator: "==", value: PAID, label: paid direction}
+ - {variable: sector, operator: "==", value: S14_S15, label: households and NPISH institutional sector}
+ - {variable: geo, operator: "==", value: BE, label: Belgium}
+ - {variable: time, operator: "==", value: "2023", label: source time}
+ rows:
+ - <<: *paid_b2g_row
+ row_number: 28
+ guard_cells: &paid_2023_guards
+ - {column: A, expected_value: A, label: annual frequency}
+ - {column: B, expected_value: CP_MEUR, label: current-price million euro source unit}
+ - {column: C, expected_value: PAID, label: paid direction}
+ - {column: E, expected_value: S14_S15, label: households and NPISH institutional sector}
+ - {column: F, expected_value: BE, label: Belgium}
+ - {column: G, row: 1, expected_value: time, label: time dimension header}
+ - {<<: *paid_b3g_row, row_number: 29, guard_cells: *paid_2023_guards}
+ - {<<: *paid_b6g_row, row_number: 30, guard_cells: *paid_2023_guards}
+ - {<<: *paid_d1_row, row_number: 31, guard_cells: *paid_2023_guards}
+ - {<<: *paid_d11_row, row_number: 32, guard_cells: *paid_2023_guards}
+ - {<<: *paid_d12_row, row_number: 33, guard_cells: *paid_2023_guards}
+ - {<<: *paid_d4_row, row_number: 34, guard_cells: *paid_2023_guards}
+ - {<<: *paid_d41_row, row_number: 35, guard_cells: *paid_2023_guards}
+ - {<<: *paid_d44_row, row_number: 36, guard_cells: *paid_2023_guards}
+ - {<<: *paid_d45_row, row_number: 37, guard_cells: *paid_2023_guards}
+ - {<<: *paid_d5_row, row_number: 38, guard_cells: *paid_2023_guards}
+ - {<<: *paid_d61_row, row_number: 39, guard_cells: *paid_2023_guards}
+ - {<<: *paid_d62_row, row_number: 40, guard_cells: *paid_2023_guards}
+ - <<: *received_record_set
+ record_set_id: eurostat.nasa_10_nf_tr.cy2023.household_non_financial_transactions.received.be
+ provenance_class: administrative
+ source_record_id_prefix: eurostat.nasa_10_nf_tr.cy2023.household_non_financial_transactions.received.be
+ period: 2023
+ shared_filters:
+ freq: A
+ unit: CP_MEUR
+ direct: RECV
+ sector: S14_S15
+ geo: BE
+ time: "2023"
+ shared_constraints:
+ - {variable: freq, operator: "==", value: A, label: annual frequency}
+ - {variable: unit, operator: "==", value: CP_MEUR, label: current-price million euro source unit}
+ - {variable: direct, operator: "==", value: RECV, label: received direction}
+ - {variable: sector, operator: "==", value: S14_S15, label: households and NPISH institutional sector}
+ - {variable: geo, operator: "==", value: BE, label: Belgium}
+ - {variable: time, operator: "==", value: "2023", label: source time}
+ rows:
+ - <<: *received_b2g_row
+ row_number: 41
+ guard_cells: &received_2023_guards
+ - {column: A, expected_value: A, label: annual frequency}
+ - {column: B, expected_value: CP_MEUR, label: current-price million euro source unit}
+ - {column: C, expected_value: RECV, label: received direction}
+ - {column: E, expected_value: S14_S15, label: households and NPISH institutional sector}
+ - {column: F, expected_value: BE, label: Belgium}
+ - {column: G, row: 1, expected_value: time, label: time dimension header}
+ - {<<: *received_b3g_row, row_number: 42, guard_cells: *received_2023_guards}
+ - {<<: *received_b6g_row, row_number: 43, guard_cells: *received_2023_guards}
+ - {<<: *received_d1_row, row_number: 44, guard_cells: *received_2023_guards}
+ - {<<: *received_d11_row, row_number: 45, guard_cells: *received_2023_guards}
+ - {<<: *received_d12_row, row_number: 46, guard_cells: *received_2023_guards}
+ - {<<: *received_d4_row, row_number: 47, guard_cells: *received_2023_guards}
+ - {<<: *received_d41_row, row_number: 48, guard_cells: *received_2023_guards}
+ - {<<: *received_d42_row, row_number: 49, guard_cells: *received_2023_guards}
+ - {<<: *received_d44_row, row_number: 50, guard_cells: *received_2023_guards}
+ - {<<: *received_d45_row, row_number: 51, guard_cells: *received_2023_guards}
+ - {<<: *received_d61_row, row_number: 52, guard_cells: *received_2023_guards}
+ - {<<: *received_d62_row, row_number: 53, guard_cells: *received_2023_guards}
+ - <<: *paid_record_set
+ record_set_id: eurostat.nasa_10_nf_tr.cy2024.household_non_financial_transactions.paid.be
+ provenance_class: administrative
+ source_record_id_prefix: eurostat.nasa_10_nf_tr.cy2024.household_non_financial_transactions.paid.be
+ period: 2024
+ shared_filters:
+ freq: A
+ unit: CP_MEUR
+ direct: PAID
+ sector: S14_S15
+ geo: BE
+ time: "2024"
+ shared_constraints:
+ - {variable: freq, operator: "==", value: A, label: annual frequency}
+ - {variable: unit, operator: "==", value: CP_MEUR, label: current-price million euro source unit}
+ - {variable: direct, operator: "==", value: PAID, label: paid direction}
+ - {variable: sector, operator: "==", value: S14_S15, label: households and NPISH institutional sector}
+ - {variable: geo, operator: "==", value: BE, label: Belgium}
+ - {variable: time, operator: "==", value: "2024", label: source time}
+ rows:
+ - <<: *paid_b2g_row
+ row_number: 54
+ guard_cells: &paid_2024_guards
+ - {column: A, expected_value: A, label: annual frequency}
+ - {column: B, expected_value: CP_MEUR, label: current-price million euro source unit}
+ - {column: C, expected_value: PAID, label: paid direction}
+ - {column: E, expected_value: S14_S15, label: households and NPISH institutional sector}
+ - {column: F, expected_value: BE, label: Belgium}
+ - {column: G, row: 1, expected_value: time, label: time dimension header}
+ - {<<: *paid_b3g_row, row_number: 55, guard_cells: *paid_2024_guards}
+ - {<<: *paid_b6g_row, row_number: 56, guard_cells: *paid_2024_guards}
+ - {<<: *paid_d1_row, row_number: 57, guard_cells: *paid_2024_guards}
+ - {<<: *paid_d11_row, row_number: 58, guard_cells: *paid_2024_guards}
+ - {<<: *paid_d12_row, row_number: 59, guard_cells: *paid_2024_guards}
+ - {<<: *paid_d4_row, row_number: 60, guard_cells: *paid_2024_guards}
+ - {<<: *paid_d41_row, row_number: 61, guard_cells: *paid_2024_guards}
+ - {<<: *paid_d44_row, row_number: 62, guard_cells: *paid_2024_guards}
+ - {<<: *paid_d45_row, row_number: 63, guard_cells: *paid_2024_guards}
+ - {<<: *paid_d5_row, row_number: 64, guard_cells: *paid_2024_guards}
+ - {<<: *paid_d61_row, row_number: 65, guard_cells: *paid_2024_guards}
+ - {<<: *paid_d62_row, row_number: 66, guard_cells: *paid_2024_guards}
+ - <<: *received_record_set
+ record_set_id: eurostat.nasa_10_nf_tr.cy2024.household_non_financial_transactions.received.be
+ provenance_class: administrative
+ source_record_id_prefix: eurostat.nasa_10_nf_tr.cy2024.household_non_financial_transactions.received.be
+ period: 2024
+ shared_filters:
+ freq: A
+ unit: CP_MEUR
+ direct: RECV
+ sector: S14_S15
+ geo: BE
+ time: "2024"
+ shared_constraints:
+ - {variable: freq, operator: "==", value: A, label: annual frequency}
+ - {variable: unit, operator: "==", value: CP_MEUR, label: current-price million euro source unit}
+ - {variable: direct, operator: "==", value: RECV, label: received direction}
+ - {variable: sector, operator: "==", value: S14_S15, label: households and NPISH institutional sector}
+ - {variable: geo, operator: "==", value: BE, label: Belgium}
+ - {variable: time, operator: "==", value: "2024", label: source time}
+ rows:
+ - <<: *received_b2g_row
+ row_number: 67
+ guard_cells: &received_2024_guards
+ - {column: A, expected_value: A, label: annual frequency}
+ - {column: B, expected_value: CP_MEUR, label: current-price million euro source unit}
+ - {column: C, expected_value: RECV, label: received direction}
+ - {column: E, expected_value: S14_S15, label: households and NPISH institutional sector}
+ - {column: F, expected_value: BE, label: Belgium}
+ - {column: G, row: 1, expected_value: time, label: time dimension header}
+ - {<<: *received_b3g_row, row_number: 68, guard_cells: *received_2024_guards}
+ - {<<: *received_b6g_row, row_number: 69, guard_cells: *received_2024_guards}
+ - {<<: *received_d1_row, row_number: 70, guard_cells: *received_2024_guards}
+ - {<<: *received_d11_row, row_number: 71, guard_cells: *received_2024_guards}
+ - {<<: *received_d12_row, row_number: 72, guard_cells: *received_2024_guards}
+ - {<<: *received_d4_row, row_number: 73, guard_cells: *received_2024_guards}
+ - {<<: *received_d41_row, row_number: 74, guard_cells: *received_2024_guards}
+ - {<<: *received_d42_row, row_number: 75, guard_cells: *received_2024_guards}
+ - {<<: *received_d44_row, row_number: 76, guard_cells: *received_2024_guards}
+ - {<<: *received_d45_row, row_number: 77, guard_cells: *received_2024_guards}
+ - {<<: *received_d61_row, row_number: 78, guard_cells: *received_2024_guards}
+ - {<<: *received_d62_row, row_number: 79, guard_cells: *received_2024_guards}
diff --git a/packages/jrc/euromod_be_baseline_statistics_2025/source_package.yaml b/packages/jrc/euromod_be_baseline_statistics_2025/source_package.yaml
index a2feb96a..66400d2f 100644
--- a/packages/jrc/euromod_be_baseline_statistics_2025/source_package.yaml
+++ b/packages/jrc/euromod_be_baseline_statistics_2025/source_package.yaml
@@ -8,7 +8,7 @@ artifact:
resource_directory: data/jrc/euromod_be_baseline_statistics_2025
manifest: manifest.yaml
vintage: euromod_be_country_report_2025
- extracted_at: '2026-07-02'
+ extracted_at: '2026-08-23'
extraction_method: curated CSV extract from JRC EUROMOD Country Report Belgium Annex 3 validation
tables
parser: delimited_text_full_rows
@@ -49,27 +49,9 @@ record_sets:
operator: ==
value: euromod
label: Validation series
- - value_id: a3_4_national_income_tax_external_2023
- label: a3 4 national income tax external 2023
- ordinal: 1
- row_number: 3
- expected_row_header_column: A
- expected_row_header: a3_4_national_income_tax_external_2023
- filters:
- validation.metric: national_income_tax
- validation.series: external
- constraints:
- - variable: validation.metric
- operator: ==
- value: national_income_tax
- label: Validation metric
- - variable: validation.series
- operator: ==
- value: external
- label: Validation series
- value_id: a3_4_employee_sics_euromod_2023
label: a3 4 employee sics euromod 2023
- ordinal: 2
+ ordinal: 1
row_number: 4
expected_row_header_column: A
expected_row_header: a3_4_employee_sics_euromod_2023
@@ -85,27 +67,9 @@ record_sets:
operator: ==
value: euromod
label: Validation series
- - value_id: a3_4_employee_sics_external_2023
- label: a3 4 employee sics external 2023
- ordinal: 3
- row_number: 5
- expected_row_header_column: A
- expected_row_header: a3_4_employee_sics_external_2023
- filters:
- validation.metric: employee_social_insurance_contributions
- validation.series: external
- constraints:
- - variable: validation.metric
- operator: ==
- value: employee_social_insurance_contributions
- label: Validation metric
- - variable: validation.series
- operator: ==
- value: external
- label: Validation series
- value_id: a3_6_child_benefits_euromod_2023
label: a3 6 child benefits euromod 2023
- ordinal: 4
+ ordinal: 2
row_number: 6
expected_row_header_column: A
expected_row_header: a3_6_child_benefits_euromod_2023
@@ -121,27 +85,9 @@ record_sets:
operator: ==
value: euromod
label: Validation series
- - value_id: a3_6_child_benefits_external_2023
- label: a3 6 child benefits external 2023
- ordinal: 5
- row_number: 7
- expected_row_header_column: A
- expected_row_header: a3_6_child_benefits_external_2023
- filters:
- validation.metric: child_benefits
- validation.series: external
- constraints:
- - variable: validation.metric
- operator: ==
- value: child_benefits
- label: Validation metric
- - variable: validation.series
- operator: ==
- value: external
- label: Validation series
- value_id: a3_6_unemployment_benefits_euromod_2023
label: a3 6 unemployment benefits euromod 2023
- ordinal: 6
+ ordinal: 3
row_number: 8
expected_row_header_column: A
expected_row_header: a3_6_unemployment_benefits_euromod_2023
@@ -157,24 +103,6 @@ record_sets:
operator: ==
value: euromod
label: Validation series
- - value_id: a3_6_unemployment_benefits_external_2023
- label: a3 6 unemployment benefits external 2023
- ordinal: 7
- row_number: 9
- expected_row_header_column: A
- expected_row_header: a3_6_unemployment_benefits_external_2023
- filters:
- validation.metric: unemployment_benefits
- validation.series: external
- constraints:
- - variable: validation.metric
- operator: ==
- value: unemployment_benefits
- label: Validation metric
- - variable: validation.series
- operator: ==
- value: external
- label: Validation series
measures:
- measure_id: value
label: Validation table value
@@ -301,6 +229,759 @@ record_sets:
aggregation: sum
value_scale: 1
expected_cell_type: number
+- record_set_id: jrc.euromod_be.cy2021.macrovalidation.external_recipient_counts
+ provenance_class: administrative
+ record_set_spec_id: jrc.euromod_be.macrovalidation.external_recipient_counts.cy2021.v1
+ source_record_id_prefix: jrc.euromod_be.cy2021.macrovalidation.external_recipient_counts
+ sheet_name: jrc_euromod_be_baseline_statistics_2025
+ period_type: calendar_year
+ period: 2021
+ geography_id: BE
+ geography_level: country
+ geography_name: Belgium
+ geography_vintage: current
+ entity: person
+ entity_role: validation_comparator
+ domain: euromod_be_macrovalidation
+ groupby_dimension: validation.metric_series
+ rows:
+ - value_id: a3_5_income_support_external_2021
+ label: A3.5 income support external recipients 2021
+ ordinal: 0
+ row_number: 20
+ expected_row_header_column: A
+ expected_row_header: a3_5_income_support_external_2021
+ filters:
+ validation.metric: income_support_bsa_s
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: income_support_bsa_s
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ - value_id: a3_5_unemployment_benefits_external_2021
+ label: A3.5 unemployment benefits external recipients 2021
+ ordinal: 1
+ row_number: 21
+ expected_row_header_column: A
+ expected_row_header: a3_5_unemployment_benefits_external_2021
+ filters:
+ validation.metric: unemployment_benefits_bun
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: unemployment_benefits_bun
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ measures:
+ - measure_id: value
+ label: External administrative recipient count
+ ordinal: 0
+ column: G
+ source_column_id: value
+ expected_column_header_row: 1
+ expected_column_header: value
+ concept: euromod_be.external_macrovalidation_recipient_count
+ source_concept: jrc.euromod_be.external_validation_statistic
+ concept_relation: source_label
+ concept_authority: jrc
+ concept_evidence_url: https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf
+ concept_evidence_notes: >-
+ JRC Annex 3 Table A3.5, report page 120 (PDF page 122), publishes
+ 2021 External recipient counts in thousands. Its source continuation on
+ report pages 122-123 (PDF pages 124-125) names POD MI/SPP IS for income
+ support recipients and RVA/ONEM for unemployment-benefit recipients.
+ These are administrative statistics republished secondarily by JRC.
+ unit: count
+ aggregation: sum
+ value_scale: 1000
+ expected_cell_type: number
+- record_set_id: jrc.euromod_be.cy2022.macrovalidation.external_recipient_counts
+ provenance_class: administrative
+ record_set_spec_id: jrc.euromod_be.macrovalidation.external_recipient_counts.cy2022.v1
+ source_record_id_prefix: jrc.euromod_be.cy2022.macrovalidation.external_recipient_counts
+ sheet_name: jrc_euromod_be_baseline_statistics_2025
+ period_type: calendar_year
+ period: 2022
+ geography_id: BE
+ geography_level: country
+ geography_name: Belgium
+ geography_vintage: current
+ entity: person
+ entity_role: validation_comparator
+ domain: euromod_be_macrovalidation
+ groupby_dimension: validation.metric_series
+ rows:
+ - value_id: a3_1_self_employment_income_external_2022
+ label: A3.1 self-employment income external recipients 2022
+ ordinal: 0
+ row_number: 22
+ expected_row_header_column: A
+ expected_row_header: a3_1_self_employment_income_external_2022
+ filters:
+ validation.metric: self_employment_income_yse
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: self_employment_income_yse
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ - value_id: a3_5_income_support_external_2022
+ label: A3.5 income support external recipients 2022
+ ordinal: 1
+ row_number: 23
+ expected_row_header_column: A
+ expected_row_header: a3_5_income_support_external_2022
+ filters:
+ validation.metric: income_support_bsa_s
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: income_support_bsa_s
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ - value_id: a3_5_unemployment_benefits_external_2022
+ label: A3.5 unemployment benefits external recipients 2022
+ ordinal: 2
+ row_number: 24
+ expected_row_header_column: A
+ expected_row_header: a3_5_unemployment_benefits_external_2022
+ filters:
+ validation.metric: unemployment_benefits_bun
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: unemployment_benefits_bun
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ measures:
+ - measure_id: value
+ label: External administrative recipient count
+ ordinal: 0
+ column: G
+ source_column_id: value
+ expected_column_header_row: 1
+ expected_column_header: value
+ concept: euromod_be.external_macrovalidation_recipient_count
+ source_concept: jrc.euromod_be.external_validation_statistic
+ concept_relation: source_label
+ concept_authority: jrc
+ concept_evidence_url: https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf
+ concept_evidence_notes: >-
+ JRC Annex 3 Table A3.1, report page 112 (PDF page 114), publishes
+ 1,257 thousand External self-employment-income recipients for 2022; its
+ source continuation on report page 113 (PDF page 115) shows a dash and
+ does not identify a primary issuer for yse. Table A3.5, report page 120
+ (PDF page 122), publishes the 2022 income-support and unemployment
+ recipient counts; its source continuation names POD MI/SPP IS and
+ RVA/ONEM, respectively. The named series are administrative statistics
+ republished secondarily by JRC; no issuer is invented for yse.
+ unit: count
+ aggregation: sum
+ value_scale: 1000
+ expected_cell_type: number
+- record_set_id: jrc.euromod_be.cy2022.macrovalidation.silc_recipient_counts
+ provenance_class: survey_aggregate
+ survey_instrument: EU-SILC
+ record_set_spec_id: jrc.euromod_be.macrovalidation.silc_recipient_counts.cy2022.v1
+ source_record_id_prefix: jrc.euromod_be.cy2022.macrovalidation.silc_recipient_counts
+ sheet_name: jrc_euromod_be_baseline_statistics_2025
+ period_type: calendar_year
+ period: 2022
+ geography_id: BE
+ geography_level: country
+ geography_name: Belgium
+ geography_vintage: current
+ entity: person
+ entity_role: validation_comparator
+ domain: euromod_be_macrovalidation
+ groupby_dimension: validation.metric_series
+ rows:
+ - value_id: a3_5_old_age_pension_silc_2022
+ label: A3.5 old-age pension EU-SILC recipients 2022
+ ordinal: 0
+ row_number: 25
+ expected_row_header_column: A
+ expected_row_header: a3_5_old_age_pension_silc_2022
+ filters:
+ validation.metric: old_age_pension_poa
+ validation.series: silc
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: old_age_pension_poa
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: silc
+ label: Validation series
+ - value_id: a3_5_survivor_pension_silc_2022
+ label: A3.5 survivor pension EU-SILC recipients 2022
+ ordinal: 1
+ row_number: 26
+ expected_row_header_column: A
+ expected_row_header: a3_5_survivor_pension_silc_2022
+ filters:
+ validation.metric: survivor_pension_psu
+ validation.series: silc
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: survivor_pension_psu
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: silc
+ label: Validation series
+ measures:
+ - measure_id: value
+ label: EU-SILC recipient count
+ ordinal: 0
+ column: G
+ source_column_id: value
+ expected_column_header_row: 1
+ expected_column_header: value
+ concept: euromod_be.silc_macrovalidation_recipient_count
+ source_concept: jrc.euromod_be.silc_validation_statistic
+ concept_relation: source_label
+ concept_authority: jrc
+ concept_evidence_url: https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf
+ concept_evidence_notes: >-
+ JRC Annex 3 Table A3.5, report page 120 (PDF page 122), publishes
+ 2,273 thousand old-age-pension (poa) and 79 thousand survivor-pension
+ (psu) recipients in the 2022 SILC column. The corresponding External
+ cells are NaN and the source continuation shows dashes, so these are
+ EU-SILC survey aggregates, not SFPD administrative totals. They are
+ validation-only and must not be used as calibration targets.
+ unit: count
+ aggregation: sum
+ value_scale: 1000
+ expected_cell_type: number
+- record_set_id: jrc.euromod_be.cy2021.macrovalidation.external_amounts
+ provenance_class: administrative
+ record_set_spec_id: jrc.euromod_be.macrovalidation.external_amounts.cy2021.v1
+ source_record_id_prefix: jrc.euromod_be.cy2021.macrovalidation.external_amounts
+ sheet_name: jrc_euromod_be_baseline_statistics_2025
+ period_type: calendar_year
+ period: 2021
+ geography_id: BE
+ geography_level: country
+ geography_name: Belgium
+ geography_vintage: current
+ entity: government
+ entity_role: validation_comparator
+ domain: euromod_be_macrovalidation
+ groupby_dimension: validation.metric_series
+ rows:
+ - value_id: a3_2_employment_income_external_2021
+ label: A3.2 employment income external amount 2021
+ ordinal: 0
+ row_number: 27
+ expected_row_header_column: A
+ expected_row_header: a3_2_employment_income_external_2021
+ filters:
+ validation.metric: employment_income_yem
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: employment_income_yem
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ - value_id: a3_4_capital_income_tax_external_2021
+ label: A3.4 capital income tax external amount 2021
+ ordinal: 1
+ row_number: 28
+ expected_row_header_column: A
+ expected_row_header: a3_4_capital_income_tax_external_2021
+ filters:
+ validation.metric: capital_income_tax_tinkt_s
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: capital_income_tax_tinkt_s
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ - value_id: a3_6_income_support_external_2021
+ label: A3.6 income support external amount 2021
+ ordinal: 2
+ row_number: 29
+ expected_row_header_column: A
+ expected_row_header: a3_6_income_support_external_2021
+ filters:
+ validation.metric: income_support_bsa_s
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: income_support_bsa_s
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ - value_id: a3_6_income_support_elderly_external_2021
+ label: A3.6 income support for the elderly external amount 2021
+ ordinal: 3
+ row_number: 30
+ expected_row_header_column: A
+ expected_row_header: a3_6_income_support_elderly_external_2021
+ filters:
+ validation.metric: income_support_elderly_bsaoa_s
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: income_support_elderly_bsaoa_s
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ - value_id: a3_6_child_benefits_external_2021
+ label: A3.6 child benefits external amount 2021
+ ordinal: 4
+ row_number: 31
+ expected_row_header_column: A
+ expected_row_header: a3_6_child_benefits_external_2021
+ filters:
+ validation.metric: child_benefits_bch_s
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: child_benefits_bch_s
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ - value_id: a3_6_unemployment_benefits_external_2021
+ label: A3.6 unemployment benefits external amount 2021
+ ordinal: 5
+ row_number: 32
+ expected_row_header_column: A
+ expected_row_header: a3_6_unemployment_benefits_external_2021
+ filters:
+ validation.metric: unemployment_benefits_bun
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: unemployment_benefits_bun
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ measures:
+ - measure_id: value
+ label: External administrative annual amount
+ ordinal: 0
+ column: G
+ source_column_id: value
+ expected_column_header_row: 1
+ expected_column_header: value
+ concept: euromod_be.external_macrovalidation_amount
+ source_concept: jrc.euromod_be.external_validation_statistic
+ concept_relation: source_label
+ concept_authority: jrc
+ concept_evidence_url: https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf
+ concept_evidence_notes: >-
+ JRC Annex 3 Tables A3.2, A3.4, and A3.6 publish the 2021 External
+ annual amounts in millions on report pages 114, 118, and 125 (PDF
+ pages 116, 120, and 127). The source continuations on report pages 113,
+ 116, and 122-124 (PDF pages 115, 118, and 124-126) name RSZ/ONSS for
+ employment income, NBB for capital-income tax and both income-support
+ amount rows, NBB for child-benefit amounts, and RVA/ONEM for
+ unemployment-benefit amounts. These are administrative statistics
+ republished secondarily by JRC; the Annex source row names NBB, not
+ FAMIFED or a regional agency, for the child-benefit amount, and names
+ FPD/SFPD only for elderly-income-support recipient counts, not amounts.
+ The report's narrative on page 101 says
+ the employment-income comparator excludes substantial holiday pay,
+ performance-related bonuses, and meal vouchers included in EUROMOD,
+ and that the external capital-income-tax series is the broader advance
+ levy on movable property rather than capital income alone.
+ unit: eur
+ aggregation: sum
+ value_scale: 1000000
+ expected_cell_type: number
+- record_set_id: jrc.euromod_be.cy2022.macrovalidation.external_amounts
+ provenance_class: administrative
+ record_set_spec_id: jrc.euromod_be.macrovalidation.external_amounts.cy2022.v1
+ source_record_id_prefix: jrc.euromod_be.cy2022.macrovalidation.external_amounts
+ sheet_name: jrc_euromod_be_baseline_statistics_2025
+ period_type: calendar_year
+ period: 2022
+ geography_id: BE
+ geography_level: country
+ geography_name: Belgium
+ geography_vintage: current
+ entity: government
+ entity_role: validation_comparator
+ domain: euromod_be_macrovalidation
+ groupby_dimension: validation.metric_series
+ rows:
+ - value_id: a3_2_employment_income_external_2022
+ label: A3.2 employment income external amount 2022
+ ordinal: 0
+ row_number: 33
+ expected_row_header_column: A
+ expected_row_header: a3_2_employment_income_external_2022
+ filters:
+ validation.metric: employment_income_yem
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: employment_income_yem
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ - value_id: a3_4_capital_income_tax_external_2022
+ label: A3.4 capital income tax external amount 2022
+ ordinal: 1
+ row_number: 34
+ expected_row_header_column: A
+ expected_row_header: a3_4_capital_income_tax_external_2022
+ filters:
+ validation.metric: capital_income_tax_tinkt_s
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: capital_income_tax_tinkt_s
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ - value_id: a3_6_income_support_external_2022
+ label: A3.6 income support external amount 2022
+ ordinal: 2
+ row_number: 35
+ expected_row_header_column: A
+ expected_row_header: a3_6_income_support_external_2022
+ filters:
+ validation.metric: income_support_bsa_s
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: income_support_bsa_s
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ - value_id: a3_6_income_support_elderly_external_2022
+ label: A3.6 income support for the elderly external amount 2022
+ ordinal: 3
+ row_number: 36
+ expected_row_header_column: A
+ expected_row_header: a3_6_income_support_elderly_external_2022
+ filters:
+ validation.metric: income_support_elderly_bsaoa_s
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: income_support_elderly_bsaoa_s
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ - value_id: a3_6_child_benefits_external_2022
+ label: A3.6 child benefits external amount 2022
+ ordinal: 4
+ row_number: 37
+ expected_row_header_column: A
+ expected_row_header: a3_6_child_benefits_external_2022
+ filters:
+ validation.metric: child_benefits_bch_s
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: child_benefits_bch_s
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ - value_id: a3_6_unemployment_benefits_external_2022
+ label: A3.6 unemployment benefits external amount 2022
+ ordinal: 5
+ row_number: 38
+ expected_row_header_column: A
+ expected_row_header: a3_6_unemployment_benefits_external_2022
+ filters:
+ validation.metric: unemployment_benefits_bun
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: unemployment_benefits_bun
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ measures:
+ - measure_id: value
+ label: External administrative annual amount
+ ordinal: 0
+ column: G
+ source_column_id: value
+ expected_column_header_row: 1
+ expected_column_header: value
+ concept: euromod_be.external_macrovalidation_amount
+ source_concept: jrc.euromod_be.external_validation_statistic
+ concept_relation: source_label
+ concept_authority: jrc
+ concept_evidence_url: https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf
+ concept_evidence_notes: >-
+ JRC Annex 3 Tables A3.2, A3.4, and A3.6 publish the 2022 External
+ annual amounts in millions on report pages 114, 118, and 125 (PDF
+ pages 116, 120, and 127). The source continuations on report pages 113,
+ 116, and 122-124 (PDF pages 115, 118, and 124-126) name RSZ/ONSS for
+ employment income, NBB for capital-income tax and both income-support
+ amount rows, NBB for child-benefit amounts, and RVA/ONEM for
+ unemployment-benefit amounts. These are administrative statistics
+ republished secondarily by JRC; the Annex source row names NBB, not
+ FAMIFED or a regional agency, for the child-benefit amount, and names
+ FPD/SFPD only for elderly-income-support recipient counts, not amounts.
+ The report's narrative on page 101 says
+ the employment-income comparator excludes substantial holiday pay,
+ performance-related bonuses, and meal vouchers included in EUROMOD,
+ and that the external capital-income-tax series is the broader advance
+ levy on movable property rather than capital income alone.
+ unit: eur
+ aggregation: sum
+ value_scale: 1000000
+ expected_cell_type: number
+- record_set_id: jrc.euromod_be.cy2023.macrovalidation.external_amounts
+ provenance_class: administrative
+ record_set_spec_id: jrc.euromod_be.macrovalidation.external_amounts.cy2023.v1
+ source_record_id_prefix: jrc.euromod_be.cy2023.macrovalidation.external_amounts
+ sheet_name: jrc_euromod_be_baseline_statistics_2025
+ period_type: calendar_year
+ period: 2023
+ geography_id: BE
+ geography_level: country
+ geography_name: Belgium
+ geography_vintage: current
+ entity: government
+ entity_role: validation_comparator
+ domain: euromod_be_macrovalidation
+ groupby_dimension: validation.metric_series
+ rows:
+ - value_id: a3_4_national_income_tax_external_2023
+ label: a3 4 national income tax external 2023
+ ordinal: 0
+ row_number: 3
+ expected_row_header_column: A
+ expected_row_header: a3_4_national_income_tax_external_2023
+ filters:
+ validation.metric: national_income_tax
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: national_income_tax
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ - value_id: a3_4_employee_sics_external_2023
+ label: a3 4 employee sics external 2023
+ ordinal: 1
+ row_number: 5
+ expected_row_header_column: A
+ expected_row_header: a3_4_employee_sics_external_2023
+ filters:
+ validation.metric: employee_social_insurance_contributions
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: employee_social_insurance_contributions
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ - value_id: a3_6_child_benefits_external_2023
+ label: a3 6 child benefits external 2023
+ ordinal: 2
+ row_number: 7
+ expected_row_header_column: A
+ expected_row_header: a3_6_child_benefits_external_2023
+ filters:
+ validation.metric: child_benefits
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: child_benefits
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ - value_id: a3_6_unemployment_benefits_external_2023
+ label: a3 6 unemployment benefits external 2023
+ ordinal: 3
+ row_number: 9
+ expected_row_header_column: A
+ expected_row_header: a3_6_unemployment_benefits_external_2023
+ filters:
+ validation.metric: unemployment_benefits
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: unemployment_benefits
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ - value_id: a3_2_employment_income_external_2023
+ label: A3.2 employment income external amount 2023
+ ordinal: 4
+ row_number: 39
+ expected_row_header_column: A
+ expected_row_header: a3_2_employment_income_external_2023
+ filters:
+ validation.metric: employment_income_yem
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: employment_income_yem
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ - value_id: a3_6_old_age_survivor_pension_external_2023
+ label: A3.6 old-age and survivor pension external amount 2023
+ ordinal: 5
+ row_number: 40
+ expected_row_header_column: A
+ expected_row_header: a3_6_old_age_survivor_pension_external_2023
+ filters:
+ validation.metric: old_age_survivor_pension_il_ext_poapsu
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: old_age_survivor_pension_il_ext_poapsu
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ - value_id: a3_6_income_support_external_2023
+ label: A3.6 income support external amount 2023
+ ordinal: 6
+ row_number: 41
+ expected_row_header_column: A
+ expected_row_header: a3_6_income_support_external_2023
+ filters:
+ validation.metric: income_support_bsa_s
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: income_support_bsa_s
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ - value_id: a3_6_income_support_elderly_external_2023
+ label: A3.6 income support for the elderly external amount 2023
+ ordinal: 7
+ row_number: 42
+ expected_row_header_column: A
+ expected_row_header: a3_6_income_support_elderly_external_2023
+ filters:
+ validation.metric: income_support_elderly_bsaoa_s
+ validation.series: external
+ constraints:
+ - variable: validation.metric
+ operator: ==
+ value: income_support_elderly_bsaoa_s
+ label: Validation metric
+ - variable: validation.series
+ operator: ==
+ value: external
+ label: Validation series
+ measures:
+ - measure_id: value
+ label: External administrative annual amount
+ ordinal: 0
+ column: G
+ source_column_id: value
+ expected_column_header_row: 1
+ expected_column_header: value
+ concept: euromod_be.external_macrovalidation_amount
+ source_concept: jrc.euromod_be.external_validation_statistic
+ concept_relation: source_label
+ concept_authority: jrc
+ concept_evidence_url: https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf
+ concept_evidence_notes: >-
+ JRC Annex 3 Tables A3.2, A3.4, and A3.6 publish the 2023 External annual
+ amounts in millions on report pages 114, 118, and 125-127 (PDF pages
+ 116, 120, and 127-129). The source continuations on report pages 113,
+ 116, and 122-124 (PDF pages 115, 118, and 124-126) name RSZ/ONSS for
+ employment income; NBB for national income tax, employee social
+ insurance contributions, child benefits, old-age plus survivor pensions,
+ and both income-support amount rows; and RVA/ONEM for unemployment
+ benefits. They name FPD/SFPD only for elderly-income-support recipient
+ counts, not amounts. These are administrative statistics republished
+ secondarily by JRC; the Annex names NBB, not FAMIFED or a regional
+ agency, for the child-benefit amount. The report's narrative on page 101
+ says the employment-income comparator excludes substantial holiday pay,
+ performance-related bonuses, and meal vouchers included in EUROMOD.
+ unit: eur
+ aggregation: sum
+ value_scale: 1000000
+ expected_cell_type: number
- record_set_id: jrc.euromod_be.cy2022.distribution.percent_values
provenance_class: model_output
record_set_spec_id: jrc.euromod_be.distribution.percent_values.v1
diff --git a/tests/test_belgium_targets.py b/tests/test_belgium_targets.py
index 11db8f72..ebac2a03 100644
--- a/tests/test_belgium_targets.py
+++ b/tests/test_belgium_targets.py
@@ -205,14 +205,26 @@ def test_belgium_euromod_comparator_has_source_urls_per_row():
)
facts = _facts(EUROMOD_BE_COMPARATOR_ALIAS, 2025)
- assert len(comparator_rows) == 18
- assert len(facts) == 18
+ assert len(comparator_rows) == 41
+ assert len(facts) == 41
assert {row["source_url"] for row in comparator_rows} == {
"https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf"
}
assert {fact.source.source_name for fact in facts} == {"jrc_euromod_be"}
assert {fact.geography.id for fact in facts} == {"BE"}
- assert {fact.measure.unit for fact in facts} == {"eur", "percent", "ratio"}
+ assert {fact.measure.unit for fact in facts} == {
+ "count",
+ "eur",
+ "percent",
+ "ratio",
+ }
+ assert sum(fact.provenance_class == "administrative" for fact in facts) == 25
+ assert sum(fact.provenance_class == "model_output" for fact in facts) == 14
+ assert sum(fact.provenance_class == "survey_aggregate" for fact in facts) == 2
+ survey_facts = [
+ fact for fact in facts if fact.provenance_class == "survey_aggregate"
+ ]
+ assert {fact.survey_instrument for fact in survey_facts} == {"EU-SILC"}
assert validate_facts(facts).valid
diff --git a/tests/test_chronicle_bundle.py b/tests/test_chronicle_bundle.py
index e6ce4768..8a69f79d 100644
--- a/tests/test_chronicle_bundle.py
+++ b/tests/test_chronicle_bundle.py
@@ -73,16 +73,16 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path):
"aggregate_duplicate_key_count": 0,
"entity_count": 11,
"error_count": 0,
- "fact_count": 155689,
+ "fact_count": 155790,
"geography_count": 12536,
"period_count": 191,
"semantic_duplicate_key_count": 12,
"skipped_source_count": 10,
"source_count": 41,
- "source_package_count": 134,
+ "source_package_count": 135,
"warning_count": 1,
}
- assert len(rows) == 155689
+ assert len(rows) == 155790
assert {row["provenance_class"] for row in rows} <= {
"administrative",
"census",
@@ -100,7 +100,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path):
)
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"] == 134
+ assert source_packages["source_package_count"] == 135
assert source_packages["skipped_source_count"] == 10
assert sorted(item["source"] for item in source_packages["skipped_sources"]) == [
"census-acs-s0101-congressional-district-age-2024",
@@ -114,7 +114,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path):
"jct-obbba-revenue-estimates-2025",
"jct-tax-expenditures-2024",
]
- assert coverage["fact_count"] == 155689
+ assert coverage["fact_count"] == 155790
assert coverage["counts"]["by_source"] == {
"bea": 445,
"bfp_economic_outlook": 5,
@@ -128,7 +128,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path):
"cms_nhe": 3,
"dft": 81,
"dwp": 6547,
- "eurostat": 108,
+ "eurostat": 186,
"federal_reserve": 1,
"hhs_acf_liheap": 2,
"hhs_acf_tanf": 110,
@@ -136,7 +136,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path):
"ici": 12,
"irs_soi": 40063,
"isc": 2,
- "jrc_euromod_be": 18,
+ "jrc_euromod_be": 41,
"kff": 52,
"mhclg": 2672,
"nbb_national_accounts": 1,
@@ -159,7 +159,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path):
"welshgov": 198,
}
table_counts = coverage["counts"]["by_source_table"]
- assert len(table_counts) == 129
+ assert len(table_counts) == 130
assert (
table_counts[
"dwp:Universal Credit childcare element statistics to August 2025, Table 1"
@@ -325,7 +325,14 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path):
table_counts[
"jrc_euromod_be:EUROMOD Country Report Belgium 2025 validation tables"
]
- == 18
+ == 41
+ )
+ assert (
+ table_counts[
+ "eurostat:Eurostat nasa_10_nf_tr Non-financial transactions - "
+ "annual data for Belgian households and NPISH"
+ ]
+ == 78
)
assert (
table_counts[
@@ -404,10 +411,10 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path):
"calendar_year:2018": 86,
"calendar_year:2019": 85,
"calendar_year:2020": 85,
- "calendar_year:2021": 3992,
- "calendar_year:2022": 1913,
- "calendar_year:2023": 6202,
- "calendar_year:2024": 33799,
+ "calendar_year:2021": 4000,
+ "calendar_year:2022": 1950,
+ "calendar_year:2023": 6232,
+ "calendar_year:2024": 33825,
"calendar_year:2025": 4446,
"calendar_year:2026": 241,
"calendar_year:2027": 220,
@@ -549,7 +556,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path):
"tax_year:2023": 48436,
"tax_year:2024": 40,
}
- assert coverage["counts"]["by_geography"]["country:BE"] == 67
+ assert coverage["counts"]["by_geography"]["country:BE"] == 168
assert coverage["counts"]["by_geography"]["country:DE"] == 36
assert coverage["counts"]["by_geography"]["country:FR"] == 36
assert coverage["counts"]["by_geography"]["nuts1:BE1"] == 6
@@ -569,11 +576,11 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path):
"dwelling": 12708,
"family": 107,
"firm": 1439,
- "government": 294,
- "household": 40435,
+ "government": 310,
+ "household": 40513,
"institutional_sector": 103,
"pension_plan": 2,
- "person": 60272,
+ "person": 60279,
"social_protection_scheme": 27,
"tax_unit": 40069,
}
@@ -730,6 +737,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path):
for source in (
"eurostat-gov-10a-taxag",
"eurostat-spr-exp-func",
+ "eurostat-nasa-10-nf-tr",
"eurostat-ilc-li02",
"eurostat-ilc-di01",
):
diff --git a/tests/test_etl_eurostat.py b/tests/test_etl_eurostat.py
index 5618269b..14d939ba 100644
--- a/tests/test_etl_eurostat.py
+++ b/tests/test_etl_eurostat.py
@@ -33,10 +33,16 @@
EUROSTAT_PACKAGES = {
"eurostat-gov-10a-taxag": ("gov_10a_taxag", 2024, 24, 24),
"eurostat-spr-exp-func": ("spr_exp_func", 2023, 27, 27),
+ "eurostat-nasa-10-nf-tr": ("nasa_10_nf_tr", 2024, 78, 84),
"eurostat-ilc-li02": ("ilc_li02", 2024, 3, 3),
"eurostat-ilc-di01": ("ilc_di01", 2024, 54, 54),
}
EUROSTAT_DATASET_IDS = {values[0] for values in EUROSTAT_PACKAGES.values()}
+NASA_10_NF_TR_ALIAS = "eurostat-nasa-10-nf-tr"
+NASA_10_NF_TR_YEAR = 2024
+NASA_10_NF_TR_SHA256 = (
+ "30d3f5bf3d1414c78633d13f505558b837b84e92c24b17050249ab19cec20a6d"
+)
EXPECTED_QUERY_FILTERS = {
"gov_10a_taxag": {
"freq": ["A"],
@@ -64,6 +70,31 @@
"geo": ["BE", "DE", "FR"],
"time": ["2023"],
},
+ "nasa_10_nf_tr": {
+ "freq": ["A"],
+ "unit": ["CP_MEUR"],
+ "sector": ["S14_S15"],
+ "na_item": [
+ "B2G",
+ "B3G",
+ "B3N",
+ "B6G",
+ "D1",
+ "D11",
+ "D12",
+ "D4",
+ "D41",
+ "D42",
+ "D44",
+ "D45",
+ "D5",
+ "D61",
+ "D62",
+ ],
+ "direct": ["RECV", "PAID"],
+ "geo": ["BE"],
+ "time": ["2022", "2023", "2024"],
+ },
"ilc_li02": {
"freq": ["A"],
"statinfo": ["MED_EI"],
@@ -95,6 +126,130 @@ def _package_outputs(alias: str):
return package, rows, cells, facts
+@lru_cache
+def _nasa_10_nf_tr_outputs():
+ return _package_outputs(NASA_10_NF_TR_ALIAS)
+
+
+def test_nasa_10_nf_tr_preserves_full_cube_and_selected_fact_lineage():
+ package, rows, cells, facts = _nasa_10_nf_tr_outputs()
+ package_report = validate_source_package(
+ NASA_10_NF_TR_ALIAS,
+ year=NASA_10_NF_TR_YEAR,
+ )
+ rows_by_key = {build_source_row_key(row): row for row in rows}
+
+ assert NASA_10_NF_TR_ALIAS in SOURCE_PACKAGE_ALIASES
+ assert package.artifact.parser == "json_stat_2_full_rows"
+ assert package_report.valid, package_report.to_dict()
+ assert package_report.counts == {
+ "record_set_count": 6,
+ "row_count": 78,
+ "measure_count": 6,
+ "source_record_count": 78,
+ "source_region_count": 6,
+ }
+ assert len(package.record_sets) == 6
+ assert len(rows) == 84
+ assert len(facts) == 78
+ assert validate_source_rows(rows).valid
+ assert validate_source_cells(cells).valid
+ assert validate_facts(facts).valid
+ contract_report = validate_consumer_fact_contract(facts)
+ assert contract_report.valid, contract_report.to_dict()
+
+ assert Counter((fact.period.type, fact.period.value) for fact in facts) == {
+ ("calendar_year", 2022): 26,
+ ("calendar_year", 2023): 26,
+ ("calendar_year", 2024): 26,
+ }
+ assert Counter(fact.filters["direct"] for fact in facts) == {
+ "PAID": 39,
+ "RECV": 39,
+ }
+ assert {fact.provenance_class for fact in facts} == {"administrative"}
+ assert {fact.survey_instrument for fact in facts} == {None}
+ assert {fact.entity.name for fact in facts} == {"household"}
+ assert {fact.entity.role for fact in facts} == {
+ "resident_households_and_npish"
+ }
+ assert {fact.measure.unit for fact in facts} == {"eur"}
+ assert {fact.measure.concept_relation for fact in facts} == {"exact"}
+ assert {fact.measure.concept_authority for fact in facts} == {"ledger-be"}
+ assert {fact.measure.concept for fact in facts} == {
+ "belgium_household_national_accounts_non_financial_transaction_amount"
+ }
+
+ groupby_value_ids = {fact.layout.groupby_value_id for fact in facts}
+ assert {
+ "belgium_household_mixed_income_gross",
+ "belgium_household_disposable_income_gross",
+ "belgium_household_interest_received",
+ "belgium_household_distributed_income_of_corporations_received",
+ "belgium_household_wages_and_salaries_received",
+ "belgium_household_current_taxes_on_income_paid",
+ "belgium_household_net_social_contributions_paid",
+ "belgium_household_social_benefits_received",
+ } <= groupby_value_ids
+
+ null_coordinates = {
+ (
+ row.values["direct"],
+ row.values["na_item"],
+ str(row.values["time"]),
+ )
+ for row in rows
+ if row.values["value"] is None
+ }
+ assert null_coordinates == {
+ (direction, item, str(year))
+ for direction, item in (("PAID", "D42"), ("RECV", "D5"))
+ for year in (2022, 2023, 2024)
+ }
+
+ assert len({fact.source_record_id for fact in facts}) == 78
+ for fact in facts:
+ assert len(fact.source_row_keys) == 1
+ assert len(fact.source_cell_keys) == 8
+ source_row = rows_by_key[fact.source_row_keys[0]]
+ assert source_row.values["value"] is not None
+ assert fact.value == source_row.values["value"] * 1_000_000
+ assert fact.filters["direct"] == source_row.values["direct"]
+ assert fact.filters["na_item"] == source_row.values["na_item"]
+ assert str(fact.period.value) == str(source_row.values["time"])
+ assert fact.source.source_sha256 == NASA_10_NF_TR_SHA256
+ assert NASA_10_NF_TR_SHA256 in fact.source.raw_r2_key
+ assert fact.source.raw_r2_uri == (
+ f"r2://{fact.source.raw_r2_bucket}/{fact.source.raw_r2_key}"
+ )
+
+ manifest_path = (
+ REPO_ROOT
+ / "db"
+ / "data"
+ / "eurostat"
+ / "nasa_10_nf_tr"
+ / "manifest.yaml"
+ )
+ manifest = yaml.safe_load(manifest_path.read_text())
+ file_spec = manifest["files"][NASA_10_NF_TR_YEAR]
+ artifact_path = manifest_path.parent / file_spec["filename"]
+ artifact_bytes = artifact_path.read_bytes()
+ expected_r2_key = (
+ "raw/eurostat/eurostat-nasa-10-nf-tr/2024/"
+ f"{NASA_10_NF_TR_SHA256}/nasa_10_nf_tr.json"
+ )
+
+ assert hashlib.sha256(artifact_bytes).hexdigest() == NASA_10_NF_TR_SHA256
+ assert len(artifact_bytes) == 5098
+ assert file_spec["sha256"] == NASA_10_NF_TR_SHA256
+ assert file_spec["size_bytes"] == 5098
+ assert file_spec["storage"]["r2"]["key"] == expected_r2_key
+ assert file_spec["storage"]["r2"]["uri"] == (
+ f"r2://ledger-raw/{expected_r2_key}"
+ )
+
+
def test_eurostat_aliases_and_packages_validate_end_to_end():
assert set(EUROSTAT_PACKAGES) <= set(SOURCE_PACKAGE_ALIASES)
@@ -133,6 +288,7 @@ def test_eurostat_packages_pass_full_agent_acceptance(alias, tmp_path):
def test_eurostat_facts_preserve_raw_cube_dimensions_and_scaling():
unit_mapping = {
"MIO_EUR": ("eur", 1_000_000),
+ "CP_MEUR": ("eur", 1_000_000),
"PC": ("percent", 1),
"EUR": ("eur", 1),
}
@@ -166,6 +322,7 @@ def test_eurostat_provenance_and_evaluation_only_boundary():
administrative_aliases = {
"eurostat-gov-10a-taxag",
"eurostat-spr-exp-func",
+ "eurostat-nasa-10-nf-tr",
}
survey_aliases = {"eurostat-ilc-li02", "eurostat-ilc-di01"}
@@ -247,6 +404,10 @@ def test_eurostat_production_surfaces_carry_no_fixture_identity():
def test_eurostat_artifacts_match_verified_live_dimension_shapes_and_labels():
expected_shapes = {
+ "nasa_10_nf_tr": (
+ ["freq", "unit", "direct", "na_item", "sector", "geo", "time"],
+ [1, 1, 2, 14, 1, 1, 3],
+ ),
"spr_exp_func": (
["freq", "spdeps", "spfunc", "unit", "geo", "time"],
[1, 1, 9, 1, 3, 1],