From ec76acc3d84e8bc9758ee5b3385e377d06462fbb Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Sat, 6 Jun 2026 17:40:25 +0000 Subject: [PATCH] test(modelling): ASHP pin from a gas boiler with instantaneous HW + fuel tripwire MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Second ASHP before/after (boiler 2): a gas boiler whose hot water is electric/ instantaneous (water-heating SAP code 909, no cylinder). The cascade pin passes at 1e-4, exercising the overlay's water_heating_code reset 909 -> 901 that the boiler-1 pin (already 901) did not. (After lodges control 2209 vs the overlay's 2210 — SAP-equivalent zone controls.) Adds an xfail(strict) tripwire test_gas_boiler_instant_hw_before_baselines: the raw before is not scorable on its own because the mapper maps the 'BGB' gas- boiler EES code to an empty main_fuel_type (boiler-1's 'RGE' resolves to 26), so Sap10Calculator raises MissingMainFuelType. Harmless to the pin (the overlay overwrites fuel -> 30); flips green when the mapper derives mains gas from the gas-boiler SAP code (separate mapper-front fix). ADR-0024. Co-Authored-By: Claude Opus 4.8 --- ...rom_gas_boiler_instant_hw_001431_after.pdf | Bin 0 -> 79902 bytes ...om_gas_boiler_instant_hw_001431_before.pdf | Bin 0 -> 80747 bytes .../modelling/test_elmhurst_cascade_pins.py | 50 ++++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 tests/domain/modelling/fixtures/ashp_from_gas_boiler_instant_hw_001431_after.pdf create mode 100644 tests/domain/modelling/fixtures/ashp_from_gas_boiler_instant_hw_001431_before.pdf diff --git a/tests/domain/modelling/fixtures/ashp_from_gas_boiler_instant_hw_001431_after.pdf b/tests/domain/modelling/fixtures/ashp_from_gas_boiler_instant_hw_001431_after.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a1c98819a1c61b2a92cd028ef18a0a75ebc1f5ab GIT binary patch literal 79902 zcmeF)1ymegx+wZ2xH|-w1P|`PB{+m&9jtM8Xe?Op;BG+^JV*lx5InehaCdhN5^nP! zIdjguJMYfi^=7?wPIXqLs=KOo70uVXc72;)Z(0>8X%-GvZd48`b}D-#Dp^d#cn~I^isWTNPY^AD*h^d_kY!lRnXMeNlADggA+Pm06sCd{EEKQtsIN2X| zpyK>vKPpb{KRx69(~SRNruWyLh7z>tJtZ3Ogl! zHf2LwSUK!$(v~(5QztfQ8$*bxl&P`3i7A_+shv5jU>;shei0F8h?A+IE$Z8#eLWOs zb(y%|IT#oH<-A|_+=E@PZLn7z_aeyqJKOi%yWSdzNk~*;nvjzjK^{pEhCD|j&xRx4 zYSMo4X=2=}XuL5Cti7(PF|qs3`w{2)s~|Yh@#3;Cml~R86D!-WPa;5O_g;eN@EfvfC_Xr}VgHK&nPz`8IJOpY zmewbed(Yzg^PoLRlIlHs9@dPBs$Si!e+Zre+j>ZIlY^;;_o^*uV%cG7eP#y9;}@rI z@MhZzboTfvi^+Pud0}VAJG{z;AHQ&aFG=8Za<^vn_em~xApG8i?-Lp0*@EU9@Src${wQ*MVp%2o*s{4lMpW}>yX#Yqyc|;lS)XHd zIohkF-IYmg81evt#wrLZTu!bIUM8;7bGAI4MO~%4BtBe!2)J zhF?36N7^cLIA3+Fww&UmqMSE+6BB-KsAeUN>tfR%kQXM$Bnnh^*_&-mj2tLQNR_2i zxFBj$vC-^>@aulRv3ZX?Ja;b?-eG5Z$PaED!fvo4c4%4;b9&sx9HRT< zxR;vf;q`yxOH7h`bhv31Q#%`GCR}wD1mTAVP5UH`cl zX2ll}Lq_#w)bdKeS0753t&kO=^nv%fplN%WXgM$0+M2i%&jYUE<)j1X&?^m+UxMl# z*P+cQ)^&H?O0X_-uj|rwUwU3z%J#)xi}zE0PPhwg2CmI}tlVsoUa@GbA)?&LdxU{f zDBtK=Kie-x5_u>*q1G}1t=IK8olUHx9lpgc4gSa{9(hd#Y>{-_mq@2L1TLc4 zf{aHypzV{e(ZyX7*A+i{x0d43ko}Z*G^Anw&v0^(*K&L_C zqfZrCp=HsH5Hgf$)~CPx_wWu2vukzrU;!C}=;N6bS}=8~&LpM9%dM~Tbaz)q{tFl~ zG>ly4u^`#)ZKh6lMJl0+A z;gvMnKW&j@DN;lL&Ij z6%E%%UOuy1Z|~1u>`BGe(bEZb(R~rD`@L`UX}e%n8a(A%#$)GluDZD4Dda+!7|uYa2odR+D+4&>a&Y-4)i?@1ybtV=LYEB%@FH)LN-tT-Oj*IcLx z;xa4Ic#;H4k-8N;_PKYi?kWFNIdu;|^5#BMpT;+;$|CHof)G?SC@GCwQTP-JsvM_L z0P~!2era8_n<#ieNr>^&#-y5v?WtWaR))Qm54X@4p}

+0Jk7iE}#BY34V+5bE@u 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 S?nI~nHxC4xiAhRX`o926$Lc)* literal 0 HcmV?d00001 diff --git a/tests/domain/modelling/fixtures/ashp_from_gas_boiler_instant_hw_001431_before.pdf b/tests/domain/modelling/fixtures/ashp_from_gas_boiler_instant_hw_001431_before.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0208fb6166f9192dece1317c65e9b505d7caebe0 GIT binary patch literal 80747 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 NG=gwhSmadY{|CU$vLFBe 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 50c7f7cd..e5841e37 100644 --- a/tests/domain/modelling/test_elmhurst_cascade_pins.py +++ b/tests/domain/modelling/test_elmhurst_cascade_pins.py @@ -641,3 +641,53 @@ def test_ashp_overlay_reproduces_the_relodged_after_from_a_gas_boiler() -> None: # Act / Assert _assert_overlay_reproduces_after(before, after, option.overlay) + + +def test_ashp_overlay_reproduces_the_relodged_after_from_a_gas_boiler_instant_hw() -> None: + # Arrange — a gas boiler whose hot water is electric/instantaneous (water- + # heating SAP code 909, no cylinder) re-lodged as an ASHP. This exercises the + # overlay's water_heating_code reset (909 -> 901, "from the heat pump") that + # boiler-1 didn't (its HW was already 901). The relodged after lodges control + # 2209 vs the overlay's 2210 — SAP-equivalent zone controls, so the cascade + # still closes at 1e-4. + before: EpcPropertyData = parse_recommendation_summary( + "ashp_from_gas_boiler_instant_hw_001431_before.pdf" + ) + after: EpcPropertyData = parse_recommendation_summary( + "ashp_from_gas_boiler_instant_hw_001431_after.pdf" + ) + recommendation: Recommendation | None = recommend_heating(before, _AnyProduct()) + assert recommendation is not None + option = next( + o for o in recommendation.options if o.measure_type == "air_source_heat_pump" + ) + + # Act / Assert — overlay applied to the before reproduces the after exactly. + _assert_overlay_reproduces_after(before, after, option.overlay) + + +_BOILER_INSTANT_HW_FUEL_REASON: Final[str] = ( + "Blocked on the Elmhurst mapper deriving main_fuel_type for a gas boiler " + "lodged with EES code 'BGB' / Main Heating SAP code 102: it currently maps " + "to '' (empty), so Sap10Calculator raises MissingMainFuelType when " + "baselining the raw before. (boiler-1's 'RGE' resolves to mains gas 26; " + "'BGB' has no mapping.) The ASHP overlay still reproduces the after exactly " + "because it overwrites main_fuel_type -> 30, so the cascade pin above passes " + "— only baselining the unmodified before is blocked. Flips green once the " + "mapper derives mains gas (26) from the gas-boiler SAP code. Owner: " + "mapper/extractor front." +) + + +@pytest.mark.xfail(strict=True, reason=_BOILER_INSTANT_HW_FUEL_REASON) +def test_gas_boiler_instant_hw_before_baselines() -> None: + # The Modelling pipeline baselines the dwelling before modelling it, so the + # before must be scorable on its own. This one is not yet: its main fuel is + # unresolved (see reason). A failing tripwire for the separate mapper fix. + # Arrange + before: EpcPropertyData = parse_recommendation_summary( + "ashp_from_gas_boiler_instant_hw_001431_before.pdf" + ) + + # Act / Assert — currently raises MissingMainFuelType. + Sap10Calculator().calculate(before)