PolicyEngine / PolicyEngine/policyengine-uk

Reported/category benefit inputs bypass statutory minimum-age eligibility (Carer's Allowance, Carer Support Payment, child DLA mobility)

Open
#1,793 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
50
Forks
33
Avg merge
20h 58m
Merged PRs (30d)
14

Description

Summary

Three DWP/Social Security Scotland benefit formulas in policyengine-uk pay awards to people who fall below the benefit's statutory minimum age when the award is triggered by a reported-receipt or frozen-category FRS input. The formulas propagate the input without applying the age eligibility condition, so on the Enhanced FRS population they emit statutorily impossible awards (e.g. Carer's Allowance to a 4-year-old, higher-rate DLA mobility to a 1-year-old).

Reproduced against policyengine-uk==2.88.56, policyengine-core==3.26.11, year 2026.

1. Carer's Allowance / Carer Support Payment — no minimum-age (16) gate

carers_allowance (and, from 2025, carer_support_payment) treats carers_allowance_reported > 0 as an eligibility trigger:

receives_ca = person("carers_allowance_reported", period) > 0
eligible = ~(in_scotland & csp_replaces_ca) & (meets_work_condition | receives_ca)
return eligible * ca.rate * WEEKS_IN_YEAR

There is no age >= 16 condition. Reproduction:

from policyengine_uk import Simulation
for age in (1, 10, 15, 16):
    sim = Simulation(situation={
        "people": {"p": {"age": {2026: age}, "carers_allowance_reported": {2026: 4004.71}, "care_hours": {2026: 0}}},
        "benunits": {"b": {"members": ["p"]}},
        "households": {"h": {"members": ["p"], "country": {2026: "ENGLAND"}}},
    })
    print(age, sim.calculate("carers_allowance", 2026)[0])
# 1 -> 4495.40 ; 10 -> 4495.40 ; 15 -> 4495.40 ; 16 -> 4495.40

Statute: Carer's Allowance requires the claimant to be aged 16 or over (SSCBA 1992 s.70(3): "A person shall not be entitled to [a carer's allowance] if he is under the age of 16…"). Carer Support Payment requires 16 or over (Carer's Assistance (Carer Support Payment) (Scotland) Regs 2023, reg. 5). On the Enhanced FRS this produces awards on child-aged records that also carry (synthesised) employment income — 152 CA and 12 CSP person-records aged 0–15 receive the full statutory award.

2. Child DLA — no minimum-age gate on the mobility/self-care category

dla_m and dla_sc pay from the frozen dla_m_category / dla_sc_category FRS input without the statutory age conditions:

from policyengine_uk import Simulation
for age in (1, 2, 3, 5):
    sim = Simulation(situation={
        "people": {"p": {"age": {2026: age}, "dla_m_category": {2026: "HIGHER"}, "dla_sc_category": {2026: "HIGHER"}}},
        "benunits": {"b": {"members": ["p"]}},
        "households": {"h": {"members": ["p"]}},
    })
    print(age, "dla_m weekly", sim.calculate("dla_m", 2026)[0] / 52)
# 1 -> 80.00 ; 2 -> 80.00 ; 3 -> 80.00 ; 5 -> 80.00

Statute: the higher-rate mobility component requires the child to be aged 3 or over, and the lower-rate mobility component requires aged 5 or over (SSCBA 1992 s.73(1); the higher-rate age floor was lowered from 5 to 3 by the Welfare Reform and Pensions Act 1999 from April 2001). The care component has no lower age limit. On the Enhanced FRS, 34 children aged 0–2 carry dla_m_category = HIGHER and are paid £80.00/week (£4,160/year) higher-rate mobility they cannot legally receive.

Why this matters

For policy-based validation these awards diverge from statute purely because the age eligibility condition is missing — the reported/category input is honoured unconditionally. A cross-engine comparison against an independently-encoded rules set (Axiom RuleSpec carers-allowance, carer-support-payment, disability-living-allowance, which apply the age gates) flags exactly these rows: 152 + 12 + 68 = 232 person-level mismatches on the Enhanced FRS, each explained by the missing age condition.

This is the reported-anchoring pattern discussed in #1621; the specific fix here is an eligibility guard rather than a re-anchoring.

Suggested fix

Apply the statutory minimum-age condition inside each formula (or zero the reported/category input for out-of-range ages in the dataset):

  • carers_allowance / carer_support_payment: require age >= gov.dwp.carers_allowance.min_age (16).
  • dla_m: higher rate requires age >= 3, lower rate requires age >= 5; dla_sc per the self-care age rules.

Happy to supply the full per-record Enhanced FRS list if useful.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the carers_allowance, carer_support_payment, dla_m, and dla_sc formulas described in the issue, then run the supplied Simulation reproductions for the affected ages. Add the statutory age eligibility guards described for each benefit and verify that out-of-range reported or category inputs produce no award while eligible ages still do.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
52/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.