docs: session-5 handover — flat-roof fix + the unknown-insulation principle

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 <noreply@anthropic.com>
This commit is contained in:
Khalim Conn-Kowlessar 2026-06-08 19:30:52 +00:00
parent 58cff932e6
commit d90b6f5643

View file

@ -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):**