Repository navigation
Assess Oxford Universal Credit applicants on Appendix 3 income - #2794
Conversation
Oxford's Council Tax Reduction scheme 2026-27 bands a working-age applicant who receives Universal Credit on Appendix 3's income: DWP's net earned income plus the Universal Credit awarded, with other income counted weekly. Its paragraphs 14 to 27, with their 50% share of pension contributions (para 18), apply only to applicants without Universal Credit. The model banded every working-age applicant on the paragraphs 14 to 27 income. oxford_council_tax_reduction_universal_credit_income adds Universal Credit's earned income before the work allowance (which deducts relievable pension contributions in full, UC Regs 2013 reg 55(5)(a)), its unearned income and the award, the three amounts the four other councils use. Oxford's award bands a Universal Credit applicant on a fifty-second of it, so a reform of Oxford's pension contribution share no longer moves them. Applicants without Universal Credit keep the same arithmetic. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Appendix 3 of Oxford's Council Tax Reduction scheme 2026-27 ignores £48.15 of the Universal Credit carer element and £84.46 of the disabled child element, the 2026-27 carer and disabled child premiums. Two Oxford parameters hold the weekly amounts. The Appendix 3 income ignores up to each amount for each carer element and each disabled child addition, taking it off the award but not below nil. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Hypothesis tests over generated Oxford families on Universal Credit: a reform of Oxford's pension contribution share leaves their reductions unchanged; the Appendix 3 income is DWP's net earned income, unearned income and the award less disregards bounded by the elements; the scheme's band table sets the reduction; more pension contributions never lower it; and the income equals the Universal Credit income Merton, Kingston upon Thames, Newham and Westminster use for the same family. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cite HB Regs 2006 Sch 3 para 20(7) and (8) for the carer and disabled child premiums being given for each carer and each disabled child. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Appendix 3 counts "the amount of Universal Credit awarded". The model's deductions for debts (uc_deductions) come out of the payment, not the award, so the Appendix 3 income adds them back and a reform of those deductions no longer moves Oxford reductions. The property tests now check the disregards exactly against DWP's 2026-27 additions, draw deduction rates, and recover the other councils' income net of deductions. The documentation names Universal Credit's assumed yield from capital as part of the other income, and the changelog says current-law reductions move. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Appendix 3 takes "All other unearned income" into account, and Appendix 5's Child Benefit and child maintenance disregards apply only to applicants without Universal Credit. A new Oxford parameter, universal_credit. other_income_sources, lists the receipts counted, with the reason for each: Child Benefit, child maintenance, the receipts in Universal Credit's unearned income, and the other unearned income Appendix 3 does not ignore. Universal Credit's assumed yield from capital and income derived from capital (para 30 and Annex 7) stay out. The income is the applicant's and partner's; a household head who applies alone counts only their own. The model holds Oxford's 2026-27 scheme, so universal_credit.in_effect turns the Appendix 3 route on from April 2026 and earlier years keep the results they had before. YAML cases work the income by hand for Child Benefit, child and spousal maintenance, a private pension, interest, dividends, rent, capital, two carers and a head applying alone, and pin 2024 and 2025 and reforms that move the start. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The income property now works other income from the family's own receipts and HMRC's Child Benefit rates, so counting Universal Credit's unearned income in its place fails it. A new property adds £520 of each kind of receipt and £1,000 of capital: receipts Universal Credit deducts leave the income unchanged, Child Benefit and child maintenance raise it by £520, interest leaves it unchanged, and capital lowers it by the rise in the assumed yield. Another checks that 2025 keeps the paragraphs 14 to 27 income. The generated families now carry child maintenance, interest and capital, and the changelog describes the other income and the start date. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The YAML cases' couple who both care and a claimant repaying debts join the Appendix 3 income property as an explicit example, so one carer disregard for the couple or the award after deductions fails it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Child Benefit variant supplies Child Benefit, and a variable supplied for some families reads as nil for the rest, so every family in the property now gets its Child Benefit at HMRC's rates as an input. The property also holds DWP's net earned income fixed between a family and its variant. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ement The model already counts miscellaneous income in DWP's net earned income, so Oxford's Appendix 3 other income no longer adds it a second time. Social Security Scotland pays the Scottish Carer Supplement with the carer support payment, including for 13 weeks after a carer moves to England (SSI 2023/302 regs 14A and 42), and Oxford City Council does not ignore it, so the list now counts it. New hand-worked YAML cases cover miscellaneous income, a regular Armed Forces Compensation Scheme payment, the supplement the model pays and a supplied 13 weeks of it, a carer support payment above DWP's cap, and the Appendix 3 income of a household head who applies alone. The parameter descriptions and the new variables' documentation name Oxford City Council and DWP as the actors and state the one-off receipts limit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A new property supplies each receipt to generated Universal Credit families, from a list written out from the scheme rather than read from the parameter. More of a receipt Oxford City Council counts raises other income by the whole amount, a carer support payment above DWP's cap included, and leaves DWP's net earned income alone. Miscellaneous income reaches only DWP's net earned income, income from capital reaches neither, and a child's receipts never count. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r and changelog The YAML file's header now gives the scheme's actions to Oxford City Council and DWP and notes that DWP applies no benefit cap to an award with a carer element (reg 83(1)(j)). The changelog fragment adds the Scottish Carer Supplement and miscellaneous income. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The model pays the supplement for 52 weeks whenever the carer support payment is positive, while Social Security Scotland pays it for each award week of Carer Support, at most 13 weeks after a move from Scotland (SSI 2023/302 regs 14A and 42). Drop the case that pinned the model's 52 weeks and supply the supplement in the two remaining cases, so a fix to scottish_carer_supplement moves no Oxford case. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add hand-worked 2026 cases for a younger partner's receipt, a 17-year-old's receipt, Personal Independence Payment, Attendance Allowance and Disability Living Allowance, a self-employed claimant under the minimum income floor, and a Carer's Allowance the model computes and reduces for Widowed Parent's Allowance. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
DWP counts miscellaneous income as unearned income (UC Regs 2013 reg 66(1)(m)); the model counts it in uc_individual_earned_income_before_mif (#1961). Correct the other-income documentation, and name the model as the actor that lists the sources. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Say the model reads bsp_reported and afcs_reported as regular payments, that a user enters a lump sum, and that the model, not the list, leaves receipts out. Name backdate_parameters as what carries the 2026-27 values back. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Break the other-income documentation, the parameter description and comments, the income variable's disability premium sentence and the changelog fragment into one thought per sentence. No formula, list entry or value changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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
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; standard reform costings (change in gov_balance); standard reforms: change in each reform's target. 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 19378b97fb7b139ca1df7d73b42451bd68e295f8. Complete review; no findings or material evidence gaps.
The 2026 Oxford UC route follows Appendix 3: full relievable pension contributions in DWP net earnings, the award before debt deductions, bounded element disregards and the separate other-income list. Earlier-year and non-UC behavior stays within the documented scope. Official scheme/statutory sources and the queued Axiom record were checked.
Validation: all 52 repository tests passed, including all seven new properties. Native final-output controls show the no-pension parent’s CTR and household income each fall £450 under the corrected route; the pension case uses the full contribution and the non-UC control is unchanged. Exact-head CI passed. Local Core 3.33.2 and locked-runtime hosted evidence are distinguished; private population effects and the declared baseline follow-ups remain outside this review.
#1995 moved the council_tax_reduction_relevant_income_based_benefit lookup in oxford_council_tax_reduction above its new capital rule. The merge keeps that lookup and this branch's Appendix 3 block without its second lookup. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
juaristi22
left a comment
There was a problem hiding this comment.
Re-reviewed 98a2e575520a5d8312b244f09af3b021fa88cb56 after the main merge. COMPLETE — requesting changes for C1, a failing required regression property.
test_oxford_council_tax_reduction_universal_credit_properties.py:671, in test_appendix_3_income_matches_the_other_councils_universal_credit_income, fails at this head. For the generated case with a 25-year-old parent earning £20,784.920404, two infants, no pension/other income/capital/housing costs and the test's £50,000 council tax, the Merton route implies income of £25,397.50, against the property's Oxford-based oracle of £24,632.670715 (tolerance £0.25). The complete generated case and failure were retained.
The property is unchanged, but the merged assessment paths no longer satisfy its cross-council equality assertion. Please reconcile the implementation/oracle with the merged routes and retain an appropriate regression. This is a confirmed test blocker; it does not establish that either council's cash assessment is legally wrong.
The focused current-head campaign completed with 76 passes and this one failure, with no skips. The native Oxford final CTR/household-income checks passed. Earlier passing evidence and pending hosted CI do not override this current failure.
juaristi22
left a comment
There was a problem hiding this comment.
Checked the updated description at unchanged head 98a2e575520a5d8312b244f09af3b021fa88cb56. The pre-debt UC wording and the capped/debt-nil-award route now accurately describe the merged code and Oxford Appendix 3. No new source or code finding.
C1 remains open; changes are still required. The cross-council property at test_oxford_council_tax_reduction_universal_credit_properties.py:671 and its oracle are unchanged. The previous exact-head result remains 76 passes and one failure; the description edit does not repair it. Please reconcile that required property with the merged assessment paths. This remains a test blocker, not a finding that either council's cash assessment is legally wrong.
The prior execution and source evidence were retained and checked; no tests or model calculations were repeated.
|
Picking this up for the UK hub. Reply here if you're mid-change and I'll stop. Generated by Claude Code |
Merton, Kingston upon Thames, Newham and Westminster now count the Universal Credit award before deductions for debts, as Oxford's Appendix 3 does, so the cross-council property no longer takes uc_deductions off Oxford's income. Add an explicit example of a claimant repaying debts at a quarter of the standard allowance. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6GC8zqh3aNDgFt3nd9
|
Generated by Claude Code |
|
Ready for hub review Head: Finding C1 (invariant 6 fails at
Runs at
Skipped: nothing on the brief's list. No test needed survey data. Judgment calls:
I posted
Generated by Claude Code |
|
Thanks for the re-review. C1 reproduces, and we fixed the test's oracle, with no change to any formula. Since #2822, In At |
juaristi22
left a comment
There was a problem hiding this comment.
Re-reviewed adopted head 2343a786174659e9e52a834af44808bdb4170e78. COMPLETE — C1 resolved; no open findings or material gaps.
The corrected property now compares the UC award before debt deductions on both sides, matching the unchanged production helpers. The changed property passed, including its added explicit debt example and existing generated examples. The explicit example reaches positive, uncapped readback assertions in all four councils: the corrected oracle misses by less than a penny, while the former subtraction would miss by about £1,274.69.
No formula, parameter or dependency changed. Unchanged passing cases and final-household evidence were retained; other property/council suites were not repeated. Approval awaits the remaining exact-head CI.
juaristi22
left a comment
There was a problem hiding this comment.
Approved current head 2343a786174659e9e52a834af44808bdb4170e78. COMPLETE — C1 remains resolved; no findings or material evidence gaps. Applicable current-head checks have passed.
The completed review of the adopted cross-council test correction is retained. Its fixed property passed with explicit and generated examples, including four positive CTR awards below their caps. The current passing result, prior production/final-result evidence and 11 original/source-extract pairs were integrity-checked. The earlier debt-subtraction oracle failure remains separately preserved as historical and resolved by the adopted correction.
No tests or calculations were repeated for this CI-only approval. The actual Axiom #513 record and the declared scope remain unchanged.
Fixes #2520
What and why
In its Council Tax Reduction Scheme 2026 to 2027, Oxford City Council divides working-age applicants into two groups and bands each on weekly income (Part 1 para 9).
In
oxford_council_tax_reductionthe model banded every working-age applicant oncouncil_tax_reduction_applicable_income, the paragraphs 14 to 27 income with Oxford's 50% share. So the model deducted half of a Universal Credit claimant's pension contributions instead of all of them, and left out their Child Benefit and child maintenance. A reform of Oxford's pension contribution share also moved their reduction.This PR makes five changes.
Appendix 3 income. The model adds three amounts in a new variable,
oxford_council_tax_reduction_universal_credit_income:uc_earned_income_before_work_allowance, DWP's net earned income after tax, National Insurance and relievable pension contributions, before the work allowance;oxford_council_tax_reduction_universal_credit_other_income, a new variable in which the model sums the applicant's and partner's receipts that it lists in a new parameter (below);universal_creditplusuc_deductions, the amount DWP awards before it takes deductions for debts out of the payment, less the element disregards and not below nil.For the four other councils (
_legacy.py), the model counts Universal Credit's own unearned income and, since Count the UC award before debt deductions in four councils' CTR #2822, the award before deductions for debts. This PR leaves_legacy.pyalone.Other income. The model lists its variables one by one in
gov.local_authorities.oxford.council_tax_reduction.universal_credit.other_income_sources, with the reason for each in the file.Disregards. The model holds the weekly amounts from 1 April 2026 in two Oxford parameters:
universal_credit.carer_element_disregard(£48.15) anduniversal_credit.disabled_child_element_disregard(£84.46).Start date. The model switches the route on from 1 April 2026 through
universal_credit.in_effect, which is false from 2015. The model reads each year's parameters at 30 April. So the Appendix 3 route starts in model year 2026, and in model years 2025 and earlieroxford_council_tax_reductiongives the results it gave before. A user can move the route with a reform ofin_effect. The model gates only the route this way. The list and the two disregards start on 1 April 2026, and the model carries them back to 2015 like its other Oxford parameters. So the two new variables still return Appendix 3 amounts for earlier years, though the reduction does not read them. In 2025, the new variables give a lone parent earning £15,600 with two children and £2,600 of child maintenance other income of £4,851.60 and Appendix 3 income of £27,833.34. Paragraphs 14 to 27 still set their reduction, £1,800.Banding and docs. In
oxford_council_tax_reductionthe model bands a Universal Credit applicant on a fifty-second of the Appendix 3 income. An applicant without Universal Credit keeps the same arithmetic, bit for bit, and the model still adds Oxford's tariff income only for them. This PR also rewrites the pension contribution share's variable and parameter documentation to name the applicants the share reaches.The model builds the award's maximum amount (
uc_maximum_amount) from the standard allowance and the child, disability, carer, housing and childcare elements, and nothing else. So the award holds no transitional element to remove.Earlier schemes. In its 2025-26 scheme Oxford City Council sets an Appendix 3 with the same income rule. It tops the bands at £500, £575, £650 and £700, ignores £46.40 of Carer's Allowance in place of the two element disregards, and includes no transitional-element sentence. The model applies the 2026-27 parameters to every earlier year, so this PR keeps earlier years on their previous results and does not model 2025-26. The council's 2024-25 scheme pages at the same address return 404.
Readings
uc_individual_earned_income_before_mif) and leaves it off the list, so it counts the income once. DWP counts miscellaneous income as unearned income (reg 66(1)(m)). If UC counts royalties, trust income and overseas pensions in miscellaneous_income as earned income #1961 moves the model's figure there, the model will take it off the award pound for pound, as DWP does, and must add it back to the list.bsp_reportedandafcs_reportedas regular payments and countsbspandafcswhole. If a user enters a lump sum in either input, the model counts it as income.uc_tariff_income, reg 72) and takes it off the award, but nobody receives it, so the model does not add it back. The council adds its own assumed income only under paragraphs 14 to 27 (para 15), and ignores capital "already taken into account when the applicant is receiving Universal Credit" (Appendix 6). So the council counts capital for these applicants only through the award DWP reduces. Oxford City Council publishes nothing on its practice for Child Benefit or capital beyond the scheme text.council_tax_reduction_applicable_incomedoes, so a younger partner's receipts count and a 17-year-old's do not. A household head who applies alone has no award, so the council assesses them under paragraphs 14 to 27 on their own income, without the benefit unit's Child Benefit.council_tax_reduction_universal_credit_award, which Treat income derived from capital as capital in the legacy means tests #1995 added).uc_deductions(the deductions for debts DWP takes from the payment), and a reform of those deductions does not move Oxford reductions. DWP applies the benefit cap to the award itself, so the model keeps the capped award.The model treats these receipts as follows:
child_benefitmaintenance_income(child maintenance received)spousal_maintenance_income,private_pension_income,state_pension,carers_allowance,carer_support_payment,jsa_contrib,esa_contrib,maternity_allowance,iidb,widowed_parents_allowance,incapacity_benefit,sdascottish_carer_supplementbsp,afcs,war_widows_pension,armed_forces_independence_payment,ssmg,healthy_start_vouchers,private_transfer_incomebspandafcsas regular paymentsincome_support,claimant_or_partner_jsa_income,claimant_or_partner_esa_income,tax_credits,pension_creditmiscellaneous_incomeuc_tariff_income, Oxford's tariff incomesavings_interest_income,other_investment_income,tax_free_savings_income,dividend_income,individual_savings_account_dividend_income,property_income,capital_gainsattendance_allowance,dla,pip,housing_benefit,council_tax_benefitcouncil_tax_benefitholds the reduction itself)statutory_sick_pay,statutory_maternity_pay,statutory_paternity_paywinter_fuel_allowance,winter_fuel_payment,cost_of_living_support_payment,energy_bills_rebate,household_energy_payment,epg_subsidystudent_loans,education_grants,student_payments,adult_dependants_grant,access_fundadult_emachild_emascottish_child_payment,two_child_limit_payment,pension_age_winter_heating_payment,pawhp; Guardian's AllowanceWhen a lone parent earning £15,600 with two children receives £520 more of a listed source in 2026, DWP's net earned income and the income tax DWP deducts from it stay the same. For each receipt DWP counts, DWP lowers the award by £520, and the Appendix 3 income stays the same. For each other listed source, the award stays the same and the Appendix 3 income rises £520. With Carer's Allowance, the model also adds the carer element (£2,512.08) to the award, and Oxford ignores £2,503.80 of it, so the Appendix 3 income rises £8.28. With the carer support payment, the model adds the carer element and also pays its £608.40 supplement, so other income rises £1,128.40 and the Appendix 3 income £616.68. The carer support payment gives Carer's Allowance's £8.28 only with the supplement held fixed. The model now counts miscellaneous income only in DWP's net earned income: £520 more raises that figure by £416 after income tax, lowers the award by £228.80 and raises the Appendix 3 income by £187.20.
This family shows none of three other routes:
Limits.
bspandafcswhole, so if a user enters a lump sum there, the model counts it as income.Overlap with other work
Of the 76 open pull requests, one touches this PR's files. #1966 (draft,
ctr-working-age-shortfall) conflicts with this branch in thecouncil_tax_reduction_pension_contribution_deduction_ratedocumentation: keep #1966's Wales and Scotland route and this PR's Oxford sentence. #1966 also conflicts withmainin three files this PR does not touch.We merged
mainatacba5efc1into this branch, bringing in #1995 and #2822. With #1995 the model ignores capital for Universal Credit and passported applicants under Appendix 6, and looks upcouncil_tax_reduction_relevant_income_based_benefitabove that rule inoxford_council_tax_reduction.py. We kept both in the merge, with this PR's Appendix 3 block below them and no second lookup.Invariants
Invariants 1 to 6 and 8 hold for every working-age Oxford family whose applicant has a Universal Credit award, from 2026. Invariant 7 covers earlier years, and invariant 9 families without an award.
origin/main's. A family with an award keeps the band of its paragraphs 14 to 27 income less Child Benefit, with no tariff income.origin/main. In 2026, every family not on Universal Credit getsorigin/main's Oxford reduction, bit for bit.Test plan
For policy changes: YAML tests whose expected values come from an external source.
oxford_council_tax_reduction_universal_credit.yamlholds 36 cases, andoxford_council_tax_reduction_universal_credit_earlier_years.yamlholds 9. Each case shows hand-worked arithmetic from the scheme text, DWP's and HMRC's rates for the year and the income tax and National Insurance rules, citing the paragraph.origin/main's results.origin/main's results for a single claimant, a parent with Child Benefit and a parent with child maintenance. They also check that reforms ofin_effectmove the route in 2025 and 2026.aa2f0a579(39.17 s and 82.37 s), and atd5403d70a, whose tests and model match. Every mutant in the table below fails at least one 2026 case, except two that agree with the code on every lawful input.Property tests:
test_oxford_council_tax_reduction_universal_credit_properties.pyholds 7 test functions, one for each of invariants 1 to 8 (invariants 2 and 3 share one). Each runs 5 generated populations plus its explicit examples, with Hypothesis derandomised. Every formula and every list entry stand as they did at290b095e6.2343a7861changes only invariant 6's test. Its oracle no longer takesuc_deductionsoff the Appendix 3 income, and the test gains an explicit example of a single claimant who repays debts at a quarter of the standard allowance.2343a7861, one-n 4run of the whole file: 7 passed in 167.18 s. The locality test took 114.28 s,test_more_pension_contributions_never_lower_the_reduction71.10 s,test_appendix_3_income_and_band43.82 s,test_pound_for_pound37.47 s,test_appendix_3_income_matches_the_other_councils_universal_credit_income36.81 s,test_each_receipt_counts_once33.42 s andtest_earlier_years_keep_the_paragraphs_14_to_27_income29.58 s.uc_deductions(£1,274.70), and passes with the oracle as it stands. The family keeps its award, and each other council's award falls below its maximum, so the test reads back its income at all four councils.test_each_receipt_counts_oncesupplies each of 31 receipts, written out from the scheme rather than read from the parameter, to the last adult of each generated family and, for person-level receipts, to the first child. With the new test file, it fails atae9bbabd1, this branch before the miscellaneous income and Scottish Carer Supplement changes: the supplement moves other income by £0, not £520. Onorigin/main(2da212abc) it fails on its first explicit example: "Variable oxford_council_tax_reduction_universal_credit_other_income does not exist".Mutations: each ran in its own copy of
d5403d70a, one at a time, under a 2 GB memory cap, against the 36 cases of the 2026 YAML file.uc_unearned_incometest_appendix_3_income_and_bandfails (290b095e6)uc_tariff_incomeadded to the listafcsremoved from the listtest_each_receipt_counts_oncefails onafcs(290b095e6)carer_support_paymentreplaced by DWP's cappeduc_unearned_carer_support_paymenttest_each_receipt_counts_oncefails (290b095e6)miscellaneous_incomeput back on the listtest_each_receipt_counts_oncefails (290b095e6)scottish_carer_supplementremoved from the listtest_each_receipt_counts_oncefails (290b095e6)pipandattendance_allowanceadded to the listtest_each_receipt_counts_oncefails onscottish_carer_supplement, which it supplies with no carer support payment (d5403d70a)tax_creditstaken off the listtest_each_receipt_counts_oncefails ontax_credits(7fa10f27e)The miscellaneous income and supplement removal mutants undo this PR's two list changes. Social Security Scotland pays the supplement only in weeks it pays the carer support payment (reg 14A), and no claimant receives tax credits beside Universal Credit. So no lawful YAML case tells the last two mutants from the code.
Differential against
origin/main(2da212abc), with this branch at7238eba63, on 400 generated Oxford households and 497 benefit units, for 2024, 2025 and 2026.numpy.random.default_rng(2520)draws one or two adults with earnings, pension contributions, self-employment, spousal maintenance, private pensions and carers. It adds up to two children, some disabled, a non-dependant in a quarter of households, housing costs and savings of 0 to 17,000, anddefault_rng(25200)adds child maintenance and interest.origin/main's Oxford reduction, and all 400 households its Council Tax Reduction, bit for bit.7fa10f27eits 2026 arrays for the reduction, the award, other income, Appendix 3 income and household Council Tax Reduction matchae9bbabd1's bit for bit.Existing tests:
test_parameter_descriptions.py, 24 passed ataa2f0a579. Atae9bbabd1, thepolicy/baseline/gov/local_authoritiesYAML tree passed 403 cases andtest_council_tax_reduction_applicant_properties.py2 tests. At7fa10f27e, the tree's 113 cases outsideoxford/that hold an Oxford household passed, and so didtest_council_tax_reduction_assesses_the_liable_head. Ataa2f0a579,test_head_applying_alone_matches_her_own_benefit_unit1 passed in 2,188.36 s. No Oxford case outsideoxford/holds miscellaneous income, a carer support payment or the supplement, so the later list changes cannot reach them. At2343a7861, thepolicy/baseline/gov/local_authoritiesYAML tree passed 429 cases in onepolicyengine-core testrun,test_council_tax_reduction_applicant_properties.py2 tests andcode_health3,150 tests.At
2343a7861,ruff format --check .,ruff check .andruff check --select F811,F821 policyengine_uk(ruff 0.17.2) pass, andgit diff --checkfinds nothing in the PR's diff. The branch merges withmainataf9361114without conflicts.Changelog fragment
changelog.d/2520.fixed.md.19378b97frewrites one variable's documentation and changes no code: its syntax tree, withdocumentationremoved, matchesaa2f0a579's.No survey data: every simulation uses hand-built situations.
Follow-ups: #2789 (Oxford's route before April 2026), #2790 (student income), #2791 (Scottish Carer Supplement weeks), #2792 (War Widow's Pension and the benefit cap) and #2793 (the ESA support component and the benefit cap).
Reproducer
Reproducer: policyengine_uk/tests/test_oxford_council_tax_reduction_universal_credit_properties.py::test_each_receipt_counts_once; policyengine_uk/tests/policy/baseline/gov/local_authorities/oxford/council_tax_reduction/oxford_council_tax_reduction_universal_credit.yaml; policyengine_uk/tests/policy/baseline/gov/local_authorities/oxford/council_tax_reduction/oxford_council_tax_reduction_universal_credit_earlier_years.yaml
axiom: TheAxiomFoundation/rulespec-uk#513 queued
🤖 Generated with Claude Code