From ac68cf88a0a3e4994264e04285f723ee0bfe9935 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Fri, 22 May 2026 23:37:28 +0000 Subject: [PATCH] Slice 23: 000516 detailed RR + exposed_floor + door_count fixture lodgement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mirrors S16a for 000516 — the second Simplified-Type-1 fallback fixture in the cohort. PDF lodges detailed §3.10 RR + exposed Main floor + 2 doors; fixture previously lodged only `SapRoomInRoof( floor_area=19.02)` Simplified fallback + `is_exposed_floor=False` + `door_count=1`. Lodgement changes: - `detailed_surfaces` on the Main RR: 7 surfaces per PDF §3 lines (30)/(32) — 1 flat ceiling 3.56 m² uninsulated, 2 stud walls 3.88 m² @ 100mm mineral_wool (Table 17 col 3a → U=0.36), 2 slopes 6.41 m² uninsulated (U=2.30), 2 gable walls 13.11 m² treated as party at U=0.25. - `is_exposed_floor=True` on Main floor=0 (28b "Exposed floor Main 35.76 × U=1.20"). Floor sits over an unheated space, not earth. - `roof_insulation_thickness=0` on Main — PDF (30) "External roof Main 15.56 × U=2.30" UNINSULATED Table 16 "none" row. - `door_count` 1 → 2 to match PDF (26) total area 3.70 m² = 2 × 1.85. Impact on §3 cascade pins: pin | before slice 23 | after slice 23 ----------|-----------------|--------------- LINE_31 | +20.37 m² Δ | +0.0025 m² Δ (sub-display) LINE_33 | -6.75 W/K Δ | -0.82 W/K Δ (rooflight gap, slice 25) LINE_36 | +3.06 W/K Δ | +0.0004 W/K Δ (sub-display) LINE_37 | -6.75 W/K Δ | -0.82 W/K Δ Remaining 0.82 W/K LINE_33 gap is the rooflight: PDF lodges a 1.18 m² roof window on line (27a) at U_eff=2.9930 (Table 24 metal-frame pre-2002 raw 3.4 + curtain). Our §3 cascade doesn't yet incorporate roof windows — they're defined in SECTION_6_ROOF_WINDOWS for solar gains but not in the heat-transmission path. Slice 25 will add (27a) line-ref handling. §3 cascade pin count unchanged at 23 FAIL / 1 PASS — the 000516 residuals dropped 10× but still > abs=1e-4. The downstream §4-§12 cascade for 000516 likely tightens once §3 closes. Co-Authored-By: Claude Opus 4.7 --- .../tests/_elmhurst_worksheet_000516.py | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/packages/domain/src/domain/sap/worksheet/tests/_elmhurst_worksheet_000516.py b/packages/domain/src/domain/sap/worksheet/tests/_elmhurst_worksheet_000516.py index dabc4f70..b4c50656 100644 --- a/packages/domain/src/domain/sap/worksheet/tests/_elmhurst_worksheet_000516.py +++ b/packages/domain/src/domain/sap/worksheet/tests/_elmhurst_worksheet_000516.py @@ -29,6 +29,7 @@ from datatypes.epc.domain.epc_property_data import ( SapBuildingPart, SapFloorDimension, SapRoomInRoof, + SapRoomInRoofSurface, SapVentilation, SapWindow, ) @@ -67,6 +68,11 @@ def build_epc() -> EpcPropertyData: total_floor_area_m2=35.76, party_wall_length_m=18.14, heat_loss_perimeter_m=7.89, floor=0, + # 000516 line: "Exposed floor Main 35.76 × U=1.20" (28b) + # — the Main ground floor sits over an unheated space + # (passageway / over-garage), not earth. Routes via + # Table 20 (`u_exposed_floor`) to U=1.20. + is_exposed_floor=True, ), SapFloorDimension( room_height_m=3.00, # = 2.75 internal + 0.25 floor structure @@ -77,7 +83,39 @@ def build_epc() -> EpcPropertyData: ], sap_room_in_roof=SapRoomInRoof( floor_area=19.02, construction_age_band="A", + # 000516 §3.10 RR detailed surfaces: 2 stud walls @ 100mm + # (Table 17 col 3a → 0.36), 2 slopes uninsulated (col 1a + # "none" → 2.30), 1 flat ceiling uninsulated (col 2a "none" + # → 2.30), 2 gable walls treated as party at U=0.25. + detailed_surfaces=[ + SapRoomInRoofSurface( + kind="flat_ceiling", area_m2=3.56, + insulation_thickness_mm=0, + ), + SapRoomInRoofSurface( + kind="stud_wall", area_m2=3.88, + insulation_thickness_mm=100, insulation_type="mineral_wool", + ), + SapRoomInRoofSurface( + kind="stud_wall", area_m2=3.88, + insulation_thickness_mm=100, insulation_type="mineral_wool", + ), + SapRoomInRoofSurface( + kind="slope", area_m2=6.41, + insulation_thickness_mm=0, + ), + SapRoomInRoofSurface( + kind="slope", area_m2=6.41, + insulation_thickness_mm=0, + ), + SapRoomInRoofSurface(kind="gable_wall", area_m2=13.11), + SapRoomInRoofSurface(kind="gable_wall", area_m2=13.11), + ], ), + # 000516 line: "External roof Main 16.74 - 1.18 = 15.56 × U=2.30" + # (30) — uninsulated storey-below roof. Lodge thickness=0 so the + # u_roof cascade picks the Table 16 "none" row. + roof_insulation_thickness=0, wall_thickness_mm=400, ) return make_minimal_sap10_epc( @@ -86,7 +124,10 @@ def build_epc() -> EpcPropertyData: sap_building_parts=[main], habitable_rooms_count=3, heated_rooms_count=3, - door_count=1, + # 000516 PDF (26) lodges total door area 3.70 m² = 2 × _DEFAULT_DOOR_ + # AREA_M2 (1.85). Same as 000477/000480 — single worksheet entry + # but the area resolves to 2 physical doors. + door_count=2, percent_draughtproofed=75, low_energy_fixed_lighting_bulbs_count=SECTION_5_BULB_COUNT_LEL, sap_windows=list(SECTION_6_VERTICAL_WINDOWS),