Model/datatypes/epc/schema
Khalim Conn-Kowlessar 363f14fbb2 fix(mapper): read dropped detailed room-in-roof slope + stud-wall surfaces
The gov-EPC API lodges a Detailed RR (RdSAP 10 §3.9, Figure 4) with up to
two sloping ceilings (`slope_*`) and two vertical stud/knee walls
(`stud_wall_*`) in addition to the gable + flat-ceiling surfaces. Those
slope/stud fields were undeclared on the 21.0.x schema, so `from_dict`
silently dropped them and `_api_rir_detailed_surfaces` built ONLY the gable
+ flat-ceiling surfaces. The (large) sloping roof and the knee walls
contributed ZERO heat loss → undercounted RR fabric loss → a systematic
over-rate.

Fix: declare `slope_*`/`stud_wall_*` on `RoomInRoofDetails`
(rdsap_schema_21_0_0 + _21_0_1) and build `kind="slope"` / `kind="stud_wall"`
surfaces in the mapper. The cascade's Detailed-RR branch already routes both
to the roof aggregate via `u_rr_slope` (Table 17 col 1) and `u_rr_stud_wall`
(Table 17 col 3) — RdSAP 10 §5.11.3, p.43-44 — so no calculator change is
needed (Summary path worksheet-validated by the 000565 detailed-RR fixtures).
insulation_type is left None to defer to the Table 17 col-(a) mineral-wool
default, mirroring the existing flat_ceiling branch.

15 /tmp certs carry `slope_height_1`: cohort mean|err| 4.26 -> 2.05, signed
+4.09 -> centred (14/15 were over-rating; e.g. 0390-2538 +5.95 -> +3.56).
Gauges: corpus within-0.5 67.3% -> 67.5% (MAE 1.020 -> 0.987); /tmp 71.4% ->
71.6% (MAE 0.882 -> 0.846). Harness 47/47 0 raised; regression = the 3
pre-existing fails; pyright net-zero (65=65).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 05:56:47 +00:00
..
tests Slice 44: flat_roof_insulation_thickness mapper fix — surface lodged value on SapBuildingPart 2026-05-24 15:28:10 +00:00
__init__.py first draft dataclasses with loading tests 2026-04-10 11:33:17 +00:00
common.py first draft dataclasses with loading tests 2026-04-10 11:33:17 +00:00
helpers.py slice 10.5: PhotovoltaicArray on SAP10 schema + EpcPropertyData 2026-05-16 16:00:25 +00:00
rdsap_schema_17_0.py Map RdSAP-Schema-17.0 certs to EpcPropertyData 🟩 2026-06-12 12:45:19 +00:00
rdsap_schema_17_1.py Dispatch and map RdSAP-Schema-17.1 certs end-to-end 🟩 2026-06-11 12:21:17 +00:00
rdsap_schema_18_0.py Map Not-Defined glazing code to a valid type for windowless 18.0 certs 🟩 2026-06-11 11:55:46 +00:00
rdsap_schema_19_0.py Map RdSAP-Schema-19.0 certs to EpcPropertyData 🟩 2026-06-12 12:29:36 +00:00
rdsap_schema_20_0_0.py fix(mapper): handle 'ND' multiple_glazing_type on RdSAP-Schema-20.0.0 2026-06-15 06:43:55 +00:00
rdsap_schema_21_0_0.py fix(mapper): read dropped detailed room-in-roof slope + stud-wall surfaces 2026-06-16 05:56:47 +00:00
rdsap_schema_21_0_1.py fix(mapper): read dropped detailed room-in-roof slope + stud-wall surfaces 2026-06-16 05:56:47 +00:00