Model/packages
Khalim Conn-Kowlessar 31c01a7e8c Slice 60: thermal bridging y is dwelling-wide, not per-bp
`heat_transmission_from_cert` computed `y = thermal_bridging_y(age_
band=part.construction_age_band)` per bp, then applied each bp's y
to its own external area. That mis-models multi-age dwellings:
RdSAP10 Table 21 indexes y by the *dwelling's* age band, and Elmhurst's
worksheet reports y as a single user-defined value applied to total
exposed area (cert 001479 worksheet: "Thermal Bridges Bridging User
Input Y 0.15").

For cohort certs with uniform age-band bps the change is heat-loss-
invariant. For cert 001479 (Main=C → 0.15, Ext1=M → 0.08, Ext2=C →
0.15) the cascade was under-counting Ext1's bridging by 0.07 × 27.28
m² ≈ 1.9 W/K. For golden cert 7536-3827 (Main=D, Ext1=L, Ext2=F) the
same per-bp split was costing ~2 W/K of bridging.

Use the primary part's (parts[0]) age band for a single dwelling-wide
`dwelling_y`, applied across all parts in the heat-loss loop.

Cert 001479 chain pin closes another step: cascade SAP 70.38 → 70.20
(target 69.0094, delta 1.37 → 1.19). Golden 7536-3827 residuals
tighten in lockstep: SAP +4 → +3, PE -24.73 → -22.53, CO2 -0.66 → -0.60.
Other 7 golden certs unchanged (single-bp or uniform-age multi-bp).

70 of 71 chain+golden+heat-transmission tests green; chain pin still
RED (load-bearing). Pyright net-zero (13-error baseline on
heat_transmission.py preserved).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 23:22:05 +00:00
..
domain Slice 60: thermal bridging y is dwelling-wide, not per-bp 2026-05-24 23:22:05 +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/.