From d90b6f56434c72c1e62fda81b2323936ee13b709 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Mon, 8 Jun 2026 19:30:52 +0000 Subject: [PATCH] =?UTF-8?q?docs:=20session-5=20handover=20=E2=80=94=20flat?= =?UTF-8?q?-roof=20fix=20+=20the=20unknown-insulation=20principle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the flat-roof slice (52.1 → 53.1%) and records the unifying principle ("unknown insulation → as-built age default, not uninsulated") plus the cross-element review confirming all element types now conform. Co-Authored-By: Claude Opus 4.8 --- docs/HANDOVER_API_PROFILING.md | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/docs/HANDOVER_API_PROFILING.md b/docs/HANDOVER_API_PROFILING.md index 7f5ab34c..8adb4f05 100644 --- a/docs/HANDOVER_API_PROFILING.md +++ b/docs/HANDOVER_API_PROFILING.md @@ -13,16 +13,33 @@ deproven approaches + the meter/shower data-fidelity findings), and the earlier `energy_rating_current`. Headline gauge: `PYTHONPATH=/workspaces/model python scripts/eval_api_sap_accuracy.py`. -| metric | session-3 (`a8e5563a`) | session-4 (`faf29942`) | **session-5 (`2e466ed1`)** | +| metric | session-3 (`a8e5563a`) | session-4 (`faf29942`) | **session-5 (`58cff932`)** | |--------|------------------|------------------|------------------| -| **% \|err\| < 0.5** | 45.1% | 47.6% | **52.1%** | -| % \|err\| < 1.0 | 59.4% | 62.6% | **67.2%** | -| % \|err\| < 2.0 | 77.7% | 79.6% | **80.7%** | -| mean \|err\| | 1.702 | 1.586 | **1.497** | -| median \|err\| | — | — | **0.475** | +| **% \|err\| < 0.5** | 45.1% | 47.6% | **53.1%** | +| % \|err\| < 1.0 | 59.4% | 62.6% | **68.0%** | +| % \|err\| < 2.0 | 77.7% | 79.6% | **~81%** | +| mean \|err\| | 1.702 | 1.586 | **1.424** | +| median \|err\| | — | — | **0.467** | | computed / raises | 909 / 0 | 909 / 0 | **909 / 0** | | unsupported_schema | 100 (deferred) | 100 (deferred) | 100 (deferred) | +### THE UNIFYING PRINCIPLE (user, load-bearing) — "unknown insulation → as-built, NOT uninsulated" +An EPC insulation field that is UNDETERMINED (thickness `'ND'`/`'AB'`/absent → parsed None, or +description "as built / (assumed)") must map to the **age-band default** ("as built"), which is +INSULATED at newer bands — never to the uninsulated row. The recurring bug shape: a fixed +uninsulated U (cavity Filled-row, roof Table-16 2.30) is MASKED at old bands (where the age +default coincides with uninsulated) and only diverges (catastrophic under-rate) at newer bands. +All three session-5 fixes are instances. Review status across elements (all now conform): +- **Flat roofs** — FIXED `58cff932` (this slice). **Pitched roofs** — "unknown"→Table 18 (`a64e857b`); + "no insulation" only appears at bands A/B where 2.30 IS the age default (verified, no new-band bug). +- **Cavity walls** — FIXED `2e466ed1`. **System/timber/solid walls** — already on the as-built age + row (verified: bidirectional scatter, not a one-cause under-rate). **Floors** — undetermined + thickness already routes to the Table 19 age default (I=25/J=75/K=100 mm; verified). +- CAVEAT: do NOT broadly reroute PITCHED `'ND'`/`'NI'`→Table 18 (the parsed-0 `'NI'` case) — that + was empirically net-negative (pitched "no insulation" lodgements genuinely use 2.30 even at newer + bands; the description is load-bearing for pitched lofts). The principle holds for flat roofs, + cavity, floors; pitched lofts are the documented exception. + ## SESSION-5 UPDATE (HEAD `2e466ed1`) — whc=903 immersion HW + as-built cavity-U both closed **Shipped (47.6 → 52.1%, two spec-grounded fixes):**