Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
211 commits
Select commit Hold shift + click to select a range
69b2703
Charge in-unit non-dependants in the local Council Tax Reduction schemes
MaxGhenis Oct 1, 2026
ab4022b
Apply the Pension Credit earnings disregards (SPC Regs 2002 Sch VI)
MaxGhenis Oct 1, 2026
570f163
Test the local schemes' non-dependants against an oracle and each cou…
MaxGhenis Oct 2, 2026
3d4f12b
Cap the Pension Credit earnings disregard at net earnings (review of …
MaxGhenis Oct 2, 2026
663a5b7
Apply the para 9(2)(d)-(e) exclusions to the person, whatever their f…
MaxGhenis Oct 3, 2026
b5567f4
Merge remote-tracking branch 'origin/main' into pc-earnings-disregard
MaxGhenis Oct 3, 2026
816a4e1
Tax earnings as the top slice on the person's schedule; carer entitle…
MaxGhenis Oct 4, 2026
7ef0352
Compute gross council tax from LA Band D amounts and band ratios
vahid-ahmadi Sep 15, 2026
9b6909c
Cover all 350 local authorities and both fiscal 2025 and 2026 Band D …
vahid-ahmadi Sep 26, 2026
283b0ae
Keep main's April 2023 unitaries in LocalAuthority; test Northern Ire…
vahid-ahmadi Oct 7, 2026
50c5171
Add PIP points-based assessment scaffold (#1069)
vahid-ahmadi May 6, 2026
24c3023
Type the changelog fragment as Added
vahid-ahmadi Oct 8, 2026
8b18c47
Rename changelog fragment to council-tax-computed-liability.added.md …
vahid-ahmadi Oct 9, 2026
bcdee62
Uprate additional State Pension and protected payments by September CPI
MaxGhenis Oct 11, 2026
368ebb0
Compare float32 model output with a float32 tolerance; pass rate refo…
MaxGhenis Oct 11, 2026
15bb98d
Separate the CPI scenario test from the triple lock; note the impact …
MaxGhenis Oct 11, 2026
cc47161
Merge remote-tracking branch 'origin/main' into pc-earnings-disregard
MaxGhenis Oct 12, 2026
4b9264f
Merge origin/main into asp-cpi-uprating-1941
MaxGhenis Oct 12, 2026
2fd0c7a
Merge origin/main into asp-cpi-uprating-1941
MaxGhenis Oct 12, 2026
4a6b736
Clarify the statutory uprating basis and forecast comparison
MaxGhenis Oct 12, 2026
5230dbc
Fix benefit cap exemption defects (#1818)
vahid-ahmadi Aug 13, 2026
4a5174c
Drop the strict xfail on the dividend benefit cap case now that #1818…
vahid-ahmadi Oct 8, 2026
7b1124e
Uprate three more columns, and guard the gap that hid them
vahid-ahmadi Sep 18, 2026
7ad7fa7
Address review: format the guard test, type the changelog fragment, c…
vahid-ahmadi Oct 7, 2026
d150116
Make the uprating exception guard fail on stale entries
vahid-ahmadi Oct 7, 2026
70e426c
Limit the AFIP benefit cap exception to the people the regulations name
vahid-ahmadi Oct 12, 2026
7ab0afa
Use published Ofwat bills for 2025-26 and 2026-27, and document both …
vahid-ahmadi Oct 12, 2026
d50ee85
Add twenty planning and validation docs pages in one batch
vahid-ahmadi Oct 12, 2026
d91b322
Measure Pension Credit net earnings as the statute does
MaxGhenis Oct 12, 2026
e9b20e5
Measure the cap's earned income per claimant and split AFIP by scheme
vahid-ahmadi Oct 12, 2026
60e5d00
Merge origin/main into uprate-four-remaining-columns
vahid-ahmadi Oct 14, 2026
7de51f6
Merge origin/main into council-tax-computed-liability
vahid-ahmadi Oct 14, 2026
facdab8
Reconcile with main's projection fallback and reg 77 inputs
vahid-ahmadi Oct 14, 2026
6c3f5d6
Update the changelog fragment for the merge with main
vahid-ahmadi Oct 14, 2026
01e90fe
Merge origin/main into fix/benefit-cap-exemption-defects
vahid-ahmadi Oct 14, 2026
54fa62d
Stack gains on taxable income when splitting the higher and additiona…
vahid-ahmadi Oct 15, 2026
eeaf911
Index the savings starting-rate limit after its freeze
juaristi22 Oct 16, 2026
f9f43d5
Apply Carer Support Payment earnings limit
juaristi22 Oct 17, 2026
312b572
Require minimum ages for carer benefits and DLA mobility
juaristi22 Oct 17, 2026
ecb9c8a
Fix participation periods, eligible bins and local random draws
juaristi22 Oct 17, 2026
3a195c3
Restrict ordinary ATI pension uplift to relief at source
juaristi22 Oct 17, 2026
bfc18db
Use public Core APIs for UK parameter caches
juaristi22 Oct 18, 2026
a132083
Retain UK parameter structure in cache lifecycle fixtures
juaristi22 Oct 18, 2026
750de13
Allocate the CGT annual exempt amount at the rate each schedule's top…
vahid-ahmadi Oct 18, 2026
1cee5b3
Bring the pension tax relief page in line with main's relief rules
vahid-ahmadi Oct 18, 2026
96526d1
Merge origin/main into fix/cgt-additional-band-stacking
vahid-ahmadi Oct 18, 2026
a6a9750
Hold gains fixed in the exemption allocation test
vahid-ahmadi Oct 18, 2026
4dfe70b
Keep the pension salary sacrifice cap within National Insurance
juaristi22 Oct 16, 2026
ba1508c
Preserve actual pension payments when integrating NI-only sacrifice cap
juaristi22 Oct 17, 2026
3531d11
Cover childcare and actual-return pension interactions
juaristi22 Oct 18, 2026
d5cd1da
Merge remote-tracking branch 'origin/main' into wt1661-oct18
vahid-ahmadi Oct 18, 2026
b28e8cf
Merge origin/main into uprate-four-remaining-columns
vahid-ahmadi Oct 18, 2026
f34503a
Uprate pension_contributions_via_salary_sacrifice_pre_2015 by average…
vahid-ahmadi Oct 18, 2026
5b6a38c
Keep carried-forward PIP categories when no points are supplied
vahid-ahmadi Oct 18, 2026
44d696c
Merge origin/main into fix/benefit-cap-exemption-defects
vahid-ahmadi Oct 18, 2026
ce3e0bc
Merge origin/main into fix/benefit-cap-exemption-defects
vahid-ahmadi Oct 18, 2026
0d8ed36
Refactor NI parameters into canonical marginal scales
juaristi22 Oct 17, 2026
e889563
Reject unsupported NI zero-band reforms
juaristi22 Oct 18, 2026
270be00
Merge origin/main into uprate-four-remaining-columns
vahid-ahmadi Oct 19, 2026
d7ed288
Correct three planning formulas and a broken link from review
vahid-ahmadi Oct 19, 2026
16d4c7b
Fix program registry model references
juaristi22 Oct 16, 2026
d6fe42c
Fix issues from review: narrow Benefit Cap registry prefix
juaristi22 Oct 19, 2026
56d21a8
Document domestic and overseas carbon flows
juaristi22 Oct 17, 2026
00b8e9b
Fix issues from review: clarify carbon footprint sources
juaristi22 Oct 19, 2026
2f75e2d
Apply annual employee NI for full-year category A directors in 2022
juaristi22 Oct 18, 2026
cd065c7
Clarify director NI propagation through the existing Class 4 cap
juaristi22 Oct 18, 2026
54b9f73
Fix issues from review: restore director NI source references
juaristi22 Oct 19, 2026
5bed599
Deduct allowable employment expenses from UC earnings
juaristi22 Oct 18, 2026
d08f26e
Fix issues from review: clarify UC expense scope and references
juaristi22 Oct 19, 2026
508fbcc
Set the CGT annual exempt amount pound by pound where it saves most
vahid-ahmadi Oct 19, 2026
c19ce75
Separate the £3,600 relief deduction from the £720 provider claim
vahid-ahmadi Oct 19, 2026
1bfd949
Merge origin/main into fix/cgt-additional-band-stacking
vahid-ahmadi Oct 19, 2026
9b00e43
Decide PIP categories from points per person
vahid-ahmadi Oct 19, 2026
a577eba
Keep Northern Ireland LHA rates off Great Britain freeze and percenti…
vahid-ahmadi Oct 19, 2026
7a5b559
Require runtime identity for aggregate-impact data comparisons
juaristi22 Oct 19, 2026
4044d6c
Fix recent residential SDLT purchase schedules and inclusive first-bu…
juaristi22 Oct 17, 2026
540f4e4
Clarify validation scope of SDLT chart caption
juaristi22 Oct 17, 2026
83ac102
Fix issues from review: refresh stamp duty example outputs
juaristi22 Oct 19, 2026
13a4442
Remove stored local-path warning from SDLT notebook
juaristi22 Oct 19, 2026
0207602
Expand Savings Credit regression coverage and metadata
juaristi22 Oct 19, 2026
893dcff
Merge current main into the NI-only pension salary-sacrifice fix
juaristi22 Oct 20, 2026
f81447a
Count IIDB, SDA and incapacity benefit in Council Tax Reduction income
MaxGhenis Oct 19, 2026
8fc098c
Count war pensions less £10 a week under the Kingston and Newham schemes
MaxGhenis Oct 19, 2026
b26748b
Test IIDB, SDA, IB and war pensions in Council Tax Reduction income
MaxGhenis Oct 19, 2026
f027311
Apply the Kingston and Newham war pension disregard at pension age too
MaxGhenis Oct 20, 2026
e135b13
Keep war pensions uncounted and count only the applicant's and partne…
MaxGhenis Oct 20, 2026
b224d1e
Label the Scottish Carer Support Payment exception in the GC boundary…
MaxGhenis Oct 20, 2026
b12bdf9
Fix inactive UC health-element counterfactual
juaristi22 Oct 20, 2026
e38883e
Count IIDB, SDA and IB for the Council Tax Reduction applicant and pa…
MaxGhenis Oct 20, 2026
33dabfd
Fix late LCWRA amount reform cache coherence
juaristi22 Oct 20, 2026
93e769f
Merge current main for LCWRA cache validation
juaristi22 Oct 20, 2026
5a8a179
Merge current main for ATI statutory-pay fixture compatibility
juaristi22 Oct 20, 2026
818e966
Fix statutory-pay pension relief fixture after main integration
juaristi22 Oct 20, 2026
1ae527d
Declare claimant and dependant roles in the CTR prescribed-benefit pr…
MaxGhenis Oct 20, 2026
a27f777
Merge commit '47642d1ee00e33f98affd32d47e7a5516e5e4bd8' into fix-2283…
juaristi22 Oct 20, 2026
63edffe
Merge remote-tracking branch 'origin/main' into docs-planning-batch
vahid-ahmadi Oct 20, 2026
0163a61
Count SSP and SMP in relevant UK earnings in the pension docs
vahid-ahmadi Oct 20, 2026
6659ebf
Update pension docs for the statutory annual allowance taper and carr…
vahid-ahmadi Oct 20, 2026
2ae2959
Preserve LCWRA wrapper provenance for benefit-cap exemptions
juaristi22 Oct 20, 2026
3c7f6bc
Correct the salary sacrifice NI earnings note
juaristi22 Oct 20, 2026
f120163
Pin the CI counterexample at the dependant age CI drew (19)
MaxGhenis Oct 20, 2026
5689fad
Merge commit 'e2ea32893' into pc-earnings-disregard
MaxGhenis Oct 20, 2026
9eb9aaf
Preserve late explicit inputs in Pension Credit tax counterfactuals
MaxGhenis Oct 20, 2026
7736d5f
Fix Pension Credit notional Class 2 profit base
MaxGhenis Oct 20, 2026
9e23ce7
Reuse Pension Credit earnings tax in UC housing branch
MaxGhenis Oct 20, 2026
a10ab0c
Pin protected mixed-age couple Pension Credit award
MaxGhenis Oct 20, 2026
efcc491
fix: update Pension Credit gross earnings fixtures and held tax inputs
MaxGhenis Oct 20, 2026
eaf03fb
Merge remote-tracking branch 'origin/main' into pc-earnings-disregard
MaxGhenis Oct 20, 2026
d157482
test: remove pre-netted Pension Credit child amount inputs
MaxGhenis Oct 20, 2026
4e08807
test: use gross earnings in Pension Credit passport fixtures
MaxGhenis Oct 20, 2026
3055d0c
test: hold Pension Credit personal reliefs in trading-loss invariant
MaxGhenis Oct 20, 2026
dcf8d54
docs: qualify Pension Credit earnings flatness for pension contributions
MaxGhenis Oct 20, 2026
e3b9330
Merge current main into pc-earnings-disregard for round 2 validation
MaxGhenis Oct 20, 2026
54b409d
ci: retain Python collection after policy YAML failures
MaxGhenis Oct 20, 2026
1d94053
State that BSP rates are held flat and note the War Widow's Pension s…
vahid-ahmadi Oct 20, 2026
22eecac
Preserve couple grouping and requested years after participation inte…
juaristi22 Oct 20, 2026
d7f1a43
Integrate CSP earnings validation with age-conditioned NI reader
juaristi22 Oct 20, 2026
315e374
Retain age and earnings conditions in stacked CSP integration
juaristi22 Oct 20, 2026
ffa476e
Fix inactive UC health counterfactual 2026 CPI anchor
codex Oct 20, 2026
370aade
Count CA earnings-limit pence in the model's float32 in the property …
MaxGhenis Oct 20, 2026
9cf93da
Merge pull request #2488 from PolicyEngine/fix-2486-ordinary-ati-net-…
juaristi22 Oct 20, 2026
9cb4395
Integrate current UC deductions with the inactive health counterfactual
codex Oct 20, 2026
78f480f
Merge pull request #1863 from PolicyEngine/uprate-four-remaining-columns
juaristi22 Oct 20, 2026
b7ac5ea
Fix historical income-tax band thresholds
juaristi22 Oct 20, 2026
3b466a0
Pin the 2026 penny-over outcome and cover a trading loss
MaxGhenis Oct 20, 2026
c741489
Merge origin/main (76cfc9e79: #2078) into ctr-income-prescribed-benefits
MaxGhenis Oct 20, 2026
4e495b7
Merge origin/main (76cfc9e79) into asp-cpi-uprating-1941
MaxGhenis Oct 20, 2026
4b996b5
Keep the bus fare cap schedules on their calendar dates
juaristi22 Oct 20, 2026
f1b2909
Label the per-recipient growth as pre-fix; state the forecast-year fl…
MaxGhenis Oct 20, 2026
fa27e49
Drop an unverified contracted-out note from the State Pension docs
MaxGhenis Oct 20, 2026
f669da0
Merge pull request #2493 from PolicyEngine/fix-721-director-ni-2022
juaristi22 Oct 20, 2026
7a8750c
Merge pull request #2506 from PolicyEngine/fix-2499-data-axis-runtime…
juaristi22 Oct 20, 2026
d6a8b82
Merge pull request #2443 from PolicyEngine/fix-2116-program-registry
juaristi22 Oct 20, 2026
e6ca569
Merge pull request #2477 from PolicyEngine/fix-2245-sdlt-purchase-his…
juaristi22 Oct 20, 2026
7b6980b
Merge pull request #2482 from PolicyEngine/fix-478-carbon-flow-docs
juaristi22 Oct 20, 2026
07985ed
Merge pull request #2495 from PolicyEngine/fix-2175-parameter-cache-apis
juaristi22 Oct 20, 2026
7b92389
Move bus fares with the published fares index by area and year
juaristi22 Oct 20, 2026
b096877
Price bus fare cap changes from a fitted table of uncapped single fares
juaristi22 Oct 20, 2026
dec3d00
Integrate captured main for the Universal Credit counterfactual fix
juaristi22 Oct 20, 2026
d32849c
Test a head who applies alone with her own State Pension and IIDB
MaxGhenis Oct 20, 2026
60b09a4
Update package version
github-actions[bot] Oct 20, 2026
773747c
Merge remote-tracking branch 'origin/main' into wt1820-oct21
vahid-ahmadi Oct 20, 2026
df4b886
Merge remote-tracking branch 'origin/main' into HEAD
vahid-ahmadi Oct 20, 2026
e4e01ed
Merge origin/main (60b09a4e5: #2488, #1863) into ctr-income-prescribe…
MaxGhenis Oct 21, 2026
6990350
Update package version
github-actions[bot] Oct 21, 2026
b814f50
Merge pull request #2462 from PolicyEngine/fix-2454-nics-salary-sacri…
juaristi22 Oct 20, 2026
81cbb70
Update package version
github-actions[bot] Oct 21, 2026
629c87c
Merge pull request #2512 from PolicyEngine/ctr-income-prescribed-bene…
MaxGhenis Oct 21, 2026
9dcd1cc
Merge-fix: AFIP earns no UC disabled child addition in the young-pers…
vahid-ahmadi Oct 21, 2026
a5cbe7d
Update package version
github-actions[bot] Oct 21, 2026
1fac3a5
Merge pull request #2019 from PolicyEngine/pc-earnings-disregard
MaxGhenis Oct 21, 2026
68ce6a6
Update package version
github-actions[bot] Oct 21, 2026
0fb7c52
Restate list-valued parameters only through routes that accept lists
vahid-ahmadi Oct 21, 2026
ddede0b
Say which coverage the trading-loss example adds
MaxGhenis Oct 21, 2026
b3d5718
Merge pull request #2452 from PolicyEngine/fix-2431-savings-starting-…
juaristi22 Oct 21, 2026
9387f49
Derive the UC benefit cap earnings threshold from the national living…
juaristi22 Oct 20, 2026
38cc9c4
Give the old-rules reference the new earnings threshold, and pin a fa…
juaristi22 Oct 20, 2026
7bb21ef
Use one relevant-earnings rule for pension relief and adjusted total …
juaristi22 Oct 20, 2026
628a51d
Uprate water and sewerage charges by country
juaristi22 Oct 20, 2026
ffbe123
Read each water series by its path; cover water in the fingerprint te…
juaristi22 Oct 20, 2026
35bec9c
Defined-benefit input and a carry-forward default for the annual allo…
juaristi22 Oct 20, 2026
ed1902c
Fix carry-forward at nil in the UC deductions case; document how supp…
juaristi22 Oct 20, 2026
70ef5a7
Uprate water charges by country instead of through the Ofwat list
juaristi22 Oct 20, 2026
baf2d54
Address review: keep stored carry-forward to its own year, state the …
juaristi22 Oct 20, 2026
8a4c67d
Merge pull request #2534 from PolicyEngine/ca-earnings-limit-float32-…
MaxGhenis Oct 21, 2026
4ed5990
Update package version
github-actions[bot] Oct 21, 2026
c0c010d
ci: split the Python tests over five shards instead of four
vahid-ahmadi Oct 21, 2026
6a4192d
Address review: pin the BUS0415a vintage and report what the fit leav…
juaristi22 Oct 21, 2026
7cbdc2b
Update package version
github-actions[bot] Oct 21, 2026
3a03cb4
Merge pull request #2536 from PolicyEngine/fix-2523-survey-pensions-u…
juaristi22 Oct 21, 2026
1ea81b8
Integrate NI scale migration with current model contracts
juaristi22 Oct 21, 2026
07534c3
Update package version
github-actions[bot] Oct 21, 2026
ce0ee44
Merge pull request #2547 from PolicyEngine/ci/test-shards-5
vahid-ahmadi Oct 21, 2026
c9f05a2
Merge pull request #2433 from PolicyEngine/fix/cgt-additional-band-st…
vahid-ahmadi Oct 21, 2026
1ef4df9
Merge pull request #2386 from PolicyEngine/docs-planning-batch
vahid-ahmadi Oct 21, 2026
d1a3c5f
Merge pull request #2503 from PolicyEngine/fix/2502-ni-lha-gb-params
vahid-ahmadi Oct 21, 2026
1c42168
Merge pull request #1661 from PolicyEngine/vahid-ahmadi/issue-1069-pi…
vahid-ahmadi Oct 21, 2026
88fd2be
Merge origin/main into fix/benefit-cap-exemption-defects
vahid-ahmadi Oct 21, 2026
763d21d
Update package version
github-actions[bot] Oct 21, 2026
4425252
Merge origin/main into council-tax-computed-liability
vahid-ahmadi Oct 21, 2026
72d4aa7
Update package version
github-actions[bot] Oct 21, 2026
ac43212
Scope legacy-benefit closure to each award owner
juaristi22 Oct 21, 2026
4de0922
Merge pull request #2546 from PolicyEngine/bus-fares-index-cap-saving…
juaristi22 Oct 21, 2026
ecd5317
Update package version
github-actions[bot] Oct 21, 2026
02f8024
Fix issues from review: preserve reported legacy awards
juaristi22 Oct 21, 2026
825a6fa
Merge commit 'ecd531776efeb15f30678ce2f143c773c202f251' into fix-2395…
juaristi22 Oct 21, 2026
6a67498
Merge pull request #2336 from PolicyEngine/asp-cpi-uprating-1941
MaxGhenis Oct 21, 2026
0878d8d
Update package version
github-actions[bot] Oct 21, 2026
799d1c6
Merge pull request #2476 from PolicyEngine/fix-1836-participation-cor…
MaxGhenis Oct 21, 2026
c72e5c4
Merge pull request #2521 from PolicyEngine/fix-2283-inactive-lcwra-co…
MaxGhenis Oct 21, 2026
09a236a
Merge pull request #1820 from PolicyEngine/fix/benefit-cap-exemption-…
MaxGhenis Oct 21, 2026
9dcfe33
Merge pull request #2549 from PolicyEngine/fix-2395-legacy-closure-scope
MaxGhenis Oct 21, 2026
d8d873c
Merge pull request #2490 from PolicyEngine/refactor-222-ni-scale-para…
MaxGhenis Oct 21, 2026
7cf97d1
Merge pull request #2519 from PolicyEngine/test-savings-credit-review…
MaxGhenis Oct 21, 2026
6ac87fb
Merge pull request #2494 from PolicyEngine/fix-1997-uc-employment-exp…
MaxGhenis Oct 21, 2026
57ff0e3
Merge pull request #2473 from PolicyEngine/fix-2345-csp-earnings-limit
MaxGhenis Oct 21, 2026
7918fc2
Update package version
github-actions[bot] Oct 22, 2026
a67aeb7
Merge pull request #1855 from PolicyEngine/council-tax-computed-liabi…
MaxGhenis Oct 21, 2026
a8b2848
Update package version
github-actions[bot] Oct 22, 2026
0a1b032
Merge pull request #2539 from PolicyEngine/fix-2356-historical-tax-band
MaxGhenis Oct 21, 2026
582b863
Update package version
github-actions[bot] Oct 22, 2026
7cf7194
Merge pull request #2474 from PolicyEngine/fix-1793-benefit-minimum-ages
MaxGhenis Oct 22, 2026
9d81a5d
Update package version
github-actions[bot] Oct 22, 2026
cdac9e4
Merge #2017 at 3efa8bd60: CTR applicant identity, #2007's helpers and…
MaxGhenis Oct 22, 2026
f526307
Merge main at 9d81a5dfa
MaxGhenis Oct 22, 2026
682a98f
Test the local Universal Credit exemption on each person's own earnin…
MaxGhenis Oct 22, 2026
f4589b9
Exclude a non-dependant personally only as a joint tenant or a lodger…
MaxGhenis Oct 22, 2026
187a059
Deduct for each member of a Universal Credit couple in Westminster, a…
MaxGhenis Oct 22, 2026
aaf01f9
Test the close-relative presumption across the schemes and restate th…
MaxGhenis Oct 22, 2026
1a71c4a
Settle #2078's provisional grandmother cases now that in-unit non-dep…
MaxGhenis Oct 22, 2026
cf0475d
Cite what the Default Scheme defines for being on each award
MaxGhenis Oct 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 7 additions & 0 deletions .github/test_outcome_allowlist.toml
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,10 @@ nodeid = "policyengine_uk/tests/test_dwp_published_rates.py::test_projection_con
outcome = "skipped"
reason = '^(not uprated|series ends before 2026-27|Universal Credit Act 2025 s\.1 departs from CPI uprating)$'
why = "The test is parametrised over every DWP rate parameter and skips those it does not apply to: parameters with no uprating, series that end before 2026-27, and the four UC standard allowances, whose minimum the Universal Credit Act 2025 s.1 sets above CPI uprating (#1925). The LCWRA element, frozen by s.3, is checked against its own uprating index (#2284). 64 cases on 12 October 2026."

[[allow]]
nodeid = "policyengine_uk/tests/microsimulation/test_annual_allowance_against_hmrc.py::test_2024_annual_allowance_charge_and_payers_are_near_hmrc"
outcome = "xfailed"
reason = "policyengine-uk-data#606"
data = ["present"]
why = "Known data gaps, chiefly PolicyEngine/policyengine-uk-data#606: the certified Enhanced FRS imputes employer pension contributions as three times employee contributions, which puts the 2024 annual allowance count, charge and excess several times above HMRC's; with a third of those contributions all three fall within the band. Pinned by a strict xfail until the data is fixed (#2523)."
2 changes: 1 addition & 1 deletion .github/workflows/pr_code_changes.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ jobs:
run: uv pip install policyengine --system
- name: Test documentation builds
run: make documentation
# The YAML tests, the Python tests on four runners, and the check that
# The YAML tests, the Python tests on five runners, and the check that
# every test ran once and passed, in the locked environment. As one job
# they took 59 minutes on 10 October 2026 (run 38075384588), and runs were
# cancelled at a 60-minute limit (issues #2099 and #2257). The release
Expand Down
20 changes: 15 additions & 5 deletions .github/workflows/test-suite.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
# publish. All three run the same jobs in the same locked environment.
#
# Jobs: the YAML policy tests (which also list every Python test), the Python
# tests split over four runners, and Result, which fails unless every listed
# tests split over five runners, and Result, which fails unless every listed
# Python test ran in exactly one shard and passed, apart from the outcomes
# accepted in .github/test_outcome_allowlist.toml. A caller that names its job
# Test gets the checks "Test / YAML", "Test / Python K/4" and "Test / Result";
# Test gets the checks "Test / YAML", "Test / Python K/5" and "Test / Result";
# "Test / Result" is the one to require.

name: Test suite
Expand Down Expand Up @@ -82,6 +82,9 @@ jobs:
TESTS: ${{ steps.env.outputs.tests }}
run: policyengine-core test "$TESTS/policy" -c policyengine_uk
- name: List the Python tests
id: collect
# Keep Result's coverage audit available after a policy YAML failure.
if: ${{ !cancelled() && steps.env.outcome == 'success' }}
# Every Python test, collected without --shard, in the environment
# the shards use. Result checks that the shards ran each of these
# exactly once.
Expand All @@ -99,6 +102,7 @@ jobs:
--collect-only -q -p no:cacheprovider > collected.txt
tail -n 1 collected.txt
- name: Upload the list of Python tests
if: ${{ !cancelled() && steps.collect.outcome == 'success' }}
uses: actions/upload-artifact@v7
with:
name: test-collected
Expand All @@ -118,17 +122,23 @@ jobs:
# the 16 GB runners peaked at 15.6 GB, 283 MB short of running out
# (run 38156967136; two shards of an earlier run lost their runners).
# With four, each worker runs about a quarter fewer tests.
#
# Five, not four, for time: on 20 and 21 October shard 1/4 took 50 to
# 52 minutes on unrelated pull requests, close to the timeout. A pull
# request adding about a fifth more parameters (#1855) hit the timeout
# on shard 1/4 twice, and its other shards took 48 to 59 minutes (run
# 39568525017).
name: Python ${{ matrix.shard }}/${{ strategy.job-total }}
if: ${{ !inputs.skip }}
runs-on: ubuntu-24.04-arm
# The shards took 15, 20 and 15 minutes on 10 October (run
# 38085920460). 60 minutes leaves room for a slow runner and still
# stops a hung shard.
# 38085920460), and up to 52 minutes with four shards on 21 October.
# 60 minutes leaves room for a slow runner and still stops a hung shard.
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
shard: [1, 2, 3, 4]
shard: [1, 2, 3, 4, 5]
steps:
- name: Checkout repo
uses: actions/checkout@v6
Expand Down
187 changes: 187 additions & 0 deletions CHANGELOG.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ test-yaml:

# Every Python test, serially. To spread them over four cores add
# PYTEST_ARGS="-n 4 --dist worksteal" (pytest-xdist); to run what one CI
# shard runs, add "--shard K/4" (policyengine_uk/tests/conftest.py). CI runs
# shard runs, add "--shard K/5" (policyengine_uk/tests/conftest.py). CI runs
# these tests through .github/workflows/test-suite.yaml, in the locked
# environment (uv sync --frozen --extra dev), and also checks each test's
# outcome against .github/test_outcome_allowlist.toml.
Expand Down
1 change: 1 addition & 0 deletions changelog.d/2014-local.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Charge non-dependant deductions in the English working-age local Council Tax Reduction schemes (Merton, Kingston upon Thames, Newham, Westminster, Oxford) as the national schemes do: for adults in the applicant's own benefit unit (the applicant identified as for the means test, so a grandmother who applies alone is charged for the couple in her benefit unit), separately for each adult in another family who is not its claimant or partner, and apportioned between jointly liable applicants. Band a claimant or partner on the couple's joint income and anyone else on their own, each on their own hours; exempt a non-dependant on Income Support, income-based JSA, income-related ESA or State Pension Credit only if the award is payable to them, and one on Universal Credit only if they have no earned income of their own; and deduct for each member of a Universal Credit couple in Westminster, as the Default Scheme does. In every scheme, national and local, someone who pays the householder for their own board or lodging, or is a joint tenant, is not a non-dependant even where the rest of their family is, except a member of the household head's own family who pays board, who is taken to be a close relative.
81 changes: 81 additions & 0 deletions docs/book/assumptions/benefit-minimum-ages.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# Benefit minimum ages

Computed Carer's Allowance, Carer Support Payment (CSP) and Disability Living
Allowance (DLA) mobility awards apply these minimum ages to each person's existing
annual `age` input:

| Computed benefit | Minimum age |
| --- | ---: |
| Carer's Allowance | 16 |
| CSP | 16 |
| Higher DLA mobility component | 3 |
| Lower DLA mobility component | 5 |

The Carer's Allowance condition appears in section 70(3) of the
[Great Britain Act](https://www.legislation.gov.uk/ukpga/1992/4/section/70) and its
[Northern Ireland counterpart](https://www.legislation.gov.uk/ukpga/1992/7/section/70).
CSP's condition is in
[regulation 4(1)](https://www.legislation.gov.uk/ssi/2023/302/regulation/4).
The DLA mobility ages and corresponding higher/lower routes appear in sections
73(1), (1A) and (11) of the
[Great Britain Act](https://www.legislation.gov.uk/ukpga/1992/4/section/73) and
[Northern Ireland Act](https://www.legislation.gov.uk/ukpga/1992/7/section/73).
Other qualifying conditions remain necessary. These gates do not implement a full
eligibility assessment or change education, caring, disability, duration, upper-age
or programme-replacement rules.

## Reported inputs and amount overrides

A positive `carers_allowance_reported` value or sufficient caring hours cannot
bypass the age condition in the computed CA/CSP pre-overlap amount. A DLA mobility
category similarly cannot bypass its category's age condition. The raw reported
amounts and categories remain stored inputs.

Explicitly supplying a pre-overlap or final amount keeps the model's generic input
override behavior. For example, an explicit `carers_allowance` or `dla_m` amount
can override its formula. Such an override is not evidence of statutory
entitlement. Report-only positive carer cases also preserve an existing proxy;
reported receipt does not legally waive the qualifying-care requirements.

DLA care has no categorical minimum-age floor. Its separate needs, duration and
child-comparison conditions still apply, as set out in
[section 72](https://www.legislation.gov.uk/ukpga/1992/4/section/72) and its
[Northern Ireland counterpart](https://www.legislation.gov.uk/ukpga/1992/7/section/72).
A care category for an infant assumes those conditions; it is not automatic
entitlement. DLA totals continue to add the care and mobility components.

## Dates and the annual model

The CA age parameter begins on 1 January 2015 as the model's existing coverage
anchor. This is not a claim that the legal age condition commenced in 2015.
CSP's raw age parameter starts on 19 November 2023, the commencement of regulation
4. The DLA mobility parameters start on 9 April 2001, as recorded in the Acts'
amendment annotations. These dates do not fill missing historical benefit rates
or expand the existing Scottish CA-to-CSP model switch from 2025.

`age` is a Person/YEAR floating-point stock, with an existing default of 40 when
omitted. The gates compare it directly, without flooring or rounding fractional
ages. Awards retain the existing annual rate-times-52 convention. They do not
calculate exact birthdays, part-year awards or award weeks. In particular, this
does not newly implement CSP regulation 4(2)'s leap-day birthday rule.

At the unchanged 2026 rates, an otherwise qualifying carer aged 16 receives
£4,495.40 before overlap; an under-16 computed award is zero. Higher and lower DLA
mobility amounts are respectively £4,160 and £1,575.60 annually once the relevant
age floor is met. These conditional examples do not estimate a population effect
or establish independently encoded parity.

## Combined CSP conditions

This change is stacked on the repaired [PR #2473](https://github.com/PolicyEngine/policyengine-uk/pull/2473).
Both the age condition and the earnings condition apply to computed CSP, including
the reported-Carer’s-Allowance input proxy. Natural-pay cases combine age15,
fractional ages below16, age16, the exact annual earnings limit and favorable
fractional-penny treatment. The shared reader retains merged [PR #2444](https://github.com/PolicyEngine/policyengine-uk/pull/2444)
NI-age deductions. Existing annual/award-week, PAYE and care-charge qualifications
remain in the [CSP earnings assumptions](carer-support-payment-earnings.md).

Only after #2473 actually merges should this branch be retargeted and revalidated
on current main; a queue entry or passing checks do not establish that landing.
The shared-parameter change in open [PR #2518](https://github.com/PolicyEngine/policyengine-uk/pull/2518)
requires future CSP-reader/prose coordination; it is not copied or repaired here.
133 changes: 133 additions & 0 deletions docs/book/assumptions/capital-gains-distribution-plan.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
# Capital gains distribution

```{note}
**Planning page, updated October 2026.** Tracks
[#818](https://github.com/PolicyEngine/policyengine-uk/issues/818)
(model gains jointly across income groups) and
[#817](https://github.com/PolicyEngine/policyengine-uk/issues/817)
(don't impute gains to households with no wealth). The imputation lives
in the data build, not in this repo. Most of what this page proposed
in May 2026 has since been built in
[Microcosm UK](https://github.com/PolicyEngine/microcosm), which builds
the replacement for the Enhanced FRS. The certified UK default dataset is
still the Enhanced FRS from
[policyengine-uk-data](https://github.com/PolicyEngine/policyengine-uk-data)
(release 1.58.0). What remains is listed at the end of this page.
```

## How the model uses capital gains

`capital_gains_before_response` is a person-level input, uprated by OBR
per-capita GDP growth. `capital_gains_tax` charges it at the main CGT
rates, with three components charged at their own rates (all added by
[#1861](https://github.com/PolicyEngine/policyengine-uk/pull/1861)):

- `capital_gains_badr`: gains qualifying for Business Asset Disposal
Relief or Investors' Relief, at the relief rate up to the lifetime
limit;
- `capital_gains_residential_property`: gains on UK residential
property, at the residential rates;
- `capital_gains_carried_interest`: carried interest, at the carried
interest rates.

Each is a component of the total, not an addition to it.

Behavioural responses: `capital_gains_behavioural_response` changes
realisations using an elasticity with respect to the retention rate
(`relative_capital_gains_retention_rate_change`) or the marginal tax
rate. Gains use `gov.simulation.capital_gains_responses.elasticity`,
which is 0 by default, so there is no response unless a user sets it.
When `gov.simulation.capital_gains_responses.separate_badr_elasticity`
is true (false by default), gains qualifying for BADR respond at
`badr_elasticity` instead (1.4, the value the OBR used for these gains
in its January 2025 costing), through `capital_gains_badr_elasticity`.

## How the gains are imputed

### Enhanced FRS: one distribution per income band

The Enhanced FRS (policyengine-uk-data, the certified default) fits a
spline to the Advani and Summers gains percentiles within each income
band and draws each household's gains from its band. The spline alone
cannot produce gains above about £2m, so policyengine-uk-data main (not
yet in a release) also stacks 30 donor households per HMRC
size-of-gain band and calibrates to HMRC counts and amounts of gains by
band. #818 pointed out the problems with the
band-by-band fit:

- each band's upper tail was fitted on few observations, so the tails
were noisy and the joint distribution of income and gains had breaks
at band boundaries;
- two people in the same band drew from the same distribution however
different their incomes;
- gains depended on income only, not on wealth, so they could be
imputed to households with no assets (#817).

### Microcosm UK

Microcosm builds gains in six stages (see the UK
[sources specification](https://github.com/PolicyEngine/microcosm/blob/main/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml)):

1. **Support split** (`cgt_support_split`). Within each income band of
HMRC Capital Gains Tax statistics Table 3, the households with the
most investable wealth (financial wealth, business wealth and
property other than the main home) are split into lighter copies, so
that there are enough rows to hold the largest gains.
2. **Who has gains** (`cgt_incidence_clone`). The set and order of
gainers come from the incidence distribution in Advani and Summers
(2020), *Capital Gains and UK Inequality* (CAGE Working Paper 465).
3. **How much** (`hmrc_cgt_gains_spine`). Amounts are redrawn so that
gains match HMRC Table 3 for 2024-25, which counts taxpayers and
gains **jointly by size of gain and taxable income**, conditioned on
Tables 1, 2.1a, 5 and 6.
4. **Weight anchor** (`cgt_incidence_anchor`). Clones below the annual
exempt amount carry more weighted people than HMRC publishes, so the
excess weight is moved back to each clone's paired original.
5. **Residential property** (`cgt_residential_split`). Gains on UK
residential property are fitted to Table 8 (2024-25 residential
property disposals) by splitting households into weighted copies,
which fills `capital_gains_residential_property`.
6. **What kind** (`hmrc_cgt_asset_type_spine`). Of the remaining gains,
those qualifying for BADR or Investors' Relief are fitted to Table
4.1, which fills `capital_gains_badr`, and the rest are given asset
types from Table 7 (gains by asset type, 2023-24).

All the HMRC tables come from the Capital Gains Tax statistics July
2026 release, through Microcosm's pinned Chronicle feed.

Against #818: gains are now fitted to the published joint distribution
of gain size and taxable income, not band by band. Against #817:
the largest gains are placed on the wealthiest households in each
income band. Microcosm's release checks also include a projection check
on people just below the annual exempt amount
(`uk_cgt_projection_entrants` in `gates.json`), so that
uprating does not push implausible numbers of them into paying CGT in
later years.

## What is left

- **A zero-wealth test.** Add a test, here or in Microcosm, that no
positive gains sit on households with zero investable wealth. Neither
repo asserts this directly yet, so #817 should stay open until it
does.
- **Close #818** once a Microcosm UK dataset is the certified default
and its diagnostics confirm the Table 3 fit; link them from the issue.
- **Elasticities by group.** Responses use one main elasticity and one
BADR elasticity. With the joint distribution in place, an elasticity
that varies by income or size of gain becomes possible, at the cost
of more parameters to justify.
- **Wealth source.** Investable wealth comes from Microcosm's Wealth
and Assets Survey imputation. Its quality limits how well #817 can be
met.

The quantile regression forest approach proposed here in May is no
longer needed for this.

## References

- Issues: [#818](https://github.com/PolicyEngine/policyengine-uk/issues/818), [#817](https://github.com/PolicyEngine/policyengine-uk/issues/817).
- CGT components: [#1861](https://github.com/PolicyEngine/policyengine-uk/pull/1861).
- HMRC, [Capital Gains Tax statistics](https://www.gov.uk/government/statistics/capital-gains-tax-statistics).
- Advani, A. and Summers, A. (2020), *Capital Gains and UK Inequality*, CAGE Working Paper 465.
- Microcosm UK [sources specification](https://github.com/PolicyEngine/microcosm/blob/main/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml) (stages `cgt_support_split`, `cgt_incidence_clone`, `hmrc_cgt_gains_spine`, `cgt_incidence_anchor`, `cgt_residential_split`, `hmrc_cgt_asset_type_spine`).
- OBR (2025), [Costing of changes to the main, BADR and IR rates of capital gains tax](https://obr.uk/docs/dlm_uploads/CGT-supplementary-release-Jan-2025.pdf).
Loading