Skip to content

EPIC: populace-be — Belgium as the first Axiom-engine country #259

Description

@MaxGhenis

Goal

Ship a working Belgian tax-benefit model — "policyengine-be" as a product outcome — composed as Axiom rules × populace data, with no policyengine-be country package. Belgium is the first country built on the Axiom engine through the Frame RulesEngine protocol, and the first country expressed entirely as declarative specs. The build recalibrates the proven US release recipe to Belgian sources and targets.

Why Belgium first

  • Rule encodings for Belgium are starting on the Axiom side; the populace half can be scoped to the encoded slice and grow with coverage.
  • Belgium publishes unusually good open calibration aggregates, including fiscal income statistics at the municipality level (Statbel), social-security aggregates (ONSS/RSZ), and caseload series — a strong target surface without licence friction.
  • The base microdata (BE-SILC) is licence-restricted the same way the UK FRS is, so the private-artifact + public-diagnostics machinery transfers wholesale.
  • EUROMOD-BE (open access) and Federal Planning Bureau published costings provide external validation oracles, replacing the self-parity gate that first-party countries used.

Binding architecture constraints

  1. Spec-first (greenfield consumer of Move country build choices into declarative specs #159 and Consume Ledger target profiles instead of carrying target values in Populace #160). No be_runtime/ Python. Country content = spec files + Ledger source packages/target profiles. Anything code-shaped becomes a general, parameterized, tested operator in the core packages — never country Python.
  2. Rules only via the adapter. All engine access goes through packages/populace-frame/src/populace/frame/rules.py (RulesEngine protocol); the Axiom adapter is the only module that imports the engine. Reference implementation: packages/populace-frame/src/populace/frame/adapters/policyengine_us.py.
  3. Licence posture. BE-SILC microdata never leaves a private HF repo; destination guards land before any upload code (mirror policyengine-uk-data utils/hf_destinations.py + AST-scan test). Public artifacts are aggregates only: manifests, calibration diagnostics, source coverage, reform validation.
  4. Naming. data_build_id convention (builder + build sha + date); no ordinal versioning.

Phases

  • Phase 0 — scope. Confirm the Axiom BE coverage slice (assume PIT + social contributions first); confirm SILC access path and institutional holder; inventory targets.
  • Phase 1 — foundations. ledger-be source packages + target profiles; spec schema v0 with BE as first consumer; Axiom RulesEngine adapter (both sides).
  • Phase 2 — build. SILC → Frame source stage under the licensed environment; clone-and-assign geography spine (commune NIS codes, vintage-aware); calibration to the Belgian surface with the US recipe.
  • Phase 3 — prove and ship. EUROMOD-BE/BFP validation; release channel; dashboard country toggle.

Children

Foundations (phase 1)

Build (phase 2)

Prove and ship (phase 3)

Dependency notes: #263 depends on #260, #261, #262, ledger#70. #264 depends on #260 (reform materialization decision) and #263. #265 depends on #263. calibration-diagnostics#62 depends on #265. ledger#70 depends on ledger#69 and ledger#71 (projection-basis targets).

Out of scope (follow-ups)

  • policyengine.py registration for BE (requires Axiom-engine support in the .py stack; separate epic once the artifact exists).
  • Firm/enterprise population for BE (the UK firm module pattern generalizes later).
  • A public synthetic BE artifact (requires the disclosure criteria from DESIGN.md).

Acceptance criteria

  • A populace_be release (private artifact) passes the full release contract: calibration, target_profile_coverage, base_population_scale, demographics-vs-Statbel gates, with reform validation against named external oracles on the encoded slice.
  • Public diagnostics render in calibration-diagnostics under a be country toggle.
  • The BE country folder contains zero Python.
  • The Axiom adapter passes the same behavioral contract tests the policyengine-us adapter passes (where semantics overlap).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions