diff --git a/docs/sap-spec/HANDOVER_NEXT.md b/docs/sap-spec/HANDOVER_NEXT.md index 2efe1bc2..ba6eb72c 100644 --- a/docs/sap-spec/HANDOVER_NEXT.md +++ b/docs/sap-spec/HANDOVER_NEXT.md @@ -133,15 +133,12 @@ Two test files contain the strict pins: Total: **169 PASS / 83 FAIL** across the strict pins. 4 of 6 fixtures fully close §1+§2+§4. 000487 is the worst (RR fixture defect propagates everywhere). -(Post-slice-25b: section_cascade_pins 286 PASS / 26 FAIL, e2e SapResult -32 PASS / 40 FAIL. §3 fully closes for all 6 fixtures (24/24). §4 closes -8 of 9 for 000487 — only LINE_65 (heat gains from WH) still fails -because the §4 cascade doesn't yet derive (64a) electric-shower kWh -from the cert (Appendix J step 8). Remaining cascade failures: §4 on -000477 (combi loss precision, slice 25c) + §4 LINE_65 on 000487 -(electric shower derivation), §5/§6 LINE_72/73/84 on 000477+487 -(cascade from §4), §7 LINE_92/93 marginal on 000474/477/480/490 -(precision artefact), §7 on 000487 (cascade from §4 LINE_65).) +(Post-slice-25c: section_cascade_pins 293 PASS / 19 FAIL, e2e SapResult +32 PASS / 40 FAIL. §3 closes 24/24. §4 closes 53/54 (only 000487 +LINE_65 remains — Appendix J step 8 electric-shower kWh derivation, +slice 25d). §5 52/54, §6 11/12 — only 000487 cascade. 000477's §4 +combi-loss cluster was closed by fixing the SAP10.2 Table 3c (p.162) +M+L lower bound: my DVF used `V < 100.0` where spec says `V < 100.2`.) ### B.2 SapResult pin matrix (post-slice-22/23) @@ -202,6 +199,7 @@ fixture | section §4 pin status ### B.5 Recent slices (in reverse order — newest first) ``` +Slice 25c: 000477 §4/§5/§6 closure — SAP10.2 Table 3c (p.162) M+L lower bound 100.0 → 100.2 Slice 25b: 000487 §4 closure (7/8) — has_electric_shower + mixer/electric counts on SapHeating, Appendix J step 2a fix Slice 25a: 000487 §3 closure — detailed RR + gable_wall_external + Ext1 alt U=1.9 + §3.8 max-floor roof + half-up rounding Slice 26c: §7 mean internal temp cascade pin (60 cases, 44 PASS) — LINE_85..94 diff --git a/packages/domain/src/domain/sap/worksheet/tests/test_water_heating.py b/packages/domain/src/domain/sap/worksheet/tests/test_water_heating.py index 1c9424e6..fd5729aa 100644 --- a/packages/domain/src/domain/sap/worksheet/tests/test_water_heating.py +++ b/packages/domain/src/domain/sap/worksheet/tests/test_water_heating.py @@ -555,10 +555,13 @@ def test_combi_loss_table_3c_two_profile_matches_elmhurst_000477_lodged_line_61( @pytest.mark.parametrize( "profile_pair, daily_hot_water_l_per_day, expected_dvf", [ - # M+L: 0 for V<100, 100.2-V for V∈[100, 199.8], -99.6 for V>199.8. + # M+L: 0 for V<100.2, 100.2-V for V∈[100.2, 199.8], -99.6 for V>199.8. + # Per SAP10.2 Table 3c (p.162): the lower bound is 100.2 L/day, + # not 100.0 — so V=100.16 (Elmhurst 000477 May) routes to DVF=0. ("M+L", 50.0, 0.0), ("M+L", 99.99, 0.0), - ("M+L", 100.0, 0.2), + ("M+L", 100.16, 0.0), + ("M+L", 100.3, -0.1), ("M+L", 150.0, -49.8), ("M+L", 199.8, -99.6), ("M+L", 200.0, -99.6), diff --git a/packages/domain/src/domain/sap/worksheet/water_heating.py b/packages/domain/src/domain/sap/worksheet/water_heating.py index 3dc380b6..dac1b18f 100644 --- a/packages/domain/src/domain/sap/worksheet/water_heating.py +++ b/packages/domain/src/domain/sap/worksheet/water_heating.py @@ -338,7 +338,7 @@ def combi_loss_monthly_kwh_table_3b_row_1_instantaneous( ) -_DVF_M_AND_L_LOWER_V_L_PER_DAY: Final[float] = 100.0 +_DVF_M_AND_L_LOWER_V_L_PER_DAY: Final[float] = 100.2 _DVF_M_AND_L_UPPER_V_L_PER_DAY: Final[float] = 199.8 _DVF_M_AND_L_UPPER_CLAMP: Final[float] = -99.6 _DVF_M_AND_S_LOWER_V_L_PER_DAY: Final[float] = 36.0