Model/domain
Khalim Conn-Kowlessar 1cb85c592f Slice S0380.144: Table 11 — per-Table-4a-code secondary fraction dispatch for electric storage heaters + remove code 408 from §A.2.2 forced-secondary set
SAP 10.2 Table 11 (PDF p.188) "Fraction of heat supplied by
secondary heating systems" — the "Electric storage heaters (not
integrated)" row splits by Table 4a sub-type:

  - not fan-assisted:                                       0.15
  - fan-assisted:                                           0.10
  - high heat retention (as defined in 9.2.8):              0.10

Plus separate rows:
  Integrated storage/direct-acting electric systems:        0.10
  Electric room heaters:                                    0.20
  Other electric systems (e.g. underfloor):                 0.10

Cross-referenced with SAP 10.2 Table 4a (PDF p.166) Electric
storage codes:

  401: Old (large volume) storage heaters     — not fan-assisted
  402: Slimline storage heaters                — not fan-assisted
  403: Convector storage heaters               — not fan-assisted
  404: Fan storage heaters                     — fan-assisted
  405: Slimline + Celect                       — not fan-assisted
  406: Convector + Celect                      — not fan-assisted
  407: Fan + Celect                            — fan-assisted
  408: Integrated storage + direct-acting      — "Integrated"
  409: High heat retention                     — HHR
  421: Underfloor heating                      — "Other electric"

Pre-slice the cascade defaulted `_secondary_fraction` to 0.10 for
every forced electric-storage code (Elmhurst mapper leaves
`main_heating_category=None`, dispatch falls through to the
`_SECONDARY_HEATING_FRACTION_DEFAULT` 0.10), missing the 0.15
not-fan-assisted sub-row on codes 401/402/403/405/406.

Two compounding spec-citable fixes:

(a) New `_SECONDARY_FRACTION_BY_ELECTRIC_STORAGE_CODE` dispatch dict
    consulted before the category-based lookup in
    `_secondary_fraction`. Routes each Table 4a 4xx code to its
    Table 11 sub-row fraction.

(b) Code 408 removed from `_FORCE_SECONDARY_FOR_MAIN_CODES`.
    SAP 10.2 §A.2.2 (PDF p.~189) verbatim: "This applies to main
    heating codes 401 to 407, 409 and 421" — 408 is explicitly
    NOT in the spec's forced list. The integrated storage+direct-
    acting heater's direct-acting element acts as the secondary
    already, so the calculation doesn't add another.

Corpus impact (electric variants — Elmhurst mapper path):

- electric 3 (SAP 401): sec_frac 0.10 → 0.15; CO2 -117.84 →
  -108.88; PE -1121.97 → -1093.18. SAP / cost residual unchanged
  because the off-peak meter routes the cost calc through the
  `_ZERO_FUEL_COST_FOR_OFF_PEAK` sentinel + legacy scalar-field
  math which bills main and secondary at the same off-peak low
  rate (7.41 p/kWh) — main-vs-secondary split is cost-neutral.
- electric 5 (SAP 402): sec_frac 0.10 → 0.15; CO2 -11.08 → -2.48;
  PE -161.03 → -133.36. Same cost-invariance.
- electric 7 (SAP 408): forced-secondary removed → cascade secondary
  fuel kWh 891 → 0 (matches worksheet); CO2 -37.86 → -53.57;
  PE -498.47 → -549.37. SAP residual unchanged (same off-peak
  cost-invariance).
- electric 4/6/8/9: no change (categories 404/409/421 keep their
  existing 0.10 dispatch).

The remaining +2.55 SAP residual on electric 3 (+1.29 on electric 7)
is now confirmed to be driven by space-heating DEMAND undercount
(cascade SH demand 10083 kWh vs worksheet 11088 kWh for electric 3;
8914 vs 9529 for electric 7), not by sec_frac dispatch. That's a
separate slice — likely §9 MIT calc or §8 gains/HLC for storage-
heater R values, follow-up after this slice.

Extended handover suite: 887 pass, 0 fail (was 886 + 1 new AAA test).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-01 16:28:48 +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.144: Table 11 — per-Table-4a-code secondary fraction dispatch for electric storage heaters + remove code 408 from §A.2.2 forced-secondary set 2026-06-01 16:28:48 +00:00
sap10_ml Slice S0380.109: Solid brick + insulation via §5.7 Table 13 + §5.8 Table 14 (RdSAP 10) 2026-06-01 16:28:47 +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