Skip to content

Default property_purchased to False to stop phantom stamp duty#1752

Merged
MaxGhenis merged 1 commit into
mainfrom
fix/property-purchased-default-false
Jun 4, 2026
Merged

Default property_purchased to False to stop phantom stamp duty#1752
MaxGhenis merged 1 commit into
mainfrom
fix/property-purchased-default-false

Conversation

@MaxGhenis
Copy link
Copy Markdown
Collaborator

Problem

property_purchased had default_value = True (introduced incidentally in the 2025 one-variable-per-file refactor, #1139). Because main_residential_property_purchased = main_residence_value * property_purchased, a True default charges every household in a population dataset full SDLT/LBTT/LTT on its entire home value — ~£370bn of phantom stamp duty, ~26× real receipts.

This inflated the first income decile's effective tax rate to 251% and has broken the policyengine-uk-data build (test_first_decile_tax_rate_reasonable) for ~2 weeks, blocking all new UK data releases.

Fix

Flip the default to False (fail-safe: a household has not bought all its property this year).

  • The household calculator and YAML tests set main_residential_property_purchased directly, so they are unaffected — all 16 SDLT/LTT YAML tests still pass.
  • Population datasets explicitly set property_purchased for the ~3.85% of genuine purchasers (see the paired policyengine-uk-data determinism PR).

Test plan

  • All SDLT + LTT baseline YAML tests pass (16 cases).
  • New regression test: a household with main_residence_value but no purchase now computes stamp_duty_land_tax: 0 (was full SDLT).
  • Verified end-to-end: £400k home, no explicit purchase → property_purchased=False, main_residential_property_purchased=£0, stamp_duty_land_tax=£0.

property_purchased had default_value=True, introduced incidentally in
the 2025 one-variable-per-file refactor (#1139). Because
main_residential_property_purchased is computed as
main_residence_value * property_purchased, a True default charges every
household in a population dataset full SDLT/LBTT/LTT on its entire home
value (~£370bn of phantom stamp duty, 26x real receipts).

This inflated the first income decile's effective tax rate to 251% and
broke the policyengine-uk-data build (test_first_decile_tax_rate_
reasonable) for ~2 weeks, blocking all new UK data releases.

Flip the default to False (fail-safe: a household has not bought all its
property this year). The household calculator and YAML tests set
main_residential_property_purchased directly, so they are unaffected
(all 16 SDLT/LTT tests still pass). Population datasets explicitly set
property_purchased for the ~3.85% of genuine purchasers.

Adds a regression test: a household with main_residence_value but no
purchase now pays £0 stamp duty.
@MaxGhenis MaxGhenis merged commit bf2cbcb into main Jun 4, 2026
9 checks passed
@MaxGhenis MaxGhenis deleted the fix/property-purchased-default-false branch June 4, 2026 12:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant