Repository navigation
Count the UC award before debt deductions in four councils' CTR - #2822
Conversation
…ils' CTR Merton, Kingston upon Thames, Newham and Westminster assess an applicant on Universal Credit on the Secretary of State's income calculation plus the amount of the award (SI 2012/2886 Sch para 37(1) and (3)(a)). The Secretary of State pays debts out of that award (SI 2013/380 Sch 6 paras 2(1), 3(1)(a) and 11(5)), but legacy_council_tax_reduction read universal_credit, the amount payable after deductions, so each pound of deduction lowered the assessed income. It now adds uc_deductions back, which recovers the award after the benefit cap. Fixes #2799. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PR #2760 counts a supplied latent deduction rate only where uc_has_deduction is true. Set the flag wherever these tests supply a latent rate, so they keep their deductions after it lands; main does not read the flag on this path. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Secretary of State reduces the award for the benefit cap and pays third-party deductions out of it; the comments now say so, and cite UC Regs 2013 reg 22(1)(b)(i) for the missing work allowance in the worked example. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…operty test Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ty test Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ion cases Five YAML cases check that Merton and Kingston upon Thames count the Universal Credit award before debt deductions for a claimant with a private pension, one with tariff income on 8,000 of savings, a household with a non-dependant, a household the model's benefit cap reduces by 1,200, and the same household under an 85% protected floor. The YAML header labels 764.82 as the model's annual deduction at the 15% cap beside the Secretary of State's monthly 63.74 (SI 2013/380 Sch 6 para 1(2)). The legacy CTR comment and the property test's docstring cite SI 2013/383 reg 10 and SI 2013/384 reg 10 for advances and overpayments and keep Schedule 6 to third-party deductions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The header names third-party deductions under Schedule 6 and has each council grant the same reduction after a deduction; the floor case opens with the reform rather than a fragment. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The legacy CTR comment and the property test's docstring say the Secretary of State may not make a third-party deduction that leaves less than a penny payable, and split the para 37 sentence. The YAML comments say what each deduction leaves payable, take the maximum amount as the applicable amount without a gloss, and give the floor case's limit to the Secretary of State. 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: 0 (thresholds in Notes
Moves flagged for reviewNone. Spending by benefit and service
Caseloads
Standard reform costings (change in gov_balance)
Standard reforms: change in each reform's target
Household net income by decileNo household's net income changes in any year. No change in any year: receipts by tax head; government balance, each component counted once; model totals; household income totals; population; poverty rates; people in poverty; inequality; mean household net income in each side's own deciles. Checks failing on both base and head (1)
Counted-once checkEach of 92 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
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
|
juaristi22
left a comment
There was a problem hiding this comment.
Reviewed dd39eafbb76982ec87020b96217a66f5b1ee0225. COMPLETE: no findings or material evidence gaps for this change.
The four council schemes count the UC award/entitlement. UC regulation 81 reduces that award for the benefit cap, whereas Claims and Payments Schedule 6, advance recovery regulation 10 and overpayment recovery regulation 10 distinguish recovery from the sum payable. Adding back only actual debt deductions preserves the cap reduction already applied.
I independently checked Merton, Kingston and Newham's current paragraph 37 and Westminster's official 2026/27 summary. The Westminster conclusion is limited to its explicit award comparison; it does not certify the full unpublished scheme or resolve unrelated eligibility questions.
Validation: 348 passed, zero failures/skips, including all 346 CTR YAML cases, the new property and a native diagnostic covering 16 households through final CTR and household net income. Actual cap and protected-floor paths passed separately. Latest current-head required checks pass; the older cancelled duplicate is superseded by a successful same-name run.
The Axiom #521 queue contract, companion cases, corpus/approval blocker and disclosed annual debt-rounding approximation are recorded correctly. Encoded parity has not been run.
The PR remains a draft, so I am posting the completed assessment as a comment. Approval can follow once it is ready, subject to a fresh head/activity/CI check.
|
I marked this ready at the head you reviewed, 🤖 Generated with Claude Code |
juaristi22
left a comment
There was a problem hiding this comment.
Rechecked dd39eafbb76982ec87020b96217a66f5b1ee0225 after it was marked ready. COMPLETE; no findings or material gaps.
The head and actual description are unchanged from my completed review. The prior 348 passing checks, including final CTR/household-income diagnostics and separate actual-cap/protected-floor cases, remain applicable; no tests were rerun. The source cache and queued Axiom evidence were revalidated, and current-head required checks pass.
The previous scope qualifications remain: Westminster evidence establishes the narrow award comparison, and the disclosed annual debt-rounding convention is unchanged. Approving this head.
Fixes #2799
What and why
Merton, Kingston upon Thames, Newham and Westminster assess a working-age applicant on Universal Credit on two figures: the Secretary of State's calculation of the applicant's income, and the amount of the award. Merton and Kingston upon Thames print the Default Scheme's para 37(1), (3)(a) and (4) (SI 2012/2886) in their 2026-27 schemes, at pages 69 and 45. Newham counts "the amount of entitlement to universal credit" (para 37(3)(a) and (4), pages 90 and 91). In its 2026/27 summary, Westminster compares the maximum amount "to the actual universal credit award plus any other income and earnings received" (page 3).
The Secretary of State reduces the award for the benefit cap (UC Regs 2013 reg 81(1)), then recovers debts from it: advances and other payments on account (SI 2013/383 reg 10), overpayments (SI 2013/384 reg 10) and the claimant's liabilities to third parties (SI 2013/380 Sch 6 para 2(1)). The Secretary of State may not make a third-party deduction that leaves less than a penny payable (Sch 6 para 3(1)(a)), and in para 11(5) the Secretary of State treats the award and "the amount payable" as two figures.
legacy_council_tax_reductionruns the four councils' working-age schemes. Onmainit readsuniversal_credit, the amount payable after both the benefit cap anduc_deductions. A debt deduction can therefore raise the modelled reduction by up to 20p per £1 in Merton, Kingston upon Thames and Westminster, or 25p in Newham. Where Merton already grants the full £2,600, as it does a claimant with no earnings, a £600 deduction leaves the reduction unchanged onmainand on this branch.legacy_council_tax_reductionnow countsuniversal_credit + uc_deductions, the award after the benefit cap and before deductions. The comment aboveuc_applicable_incomecites reg 81(1), SI 2013/383 reg 10, SI 2013/384 reg 10 and SI 2013/380 Sch 6 paras 2(1), 3(1)(a) and 11(5) beside the Default Scheme.legacy_council_tax_reduction. Oxford's formula importsapplicant_has_universal_creditalone, so this change leaves Oxford's figures, and its route on Assess Oxford Universal Credit applicants on Appendix 3 income #2794, unchanged.applicant_has_universal_creditunchanged; draft Treat income derived from capital as capital in the legacy means tests #1995 redefines it.uc_deduction_random_drawgives 1.0 outside data-built simulations), so calculators move only when a user enters deductions.Unless a row says otherwise, the household has a single person aged 35 in 2026 who earns £8,000, rents from the council at £7,800 and owes council tax of £2,600. The award comes to £8,498.80, and income exceeds the maximum amount by £3,600:
universal_creditmainThe model works in annual amounts and takes a deduction at DWP's 15% cap as 15% × £424.90 × 12 = £764.82 a year. The Secretary of State deducts by assessment period and rounds 15% × £424.90 = £63.735 to £63.74 (SI 2013/380 Sch 6 para 1(2)), or £764.88 over twelve assessment periods.
In the household with rent of £17,468.20, the model gives a maximum amount of £22,567 and an award before the cap of £18,167, and reduces the award by £1,200 to the £16,967 cap for a single person in Greater London. It deducts £764.82 and leaves £16,202.18 payable. Without the deduction the model leaves £16,967 payable, and Merton grants £2,120 either way. Under the 85% floor, the model meets the £764.82 deduction first and applies none of the cap reduction, so Merton counts the £18,167 award.
Invariants
The property test checks these conditions in 2026 for generated working-age single people, couples and families with children on Universal Credit in the four councils. It draws benefit cap reductions from nil to more than the award, and deduction demands from nil through the 15% cap to an above-cap excess:
universal_credit + uc_deductionsequals the award after the cap,max(universal_credit_pre_benefit_cap - uc_benefit_cap_reduction, 0), and a family with deductions keeps at least a penny a month payable.allocate_uc_reductionscaps deductions at the award less the penny, so the sum recovers the award, including a nil award.max(0, liability × maximum support rate − withdrawal rate × max(0, earned income + unearned income + award − maximum amount)).Test plan
council_tax_reduction_universal_credit_deductions.yamlshows its arithmetic from the councils' schemes, UC Regs 2013 regs 22, 66, 72, 81 and 82 and Sch 4 paras 13 and 14, and DWP's 2026-27 rates.make formatequivalent on the changed Python files:ruff format --check,ruff check,ruff check --select F811,F821 policyengine_uk,git diff --check.changelog.d/2799.fixed.md.These local runs used Python 3.13 and no survey data, at this branch's head unless a line names another commit:
council_tax_reduction_universal_credit_deductions.yaml, 15 cases: 15 passed. Withmain's_legacy.py, 11 failed and 4 passed. The four cases without a deduction pass, and the eleven with one give themaincolumn above.test_four_councils_count_the_universal_credit_award_before_deductions(max_examples=15generated examples plus one explicit, 16 households each): 1 passed. Withmain's_legacy.pyit fails invariant 2: Merton's reduction for the issue's single person rises from £1,880 to £2,032.96 with a £764.82 deduction.policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/(23 files): 346 passed.test_benefit_cap_and_ctr_pension_age_properties.py: 2 passed atafeddde02, which differs from this head only in comments, the changelog and this PR's two test files.uc_deduction_random_drawgives 1.0,uc_has_deductionstays false anduc_deductionsstays nil, so the change leaves their figures unchanged. At5fff4ca73and21bc1163b, which differ from this head only in comments:test_council_tax_reduction_child_benefit_properties.py, 3 passed;test_council_tax_reduction_claimant_properties.py, 3 passed;test_council_tax_reduction_prescribed_benefits_properties.py, 4 passed;test_household_head_agreement_properties.py, 3 passed;test_legacy_award_readers_properties.py, 18 passed;test_pension_contribution_deduction_rate_properties.py, 2 passed;test_council_tax_reduction_claimant_family_scheme_properties.py, 3 passed.legacy_award_readers/council_tax_reduction_passports.yaml, 11 passed;test_isa_income_consumers.py, which builds a dataset in Westminster, 3 passed;test_council_tax_reduction_maintenance_wpa.py, 45 passed;test_non_dependant_spousal_maintenance.py, 4 passed;test_council_tax_reduction_applicant_properties.py, 2 passed.Each mutation of the fix ran at
dd39eafbbin a scratch copy outside the branch:universal_credit_pre_benefit_caplessuc_benefit_cap_reduction, the award after the gross cap rather than the cap the model applies, fails the 85% floor case (£2,120 against £1,880). The property test misses it, since it runs current law only.uc_unearned_incomeis nil fails the private pension and savings cases (£2,000 against £1,880). The property test misses it, since its households have no unearned income.universal_credit_pre_benefit_cap, the award before the cap, fails both benefit cap cases (£1,880 against £2,120) and the property test's invariant 3.Merge notes
git merge-tree --write-tree --name-onlyof this branch's head against:main(2da212abc), Assess Oxford Universal Credit applicants on Appendix 3 income #2794 (19378b97f), Report the benefit cap reduction actually applied to Universal Credit #2647 (c98c879a7), Gate supplied UC latent deduction rates on uc_has_deduction #2760 (16d06d8c2), and Fix HB and national CTR non-dependant deductions #2007 (02cc0896fand its current head97f792542): clean.1b8f2dede) and Charge non-dependant deductions within the claimant's benefit unit #2017 (3efa8bd60) also edit_legacy.py, which merges cleanly. Treat income derived from capital as capital in the legacy means tests #1995 conflicts withmainin six other files and Charge non-dependant deductions within the claimant's benefit unit #2017 in seven, the same with or without this branch.779f5dcfd) conflicts withmainintest_means_test_income_properties.py, and Count a non-dependant shared by joint tenants in each tenant's Housing Benefit size criteria #2035 (b435c91e2) in fourteen files,_legacy.pyamong them. This branch adds no conflicting file to either.#2760 makes
uc_deduction_ratecount a latent rate only whereuc_has_deductionholds, so the tests here set that flag wherever they supply a latent rate. Auc_deduction_rateentered directly bypasses that formula on both branches, andmainreads no flag on the latent path.Once #1995 lands,
applicant_has_universal_creditalso holds for an entitled claimant with nothing payable after the benefit cap or deductions, and thereuniversal_credit + uc_deductionsgives the award. If a user entersuc_deductionsabove the award, the model would then count more than the award: with #1995's predicate, a user who enters £9,000 against the £8,498.80 award gets a Merton reduction of £1,779.76, where the award itself gives £1,880.allocate_uc_reductionsnever produces that case, since it leaves at least a penny a month payable. This PR adds no bound, because a bound on computed entitlement could suppress a Universal Credit amount a user supplies. A calculator can instead refuse, at entry, deductions a user enters above the award.Reproducer:
policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_universal_credit_deductions.yaml;policyengine_uk/tests/test_council_tax_reduction_uc_deductions_properties.py::test_four_councils_count_the_universal_credit_award_before_deductionsaxiom: TheAxiomFoundation/rulespec-uk#521 queued
🤖 Generated with Claude Code