Skip to content

Belgium enters the Scorecard: JRC EUROMOD-BE country-report claims (third country) - #82

Merged
MaxGhenis merged 6 commits into
mainfrom
be/jrc-country-report
Aug 21, 2026
Merged

Belgium enters the Scorecard: JRC EUROMOD-BE country-report claims (third country)#82
MaxGhenis merged 6 commits into
mainfrom
be/jrc-country-report

Conversation

@MaxGhenis

Copy link
Copy Markdown
Contributor

Belgium becomes the Scorecard's third country: the JRC's published EUROMOD-Belgium country-report validation values enter as external-model claims, with the doctrine applied end to end. Held for Max's merge (ahead of Monday's CAPE/BEAMM meeting in Brussels, where this is a talking point either way).

What

  • Six model claims staged from the country report's validation tables (Y15_CR_BE_final.pdf, vendored from Chronicle's jrc-euromod-be-baseline-statistics-2025 package with commit + sha provenance): A3.4 national income tax (€77.531B) and employee SICs (€28.861B) for CY2023; A3.6 child benefits (€7.454B) and unemployment benefits (€11.706B) for CY2023; A3.7 Gini (0.2228) and A3.8 AROP-60 (0.1123) for CY2022. benchmark_class=different_model, calibration_relationship=held_out, per-year EUROMOD baselines registered; EUR canonicalization; semantic pins on income concept, equivalisation, poverty line, scopes. Note: the pinned source holds 6 euromod-series rows (18 data rows = 6 euromod / 6 external / 6 ratio) — the lane brief's "8" was a miscount, corrected against the artifact rather than padded.
  • Boundary rule enforced: the six external statistical cells route ONLY to data/ledger/be_admin_outturns.jsonl as administrative facts — none enters external_scores. The six ratio rows are dispositioned, and the adapter proves each equals the rounded euromod/external quotient (drift fails the build).
  • Two honesty-first attachments, both concept_mismatch: national income tax vs our worker PIT €23.285B and employee SICs vs Article-38-before-reductions €20.874B, computed from the microcosm-be v0.2 demo-grade rebuild (rulespec-be @ 7c85808, results vendored with shas). Each carries the verbatim demo-grade banner and names all three gaps: period (CY2026 vs CY2023), population basis (US survey support reweighted to Belgian administrative targets vs SILC), scope (worker slice vs national). The app renders them as not comparable — no divergence/ratio is shown. The SIC mapping uses before-reductions because J2.0+ defines tscee_s before the separately-subtracted work-bonus reduction. Child benefits, unemployment, Gini, AROP stay claims-only — nothing available matches them honestly.
  • App: country toggle gains BE; header reads "PolicyEngine scorecard vs JRC EUROMOD-BE"; main tabs state plainly that six claims exist and no plain-comparable cells do; Mission control shows the lane; Reform validation shows exactly the two annotated rows.
  • Equivalisation verified at review: the lane pinned modified_oecd from EUROMOD/Eurostat convention and labeled the inference honestly; the reviewer checked the report itself — p. 104 states HDI is equivalised by the "modified OECD" scale for the A3.7/A3.8 section — and upgraded the note + its test pin (second commit).

Verification (lane + independent reviewer re-run)

  • Full suite: 257 passed, 2 skipped (CI-style uv run --with pytest, PYTHONPATH=.), no post-run git drift.
  • Two-build determinism: content hashes equal on both builds, reviewer-reproduced; DB stays derived and untracked (post-The database leaves git: derived artifact, built in CI, published to Supabase storage #74).
  • Ruff format (be added to CI scope), app: bun tests, oxlint, tsc + production build.
  • Lane feed freshness made monotonic (an older independently-pinned sync can no longer regress the top-level date).

Open question for Max

The six Ledger-routed external facts currently live as a Scorecard-side artifact (data/ledger/be_admin_outturns.jsonl). Promote them into Chronicle proper as a follow-up, or keep Scorecard-side routing as the handoff boundary? (Chronicle already holds the source CSV; this is about the routed per-fact form.)

Built by gpt-5.6-sol (detached lane, sandbox, no network); reviewed, re-run, evidence-upgraded, and pushed by fable. Merge is Max's.

Stage six pinned model claims, route six statistical facts to Ledger, disposition six derived ratios, and attach two demo Axiom values as concept mismatches. Register Belgium worlds, add the BE app dimension, and keep the derived build deterministic.
… 104

Reviewer upgrade of Lane E's honestly-labeled convention inference: Y15_CR_BE_final.pdf
p. 104 states HDI is equivalised by the 'modified OECD' scale for the A3.7/A3.8 section.
Note text, its test pin, and the regenerated Ledger routing artifact updated together.
@MaxGhenis
MaxGhenis force-pushed the be/jrc-country-report branch from 9c78f5c to 00066a9 Compare August 21, 2026 11:59
Four blockers plus one MAJOR and one MINOR from the adversarial review of
PR #82, each independently re-verified against Y15_CR_BE_final.pdf before
fixing:

- Model release: the report derives results with EUROMOD J1.0+ (front
  matter, p. 3) — 2025 is only the report vintage. SOURCE_MODEL, the
  closed canon, README, baselines, and test pins now say J1.0+.
- Income-year identity: periods are policy-system/output years simulated
  from database BE_2022_c1 (EU-SILC 2022 collection, income reference
  year 2021 — Table 3.1, p. 97) with monetary uprating; the false
  'matching income-reference year' assertions are gone and the input
  database is pinned as a claim condition.
- Unemployment benefits: Table A3.6 marks bun Simulated=N (p. 127) and
  bun_be is off in the baseline (p. 24); its 'EUROMOD' column is the SILC
  income-year-2021 base 10,416 uprated to 11,706. Reclassified from a
  model claim to a Ledger-routed non-simulated survey input with that
  provenance pinned. Claims 6 -> 5; Ledger facts 6 -> 7.
- Population frame: every model claim now carries
  population_frame=private_households (Table 3.1 coverage, p. 97) so the
  modeled SILC universe is never presented as an unqualified national
  scope.
- Underlying issuers preserved on every Ledger fact (NBB / RVA / EU-SILC,
  read from the report's own source table pp. 120-126 and the p. 104
  narrative); JRC stays the secondary publisher.
- App: comparability suppression extracted to a tested pure helper
  (comparabilityFigure) used by both render sites.

Claim ids recomputed (conditions are identity); populations feed and app
copy regenerated through the exporter; full suite 259 passed; two-build
determinism holds at the new content hash.
…d identity for the survey fact

- Lane detail, both lane feeds, and the app overview now state 5 model
  claims / 7 Ledger facts (6 statistical + 1 non-simulated uprated EU-SILC
  survey input) / 6 dispositioned ratios; a new test pins the persisted
  lane detail so a semantically stale generator cannot ride the byte gate.
- The survey fact carries one period identity: period_semantics =
  simulation_year_of_uprated_survey_input and conditions key the year as
  simulation_year (registered axis), not reference_year.
- underlying_issuer normalized to exactly EU-SILC; the uprated-survey-input
  characterization stays in routing/provenance.
- countryOf() gets its JSDoc back; comparabilityFigure keeps its own.
stage_all docstring 6/6/6 -> 5/7/6; README 'other four' -> 'other three';
the persisted-lane test now asserts the exact detail string (sol's mutation
probe showed the partial pin let a 99-derived-ratios mutation pass).
@MaxGhenis
MaxGhenis merged commit d5a6653 into main Aug 21, 2026
3 checks passed
vahid-ahmadi pushed a commit that referenced this pull request Aug 22, 2026
data/lanes.json and its app/public mirror are DERIVED feeds and both sides
appended a lane, so the textual conflict is not a real one — regenerated
from a build rather than hand-merged. 33 lanes now, including the BE
country-report lane from #82 alongside this branch's UK
reform-validation lane.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016HuXJFVme8HRbnke2Ey3Me
vahid-ahmadi pushed a commit that referenced this pull request Aug 22, 2026
data/lanes.json and its app/public mirror are DERIVED feeds and both
sides appended a lane, so the textual conflict is not a real one —
regenerated from a build rather than hand-merged. 33 lanes now,
including the BE country-report lane from #82 alongside this branch's
HMT distributional lane.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016HuXJFVme8HRbnke2Ey3Me
vahid-ahmadi pushed a commit that referenced this pull request Aug 22, 2026
data/lanes.json and its app/public mirror are DERIVED feeds and both
sides appended a lane, so the textual conflict is not a real one —
regenerated from a build rather than hand-merged. 33 lanes now,
including the BE country-report lane from #82 alongside this branch's
divergence-decomposition lane.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016HuXJFVme8HRbnke2Ey3Me
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