test(efficiency): lock solid-fuel room-heater space eff to Table 4a column (B)

An API audit flagged the solid-fuel room-heater space efficiencies
(_SPACE_EFF_BY_CODE 631-636) as reading the "Water" column of SAP 10.2
Table 4a. That was a misread: the two room-heater columns are (A)
minimum-for-HETAS-approved and (B) other appliances — BOTH are space
efficiency, not space/water. RdSAP defaults to column (B) when HETAS
approval is not lodged, which is what these values already hold and what
the reference software produces (Elmhurst worksheet "solid fuel 9", SAP
code 636 → (206) space efficiency = 70 = column B; flipping to column A
75 broke that pin and three sibling solid-fuel corpus pins).

No value change — add a pin test + spec-cited comment so the column-(A)/
(B) distinction is explicit and this misread can't recur.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Khalim Conn-Kowlessar 2026-06-10 11:09:12 +00:00
parent 5a74897fed
commit e89b4041c7
2 changed files with 23 additions and 1 deletions

View file

@ -62,7 +62,13 @@ _SPACE_EFF_BY_CODE: Final[dict[int, float]] = {
607: 0.45, 609: 0.58, 610: 0.72, 611: 0.85, 612: 0.20, 613: 0.90,
# Room heaters — liquid.
621: 0.55, 622: 0.65, 623: 0.60, 624: 0.70, 625: 0.94,
# Room heaters — solid (column B non-HETAS).
# Room heaters — solid. SAP 10.2 Table 4a (p.167): column (A) is the
# minimum for HETAS-approved appliances, column (B) for other
# appliances. RdSAP defaults to column (B) when approval is not
# lodged (Elmhurst worksheet "solid fuel 9" code 636 → (206)=70 = B),
# so these are the column-(B) space efficiencies: 631 open fire 32,
# 632 +back boiler 50, 633 closed room heater 60, 634 +boiler 65,
# 635 pellet stove 65, 636 +boiler 70.
631: 0.32, 632: 0.50, 633: 0.60, 634: 0.65, 635: 0.65, 636: 0.70,
# Room heaters — electric.
691: 1.00, 692: 1.00, 693: 1.00, 694: 1.00,

View file

@ -51,6 +51,22 @@ def test_seasonal_efficiency_ground_source_heat_pump_returns_table4a_value() ->
assert result == pytest.approx(2.30, abs=0.005)
def test_seasonal_efficiency_solid_fuel_room_heaters_use_table4a_column_b() -> None:
# Arrange — SAP 10.2 Table 4a (p.167) solid-fuel room heaters give
# column (A) for HETAS-approved appliances and column (B) for other
# appliances. RdSAP defaults to column (B) when HETAS approval is not
# lodged (Elmhurst worksheet "solid fuel 9" code 636 → (206)=70 = B):
# 631 open fire 32, 633 closed room heater 60, 634 with boiler 65,
# 635 pellet stove 65, 636 with boiler 70.
# Act / Assert
assert seasonal_efficiency(sap_main_heating_code=631) == 0.32
assert seasonal_efficiency(sap_main_heating_code=633) == 0.60
assert seasonal_efficiency(sap_main_heating_code=634) == 0.65
assert seasonal_efficiency(sap_main_heating_code=635) == 0.65
assert seasonal_efficiency(sap_main_heating_code=636) == 0.70
def test_seasonal_efficiency_oil_boiler_returns_table4b_value() -> None:
# Arrange — Table 4b, code 126 standard oil 1998+ -> 80% winter.