From 6baf66cddea80f825fceca6c85a3a4301a7a7e7e Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Mon, 25 May 2026 17:02:04 +0000 Subject: [PATCH] =?UTF-8?q?Slice=2068:=20party-wall=20"U=20Unable"=20+=20c?= =?UTF-8?q?entral=5Fheating=5Fpump=5Fage=5Fstr=20=E2=86=92=201=20diff=20le?= =?UTF-8?q?ft?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes 4 of 5 remaining cohort 000474 diffs (5 → 1): **Mapper:** Add "U" → 0 to `_ELMHURST_PARTY_WALL_CODE_TO_SAP10`. The modal cohort lodgement Summary §7 "Party Wall Type: U Unable to determine" was previously falling through to None; the cohort hand- built convention uses 0 as the explicit "unknown" sentinel. The cascade resolves both 0 and None to the same `u_party_wall` default (0.25), so cascade output is unchanged. Closes 3 diffs (one per bp). **Hand-built:** Set `central_heating_pump_age_str="Unknown"` on cohort 000474 Main heating detail (post-construction since the helper doesn't expose the kwarg). Matches the Elmhurst mapper's surfaced value from Summary §14 "Heat pump age: Unknown" — the str dual- encoding internal_gains.py reads. Closes 1 diff. All 66 cohort cascade pins remain GREEN at 1e-4. Pyright 35-error baseline preserved on mapper.py; 0 errors on the hand-built file. Remaining 1 diff on cohort 000474: - `sap_windows: LEN 7 vs 5` — the cohort hand-built collapsed §11 by glazing-type × orientation × bp group (preserving total area, cascade-equivalent but not field-equal); the mapper extracts 1:1 with the worksheet's 7 §11 table rows. Next slice will expand the hand-built to 7 individual SapWindow entries matching the mapper. Co-Authored-By: Claude Opus 4.7 --- datatypes/epc/domain/mapper.py | 6 ++++++ .../sap/worksheet/tests/_elmhurst_worksheet_000474.py | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/datatypes/epc/domain/mapper.py b/datatypes/epc/domain/mapper.py index f9e8f0d1..e500c32e 100644 --- a/datatypes/epc/domain/mapper.py +++ b/datatypes/epc/domain/mapper.py @@ -1867,6 +1867,12 @@ _ELMHURST_PARTY_WALL_CODE_TO_SAP10: Dict[str, int] = { "CU": 4, # Cavity masonry unfilled — same U=0.5 cascade; Elmhurst # encodes party-wall cavity type with the masonry sub-code # (CU vs CF filled) — observed first on cert 001479 Main. + # "U Unable to determine" — the cohort's modal lodgement. The cohort + # hand-built convention uses 0 as the explicit "unknown" sentinel + # (rather than None) so cross-mapper field parity is preserved; the + # cascade resolves 0 to the same `u_party_wall` default (0.25) as + # None, so cascade output is unchanged for cohort-style certs. + "U": 0, } diff --git a/packages/domain/src/domain/sap/worksheet/tests/_elmhurst_worksheet_000474.py b/packages/domain/src/domain/sap/worksheet/tests/_elmhurst_worksheet_000474.py index 6e953323..8b2d8dbd 100644 --- a/packages/domain/src/domain/sap/worksheet/tests/_elmhurst_worksheet_000474.py +++ b/packages/domain/src/domain/sap/worksheet/tests/_elmhurst_worksheet_000474.py @@ -221,6 +221,11 @@ def build_epc() -> EpcPropertyData: epc.sap_heating.shower_outlets = ShowerOutlets( shower_outlet=ShowerOutlet(shower_outlet_type="Non-electric shower"), ) + # Summary §14 "Heat pump age: Unknown" — surfaced by the Elmhurst + # mapper as the str dual-encoding that internal_gains.py reads. + # `make_main_heating_detail` doesn't expose the str kwarg, so set + # here post-construction for cross-mapper field parity. + epc.sap_heating.main_heating_details[0].central_heating_pump_age_str = "Unknown" return epc