Model/packages
Khalim Conn-Kowlessar 2b5fc6a575 §9a slice 1: space_heating_fuel_monthly_kwh orchestrator + EnergyRequirementsResult + 4 synthetic tests
Spec lines 7909-7953 (worksheet block §9a). Composes per-system fuel kWh from (98c)m, Table 11 secondary fraction (201), and per-system efficiencies (206)/(207)/(208). Formula: (211)m = (98c)m × (204) × 100 / (206) where (204) collapses to (202) = 1 − (201) in scope A's single-main case.

EnergyRequirementsResult dataclass mirrors the full §9a worksheet shape with 16 fields including (203)/(205)/(207)/(209)/(213)/(221) zero-branch placeholders — worksheet-shape-fidelity precedent (§8c Q4/Q7/Q9, §8f Q3 grilling). First multi-main / fixed-AC / PCDB cert triggers the slices that populate them.

Synthetic tests: (a) single-main no-secondary 80% efficiency Σ(211)=Σ(98c)/0.8, (b) Table 11 secondary fraction split (201)=0.1 produces (211)+(215) at correct ratios, (c) summer-clamp zeros from §8 (98c)m propagate through linearly to (211)m/(215)m, (d) scope-A two-main + cooling-fuel fields remain zero regardless of inputs.

Calculator + cert_to_inputs wiring lands in slice 3. PDF-derived ALL_FIXTURES pins for slice 2 deferred until PCDB integration grounds LINE_206 (Manufacturer-declared boiler efficiency); flagged in the SPEC_COVERAGE PCDB gap-list entry.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-21 08:33:22 +00:00
..
domain §9a slice 1: space_heating_fuel_monthly_kwh orchestrator + EnergyRequirementsResult + 4 synthetic tests 2026-05-21 08:33:22 +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/.