Author SFPD, Groeipakket, and BFP Belgian source packages (ledger#69)#82
Merged
Conversation
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Completes the Belgian source-package set for ledger#69. PR #72 already landed the
six binding-selector streams (Statbel population + fiscal income, SPF Finances,
ONSS, ONEM/RVA, NBB) plus the EUROMOD-BE comparator and the NIS-2025 crosswalk.
This PR adds the three remaining publisher streams the issue body lists but that
were still missing, authored from primary government/statistical publishers only:
sfpd-legal-pension-caseload-2025) — 4 facts.Federal Pensions Service (SFP/SFPD) figures via PensionStat.be, January 2025:
all-schemes total 2,674,520 plus employee / self-employed / civil-servant counts.
opgroeien-groeipakket-caseload-2025) —11 facts. Per-component child and family caseloads published by Opgroeien (the
Flemish agency that administers the Groeipakket).
bfp-economic-outlook-2026-06) — 5 facts,all typed
assertion: source_projection. Headline projections from the FederalPlanning Bureau's 12 June 2026 outlook (real GDP growth, CPI inflation, general
government deficit as a share of GDP, for 2026 and 2031).
Each package is a
source_package.yaml+ declarative manifest + curated CSV underpackages/anddb/data/, with SHA-256-pinned artifacts and full lineage. Allthree pass
ledger validate-packageandvalidate_facts; new regression tests intests/test_belgium_targets.pyassert the exact published values.Validation
uv run ledger validate-package <id> --year <Y>—"valid": true, zero errors,for all three new packages (and all six pre-existing binding streams re-verified).
uv run pytest tests/test_belgium_targets.py— 11 passed (7 existing + 4 new).uv run pytest tests/test_ledger_source_package.py— passed.uv run ledger --db ... load all— exit 0 with the new packages present.uv run ruff check ledger db tests— clean.tests/test_ledger_bundle.pybundle-coverage counts updated to the realend-to-end build numbers (fact_count 38939 -> 38959; source_count 25 -> 28;
source_package_count 54 -> 57; period_count 13 -> 14; by_source_table 49 -> 52).
Data integrity — gaps recorded, never estimated
Every fact value traces verbatim to a published cell. Figures the publisher gives
only in rounded or paywalled form are recorded as gaps in the manifest notes, not
encoded as facts:
(rounded lower bound) -> omitted from the child record set; the exact basisbedrag
family count (930,010) is published and retained.
exact figure or reference year on the source page -> recorded as a gap.
2026 and "nearly 230 000" over 2027-2031 (explicitly rounded), and the per-year GDP
path is not on the press page -> recorded as gaps pending extraction from the full
report PDF.
Faithful representation note: the SFPD scheme counts sum to more than the
all-schemes total because mixed-career pensioners are counted in each scheme they
draw from; the scheme rows are per-scheme recipient counts, not a partition. This is
documented in the package and asserted in the tests.
Two items for reviewer / lead attention
EUROMOD-BE comparator kept (open PR Remove EUROMOD comparator facts from Belgium targets #80 conflicts with this issue). PR Remove EUROMOD comparator facts from Belgium targets #80
("Remove EUROMOD comparator facts from Belgium targets") is currently open and
unmerged. Removing that package would break
test_belgium_targets.py:: test_belgium_euromod_comparator_has_source_urls_per_rowandtest_ledger_bundle.py(both currently green on main), and would violate issue Author ledger-be source packages for open Belgian aggregates with geography vintages #69 acceptance criterion Harden Arch target semantics for Microplex eCPS replacement #4,
which requires the EUROMOD-BE comparator package to exist (feeding populace#264's
reform_validation.json). Under the README/AGENTS.md boundary ("everything apublisher asserted is a fact"), JRC is the publisher of the EUROMOD-BE Country
Report and the rows are typed
entity_role: validation_comparator, nevercalibration targets. This PR therefore keeps the comparator and does not touch PR
Remove EUROMOD comparator facts from Belgium targets #80's branch. Recommend closing Remove EUROMOD comparator facts from Belgium targets #80 as contradicting the issue's own acceptance
criteria, but that is the lead's call.
Alias-registry edit. Registering the three packages required adding aliases to
SOURCE_PACKAGE_ALIASESinledger/source_package.py. That exact file is not inthe
ledger-source-ingestorallowed_pathslist, though the edit is intrinsic toadding a source package (PR Add Belgium target source packages #72 did the same). Flagging for the human/judge review.
Refs #69. Unblocks #70 and populace #263/#264.