Model/packages
Khalim Conn-Kowlessar e2d9f77d0f Slice 20: lodge per-window u_value on mixed-glazing fixtures
The 000474 / 000477 / 000487 fixtures lodged sap_windows without an
explicit u_value, relying on make_window's default u_value=2.8 (raw,
pre-curtain-resistance). PDF lodges TWO window types per fixture:
- Windows 1 (g_⊥=0.72): post-2002 double, raw U=2.0 → U_eff=1.8519
- Windows 2 (g_⊥=0.76): pre-2002 double, raw U=2.8 → U_eff=2.5180
- (000487 Windows 2 special: post-2022, raw U=1.4 → U_eff=1.3258)

Lodging all windows at u_value=2.8 over-counted window heat loss
(LINE_27/LINE_33) by 1.5-3% on mixed-glazing fixtures. The previous
test_section_3 LINE_33 pin passed because it used a pre-computed
WINDOW_AVG_RAW_U_VALUE constant rather than cert-derived sap_windows.

Impact on `sap.space_heating_kwh_per_yr` vs PDF:

  fixture | before     | after      | gap before | gap after
  --------|------------|------------|------------|----------
  000474  | 10765.85   | 10615.86   |  +152.99   | +3.00  (-98%)
  000477  | 10318.34   | 10106.89   |  +207.14   | -4.31  (-98%)
  000480  | 12397.99   | 12397.99   |    -0.58   | -0.58  (unchanged; all windows raw 2.8)
  000487  | 12606.95   | 12303.35   | +1772.17   | +1468.57 (RR defect remains)
  000490  | 11184.06   | 11184.06   |    +0.78   | +0.78  (unchanged)
  000516  | 12372.62   | 12372.62   |   -37.70   | -37.70 (unchanged)

The 000474 / 000477 cascade biases collapse by 98% — remaining 3-4 kWh
residuals are precision-level and likely propagate from §4 HW or §7
T_i drift (sub-0.1°C). 000487 still 13.6% over because the RR
lodgement defect (no detailed_surfaces, missing exposed_floor on
Ext1, missing roof_insulation, U=0.86 second gable variant) is a
separate slice.

Cascade pin count stays at 48 fail / 18 pass because abs=1e-4 is
tight — 3 kWh > 1e-4. But the underlying numeric residual dropped
50×. Subsequent pins (main_fuel, ecf, cost, sap_continuous) will
also tighten as this cascade flows downstream.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-22 22:46:18 +00:00
..
domain Slice 20: lodge per-window u_value on mixed-glazing fixtures 2026-05-22 22:46:18 +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/.