Model/domain
Khalim Conn-Kowlessar f7d863a9fa Slice S0380.21: Table 3a row 1 (no keep-hot) + row 4 dispatch — closes 9 cohort-2 RAISES
SAP 10.2 spec p.160 Table 3a rows:
  Row 1 ("Instantaneous, without keep-hot facility"):
      (61)m = 600 × fu × n_m / 365   with fu = min(1, V_d,m / 100)
  Row 4 ("Instantaneous, with keep-hot, not controlled by time clock"):
      (61)m = 900 × n_m / 365

Add `combi_loss_monthly_kwh_table_3a_row_1_no_keep_hot()` and
`combi_loss_monthly_kwh_table_3a_row_4_keep_hot_no_time_clock()` to
`worksheet/water_heating.py`. Extend `pcdb_combi_loss_override` to
dispatch via the PCDB keep_hot_facility / keep_hot_timer fields lodged
at raw positions 58/59 (extracted in Slice S0380.20):

  kh ∈ {0, None}            → row 1   (600 × fu × n/365, no keep-hot)
  kh = 1, timer = 1         → row 3   (cascade default 600 × n/365)
  kh = 1, timer ∈ {0, None} → row 4   (900 × n/365, no time clock)
  kh ∈ {2, 3}               → UnresolvedPcdbCombiLoss (electric or
                              mixed keep-hot — Table 3a Note 2
                              fuel-split between (61)m and (219)m
                              deferred until a fixture exercises it).

Closes 9 of the 11 cohort-2 RAISES from Slice S0380.20 — all PCDF 15709
+ 10315 certs with no keep-hot lodgement now compute to abs(delta) <
1e-4 vs the dr87 worksheet. Verified end-to-end on cert 7800-1501-0922-
7127-3563 (Potterton Promax Combi 28 HE+A, PCDF 15709): Jan (61) =
600 × 0.778795 × 31/365 = 39.6866 kWh, matching worksheet line ref
exactly. The 2 newly-visible cohort-2 issues (cert 6835 -13.37 SAP, cert
0652 +1.93 SAP) were hidden behind the previous strict-raise — they
surface unrelated cascade gaps, not regressions.

Re-add 0390-2954-3640-2196-4175 (Firebird oil PCDF 9005) to the golden
fixture cohort dropped in Slice S0380.20:
  - `_EXPECTATIONS` with re-pinned SAP/PE/CO2 residuals (-7 / -26.0093
    kWh/m² / -2.5211 t/yr) — the cert now cascades end-to-end via the
    no-keep-hot row.
  - `_PCDB_CHAIN_EXPECTATIONS` pins PCDF index 9005 + winter eff 0.864
    (Table 105 fraction).

Spec citations (per [[feedback-spec-citation-in-commits]]):
  - SAP 10.2 spec p.160 Table 3a rows 1 & 4 (formula columns) +
    pdftotext of `sap-10-2-full-specification-2025-03-14.pdf | sed -n
    '15280,15410p'` (Notes 1 & 2 on fu / electric keep-hot routing).
  - STP09-B04 §5.3 "Influence of Keep-hot facility" — origin of the
    600 / 900 kWh/yr keep-hot baselines.

Pyright per-file: net-zero on all touched files
(water_heating.py 1→1, cert_to_inputs.py 35→35, tests unchanged).

Test counts: 697 → 702 pass (+5 new tests), 10 expected fails unchanged.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-01 16:28:46 +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.21: Table 3a row 1 (no keep-hot) + row 4 dispatch — closes 9 cohort-2 RAISES 2026-06-01 16:28:46 +00:00
sap10_ml Slice S0380.18: u_party_wall flat default per RdSAP10 Table 15 footnote* 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