Repository navigation
Pay no Pension Credit child amount to a family with a tax credit award - #2061
Conversation
SPC Regs 2002 reg 6(6)(d) applies Schedule IIA "except where paragraph (11) applies", and reg 6(11) applies to "a person who is awarded, or who is treated as having an award of, a tax credit": child tax credit or working tax credit (reg 6(17)). The model paid the Schedule IIA amount alongside the tax credit award. has_tax_credit_award is the award: a claim plus the conditions of entitlement other than the income test, since HMRC may award at a nil rate (TCA 2002 s.14(3)). It reads nothing from Pension Credit, so it adds no dependency cycle with the tax credit passport (SI 2002/2008 reg 4(1)(d)). No awards from 2025-26, when tax credits ended. Schedule IIA began on 1 February 2019 (SI 2018/676 reg 2), but the model paid it from 2015-16: after fiscal-year conversion the rate parameters hold the 2019 rates for 2015 to 2018. The new parameter gov.dwp.pension_credit.guarantee_credit.child.in_effect dates it. The tax credit passport tests no longer enter the child amount as 0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ort' into pc-child-amount-tax-credit-award # Conflicts: # policyengine_uk/tests/policy/baseline/gov/dwp/tax_credits_pension_credit_passport.yaml
|
#2034 (the State Pension Credit passport), which this PR was stacked on, merged on 2026-10-13 at 07:35Z through the merge queue, as 🤖 Generated with Claude Code |
…redit-award # Conflicts: # policyengine_uk/tests/policy/baseline/gov/dwp/tax_credits_pension_credit_passport.yaml # policyengine_uk/variables/gov/dwp/pension_credit/guarantee_credit/minimum_guarantee/additional/child_minimum_guarantee_addition.py
…t cases - has_tax_credit_award documents that it infers the award from reported amounts, so a nil or deemed award reported as zero must be entered. - child_minimum_guarantee_addition: a WTC award alone need not include anything for the child; renewal, finalisation and revision history are unmodelled inputs, not part-year effects. - YAML: an award entered directly; a couple aged 80 whose CTC award removes the child amount, leaving savings credit but ending the Guarantee Credit passport to Housing Benefit, and its no-claim twin. The 2025-26 case enters that the couple does not claim Universal Credit at the tax credit closure (SI 2014/1230 reg 60A(1)(a)(iii)). - Property tests: say the award check is wiring, the Schedule IIA calculation shares parameters and dates of birth, and pin the two rented households so the order checks reach Housing Benefit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review r2 found the coverage test failing at line 350: the model infers Housing Benefit take-up from reported benefits across the simulation (claims_all_entitled_benefits), so a reported tax credit left Housing Benefit unclaimed, and nil whatever the Guarantee Credit passport. Both rented YAML cases and both pinned property families now enter would_claim_housing_benefit, so the passport, not take-up, decides Housing Benefit. The savings credit note says the model does not round the weekly maximum (DWP publishes £19.04 a week). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
juaristi22
left a comment
There was a problem hiding this comment.
Review status: COMPLETE
Review severity: APPROVE
Reviewed head: 4172e7195f329f4db180742b638cdb68149c7774.
No actionable findings in the changed child-amount exclusion, commencement or affected Pension Credit, tax-credit passport and Housing Benefit paths. Independent policy and code review confirmed the awarded/deemed-award rule and 1 February 2019 commencement in the GB instrument and NI counterpart.
All 49 focused cases passed, preserving the original property-test settings. A separate two-household control inside the same bounded invocation confirmed that, with an actual HB claim and no Guarantee Credit, £18,000 savings gives £0 HB while £15,000 gives £11,529.83. Independent Decimal checks reconciled all 10 new YAML cases and 66 scalar expectations; 26 original sources/extracts were validated.
The annual commencement convention, reported-award inference and explicit nil/deemed-award input, plus documented earnings, rounding and closure assumptions, remain qualified as described. The private Enhanced FRS impact and the author's wider local test totals were not independently reproduced. Local checks used Core 3.32.27 rather than locked 3.33.2; no future combined merge tree was tested.
Required hosted CI and the queued RuleSpec parity follow-up still need their recorded gates. No encoder or completed encoded parity is claimed.
juaristi22
left a comment
There was a problem hiding this comment.
Review status: COMPLETE — CI follow-up at 4172e71.
C1 — Make the isolated Pension Credit child/disability fixture state its no-tax-credit-award premise. Required CI now fails in policyengine_uk/tests/test_claimant_not_own_child_properties.py::test_disability_amounts_count_disabled_dependants_and_never_claimants at line 341: all 162 child additions are zero against positive expectations (failed job).
The first loop is 2024. Its helper forces is_CTC_eligible=True to test CTC disability elements, supplies no reported awards and leaves claims_all_entitled_benefits at its default true. That makes would_claim_CTC and has_tax_credit_award true, so this PR's new exclusion correctly suppresses the Pension Credit component. The old positive amount oracle needs an explicit no-award premise for its separate PC calculation, or separation from the CTC-controlled calculation; retain that premise through resets. Please preserve the exhaustive dependant/disability matrix, positive no-award expectations and separate CTC/WTC/nil/deemed-award exclusion regressions, then run the named module and required CI.
My earlier approval predates this hosted failure. The focused code and policy checks support a fixture integration fix; they do not support weakening the statutory production gate. Diagnosis uses the hosted assertion and exact source/dependency trace, without a claimed local repair or rerun. Required CI and the recorded RuleSpec/Axiom follow-up remain outstanding.
test_claimant_not_own_child_properties.py (from #2285, on main) supplies is_CTC_eligible to every unit so the CTC disabled child elements are paid. With that eligibility and the claim the model presumes, each unit has a tax credit award in 2024, and SPC Regs 2002 reg 6(6)(d) and (11) then give no Schedule IIA child addition, so CI failed test_disability_amounts_count_disabled_dependants_and_never_claimants on child_minimum_guarantee_addition (0 against the Schedule IIA amount). The invariants are about who counts as a dependant, not the award, so the helper now enters has_tax_credit_award as false, and the Pension Credit addition is paid and tested in every year, as before this PR. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
juaristi22
left a comment
There was a problem hiding this comment.
Review status: COMPLETE — re-review at eca1f85. Approval; previous C1 resolved, no new findings.
The repaired component fixture now explicitly supplies no tax-credit award and retains that input through reset. Its original positive disability matrix executes all 162 combinations in both 2024 and 2026; the years, oracles, tolerances and non-vacuity checks are unchanged. This isolates the PC component without weakening the production award exclusion or its separate award/nil/deemed-award regressions.
One bounded current-head batch passed all 17 checks: the full repaired five-test module, ten unchanged award/commencement/final-HB YAML cases, and two request-order/post-closure properties. Actual matrix observations confirm 162 positive outputs in each year. Independent policy/source checks support the fixture premise and verified that production gates and the relevant original sources are unchanged. Current main e7610ac is integrated; the trusted-base Fix evidence check passed.
Local Python 3.13.14/Core 3.32.27 differs from locked Core 3.33.2. This is focused validation, without a new full-suite or private-population claim. Hosted required CI is still pending at this head; the existing RuleSpec/Axiom #424 queued follow-up and encoder limitation remain outstanding. This approval does not establish merge readiness or encoded correctness.
… pay it Review r4 (GPT-6.1 Sol, on eca1f85) noted that "the addition is paid" is too broad: with no award entered, a unit without a child or qualifying young person still gets no addition, as the lone-claimant cases expect. Comment and docstring only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
juaristi22
left a comment
There was a problem hiding this comment.
Review status: COMPLETE
Review severity: APPROVE
Reviewed head: 7550aa4e55de840f3ac0090ad81c92d645462adc.
Incremental review after the comment clarification and merge of main b4dbaf57a. No new findings; C1 remains resolved. The fixture's executable AST and all eight other branch files are unchanged from the previously approved head.
Independent policy and code review checked the affected integration. All 17 focused cases passed at this head, including the original positive disability matrices in 2024 and 2026, the no-award premise through reset, award exclusions, and final Pension Credit/Housing Benefit cases. All 26 cached source originals and extracts validated; no new source acquisition was needed.
The reported-award inference, nil/deemed-award input, renewal and annual-convention qualifications remain. Local execution used Core 3.32.27 rather than locked 3.33.2; private Enhanced FRS results were not reproduced. The queued RuleSpec/Axiom follow-up remains outstanding; no encoded parity is claimed.
Fresh CI check: no current failures; pending Test / Python 1/4, Test / Python 2/4, Test / Python 3/4, Test / Python 4/4, Test / Result (absent). This approval does not establish merge readiness.
Fixes #2060
Summary
child_minimum_guarantee_additionpaid the State Pension Credit Regulations 2002 Schedule IIA amount for every child or qualifying young person, whether or not the family had a tax credit award. The law pays it only where the claimant has no award of child tax credit or working tax credit (reg 6(6)(d), (11) and (17)). The model paid both.This PR withholds the Schedule IIA amount from a family with a tax credit award, and stops the amount being paid before Schedule IIA began on 1 February 2019.
It was stacked on #2034 (the tax credit income test lifted for Pension Credit), which merged on 2026-10-13 (
7d202ab9f). The PR now targetsmainand hasmainmerged in.Reproducer:
policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/guarantee_credit/child_amount_tax_credit_award.yaml::A Pension Credit couple awarded CTC and WTC gets no child amount;policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/guarantee_credit/child_amount_tax_credit_award.yaml::Before February 2019 there was no Schedule IIA amountLaw (fetched verbatim from legislation.gov.uk
/data.xml, 2026-10-02)DWP's guidance reads reg 6(11) the same way (DMG 78550): "They cannot be awarded a child addition in SPC if they have an ongoing award, or are treated as having an ongoing award, of tax credits." The explanatory memorandum to SI 2018/676 (para 7.5): "This additional amount will not be awarded if the claimant has an award of a tax credit."
The questions
What counts as an award. Reg 6(11) turns on being "awarded" a tax credit, which is HMRC's decision on a claim (s.14(1)), not on the amount paid. HMRC can award at a nil rate (s.14(3)). So the new
has_tax_credit_awardis true where the family claims a tax credit and meets its conditions other than the income test:would_claim_CTCandis_CTC_eligible, orwould_claim_WTCandis_WTC_eligible.The alternative, an award only where the amount is positive, also breaks #2034's rule. Take a family whose income-tested award is nil and whose Pension Credit is nil without the child amount. On that reading it would get the child amount, and so Pension Credit, while its tax credits stayed income-tested. But Pension Credit lifts the income test (SI 2002/2008 reg 4(1)(d)), which makes the award positive, which removes the child amount and the Pension Credit. No state is consistent. A YAML case covers this family.
How the model finds an award. The award is read from the model's existing claim and entitlement variables, and those infer a claim from a positive reported award:
is_CTC_eligibleandis_WTC_eligibleneed a positive reported amount. So an award reported as nil, or one treated as continuing during renewal, is not inferred.has_tax_credit_awardis an ordinary variable, so a user can enter it for such a family; a YAML case does.Working tax credit alone. Reg 6(17) includes working tax credit, so a family claiming WTC but not CTC also gets no child amount, although a WTC award need not include anything for the child. A YAML case covers it.
Couples. A couple claims tax credits jointly (s.3(3)(a)), so the award is the Pension Credit claimant's whichever partner claims. The model's benefit unit is both the tax credit claim and the Pension Credit claim.
Deemed awards and cessation (reg 6(12)-(16)). Not modelled. Reg 6(12) and (13) treat last year's award as continuing from the start of a tax year until it is renewed or finalised, and reg 6(14) to (16) end the child amount when an award is made late. The model has no renewal, finalisation or revision history to apply them to. The code comment says so, and a deemed award can be entered as
has_tax_credit_award.Commencement. Schedule IIA began on 1 February 2019. The model takes a year's rules at the start of the fiscal year, so the amount applies from 2019-20. Before this PR the model paid it for earlier years too: the rate parameters start on 1 February 2019, but after fiscal-year conversion they hold the 2019 rates for earlier years. On
mainwithout this PR, the 2018-19 YAML household is paid 63.84 x 52 = £3,319.68. The new parametergov.dwp.pension_credit.guarantee_credit.child.in_effectis false until 1 February 2019.After tax credits. Tax credits ended on 5 April 2025 (
gov.dwp.tax_credits.active), so no family has an award from 2025-26 and the child amount is paid.No dependency cycle
Pension Credit counts working tax credit as income (SPCA 2002 s.15(1)(b)), and #2034 makes the tax credit income test read Pension Credit, in a core branch. A child amount that read the award's amount would join that loop.
has_tax_credit_awardreads only the claim and the entitlement conditions. Traced on the first YAML case's family (2024-25) at this PR's head, it reads 48 variables besides itself: ages, hours, couple status, education and training, disability, the reported benefits, and the Universal Credit claim with its legacy-closure routing. They include Pension Credit's age conditions andpension_credit_reported, but no Pension Credit amount, no tax credit amount and not the income test. So it is the same in #2034's passport branch as outside it, and the passport's rule is unchanged: it now decides on the Pension Credit payable without the child amount. In 2025-26 onward it returns false before reading anything.Changes
has_tax_credit_award(new, benefit unit): the award, as above; false once tax credits are inactive.child_minimum_guarantee_addition: nil wherehas_tax_credit_award, and nil whilein_effectis false. Apply the 6 April 2017 child cutoffs by date of birth #1904's date-of-birth ranking and 6 April 2017 cutoff at the top of the formula are unchanged.gov.dwp.pension_credit.guarantee_credit.child.in_effect(new): false from 6 October 2003, true from 1 February 2019.tests/test_claimant_not_own_child_properties.py(from Stop counting a benefit unit's claimant or partner as its own child or qualifying young person #2285): its helper entersis_CTC_eligiblefor every unit so that the CTC disabled child elements are paid. With the claim the model presumes, every unit then had a tax credit award in 2024, so the Pension Credit child addition was nil and CI failed on4172e7195. Those invariants are about who counts as a dependant, not about the award, so the helper now entershas_tax_credit_awardas false, and the tests exercise the addition in both of their years again.Invariants (property-tested, Hypothesis)
For any list of one to six families, each with an adult aged 60-90, perhaps a partner aged 40-90, and up to three children under 16, drawn with earnings and hours, State Pension from 66, private pension, savings and savings interest, reported CTC and WTC, a Universal Credit claim and Pension Credit take-up:
has_tax_credit_awardequals the claim and entitlement conditions read from the same simulation. This checks the wiring; it cannot find an error in those conditions.tests/test_pension_credit_child_amount_tax_credit_properties.py: 4 properties (20 derandomized examples each; two also run the YAML households as an explicit@example) and a coverage test.test_yaml_families_reach_every_casechecks that six pinned families hit each case: CTC and WTC with Pension Credit, no claim, WTC alone, a nil-rate award, and the renting pair, in which the award ends the Housing Benefit passport and the no-claim twin keeps it. The four properties passed locally on72bd1add7. The coverage test failed there (round 2's finding below) and passes on this head. CI runs the whole file on this head.The drawn families reach the rule. In 40 derandomized draws for 2024-25 at this head (154 families, 102 with children):
Tests
YAML: 10 cases in
tests/policy/baseline/gov/dwp/pension_credit/guarantee_credit/child_amount_tax_credit_award.yaml, each computed by hand from the law and DWP's published rates, with the arithmetic in comments:Inputs the cases enter, and why:
claims_all_entitled_benefits), so a reported tax credit alone would leave Housing Benefit unclaimed, and nil whatever the passport.On
mainwithout this PR (72fc91559, run 2026-10-15): case 5 cannot run, because it enters the new variable. Of the other nine, six fail on value, because the base pays the child amount (cases 1, 3, 4, 6, 9 and 10), and the three controls pass (cases 2, 7 and 8). #2034's two CTC cases, with their hand-entered child amount removed, fail on value: Guarantee Credit £1,826.48 and £1,280.48, where the law gives nil. On this branch all of them pass.Local runs on this head (
7550aa4e5,mainatb4dbaf57amerged in): the two YAML files this PR adds or changes, 21 passed; all oftests/policy/baseline/gov/dwp, 594 passed; the two claimant-not-own-child tests that draw no examples (-k "disability_amounts or lone_qualifying"), 2 passed;uvx ruff format --check .anduvx ruff check .clean on ruff 0.16.7 and 0.17.1. Round 5's reviewer also ran the Pension Credit YAML folder with the passport and legacy-closure filesmainchanged (278 passed) and the pinned YAML families in both property files (-k yaml_families, 2 passed). CI passed every check oneca1f85b5(run 38962900441), both Hypothesis files included, and runs the full YAML and pytest suites on this head; a local disk pause on the shared host ruled out running the Hypothesis files here.Enhanced FRS impact
Real
Microsimulationruns on a private copy of the Enhanced FRS 2024-25 (sha256e433e532…), one per package state, on 2026-10-14: basemainatcb1770774and this branch at72bd1add7(mainmerged in), for 2024 and 2025. Each run records the package path and git head it imported. Aggregates only.Since that run,
mainhas split the benefit cap and LHA rules between Universal Credit and Housing Benefit (#2089) and deducted relieved pension contributions from adjusted net income (#2440), among other changes. None of them touches a Pension Credit, tax credit or Schedule IIA file or any of the 48 variableshas_tax_credit_awardreads, and this PR's three model files are byte-identical to72bd1add7; the later commits change test files and mergemain. Withholding the child amount can change a paid amount only for a family with both an award and Pension Credit, and the run found none.main's changes cannot create one in 2024-25: the legacy-closure route between Universal Credit and Pension Credit is shut that year (legacy_benefits_closedis false while tax credits, Income Support and income-based JSA were active), a lower adjusted net income can only lower income tax, and the dataset enters no adjusted net income. So the run was not repeated.No amount paid changes in either year. Of 112 arrays compared per year (Pension Credit and its two credits, tax credits, Housing Benefit, Council Tax Reduction, Universal Credit, the benefit cap, household net income, the poverty flags and each household benefit), 109 are identical in 2024 and all are identical in 2025. The branch also outputs
has_tax_credit_award.2024-25:
child_minimum_guarantee_addition,additional_minimum_guaranteeandminimum_guarantee. The model computes them for every benefit unit with children, whether or not it can get Pension Credit. They fall for the 27.0k benefit units with an award (£235.8m in total), none of which is entitled to Pension Credit, so nothing paid moves.2025-26: no award (tax credits ended), and no array changes.
So on this dataset the fix is a correctness change for household calculations, with no aggregate effect. Years before 2024 were not run.
Run time and memory, from single runs on a shared, loaded host (not a benchmark): household net income took 10.5 s on the base and 7.3 s on the branch in 2024, and 4.5 s and 7.1 s in 2025; peak RSS was 3.2 GB and 2.9 GB in 2024.
Axiom
axiom: TheAxiomFoundation/rulespec-uk#424 queued
rulespec-uk encodes both provisions (
uk/regulations/uksi/2002/1792/6.yamlandschedule/IIA.yaml; checkedorigin/main840c51f), but does not get this case right:6.yamlhas a rule for the reg 6(14)-(16) cessation and none for reg 6(6)(d), (11), (12) or (13). Itsawarded_tax_credit_under_tax_credits_actinput is read only by the cessation rule.schedule/IIA.yaml'sadditional_amount_applicableis paid whenever the claimant is responsible for a child, and is dated from 2026-04-06 only.uk/policies/govuk/pension-credit.yamlimports only the standard minimum guarantee from reg 6, so no child amount reaches the composed Pension Credit.#424 holds the verbatim law, the required outputs, a pasteable
review_findingand eleven companion tests from the same law and rates as this PR's YAML. The signed encoder run needs approval, so it is queued, not run.Review
a27a539ce): APPROVE, with minor findings on the award proxy, test independence, renewal wording and Housing Benefit and savings credit coverage, and nits on this description. The source answers them, and this description is rewritten for them.72bd1add7, after mergingmain): REQUEST CHANGES. The new Housing Benefit coverage check failed because the renting households never claimed Housing Benefit; savings credit rounding was undisclosed; this description was stale.5c0dc4a14enters the Housing Benefit claim and adds the rounding note, and this description is rewritten. It confirmed both conflict resolutions keep Apply the 6 April 2017 child cutoffs by date of birth #1904's formula and Lift the tax credit income test for State Pension Credit #2034's expectations.4172e7195): APPROVE WITH NITS. It found the round-2 findings fixed: on a copy of the awarded renting case, Housing Benefit is £0 with £18,000 of savings and £11,529.83 with £15,000, so the £16,000 capital limit, not take-up, gives the nil. It confirmed the three model files are byte-identical to round 2's head and that the mergedmainchanges touch no Pension Credit, tax credit or Housing Benefit code, and it checked this description's numbers against the run logs. Its three nits, all on this description, are answered here.eca1f85b5): APPROVE WITH NITS. CI on4172e7195had failed one test from Stop counting a benefit unit's claimant or partner as its own child or qualifying young person #2285,test_claimant_not_own_child_properties.py::test_disability_amounts_count_disabled_dependants_and_never_claimants, because every unit it builds held an award in 2024.6cae403f2enters the award as absent in that file's helper. The review found that this keeps all five tests' purposes, and that without it invariant 2's Pension Credit comparison and the lone-claimant check were vacuous in 2024. Its one nit, that "the addition is paid" overstated what the tests do, is answered in0fac977b0.7550aa4e5, after mergingmainatb4dbaf57a): APPROVE WITH NITS. It found0fac977b0text-only and accurate; the merge clean (the diff frommainis this PR's nine files, and an independentgit merge-treegives the same tree); the same 48 dependencies on a re-run of the trace; and no test new onmainthat expects a child amount alongside a presumed tax credit claim. Its nits, all on this description (a stale sentence on whatmainhas changed since the impact run, and stale head and review references), are answered here.Related and follow-ups
tax_creditsincludes a CTC child element for a family that is not eligible for CTC, and Housing Benefit and Council Tax Reduction count it as income; and SPC Regs Schedule IIB (the transitional amount for pensioners moved from CTC to Pension Credit, reg 6(6)(e), from 8 June 2024) is not modelled.🤖 Generated with Claude Code