Model/backend/documents_parser/tests/fixtures
Khalim Conn-Kowlessar fc7c4d2d3b fix(climate): compute EPC CO2/PE on the postcode demand cascade (SAP 10.2 Appendix U p.124)
The SAP/EI rating is computed on UK-average weather (Appendix U Tables
U1-U3 region 0) so ratings are nationally comparable, but Appendix U
paragraph 1 (PDF p.124) requires that "other calculations (such as for
energy use and costs on EPCs) are done using local weather. Weather data
for each postcode district are taken from the PCDB". `Sap10Calculator.
calculate` ran ONE cascade (UK-average) and fed it to SAP, CO2 AND primary
energy, so every cert's EPC-displayed CO2/PE were computed on the wrong
climate. Because most of England is warmer than the UK-average, this
systematically OVER-counted heating demand on the emissions/PE outputs.

The two cascades (`cert_to_inputs` rating, `cert_to_demand_inputs`
postcode) already existed; this wires the demand cascade into the
production entry point and grafts its CO2/PE onto the rating result (SAP
unchanged). The corpus gauge's longstanding +5% CO2/PE over-estimate was
mostly this climate bug, NOT (as previously diagnosed) per-cert mapper
fidelity:
  CO2 MAE 0.26 -> 0.12 t/yr  (bias +0.18 -> +0.04)
  PE  MAE 13.6 -> 3.8 kWh/m2 (bias +9.0  -> +0.24)
  SAP within-0.5 = 69.7% (rating cascade, unchanged)

Worksheet-validated to 1e-4 on simulated case 45 (heat-pump ground-floor
flat, postcode W6): the P960 prints the current dwelling twice — Block 1
on UK-average weather (SAP 60.5318, CO2 692.13) and Block 2 on postcode
weather (CO2 626.78, PE 6581.59). Both reproduce exactly. Added a tracked
case-45 Summary fixture + two-cascade cascade pin as a permanent guard,
and ratcheted the corpus CO2/PE ceilings to 0.13 / 4.2. The e2e Elmhurst
suite (Block-1 line refs) now pins the rating cascade directly; the two
Vaillant overlay snapshots refreshed to demand-cascade CO2/PE.

pyright not installed in this codespace (strict gate not run locally);
change is type-trivial (dataclasses.replace over SapResult).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 14:15:34 +00:00
..
elmhurst_site_notes_1_text.json elmhurst site notes fixture 2026-04-24 13:09:30 +00:00
elmhurst_site_notes_2_text.json extract window frame details from elmhurst site notes 🟥 2026-04-27 15:50:25 +00:00
ElmhurstSiteNotes.pdf rename example site notes to PasHub_ and add Elmhurst example 2026-04-24 13:01:51 +00:00
ElmhurstSiteNotes_2.pdf extract window frame details from elmhurst site notes 🟥 2026-04-27 15:50:25 +00:00
pashub_site_notes_1_text.json rename example site notes to PasHub_ and add Elmhurst example 2026-04-24 13:01:51 +00:00
pashub_site_notes_2_text.json rename example site notes to PasHub_ and add Elmhurst example 2026-04-24 13:01:51 +00:00
pashub_site_notes_3_text.json rename example site notes to PasHub_ and add Elmhurst example 2026-04-24 13:01:51 +00:00
pashub_site_notes_4_text.json rename example site notes to PasHub_ and add Elmhurst example 2026-04-24 13:01:51 +00:00
pashub_site_notes_5_text.json rename example site notes to PasHub_ and add Elmhurst example 2026-04-24 13:01:51 +00:00
pashub_site_notes_6_text.json rename example site notes to PasHub_ and add Elmhurst example 2026-04-24 13:01:51 +00:00
pashub_site_notes_7_text.json Extract address when Property photo element is missing from PDF 🟩 2026-04-30 16:25:41 +00:00
PasHubSiteNotes_1.pdf rename example site notes to PasHub_ and add Elmhurst example 2026-04-24 13:01:51 +00:00
PasHubSiteNotes_2.pdf rename example site notes to PasHub_ and add Elmhurst example 2026-04-24 13:01:51 +00:00
PasHubSiteNotes_3.pdf rename example site notes to PasHub_ and add Elmhurst example 2026-04-24 13:01:51 +00:00
PasHubSiteNotes_4.pdf rename example site notes to PasHub_ and add Elmhurst example 2026-04-24 13:01:51 +00:00
PasHubSiteNotes_5.pdf rename example site notes to PasHub_ and add Elmhurst example 2026-04-24 13:01:51 +00:00
PasHubSiteNotes_6.pdf rename example site notes to PasHub_ and add Elmhurst example 2026-04-24 13:01:51 +00:00
PasHubSiteNotes_7.pdf Extract address when Property photo element is missing from PDF 🟩 2026-04-30 16:25:41 +00:00
Summary_000474.pdf Scaffold: end-to-end Summary→EpcPropertyData chain test for 000474 (xfail) 2026-05-24 17:40:06 +00:00
Summary_000477.pdf Slice 48: Elmhurst extractor handles 3 new layout quirks; 5 fixture PDFs added 2026-05-24 19:17:59 +00:00
Summary_000480.pdf Slice 48: Elmhurst extractor handles 3 new layout quirks; 5 fixture PDFs added 2026-05-24 19:17:59 +00:00
Summary_000487.pdf Slice 48: Elmhurst extractor handles 3 new layout quirks; 5 fixture PDFs added 2026-05-24 19:17:59 +00:00
Summary_000490.pdf Slice 48: Elmhurst extractor handles 3 new layout quirks; 5 fixture PDFs added 2026-05-24 19:17:59 +00:00
Summary_000516.pdf Slice 48: Elmhurst extractor handles 3 new layout quirks; 5 fixture PDFs added 2026-05-24 19:17:59 +00:00
Summary_000565.pdf Slice S0380.52: cert 000565 Elmhurst-only mapper-driven cascade pin + glazing-label coverage 2026-05-28 22:03:52 +00:00
Summary_000784.pdf chore: stage cert 9501 fixtures (second boiler validation cert) 2026-05-26 18:53:08 +00:00
Summary_000884.pdf Slice S0380.16: add 'Normal' → cylinder_size=2 (110 L) for cohort 2 2026-05-27 22:44:02 +00:00
Summary_000888.pdf Slice S0380.17: map Elmhurst §11 glazing-type labels to SAP10 codes 2026-05-27 23:05:52 +00:00
Summary_000889.pdf Slice S0380.16: add 'Normal' → cylinder_size=2 (110 L) for cohort 2 2026-05-27 22:44:02 +00:00
Summary_000890.pdf Slice S0380.19: count Elmhurst shower outlets by type (no more hardcoded 1) 2026-05-28 07:16:32 +00:00
Summary_000897.pdf chore: stage cert 0330 fixtures (boiler pilot) 2026-05-26 17:37:14 +00:00
Summary_000898.pdf Slice S0380.10: pin certs 3800 + 9285 Summary chain tests — first-try closure 2026-05-27 20:47:51 +00:00
Summary_000899.pdf chore: stage cert 0380 fixtures (HP pilot — deferred workstream) 2026-05-26 17:37:34 +00:00
Summary_000900.pdf Slice S0380.10: pin certs 3800 + 9285 Summary chain tests — first-try closure 2026-05-27 20:47:51 +00:00
Summary_000901.pdf Slice S0380.10: pin certs 3800 + 9285 Summary chain tests — first-try closure 2026-05-27 20:47:51 +00:00
Summary_000902.pdf Slice S0380.10: pin certs 3800 + 9285 Summary chain tests — first-try closure 2026-05-27 20:47:51 +00:00
Summary_000903.pdf Slice S0380.9: multi-array PV support + close cert 0350 to ASHP spec floor 2026-05-27 20:44:13 +00:00
Summary_000904.pdf Slice S0380.10: pin certs 3800 + 9285 Summary chain tests — first-try closure 2026-05-27 20:47:51 +00:00
Summary_000910.pdf Slice S0380.18: u_party_wall flat default per RdSAP10 Table 15 footnote* 2026-05-27 23:24:58 +00:00
Summary_001431_6035.pdf 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
Summary_001431_case5.pdf 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
Summary_001431_case6.pdf S0380.199: site-notes "Roof of Room" windows → roof windows (cross-mapper parity with S0380.198) 2026-06-03 12:46:18 +00:00
Summary_001431_case7.pdf S0380.208: case 7 combi e2e fixture — condensing-oil-combi path validated exact 2026-06-03 17:57:22 +00:00
Summary_001431_case20.pdf fix(extractor): re-join §11 windows whose Area cell split onto its own line 2026-06-06 10:35:21 +00:00
Summary_001431_case21.pdf fix(u-value): solid brick as-built U by thickness — §5.7 Table 13 2026-06-06 14:40:06 +00:00
Summary_001431_case38.pdf test(worksheet): pin simulated case 38 — mains-gas secondary reproduces worksheet exactly 2026-06-15 13:31:36 +00:00
Summary_001431_case39.pdf fix(mapper): map Elmhurst "Value known" cylinder to measured volume (code 6) 2026-06-15 23:57:25 +00:00
Summary_001431_case41_rafters.pdf fix(roof): bill at-rafters insulation on RdSAP 10 Table 16/18 column (2) 2026-06-16 04:42:44 +00:00
Summary_001431_case42_50mm_rafters.pdf fix(roof): bill at-rafters insulation on RdSAP 10 Table 16/18 column (2) 2026-06-16 04:42:44 +00:00
Summary_001431_case42_unknown_rafters.pdf fix(roof): bill at-rafters insulation on RdSAP 10 Table 16/18 column (2) 2026-06-16 04:42:44 +00:00
Summary_001431_case43.pdf test(worksheet): pin simulated case 43 at 1e-4 (RR + dry-line + mixed roof) 2026-06-16 08:26:05 +00:00
Summary_001431_case44.pdf feat(conservatory): §6.1 fabric cascade (27/27a/28a + TFA/volume) 2026-06-16 15:59:26 +00:00
Summary_001431_case45.pdf 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
Summary_001431_double_glazing.pdf S0380.236: extension party-wall type read independently of "As Main Wall" 2026-06-05 09:19:43 +00:00
Summary_001431_gas_combi.pdf S0380.191: pin simulated 001431 gas-combi end-to-end at 1e-4 (e2e harness) 2026-06-02 22:44:32 +00:00
Summary_001431_lpg_boiler.pdf fix(elmhurst-mapper): map "Bottled gas" main fuel to bottled LPG, not mains gas 2026-06-10 08:48:15 +00:00
Summary_001431_rr8w.pdf S0380.194: pin sim case 3 (near-exact 6035 replica) e2e at 1e-4 2026-06-03 09:46:56 +00:00
Summary_001431_rr_ext.pdf S0380.193: suspended-floor (12) sealed rule fires only on a SUPPLIED U-value 2026-06-03 09:16:25 +00:00
Summary_001431_topfloor_flat.pdf fix(elmhurst-extractor): read Main Property age band from §3.0 Date Built block 2026-06-09 16:41:00 +00:00
Summary_001479.pdf Slice 54: Elmhurst mapper sets extensions_count from len(survey.extensions) 2026-05-24 22:15:47 +00:00
Summary_case34_storage_flat.pdf fix(elmhurst-extractor): allocate single-glazed alt-wall windows to the alternative wall 2026-06-11 07:54:06 +00:00