Repository navigation
Conversation
…ducation condition UC Regs 2013 reg. 5(1)(a) and SPC Regs 2002 reg. 4A(1)(a) make a person who has reached 16 a qualifying young person up to the 1 September following their 16th birthday, whatever their education. The model encoded only the education route, so a 16-year-old outside education was not a UC or PC qualifying young person. is_before_first_september_following_16th_birthday places that date from the date of birth and counts the route for a year that starts (6 April) before it: every annual age of 16, and a 17-year-old born from 1 September to 6 October. Both QYP variables OR it with the education route, under the same age band and own-right benefits exclusion. Tests: YAML cases hand-computed from the regulations (flags, date edges, UC child element and work allowance, PC child addition), the property-test oracle, a calendar differential over every birth date in 2008-2011 and across years, and a grid test of sufficiency, monotonicity, exclusion and UC/PC agreement. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-qyp-school-leaver-routes
…eavers Child Benefit (General) Regulations 2006 regs 4, 5 and 7 were not modelled: is_qualifying_young_person_for_child_benefit was reg. 3 (education or training) alone, so a 16-year-old who had left school was not a qualifying young person for Child Benefit, nor a young person for Housing Benefit, the legacy benefits or Council Tax Reduction (SSCBA 1992 s.142). - Reg. 4: until the 31 August after the 16th birthday, read from is_before_first_september_following_16th_birthday. - Reg. 5: the 20-week extension period for a 16- or 17-year-old not in remunerative work, from the new input is_in_child_benefit_extension_period. - Reg. 7: until the terminal date after leaving, from the new input is_before_child_benefit_terminal_date. - Reg. 7(3): no Child Benefit for a young person who qualifies through reg. 7 alone and works 24 hours or more a week (is_child_benefit_payable_for_person); they stay a qualifying young person. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…school leaver A disabled 16-year-old outside education is now a young person until the 31 August after their 16th birthday (Child Benefit reg. 4; HB reg 19(1)), so HB reg 28(6) counts them. Keep the original point, that the disability age extension does not itself create young-person status, as a second case with the reg. 4 period ended. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Two property tests build a member who is outside every programme's family as a 16 to 19 year old not in education. At 16 that member is now a UC qualifying young person under reg 5(1)(a), so the family's UC gains a child element and the tests' premise no longer holds. Their generators now set is_before_first_september_following_16th_birthday false for that member. The test functions are unchanged, so Hypothesis draws the same examples. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-qyp-school-leaver-routes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nefit reg. 4 period test_excluded_member_never_changes_is_eligibility adds a member aged 16 or over who is not in education, on the premise that they are not a qualifying young person. With reg. 4 a 16-year-old who has left education is one until the 31 August after their 16th birthday, so the generator now puts the member past that date, as #2279 does for the same reason in two other property tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…date-of-birth tests - The route variable's docs now warn that setting it for some people gives everyone else false, and point to date_of_birth for placing one person. They also state that the rule departs from the 6 October reading that is_SP_age uses. - YAML: a 2025-26 case where the 16-year-old ranks first under the two-child limit and the youngest child loses the element (GBP 7,581.72), and a case mixing a person with date_of_birth and one without (both in the route). The second kills a mutant that reads the raw date_of_birth input instead of birth_day. - means_test_income_members.yaml: the 17-year-old case's name says why they are outside the route. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fixes #2385. Housing Benefit, Income Support, tax credit and Council Tax Reduction applicable income counted the family's own children's and young persons' income, tax, contributions and personal benefits too, an approximation each formula's comment called a follow-up. The law counts the claimant's and partner's alone: HB Regs 2006 reg 25(3) and IS Regs 1987 reg 23(2) say in terms that a child's or young person's income is not the claimant's; the tax credit income regulations (reg 3(1)) and every Council Tax Reduction scheme count the claimant or applicant and partner (SSI 2021/249 reg 36(2) says so in terms). The household head who applies alone for Council Tax Reduction keeps the treatment #2288 gave them. Tests: new YAML (three cases, each failing on main), a property test that a dependant's income never changes any of the seven income totals, and the Scottish CTR young-person tests updated to the rule. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ent's means tests Review round 1 of #2299: a young person who qualifies through reg. 7 and works 24 hours stays a young person, so their earnings must not enter the parent's Housing Benefit, Income Support or Council Tax Reduction income. #2387, merged in here, makes that so; Case 11 now has £20,000 of earnings and asserts the three applicable incomes are nil. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # policyengine_uk/tests/test_legacy_award_readers_properties.py
Main has moved the tax credit member mask into tax_credits_current_year_income and, through #2078, means-tests the Council Tax Reduction applicant and partner. Both conflicts take main's code and re-apply this PR's change where the masks now live: the tax credit income counts the claimants alone, and the CTR income the applicant and partner alone, dropping the family's children and young persons that #2078 still counted. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#2089 replaced the shared is_benefit_cap_single_claimant_rate with is_uc_benefit_cap_single_claimant_rate and its Housing Benefit counterpart. The lone-parent case asserts the UC rate, which is still false: the 16-year-old outside education is a qualifying young person the claimant is responsible for. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
After main's benefit cap work, two cases asserted that a 16-year-old who has left education is not a Housing Benefit young person, so their DLA or armed forces independence payment does not lift the cap, and the exemption's docstring named this PR's issue (#2287) as the gap. Under reg. 4 they are a Child Benefit qualifying young person until the 31 August after their 16th birthday, and so a Housing Benefit young person (HB Regs 2006 reg. 19), whose benefit lifts the cap (reg. 75F(1)). Both expectations and the docstring now say so; Universal Credit's exemption is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Aggregate impact on certified data: passBase Checks: 0 broken by this change, 1 failing on both sides, 0 fixed. Moves flagged for review: 2 (thresholds in Notes
Moves flagged for review
Receipts by tax head
Spending by benefit and service
Caseloads
Government balance, each component counted once
Model totals
Household income totals
Poverty rates
People in poverty
Inequality
Mean household net income in each side's own deciles
Standard reform costings (change in gov_balance)
Standard reforms: change in each reform's target
Household net income by decileMean change in household net income per household, and as a share of the decile's base income; households stay in the base run's deciles.
No change in any year: components the model counts twice; population. Checks failing on both base and head (1)
Counted-once checkEach of 84 components was raised by £1 per unit in 2026-27, and every head of its totals was read household by household: its own head must rise by exactly £1, no other tax head may move, no other benefit may rise, and the model's own total must move by what its heads moved. A head that breaks a rule is measured again twice: with every other head held at its baseline value, and with every other head held at its value after the first £1 while the component rises again. It fails where either still shows the response. 0 failed; 0 were skipped.
Provenance
Dataset: Receipts by tax head: head levels
Spending by benefit and service: head levels
Caseloads: head levels
Government balance, each component counted once: head levels
Model totals: head levels
Components the model counts twice: head levels
Household income totals: head levels
Population: head levels
Poverty rates: head levels
People in poverty: head levels
Inequality: head levels
Mean household net income in each side's own deciles: head levels
Standard reform costings (change in gov_balance): head levels
Standard reforms: change in each reform's target: head levels
|
Three comments still said the Housing Benefit cap exceptions leave out a 16-year-old in neither non-advanced education nor approved training (#2287). Under reg. 4 the model's Child Benefit qualifying young person now counts every 16-year-old for the year, whatever their education, so the exceptions and the cap rate agree on them. Comments and documentation only; no formula changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#2549 added other_members_with_awards ("As other_members") for the young singles and working parents properties. It draws a 16-60-year-old outside education, but unlike other_members it did not set is_before_first_september_following_16th_birthday false. A drawn 16-year-old was therefore a UC qualifying young person, so the family changed. In the shrunk case, a single 19-year-old in Wales with GBP 12,000 earnings, housing_benefit_applicable_income went from GBP 11,740 to 0, and the two properties failed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
reference_specified_benefit counted the school-leaver role as a young person for Universal Credit only, matching the old model, where the Child Benefit qualifying young person (and so Housing Benefit's young person, reg. 19) had no route for a 16-year-old who has left education. Under reg. 4 they are one for the year, so their DLA, PIP, AFIP or carer benefit lifts the Housing Benefit cap too, as the formula now gives. Neither scheme counts one receiving benefits in their own right. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-qyp-school-leaver-routes
|
Parked until after the 28 October Budget under the UK hub's Budget triage (04:10Z 22 Oct: the QYP set is not Budget-material). Status at e53c1eb:
|
Fixes #2287
Stacked on #2387 and #2279. Do not merge before them. This PR reads #2279's date fact (
is_before_first_september_following_16th_birthday). It needs #2387, which stops a young person's own income counting in the parent's Housing Benefit, Income Support, tax credit and Council Tax Reduction means tests: without it, a working school-leaver this PR makes a young person would bring their earnings into those tests. Until both merge, the diff here also shows their commits. This PR's own commits:Summary
is_qualifying_young_person_for_child_benefitmodelled only the education and training condition (Child Benefit (General) Regulations 2006 reg. 3). A young person who had left education was never a Child Benefit qualifying young person (QYP), and so never a "young person" for Housing Benefit, Income Support, income-based JSA, income-related ESA or Council Tax Reduction in England and Wales, which all take the Child Benefit definition (SSCBA 1992 s.142).This PR adds the three conditions for young people who have left:
is_before_first_september_following_16th_birthday(from #2279)is_in_child_benefit_extension_period, false by defaultis_before_child_benefit_terminal_date, false by defaultReg. 7(3) pays no Child Benefit "by virtue of this regulation" in a week of remunerative work. The model applies it to the Child Benefit amount only, so the young person stays a QYP for the legacy schemes.
Against its base (
main4d80b29 with #2279 merged), 2026-27, the YAML cases below run as plain simulations on both (scratch/probe_B_main_vs_branch.txt; the base has no input for the reg. 5 and reg. 7 routes, so the probe drops them there):is_qualifying_young_person_for_child_benefitchild_benefit_entitlementis_lone_parentchild_benefit_entitlementchild_benefit_entitlementchild_benefit_entitlementThis is a follow-up from #2279. It needs #2285, which stops a young person who heads their own benefit unit being paid Child Benefit for themselves.
The law
Child Benefit (General) Regulations 2006:
Change
is_qualifying_young_person_for_child_benefit: aged 16 to 19, not receiving benefits in their own right (reg. 8), and any of: education or training begun before 19 (reg. 3, unchanged); the reg. 4 date fact; the reg. 5 extension condition; the reg. 7 input.meets_qualifying_young_person_extension_period_condition_for_child_benefit: under 18, the extension input, and not in remunerative work (reg. 5(1), (2)(c)).is_in_remunerative_work_for_child_benefit: average weekly hours of 24 or more, with a new parameterremunerative_work_hours.is_child_benefit_payable_for_person: the unit's child or QYP, unless they qualify through reg. 7 alone and are in remunerative work (reg. 7(3) with reg. 2(2)).child_benefit_child_indexandchild_benefit_respective_amountread it, so a barred young person does not take the eldest-child rate.is_child_or_young_person_for_legacy_benefitsis not edited. It follows the Child Benefit QYP, so Housing Benefit, the legacy benefits, lone-parent status and Council Tax Reduction pick the routes up.Not modelled: reg. 6 (interruptions), reg. 7 Case 2 beyond the input, and the Income Support, incapacity benefit and tax credit limbs of reg. 8. The Income Support limb is #2302, stacked on this PR; the own-right input here covers Universal Credit, ESA and JSA.
The annual approximation for reg. 4
Reg. 4 ends on 31 August (1 September for a 16th birthday on 31 August). Universal Credit's route in #2279 ends "up to, but not including" 1 September. Both dates fall in the same fiscal year, so a year that starts (6 April) before one starts before the other, and reg. 4 reads #2279's fact unchanged. As there, a year counts if any of it falls in the period: every 16-year-old (age on 6 October), and a 17-year-old born from 1 September to 6 October. #2279 sets out the bias of that rule; this PR follows it so that Child Benefit, Universal Credit and Pension Credit agree on a 16-year-old.
Invariants
Tests
test_child_benefit_school_leaver_routes_properties.py:test_child_and_adult_definitions_properties.py: Child Benefit joins Universal Credit and Pension Credit in the 16-year-old route.child_benefit_school_leaver_routes.yaml, 16 cases hand-computed (2026-27; eldest rate £27.05 × 52 = £1,406.60):main's benefit cap work. Two cases inbenefit_cap_specified_benefits.yamlasserted that a 16-year-old who has left education is not a Housing Benefit young person, so their DLA or armed forces independence payment does not lift the Housing Benefit cap; the exemption's docstring named this PR's issue (Child Benefit qualifying young person omits the school-leaver conditions (Child Benefit (General) Regulations 2006 regs 4, 5 and 7) #2287) as the gap. Under reg. 4 they are a Child Benefit qualifying young person, so a Housing Benefit young person (HB Regs 2006 reg. 19), and their benefit lifts the cap (reg. 75F(1)). Both cases now say so, as do the exemption's docstring, its inline comment, the single-claimant rate's documentation andhas_sixteen_year_old_dependant's docstring, which all named Child Benefit qualifying young person omits the school-leaver conditions (Child Benefit (General) Regulations 2006 regs 4, 5 and 7) #2287 as the gap; Universal Credit's exemption is unchanged. The reference oracle intest_benefit_cap_specified_benefits_properties.py(reference_specified_benefit) made the same assumption, counting the 16-year-old school-leaver role as a young person for Universal Credit only; it now counts them for both schemes (CI caught it on Add the Child Tax Credit qualifying young person period after leaving education #2301, which carries this PR).housing_benefit_applicable_income_childcare_element.yamlasserted that a disabled 16-year-old outside education "is not a relevant young person". Reg. 4 makes them a young person until 31 August, so HB reg. 28(6) counts them (1 relevant child, £9,000). The case is split in two: the default, and the same person with the reg. 4 period ended, which keeps the original point that the disability age extension does not itself create the status.Mutation checks, each applied alone in a copy of the branch (YAML cases and property tests that fail):
Run locally at e53c1eb (logs in the session folder):
policyengine-core teston the 8 YAML files the branch changes againstmain(Count 16-year-olds outside education as UC and Pension Credit qualifying young persons until the 1 September after their 16th birthday #2279's and Count only the claimant's and partner's income in the legacy means tests #2387's included): 140 passed.pyteston the Python test files it changes againstmain: last run at e626d3f, 6 files, 43 passed; CI runs them at this head.policyengine-core teston the 248 YAML files that mention these programmes, 2,685 passed;pyteston the 135 Python test files that mention them, 1,930 passed, 1 xfailed and 6 failed. Four were the benefit cap property oracle (fixed on Add the Child Benefit qualifying young person routes for young people who have left education #2299, 8a5980c) and two a test generator on Count 16-year-olds outside education as UC and Pension Credit qualifying young persons until the 1 September after their 16th birthday #2279 (fixed there, 560005c); both files pass at End the Pension Credit, Child Benefit and CTC qualifying young person status for Income Support in own right #2302's head 98a4739 (64 passed).ruff format --checkandruff checkonpolicyengine_uk: clean.The full suites run in CI.
Microsimulation impact
Aggregate impact report (CI)
The report runs
maina8b2848 against this PR merged into it (4772258) on the certified Enhanced FRS 2024-25 (policyengine-uk-data 1.58.1), one full run per side for each year 2025-26 to 2031-32. Result: pass, 0 checks broken, 2 moves flagged. It measures this PR with #2279 and #2387 below it. Commits since then change tests only (the benefit cap oracle and #2279's test generator), so the report carries over to the current head. #2279's own report shows no household change and #2387's no change at all, so every household change here is this PR's.The Child Benefit caseload rises by 1.0k each year. Absolute poverty before housing costs falls by 4.7k people in 2025-26 and about 200 a year from 2026-27 to 2030-31; absolute poverty after housing costs falls by 4.5k in 2026-27; relative poverty before housing costs falls by 4.5k to 4.8k people a year from 2026-27.
The two flags are relative poverty after housing costs for children in 2029-30: +0.16pp, +24.2k (everyone +39.6k, pensioners +4.4k). They come from the poverty line, not from anyone's income falling.
in_relative_poverty_ahccompares each household with 60% of the same run's person-weighted median equivalised income after housing costs, so a family near the median that gains Child Benefit moves the median and the line with it. Absolute poverty after housing costs, against a fixed line, does not change in 2029-30. In the local run below, no household loses in 2029-30, and the households that change hold 23,346 weighted people, none aged 66 or over; the report's 39.6k new people below the line, 4.4k of them pensioners, are mostly people whose income does not change. Relative poverty before housing costs falls in the same year.The standard reform costing "Reduce Universal Credit taper rate to 20%" moves by −£1.6m to −£2.2m a year. #2279's own report shows the same line, so it is #2279's.
Local runs
Real runs on Enhanced FRS 2024-25 (uk-data 1.58.0, sha256
5ba399ea5ab9a6c7), one run each for 2024-25 to 2030-31, exact comparison of every record. Base:maine01f2f5 with #2279 (9d2fadb) and #2387 merged (a local merge, eeabc65e3), so the figures are this PR's alone. Branch: e626d3f. Outputs:impact/prB_r2/in the session folder.Who changes. In 2026-27, 102 records (203,321 weighted people) become Child Benefit qualifying young persons by status. Only 22 records (4,929 weighted) are in a family whose claimant now counts them: in the microdata most 16-year-olds outside education are the only member of their own benefit unit, apart from their parents (PolicyEngine/policyengine-uk-data#562), and since #2285 nobody is their own QYP.
Aggregates (£ million a year):
child_benefithousehold_taxhousehold_net_incomehousing_benefit_applicable_incomecouncil_tax_reduction_applicable_incomeThe tax is the High Income Child Benefit Charge: in 2026-27 the change in
household_taxequals the change inCB_HITCexactly (impact/prB_r2/hitc_check.txt).Per benefit unit in 2026-27 (
impact/prB_r2/context.txt): in 16 units the new Child Benefit (£930.80, the additional rate, or £1,406.60) is added to both applicable incomes in full. In 4 units the charge takes back all or nearly all of it, so the applicable incomes move by under £1 either way. In the 2 units whose parent becomes a lone parent, Council Tax Reduction income rises by the £1,406.60, and Housing Benefit income by £1,040 less, because the lone parent earnings disregard is £25 a week where a single claimant's is £5. No saved Housing Benefit, Income Support, Council Tax Reduction, Universal Credit, tax credit or Pension Credit award output changes in any year. That does not mean none of these families is on those benefits: three affected households keep a positive reported Council Tax Reduction (£156.54 for one, £417.43 for two others in 2026-27), whichcouncil_tax_benefitkeeps as reported where it does not simulate the claim (for example where the scheme is not supported), so the comparison does not compute how those awards would respond.is_lone_parentchanges for those 2 records (35 weighted).Winners and losers (
household_net_income, changes over 50p):In 2026-27 the gaining households by decile of base household income: 1 (529 weighted), 2 (863), 3 (1,419), 4 (283), 6 (475) and 9 (706, each gaining £0.59 after the charge). People in poverty after housing costs fall by 3,899 and before housing costs by 196.
Reproducer: policyengine_uk/tests/test_child_benefit_school_leaver_routes_properties.py::test_status_is_the_union_of_the_four_conditions
axiom: Child Benefit (General) Regulations 2006 regs 2, 4, 5, 7 and 8 TheAxiomFoundation/rulespec-uk#356 queued (addendum; blocker stated there: the rows are in an unreleased ingest, axiom-corpus#765, and a billed encoder run needs approval)
🤖 Generated with Claude Code