From 67564caffcf9d477ea3b0565041f462af798556b Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Mon, 25 May 2026 17:53:53 +0000 Subject: [PATCH] =?UTF-8?q?Slice=2076:=201:1=20windows=20expansion=20in=20?= =?UTF-8?q?cohort=20000480=20(2=20=E2=86=92=207=20entries)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes the final `sap_windows: LEN 7 vs 2` divergence by replacing the cohort 000480 hand-built's 2-window collapsed encoding with 7 SapWindow entries mirroring the Summary §11 1:1. Single glazing-type group (PVC double / g⊥=0.76 / U=2.8); per-bp totals preserved: Main NE (orient=2): 8.74 m² split into 2.16 + 1.92 + 0.6 + 1.32 + 2.04 + 0.7 (6 rows) Ext1 SW (orient=6): 1.80 m² unchanged Mapper interleaves the Ext1 SW row between Main NE rows 4 and 5; the hand-built mirrors that order so list-position diffs are zero. `window_location` carries "Main" or "1st Extension" — same string- encoded per-bp lookup pattern as Slice 69 (cohort 000474). Cascade output unchanged: all 11 `_FIXTURE_PINS["000480"]` SapResult pins remain GREEN at 1e-4 against worksheet `SAP value 61.2986`. **Cohort 000480 is now fully Layer-2 GREEN** — `test_from_elmhurst_site_notes_matches_hand_built_000480` passes with zero load-bearing divergences between the mapped EpcPropertyData and the hand-built fixture. Full sweep: 104 passed (was 103 pre-Slice-74; +1 new diff test), 10 failed (same 10 001479-related as before). Pyright net-zero. Co-Authored-By: Claude Opus 4.7 --- .../tests/_elmhurst_worksheet_000480.py | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/packages/domain/src/domain/sap/worksheet/tests/_elmhurst_worksheet_000480.py b/packages/domain/src/domain/sap/worksheet/tests/_elmhurst_worksheet_000480.py index 6279d326..24724997 100644 --- a/packages/domain/src/domain/sap/worksheet/tests/_elmhurst_worksheet_000480.py +++ b/packages/domain/src/domain/sap/worksheet/tests/_elmhurst_worksheet_000480.py @@ -401,11 +401,31 @@ LINE_73_M_TOTAL_INTERNAL_GAINS_W: tuple[float, ...] = ( # ============================================================================ # §6 Solar gains — cert-derived inputs + expected outputs # ============================================================================ -# 2 wall windows, both Manufacturer g⊥=0.76 / PVC: NE 8.74, SW 1.80. +# 7 wall windows mirroring the Summary §11 1:1, matching the Elmhurst +# mapper's per-row extraction (mapper-vs-hand-built field-parity test). +# Single glazing-type group (Manufacturer g⊥=0.76 / PVC / U=2.8). Per- +# bp totals preserved (cascade-equivalent): +# Main NE (orient=2): 8.74 m² split 2.16 + 1.92 + 0.6 + 1.32 + 2.04 + 0.7 +# Ext1 SW (orient=6): 1.80 m² unchanged # No roof windows, no rooflights. SECTION_6_VERTICAL_WINDOWS: tuple[SapWindow, ...] = ( - make_window(orientation=2, width=8.74, height=1.0, solar_transmittance=0.76), - make_window(orientation=6, width=1.80, height=1.0, solar_transmittance=0.76), + # Windows on Main — NE (orient=2) + make_window(orientation=2, width=2.16, height=1.0, solar_transmittance=0.76, + u_value=2.8, window_location="Main"), + make_window(orientation=2, width=1.92, height=1.0, solar_transmittance=0.76, + u_value=2.8, window_location="Main"), + make_window(orientation=2, width=0.60, height=1.0, solar_transmittance=0.76, + u_value=2.8, window_location="Main"), + make_window(orientation=2, width=1.32, height=1.0, solar_transmittance=0.76, + u_value=2.8, window_location="Main"), + # Window on Ext1 — SW (orient=6) + make_window(orientation=6, width=1.80, height=1.0, solar_transmittance=0.76, + u_value=2.8, window_location="1st Extension"), + # Two more Main NE entries (mapper interleaves Ext1 SW between them) + make_window(orientation=2, width=2.04, height=1.0, solar_transmittance=0.76, + u_value=2.8, window_location="Main"), + make_window(orientation=2, width=0.70, height=1.0, solar_transmittance=0.76, + u_value=2.8, window_location="Main"), ) SECTION_6_ROOF_WINDOWS: tuple[RoofWindowInput, ...] = () SECTION_6_ROOFLIGHTS: tuple[RooflightInput, ...] = ()