diff --git a/docs/baseline-downgrade-followups.md b/docs/baseline-downgrade-followups.md index 0b7464c1..cc3931d3 100644 --- a/docs/baseline-downgrade-followups.md +++ b/docs/baseline-downgrade-followups.md @@ -68,5 +68,32 @@ issue before trusting the cohort. ## 4. Predicted-property display path (e.g. property 721167) 721167 has **no lodged EPC** (predicted). Its Heating-Control / Main-Fuel / -Ventilation Unknowns come from the prediction + landlord-override **overlay** not -populating the display fields — a separate path from the lodged-cert mappers. +Ventilation Unknowns come from the prediction synthesis path +(`domain/epc_prediction/epc_prediction.py`), **not** the lodged-cert mappers and +**not** the landlord-override overlay (`overlays_from` is simulation-time only, +ADR-0032 — it never writes the persisted/displayed EPC). Investigated and fixed +on `fix/predicted-property-display-unknowns`: + +- **Heating Control — FIXED (Model).** `_apply_heating_donor` copied the donor's + *calc* `sap_heating` cluster but left the *display* rows (`main_heating`, + `main_heating_controls`) on the size-representative structural template — + incoherent with the donated system, and "Unknown" whenever the template lodged + no control row (exactly 721167: no `main_heating_controls` energy element + persisted). Now carries the donor's display heating + control alongside the + calc cluster. +- **Ventilation — FIXED (Model).** The prediction never synthesised ventilation + — it kept the template's `sap_ventilation`, so a predicted dwelling in an + MEV/MVHR neighbourhood was scored + displayed as natural. New + `_apply_ventilation_mode` modes `mechanical_ventilation_kind` across the cohort + (recency/geo-weighted, mirroring glazing). Natural-vent cohorts mode to None + and stay natural (§2 default) — so a genuinely natural dwelling like 721167 + correctly stays natural; the fix moves only real MEV/MVHR neighbourhoods. +- **Main Fuel — NOT a prediction gap.** `epc_main_heating_detail.main_fuel_type` + *is* persisted for predicted properties (721167 → `26` = mains gas, carried + from the heating donor). The "Unknown" is the **same FE code→name gap as item + 2** (the Drizzle/Next repo not mapping the fuel code), not a Model issue. + +Both fixes are display-only for the calculator (component-accuracy gate, corpus +harness, and prediction e2e all green); persistence already carries +`main_heating_controls` (energy element) and `ventilation_mechanical_ventilation_kind`, +so the synthesised values reach the passport on the next prediction run.