Model/domain/sap10_calculator/tests
Khalim Conn-Kowlessar d8cdee4e53 Slice S0380.125: map Elmhurst Summary "18 Hour" meter_type to EIGHTEEN_HOUR
The Elmhurst Summary §14.2 Meters section lodges the electricity meter
type as the bare RdSAP enum form "18 Hour", but `_METER_STR_TO_INT`
only carried the legacy "off-peak 18 hour" alias. All 41 P960-format
heating-system fixtures at `sap worksheets/heating systems examples/`
lodge meter_type "18 Hour", so `cert_to_inputs` strict-raised on every
one of them before this slice.

Per RdSAP 10 Specification §17 page 85 (Electricity meter row 10-2):

  > "Electricity meter: Dual/single/10-hour/18-hour/24-hour/unknown"

Per RdSAP 10 §12 page 62:

  > "if the meter is dual 18-hour/24-hour it is 18-hour/24-hour tariff"

So the bare "18 Hour" lodging routes directly to enum 5 (Off-peak 18
hour) → `Tariff.EIGHTEEN_HOUR`, bypassing the §12 Rules 1-4 dispatch
(which only fires for Dual meters that aren't 18-hour or 24-hour).

After this slice the heating-system corpus probe (`/tmp/probe_*.py`
across 41 variants of the same property × different heating systems)
shifts from "32 raises + 7 mapper gaps + 2 emitter gaps" to
"32 cascade-OK + 7 community-heating + 2 underfloor-emitter + 1
cylinder-size 'No Access'". The 32 newly-OK variants surface a
positive ΔSAP cluster (cascade SAP_c > worksheet SAP_c by +0.87..+30
across boiler types) — that residual layer is queued for the next
slice.

Extended handover suite at HEAD post-slice: **829 pass, 0 fail**
(baseline 775 + test_table_12a.py's 54 incl. the new "18 Hour" entry).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 23:51:47 +00:00
..
__init__.py refactor: lift-and-shift packages/domain/src/domain/sap → domain/sap10_calculator 2026-05-26 12:22:37 +00:00
test_bre_worked_examples.py refactor: move docs/sap-spec/ contents into domain/sap10_calculator/ 2026-05-26 13:17:18 +00:00
test_calculator.py Slice S0380.78: §1x.0 shower extractor + (247a) fallback cost close cert 000565 (45)m 2026-05-29 21:32:13 +00:00
test_pcdb_etl.py Slice S0380.99: PCDB Table 329 (MV In-Use Factors) ETL + parser + lookup (PCDF Spec §A.20) 2026-05-30 15:20:02 +00:00
test_pcdb_lookup.py refactor: lift-and-shift packages/domain/src/domain/sap → domain/sap10_calculator 2026-05-26 12:22:37 +00:00
test_pcdb_table_322_lookup.py Slice S0380.98: PCDB Table 322 (Decentralised MEV) ETL + parser + lookup (PCDF Spec §A.19) 2026-05-30 15:12:55 +00:00
test_pcdb_table_329_lookup.py Slice S0380.99: PCDB Table 329 (MV In-Use Factors) ETL + parser + lookup (PCDF Spec §A.20) 2026-05-30 15:20:02 +00:00
test_pcdb_table_362_lookup.py Slice S0380.28: SAP 10.2 Appendix N footnote 43 reciprocal η interpolation — closes the +0.03..+0.06 ASHP precision-floor cluster 2026-05-28 11:44:11 +00:00
test_postcode_weather.py refactor: lift-and-shift packages/domain/src/domain/sap → domain/sap10_calculator 2026-05-26 12:22:37 +00:00
test_table_12.py refactor: move docs/sap-spec/ contents into domain/sap10_calculator/ 2026-05-26 13:17:18 +00:00
test_table_12a.py Slice S0380.125: map Elmhurst Summary "18 Hour" meter_type to EIGHTEEN_HOUR 2026-05-30 23:51:47 +00:00
test_table_32.py refactor: move docs/sap-spec/ contents into domain/sap10_calculator/ 2026-05-26 13:17:18 +00:00