diff --git a/domain/sap10_calculator/docs/HANDOVER_MAPPER_BUGS.md b/domain/sap10_calculator/docs/HANDOVER_MAPPER_BUGS.md index 7237497e..b720c2c1 100644 --- a/domain/sap10_calculator/docs/HANDOVER_MAPPER_BUGS.md +++ b/domain/sap10_calculator/docs/HANDOVER_MAPPER_BUGS.md @@ -6,14 +6,47 @@ state after closing the 0240 investigation and fixing the first of several API-mapper/cascade bugs the audit surfaced. - **Branch:** `feature/per-cert-mapper-validation` -- **HEAD:** `ee484d9f` (S0380.213). Confirm with `git rev-parse HEAD`. +- **HEAD:** `b9bbcecb` (docs after S0380.213). Confirm with `git rev-parse HEAD`. - **Baseline:** `2386 passed, 1 skipped, 0 failed` (AGENT_GUIDE §4 suite command). ALSO run `domain/sap10_ml/tests/` when touching `rdsap_uvalues.py` — 2 PRE-EXISTING stone-formula failures there, see Thread 1. - **Next slice number:** **S0380.214**. -- **Open:** Thread 2 *demand* tail only — 9390 ~7% demand over-count (SAP -2, PE 220 vs - 205) = heat-source-efficiency-default / fabric residual. CO2/PE collision (S0380.212) + - standing charge (S0380.213) FIXED. Threads 1 + 3 **CLOSED**. + +--- + +## ★ CURRENT PRIORITY — drive golden-fixture SAP residuals to ZERO + +`_EXPECTATIONS` in `test_golden_fixtures.py` holds **53 pinned golden certs**. The suite +is GREEN. **Only 3 have a non-zero SAP integer residual**, and they split into two kinds: + +| cert | lodged | cont SAP | resid | nature | +|---|---|---|---|---| +| **2130-1033-4050** | 82 | **83.349** | **+1** | REAL +0.85 over-prediction — multi-part **solid-brick** wall fabric | +| **7536-3827-0600** | 68 | **69.071** | **+1** | REAL +0.57 over-prediction — multi-bp **D/L/F cavity** wall fabric | +| **0240-0200-5706** | 73 | **72.462** | **−1** | **ARCHITECTURAL — do NOT chase, do NOT re-pin** (see below) | + +**The two real targets are 2130 + 7536.** Both are fabric *over*-predictions on **multi-part +wall** geometry (a wall with alternative-construction sub-areas / multiple building parts), +so they may share a single root cause in the §3 per-part wall area/U handling — a fix to +one could close both. Method: walk the §3 heat-transmission cascade per-part vs the lodged +register subsystem ratings (the certs are API-only — no worksheet — so the bar is ±0.5 SAP +vs lodged, but the goal is the integer flip 83→82 / 69→68, i.e. shave ~0.85 / ~0.57 off the +continuous SAP). If a multi-part-wall U or area is over-counted, that is the lever. The user +generates Elmhurst worksheets on request — ASK for a simulated case mirroring 2130's wall +(multi-part solid brick) rather than guess a U-value (the session methodology lesson). + +**0240 (−1) is NOT driveable from the JSON and the user has decided NOT to re-pin it — +document the cause only.** Continuous SAP is 72.462; the true SAP is **72**. The lodged +**73 requires a "2013 or later" circulation pump (41 kWh)**; 0240's open-data API lodges +`central_heating_pump_age=0` = **Unknown → 115 kWh**. The encoding was proven across 13 +API+Summary pairs (`0`=Unknown, `2`=2013+). The export did not preserve the pump age that +produced the lodged 73, so 73 is unreachable without inventing data. Both fabric bugs that +masked it are now fixed (wall S0380.209 + roof S0380.211 → cont 72.462). **Leave the pin at +`actual_sap=73, expected_sap_resid=-1`; the notes already record this.** Driving it to zero +would mean fudging the pump age — don't. + +Latent (lower priority): **9390** (community, −2, **unpinned**/retired) ~7% demand +over-count — see Thread 2. ---