Model/backend/documents_parser
Khalim Conn-Kowlessar e628f807b5 Slice S0380.126: resolve Elmhurst bare "Underfloor Heating" via RdSAP 10 §10.11
Elmhurst Summary §14.0 Main Heating1 sometimes lodges the bare form
"Heat Emitter: Underfloor Heating" without a subtype qualifier (in
screed / timber floor). The mapper's `_ELMHURST_HEAT_EMITTER_TO_SAP10`
dict only carried the qualified forms, so the bare lodging fell through
to None and was passed as a raw string into `MainHeatingDetail.heat_
emitter_type` — causing `_responsiveness` to strict-raise
`UnmappedSapCode` on every cert with this lodging (2 variants on the
heating-systems corpus: `electric 1` + `oil 6`).

Per RdSAP 10 Specification §10.11 Table 29 page 56 ("Heating and hot
water parameters"):

  > "Underfloor heating: If dwelling has a ground floor, then according
  >  to the floor construction (see Table 19 if unknown):
  >    - solid, main property age band A to E: concrete slab
  >    - solid, main property age band F to M: in screed
  >    - suspended timber: in timber floor
  >    - suspended, not timber: in screed
  >  Otherwise (i.e. upper floor flats), take floor as suspended"

New helper `_resolve_elmhurst_underfloor_subtype` keys off the main BP's
`floor.floor_type` + `construction_age_band` and returns:

  - SAP10.2 Table 4d emitter code 2 (in screed) → R=0.75 — for
    solid + age F-M, suspended-not-timber, and upper-floor-flat cases
  - SAP10.2 Table 4d emitter code 3 (timber floor) → R=1.0 — for
    suspended-timber

The solid + age A-E "concrete slab" branch (R=0.25) has no cert-side
enum entry yet, so the helper strict-raises `UnmappedElmhurstLabel`
when that combination lands — the next variant lodging an A-E solid
underfloor will surface the gap loudly per
[[reference-unmapped-sap-code]].

Property 001431 (the heating-systems corpus dwelling) lodges §9.0
"Type: S Solid" + §3.0 "Date Built: G 1983-1990" (age band G ∈ F-M)
→ "in screed" → code 2 → R=0.75. Both `electric 1` and `oil 6` now
cascade-execute (corpus tally 32 → 34 OK / 41 populated).

Extended handover suite at HEAD post-slice: **830 pass, 0 fail**
(was 829 + 1 new AAA test).

Pyright net-zero on touched files (45 → 45 — pre-existing errors
unrelated).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-01 16:28:48 +00:00
..
handler address JTK review comments 2026-04-20 15:11:17 +00:00
tests Slice S0380.126: resolve Elmhurst bare "Underfloor Heating" via RdSAP 10 §10.11 2026-06-01 16:28:48 +00:00
__init__.py Map to RdSapSiteNotes from site notes JSON 🟥 2026-04-16 13:54:03 +00:00
db_writer.py include updating epc_property_data to pashub to ara workflow 2026-04-29 09:55:14 +00:00
elmhurst_extractor.py Slice S0380.102: Wire MEV decentralised cascade into pumps_fans (SAP 10.2 §2.6.4 + Table 4f line 230a) 2026-06-01 16:28:47 +00:00
extractor.py Handle wall thickness "Unmeasurable" 🟩 2026-04-30 16:41:16 +00:00
local_runner.py update local runner to work for elmhurst 2026-04-24 14:01:36 +00:00
parser.py load ecmk site notes to db 2026-04-29 11:20:47 +00:00
pdf.py update local runner to work for elmhurst 2026-04-24 14:01:36 +00:00