Part of #259 (populace-be epic).
What
Recalibrate the US release recipe to a Belgian target surface — as configuration of existing operators, not new code. The US recipe to port: bounded reweighting (start max_weight_ratio=50), capped weighted MAPE with sqrt-value weighting, warm start + target-frame checkpoints (#227), Adam on log-weights, L0 budget mode reserved for a small deliverable variant later.
Target surface (initial, via ledger-be target profiles)
All targets arrive as Ledger profile references (#160 pattern) — populace carries no values. Initial families:
- Demography: Statbel population by age band × sex × region; national age-band gate mirroring the US demographics.json +
base_population_scale posture
- Fiscal income by commune: Statbel fiscal statistics of income at municipality grain (the flagship open subnational series)
- Income tax aggregates: SPF Finances/Statbel PIT totals and bracket structure where published
- Social security: ONSS/RSZ employment and contribution aggregates
- Caseloads: unemployment (ONEM/RVA), pensions (SFPD), regional child benefit (post-2019 regionalization: caseloads per region)
- National accounts anchor: NBB household-sector income levels as validation-tier (not hard-calibrated) — apply the levels-sanity lesson from populace#212
Geography spine
- Commune (NIS code) as finest grain, carried as spine columns — one dataset, filter by geography; no per-area files (the standing architecture decision).
- Clone-and-assign pool over communes, generalizing the UK OA rowwise operators; collision avoidance between clones.
- Vintage-aware NIS codes: Belgian municipal mergers change the code set across years — every commune-grain target and assignment records its geography vintage, and mismatched vintages are a compile error, not a silent join (the populace#205 lesson).
Gating posture
National + NUTS1 targets hard-gate; commune rows start diagnostic-only (mirror the US congressional-district posture in populace#204) until the spine demonstrably supports them.
Acceptance
- Candidate build passes calibration, target_profile_coverage, base_population_scale, and demographics gates on the national + NUTS1 surface.
- Commune-grain diagnostics render per-target fit (worst-fit communes named).
- Recipe is entirely spec + profile references; zero BE Python.
Part of #259 (populace-be epic).
What
Recalibrate the US release recipe to a Belgian target surface — as configuration of existing operators, not new code. The US recipe to port: bounded reweighting (start
max_weight_ratio=50), capped weighted MAPE with sqrt-value weighting, warm start + target-frame checkpoints (#227), Adam on log-weights, L0 budget mode reserved for a small deliverable variant later.Target surface (initial, via ledger-be target profiles)
All targets arrive as Ledger profile references (#160 pattern) — populace carries no values. Initial families:
base_population_scalepostureGeography spine
Gating posture
National + NUTS1 targets hard-gate; commune rows start diagnostic-only (mirror the US congressional-district posture in populace#204) until the spine demonstrably supports them.
Acceptance