Skip to content

Count HBAI dependent children in relative poverty on the two-child limit page (#1398) - #1724

Merged
MaxGhenis merged 8 commits into
mainfrom
vahid-ahmadi/issue-1398-child-poverty-validation
Oct 24, 2026
Merged

MaxGhenis merged 8 commits into
mainfrom
vahid-ahmadi/issue-1398-child-poverty-validation

Conversation

@vahid-ahmadi

@vahid-ahmadi vahid-ahmadi commented May 27, 2026 •

Copy link
Copy Markdown
Collaborator

Corrects the two-child limit child poverty validation page (docs/book/validation/child-poverty-tcl.md), written for #1398.

The page itself is already on main: it shipped in #2386 (merged 21 October 2026), and its original .added changelog entry was released in 2.143.0. This branch has merged main, dropped the released fragment and now carries only corrections to main's copy of the page.

What this PR changes

  • The page now counts HBAI dependent children (is_hbai_dependent_child) in relative low income, to match the DWP and Resolution Foundation benchmarks it compares against. Main's copy counted children (is_child) in absolute low income (in_poverty_ahc).
  • Re-run for FY 2029-30 on policyengine-uk 2.148.3 with the certified Microcosm UK 2024-25 national release (microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71), removing the two-child limit lifts about 548,000 children out of relative poverty after housing costs and about 460,000 before housing costs, at a cost of £3.21bn. That is above DWP's 450,000 AHC and 300,000 BHC and RF's 480,000; the page previously said PolicyEngine sat between them.
  • Version sensitivity: on the same data file, the AHC figure is 445,000 on policyengine-uk 2.132.6, 589,000 on 2.147.2 to 2.148.1 and 548,000 on 2.148.3.
  • Absolute-measure figures are given separately with a caveat on the FYE 2011 and FYE 2025 absolute lines, and earlier figures stay in the text labelled as absolute-measure runs.
  • Smaller fixes: why the cost is positive (gov_balance), how take-up is drawn for newly entitled families, and the date, subtitle and forecast vintages of the RF report.

The claim-by-claim review, with sources, is in the "Ready for hub review" comment on this PR.

  • Changelog fragment: changelog.d/1398-child-poverty-tcl-page-corrections.changed.md (changed).
  • Docs and changelog only; no code changes.

🤖 Generated with Claude Code

@vahid-ahmadi
vahid-ahmadi force-pushed the vahid-ahmadi/issue-1398-child-poverty-validation branch from 9f7ecf6 to da29070 Compare October 8, 2026 14:50
vahid-ahmadi added a commit that referenced this pull request Oct 8, 2026
Name the test that runs the fixtures (microsimulation/test_reform_impacts.py, gov_balance in 2029, default tolerance 1bn), fix the fixture count to eight, describe update_reform_impacts.py correctly, link #1724 instead of a page that is not on main, and add why the Microcosm move makes the history useful. Type the changelog fragment.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vahid-ahmadi and others added 2 commits October 12, 2026 11:02
Run the validation #1398 asked for. PolicyEngine UK estimates:

- AHC: ~501,000 children lifted from poverty (2029-30)
- BHC: ~415,000 children lifted (2029-30)
- Treasury cost: £3.40 bn

Against external benchmarks:

- OBR EFO November 2025 Table 3.2: 450,000 children lifted, £3.0 bn
- Resolution Foundation "No half measures": 480,000 children lifted,
  £3.5 bn

PolicyEngine's estimate sits between the two — slightly above OBR and
RF on headcount, between them on fiscal cost. The agreement is well
within the noise we'd expect from differences in nowcasting and
take-up assumptions.

Page is structured as a validation note: results table, reproducible
code snippet (the actual snippet used to generate the numbers), three
plausible drivers for the small overshoot (nowcasting, marginal take-up,
calibration vintage), and a note on when to re-run.

Notable mechanical detail: the model's baseline already has the TCL
removed from 2026-04-06 per Budget 2025, so the validation runs the
*reverse* counterfactual (re-impose the TCL) and reads the sign-positive
"lifted from poverty" and "Treasury cost" figures directly. Easy to
miss otherwise.
…gelog fragment

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vahid-ahmadi added a commit that referenced this pull request Oct 12, 2026
Name the test that runs the fixtures (microsimulation/test_reform_impacts.py, gov_balance in 2029, default tolerance 1bn), fix the fixture count to eight, describe update_reform_impacts.py correctly, link #1724 instead of a page that is not on main, and add why the Microcosm move makes the history useful. Type the changelog fragment.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The 450,000 children figure is DWP's poverty impact assessment
  (Table 1, FYE 2030), not the OBR EFO; add DWP's 300,000 BHC figure.
- The cost benchmark is £3.1bn in 2029-30 from Budget 2025 Table 1.2
  (OBR-certified), not £3.0bn.
- Replace the unsourced claim about RF's take-up assumption with a
  neutral statement of PolicyEngine's own assumption.
- Drop the unresolvable populace-uk-private repo name and the
  "certified" label on the Microcosm release.
- Remove em dashes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vahid-ahmadi
vahid-ahmadi force-pushed the vahid-ahmadi/issue-1398-child-poverty-validation branch from da29070 to 1892d47 Compare October 12, 2026 09:10
The Lint job now runs ruff format --check on Markdown code blocks for
every pull request, docs-only ones included.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 23, 2026
The page reached main through #2386 and its changelog line shipped in
2.143.0, so this drops the released .added fragment and corrects main's
copy:

- reforms_config.yaml now has a dataset block and per-fixture receipts
  (#2335); the excerpt showed stale 7.8 / -18.1 values.
- The tests pin the certified Enhanced FRS 2024-25 (1.58.1) through
  certified_dataset.yaml, not enhanced_frs_2023_24.h5@1.40.3.
- The aggregate-impact workflow already costs the fixtures per PR, and
  aggregate_impact measure does the costing; what is missing is storage.
- "Raise higher rate by 1pp" sets 42%, a 2pp rise.
- Benchmarks: HMRC's ready reckoner for tax-rate changes; RF's No half
  measures is about the two-child limit.
- The baseline already removes the two-child limit; #1724's page is on
  main as child-poverty-tcl.md.
- Notebooks need a myst.yml entry; Pages is an artefact, not gh-pages;
  code links now point at GitHub.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 4 commits October 23, 2026 02:25
Main already carries this page (added by #2386); the merge brings the
branch up to date before the page is corrected.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The snippet counted children in absolute low income (in_poverty_ahc,
"absolute poverty" at both 2.123.7 and main) and compared them with DWP
and Resolution Foundation figures for relative low income (DWP Tables 1-2;
RF "No half measures"). It also counted is_child (deprecated) rather than
HBAI dependent children.

Re-run on 23 October 2026, policyengine-uk 2.148.2, certified Microcosm UK
2024-25 national release (cut 20261019T083323Z-6cba5d71, SHA-256 810ba980),
FY 2029-30, HBAI dependent children:
- relative AHC ~548,000; relative BHC ~460,000; cost (gov_balance) £3.21bn
- absolute AHC ~549,000; absolute BHC ~325,000 (DWP Tables 3-4: 250,000)

Also:
- The cost is positive because the baseline pays more UC (gov_balance =
  tax less spending), not because it collects less revenue.
- Take-up: newly entitled families claim at the data's residual rate, not
  existing claimants' rate.
- RF published on 30 October 2025 on March 2025 OBR and August 2025 BoE
  forecasts, not November 2025; its subtitle is "Setting child poverty on
  a downward course at the Autumn Budget".
- The earlier figures are kept in the text, labelled as absolute-measure
  runs.
- Replaced the released .added fragment with a .changed fragment.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
From the independent review of the corrections:
- The run used main at c65bced, which is policyengine-uk 2.148.3 (the
  editable install's metadata still said 2.148.2); the only change since
  2.148.2 (#2354) is input identifiers, and the page's own snippet,
  re-run on that code, prints the same 548k, 460k and £3.21bn.
- DWP's absolute figures cite the FYE 2024 HBAI methodology (FYE 2011
  line), while PolicyEngine's absolute line is the FYE 2025 one HBAI
  adopted in March 2026, so that comparison is not like for like either.
- UC claims also follow would_claim_uc_at_legacy_closure for families
  reporting a closed legacy benefit (claims_universal_credit.py).
- The earlier snippet showed only the AHC calculation; the BHC code was
  never shown.
- Driver 1 now describes RF's nowcast and DWP's PSM instead of repeating
  driver 3's forecast vintages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Second-round review (approved): legacy_benefits_closed leaves out families
sent to Pension Credit instead; nothing earlier says the relative
comparison is not like for like.

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

Copy link
Copy Markdown
Collaborator

UK hub (Claude build session, for Max)
Ready for hub review

Head: 4ba3b7d6cddf28782ee529a04701104cd5a46fa7

Context. This page already reached main, byte for byte, through #2386 (merged 21 October 2026; batch commit d50ee85), and its 1398.added.md entry is already in CHANGELOG.md under 2.143.0. I merged origin/main into this branch (no rebase, no force-push), deleted the released .added fragment, and corrected the page. The PR's net diff against main is now just those corrections plus changelog.d/1398-child-poverty-tcl-page-corrections.changed.md. Suggested title: "Compare like with like on the two-child limit child poverty page".

The main finding: this changes the page's PolicyEngine estimates. The page's snippet counted children in absolute low income (in_poverty_ahc, "absolute poverty" both at 2.123.7 and on main: variables/household/income/in_poverty_ahc.py). It compared that with DWP and Resolution Foundation figures for relative low income, and counted children with the deprecated is_child rather than HBAI dependent children.

I re-ran the estimate on 23 October 2026 on main c65bced64 (policyengine-uk 2.148.3) with the certified Microcosm UK 2024-25 national release (microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71, SHA-256 810ba980…, the cut policyengine.py 6.10.x pins). The run used FY 2029-30, HBAI dependent children, and printed aggregates only. Results:

Measure Children lifted DWP (FYE 2030)
Relative low income, AHC ~548,000 450,000 (Table 1)
Relative low income, BHC ~460,000 300,000 (Table 2)
Absolute low income, AHC ~549,000 250,000 (Table 3)
Absolute low income, BHC ~325,000 250,000 (Table 4)

Cost (gov_balance): £3.21bn, against £3.1bn in Budget 2025 Table 1.2 and £3.5bn from RF. PolicyEngine is now above both benchmarks on headcount; the page previously said it sat between them. The page's own updated snippet, run as written, prints the same 548k, 460k and £3.21bn.

These are published model numbers on a public page, so the hub may want to decide whether this needs Max. The earlier figures stay in the text, labelled as absolute-measure runs.

Review. I had a verifier extract and check every claim, and checked each correction myself. Independent adversarial reviews followed: round 1 asked for changes, and round 2 approved; its two optional wording points are applied in the last commit.

Corrected (12)

  1. The poverty measure is now relative low income, to match the benchmarks; all figures are labelled relative.
  2. Children are counted as HBAI dependent children (is_hbai_dependent_child).
  3. The PolicyEngine estimates are re-run as above, with the version, cut and hash given.
  4. The snippet now computes both AHC and BHC, so the BHC row has visible code.
  5. Absolute-measure comparison with a caveat: DWP's note cites the FYE 2024 HBAI methodology (FYE 2011 line), while PolicyEngine's absolute line uses FYE 2025, as HBAI has since March 2026.
  6. The "earlier versions" paragraph: the old snippet computed only AHC, with in_poverty_ahc and is_child, and never showed the BHC code.
  7. The cost is positive because the baseline pays more UC (gov_balance = tax less spending), not because it "collects less revenue".
  8. Take-up: newly entitled families claim at the data's residual rate (would_claim_uc), unless they reported a closed legacy benefit (claims_universal_credit.py, claims_uc_at_legacy_closure.py, legacy_benefits_closed.py).
  9. RF published on 30 October 2025, using OBR March 2025 earnings and Bank of England August 2025 CPI forecasts, not November 2025 ones (RF footnote 4).
  10. RF's subtitle is "Setting child poverty on a downward course at the Autumn Budget".
  11. Driver 1 now describes RF's nowcast and DWP's Policy Simulation Model instead of repeating forecast vintages.
  12. Replaced the released .added fragment with a .changed fragment.

Checked and correct (unchanged)

Note

  • policyengine.py certifies this Microcosm cut against policyengine-uk 2.132.6. The run used main (2.148.3), as the page documents this repository's model.

@MaxGhenis
MaxGhenis added this pull request to the merge queue Oct 23, 2026
@vahid-ahmadi vahid-ahmadi changed the title Validate child poverty estimates against OBR/RF benchmarks (#1398) Count HBAI dependent children in relative poverty on the two-child limit page (#1398) Oct 23, 2026
Merged via the queue into main with commit 7e0a513 Oct 24, 2026
10 checks passed
@MaxGhenis
MaxGhenis deleted the vahid-ahmadi/issue-1398-child-poverty-validation branch October 24, 2026 02:39
@MaxGhenis

Copy link
Copy Markdown
Collaborator

Merged by the UK hub (Claude session 8e19f9d5) at head 4ba3b7d6c, through the merge queue with the head pinned.

  • What it fixes: the child-poverty validation page (docs/book/validation/child-poverty-tcl.md, live at https://policyengine.github.io/policyengine-uk/child-poverty-tcl/) compared PolicyEngine's absolute low-income count with DWP and Resolution Foundation figures for relative low income, and counted children with the deprecated is_child. It now compares relative with relative, using HBAI dependent children. The estimate was re-run on main with the certified Microcosm UK 2024-25 release (…6cba5d71) for FY 2029-30: about 548,000 children lifted from relative AHC poverty and about 460,000 BHC, at £3.21bn. DWP gives 450,000 and 300,000 at £3.1bn (Budget 2025); RF gives 480,000 and £3.5bn. So PolicyEngine is now above both headcount benchmarks, where the page had said it sat between them. The PR makes 12 corrections in all; see the hand-off comment.
  • Independent review (GPT-6.1 Sol, APPROVE at this exact head, static):
    • It verified both relative-poverty variables (60% of the contemporary person-weighted median) and is_hbai_dependent_child.
    • It checked each benchmark at its source: DWP Tables 1–4, Budget 2025 Table 1.2, and RF's report with its date, subtitle and footnote 4.
    • It checked the gov_balance sign, the .inf two-child limit from 2026-04-06, and the take-up route.
    • Nonblocking: the run log shows installed metadata 2.148.2 against the page's main 2.148.3. The dataset hash and outputs match the evidence.
  • Max's ruling (23 Oct, d1898): "merge 1724 seems obvious". Docs corrected to the model's actual output land on the gates.
  • CI: every check passes; the code-only jobs skip on a docs change. The merge queue runs the full suite.
  • Impact: docs only; no model change.
  • Follow-up: the scorecard session moves this benchmark comparison into policyengine-scorecard, after which this page links there instead of hard-coding numbers.

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.

2 participants