Model/packages/domain
Khalim Conn-Kowlessar 760e25dea9 §4 HW slice 1: PCDB Table 3b combi-loss override
Closes the dominant ~92% of the 000474 HW kWh +14.4% residual that
the post-§10a Table 32 cost-side fix exposed (pre-§10a wrong prices
had been masking it). 000474 HW fuel kWh tightens 2622 → 2320 (+1.2%
over PDF 2292); remaining +1.2% closes when slice 2 (Eq D1 monthly
cascade) lands. 000490 unaffected — PCDB 10328 lodges separate_dhw_
tests=0 (no Table 3b/3c data), falls through to existing Table 3a
default.

- tables/pcdb/parser.py: GasOilBoilerRecord gains 7 typed fields per
  BRE PCDF Spec v1.0 §7.11 — subsidiary_type (field 16), store_type
  (field 39), separate_dhw_tests (field 48), rejected_energy_
  proportion_r1 (field 51), loss_factor_f1_kwh_per_day (field 52),
  loss_factor_f2_kwh_per_day (field 56), rejected_factor_f3_per_
  litre (field 57). Field positions cross-verified against PDF Σ(61)
  = 337.27 vs 000474 worksheet pin 337.19 (Δ 0.02%).
- worksheet/water_heating.py: combi_loss_monthly_kwh_table_3b_row_1_
  instantaneous(r1, F1, energy_content (45)m, daily HW (44)m) — SAP10.2
  Appendix J Table 3b row 1 formula (61)m = (45)m × r1 × fu + F1 × n_m.
  Other Table 3b rows (storage variants) and Table 3c (two-profile)
  deferred until a fixture exercises.
- rdsap/cert_to_inputs.py: _pcdb_table_3b_combi_loss_override builds
  the (61)m override from the PCDB record when separate_dhw_tests=1
  + subsidiary=0 + store_type=0 (instantaneous non-storage path).
  _hot_water_fuel_kwh_per_yr threaded with pcdb_record kwarg; calls
  water_heating_from_cert with the override when present.
- docs/sap-spec/pcdb_table_105_gas_oil_boilers.jsonl: regenerated via
  the ETL to surface the new typed fields alongside the existing
  efficiency columns.

484 tests passing (was 479). e2e ceilings hold: 000474 SAP delta
4 → 3 (within current ceiling of 4 — will tighten further after
slice 2 Eq D1 cascade lands).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-21 22:26:41 +00:00
..
src/domain §4 HW slice 1: PCDB Table 3b combi-loss override 2026-05-21 22:26:41 +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/.