Model/domain
Khalim Conn-Kowlessar b1f33cd27f Slice S0380.72: HW PE/CO2 via Table 12d/12e monthly cascade (ASHP cohort follow-on)
S0380.71 closed STANDARD-tariff electric MAIN heating PE/CO2 via the
monthly Table 12d/12e cascade. The same spec rule applies to HOT
WATER but the cascade still hardcoded the annual flat factors at
`cert_to_inputs.py:3697-3699` (CO2) and `:3826-3828` (PE), plus the
§12 / §13a section helpers. This slice extends the spec-citation fix
to HW.

Per SAP 10.2 Table 12d (p.195) and Table 12e (p.196) headers:
  "Where electricity is the fuel used, the relevant set of factors
  in the table below should be used to calculate the monthly [CO2
  emissions / primary energy] instead the annual average factor
  given in Table 12."

The rule applies to ALL electric end-uses regardless of tariff,
including the HW path. For electric HW (`water_heating_fuel=29` API
standard electricity → Table 12 code 30) the monthly cascade
weighted by `wh_result.output_monthly_kwh` (HW demand monthly
proxy) lands at ~0.140 CO2 / ~1.517 PE vs annual flat 0.136 / 1.501
on a HW demand profile.

Cohort closure (20 STANDARD-tariff ASHP certs):
  Mean PE residual: −0.66 → −0.36 kWh/m² (≈+0.30 closure per cert)
  Worst cert 9796:  −1.36 → −1.08 PE / −0.005 → −0.002 CO2 t/yr

Cumulative S0380.71 + S0380.72 closure for the ASHP cohort:
  Mean PE residual: −3.10 → −0.36 kWh/m² (8.6× compression)

Changes:
- NEW `_hot_water_co2_factor_kg_per_kwh(epc, hw_monthly_kwh)` helper
  — electric HW fuel → monthly Table 12d cascade; non-electric HW
  fuel → annual Table 12 factor.
- NEW `_hot_water_primary_factor(epc, hw_monthly_kwh)` helper — PE
  mirror per Table 12e.
- `cert_to_inputs` `hot_water_co2_factor_kg_per_kwh` /
  `hot_water_primary_factor` fields routed through the new helpers
  (was annual flat `co2_factor_kg_per_kwh` / `primary_energy_factor`).
- `environmental_section_from_cert` (§12) + `primary_energy_section_
  from_cert` (§13a) section helpers updated to read the cert_to_inputs
  HW factor fields rather than recomputing annual flat — keeps the
  worksheet line refs in sync with the cascade.
- Imports: add `PRIMARY_ENERGY_FACTOR`, `_DEFAULT_CO2_KG_PER_KWH`,
  `_DEFAULT_PEF` from `table_12` for the helpers' degenerate paths.

Tests:
- `test_electric_water_heating_co2_and_pe_factors_apply_monthly_
  table_12d_12e` — pins electric HW > annual flat by the winter-
  weighting margin.
- `test_gas_water_heating_co2_and_pe_factors_pass_through_annual_
  table_12` — pins mains-gas HW at 0.210 / 1.130 (Table 12 code 1
  annual factors).
- `test_golden_fixtures.py`: 20 ASHP cluster cert pins updated to
  the post-S0380.72 residuals; other certs unchanged.

Baseline: 546 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>
2026-06-01 16:28:47 +00:00
..
addresses standardist Address 2026-05-22 10:13:32 +00:00
data_transformation moved classifier data transformation to an easy one 2026-06-01 14:53:34 +00:00
epc pr review, move domain and orhcestration 2026-06-01 14:00:31 +00:00
sap10_calculator Slice S0380.72: HW PE/CO2 via Table 12d/12e monthly cascade (ASHP cohort follow-on) 2026-06-01 16:28:47 +00:00
sap10_ml Slice S0380.26: RdSAP10 §5.8 dry-lining adjustment on alt walls — closes cert 7700 -0.44 → +5e-5 2026-06-01 16:28:46 +00:00
tasks added postcode splitter rewrite to ddd 2026-05-19 16:35:09 +00:00
postcode.py get rid of comments 2026-05-20 13:21:11 +00:00