Slice S0380.73: Appendix M1 §3a D_PV cooking uses L20 electricity, not L18 heat gain (ASHP cohort tail closure)

The Appendix M1 §3a PV-eligible-demand cascade `_pv_eligible_demand_
monthly_kwh` assembled its `cooking_monthly_kwh` argument from
`internal_gains_result.cooking_monthly_w × 24 × n_m / 1000`. That
field is the SAP 10.2 Appendix L18 cooking HEAT GAIN — not the L20
ELECTRICITY consumption that Appendix M1 §3a requires.

Per SAP 10.2 Appendix L (p.91):
  L18:  G_C    = 35 + 7  × N   (heat gain in watts, used by §5)
  L20:  E_cook = 138 + 28 × N  (electricity in kWh/yr, used by M1)
  L21:  E_cook,m = E_cook × n_m / 365  (monthly electricity)

The two formulas differ by ~2.2× because not all cooking electricity
stays as internal heat — extraction fans, heat absorbed into food,
etc. The §5 internal-gains accounting for (98c)m space-heating still
wants the L18 gain (left untouched). Only the M1 §3a path needs the
L20 electricity figure.

Magnitude on cert 0380 (cohort-2 ASHP+5kWh battery, TFA 60.43):
- Pre-fix cascade cooking annual (L18 watt-hours): 428.6 kWh
- Spec L20 cooking annual: 193.7 kWh  (2.21× over-count)
- Pre-fix cascade D_PV summer Jul: 311.6 kWh
- Worksheet-implied D_PV Jul (β-inverse on (233a/b)m): ~292.6 kWh
- Pre-fix cascade (233a) annual: 1925.55 vs worksheet 1899.73 (+25.82)

The cohort-2 ASHP STANDARD-tariff cluster (20 certs, all using PV +
battery, all winter-peaked HP load + summer PV surplus):
- Pre-S0380.71: mean PE residual -3.10 kWh/m²
- Post-S0380.71 (main heat monthly Table 12d/12e): -0.66
- Post-S0380.72 (HW monthly Table 12d/12e):        -0.36
- Post-S0380.73 (Appendix L20 cooking electricity): -0.06

Cumulative S0380.71-.73: 48× compression of the cluster.

Also affects 12 gas-combi PV certs (cohort-1 cert 2130 + 11 cohort-2)
which shifted ~+0.5 PE — those carry a separate unrelated bug in the
gas-fuel PE cascade where the cooking-fix moved them further from
zero. Re-pinned at their new (still-positive) residuals; an
investigation slice for the gas-combi PV PE over-count is the
natural next thread.

Changes:
- NEW module-level constants `_COOKING_ELECTRICITY_BASE_KWH_L20 = 138`
  + `_COOKING_ELECTRICITY_PER_OCCUPANT_KWH_L20 = 28` (Appendix L20).
- `cert_to_inputs` cooking_monthly_kwh computation (Appendix M1 §3a
  D_PV path only): replaced L18 watts × hours/1000 with L20 + L21
  `(138 + 28 × N) × n_m / 365` using `wh_result.occupancy` for N.
- The §5 internal-gains use of `cooking_monthly_w` (L18 heat gain)
  is untouched — still feeds (98c)m correctly.

Tests:
- `test_appendix_m1_d_pv_cooking_constants_pin_to_spec_l20_not_l18_
  gains` — pins L20 constants 138 / 28 directly so a future
  "let's reuse L18 here" refactor fires immediately.
- `test_golden_fixtures.py`: 20 ASHP cluster + 12 gas-combi PV cert
  pins re-pinned at the post-S0380.73 residuals.

Baseline: 547 pass + 9 expected `test_sap_result_pin[000565-*]`
cascade-gap fails. Pyright net-zero on every touched file.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Khalim Conn-Kowlessar 2026-05-29 12:42:59 +00:00
parent b0c4c6e0c4
commit c63d674082
3 changed files with 88 additions and 45 deletions

View file

@ -1406,6 +1406,13 @@ def _days_in_month_proportioned(
_DAYS_IN_MONTH: Final[tuple[int, ...]] = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
_STANDARD_ELECTRICITY_FUEL_CODE: Final[int] = 30
# SAP 10.2 Appendix L equation L20 (p.91) — annual cooking electricity
# in kWh: E_cook = 138 + 28 × N (typical-gains Column A). Distinct from
# the L18 cooking HEAT GAIN constants (35 + 7N watts) used for §5
# internal gains.
_COOKING_ELECTRICITY_BASE_KWH_L20: Final[float] = 138.0
_COOKING_ELECTRICITY_PER_OCCUPANT_KWH_L20: Final[float] = 28.0
# SAP 10.2 Table 12 code 60 — "electricity sold to grid, PV". Used as
# the EXPORT factor key for the Appendix M1 §6/§7/§8 PV split:
# (1-β)·E_PV credits at this code's monthly Table 12d/12e factor.
@ -3473,11 +3480,25 @@ def cert_to_inputs(
internal_gains_result.appliances_monthly_w, _DAYS_IN_MONTH
)
)
cooking_monthly_kwh = tuple(
w * d * 24.0 / 1000.0
for w, d in zip(
internal_gains_result.cooking_monthly_w, _DAYS_IN_MONTH
)
# SAP 10.2 Appendix M1 §3a needs cooking ELECTRICITY (L20-L21,
# p.91): E_cook = 138 + 28 × N annual kWh, distributed by days
# n_m / 365. Distinct from the L18 cooking HEAT GAIN (35 + 7N
# watts) which the §5 internal-gains accounting uses via
# `internal_gains_result.cooking_monthly_w` for the (98c)m
# space-heating cascade. The two differ by ~2.2× because not
# all cooking electricity stays as internal heat (extraction
# fans, heat absorbed by food, etc.). Pre-S0380.73 the cascade
# mis-used L18 × hours/1000 as the D_PV cooking electricity
# figure, over-counting D_PV by ~235 kWh/yr on a typical
# 2-occupant cert and inflating the per-month β by 0.012-0.016
# in summer — closes the cohort 0380 +25 kWh annual (233a)
# gap when corrected.
cooking_electricity_annual_kwh = (
_COOKING_ELECTRICITY_BASE_KWH_L20
+ _COOKING_ELECTRICITY_PER_OCCUPANT_KWH_L20 * wh_result.occupancy
) if wh_result is not None else 0.0
cooking_monthly_kwh = _days_in_month_proportioned(
cooking_electricity_annual_kwh, _DAYS_IN_MONTH,
)
climate: "int | PostcodeClimate" = _climate_source(postcode_climate)

View file

@ -1009,6 +1009,28 @@ def test_standard_meter_ashp_main_heating_primary_factor_applies_monthly_table_1
)
def test_appendix_m1_d_pv_cooking_constants_pin_to_spec_l20_not_l18_gains() -> None:
# Arrange — SAP 10.2 Appendix L (p.91) distinguishes cooking HEAT
# GAIN (L18: G_C = 35 + 7N watts) from cooking ELECTRICITY
# consumption (L20: E_cook = 138 + 28N kWh/yr). The Appendix
# M1 §3a PV-eligible-demand cascade needs the L20 electricity
# figure, not the L18 heat gain. Pre-S0380.73 the cascade
# mistakenly converted L18 watts × hours/1000 into "cooking
# kWh" — over-counting D_PV by ~2.2×. The cert_to_inputs module
# carries the L20 constants explicitly to make this distinction
# visible to future readers. This test pins them to the spec
# values so a hypothetical "let's reuse the L18 constants here"
# refactor fires immediately.
from domain.sap10_calculator.rdsap.cert_to_inputs import (
_COOKING_ELECTRICITY_BASE_KWH_L20, # pyright: ignore[reportPrivateUsage]
_COOKING_ELECTRICITY_PER_OCCUPANT_KWH_L20, # pyright: ignore[reportPrivateUsage]
)
# Assert — L20 constants per SAP 10.2 Appendix L p.91.
assert _COOKING_ELECTRICITY_BASE_KWH_L20 == 138.0
assert _COOKING_ELECTRICITY_PER_OCCUPANT_KWH_L20 == 28.0
def test_electric_water_heating_co2_and_pe_factors_apply_monthly_table_12d_12e() -> None:
# Arrange — RdSAP cert with electric water heating
# (`water_heating_fuel=29` API standard electricity → Table 12

View file

@ -204,8 +204,8 @@ _EXPECTATIONS: tuple[_GoldenExpectation, ...] = (
cert_number="2130-1033-4050-5007-8395",
actual_sap=82,
expected_sap_resid=+1,
expected_pe_resid_kwh_per_m2=-8.2213,
expected_co2_resid_tonnes_per_yr=-0.0456,
expected_pe_resid_kwh_per_m2=-7.4998,
expected_co2_resid_tonnes_per_yr=-0.0454,
notes=(
"End-terrace + 1 extension, TFA 64, gas combi PCDB index 17505, "
"postcode DE22 (PCDB Table 172 match), PV: 2× 2.04 kWp arrays "
@ -261,8 +261,8 @@ _EXPECTATIONS: tuple[_GoldenExpectation, ...] = (
cert_number="0380-2471-3250-2596-8761",
actual_sap=89,
expected_sap_resid=+0,
expected_pe_resid_kwh_per_m2=+0.0504,
expected_co2_resid_tonnes_per_yr=-0.0077,
expected_pe_resid_kwh_per_m2=+0.5259,
expected_co2_resid_tonnes_per_yr=-0.0074,
notes=(
"Mitsubishi PUZ-WM50VHA PCDB 104568, semi-detached bungalow "
"TFA 60.43 age D, PV 3 kWp + 5 kWh battery. Worksheet SAP "
@ -281,8 +281,8 @@ _EXPECTATIONS: tuple[_GoldenExpectation, ...] = (
cert_number="0350-2968-2650-2796-5255",
actual_sap=84,
expected_sap_resid=+0,
expected_pe_resid_kwh_per_m2=-0.4632,
expected_co2_resid_tonnes_per_yr=-0.0294,
expected_pe_resid_kwh_per_m2=-0.2812,
expected_co2_resid_tonnes_per_yr=-0.0292,
notes=(
"Mitsubishi PUZ-WM50VHA PCDB 104568, ASHP cohort cert with "
"PV + 5 kWh battery. Worksheet SAP 84.1367. Slice S0380.50 "
@ -293,8 +293,8 @@ _EXPECTATIONS: tuple[_GoldenExpectation, ...] = (
cert_number="2225-3062-8205-2856-7204",
actual_sap=89,
expected_sap_resid=+0,
expected_pe_resid_kwh_per_m2=-0.6186,
expected_co2_resid_tonnes_per_yr=-0.0104,
expected_pe_resid_kwh_per_m2=-0.2978,
expected_co2_resid_tonnes_per_yr=-0.0101,
notes=(
"Mitsubishi PUZ-WM50VHA PCDB 104568, ASHP cohort cert with "
"PV + 5 kWh battery. Worksheet SAP 88.7921. Slice S0380.50 "
@ -305,8 +305,8 @@ _EXPECTATIONS: tuple[_GoldenExpectation, ...] = (
cert_number="2636-0525-2600-0401-2296",
actual_sap=86,
expected_sap_resid=+0,
expected_pe_resid_kwh_per_m2=-0.6641,
expected_co2_resid_tonnes_per_yr=-0.0047,
expected_pe_resid_kwh_per_m2=-0.4127,
expected_co2_resid_tonnes_per_yr=-0.0045,
notes=(
"Mitsubishi PUZ-WM50VHA PCDB 104568, ASHP cohort cert with "
"PV + 5 kWh battery + 3.74 m² cantilever + 12.76 m² alt wall. "
@ -318,8 +318,8 @@ _EXPECTATIONS: tuple[_GoldenExpectation, ...] = (
cert_number="3800-8515-0922-3398-3563",
actual_sap=86,
expected_sap_resid=+0,
expected_pe_resid_kwh_per_m2=-0.4553,
expected_co2_resid_tonnes_per_yr=+0.0405,
expected_pe_resid_kwh_per_m2=-0.2093,
expected_co2_resid_tonnes_per_yr=+0.0407,
notes=(
"Mitsubishi PUZ-WM50VHA PCDB 104568, ASHP cohort cert with "
"PV + 5 kWh battery. Worksheet SAP 86.1458. Slice S0380.50 "
@ -330,8 +330,8 @@ _EXPECTATIONS: tuple[_GoldenExpectation, ...] = (
cert_number="9285-3062-0205-7766-7200",
actual_sap=84,
expected_sap_resid=+0,
expected_pe_resid_kwh_per_m2=-0.2702,
expected_co2_resid_tonnes_per_yr=-0.0454,
expected_pe_resid_kwh_per_m2=-0.0736,
expected_co2_resid_tonnes_per_yr=-0.0452,
notes=(
"Mitsubishi PUZ-WM50VHA PCDB 104568, ASHP cohort cert with "
"PV + 5 kWh battery. Worksheet SAP 84.1369. Slice S0380.50 "
@ -342,8 +342,8 @@ _EXPECTATIONS: tuple[_GoldenExpectation, ...] = (
cert_number="9418-3062-8205-3566-7200",
actual_sap=85,
expected_sap_resid=+0,
expected_pe_resid_kwh_per_m2=-0.6590,
expected_co2_resid_tonnes_per_yr=-0.0058,
expected_pe_resid_kwh_per_m2=-0.4291,
expected_co2_resid_tonnes_per_yr=-0.0056,
notes=(
"Daikin Altherma EDLQ05CAV3 PCDB 102421 (heating_duration "
"code '24' — continuous, all days at Th) + 5 kWh battery. "
@ -368,18 +368,18 @@ _EXPECTATIONS: tuple[_GoldenExpectation, ...] = (
# `sap worksheets/Additional data with api/`.
# ------------------------------------------------------------------
_GoldenExpectation(cert_number="0036-6325-1100-0063-1226", actual_sap=63, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.4019, expected_co2_resid_tonnes_per_yr=+0.0255, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="0100-5141-0522-4696-3463", actual_sap=86, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.2607, expected_co2_resid_tonnes_per_yr=+0.0275, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="0200-3155-0122-2602-3563", actual_sap=81, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.9879, expected_co2_resid_tonnes_per_yr=-0.0097, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="0300-2403-2650-2206-0235", actual_sap=77, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.5118, expected_co2_resid_tonnes_per_yr=+0.0442, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="0310-2763-5450-2506-3501", actual_sap=78, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.4387, expected_co2_resid_tonnes_per_yr=+0.0149, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="0100-5141-0522-4696-3463", actual_sap=86, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.5174, expected_co2_resid_tonnes_per_yr=+0.0277, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="0200-3155-0122-2602-3563", actual_sap=81, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+1.6041, expected_co2_resid_tonnes_per_yr=-0.0096, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="0300-2403-2650-2206-0235", actual_sap=77, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+1.1308, expected_co2_resid_tonnes_per_yr=+0.0443, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="0310-2763-5450-2506-3501", actual_sap=78, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+1.2791, expected_co2_resid_tonnes_per_yr=+0.0150, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="0320-2126-2150-2326-6161", actual_sap=72, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.2060, expected_co2_resid_tonnes_per_yr=+0.0128, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="0320-2756-8640-2296-1101", actual_sap=90, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.4689, expected_co2_resid_tonnes_per_yr=+0.0300, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="0330-2257-3640-2196-3145", actual_sap=85, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.0559, expected_co2_resid_tonnes_per_yr=+0.0349, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="0360-2266-5650-2106-8285", actual_sap=80, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.2223, expected_co2_resid_tonnes_per_yr=-0.0171, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="0320-2756-8640-2296-1101", actual_sap=90, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.2370, expected_co2_resid_tonnes_per_yr=+0.0303, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="0330-2257-3640-2196-3145", actual_sap=85, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.2809, expected_co2_resid_tonnes_per_yr=+0.0350, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="0360-2266-5650-2106-8285", actual_sap=80, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.6646, expected_co2_resid_tonnes_per_yr=-0.0170, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="0380-2530-6150-2326-4161", actual_sap=66, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.0893, expected_co2_resid_tonnes_per_yr=-0.0315, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="0390-2066-4250-2026-4555", actual_sap=65, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.2522, expected_co2_resid_tonnes_per_yr=+0.0005, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="0464-3032-0205-4276-3204", actual_sap=80, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.6127, expected_co2_resid_tonnes_per_yr=+0.0450, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="0652-3022-1205-2826-1200", actual_sap=71, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.4950, expected_co2_resid_tonnes_per_yr=+0.0275, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="0464-3032-0205-4276-3204", actual_sap=80, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+1.1607, expected_co2_resid_tonnes_per_yr=+0.0451, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="0652-3022-1205-2826-1200", actual_sap=71, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.9954, expected_co2_resid_tonnes_per_yr=+0.0276, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="1536-9325-5100-0433-1226", actual_sap=66, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.1568, expected_co2_resid_tonnes_per_yr=-0.0456, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="2007-3011-9205-8136-3204", actual_sap=68, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.3773, expected_co2_resid_tonnes_per_yr=-0.0325, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="2031-3007-0205-1296-3204", actual_sap=64, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.4198, expected_co2_resid_tonnes_per_yr=-0.0420, notes="Cohort-2 baseline pin captured by S0380.69."),
@ -396,26 +396,26 @@ _EXPECTATIONS: tuple[_GoldenExpectation, ...] = (
# / CO2 +0.005 (lodged values are integer-rounded; rounding noise).
_GoldenExpectation(cert_number="2102-3018-0205-7886-5204", actual_sap=64, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.1961, expected_co2_resid_tonnes_per_yr=+0.0048, notes="Cohort-2 baseline pin. House coal secondary — S0380.70 routed CO2/PE through `secondary_fuel_type` per SAP 10.2 Table 12d/12e headers, closed PE +20.36 → +0.20 and CO2 -0.79 → +0.005 (lodged values integer-rounded)."),
_GoldenExpectation(cert_number="2130-3018-4205-4686-5204", actual_sap=71, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.4083, expected_co2_resid_tonnes_per_yr=-0.0357, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="2336-3124-3600-0517-1292", actual_sap=83, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.0793, expected_co2_resid_tonnes_per_yr=-0.0415, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="2536-2525-0600-0788-2292", actual_sap=80, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.6100, expected_co2_resid_tonnes_per_yr=-0.0245, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="2336-3124-3600-0517-1292", actual_sap=83, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.1247, expected_co2_resid_tonnes_per_yr=-0.0414, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="2536-2525-0600-0788-2292", actual_sap=80, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.4210, expected_co2_resid_tonnes_per_yr=-0.0244, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="2590-3025-7205-9066-0200", actual_sap=66, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.1309, expected_co2_resid_tonnes_per_yr=-0.0036, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="2699-3025-5205-8066-0200", actual_sap=69, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.4755, expected_co2_resid_tonnes_per_yr=-0.0016, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="2800-7999-0322-4594-3563", actual_sap=78, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.0394, expected_co2_resid_tonnes_per_yr=-0.0050, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="3136-7925-4500-0246-6202", actual_sap=78, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.2521, expected_co2_resid_tonnes_per_yr=-0.0486, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="3336-2825-9400-0512-8292", actual_sap=78, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.3519, expected_co2_resid_tonnes_per_yr=-0.0421, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="4536-5424-8600-0109-1226", actual_sap=82, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.3010, expected_co2_resid_tonnes_per_yr=-0.0056, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="2800-7999-0322-4594-3563", actual_sap=78, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.2868, expected_co2_resid_tonnes_per_yr=-0.0049, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="3136-7925-4500-0246-6202", actual_sap=78, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+1.0936, expected_co2_resid_tonnes_per_yr=-0.0485, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="3336-2825-9400-0512-8292", actual_sap=78, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.2060, expected_co2_resid_tonnes_per_yr=-0.0420, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="4536-5424-8600-0109-1226", actual_sap=82, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.0660, expected_co2_resid_tonnes_per_yr=-0.0053, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="4536-8325-3100-0409-1222", actual_sap=66, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.2794, expected_co2_resid_tonnes_per_yr=+0.0093, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="4800-3992-0422-0599-3563", actual_sap=87, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.2102, expected_co2_resid_tonnes_per_yr=-0.0410, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="6835-3920-2509-0933-5226", actual_sap=80, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.1246, expected_co2_resid_tonnes_per_yr=-0.0238, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="4800-3992-0422-0599-3563", actual_sap=87, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.5231, expected_co2_resid_tonnes_per_yr=-0.0406, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="6835-3920-2509-0933-5226", actual_sap=80, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.5284, expected_co2_resid_tonnes_per_yr=-0.0237, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="7700-3362-0922-7022-3563", actual_sap=63, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.4141, expected_co2_resid_tonnes_per_yr=+0.0216, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="7800-1501-0922-7127-3563", actual_sap=65, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.0594, expected_co2_resid_tonnes_per_yr=+0.0440, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="7836-3125-0600-0526-2202", actual_sap=80, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.3469, expected_co2_resid_tonnes_per_yr=+0.0164, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="9036-0824-3500-0420-8222", actual_sap=84, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.5121, expected_co2_resid_tonnes_per_yr=+0.0334, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="9370-3060-1205-3546-4204", actual_sap=88, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.2008, expected_co2_resid_tonnes_per_yr=-0.0062, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="9380-2957-7490-2595-3141", actual_sap=75, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.4794, expected_co2_resid_tonnes_per_yr=-0.0245, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="9421-3045-3205-1646-6200", actual_sap=87, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.7426, expected_co2_resid_tonnes_per_yr=-0.0049, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="9796-3058-6205-0346-9200", actual_sap=90, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-1.0840, expected_co2_resid_tonnes_per_yr=-0.0016, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="9836-7525-9500-0575-1202", actual_sap=75, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.5524, expected_co2_resid_tonnes_per_yr=+0.0010, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="7836-3125-0600-0526-2202", actual_sap=80, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.9583, expected_co2_resid_tonnes_per_yr=+0.0165, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="9036-0824-3500-0420-8222", actual_sap=84, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.2791, expected_co2_resid_tonnes_per_yr=+0.0337, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="9370-3060-1205-3546-4204", actual_sap=88, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.0131, expected_co2_resid_tonnes_per_yr=-0.0060, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="9380-2957-7490-2595-3141", actual_sap=75, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=+0.9173, expected_co2_resid_tonnes_per_yr=-0.0244, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="9421-3045-3205-1646-6200", actual_sap=87, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.3253, expected_co2_resid_tonnes_per_yr=-0.0046, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="9796-3058-6205-0346-9200", actual_sap=90, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.3101, expected_co2_resid_tonnes_per_yr=-0.0013, notes="Cohort-2 baseline pin captured by S0380.69."),
_GoldenExpectation(cert_number="9836-7525-9500-0575-1202", actual_sap=75, expected_sap_resid=+0, expected_pe_resid_kwh_per_m2=-0.0766, expected_co2_resid_tonnes_per_yr=+0.0011, notes="Cohort-2 baseline pin captured by S0380.69."),
)