Model/backend/documents_parser
Khalim Conn-Kowlessar 829a3318dc Slice S0380.135: dispatch responsiveness via Table 4a SAP code (solid-fuel cluster)
SAP 10.2 spec line 15271:

  "R = responsiveness of main heating system (Table 4a or Table 4d)"

The cascade's `_responsiveness` was keyed solely on `heat_emitter_type`
(Table 4d), which is correct for systems whose responsiveness is
determined by the emitter (gas / oil / HP boilers feeding radiators or
UFH). But for systems with intrinsically low responsiveness — solid-
fuel room heaters, range cookers, independent solid-fuel boilers —
the spec lodges R directly in Table 4a against the heating-system SAP
code, and that value overrides any emitter-based lookup.

For solid fuel 8 (SAP code 160 = "Range cooker boiler (integral oven
and boiler)", lodged with radiators emitter), pre-slice the cascade
returned R = 1.0 (radiators) instead of the spec-correct R = 0.50
(Table 4a p.169). The Table 9b mean-internal-temperature adjustment
then over-estimated heating-system response, under-estimating space
heating demand by ~10% (cascade demand 6874.80 kWh vs worksheet EPC
implied 7566 kWh).

The fix adds a new dispatch `_RESPONSIVENESS_BY_SAP_CODE` consulted
first in `_responsiveness`; SAP codes not in the dict fall through to
the existing Table 4d emitter lookup.

Table 4a entries added (SAP 10.2 PDF p.169-170):

  151  Manual feed independent boiler                R=0.75
  153  Auto (gravity) feed independent boiler        R=0.75
  155  Wood chip/pellet independent boiler           R=0.75
  156  Open fire with back boiler to radiators       R=0.50
  158  Closed room heater with boiler to radiators   R=0.50
  159  Stove (pellet-fired) with boiler to radiators R=0.75
  160  Range cooker boiler (integral oven+boiler)    R=0.50
  161  Range cooker boiler (independent oven+boiler) R=0.50
  631  Open fire in grate                            R=0.50
  632  Open fire with back boiler (no radiators)     R=0.50
  633  Closed room heater                            R=0.50
  634  Closed room heater with boiler (no radiators) R=0.50
  635  Stove (pellet fired)                          R=0.75
  636  Stove (pellet fired) with boiler (no rads)    R=0.75

Heating-systems corpus impact — 10 solid-fuel variants re-pinned:

  variant         ΔSAP   was        Δcost  was      ΔPE     was
  solid fuel 2    +2.64  +4.79     -£60    -£110    -1211   -2292
  solid fuel 3    +1.32  +4.43     -£30    -£102     -935   -2496
  solid fuel 4    +1.59  +4.13     -£37     -£95     +151   -1097
  solid fuel 5    +1.70  +2.71     -£39     -£62     +160    -331
  solid fuel 6   -11.37  -7.38    +£268   +£168      +87   -1313  ← see below
  solid fuel 7    +2.04  +5.82     -£47    -£131      +44   -1638
  solid fuel 8    +1.81  +4.24     -£42     -£98      +88   -1308
  solid fuel 9    +1.71  +3.44     -£39     -£79     +155    -510
  solid fuel 10   +1.75  +5.14     -£40    -£118     +120   -1315
  solid fuel 11   +1.62  +4.35     -£37    -£100     +171    -962

7/10 PE residuals close to ±220 kWh (down from -331..-2496). 9/10 SAP
residuals tighten to +1.32..+2.64 (down from +2.71..+5.82).

solid fuel 6 (Dual Fuel Anthracite Wood, SAP 160) SAP residual
regresses -7.38 → -11.37 while PE closes +87. The dual-fuel cascade
has a separate bug now exposed by the more-accurate demand calc;
queued for a follow-up slice.

Non-solid-fuel variants (15) unchanged — their SAP codes aren't in
the new dispatch dict so they fall through to Table 4d as before.
Electric storage Table 4a rows (193-196, 422-424, 515, 701) and the
spec's other low-responsiveness codes can be added in follow-up
slices as electric corpus variants are unblocked.

Extended handover suite: 877 pass / 0 fail (+1 new responsiveness
AAA test). Pyright net-zero on touched files (43 → 43).

No golden fixture impact — no golden cert lodges a solid-fuel SAP
code via the cascade path.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-31 13:11:36 +00:00
..
handler address JTK review comments 2026-04-20 15:11:17 +00:00
tests Slice S0380.135: dispatch responsiveness via Table 4a SAP code (solid-fuel cluster) 2026-05-31 13:11:36 +00:00
__init__.py Map to RdSapSiteNotes from site notes JSON 🟥 2026-04-16 13:54:03 +00:00
db_writer.py include updating epc_property_data to pashub to ara workflow 2026-04-29 09:55:14 +00:00
elmhurst_extractor.py Slice S0380.133: derive solid-fuel main fuel from §14.0 EES Code 2026-05-31 10:04:28 +00:00
extractor.py Handle wall thickness "Unmeasurable" 🟩 2026-04-30 16:41:16 +00:00
local_runner.py update local runner to work for elmhurst 2026-04-24 14:01:36 +00:00
parser.py load ecmk site notes to db 2026-04-29 11:20:47 +00:00
pdf.py update local runner to work for elmhurst 2026-04-24 14:01:36 +00:00