You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
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.
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.
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.
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).
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
RulesEngineprotocol, 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
Binding architecture constraints
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.packages/populace-frame/src/populace/frame/rules.py(RulesEngineprotocol); the Axiom adapter is the only module that imports the engine. Reference implementation:packages/populace-frame/src/populace/frame/adapters/policyengine_us.py.utils/hf_destinations.py+ AST-scan test). Public artifacts are aggregates only: manifests, calibration diagnostics, source coverage, reform validation.Phases
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)
Acceptance criteria
becountry toggle.