mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
Closes 23 of 24 mapper-vs-hand-built load-bearing divergences by
populating fields the Elmhurst mapper extracts from Summary_000477.
pdf but the original cohort hand-built left at their `make_minimal_
sap10_epc` / dataclass-default values. Every change is cascade-
equivalent — none alter `_FIXTURE_PINS["000477"]` SapResult fields
(all 11 1e-4 pins remain GREEN against worksheet `SAP value 65.0057`).
Mirrors the Slice 64 pattern on the cohort 000474 hand-built:
SapBuildingPart additions (Main only — 000477 is a single-bp mid-
terrace, no extension):
- `wall_thickness_measured`: False → True. Summary §7 lodges Wall
Thickness 380 mm explicitly; the cascade doesn't consume this flag.
- `floor_type`, `floor_construction_type`, `floor_insulation_type_
str`, `floor_u_value_known`: surfaced from Summary §9 ("G Ground
floor" / "T Suspended timber" / "A As built" / U-value Known = No).
Cascade reads the int codes on SapFloorDimension, not these strings.
- `roof_insulation_location="Joists"`: surfaced from Summary §8.
SapVentilation additions (all cascade-equivalent — `None` defaults to
0 throughout the §2 cascade chain):
- 6 explicit zero counts (`open_flues`, `closed_flues`, `boiler_
flues`, `other_flues`, `passive_vents`, `flueless_gas_fires`)
- `pressure_test="Not available"` (descriptive — cert lodges no test)
- `draught_lobby=True` (legacy field; cascade reads `has_draught_
lobby=False` which stays as set)
Top-level additions via `make_minimal_sap10_epc`:
- `blocked_chimneys_count=0`, `dwelling_type="Mid-Terrace house"`,
`built_form="Mid-Terrace"`, `property_type="House"`
Post-construction mutations (helper doesn't expose these as kwargs):
- `has_conservatory=False`, `any_unheated_rooms=False`,
`number_of_storeys=3` (cohort 000477 has ground + first + RIR)
- `sap_heating.shower_outlets=ShowerOutlets(Non-electric shower)`
- `sap_heating.main_heating_details[0].central_heating_pump_age_str=
"Unknown"`
Diff count: 24 → **1**. The remaining diff is structural:
- `sap_windows: LEN 7 vs 3` — mapper extracts 1:1 from §11 table;
the hand-built collapses by glazing-type group, preserving total
area. Cascade-equivalent but not field-equal. Closes via the same
1:1 expansion that Slice 69 applied to cohort 000474 (5 → 7).
11 cohort 000477 cascade pins still GREEN; pyright net-zero on the
touched fixture file.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| domain | ||
| fetchers | ||
| repos | ||
| utils | ||
| README.md | ||
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/.