Salary sacrifice above the April 2029 NI cap raises adjusted net income, but HMRC says the cap leaves ANI unchanged
I maintainer di solito rispondono entro 2 giorni
@juaristi22 ci sta già lavorando.
Dal 18/10/2026.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 57/100
Direzione di ricerca
Trace salary_sacrifice_returned_to_income, employee_pension_contributions, pension_contributions_relief and adjusted_net_income in the relevant UK policy variables, then find the YAML tests for this case. Check the 2029-30 behavior against the issue’s example: ANI should remain at £97,000 less the broad-base haircut, income tax should match 2028-29 rules, and NI should apply to £8,000 more earnings.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
What happens. From 6 April 2029, gov.hmrc.national_insurance.salary_sacrifice_pension_cap (£2,000) makes pension salary sacrifice above the cap subject to Class 1 NI. policyengine-uk models this by adding the excess (salary_sacrifice_returned_to_income) to employment_income. The same amount is added to employee_pension_contributions, and pension_contributions_relief gives the income tax relief. That relief enters allowances after adjusted_net_income, so ANI rises by the full excess.
What the law says. HMRC's policy paper, Salary sacrifice reform for pension contributions effective from 6 April 2029, says the measure changes Class 1 National Insurance only. It does not change salary sacrifice's effect on adjusted net income, and the paper names Tax-Free Childcare among the schemes unaffected.
Example (policyengine-uk 2.102.3). One parent with £97,000 employment income (employment_income_before_lsr) after £10,000 of pension salary sacrifice, and a two-year-old:
| 2028-29 | 2029-30 | |
|---|---|---|
salary_sacrifice_returned_to_income |
£0 | £8,000 |
adjusted_net_income |
£97,000.00 | £104,844.80 |
extended_childcare_entitlement_meets_income_requirements |
True | False |
tax_free_childcare_meets_income_requirements |
True | False |
So the parent loses the 30 funded hours and Tax-Free Childcare in 2029-30, although under the measure their ANI stays below £100,000. The personal allowance taper and the High Income Child Benefit Charge, which both read ANI, are affected in the same way.
Suggested fix. For income tax the sacrifice stays a sacrifice under the measure; only Class 1 NI changes. So the excess above the cap should enter NI-able earnings only, not employment_income, employee_pension_contributions or pension_contributions_relief. Excluding it from ANI alone is not enough: the model also gives the excess as pension relief, so deducting it again from ANI double-counts it. In a quick test, income tax fell by about £4,200 against the correct figure. A YAML test with the case above should hold ANI at £97,000 (less the model's broad-base haircut) in 2029-30, with income tax unchanged from 2028-29 rules and NI charged on £8,000 more earnings.
Found while costing the removal of the £100,000 childcare limit (PolicyEngine/uk-childcare-100k-threshold#1), which applies this correction locally until it is fixed upstream.
- Lingua principale
- Python
- Stelle
- 52
- Fork
- 34
- Merge medio
- 4g 1h
- PR unite (30g)
- 358
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di PolicyEngine/policyengine-uk
-
Follow-ups from #2160: qualifying-age docstring, UC work-related groups property-file speed, changelog fragment exampleForse già presa @juaristi22 l’ha presa 10 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
PolicyEngine/policyengine-uk#2162 ·
I maintainer di solito rispondono entro 2 giorni
-
Scottish Carer Supplement rate has no upratingForse già presa @MaxGhenis l’ha presa 23 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
PolicyEngine/policyengine-uk#1957 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
PolicyEngine/policyengine-uk#2675 ·
I maintainer di solito rispondono entro 2 giorni
-
Reported Council Tax Reduction is never uprated, so it covers less of the bill each projected yearAperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 68/100
PolicyEngine/policyengine-uk#2674 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
Fiscal partition: domestic_rates note gives only the council tax placement of NI domestic ratesForse già presa @MaxGhenis l’ha presa 1 giorno fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 25/100
PolicyEngine/policyengine-uk#2662 ·
I maintainer di solito rispondono entro 2 giorni
Tutte le issue di PolicyEngine/policyengine-uk
Issue simili
-
tests/strategies_test.py:174 goes uncovered on about 1 run in 100, failing the coverage ratchetApertaflaky-watch
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
btclib-org/btclib#2839 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
nion-software/nionswift#2018 ·
I maintainer di solito rispondono entro 1 giorno
-
Deleting a member fails when another member's share transfer points to themForse già presa @Beerlesklopfer l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
FoodCoopX/wirgarten-tapir#1336 ·
I maintainer di solito rispondono entro 3 giorni
-
pydanty:is-working
Difficoltà 2/5 1-3 ore Idoneità per principianti 71/100
pydantic/pydantic-ai#11467 ·
I maintainer di solito rispondono entro 1 giorno
-
Link Checker ReportApertaautomated issue linkchecker report
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
QuantEcon/lecture-python.myst#1098 ·
I maintainer di solito rispondono entro 1 giorno