S0380.207: promote simulated case 6 to a full SapResult e2e fixture

With S0380.201-206 closing every line ref, the detached dual-oil case 6
(Main 1 radiators 51% / Main 2 underfloor 49%, different parts, no boiler
interlock, 6 roof-of-room rooflights) now matches its P960-0001-001431
worksheet to 1e-4 on the whole SapResult. Registered in
`test_e2e_elmhurst_sap_score.py::_FIXTURE_PINS` (11 pins):
  SAP 72 / cont 71.6597, ECF 2.0316, cost 1162.5374, CO2 5953.6679,
  space heat (98c) 11991.9611, main fuel (211)+(213) 14736.9564,
  HW (219) 4902.8601, lighting (232) 357.6571, pumps (231) 356.0.

This was the validation target the S0380.200 handover set. Updated the
fixture docstring's stale "§3-windows-only" scope note.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Khalim Conn-Kowlessar 2026-06-03 16:14:48 +00:00
parent d1ae87c7e9
commit 7344f600e6
2 changed files with 41 additions and 8 deletions

View file

@ -23,14 +23,24 @@ This cert surfaced two site-notes gaps fixed in S0380.199:
already-inclined "Double between 2002 and 2021" 2.30 (so the
inclination adjustment isn't double-applied).
SCOPE: this fixture pins only the §3 heat-transmission WINDOW line refs
(27)/(27a)/(31) NOT the full SapResult. Case 6 has a DUAL main heating
system (51% radiators + 49% underfloor, oil), and `SapResult`'s
`main_heating_fuel_kwh_per_yr` / `pumps_fans_kwh_per_yr` aggregate the
two systems differently from the worksheet's per-system (211)/(231)
lines, so a full SapResult pin isn't apples-to-apples. Heating is also
SAP code 127 here vs 0240's code 130 condensing combi — so case 6 pins
to its OWN worksheet, not 0240's register.
SCOPE: promoted to a FULL SapResult e2e fixture (S0380.207) once the dual
main heating system was fully modelled. Case 6 has Main 1 radiators (51%,
control 2106) + Main 2 underfloor (49%, control 2110) heating different
parts. Closing every line ref took: Table 4f note c) two circulation
pumps (231) S0380.201; Table 5a note a) two pump gains (70) S0380.202;
RdSAP §3.7 "Roof of Room" rooflights §3.10.1 RR residual (30) S0380.203;
SAP 10.2 p.186 two-systems-different-parts MIT weighted responsiveness
0.8775 + elsewhere two-control blend (87)/(90)/(98c) S0380.205 (with
the Main 2 emitter/control extractor fix S0380.204); and Eq D1 per-boiler
(204) space share (219) S0380.206. SapResult pins (Block 1 energy rating)
live in `test_e2e_elmhurst_sap_score.py::_FIXTURE_PINS["001431_case6"]`;
`main_heating_fuel_kwh_per_yr` is the (211)+(213) two-system sum. Heating
is SAP code 127 (vs 0240's 130 condensing combi) — case 6 pins to its OWN
worksheet, the spec authority for this dual-oil archetype.
The §3 window line refs (27)/(27a)/(31), the roof (30), the pumps (231),
the pump gains (70), the per-system fuel (211)/(213), and HW (219) also
have dedicated section pins in `test_section_cascade_pins.py`.
Source: user-simulated PDFs at `sap worksheets/golden fixture
debugging/simulated case 6/`. Summary mirrored into the tracked

View file

@ -42,6 +42,7 @@ from tests.domain.sap10_calculator.worksheet import (
_elmhurst_worksheet_001431_rr8 as _w001431_rr8,
_elmhurst_worksheet_001431_6035 as _w001431_6035,
_elmhurst_worksheet_001431_case5 as _w001431_case5,
_elmhurst_worksheet_001431_case6 as _w001431_case6,
)
from tests.domain.sap10_calculator.worksheet._elmhurst_fixtures import (
ALL_FIXTURES as _ELMHURST_FIXTURES,
@ -237,6 +238,27 @@ _FIXTURE_PINS: Final[dict[str, FixtureCascadePins]] = {
lighting_kwh_per_yr=381.4601,
pumps_fans_kwh_per_yr=141.0,
),
# Mapper-driven cohort entry — Summary_001431_case6.pdf → extractor →
# mapper → calculator. DETACHED dual-oil cousin of case 5: Main 1
# radiators (control 2106) + Main 2 underfloor (control 2110) heating
# DIFFERENT parts (51% / 49%), 6 "Roof of Room" rooflights, no boiler
# interlock (cyl stat No → 5pp on Main 1). Promoted to a full
# SapResult fixture once S0380.201-206 closed every line ref: Table 4f
# note c) two-pump electricity (231), Table 5a note a) two-pump gain
# (70), §3.7 rooflight→RR-residual (30), SAP 10.2 p.186 two-systems-
# different-parts MIT (87)/(90)/(98c), and Eq D1 per-boiler (204)
# space share (219). Pins are worksheet Block 1 (energy rating) line
# refs; main_heating_fuel_kwh_per_yr is the (211)+(213) two-system sum.
"001431_case6": FixtureCascadePins(
sap_score=72, sap_score_continuous=71.6597, ecf=2.0316,
total_fuel_cost_gbp=1162.5374, co2_kg_per_yr=5953.6679,
space_heating_kwh_per_yr=11991.9611,
main_heating_fuel_kwh_per_yr=14736.9564,
secondary_heating_fuel_kwh_per_yr=0.0,
hot_water_kwh_per_yr=4902.8601,
lighting_kwh_per_yr=357.6571,
pumps_fans_kwh_per_yr=356.0,
),
}
@ -253,6 +275,7 @@ _FIXTURE_MODULES: Final[dict[str, ModuleType]] = {
"001431_rr8": _w001431_rr8,
"001431_6035": _w001431_6035,
"001431_case5": _w001431_case5,
"001431_case6": _w001431_case6,
}