From ac78771258aa36cc8a7bdbd9570d1c252f1ad360 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Thu, 4 Jun 2026 15:33:46 +0000 Subject: [PATCH] feat(modelling): solid-wall generator offers IWI-only for timber frame MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Slice 2b. Timber frame (wall_construction=5) takes internal wall insulation but not external (not constructable — ADR-0019), so the generator offers IWI only. Cascade pin: the IWI Option reproduces the re-lodged timber-frame after at abs(diff) <= 1e-4 (general Table 6 insulation-thickness bucket, not the solid- brick documentary path). Co-Authored-By: Claude Opus 4.8 --- .../generators/solid_wall_recommendation.py | 8 +++--- .../timber_frame_iwi_001431_after.pdf | Bin 0 -> 66034 bytes .../timber_frame_iwi_001431_before.pdf | Bin 0 -> 66038 bytes .../modelling/test_elmhurst_cascade_pins.py | 23 ++++++++++++++++++ 4 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 tests/domain/modelling/fixtures/timber_frame_iwi_001431_after.pdf create mode 100644 tests/domain/modelling/fixtures/timber_frame_iwi_001431_before.pdf diff --git a/domain/modelling/generators/solid_wall_recommendation.py b/domain/modelling/generators/solid_wall_recommendation.py index 14b84535..31e59403 100644 --- a/domain/modelling/generators/solid_wall_recommendation.py +++ b/domain/modelling/generators/solid_wall_recommendation.py @@ -29,8 +29,9 @@ from repositories.product.product_repository import ProductRepository _EXTERNAL_MEASURE_TYPE: Final[str] = "external_wall_insulation" _INTERNAL_MEASURE_TYPE: Final[str] = "internal_wall_insulation" -# RdSAP `wall_construction` code for solid brick (consistent across paths). +# RdSAP `wall_construction` codes (consistent across paths for 1-5). _WALL_SOLID_BRICK: Final[int] = 3 +_WALL_TIMBER_FRAME: Final[int] = 5 # `wall_insulation_type`: 4 = as-built / assumed (uninsulated) — the trigger. _WALL_AS_BUILT: Final[int] = 4 # `wall_insulation_type` the overlay lodges: 1 = external, 3 = internal. @@ -41,10 +42,11 @@ _WALL_INSULATION_INTERNAL: Final[int] = 3 _SOLID_WALL_INSULATION_MM: Final[int] = 100 # Which solid-wall Options each construction can take (ADR-0019). Solid brick -# takes both; timber-frame (IWI only), system-built, and the breathable -# cob/stone exclusions land in later slices. +# takes both; timber-frame takes IWI only (EWI not constructable). System-built +# and the breathable cob/stone exclusions land in a later slice. _CONSTRUCTABLE_OPTIONS: Final[dict[int, tuple[str, ...]]] = { _WALL_SOLID_BRICK: (_EXTERNAL_MEASURE_TYPE, _INTERNAL_MEASURE_TYPE), + _WALL_TIMBER_FRAME: (_INTERNAL_MEASURE_TYPE,), } _INSULATION_TYPE: Final[dict[str, int]] = { diff --git a/tests/domain/modelling/fixtures/timber_frame_iwi_001431_after.pdf b/tests/domain/modelling/fixtures/timber_frame_iwi_001431_after.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c24ae877c95975bec346492fee6e480e42d97ab9 GIT binary patch literal 66034 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
m*UU^J~sFwwMX)H+VHMC!Q!jbu)D!aX>Vnb zFEh*X>{BT!1!xkO%Uj``T9S{k$hf$;L$EL-gsDz+V46PK<$0`CtRA^K8@_Kw`g`lk z*9$J>*oaywJ47XiSZhvMJ(F>&ubCuNnRPw+pM4}Jr`R+w&XR4#@L{JZH81u#H!E(o zQ11EC8h$mMxLuPSiWBK!e2O=Su8&jbYxa6~XFN3}R>BI%ZG8s>tl)$1UJ{r%y1VaD zRk}L+=?u0F5FBh=9?YHo#yBB`32S&`ZmC=F5eylOwiP-!ICy>cSZt2Uls9;{Ic|rK zAESJG3)_E9>v}F=+Ir@fQhrAD#G)$>o-P zKdRc_X!k}uGA$`LuXt}`C2&d{#JP0DM!}f8V`}=_#YLpgkh!&_aehAN)NUj>MC%|_ zD>M}4kgcW0@Loy}eCHhQ>AG`pZ`Xym<4}0Tcg4e0!&zhNcbHk5KRq@tbYGN|9BjTn zn9Mc9^(F-QxO;5iZogpsd9#N}LexP1kHj(rix-Qj9bRy7Fsr(bP7cvHtrGff_WPXE zqH)hZjB#cWy}>2bikK~6i6@IS73E=~V+$QYA{~R@+uaplmk_r`8}_ZeUe8`H9btT_ z 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 literal 0 HcmV?d00001 diff --git a/tests/domain/modelling/fixtures/timber_frame_iwi_001431_before.pdf b/tests/domain/modelling/fixtures/timber_frame_iwi_001431_before.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fec38abb772ca7ba1df2428ce38ed0a4b127d24e GIT binary patch literal 66038 zcmeFa1yo#Jwx}CHf=iG<@B|O;!QBbLDp=v}P`CvT?(V^Z6cF6qo#5{78uS+b>A!EE z?)&=P?lC%vBn(W9j6oz! zEUb{c%&lw{t#$Ma7(@&lO!N#C#Dy4yOh9(>2DZXh7S>jl29UCFGRWyzK+<7k5Hm3c z8Q3z2nd^WIL=5z-^bHtf3@nWx3A3>?bMo=ofou(QED*o=9cUuhDTzltWT9LRl(PTa zck;JKH%DKy*$*Kc=<3*a>i(iFAS6_ds!vFu3wkDm6Yw61FykfRc9YtR%*hGUf{Dg- zpxTCl^5mY2`!nVXQNNe`6NM!|u9Q^_2@`v>eg5XtzS1Sf^WeO3VWh}nRZoW6Ob`+f zFSJGfxy}vD7AetifX_u>`Bez_sN$7EAQmvN;ot`sfyzKLFtQeOp4=~<{YdBe>#!qE znB*&C4%)1~f@a;Ecff0DhK+#cCTjy{_caT^60)a1%S_wMHANq;A^x(j8l z`>D9zTwe1naL5yEbsRb|xgwu&V$wVi!LRbG!{H56PL_eTgvW`JB>8pR-t5PQ+b`jr z5AsSBb}#KTN-?Xd7}5I3L1Cd=*(Im}FvULY%*1?jB@*hhzwCKqgKz96LM`N&?5;c4 zTF)>N5iT0t@o;Jys_5TFbu(xUO7Rk+;`++j@6WZxh7K0RBuY?7U*a~&o2&GJI5lc+ z&A+}HnSbO7?zFTx;siDhqc@o1SvT1B;HNxsHSNscuH?jQti^=)S*c!`={o z)Ua=VEWRi%X82*H%AT2<6>LwQifR58Ejxp+Paqs^7&m+B5q7W`%rSO8!0?+IUkVI^ zqq>4k?sik5zJ+$Y%dzyM!TZ&zb52tpLnsC775o_n;ld(2wmp9aH}&x@VCOVwY-tbQ zVbzP$v9)k4;2^<;>}@h_lL=FKot^bF%kH({NH#9CKD;@!u^28e)rOEY?1nOMt+8V7 zu{U;%(5!WWo6F)uUMcIy-P3i^7k!egw70)VYo$CI%XZSa)Ek77JSqwDO$u&#UV&-m zJO)Z1Mt13F9jdB^@(8H-pU)LR1W4@c&~))t zZ%$mdMhKW>$F=J8tF@9HGwiw;Ieuj~3 z_UCBj9UpI9FN$Bok|(690vGn)B7;S=UB0ohR* DbLLm!!$&^7V~nC&pos=17=Fk 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 No ) +def test_timber_frame_generator_offers_iwi_only_pinning_its_after() -> None: + # Arrange — timber frame takes IWI but EWI is not constructable (ADR-0019). + before: EpcPropertyData = parse_recommendation_summary( + "timber_frame_iwi_001431_before.pdf" + ) + iwi_after: EpcPropertyData = parse_recommendation_summary( + "timber_frame_iwi_001431_after.pdf" + ) + + # Act + recommendation: Recommendation | None = recommend_solid_wall(before, _AnyProduct()) + assert recommendation is not None + options: dict[str, MeasureOption] = { + option.measure_type: option for option in recommendation.options + } + + # Assert — IWI only, and it reproduces the re-lodged after. + assert set(options) == {"internal_wall_insulation"} + _assert_overlay_reproduces_after( + before, iwi_after, options["internal_wall_insulation"].overlay + ) + + def test_loft_overlay_reproduces_the_relodged_after() -> None: # Arrange before: EpcPropertyData = parse_recommendation_summary(