Slice 23: 000516 detailed RR + exposed_floor + door_count fixture lodgement

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 <noreply@anthropic.com>
This commit is contained in:
Khalim Conn-Kowlessar 2026-05-22 23:37:28 +00:00
parent 6be8fdb7b6
commit ac68cf88a0

View file

@ -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),