mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
Verified against the SAP 10.2 spec (14-03-2025): Table 12 unit prices are IDENTICAL to SAP 10.3 Table 12. Both specs mandate (§12.2): "Fuel costs are calculated using the fuel prices given in Table 12. Other prices must not be used for calculation of SAP ratings." The legacy ML-pipeline prices in domain.ml.sap_efficiencies (3.48 gas, 13.19 elec, 5.50 E7-low) do NOT match either SAP 10.2 or 10.3 and appear to be a pre-2022 holdover. New module domain.sap.tables.table_12 carries the spec-correct values: mains gas: 3.64 (was 3.48 legacy) standard electricity: 16.49 (was 13.19) 7h-low / Economy-7: 9.40 (was 5.50) 24h-heating: 14.04 (was 6.61) Also corrects an S-B4 bug: SAP 10.2 Table 12a shows direct-acting electric heating (codes 191-196) runs at 90% high-rate on 7h tariffs, not 0% — only true storage heaters (401-409, 421-425) bill at the low rate. _E7_SPACE_HEATING_CODES narrowed accordingly. 100-cert parity probe with spec-correct prices: MAE 4.66 → 6.66 (regression vs legacy prices) bias -0.70 → -4.66 (over-counting cost) spec-correctness: SAP 10.2 verbatim The MAE regression confirms the corpus's lodged ratings were NOT calculated against the published SAP 10.2 Table 12 prices. The cert ratings appear to use the legacy lower prices despite reporting sap_version=10.2. Three paths forward documented in next commit's discussion thread. Also adds the SAP 10.2 spec PDF to docs/sap-spec/. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| domain | ||
| fetchers | ||
| repos | ||
| utils | ||
| README.md | ||
Shared packages
Workspace packages consumed by services/*. Each package is its own Python distribution with its own pyproject.toml; services import via the workspace dependency mechanism ({ workspace = true }).
| Package | Purpose |
|---|---|
domain/ |
Shared domain types — Property, BaselinePerformance, Plan, Scenario, EpcPropertyData, etc. No persistence, no IO, no business logic. |
repos/ |
Persistence layer — one repo per aggregate. Owns the SQL. Depends on domain. |
fetchers/ |
External API clients (gov EPC, Ofgem, Google Solar, etc.). Depend on domain for response shapes. |
utils/ |
Cross-cutting infra — logging, S3, CloudWatch URL builders, SQS task helpers. |
Adding a new shared package
Only when a real second consumer materialises. Don't pre-shatter (repos-epc, repos-property, ...) — split when a deployment needs to drop a dep, not before.
See ../ara_backend_design.md §11 for the broader monorepo layout and ../CONTEXT.md for the domain glossary that names the types living in domain/.