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>
MaxGhenis
added a commit
that referenced
this pull request
Oct 12, 2026
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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), and #2279 waits on d1345. 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 change, againstmainwith both merged:git diff $(git merge-tree --write-tree $(git merge-tree --write-tree origin/main origin/uc-pc-qyp-sixteen-route) origin/means-tests-dependants-income) origin/cb-qyp-school-leaver-routesSummary
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):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 e626d3f (logs in the session folder):
policyengine-core teston the 7 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): 71 passed.pyteston the 6 Python test files it changes againstmain: 43 passed.policyengine-core teston the 198 YAML files that mention these programmes, 2,000 passed;pyteston the 76 Python test files that mention them is still running and will be added here.ruff format --checkandruff checkonpolicyengine_uk: clean.The full suites run in CI.
Microsimulation impact
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 Housing Benefit, Income Support, Council Tax Reduction, Universal Credit, tax credit or Pension Credit award changes in any year: these families are not on those benefits.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