Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/claims-all-per-benunit.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Evaluated `claims_all_entitled_benefits` per benefit unit in hand-entered situations, so one family's reported benefits no longer switch off another family's take-up. Data-built simulations keep main's result, false for every family, so survey take-up of tax credits and Income Support still follows reported claims; Council Tax Reduction and Housing Benefit take-up there is limited to reporters (d1390 and d1455) until calibrated take-up inputs land (policyengine-uk-data#448). Explicit take-up inputs continue to override these defaults.
2 changes: 1 addition & 1 deletion docs/book/programs/gov/dwp/housing-benefit.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
"\n",
"**Guarantee Credit passport.** If the claimant or partner is in receipt of a guarantee credit (`in_receipt_of_guarantee_credit`: the benunit is eligible for Pension Credit, claims it, and its guarantee credit is positive, so the Pension Credit paid includes a guarantee credit), the whole of their capital and income is disregarded ([SI 2006/214 reg. 26](https://www.legislation.gov.uk/uksi/2006/214/regulation/26); Northern Ireland: [SR 2006/406 reg. 24](https://www.legislation.gov.uk/nisr/2006/406/regulation/24)). `housing_benefit_assessable_capital`, `housing_benefit_tariff_income` and `housing_benefit_applicable_income` are then zero, so the capital limit cannot bite and no income is tapered. A guarantee credit computed for a family that does not claim Pension Credit (`would_claim_pc`), or that PolicyEngine does not treat as eligible for it (`is_pension_credit_eligible`), does not count. The passport applies within the pension-age regulations (`housing_benefit_pension_age_regulations_apply`). `is_pension_credit_eligible` retains mixed-age couples covered by the [SI 2019/37 art. 4](https://www.legislation.gov.uk/uksi/2019/37/article/4) saving through `meets_pension_credit_age_conditions`; these couples keep the passport when they receive Guarantee Credit. When Pension Credit is frozen, receipt follows the baseline award, including its Guarantee Credit component. Savings Credit alone follows the separate assessment in [reg. 27](https://www.legislation.gov.uk/uksi/2006/214/regulation/27), including its capital limit, and does not give this passport.\n",
"\n",
"Take-up is handled by `would_claim_housing_benefit`, which is true for benunits that report Housing Benefit and, when no reported benefits are supplied (as in household calculations), for everyone. In the Enhanced FRS take-up therefore follows reported claims."
"Take-up is handled per benefit unit by `would_claim_housing_benefit`. In data-built simulations, including the Enhanced FRS, its default is true only for families reporting positive Housing Benefit (d1455, following the CTR survey ruling d1390). In hand-entered household calculations, it is true when the family reports Housing Benefit or its `claims_all_entitled_benefits` flag is true. That flag tests seven reported benefits within the family; it does not test Pension Credit, Child Benefit or Council Tax Reduction. Dataset and situation inputs can override the take-up flag directly."
]
},
{
Expand Down
17 changes: 17 additions & 0 deletions docs/engineering/skills/dataset-sources.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,3 +60,20 @@ without downloading or opening private survey files.
Use real H5 files only when the test specifically needs schema or data behavior.
If the artifact is private, large, or credential-dependent, skip cleanly or keep
the verification outside the ordinary PR test suite.

## Data provenance and benefit take-up

`policyengine_uk.utils.data_source.built_from_data` distinguishes dataset-built
simulations from hand-entered situations, including supported clones, branches
and UK `build_from_situation` rebuilds. Council Tax Reduction and Housing Benefit
use this distinction for their take-up defaults: data-built simulations use
positive reported claims only (d1390 and d1455); situations also use their
per-benefit-unit `claims_all_entitled_benefits` flag. That flag is itself false
for every family on data-built simulations, as it was on main for any dataset
with a reporting family, so Child Tax Credit, Working Tax Credit and Income
Support take-up also follow reported claims there. Explicit inputs override
these defaults, including a future calibrated dataset column (uk-data#448).

Do not rebuild an existing data-built simulation by calling core's
`SimulationBuilder.build_from_dict` directly. In core 3.33.2 this leaves stale
dataset provenance, which copies inherit. Use UK `build_from_situation` instead.
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
description: Share of eligible Housing Benefit recipients that participate. Not used by
the model, which takes Housing Benefit take-up from reported claims in survey data and
assumes full take-up in household calculations. Pension-age families can make new
claims; working-age families only continue existing awards.
the model. Data-built simulations default to positive reported Housing Benefit claims
only (d1455 following d1390). Hand-entered households use positive reported Housing
Benefit or their per-benefit-unit claims_all_entitled_benefits flag. Direct take-up
inputs override either default. Pension-age families can make new claims;
working-age families only continue existing awards.
metadata:
economy: false
label: Housing benefit take-up rate
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# would_claim_IS is the family's take-up flag: the claimant or partner
# reports Income Support. An Income Support report from a member who is neither
# the claimant, the partner nor their dependant ("other") is that member's own
# claim. Any report in the simulation turns claims_all_entitled_benefits off.
# claim. A report turns claims_all_entitled_benefits off for that benefit unit.

- name: Another member's Income Support report is not this family's claim
period: 2025
Expand Down Expand Up @@ -49,7 +49,8 @@
# unit on the Income Support claim path when anyone in the household is on it,
# and otherwise shares it by claimants and partners. With no claimant or
# partner reporting Income Support, £10,000 of savings is shared 1:1 between
# the two benefit units.
# the two benefit units. The non-reporting lodger explicitly opts out of
# claiming all entitled benefits.

- name: Another member's Income Support report does not move household capital to their benefit unit
period: 2025
Expand All @@ -72,6 +73,7 @@
members: [claimant, other]
lodger_unit:
members: [lodger]
claims_all_entitled_benefits: false
households:
household:
members: [claimant, other, lodger]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
# Hand-entered households retain the default and explicit take-up rules.
# Survey reporters-only behavior is covered with MOCK data in Python tests.
- name: WALES entitled non-reporting family entered by hand claims CTR by default
period: 2026
input:
age: 35
country: WALES
local_authority: CARDIFF
council_tax: 1800
savings: 0
would_claim_uc: false
claims_all_entitled_benefits: true
output:
council_tax_benefit_reported: 0
would_claim_council_tax_reduction: true
simulated_council_tax_reduction_benunit: 1800
council_tax_benefit: 1800
council_tax_reduction: 1800

- name: WALES entitled non-reporting family under explicit CTR claim
period: 2026
input:
age: 35
country: WALES
local_authority: CARDIFF
council_tax: 1800
savings: 0
would_claim_uc: false
claims_all_entitled_benefits: true
would_claim_council_tax_reduction: true
output:
council_tax_benefit_reported: 0
would_claim_council_tax_reduction: true
simulated_council_tax_reduction_benunit: 1800
council_tax_benefit: 1800
council_tax_reduction: 1800

- name: SCOTLAND entitled non-reporting family entered by hand claims CTR by default
period: 2026
input:
age: 35
country: SCOTLAND
local_authority: CITY_OF_EDINBURGH
council_tax: 1800
savings: 0
would_claim_uc: false
claims_all_entitled_benefits: true
output:
council_tax_benefit_reported: 0
would_claim_council_tax_reduction: true
simulated_council_tax_reduction_benunit: 1800
council_tax_benefit: 1800
council_tax_reduction: 1800

- name: SCOTLAND entitled non-reporting family under explicit CTR claim
period: 2026
input:
age: 35
country: SCOTLAND
local_authority: CITY_OF_EDINBURGH
council_tax: 1800
savings: 0
would_claim_uc: false
claims_all_entitled_benefits: true
would_claim_council_tax_reduction: true
output:
council_tax_benefit_reported: 0
would_claim_council_tax_reduction: true
simulated_council_tax_reduction_benunit: 1800
council_tax_benefit: 1800
council_tax_reduction: 1800

- name: ENGLAND entitled non-reporting family entered by hand claims CTR by default
period: 2026
input:
age: 70
country: ENGLAND
local_authority: MAIDSTONE
council_tax: 1800
savings: 0
would_claim_uc: false
claims_all_entitled_benefits: true
output:
council_tax_benefit_reported: 0
would_claim_council_tax_reduction: true
simulated_council_tax_reduction_benunit: 1800
council_tax_benefit: 1800
council_tax_reduction: 1800

- name: ENGLAND entitled non-reporting family under explicit CTR claim
period: 2026
input:
age: 70
country: ENGLAND
local_authority: MAIDSTONE
council_tax: 1800
savings: 0
would_claim_uc: false
claims_all_entitled_benefits: true
would_claim_council_tax_reduction: true
output:
council_tax_benefit_reported: 0
would_claim_council_tax_reduction: true
simulated_council_tax_reduction_benunit: 1800
council_tax_benefit: 1800
council_tax_reduction: 1800

# Vahid's calculator probes from PR 1831 review 5514292316. These households
# supply no benefit reports, claimant roles, or take-up inputs.
- name: North West pensioner calculator household retains full CTR without reports
period: 2026
absolute_error_margin: 0.01
input:
age: 70
region: NORTH_WEST
rent: 8_000
tenure_type: RENT_PRIVATELY
council_tax: 1_800
employment_income: 0
output:
council_tax_benefit_reported: 0
claims_all_entitled_benefits: true
would_claim_council_tax_reduction: true
council_tax_reduction: 1_800

- name: Welsh pensioner calculator household retains full CTR without reports
period: 2026
absolute_error_margin: 0.01
input:
age: 70
region: WALES
rent: 8_000
tenure_type: RENT_PRIVATELY
council_tax: 1_800
employment_income: 0
output:
council_tax_benefit_reported: 0
claims_all_entitled_benefits: true
would_claim_council_tax_reduction: true
council_tax_reduction: 1_800

- name: Scottish working-age calculator household retains CTR without reports
period: 2026
absolute_error_margin: 0.01
input:
age: 30
region: SCOTLAND
rent: 8_000
tenure_type: RENT_PRIVATELY
council_tax: 1_800
employment_income: 0
output:
council_tax_benefit_reported: 0
claims_all_entitled_benefits: true
would_claim_council_tax_reduction: true
council_tax_reduction: 633.96
Original file line number Diff line number Diff line change
Expand Up @@ -220,8 +220,6 @@ def situation(units):
benunit = {
"members": names,
"would_claim_uc": {PERIOD: unit["would_claim_uc"]},
# claims_all_entitled_benefits sums reported benefits across the
# whole simulation, so it is set per family.
"claims_all_entitled_benefits": {
PERIOD: unit["hb_reported"] == 0 and unit["ctb_reported"] == 0
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,9 @@ def capped_family(scheme):
**CAPPED_FAMILY,
"universal_credit_pre_benefit_cap": 30_000 if scheme == "uc" else 0,
"housing_benefit_pre_benefit_cap": 30_000 if scheme == "hb" else 0,
# This supplied award exercises the cap independently of take-up;
# another member's reports must not mask its final Housing Benefit.
"would_claim_housing_benefit": scheme == "hb",
}


Expand Down
Loading
Loading