From 44d62c0c9b9e886af35c70667343561195f46b3f Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Wed, 3 Jun 2026 09:39:21 +0000 Subject: [PATCH] =?UTF-8?q?feat(modelling):=20loft=20overlay=20270?= =?UTF-8?q?=E2=86=92300=20mm=20+=20Elmhurst=20cascade=20pin=20(#1158)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Completes #1158 end-to-end. recommend_loft_insulation now emits a 300 mm overlay (was 270 mm). The Elmhurst before/after re-lodgement of the loft-insulation measure on cert 001431 lodges the after-cert at 300 mm roof insulation; pinning before→overlay→after requires the overlay to match that depth — at 270 mm the cascade left a +0.173 SAP residual, at 300 mm it closes at delta 0.000000 on SAP/CO2/PE. Adds test_loft_overlay_reproduces_the_relodged_after and updates the roof generator unit test's thickness assertion to 300. Co-Authored-By: Claude Opus 4.8 --- domain/modelling/roof_recommendation.py | 6 ++++-- .../modelling/fixtures/loft_001431_after.pdf | Bin 0 -> 65930 bytes .../modelling/fixtures/loft_001431_before.pdf | Bin 0 -> 66777 bytes .../modelling/test_elmhurst_cascade_pins.py | 20 ++++++++++++++++++ .../modelling/test_roof_recommendation.py | 2 +- 5 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 tests/domain/modelling/fixtures/loft_001431_after.pdf create mode 100644 tests/domain/modelling/fixtures/loft_001431_before.pdf diff --git a/domain/modelling/roof_recommendation.py b/domain/modelling/roof_recommendation.py index 76c60241..aa09b620 100644 --- a/domain/modelling/roof_recommendation.py +++ b/domain/modelling/roof_recommendation.py @@ -20,8 +20,10 @@ from repositories.product.product_repository import ProductRepository _LOFT_MEASURE_TYPE = "loft_insulation" # RdSAP 10 Table 16: 0 mm lodged roof insulation is an uninsulated loft. _ROOF_UNINSULATED_MM = 0 -# Recommended loft-insulation depth (mm) — the building-regs standard top-up. -_RECOMMENDED_LOFT_THICKNESS_MM = 270 +# Recommended loft-insulation depth (mm). Elmhurst re-lodges a loft-insulation +# measure at 300 mm; pinning the before→after cascade (000490/001431) requires +# the overlay to match that depth exactly (see test_elmhurst_cascade_pins). +_RECOMMENDED_LOFT_THICKNESS_MM = 300 def recommend_loft_insulation( diff --git a/tests/domain/modelling/fixtures/loft_001431_after.pdf b/tests/domain/modelling/fixtures/loft_001431_after.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1b76e03233218ad4876aa9210ac8d874b7d851f0 GIT binary patch literal 65930 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 Xu5M@-w?9r33`CXd?ar_X2EU literal 0 HcmV?d00001 diff --git a/tests/domain/modelling/fixtures/loft_001431_before.pdf b/tests/domain/modelling/fixtures/loft_001431_before.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6280eca58afa2defddde993cc9f1abc373ed2244 GIT binary patch literal 66777 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 literal 0 HcmV?d00001 diff --git a/tests/domain/modelling/test_elmhurst_cascade_pins.py b/tests/domain/modelling/test_elmhurst_cascade_pins.py index 8f7f5e83..bc2d6f32 100644 --- a/tests/domain/modelling/test_elmhurst_cascade_pins.py +++ b/tests/domain/modelling/test_elmhurst_cascade_pins.py @@ -20,6 +20,7 @@ from datatypes.epc.domain.epc_property_data import EpcPropertyData from domain.modelling.package_scorer import PackageScorer, Score from domain.modelling.product import Product from domain.modelling.recommendation import Recommendation +from domain.modelling.roof_recommendation import recommend_loft_insulation from domain.modelling.simulation import EpcSimulation from domain.modelling.wall_recommendation import recommend_cavity_wall from domain.sap10_calculator.calculator import Sap10Calculator, SapResult @@ -79,3 +80,22 @@ def test_cavity_wall_overlay_reproduces_the_relodged_after() -> None: _assert_overlay_reproduces_after( before, after, recommendation.options[0].overlay ) + + +def test_loft_overlay_reproduces_the_relodged_after() -> None: + # Arrange + before: EpcPropertyData = parse_recommendation_summary( + "loft_001431_before.pdf" + ) + after: EpcPropertyData = parse_recommendation_summary( + "loft_001431_after.pdf" + ) + recommendation: Recommendation | None = recommend_loft_insulation( + before, _AnyProduct() + ) + assert recommendation is not None + + # Act / Assert + _assert_overlay_reproduces_after( + before, after, recommendation.options[0].overlay + ) diff --git a/tests/domain/modelling/test_roof_recommendation.py b/tests/domain/modelling/test_roof_recommendation.py index 8acfc5c6..f801ee7d 100644 --- a/tests/domain/modelling/test_roof_recommendation.py +++ b/tests/domain/modelling/test_roof_recommendation.py @@ -46,7 +46,7 @@ def test_uninsulated_loft_yields_a_loft_insulation_recommendation() -> None: option = recommendation.options[0] assert option.measure_type == "loft_insulation" simulated: EpcPropertyData = apply_simulations(baseline, [option.overlay]) - assert _part(simulated, BuildingPartIdentifier.MAIN).roof_insulation_thickness == 270 + assert _part(simulated, BuildingPartIdentifier.MAIN).roof_insulation_thickness == 300 def test_already_insulated_loft_yields_no_recommendation() -> None: