Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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/1106-policyengine-uk-2-123.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The lock's UK side moves to policyengine-uk 2.123.0, and the UK extras of microcosm-build, microcosm-data and microcosm-frame require >=2.123.0 (microcosm#1106). Nothing else in the lock moves: policyengine-core stays at 3.32.19 on the UK side and at the US side's own 3.32.5 pin (microcosm#1086). 2.123.0 carries PolicyEngine/policyengine-uk#2172: the landlord inputs `property_rental_income`, `property_finance_costs` and `property_finance_costs_brought_forward`, `property_income` documented as the SPI profit concept, the s. 274A finance-cost reduction, and a property allowance that no longer stacks on expenses already netted from profit, so a profit above £1,000 with no receipts gets no allowance (#2172 measured +£0.68bn income tax on Microcosm UK in 2025). The move also brings #2160 (UC work-related requirements at the State Pension Credit qualifying age), #2096 (the VAT reduced-rate history), #2097 (a tax credits rate date) and #2144 (a guarantee credit boundary). Re-derived with no data change: the uprating pin stamp (values unchanged), the concept coverage (288 inputs; the three new property inputs are uncovered), the concept mapping reviewed against 2.123.0 (the `property_income` note quotes the new documentation), the H2 fixture's numerical dependency, the coverage manifest's source digests and `APPROVED_UV_LOCK_SHA256`.
1 change: 1 addition & 0 deletions changelog.d/1106-property-wealth-not-exported.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The UK release and the calibration engine no longer receive the Wealth and Assets Survey `property_wealth` total (microcosm#1106, the uk-data#543 defect). policyengine-uk derives `property_wealth` from `main_residence_value`, `other_residential_property_value` and `non_residential_property_value`; a persisted copy overrode that sum, has no uprating index (the published aa31bdf6 year files hold it flat from 2026 to 2030 while the sum grows 13%), and also counted owned land and the overseas and other-property remainder. The release export and the measure resolver's scratch H5 now drop it, and the resolver's receipt names what it left out; the spine keeps it for the WAS stage's own checks. It is a reviewed export exclusion, a declared engine-derived exclusion in the coverage ledger (144 required inputs and one reviewed exclusion), and the coverage gate now reads the frame the release writes.
1 change: 1 addition & 0 deletions changelog.d/1106-spi-property-finance-costs.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The SPI channel draws landlords' restricted residential finance costs into the new `property_finance_costs` input (microcosm#1106). The donor tape's `LLIR_RESTRICT_AMT_TOT` is the "restricted land property finance cost", the costs of dwelling-related loans that ITTOIA 2005 s. 272A no longer deducts and s. 274A relieves as a tax reduction (SPI Public Use Tape 2022-23 documentation). It joins the first-stage SPI model as its last output, so it conditions on every income leaf, property income included, and leaves every earlier draw unchanged; the band donors copy it with the rest of the record. It is uprated from 2022 by the index policyengine-uk gives the variable, `obr.mortgage_interest`. The donor is refused unless `TAX_CRED`, which carries the 20% relief with the other tax credits, has a median ratio to the costs between 0.195 and 0.205; the stage receipt records the check. FRS-channel rows start at zero; the next stage imputes their landlords' costs. The column joins the export allow-list (the frozen enhanced FRS has no such column) and the gate-battery pins move with `gates.json`.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The 13 SPI Table 3.7 net property-income amounts by total-income band are bound (microcosm#1106, María's ruling of 2026-10-05). They had been signed out over the incumbent's x1.9 scaling (uk-data#311), which set HMRC Property Rental Income Statistics receipts against the SPI's net concept; HMRC confirmed those statistics are before allowable expenses. The facts now bind unscaled on `property_income`, landlords' profit after allowable expenses and before residential finance costs, uprated from 2023-24 to 2025 by the pinned per-capita GDP index (factor 1.0826): £31.78bn in all against the incumbent fixture's £55.78bn (1.9 × £29.36bn), for example £5.85bn against £10.26bn in the £50,000 to £70,000 band and £2.76bn against £4.85bn in the £100,000 to £150,000 band. Active national references go from 1,231 to 1,244. Both national compile-parity receipts gain the 13 rows (the 2025 incumbent receipt as calibration drift, with the retired scaling as the reason); the local surface is unchanged. The 13 new specs move the compiled register, so uk-candidate-eval's frozen scoring register needs a re-freeze before the next national solve.
11 changes: 11 additions & 0 deletions changelog.d/1106-uk-property-components-stage.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
A person-grain `property_components` stage joins the UK spine after `regional_property_uprating` (microcosm#1106). It fills the two landlord inputs policyengine-uk 2.123.0 reads beside `property_income` (PolicyEngine/policyengine-uk#2172): `property_rental_income`, the receipts before expenses, on every landlord, and `property_finance_costs` on the FRS concept.

Finance costs on the FRS concept. FRS landlords report ROYYR1 after show card K6, which nets mortgage payments and loan interest, so their profit sits below the SPI concept. The stage draws their restricted finance costs from the SPI 2022-23 tape, prepared and rebased exactly as `hmrc_spi_income_spine` does (profit by `obr.per_capita.gdp`, finance costs by `obr.mortgage_interest`), among the tape's landlords whose profit after finance costs is positive, the analog of an FRS landlord reporting a profit. Whether a landlord has costs follows a person-keyed uniform against the tape's share in their decile of profit after finance costs; how much comes from the regime-gated QRF fitted on the analog landlords with costs, given that profit and age, at a second person-keyed quantile. The drawn costs are added back to `property_income`, so the engine relieves the interest once, as the s. 274A tax reduction; the mortgage capital the card also nets stays netted. The add-back is the recommended ruling of decision 6 and is to be confirmed with Max before merge. The SPI channel keeps the costs the income stage drew.

Receipts for every landlord. No microdata carries receipts beside profit, so they are constructed from HMRC's Property Rental Income Statistics for 2024-25, vendored from the pinned Chronicle feed as `hmrc_property_rental_income_facts.json` (Tables 1, 2, 6, 8 and 13) with a typed loader (`uk_runtime.hmrc_property_rental`). Landlords on both channels are ranked by profit and walked top band first into Table 13's eleven bands of rental income with the CGT Table 3 walk's rule (whole persons, one seeded systematic offset), each band filled to its share of the individuals-basis landlords (the all-entity counts times Table 1's individuals' share) times the spine's landlord weight. The spine carries fewer landlords than PRIS before calibration (2.21m against 2.85m), so filling the published counts would push every profit rank into a higher band. Within a bounded band receipts are linear in the weight-ranked position, from the upper bound down, never below profit; the open top band takes `max(100,000, k x profit)` with `k` solved so that receipts per landlord reach the individuals' Table 2 receipts per landlord. Receipts less profit are the deductible expenses. Sub-letting rent keeps equal receipts and no expenses until Rent a Room is released (PolicyEngine/policyengine-uk#2002). Landlords without profit carry no receipts, a recorded residual.

PRIS is a diagnostic, not a calibration target. Receipts are a fixed function of profit rank, so every PRIS count or receipts target measured moved weight across the SPI's total-income bands and pushed the SPI property amounts out of their bound (`experiments/1106-uk-property-income-receipts.md`). PRIS's landlords also include those whose expenses meet or exceed their receipts, whom the spine carries with no profit and no receipts. The stage receipt reports the spine against PRIS instead.

Gates. `uk_stage_property_components` (stage health, release-blocking) joins the spine gate scope: no receipts below profit, every band above the lowest within twice the largest landlord weight of its share of the spine's landlords, and the top band's multiplier below its cap. The receipt also records the tape incidence and its realisation, the totals against PRIS, the channel split and the share of landlords whose household holds rental property.

Surfaces that move in lockstep: the sources manifest and its projection, two schema branches and the operation-kind allow-list, the graph roster, kernel registry and spine tool, the H2 fixture (40 stages; synthetic PRIS facts sized to the fixture frame) and the coverage manifest, the vendoring register and the country package, the export allow-list, `gates.json` and the gate-battery digests.
10 changes: 5 additions & 5 deletions docs/concept-coverage/policyengine-uk.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
# Concept coverage: policyengine-uk

Engine version `2.122.2`; concept schema `d824f5e97d58`. Generated by `tools/refresh_concept_coverage.py`; do not edit by hand.
Engine version `2.123.0`; concept schema `d824f5e97d58`. Generated by `tools/refresh_concept_coverage.py`; do not edit by hand.

- Engine inputs: 285
- Engine inputs: 288
- Fed by a concept: 40
- Structural: 11
- Uncovered: 234
- Uncovered: 237
- Mapped but missing from the engine: 0

## Inputs each concept feeds
Expand Down Expand Up @@ -57,6 +57,6 @@ Engine version `2.122.2`; concept schema `d824f5e97d58`. Generated by `tools/ref

`accommodation_type`, `alcohol_and_tobacco_consumption`, `beer_draught_share`, `beer_litres`, `brma`, `bus_fare_spending_reported`, `bus_subsidy_spending`, `cash_isa`, `cider_draught_share`, `cider_litres`, `cigarettes_per_week`, `cigars_grams_per_week`, `clothing_and_footwear_consumption`, `communication_consumption`, `consumer_debt`, `corporate_wealth`, `council_tax_band`, `cumulative_non_residential_rent`, `cumulative_residential_rent`, `dfe_education_spending`, `diesel_spending`, `domestic_energy_consumption`, `domestic_rates`, `education_consumption`, `electricity_consumption`, `external_child_payments`, `food_and_non_alcoholic_beverages_consumption`, `full_rate_vat_expenditure_rate`, `gas_consumption`, `gross_financial_wealth`, `hand_rolling_tobacco_grams_per_week`, `health_consumption`, `heated_tobacco_grams_per_week`, `household_furnishings_consumption`, `household_owns_tv`, `housing_service_charges`, `housing_water_and_electricity_consumption`, `in_original_frs`, `in_rural_fuel_duty_relief_area`, `is_shared_accommodation`, `local_authority`, `lpg_kg`, `main_residence_value`, `main_residential_property_purchased_is_first_home`, `miscellaneous_consumption`, `mortgage_debt`, `natural_gas_kg`, `net_financial_wealth`, `non_residential_property_value`, `non_residential_rent`, `num_bedrooms`, `num_vehicles`, `other_fermented_draught_share`, `other_fermented_litres`, `other_residential_property_value`, `other_tobacco_grams_per_week`, `owned_land`, `petrol_spending`, `private_pension_wealth`, `property_purchased`, `rail_usage`, `recreation_consumption`, `region`, `restaurants_and_hotels_consumption`, `savings`, `sparkling_cider_draught_share`, `sparkling_cider_litres`, `spi_imputed`, `spirits_draught_share`, `spirits_litres`, `stocks_and_shares_isa`, `structural_insurance_payments`, `transport_consumption`, `uc_migrated`, `water_and_sewerage_charges`, `wine_draught_share`, `wine_litres`, `would_evade_tv_licence_fee`

### person (144)
### person (147)

`a_and_e_visits`, `aa_category`, `access_fund`, `admitted_patient_visits`, `adult_dependants_grant_has_other_adult_dependant`, `adult_dependants_grant_other_adult_income`, `adult_dependants_grant_receives_postgraduate_loan`, `adult_ema`, `afcs_reported`, `age_started_or_accepted_current_education_or_training`, `armed_forces_independence_payment`, `attends_private_school_random_draw`, `base_net_income`, `blind_persons_allowance`, `bsp_reported`, `bursary_fund_16_to_19_in_care_or_care_leaver`, `bursary_fund_16_to_19_participation_costs`, `bursary_fund_16_to_19_self_supporting`, `bus_in_london_trips`, `bus_pass_eligible`, `capital_allowances`, `capital_gains_badr`, `capital_gains_carried_interest`, `capital_gains_residential_property`, `car_co2_emissions`, `car_engine_size`, `car_first_registration_date`, `car_fuel_type`, `car_is_ved_exempt`, `car_list_price`, `care_hours`, `carers_allowance_reported`, `charitable_investment_gifts`, `child_benefit_reported`, `child_ema`, `child_tax_credit_reported`, `childcare_expenses`, `childcare_grant_child_has_special_educational_needs`, `childcare_grant_provider_is_nanny`, `childcare_grant_receives_nhs_childcare_support`, `childcare_grant_receives_postgraduate_loan`, `council_tax_benefit_reported`, `covenanted_payments`, `deficiency_relief`, `disabled_students_allowance_eligible_expenses`, `disabled_students_allowance_receives_equivalent_support`, `dla_m_category`, `dla_sc_category`, `education_grants`, `employee_pension_contributions_reported`, `employer_pension_contributions`, `employment_expenses`, `employment_sector`, `employment_status`, `esa_contrib_reported`, `esa_income_reported`, `free_school_fruit_veg`, `free_school_meals`, `free_school_milk`, `gift_aid`, `healthy_start_vouchers`, `housing_benefit_reported`, `iidb_reported`, `in_FE`, `incapacity_benefit_reported`, `income_support_reported`, `is_about_to_start_paid_work`, `is_apprentice`, `is_before_universal_credit_qualifying_young_person_terminal_date`, `is_blind`, `is_in_approved_training`, `is_looked_after_by_local_authority`, `is_newly_self_employed`, `jsa_contrib_reported`, `jsa_income_reported`, `lifetime_isa_balance`, `lump_sum_income`, `maintenance_expenses`, `maintenance_income`, `married_couples_allowance`, `maternity_allowance_reported`, `max_free_entitlement_hours_used`, `miscellaneous_income`, `nhs_a_and_e_spending`, `nhs_admitted_patient_spending`, `nhs_outpatient_spending`, `ni_class_3`, `other_deductions`, `other_investment_income`, `other_local_bus_trips`, `other_tax_credits`, `outpatient_visits`, `pension_contributions_via_salary_sacrifice`, `pension_credit_reported`, `pension_income`, `person_benunit_role`, `person_household_role`, `personal_pension_contributions`, `pip_dl_category`, `pip_m_category`, `private_transfer_income`, `receives_benefits_in_own_right`, `receives_limited_capability_for_work_credits`, `rent_paid_as_boarder`, `rent_paid_as_lodger`, `role`, `scottish_funded_early_learning_childcare_start_date_reached`, `sda_reported`, `self_employment_gross_receipts`, `sic_industry_division`, `ssmg_reported`, `statutory_maternity_pay`, `statutory_paternity_pay`, `statutory_sick_pay`, `student_loan_balance`, `student_loan_plan`, `student_loans`, `sublet_income`, `tax_free_childcare_on_adoption_leave`, `tax_free_childcare_on_carers_leave`, `tax_free_childcare_on_qualifying_leave`, `tax_free_childcare_on_shared_parental_leave`, `tax_free_childcare_self_employment_start_up_period`, `tax_free_childcare_spend_routed_share`, `tax_free_childcare_uses_qualifying_provider`, `tax_reported`, `trading_loss`, `travel_grant_abroad_placement`, `travel_grant_clinical_placement`, `travel_grant_eligible_expenses`, `travel_grant_receives_means_tested_nhs_bursary`, `uc_has_limited_capability_for_work`, `uc_has_offer_of_paid_work_starting_by_end_of_next_assessment_period`, `uc_is_adopter_in_first_year`, `uc_is_foster_parent_or_new_friend_or_family_carer`, `uc_is_in_pregnancy_or_post_confinement_period`, `uc_is_in_startup_period`, `uc_is_ineligible_partner`, `uc_is_responsible_foster_parent_of_child_under_one`, `uc_is_student_with_no_work_related_requirements`, `uc_is_temporarily_absent_from_claimant_household`, `universal_credit_reported`, `winter_fuel_allowance_reported`, `working_tax_credit_reported`
`a_and_e_visits`, `aa_category`, `access_fund`, `admitted_patient_visits`, `adult_dependants_grant_has_other_adult_dependant`, `adult_dependants_grant_other_adult_income`, `adult_dependants_grant_receives_postgraduate_loan`, `adult_ema`, `afcs_reported`, `age_started_or_accepted_current_education_or_training`, `armed_forces_independence_payment`, `attends_private_school_random_draw`, `base_net_income`, `blind_persons_allowance`, `bsp_reported`, `bursary_fund_16_to_19_in_care_or_care_leaver`, `bursary_fund_16_to_19_participation_costs`, `bursary_fund_16_to_19_self_supporting`, `bus_in_london_trips`, `bus_pass_eligible`, `capital_allowances`, `capital_gains_badr`, `capital_gains_carried_interest`, `capital_gains_residential_property`, `car_co2_emissions`, `car_engine_size`, `car_first_registration_date`, `car_fuel_type`, `car_is_ved_exempt`, `car_list_price`, `care_hours`, `carers_allowance_reported`, `charitable_investment_gifts`, `child_benefit_reported`, `child_ema`, `child_tax_credit_reported`, `childcare_expenses`, `childcare_grant_child_has_special_educational_needs`, `childcare_grant_provider_is_nanny`, `childcare_grant_receives_nhs_childcare_support`, `childcare_grant_receives_postgraduate_loan`, `council_tax_benefit_reported`, `covenanted_payments`, `deficiency_relief`, `disabled_students_allowance_eligible_expenses`, `disabled_students_allowance_receives_equivalent_support`, `dla_m_category`, `dla_sc_category`, `education_grants`, `employee_pension_contributions_reported`, `employer_pension_contributions`, `employment_expenses`, `employment_sector`, `employment_status`, `esa_contrib_reported`, `esa_income_reported`, `free_school_fruit_veg`, `free_school_meals`, `free_school_milk`, `gift_aid`, `healthy_start_vouchers`, `housing_benefit_reported`, `iidb_reported`, `in_FE`, `incapacity_benefit_reported`, `income_support_reported`, `is_about_to_start_paid_work`, `is_apprentice`, `is_before_universal_credit_qualifying_young_person_terminal_date`, `is_blind`, `is_in_approved_training`, `is_looked_after_by_local_authority`, `is_newly_self_employed`, `jsa_contrib_reported`, `jsa_income_reported`, `lifetime_isa_balance`, `lump_sum_income`, `maintenance_expenses`, `maintenance_income`, `married_couples_allowance`, `maternity_allowance_reported`, `max_free_entitlement_hours_used`, `miscellaneous_income`, `nhs_a_and_e_spending`, `nhs_admitted_patient_spending`, `nhs_outpatient_spending`, `ni_class_3`, `other_deductions`, `other_investment_income`, `other_local_bus_trips`, `other_tax_credits`, `outpatient_visits`, `pension_contributions_via_salary_sacrifice`, `pension_credit_reported`, `pension_income`, `person_benunit_role`, `person_household_role`, `personal_pension_contributions`, `pip_dl_category`, `pip_m_category`, `private_transfer_income`, `property_finance_costs`, `property_finance_costs_brought_forward`, `property_rental_income`, `receives_benefits_in_own_right`, `receives_limited_capability_for_work_credits`, `rent_paid_as_boarder`, `rent_paid_as_lodger`, `role`, `scottish_funded_early_learning_childcare_start_date_reached`, `sda_reported`, `self_employment_gross_receipts`, `sic_industry_division`, `ssmg_reported`, `statutory_maternity_pay`, `statutory_paternity_pay`, `statutory_sick_pay`, `student_loan_balance`, `student_loan_plan`, `student_loans`, `sublet_income`, `tax_free_childcare_on_adoption_leave`, `tax_free_childcare_on_carers_leave`, `tax_free_childcare_on_qualifying_leave`, `tax_free_childcare_on_shared_parental_leave`, `tax_free_childcare_self_employment_start_up_period`, `tax_free_childcare_spend_routed_share`, `tax_free_childcare_uses_qualifying_provider`, `tax_reported`, `trading_loss`, `travel_grant_abroad_placement`, `travel_grant_clinical_placement`, `travel_grant_eligible_expenses`, `travel_grant_receives_means_tested_nhs_bursary`, `uc_has_limited_capability_for_work`, `uc_has_offer_of_paid_work_starting_by_end_of_next_assessment_period`, `uc_is_adopter_in_first_year`, `uc_is_foster_parent_or_new_friend_or_family_carer`, `uc_is_in_pregnancy_or_post_confinement_period`, `uc_is_in_startup_period`, `uc_is_ineligible_partner`, `uc_is_responsible_foster_parent_of_child_under_one`, `uc_is_student_with_no_work_related_requirements`, `uc_is_temporarily_absent_from_claimant_household`, `universal_credit_reported`, `winter_fuel_allowance_reported`, `working_tax_credit_reported`
Loading
Loading