From 32f19166192f676c3e2fbe888df248940fdd1fc3 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Sat, 6 Jun 2026 21:33:09 +0000 Subject: [PATCH] test(modelling): finalize Vaillant ASHP swap on the cascade pins The representative heat pump is now the Vaillant aroTHERM plus 5 kW (index 110257, committed with the generator). boiler-3's after-cert is re-sourced from the corrected Vaillant relodgement and its cascade pin passes at delta 0 (SAP 63.85 -> 72.30). boiler-1 and boiler-2(instant-HW) pins are xfail pending their own corrected Vaillant after-certs (_ASHP_PRODUCT_REPIN_REASON). Co-Authored-By: Claude Opus 4.8 --- ...stem_boiler_with_cylinder_001431_after.pdf | Bin 79441 -> 79456 bytes .../modelling/test_elmhurst_cascade_pins.py | 19 ++++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/tests/domain/modelling/fixtures/ashp_from_system_boiler_with_cylinder_001431_after.pdf b/tests/domain/modelling/fixtures/ashp_from_system_boiler_with_cylinder_001431_after.pdf index 6c820b5268f34c3d5c99ed90d462dd83e0f0df49..76ed5e224000709a215df26e2d577f3abd81d2bd 100644 GIT binary patch delta 3267 zcmZXVX*3j!!^I6^3}%qBJeVQNSkjo7jVxm)>ky)3D|=%Zdrim^${=KmCnBt<$faeqJr&K)sP@qcd zw<*}#=nOMQOSJ&V_VppTXQ3-;KlR@Dq_ER|Q*mfSDDeGGZT1J zT}Kr}lH$99Oq%oFcS+v#D#4)cDX~w)J+mYzPEPh)I2h}~#u%RF|0^fE5=;MJA9u6C-vM;LZ9ntrV;=a{(NQhHbGL#zceZ9;ZV0A}UUmw3V zQpp!G-l}e0oRTj=eCvXA6jc^`m!dp3(`rJzWqn6Ejf;2?UwPMXX-iOxF~h=rvmqo8 zbfO}YLyn3tciF)TgLWOAjv<-Z>qCdEksT45AosYaC4_tkI&xtC`qnR+d{ZTw9IDE} zy(7~3$Vdd=ES2Up)W>j-=EFmW9TTW4A7$Hn@CBQ|qsBL>scV#HGIejN0wt|>GB&Np zbLF#$@C*1Wn-e-a2ufG~`!(k(AybeDDI)0snR+1N1-G{O%4*(S7CsFj8BOj7YYHd| z7*kq>OdfmeUd!)`9VtI~*BR+br;t_(Fh)NaO|A84Vt}d#Rxts>21l13>Qqh<9nxY3_P+@9NsiHcOptr@2M@T4*OD8qv^AdUb-8WBXm3t4K}ak&80;t2YcTZow> zeC10^t{MBFqkHkO-wW`3+w8JqZot5Obh5W*86jPY*+EVVDJ%RG3N7Md0*99hQy2v$1wfWdq*hxY&;dRMg$4 zYFSem$^akx6+?g5W7jMfEJA|2Aeabsbl)CJ4Af6d;z6m}p5uOgBbxP}Xp-!b#xyra zJ7Rw_z%8TLUi}vhn53*UP#I`Z~sj(?qoCnlkSjx zC2&_zC-&H9$91@)eD*_xs`>EzT+#R@REIx%2KxM*L3-SKbxS#uT#w8UseK|=7j!0C zQzyb@SyKI(Ym!N66QW$^R3eJUUR06u00C#Q_i`r+#07V)tL!KdB-5!vTeNmk&6lvW zyw5sJv*%6b!Z(@4w4FQ6sO1rwPLB|X}Ju|x<;dtM=i7+Odswr z<>aL4vLnxy3vZn;TmV=iH4)W$e1JG6vYZT3QPIoW)4|3KWFGe3qR(>*#n!YgelV;r zzZeIg!17akaAnst`^Sr2#JBgfdMItF!klbT3k^n(pR`HutA->wy2o#~Tx~m3+_;cF z%jZJC$w8xBb2322a;SPJFn40@J>)UzcgalN{R%Sh6tNm@$k4~Qe9*EwRy5*9F!YZI+%PbHmnWv;&3N=7X8K~&8Or!f*U&63S2J1W(uQ~;`oGFH` zW4df|*kGBvW^C^`Xxy&+X&}?q+#&}8AUN&BV0k%$#xmhsR7*9tf^!J5|2fONU3!jF z`qbsfmv3XjeaA{~n_cS63q0bPv1Z-MJ(2ZP?&BnBbct9$GWuI<#fMud3CZZE{Y<3!Q;>fs=&n9|B+PN>D zh#E44mc}yyZC?pLxPc6HQCbSg4F?;0n_%uKethRL3b_U)S z@(vCmH?Y;iDq!|4+gi=zpB?>j%5X4xeJte*wg>pmvkn%6C-WXFacfHB139}Qp=w5? zQ66=qeIFb*W>M8$7V`V0cioyQy1Tg2|J~~KwCjZxH!D+W%F#G8H;JA(!{sxJ>h30Q z)2qayQca(vaO2_K*nM254oxYi$Y;@R?xKV$UF^t$Iw0fAw4RV__p~F3olBF%w^-^} zo!hGO5ybL{%t58oTzs@|e<&^8lr|Qe?`Pc+rxXcZ_<&oFxu#U03r)r_%_e^uRdfTU z7`w9uJ`0zs6|DtkpICw(!7MRlfCMLg3Lu;1tZC2Ek?J(=Z3B+zqdV;W+-;sgsvmn) z9Egpnn65oK#p>;74qI(9=kW^AP_E&eg@!b&GRMf5@$DG>rs3P0K(|0)vf@mZFVIO zt*bA<0zQ7~U){(5(kLOG{83~PpJX6$1Rch#hLob*9Q;0Po)=nLQhkIWrJS)O-oMNr z$GeeLq&wf5$v=!%mRys+7v_ksIN%?UU$`5)ad*B3^?fg+Rbr)JH6#DLkOj5*=ro-3 zTZ7M#1K{v5yIw}Bx}Aw@*E6v-mKSYza?02R2G6|=Cmd0fmIE@XEuQmxC}r1KWBhxm zS?c|^^>CE#tl!^b&*#B49|n0du2J1yG!5o@r#kWUkA%~l6y7?C zx0>SA5Cb)?oIcd50BZ#1t?X>wG9-<<*-{UL!eLdRIYASZNC=ajLCM=j(e5{%wK@HZ z#T$&fY`&wh@dg-61Ao){#-B~o-c{se)-t+bfx46FvC8%H!isepF6V>HtBYPh)FFI! zyJu7B!4~gDE28hJB*C2fM|bbxv1PMqyomWPMA-_{Tkg}{feEP;3D>9>?J#U`S=eDf z92c=lBHlBoeGp|JMy!;$SS;d~Y{*{wMqW_gcVdVbB&nWu?Uceh`NEse*l8K5{Li* delta 3262 zcmZXUWmFW3)`l4wqhVB_^h8j@dPy&KTNGjb*9~glFY3UiHQHPWsC8Ze-Dcu}N zDd`4D@AuvNs{Ujj_m@&Y5~+t07L@~6CekG=Ama1H?)t&Jn~GA z3;R=pdNNKY+1AW1xzLwc^Hk|=ScbWgNyhR1ScS1}8aR-8VMufH??(k{ z5DL{C(amCxyT#g>jjm2xh8^jKp!qz*Hy*p_a5IuY~9%9 zdUSuMk(OX|Kd5oKdK_m}iXwz+cqI+%D*#b&PP9?q<-jnQttFccDV%l7NbsD1fYP)l zI#cNMhCkjL18Ln963Rl-=qR*nCCtmAGIbMqyqdH}x5oUVv>-}^jN{j6a0XK%7Hg>J zFA)Q&_ZrJ^cPgXE-OQ%SCLfJ+5u|HukYutN$zU4YAjxfYsAL8y1e1-cI;UGIRWFyK z3898mr9XJ4vx8~k2uKTyyROZjsM8SQ{G*lBHfB?xk^PcqTy;QLq*1RY|9e%3V^!6c8bKY} zwEjU#k(5fqAhPuZ@A+k1Y(&)`^|7`HNEf1h%;lpcdmdHaM_P`($C(e&rVCW5 z!fdKnA;{B?R6jgPyccOm-c0?V{-c%2EBSJogp~G(6rCbv0Clg^3oNsSLJ|nB>Ac+>&wc{&V`KM0UUpL{dS!=Qck@F(T=`UcK2^?_xWi5k3lN~&+5VBa0Ge{yg^ENBwB>w1FjcHm-ZT zCmq)X5%VC}IWe;uLsBiB8rYeK3OTGs7Bs51&?~Rjki|fJZS&jzh<+5S8M?N*JyD&Q z&Q1R_K*%tRYfix!Y^lQW(}E^}BH9fyPnvCciu*>Wl05Dcz~4L$xYk24%@-&=AGv-xeG;aczZsP86Yk9Ez~dJ0iKtB(=b z_g>l9!W$79+F{K7g9IH6`|(uuF3t%JGYukvg^SM3%Seu|R__*<0uGJR&L~3hVcz%3 zOzw$nZ5T!BQJ@vvNAA$S*tK98I4FRzp`H^EN{*IQkWo?b_49GG^`v+fRb+1Y>W3yM zbki(1<549jHS36})MN_pp!2R!7SC}u77m!71qUF-bM6Y-&Vfjl1GeO zhagI5*2t_Relxv z=dwLWNGB~zEVeeAiqwGC?59Fc=*ORHc!nxTlKZY636uOL;&UY~%vzdTxrF}L{=-v> z)~dB1=U$OhMo)`T>-g!|$7eYB1r_3%4UetK||r?#gcF}doZkzXIy z)1LUE%!wg#d6z=dLc%Yt*ywqK)A)YA$9-%`a^YWInD|f_5^v zTt-KWGF;|XY})lq|Jk!fS`20o(%UYm|FA3vBeM*NImHA7Cv(yC%|(u z;(Tud?9`Re;}%XQ-}?T~_ceVG(GqHca3StGFUWyU);X2s7%MJ1Vo}paiGHRWeNC(^`6i&}-)eEb{+;Iq9P=AMaJ>M16=i-|_M!lPh{gM?(ZR_tF1C zA3efHQE~wHvLhCpuz)CQW*u0Mcz(Psvz>@m;6fM>cJfSnjw_T~pfz3JY(EXE{B_&F zKkQWa^=~FqI1&JH_Isw4pV$bk7L3GrbN*KMtrH05-lF7))#xijb9iU0@7P^truK<< zS~3*@p(UH#zD%#X9M}w=%Vc2%T{ybzQ!s(*2a}~(pK<;%3px}2n%7{(U$mQq4Td?0vci?RtMbS?qz_TY#dXVEZ(*Ycs8?BK)r?mDwkiO(dHO?e<_ z*W+y^n^(WD?8{b7zI|(3@ZX=(fFbr<6XY>G-%UPk0j=9I+|Pv?(rSP-jQ7^Q^Sk)3 zrv8c|0V;=Ls@Bb4H+?C?+GjX=aR2hlhV-xpGHKb=zAPNj?%bU7GvE(Gooh_eVX_msMN^@W*kf`%Cb+^LIV~zzxSHo zg0kT2gzv$rvSHBlzFosx-eO37L}TDw-84*U=y6GQtDw=2-Pgk5)%so1TZX#nl z|6b%|B;nHk%ivN{|M1|_^8fG<^0G4jo0XH4l=}yhl|%f8(fs$Y970Yu1B?JDlF7j- K1Ozk;H2(#GgB~CN diff --git a/tests/domain/modelling/test_elmhurst_cascade_pins.py b/tests/domain/modelling/test_elmhurst_cascade_pins.py index a082537e..e87c63b3 100644 --- a/tests/domain/modelling/test_elmhurst_cascade_pins.py +++ b/tests/domain/modelling/test_elmhurst_cascade_pins.py @@ -622,6 +622,19 @@ def test_hhr_storage_overlay_reproduces_the_relodged_after_from_no_system() -> N _assert_overlay_reproduces_after(before, after, option.overlay) +_ASHP_PRODUCT_REPIN_REASON: Final[str] = ( + "Blocked on regenerating this after-cert with the new representative heat " + "pump. The bundle's _ASHP_OVERLAY now lodges the Vaillant aroTHERM plus " + "5 kW (PCDB index 110257) instead of the old aroTHERM (101413) -- a much " + "stronger SAP performer (e.g. boiler-3: ASHP flips from -1.76 to +8.45 " + "SAP, verified at 1e-4 against the corrected Vaillant cert). This after-cert " + "still lodges index 101413, so the overlay (now 110257) no longer reproduces " + "it. Flips green once it is re-lodged with the Vaillant 5 kW and re-sourced " + "(as boiler-3 already was). Owner: cert-generation." +) + + +@pytest.mark.xfail(strict=True, reason=_ASHP_PRODUCT_REPIN_REASON) def test_ashp_overlay_reproduces_the_relodged_after_from_a_gas_boiler() -> None: # Arrange — a typical mains-gas combi house re-lodged as an air-source heat # pump (fuel 26 -> 30, SAP code 104 -> PCDB index 101413 + category 4, @@ -643,6 +656,7 @@ def test_ashp_overlay_reproduces_the_relodged_after_from_a_gas_boiler() -> None: _assert_overlay_reproduces_after(before, after, option.overlay) +@pytest.mark.xfail(strict=True, reason=_ASHP_PRODUCT_REPIN_REASON) 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 @@ -673,8 +687,9 @@ def test_ashp_overlay_reproduces_the_relodged_after_from_a_system_boiler_with_cy # boiler-1/boiler-2 didn't: those added a cylinder where none existed, whereas # here the overlay must overwrite the existing cylinder to the fixed heat-pump # cylinder (size 4 / insulation type 1 / 50 mm). The dwelling also goes off - # mains gas (fuel 26 -> 30, code 101 -> index 101413 + category 4, control - # 2113 -> 2210). + # mains gas (fuel 26 -> 30, code 101 -> Vaillant aroTHERM plus 5 kW index + # 110257 + category 4, control 2113 -> 2210). After-cert re-lodged with the + # Vaillant: ASHP raises this dwelling's SAP 63.85 -> 72.30. before: EpcPropertyData = parse_recommendation_summary( "ashp_from_system_boiler_with_cylinder_001431_before.pdf" )