Model/packages/domain
Khalim Conn-Kowlessar 411c477d09 P5.14: SAP 10.2 worksheet trace + RdSAP10 deflator drift note
Closes the second half of P5 (HANDOVER_SYSTEMATIC_REVIEW §2.5):
- Adds test_bre_worked_examples.py — one comprehensive test that
  locks every published SapResult.intermediate key against its
  SAP 10.2 worksheet item number ((4) TFA, (33) fabric heat loss,
  (39) HTC, (40) HLP, (73) gains, (93) mean internal temp, (98c)
  space heating, (240e/247/250) costs, (252) PV credit, (256)
  deflator, (257) ECF, (261-272) per-end-use CO2, (275-287)
  primary energy per m²). All formulas derived independently from
  the worksheet pages 131-148; passes against the synthetic
  100 m² baseline.
- Explicit caveat in module docstring: BRE-published worked
  examples don't exist in any of the three SAP-spec PDFs we have
  (rdSAP10, SAP10.2, SAP10.3 — all greppped). The test is
  spec-formula-derived, not BRE-validated. Structure stays if
  BRE numbers surface later; only expected values change.

Also surfaces and documents an RdSAP10 spec drift in
PARITY_FINDINGS.md: Table 32 (page 95 of rdSAP10) gives
Energy Cost Deflator = 0.42, vs the code's 0.36 (SAP10.2 Table 12,
worksheet item (256)). Not changed in P5 — needs ADR-level
resolution on whether the calculator targets SAP10.2 (0.36) or
RdSAP10 (0.42) ratings.

P5 (SapResult.intermediate population + BRE worked-example
fixtures) is now complete on this branch.
2026-05-19 15:32:42 +00:00
..
src/domain P5.14: SAP 10.2 worksheet trace + RdSAP10 deflator drift note 2026-05-19 15:32:42 +00:00
pyproject.toml slice 13: to_rows(properties) returns pd.DataFrame 2026-05-16 16:43:28 +00:00
README.md added potential file scaffolding: 2026-05-15 10:56:53 +00:00

domna-domain

Shared domain types — Property, Properties, BaselinePerformance, Plan, PlanPhase, Scenario, ScenarioPhase, ScenarioSnapshot, Recommendation, OptimisedPackage, EpcPropertyData, etc.

Boundary: types only. No persistence, no IO, no business logic. Other packages and services depend on domna-domain; this package depends on nothing internal.

Domain definitions live in ../../CONTEXT.md. New types added here must match the glossary terms.

Layout

src/domain/
├── __init__.py
├── property.py             # Property, Properties, PropertyIdentity
├── site_notes.py
├── landlord_overrides.py
├── baseline_performance.py # lodged + effective pair (ADR-0004)
├── plan.py                 # Plan, PlanPhase, OptimisedPackage
├── scenario.py             # Scenario, ScenarioPhase, ScenarioSnapshot (ADR-0005)
├── recommendation.py
├── geospatial.py
├── solar.py
├── anomaly_flags.py
└── ml/
    ├── __init__.py
    ├── transform.py        # EpcMlTransform (versioned per §8.3)
    └── schema.py

When datatypes/epc/domain/ folds in, the EPC schema types move under src/domain/epc/.