Skip to content

Author SFPD, Groeipakket, and BFP Belgian source packages (ledger#69)#82

Merged
MaxGhenis merged 7 commits into
mainfrom
be-source-packages
Jul 5, 2026
Merged

Author SFPD, Groeipakket, and BFP Belgian source packages (ledger#69)#82
MaxGhenis merged 7 commits into
mainfrom
be-source-packages

Conversation

@MaxGhenis

Copy link
Copy Markdown
Contributor

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 (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 (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 June 2026 (bfp-economic-outlook-2026-06) — 5 facts,
    all typed assertion: source_projection. Headline projections from the Federal
    Planning 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 under
packages/ and db/data/, with SHA-256-pinned artifacts and full lineage. All
three pass ledger validate-package and validate_facts; new regression tests in
tests/test_belgium_targets.py assert 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.py bundle-coverage counts updated to the real
    end-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:

  • Groeipakket basisbedrag child count: published only as ">1.6 million"
    (rounded lower bound) -> omitted from the child record set; the exact basisbedrag
    family count (930,010) is published and retained.
  • SFPD pension expenditure: published only as a rounded "69 billion EUR" with no
    exact figure or reference year on the source page -> recorded as a gap.
  • BFP employment and 2027-2030 GDP path: the page states "around 20 000" jobs in
    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

  1. 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_row and test_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 a
    publisher asserted is a fact"), JRC is the publisher of the EUROMOD-BE Country
    Report and the rows are typed entity_role: validation_comparator, never
    calibration 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.

  2. Alias-registry edit. Registering the three packages required adding aliases to
    SOURCE_PACKAGE_ALIASES in ledger/source_package.py. That exact file is not in
    the ledger-source-ingestor allowed_paths list, though the edit is intrinsic to
    adding 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.

@MaxGhenis MaxGhenis merged commit 1eb74cf into main Jul 5, 2026
2 checks passed
@MaxGhenis MaxGhenis deleted the be-source-packages branch July 5, 2026 03:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant