Default property_purchased to False to stop phantom stamp duty#1752
Merged
Conversation
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
property_purchasedhaddefault_value = True(introduced incidentally in the 2025 one-variable-per-file refactor, #1139). Becausemain_residential_property_purchased = main_residence_value * property_purchased, aTruedefault 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-databuild (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).main_residential_property_purchaseddirectly, so they are unaffected — all 16 SDLT/LTT YAML tests still pass.property_purchasedfor the ~3.85% of genuine purchasers (see the pairedpolicyengine-uk-datadeterminism PR).Test plan
main_residence_valuebut no purchase now computesstamp_duty_land_tax: 0(was full SDLT).property_purchased=False,main_residential_property_purchased=£0,stamp_duty_land_tax=£0.