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>
…vers Child Tax Credit Regulations 2002 reg. 4 makes a person a qualifying young person from their 16th birthday until the 31 August that next follows, with no education condition, and reg. 5(3)(b) adds the 20 weeks after leaving for an under-18 registered for work or training. The model had only the education condition (reg. 5(3)(a), (ab)). - Reg. 4 reads is_before_first_september_following_16th_birthday. - Reg. 5(3)(b) reads the new input is_in_child_tax_credit_extension_period. - Reg. 5(4)(a): a young person who has left education or training and works 24 hours a week or more is not a qualifying young person through either. Tax credits ended on 5 April 2025, so this changes years to 2024-25. 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>
…-routes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A mutation that opened the leaver routes to a student who fails the entry condition (reg. 5(3A)) passed every test: the grid fixed the entry age at 17. The grid now also draws a course begun at 19, with the date fact set directly, and asserts that such a student never qualifies. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…o ctc-qyp-school-leaver-routes Brings in #2285's review round 2 head through the item 1 branch. 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>
…e education Review round 1 of #2301: the formula took failing the non-advanced education test as having left education, so a 16-year-old in full-time advanced education working 24 hours a week lost the reg. 4 period. Reg. 5(4)(a) bars work only for a person "having ceased to receive full-time education or approved training", and full-time education at a school or college counts at any level (reg. 5(5)). Reg. 4(2) lifts the first condition only. The 20 weeks of reg. 5(3)(b) are for a person who has ceased. The property oracle had the same conflation and is fixed with it; the grid now draws a course begun at 19, as its comment says. YAML Cases 15 and 16 pin the advanced student. 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>
|
UK hub takeover for the Budget fix sprint (Max, 21 Oct). The owner session If the owner session wakes, please don't push to this branch; comment here instead, so there's only one writer. 🤖 Generated with Claude Code |
|
UK hub: takeover withdrawn. The owner session has been woken (22 Oct 01:25Z) and is finishing this PR itself, so the hub's build is cancelled. One writer: the owner session. 🤖 Generated with Claude Code |
# 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>
…education Review round 2 of #2301: the formula took apprenticeship as ceasing education, so a 16-year-old apprentice still on a college course and working 24 hours or more lost the reg. 4 period. Education received by virtue of employment is left out of the first condition (reg. 5(3)(a)(ii)), which reg. 4(2) lifts; reg. 5(5) counts a course at a school or college without that exclusion, so the apprentice has not "ceased to receive full-time education" and the reg. 5(4)(a) bar does not apply. The property oracle had the same assumption and is fixed with it. YAML Case 5 now expects the apprentice on a course to qualify (£3,455); new Case 17 keeps an apprentice who has left every course out. 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>
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>
…o ctc-qyp-school-leaver-routes
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
|
#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
…o ctc-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 cf381c1:
|
Fixes #2290
Stacked on #2299, #2387 and #2279. Do not merge before them. This PR builds on #2299's Child Benefit routes (which carry #2387) and #2279's date fact. Until they merge, the diff here also shows their commits. This PR's own commits:
Summary
is_qualifying_young_person_for_child_tax_creditmodelled only the education and training condition (Child Tax Credit Regulations 2002 reg. 5(3)(a) and (ab)). Two rules for a young person who has left education were missing:is_before_first_september_following_16th_birthday(from #2279)is_in_child_tax_credit_extension_period, false by defaultThe second condition (reg. 5(4)) applies to both. A young person who has left education or training and works 24 hours a week or more qualifies through neither.
Against its base (the item 1 branch at 2575e9e, which carries
main4d80b29 and #2279), 2024-25, YAML cases run as plain simulations on both (scratch/probe_C_base_vs_branch.txt):is_qualifying_young_person_for_child_tax_creditCTC_child_elementCTC_child_elementIt changes years up to 2024-25: tax credits ended on 5 April 2025. This is a follow-up from #2279. It needs #2285, which stops a young person who heads their own benefit unit being their own qualifying young person (QYP).
The law
Child Tax Credit Regulations 2002:
HMRC's TCTM02220, which the entry-condition variable already cites, says: "There is no requirement for the qualifying young person to satisfy the condition of being in full-time non-advanced education or approved training up to and including 31 August following their 16th birthday. However, during this period, they have to satisfy the other conditions relating to qualifying young people."
Change
is_qualifying_young_person_for_child_tax_creditis now: aged 16 to 19, not receiving benefits in their own right (reg. 5(4)(c)), and any ofNew:
is_in_child_tax_credit_extension_period(input),is_in_remunerative_work_for_child_tax_credit(average weekly hours of 24 or more), and the parametersremunerative_work_hoursandextension_period_age_limit.Having ceased. Reg. 5(4)(a) applies to a person "having ceased to receive full-time education or approved training", so a student's hours do not matter (YAML Case 4). Full-time education at a school or college counts at any level (reg. 5(5)): a 16-year-old in full-time advanced education has not ceased it, so works 24 hours and keeps the reg. 4 period (YAML Case 15), although advanced education fails the first condition. An apprentice still on a course has not ceased either (Case 5): education received by virtue of employment is left out of the first condition (reg. 5(3)(a)(ii)), which reg. 4(2) lifts, and reg. 5(5) counts a course at a school or college without that exclusion. An apprentice who has left every course has ceased (Case 17). This is a reading of reg. 5(4)(a), which does not say whether an employment-linked course is "full-time education"; the round 2 review of this PR proposed it, and it follows the text that is there. It matters for 2024-25 and earlier only, since tax credits ended in April 2025. The review of this PR found that a first version took failing the non-advanced test as having ceased; the property oracle had the same mistake, and both are fixed.
Not modelled: interruptions (reg. 5(7)); the Working Tax Credit rules reg. 2(1) points to for counting hours.
The annual approximation, and a 16th birthday on 31 August
Reg. 4 reads #2279's date fact: a year counts if it starts (6 April) before the end of the period. That is every 16-year-old (age on 6 October) and a 17-year-old born from 1 September to 6 October.
Reg. 4(1A) gives a 16th birthday on 31 August no period without education. Its effect is to stop the period running to the next year's 31 August. The date fact already ends that person's period in the year of the birthday, so no separate exclusion is needed. That year still counts, as the one in which they are a child until 30 August (YAML Case 8), and the year after does not (Case 7). An exclusion for 31 August birthdays was written and removed: it would have dropped a year in which the person is a child for nearly five months.
Invariants
Tests
test_child_tax_credit_school_leaver_routes_properties.py:test_child_and_adult_definitions_properties.py: Child Tax Credit joins the other three programmes in the 16-year-old route, for a person who has left education.child_tax_credit_school_leaver_routes.yaml, 17 cases hand-computed (2024-25; child element £3,455):Mutation checks, each applied alone in a copy of the branch (YAML cases and property tests that fail):
Round 2 mutations at 33fa9ee (
mutation/prC_r2.txt):The rows above them were run at earlier heads, before the formula was restructured. The last of those first passed every test. The grid fixed the age the course began at 17, so it never drew a student who fails reg. 5(3A); it now draws a course begun at 19 as well. No YAML case can catch it without setting the 16th-birthday fact by hand for a 19-year-old: with the fact computed from the date of birth, a student who fails the entry condition is 19, the fact is false and the 20 weeks have ended, so the mutated and the real formula agree.
Run locally at 33fa9ee:
policyengine-core teston the 8 YAML files the branch changes againstmain(the PRs below it included): 87 passed.pyteston the 7 Python test files it changes againstmain: 47 passed.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 (c6e041e) 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 is identical, line for line, to #2299's report, which this PR carries with #2279 and #2387: this PR's own change moves nothing from 2025-26, the first year the report runs, as tax credits ended in April 2025. The carried figures are Child Benefit +£5.2m to +£6.2m a year, the two relative poverty flags (explained in #2299: the poverty line moves, not anyone's income), and #2279's taper costing line. Commits since then change tests only (the benefit cap oracle and #2279's test generator), so the report carries over to the current head.Local run, 2024-25
The one year with tax credits in payment, on the same certified file (sha256
056e80fd8e91), exact comparison of every record. Base: #2299's head 4772258 (withmaina8b2848, #2279 and #2387), so the figures are this PR's alone. Branch: c6e041e. Outputs:impact/prC_r3/in the session folder.No household's income changes, and no tax credit award changes.
CTC_child_elementrises for those 22 benefit units: +£18.2m. None of them claims tax credits (is_CTC_eligiblefalse andchild_tax_credit£0 before and after), sochild_tax_credit,tax_credits, net income and poverty are identical in every record.tax_credits_applicable_incomeis identical too: Count only the claimant's and partner's income in the legacy means tests #2387 stops a young person's own income counting. (On the round 1 base, without Count only the claimant's and partner's income in the legacy means tests #2387, it rose by £17,171.75 in 4 of those units, the newly counted young person's ownmiscellaneous_income;impact/prC_r1/income_probe.txt.)Earlier local runs on uk-data 1.58.0 (
impact/prC_r2/, at 33fa9ee, before the apprentice change) found the same pattern for 2024-25 to 2030-31: a higher child element and no award.Reproducer: policyengine_uk/tests/test_child_tax_credit_school_leaver_routes_properties.py::test_status_is_the_first_condition_or_a_leaver_fact_under_the_second
axiom: CTC Regs 2002 reg 4, reg 5(3)(b) and reg 5(4)(a) TheAxiomFoundation/rulespec-uk#361 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