Skip to content

Add Ostbelgien Kindergeld 2025 source package - #389

Merged
MaxGhenis merged 11 commits into
mainfrom
be/b2e-ostbelgien-kindergeld
Oct 24, 2026
Merged

MaxGhenis merged 11 commits into
mainfrom
be/b2e-ostbelgien-kindergeld

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Stacked on #388 (itself on #387); merge after both. Adds packages/ostbelgien/kindergeld_2025, part of the Belgian transport port (ruling d048, B2e).

What it adds

35 facts from the article Kindergeld in Ostbelgien (update of 31.03.2026). The article's tables attribute them to the Ministerium der Deutschsprachigen Gemeinschaft ("Quelle: Ministerium der Deutschsprachigen Gemeinschaft").

Section Facts Coverage Article wording
Children, payees, protected/new amounts (text) 6 2025-12-01 to 2025-12-31 "im Dezember 2025"
Protected/new amount shares (text, printed %) 4 2025-12-01 to 2025-12-31 "im Dezember 2025"
Age table 4 no dates; label "2025" column "2025" only (ambiguity documented)
Supplements 5 2025-12-31 "zum Stand Ende Dezember 2025"
Birth and adoption premium payments (text) 2 2025-01-01 to 2025-12-31 "2025 wurde"
Expenditure table, EUR 14 2025-01-01 to 2025-12-31 "im Jahr 2025"
  • Every fact has curated-CSV lineage plus two pointers into db/data/ostbelgien/kindergeld_2025/kindergeld-in-ostbelgien.article.html:
    • source_locator: the sentence, or the table, row and column.
    • source_evidence: a verbatim quote from the capture. That is the sentence, or the table row's own <tr> HTML, which occurs exactly once.
  • The age-table total, the expenditure subtotals and the grand total are marked as totals. Supplement counts overlap and get no added total.
  • The geography is ostbelgien:deutschsprachige_gemeinschaft (statistical_scope, nis_2025). It is named as the article prints it and defined by its nine NIS 2025 communes.
  • The only shared-code change is one alias line in chronicle/source_package.py.

Choices for review

  • Dates only where stated. Every fact keeps the coarse identity calendar_year:2025. period_coverage gives start and end dates only where the article states the span, and its notes quote that phrase.
    • The age table states no span, so it has the label and no dates. Its total matches the December count, but the article doesn't say whether it is an annual count or a December distribution.
    • The payee total comes from "Die 15.533 Kinder … verteilen sich auf 8.302 Empfänger", which refers back to the December child count.
  • Entities.
    • Children and payees are person / benefit_recipient.
    • Premium payment counts ("700 … einmal ausgezahlt") are benefit_unit / premium_payment. That records the activity under the receiving unit, as scotgov/bus_coach_statistics_2024_25 counts passenger journeys under person / bus_passenger.
    • Spending is government / payer.
  • Printed shares. These are kept as published facts, following the facts-only ADR and dwp/hbai_summary_fye2025. None is recomputed.
  • Capture and reuse.
    • The site's Impressum states no data licence.
    • The capture is a 9.8 KB sanitized browser transcription of the article. Plain clients get a Cloudflare challenge, which was not bypassed.
    • It is committed as evidence, as other packages commit publisher HTML, for example db/data/kff/marketplace_effectuated_enrollment. Attribution is in the README and manifest.
  • R2. Both files are stored in ledger-raw under their manifest keys and were verified by SHA-256 readback on 2026-10-24: the CSV, regenerated at 82487a9 with a new hash, and the capture.

Review history

  • b658e93, GPT-6.1 Sol: REQUEST CHANGES. ledger-source-fidelity failed; ledger-boundary passed. All 35 values matched an independent parse. 82487a9 fixes the three findings:
    • exact dates the article doesn't state;
    • table locators that were not verbatim quotations;
    • an unsupported department name.

Stacking and rebase

Rebased from 200bf6d onto #388's head 099a4c1. git range-diff shows the two package commits unchanged apart from alias-registry context. Every file is byte-identical to 82487a9 except the registry, which differs by exactly this PR's alias line. #387, #388 and this PR merge as merge commits, in that order, each at its tested head. Until they merge, this PR's diff on GitHub also shows their commits.

Verification (at 82487a9)

🤖 Generated with Claude Code

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Independent review at 82487a9 (GPT-6.1 Sol, Subfleet run 20261024-011223-chronicle389-review-r2): APPROVE. ledger-source-fidelity: PASS. ledger-boundary: PASS.

The three findings from the b658e93 review are resolved:

  • Dates: only spans the article states. December covers the month; the age table is undated.
  • Evidence: 35/35 source_evidence strings occur verbatim in the capture. All 23 table fragments occur exactly once, with cells equal to [row label, printed value].
  • Publisher: attribution follows the tables' "Quelle:" line.

Still to do before merge: the tests/test_chronicle_bundle.py pins, applied after #385, #387 and #388 land, and a review of that delta.

MaxGhenis and others added 11 commits October 24, 2026 04:16
Preserve all 565 commune rates printed in FPS Finance's assessment-year 2026
PDF, with exact page, column-block and text-line locators and a bijective
mapping to Statbel's NIS 2025 communes (558 exact, 7 orthographic).

Key the facts as tax_year 2025, the income year these rates tax, with
income_year == 2025 and assessment_year == 2026 constraints evidenced by
source-row columns and the legal vintage income_year_2025_assessment_year_2026,
as in statbel/fiscal_income_distribution_2023. The printed assessment-year
label is kept verbatim. The CSV and PDF are in R2 ledger-raw, verified by
SHA-256 readback.

Co-Authored-By: GPT-6.1 Sol <noreply@openai.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Address the review of 875dea6:
- Each fact's geography name is now the commune name SPF prints, as the
  harness requires of every publisher (chronicle#266). Nine differ from
  Statbel's (Bruxelles/Brussels, Waimes/Weismes and seven spelling or
  punctuation variants); the mapping audit keeps Statbel's name beside
  each, and the bundle reports them as cross-package name warnings.
- Drop the per-row publisher_commune filter and constraint and its
  dimension label. The NIS code identifies the commune, so a spelling no
  longer changes aggregate or semantic fact keys. The printed label stays
  in the CSV, the source-row id and a guard cell.

The regenerated CSV is in R2 ledger-raw under its new hash, verified by
SHA-256 readback.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
For all 565 facts, respell the commune wherever the fact carries it
(geography name, filter and constraint values) as Statbel's name and
casefolded, uppercased and accent- and punctuation-stripped forms; both
aggregate and semantic keys must not change. Moving a fact to another
NIS code must change both. The respelling fails on the 875dea6 shape,
where the printed name was a filter and constraint.

Hypothesis is not a Chronicle dependency, and adding one is a shared
dependency change, so the property is checked exhaustively over the
package's facts and a fixed set of respellings instead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The package adds 565 government facts at tax_year:2025, one per existing
commune key, so geography_count is unchanged and commune:11002 goes from
9 to 10. It adds one source, one source table and one built package.
SPF spells nine communes unlike Statbel, and the package keeps SPF's
wording, so nine commune geography-name warnings are added (123 -> 132).

The deltas were measured with Chronicle's own bundle functions. A replay
of the full bundle test against #385's CI bundle, with #386's seven
skipped county packages and this package added, passes, and main's
unchanged test fails against it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
rsz-employment-daily-wage-class-2023-2026 (34,629 facts): RSZ quarterly
labour market analysis, T17 (daily-wage class x age x sex, 2023Q1-2026Q1;
2023 from the 2023-2024 workbook, 2024 onward from the 2024-2026 workbook)
and T7 (status x sex x NACE 2025 x daily-wage class, 2024Q1-2026Q1). Jobs
and deduplicated workers are quarter-end stocks; FTE covers the whole
quarter. Values are recorded at the publisher's displayed precision;
SUBTOTAL formula rows are excluded and tested against the details.

rsz-annual-wages-key-figures-2020-2025 (252 facts): the Kerncijfers sheet
of the October 2026 pre-publication workbook, in the published thousands
of EUR and hours, including its 36 typed total cells.

Both are CC BY 4.0 with captured licence and methodology pages. All raw
files are in R2 ledger-raw, verified by SHA-256 readback.

Co-Authored-By: GPT-6.1 Sol <noreply@openai.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ntract

The per-fact annual test passed consumer_fact_rows() dicts to
validate_consumer_fact_contract(), which takes AggregateFact objects, so it
raised AttributeError before any per-fact assertion ran. Validate the facts
and check the exported rows' lineage and R2 keys separately.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
T7 prints Man-homme/Vrouw-femme through 2025Q3 and Man-Homme/Vrouw-Femme
from 2025Q4; T17 always prints the capitalized forms. Keeping both as
values split every T7 series at 2025Q4, so a consumer selecting
Man-Homme silently lost 2024-2025Q3. Map each to one value, as the
package already does for Onbekend-Inconnu; the printed form stays in
every source locator, and any other sex label stops the build. Tests
check both printed cases occur and that each sex is a single value.

The regenerated CSV is in R2 ledger-raw under its new hash, verified by
SHA-256 readback.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ages

The two packages add 34,881 person facts at country:BE: 34,629 quarterly
daily-wage-class cells from 2023 Q1 to 2026 Q1, and 252 annual key
figures for 2020-2025. They add two sources, two source tables and two
built packages. They add no new geography, period or entity key and no
warning.

This stacks on #387's pins. The deltas were measured with Chronicle's
own bundle functions and confirmed against #388's CI bundle on the old
base. A replay of the full bundle test against #385's CI bundle, with
#386's skipped packages, #387's package and these two packages added,
passes, and #387's test fails against it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Record 35 figures from the German-speaking Community's "Kindergeld in
Ostbelgien" article (update of 31.03.2026): December 2025 child and payee
stocks, the four published protected/new-amount shares, the age table,
supplement counts, 2025 birth and adoption premium payments, and the 2025
family-benefit expenditure table. Each fact carries a sentence or table-cell
locator into a sanitized browser capture of the article; tests parse that
capture independently of the generator. The scope is the nine-commune
German-speaking Community, named as the article prints it.

Co-Authored-By: GPT-6.1 Sol <noreply@openai.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review of b658e93 found three gaps.

Dates. "im Dezember 2025" is a month, so December facts now cover
2025-12-01..12-31 rather than 31 December. The supplements keep
31 December ("zum Stand Ende Dezember 2025"). Premiums and expenditure
keep the full year ("im Jahr 2025"). The age table is labelled only
"2025", so its coverage now carries that label and no dates, with the
ambiguity in its notes. Each coverage note quotes the phrase it rests on.

Evidence. Table locators were built strings, not quotations. A new
source_evidence column holds the capture verbatim: the sentence, or the
row's own <tr> HTML. The generator requires exactly one matching row,
and the field is guarded in the package YAML. Tests check that every
fragment occurs in the capture and that its cells are exactly the row
label and the printed value.

Publisher. Uses the tables' own "Quelle: Ministerium der
Deutschsprachigen Gemeinschaft" in place of an unsupported department
name. A test pins that line in the capture.

The README now cites the passenger-journey precedent
(scotgov/bus_coach_statistics_2024_25) for counting premium payments
under the receiving unit. The regenerated CSV is in R2 ledger-raw under
its new hash, verified by SHA-256 readback.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The package adds 35 calendar-2025 facts: 19 person, 2 benefit_unit
premium payments and 14 government expenditure. It adds one
statistical_scope geography, the German-speaking Community, plus one
source, one source table and one built package. It adds no warning.

This stacks on #388's pins. The deltas were measured with Chronicle's
own bundle functions and confirmed against #389's CI bundle on the old
base. A replay of the full bundle test against #385's CI bundle, with
#386's skipped packages and #387's, #388's and this package added,
passes, and #388's test fails against it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Delta review at 8bd0af5 (GPT-6.1 Sol, Subfleet run 20261024-042211-chronicle389-review-r3): APPROVE, no findings. ledger-source-fidelity: PASS. ledger-boundary: PASS.

  • Rebase onto Add RSZ/ONSS employment by daily-wage class and annual wage key figures #388's head 099a4c1: only alias-hunk context changed. Every other file is byte-identical to the approved 82487a9, and the shared-code diff is exactly the Ostbelgien alias.
  • Bundle pins (8bd0af5): derived independently, and every changed pin matches. +35 facts, calendar_year:2025 +35, benefit_unit +2, government +14, person +19, geography count 102,615 → 102,616 (statistical_scope:ostbelgien:deutschsprachige_gemeinschaft = 35), +1 source, +1 table and +1 package. Warning and duplicate counts are unchanged; the six ostbelgien.* dimensions can't conflict with Opgroeien's.
  • Earlier reviews: b658e93 REQUEST CHANGES, fixed in 82487a9; 82487a9 APPROVE.

This merges as a merge commit after #387 and #388, at 8bd0af5, once CI passes.

@MaxGhenis
MaxGhenis merged commit 66114a6 into main Oct 24, 2026
3 checks passed
@MaxGhenis
MaxGhenis deleted the be/b2e-ostbelgien-kindergeld branch October 24, 2026 11:20
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