Model/packages
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
..
domain P5.14: SAP 10.2 worksheet trace + RdSAP10 deflator drift note 2026-05-19 15:32:42 +00:00
fetchers added potential file scaffolding: 2026-05-15 10:56:53 +00:00
repos added potential file scaffolding: 2026-05-15 10:56:53 +00:00
utils added potential file scaffolding: 2026-05-15 10:56:53 +00:00
README.md added potential file scaffolding: 2026-05-15 10:56:53 +00:00

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/.