Surfaces the SAP 10.2 Appendix J Table 3a sub-row dispatch gap that
masked +0.2..+0.4 SAP residuals on 11 cohort-2 PCDB-listed combi
certs. Identified via cert 7800-1501-0922-7127-3563 (Potterton Promax
Combi 28 HE Plus A, PCDF 15709): cascade used the keep-hot 600 kWh/yr
default; worksheet (61) sums to ~428 kWh/yr via the no-keep-hot
sub-row formula.
Root cause: the PCDB Table 105 record carries keep-hot metadata at
field positions 58 (`keep_hot_facility`) and 59 (`keep_hot_timer`)
per the SAP 10 PCDB spec (private feed for SAP software vendors —
not surfaced on the public PCDB website nor the Open EPC API). The
parser preserved these in `raw=fields` but didn't surface them as
typed attributes, so the cascade had no signal to dispatch the right
Table 3a sub-row.
Two-part change:
1. `domain/sap10_calculator/tables/pcdb/parser.py` — adds typed
`keep_hot_facility` and `keep_hot_timer` fields to
`GasOilBoilerRecord`, parsed from fields[57] and fields[58].
Field enums (per BRE STP09-B04 + SAP 10 PCDB spec):
Field 58: 0=no keep-hot, 1=fuel keep-hot, 2=electric keep-hot,
3=gas+electric keep-hot
Field 59: 0=no timer, 1=overnight time-switch
Verified against cohort-1 fixture 000490 (Vaillant Ecotec Pro 28,
PCDF 10328) — record lodges keep_hot_facility=1, keep_hot_timer=1,
exactly matching the hand-built fixture comment "Combi keep hot
type = Gas/Oil, time clock" at `_elmhurst_worksheet_000490.py:
277-280`.
2. `domain/sap10_calculator/rdsap/cert_to_inputs.py` — adds
`UnresolvedPcdbCombiLoss` exception. `pcdb_combi_loss_override`
now raises (instead of silently returning None) when the PCDB
record has `separate_dhw_tests=0/None` AND
`keep_hot_facility=0/None`. The cascade's only implemented Table
3a row is "with keep-hot, time clock" (600 kWh/yr), which is the
wrong spec row for no-keep-hot combis — silently using it masked
the cohort-2 negative band.
The ETL was re-run to refresh `pcdb_table_105_gas_oil_boilers.jsonl`
with the new typed fields (raw fields unchanged, just additional
columns surfacing what was previously buried).
Cohort distribution after slice:
cohort-1 cert 000490 (Vaillant PCDF 10328, kh=1): NO RAISE — cascade
keep-hot 600 default IS the spec-correct row. Tests still GREEN.
cohort-2: 10 exact + 13 sub-±0.07 + 2 ±0.07..0.5 + 1 ±0.5..1 +
1 ±5+ + 11 RAISES.
The 11 raising certs are now blocked until the Table 3a no-keep-hot
sub-row is implemented (BRE STP09-B04 methodology — pending slice).
Previously these certs silently produced +0.2..+0.4 SAP errors AND
ranged into the big-gap band; raising surfaces the gap rather than
shipping wrong numbers.
Two golden cert tests blocked alongside (Firebird oil PCDF 9005 also
hits this path):
- test_golden_cert_residual_matches_pin[0390-2954-3640-2196-4175]
- test_api_to_domain_mapper_preserves_main_heating_index_number[0390-2954-3640-2196-4175]
Re-enable when the Table 3a no-keep-hot row lands.
Two other tests updated:
- test_main_heating_index_number_in_pcdb_overrides_seasonal_efficiency:
switched from Baxi 98 (sdt=0, kh=None, would raise) to Worcester
PCDF 10241 (sdt=1, routes via Table 3b row 1). Asserts 0.885 not
0.66.
- test_pcdb_combi_loss_override_returns_none_or_raises_for_untested
_or_storage_combis: renamed + extended to pin the new strict-raise
behaviour.
Pyright net-zero per file:
- domain/sap10_calculator/rdsap/cert_to_inputs.py: 35 (baseline 35)
- domain/sap10_calculator/tables/pcdb/parser.py: 0
- domain/sap10_calculator/tables/pcdb/__init__.py: 0
- domain/sap10_calculator/rdsap/tests/test_cert_to_inputs.py: 13 (baseline 13)
- domain/sap10_calculator/rdsap/tests/test_golden_fixtures.py: 1 (was 2 — improved)
Regression baseline: 697 pass + 10 fail (= prior 699 + 10 - 2 dropped
golden parametrize entries for cert 0390-2954-3640-2196-4175).
Spec refs:
- SAP 10 PCDB spec (private SAP software vendor feed) — keep-hot
facility / timer / electric-heater fields at positions 58 / 59 / 60.
- BRE STP09-B04 (combi boiler test methodology) — origin of the
keep-hot Table 3a derivation. URL: https://bregroup.com/documents/d
/bre-group/stp09-b04_combi_boiler_tests
- SAP 10.2 Appendix J Table 3a row-selection — to be implemented per
PCDB keep-hot dispatch in a follow-up slice.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
||
|---|---|---|
| .devcontainer | ||
| .github/workflows | ||
| .idea | ||
| .vscode | ||
| applications | ||
| asset_list | ||
| backend | ||
| backlog | ||
| datatypes | ||
| deployment/terraform | ||
| docs/adr | ||
| domain | ||
| epr_data_exports | ||
| etl | ||
| infrastructure | ||
| model_data/requirements | ||
| orchestration | ||
| recommendations | ||
| repositories | ||
| scripts | ||
| sfr/principal_pitch | ||
| survey_report | ||
| tests | ||
| utilities | ||
| utils | ||
| .coveragerc | ||
| .dockerignore | ||
| .gitignore | ||
| __init__.py | ||
| ara_backend_design.md | ||
| BaseUtility.py | ||
| CLAUDE.md | ||
| conftest.py | ||
| CONTEXT.md | ||
| devcontainer.sh | ||
| Dockerfile.test | ||
| Dockerfile.test.dockerignore | ||
| Makefile | ||
| MEMORY.md | ||
| package-lock.json | ||
| package.json | ||
| pyproject.toml | ||
| pyrightconfig.json | ||
| pytest.ini | ||
| README.md | ||
| run_lambda_local.sh | ||
| serverless.yml | ||
| test.requirements.txt | ||
| tox.ini | ||
| UBIQUITOUS_LANGUAGE.md | ||
Model Repository
This repository contains the code pertaining to the development of the data science and machine learning products being utilised by Hestia.
The different folders in this repository relate to services that can be used independently, or can be imported and used as part of a larger application
Getting Started
Prerequisites
Dev Container Setup
This repo uses a Docker Compose-based dev container. The model-backend service joins a shared-dev Docker network so it can communicate with other local services (e.g. a frontend container) running on your machine.
VS Code users: The initializeCommand in devcontainer.json creates the shared-dev network automatically before the container starts. No manual step required — just open the repo and select Reopen in Container.
Non-VS Code / CI workflows: Run the following once before starting the container:
make dev-setup
This is idempotent and safe to re-run if the network already exists.
Folders
backend/
This folder contains the code for the fastapi backend service, which provides an interface to much of the functionality in this repository, for the frontend
model_data/
This folder contains related to the reading and preparation of assessment model data, including pulling out epc attributes
Testing
All tests can be run, against the configuration in pytest.ini running
pytest
This will run the complete panel of tests and report on coverage in the locations specified by the pytest.ini file.
To run tests in a specific service, e.g. inside of model_data, simply run
pytest --cov-config=model_data/.coveragerc --cov=model_data
This will produce the test results and coverage reports