docs: add full 0240 worksheet input spec to the closure handover

Adds a "build THIS in Elmhurst" specification — dwelling, dual condensing
oil-combi (code 130) heating, combi/no-cylinder DHW (Table 3a keep-hot
600), per-element fabric W/K targets, room-in-roof gables, the 5 vertical
+ 6 roof-of-room windows, lighting (8 LED), no PV — so a generated
worksheet reproduces cert 0240 as closely as possible. Flags the three
load-bearing differences vs case 6 (combi code 130, no cylinder, boiler
interlock PRESENT → no -5pp) that the new worksheet must capture.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Khalim Conn-Kowlessar 2026-06-03 17:13:46 +00:00
parent d4817ccdc7
commit 6ac67a4c6f

View file

@ -121,6 +121,89 @@ knowing the true (worksheet) value, so the worksheet is the unblocker either way
---
## 0240 worksheet input specification (build THIS in Elmhurst)
Reproduce cert **0240-0200-5706-2365-8010** as closely as possible so the
worksheet is a valid 1e-4 ground truth for the cascade. All values are from the
fixture JSON (`tests/.../fixtures/golden/0240-0200-5706-2365-8010.json`). Match
the **U-values / W-per-K targets** below — those are what the cascade actually
consumes, so hitting them matters more than the exact construction wording.
**Dwelling**
- Detached house, **construction age band J**, England. Postcode **LE15 9LB**
(drives the demand/EPC climate). 1 extension. 7 habitable rooms.
- Storey height **2.28 m**. Total floor area **≈202 m²** =
Main ground floor **97.72** + Extension 1 ground floor **20.61** + the
room-in-roof floor **83.2**.
**Heating — the load-bearing difference vs case 6.** TWO main systems, both a
**condensing oil combi, SAP main heating code 130** (Table 4b winter **82** /
summer **73**), oil fuel, **balanced flue** (not fan-assisted), efficiency from
the **SAP table** (no PCDB boiler index), central-heating pump age **unknown**.
They heat **different parts** (so the p.186 MIT applies, already implemented):
- **Main 1****radiators**, control **2106** (programmer + room thermostat +
TRVs), **51%**, serves the living area.
- **Main 2****underfloor heating in screed** (R=0.75), control **2110** (time +
temperature zone control), **49%**, serves elsewhere.
**Domestic hot water — the other key difference vs case 6.** Heated **from the
main system** (WHC 901), oil. It is a **COMBI with NO hot-water cylinder**
instantaneous DHW → SAP 10.2 **Table 3a keep-hot loss 600 kWh/yr** (`combi_loss`
600, `primary_loss` 0). 3 **mixer** showers + 1 bath; no effective WWHRS.
NB the lodged RHI `water_heating = 2842.82` already equals the cascade HW output
exactly, so get the DHW *demand* inputs right and any residual is in the combi
*efficiency* (Eq D1 winter/summer blend).
- **Boiler interlock: YES** for 0240 (combi + room thermostat 2106, no cylinder)
**no 5pp penalty**, both systems run at base eff 82/73. (This is the
OPPOSITE of case 6, which had a regular boiler + cylinder with no cylinder stat
5pp. Get this right or the efficiencies — hence everything — will be off.)
**Fabric — target W/K (cascade values to reproduce; total external area 328.97 m²):**
| element | W/K | notes |
|---|---|---|
| Walls (29a) | 24.45 | age J, **uninsulated** (NI), not dry-lined, not measured |
| Roof (30) | 32.331 | Main = pitched, **access to loft**, insulation at ceiling, **400 mm+** ; Ext1 = pitched **vaulted ceiling**, **no insulation (NI)** |
| Floor (28) | 29.4297 | **solid**; Main heat-loss perimeter 36.45, Ext1 13.45 |
| Party/gable (32) | 7.84 | RR gables billed as party at U=0.25 |
| Windows (27) | 22.7407 | see below |
| Roof windows (27a) | 12.6374 | see below |
| Doors (26) | 11.1 | **2 doors, uninsulated** |
| Thermal bridging (36) | 36.1867 | = 0.11 × 328.97 |
| **(33) fabric total** | **140.5288** | |
| **(37)+vent feeds (39)** | total transmission **176.7155** | |
**Room-in-roof** (Main only): floor area **83.2 m²**, **two gables L = 6.40 m**
— one **Exposed**, one **Party** (per the case-5/6 sandstone replica convention),
age J. This is the same Simplified/detailed-gable RR structure case 6 validated.
**Windows** (all **double glazed, PVC frame**, glazing "DG 2002+", U≈2.0, g=0.72):
- 5 **vertical** wall windows: 1.4×1.3, 1.2×1.3 (orient N), 1.6×1.3, 2.5×2.0
(orient E), 1.4×1.3 (orient S, on Extension 1).
- 6 **"Roof of Room" rooflights** (window_wall_type 4): all **1.0×1.0**, at 45°,
3 orient N + 3 orient S. These bill on (27a) and deduct from the RR residual
(S0380.203) — keep them as roof-of-room, not vertical glazing.
**Ventilation / lighting / other**
- Natural ventilation; **no** mechanical ventilation, **no** extract fans, **no**
chimneys/flues. 85% draught-proofed.
- Lighting: **8 LED bulbs, 100% low-energy** (no CFL/incandescent).
- **No PV**, no solar thermal, **no secondary heating**, no air-conditioning.
- Electricity meter type 3 (standard), smart meter present, not export-capable.
### The three things that MUST differ from case 6 (or you've just rebuilt case 6)
1. **Condensing oil combi, SAP code 130** (case 6 = regular oil boiler 127).
2. **Combi, NO cylinder** → Table 3a keep-hot 600 kWh (case 6 = boiler + 110 L
cylinder → primary/storage loss).
3. **Boiler interlock PRESENT → no 5pp** (case 6 = no interlock → 5pp). Driven
automatically by "combi + room thermostat, no cylinder", but verify the
worksheet shows base eff 82/73, not 77/68.
Everything else (dual-main different-parts MIT, two pumps, rooflight→RR, Eq-D1
(204) share) is already implemented and validated by case 6 — the new worksheet
just confirms the combi-HW path on top of that closed structure.
---
## Pointers
- Golden pin + full slice history: `tests/domain/sap10_calculator/rdsap/test_golden_fixtures.py` (cert `0240-0200-5706-2365-8010`, line ~83).
- Case-6 fixture to mirror: `tests/domain/sap10_calculator/worksheet/_elmhurst_worksheet_001431_case6.py` + its e2e pins in `test_e2e_elmhurst_sap_score.py::_FIXTURE_PINS["001431_case6"]`.