Hold the Child Tax Credit family element at £545 and apply the 6 April 2017 birth-date condition - #2051
Draft
MaxGhenis wants to merge 4 commits into
Draft
Hold the Child Tax Credit family element at £545 and apply the 6 April 2017 birth-date condition#2051MaxGhenis wants to merge 4 commits into
MaxGhenis wants to merge 4 commits into
Conversation
…fore-2017 rule The family element was £545 from 6 April 2003 until tax credits ended on 5 April 2025 (CTC Regs 2002 reg 7(3) as made, and as substituted by SI 2011/1035 reg 2(2)); no Tax Credits Up-rating Regulations changed it. The parameter started in 2016 and was CPI-uprated, giving £721.57 in 2024-25. - family_element: £545 from 2003-04-06, no uprating. - family_element_baby_addition: £545 more where a child is under one, until 5 April 2011 (reg 7(3)(a) as made). - eligibility/family_element_born_before (20170406): from 6 April 2017 the element is included only where a child or qualifying young person was born before 6 April 2017 (TCA 2002 s.9(2)(a); reg 7(2)(a), SI 2017/387 reg 4(b)). CTC_family_element applied no such condition. - A birth year entered for some people leaves the others at 0; the formula falls back to the period less age for them. Tests: 20 YAML cases worked from the law (17 fail on main) and Hypothesis properties (bounds, characterisation, order invariance, newborn metamorphic, pre-2011 baby rate). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 2, 2026
A situation that enters birth_year for some people leaves the others at 0, which is the case the formula's fallback handles; the family element assertion is what the property is about. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-input cases - family_element.yaml: the 2011 substitution is the one Up-rating change to reg 7(3); cite the point-in-time texts rather than the changes feed. - YAML header: award amounts are the model's annual arithmetic (reg 8(3) steps 1-2 round daily rates up to the penny); the model backdates parameters to 2015. - Two YAML cases: an older child without an entered birth year beside an entered one, and two pre-cutoff children (one family element). - Pin a partial birth-year example on the characterisation property. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.
Summary
The Child Tax Credit family element was £545 a year for the whole life of tax credits, 6 April 2003 to 5 April 2025. PE-UK started the parameter in 2016 and CPI-uprated it, so it read £550.99 in 2017-18, rising to £721.57 in 2024-25. The model also paid it to every eligible family, though from 6 April 2017 it is only for families with a child or qualifying young person born before 6 April 2017.
This PR:
elements/family_element.yaml: £545 from 2003-04-06, uprating removedelements/family_element_baby_addition.yaml: £545 more where any child is under one, 2003-04-06 to 2011-04-05eligibility/family_element_born_before.yaml: 20170406CTC_family_elementapplies the cutoff and the pre-2011 baby rateThe law
Fetched verbatim from legislation.gov.uk
/data.xmlon 2026-10-02.CTC Regs 2002 reg 7(3), as made (in force for awards from 6 April 2003, reg 1):
SI 2011/1035 reg 2(2) (Tax Credits Up-rating Regulations 2011, awards for the year from 6 April 2011):
Never uprated.
Reg 7(2)(a) from 6 April 2017 (words inserted by SI 2017/387 reg 4(b)):
TCA 2002 s.9(2)(a), as substituted by WRWA 2016 s.13(2)(a) (in force 6 April 2017, s.36(4)), says the same. SI 2017/387 has no transitional saving for existing awards.
Two corrections to the brief that led to this PR: the rule is in reg 7(2)(a), and reg 7(2A) is the child limit. And the amount was £545 from 2003; what changed in 2011 was the end of the £1,090 rate for a family with a baby.
Model notes
birth_year, the period less age, or an input). A child counts as born before the cutoff when 6 April of their birth year is before 20170406. That means a birth year of 2016 or earlier, exactly asis_CTC_child_limit_exemptreads the 2017 child limit. Apply the 6 April 2017 child cutoffs by date of birth #1904 (date of birth from age and months since the last birthday) will replace this with itsbirth_dayhelper; the parameter is already a YYYYMMDD date to match itsborn_beforeparameters.birth_yearfor some people leaves everyone else at 0 (core fills the input array). Read naively, 0 is "born before 2017". The formula treats 0 as not given and uses the period less age. The Hypothesis characterisation found this case, and it has a YAML case.is_CTC_child_limit_exempt,uc_is_child_born_before_child_limitand the Pension Credit child addition share the issue on main. Apply the 6 April 2017 child cutoffs by date of birth #1904 fixes those by moving them to its helper, which ignoresbirth_yearinputs and treats a 0date_of_birthas not given.age < 1for the year. In law it ran by relevant period (daily), so in a whole-year model a child who turns one mid-year keeps it all year. It affects only 2003-04 to 2010-11.Invariants (stated and tested)
policyengine_uk/tests/test_ctc_family_element_properties.py:Tests
policyengine_uk/tests/policy/baseline/gov/dwp/tax_credits/ctc_family_element.yaml: 22 cases, worked from the law in the file header. On main, 20 fail on value or the missing parameters. The two that pass are 2016-17 (where main already had £545) and the 2025-26 zero award. For example, in 2024-25 a lone parent on £25,000 with one child born in 2014 gets £3,455 + £545 - 41% x (25,000 - 19,995) = £1,947.95 (main: £2,124.52). With one child born in 2019 the award is £1,402.95. Awards use the model's annual arithmetic. SI 2002/2008 reg 8(3) steps 1-2 take each element as a daily rate rounded up to the penny, so a full-year statutory award is a few pounds higher (£1,952.00 for the first case). The element amounts and the condition are exact.test_ctc_family_element_properties.py: 31 passed locally. The characterisation property pins a partial birth-year example in both directions. The full YAML and pytest suites run in CI'sTestjob.Enhanced FRS impact (2024-25)
One real
Microsimulationper package state on a copy ofenhanced_frs_2024_25.h5(sha256e433e532…): base origin/main15de0cadf, branchb34cc9478. Scripts and aggregate outputs are kept with the session notes. Weighted totals, 2024-25:Where the family element moves:
The amounts are small because the data has few tax credit awards left in 2024-25: 21,000 weighted CTC-eligible families and £80.8m of CTC paid on main. In 2025-26 tax credits pay nothing on either base. Maximum rates and pre-minimum CTC still change, but abolition stops those changes reaching paid CTC, Housing Benefit or household net income.
Coordination
upratingfromfamily_element.yamland adds a comment. This PR supersedes that hunk: it keeps Set DWP benefit rates to the announced amounts, not CPI projections #1925's reference entries and adds the law. Whichever merges second should take this PR's version of the file.CTC_family_elementonto itsbirth_dayhelper (birth_day(person, period) < ctc.eligibility.family_element_born_before). Its whole-age invariant (born before 6 April 2017 iff period - age < 2017) then covers this reader too.worker.yamlvalues, not here.axiom: TheAxiomFoundation/rulespec-uk#372 queued (extended with reg 7(3) as made and as substituted from 2011, plus companion tests)
Fixes #2050
🤖 Generated with Claude Code