Model/domain/modelling
Khalim Conn-Kowlessar 3c87be8e1e feat(modelling): roof (loft) Recommendation Generator + roof-area geometry
recommend_loft_insulation(epc, products) detects an uninsulated main loft
(SapBuildingPart.roof_insulation_thickness == 0) and emits a
Recommendation("Roof") with one loft_insulation Option carrying the overlay
(roof_insulation_thickness = 270 mm, the recommended top-up) and a priced
Cost (roof area x the Product's fully-loaded unit cost + contingency).

- building_geometry.roof_area(epc, identifier): the part's greatest
  per-storey floor area (RdSAP 10 §3.8). Pinned 14.85 m^2 on 000490 MAIN.
- BuildingPartOverlay gains roof_insulation_thickness; the generic Overlay
  Applicator writes it with NO change (validated by the tracer) — the
  deep-module field-fold paying off.
- loft_insulation contingency (0.10) added.

Progress on #1158 (generator + geometry); end-to-end + Elmhurst pin pending
the orchestrator (#1157) and the parser fix. Four behaviour tests
(geometry pin; detect / none / cost). pyright strict clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 09:05:38 +00:00
..
__init__.py feat(modelling): Overlay Applicator folds EpcSimulation onto EpcPropertyData 2026-06-02 22:13:51 +00:00
contingencies.py feat(modelling): roof (loft) Recommendation Generator + roof-area geometry 2026-06-03 09:05:38 +00:00
overlay_applicator.py feat(modelling): Overlay Applicator folds EpcSimulation onto EpcPropertyData 2026-06-02 22:13:51 +00:00
package_scorer.py feat(modelling): Package Scorer — compose overlays + score on the calculator 2026-06-03 08:41:30 +00:00
product.py feat(modelling): ProductRepository + Postgres materials-table source 2026-06-03 08:32:38 +00:00
recommendation.py feat(modelling): wall Recommendation Generator — cavity-fill detection + overlay 2026-06-02 22:49:33 +00:00
roof_recommendation.py feat(modelling): roof (loft) Recommendation Generator + roof-area geometry 2026-06-03 09:05:38 +00:00
scoring.py feat(modelling): per-measure scoring — marginal cascade + per-Option signal (#1156) 2026-06-03 08:50:49 +00:00
simulation.py feat(modelling): roof (loft) Recommendation Generator + roof-area geometry 2026-06-03 09:05:38 +00:00
wall_recommendation.py feat(modelling): price the cavity Option from area x Product — closes #1155 2026-06-03 08:35:52 +00:00