Model/tests/domain/sap10_calculator/worksheet
Jun-te Kim 8e33a8de53 test(accuracy): ratchet 77.3% -> 77.7% via flat-roof insulation-thickness fix (Elmhurst-validated)
A FLAT roof lodges its insulation thickness in the DEDICATED gov-EPC API
`flat_roof_insulation_thickness` field (e.g. "75mm"), leaving
`roof_insulation_thickness` None (that field is for pitched-loft joists).
`heat_transmission_from_cert` read only the latter, so a measured
flat-roof thickness was ignored and the roof billed at the uninsulated
age-band flat default (age E = 1.5) instead of its Table-16 insulated U.

Fixed by preferring `flat_roof_insulation_thickness` when the part is a
flat roof — the exact mirror of the existing rafter-thickness branch.
An "AB"/"NI" (as-built/unknown) value parses to None and keeps the
age-band default, unchanged; only measured thicknesses move.

PER-CERT ELMHURST VALIDATION (cert 47084930, top-floor flat, flat roof
75 mm): built on the lodged inputs in accredited Elmhurst RdSAP10-Online
(evidence saved: elmhurst_summary.pdf / elmhurst_worksheet.pdf). The
worksheet bills "insulated flat roof" at U 0.5 (floor 0.70 + wall 0.25
also matching the engine). The fix takes the engine roof 96.4 -> 32.1 W/K
(= 64.26 x 0.5, Elmhurst-exact), PE +47 -> +0.2, SAP 69.51 -> 74.34 =
lodged 74.

Gauge: within 77.3% -> 77.7%, SAP MAE 0.648 -> 0.641, CO2 0.074 -> 0.072,
PE 3.1 -> 2.97. Unit-pinned in test_heat_transmission
(flat_roof_insulation_thickness -> U 0.5); RealCertExpectation 47084930
= 74 (Elmhurst-validated). Also adds the build script build_47084930.py.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 23:27:57 +00:00
..
fixtures Move sap10_calculator tests to tests/domain/sap10_calculator/ for CI 2026-06-02 16:58:00 +00:00
__init__.py Move sap10_calculator tests to tests/domain/sap10_calculator/ for CI 2026-06-02 16:58:00 +00:00
_elmhurst_fixtures.py Move sap10_calculator tests to tests/domain/sap10_calculator/ for CI 2026-06-02 16:58:00 +00:00
_elmhurst_worksheet_000474.py Merge remote-tracking branch 'origin/main' into feature/bill-derivation 2026-06-05 11:09:00 +00:00
_elmhurst_worksheet_000477.py Merge remote-tracking branch 'origin/main' into feature/bill-derivation 2026-06-05 11:09:00 +00:00
_elmhurst_worksheet_000480.py Merge remote-tracking branch 'origin/main' into feature/bill-derivation 2026-06-05 11:09:00 +00:00
_elmhurst_worksheet_000487.py Merge remote-tracking branch 'origin/main' into feature/bill-derivation 2026-06-05 11:09:00 +00:00
_elmhurst_worksheet_000490.py fix(water-heating): derive combi keep-hot from the PCDB record, default no-keep-hot 2026-06-23 21:22:02 +00:00
_elmhurst_worksheet_000516.py Merge remote-tracking branch 'origin/main' into feature/bill-derivation 2026-06-05 11:09:00 +00:00
_elmhurst_worksheet_000565.py Move sap10_calculator tests to tests/domain/sap10_calculator/ for CI 2026-06-02 16:58:00 +00:00
_elmhurst_worksheet_000565_case50.py test(worksheet): pin simulated case 50 — MVHR + dual-immersion all-electric 2026-06-24 09:07:16 +00:00
_elmhurst_worksheet_000565_case52.py test(worksheet): pin simulated case 52 — regular gas boiler + cylinder 2026-06-24 08:50:19 +00:00
_elmhurst_worksheet_001431.py S0380.191: pin simulated 001431 gas-combi end-to-end at 1e-4 (e2e harness) 2026-06-02 22:44:32 +00:00
_elmhurst_worksheet_001431_6035.py S0380.195: pin sim case 4 (6035 floor geometry) e2e at 1e-4 — 6035 +19 PE is lodged divergence 2026-06-03 09:56:39 +00:00
_elmhurst_worksheet_001431_case5.py S0380.197: simulated case 5 e2e fixture — detached sandstone RR validates S0380.196 (RdSAP 10 §3.9.1 + Table 4 p.22) 2026-06-03 11:41:16 +00:00
_elmhurst_worksheet_001431_case6.py S0380.207: promote simulated case 6 to a full SapResult e2e fixture 2026-06-03 16:14:48 +00:00
_elmhurst_worksheet_001431_case7.py S0380.208: case 7 combi e2e fixture — condensing-oil-combi path validated exact 2026-06-03 17:57:22 +00:00
_elmhurst_worksheet_001431_case20.py feat(test): case-20 cascade fixture + close its CO2 via E7 per-end-use codes 2026-06-06 11:23:10 +00:00
_elmhurst_worksheet_001431_case21.py fix(u-value): solid brick as-built U by thickness — §5.7 Table 13 2026-06-06 14:40:06 +00:00
_elmhurst_worksheet_001431_case38.py test(worksheet): pin simulated case 38 — mains-gas secondary reproduces worksheet exactly 2026-06-15 13:31:36 +00:00
_elmhurst_worksheet_001431_case39.py fix(mapper): map Elmhurst "Value known" cylinder to measured volume (code 6) 2026-06-15 23:57:25 +00:00
_elmhurst_worksheet_001431_case43.py test(worksheet): pin simulated case 43 at 1e-4 (RR + dry-line + mixed roof) 2026-06-16 08:26:05 +00:00
_elmhurst_worksheet_001431_case44.py feat(conservatory): §6.1 solar gains + TFA-occupancy (demand-side) 2026-06-16 23:21:08 +00:00
_elmhurst_worksheet_001431_case45.py fix(climate): compute EPC CO2/PE on the postcode demand cascade (SAP 10.2 Appendix U p.124) 2026-06-18 14:15:34 +00:00
_elmhurst_worksheet_001431_rr.py S0380.193: suspended-floor (12) sealed rule fires only on a SUPPLIED U-value 2026-06-03 09:16:25 +00:00
_elmhurst_worksheet_001431_rr8.py S0380.194: pin sim case 3 (near-exact 6035 replica) e2e at 1e-4 2026-06-03 09:46:56 +00:00
_xlsx_loader.py Move sap10_calculator tests to tests/domain/sap10_calculator/ for CI 2026-06-02 16:58:00 +00:00
test_appendix_h_solar.py Move sap10_calculator tests to tests/domain/sap10_calculator/ for CI 2026-06-02 16:58:00 +00:00
test_dimensions.py Move sap10_calculator tests to tests/domain/sap10_calculator/ for CI 2026-06-02 16:58:00 +00:00
test_e2e_elmhurst_sap_score.py test(worksheet): pin simulated case 50 — MVHR + dual-immersion all-electric 2026-06-24 09:07:16 +00:00
test_energy_requirements.py S0380.200: SAP 10.2 §9a two-main-heating split (203)/(205)/(207)/(213) 2026-06-03 13:09:43 +00:00
test_fabric_energy_efficiency.py Move sap10_calculator tests to tests/domain/sap10_calculator/ for CI 2026-06-02 16:58:00 +00:00
test_fuel_cost.py Move sap10_calculator tests to tests/domain/sap10_calculator/ for CI 2026-06-02 16:58:00 +00:00
test_heat_transmission.py test(accuracy): ratchet 77.3% -> 77.7% via flat-roof insulation-thickness fix (Elmhurst-validated) 2026-07-02 23:27:57 +00:00
test_internal_gains.py Move sap10_calculator tests to tests/domain/sap10_calculator/ for CI 2026-06-02 16:58:00 +00:00
test_mean_internal_temperature.py Move sap10_calculator tests to tests/domain/sap10_calculator/ for CI 2026-06-02 16:58:00 +00:00
test_mev.py Move sap10_calculator tests to tests/domain/sap10_calculator/ for CI 2026-06-02 16:58:00 +00:00
test_photovoltaic.py Move sap10_calculator tests to tests/domain/sap10_calculator/ for CI 2026-06-02 16:58:00 +00:00
test_rating.py Move sap10_calculator tests to tests/domain/sap10_calculator/ for CI 2026-06-02 16:58:00 +00:00
test_section_cascade_pins.py fix(climate): compute EPC CO2/PE on the postcode demand cascade (SAP 10.2 Appendix U p.124) 2026-06-18 14:15:34 +00:00
test_solar_gains.py Move sap10_calculator tests to tests/domain/sap10_calculator/ for CI 2026-06-02 16:58:00 +00:00
test_space_cooling.py Move sap10_calculator tests to tests/domain/sap10_calculator/ for CI 2026-06-02 16:58:00 +00:00
test_space_heating.py Move sap10_calculator tests to tests/domain/sap10_calculator/ for CI 2026-06-02 16:58:00 +00:00
test_utilisation_factor.py Move sap10_calculator tests to tests/domain/sap10_calculator/ for CI 2026-06-02 16:58:00 +00:00
test_ventilation.py Move sap10_calculator tests to tests/domain/sap10_calculator/ for CI 2026-06-02 16:58:00 +00:00
test_water_heating.py fix(water-heating): derive combi keep-hot from the PCDB record, default no-keep-hot 2026-06-23 21:22:02 +00:00