Slice 25c: 000477 §4/§5/§6 closure — Table 3c (p.162) M+L lower bound

Fixed a single-character spec adherence bug: SAP10.2 Table 3c (p.162)
specifies the M+L profile's DVF lower bound as `V_d,m < 100.2`, not
`< 100.0`. The 0.2 L/day window matters when V_d,m sits between 100.0
and 100.2 — exactly where 000477's May lodgement lands (100.16 L/day).

For V_d,m = 100.16:
  Spec:    DVF = 0 → (61) = E × r1 × fu = 134.84 × 0.015 × 1.0 = 2.0225 ✓
  Buggy:   DVF = 100.2 - 100.16 = 0.04 → (61) = 2.0233 (off by 0.0008)

The cascade through the missing 0.0008 W on May LINE_61 propagated to
LINE_62/64/65 and then §5 LINE_72/73 + §6 LINE_84 — clearing one
constant unblocks the entire 000477 §4-§6 cluster.

Per-fixture cluster status (was/now):
  §3   24/24 → 24/24
  §4   46/54 → 53/54   (only 000487 LINE_65 remains)
  §5   50/54 → 52/54   (only 000487 LINE_72/73)
  §6   10/12 → 11/12   (only 000487 LINE_84)

All remaining cascade failures cluster on 000487 (slice 25d — derive
LINE_64A electric-shower kWh from cert per Appendix J step 8) plus §7
LINE_92/93 marginal residuals on 4 fixtures (precision artefact).

Scoreboard:
  section_cascade_pins: 286 → 293 PASS (+7)
  e2e SapResult:         32 →  32 PASS (still cascade-blocked by 000487
    LINE_65 + downstream §8-§12 pins not yet asserted)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Khalim Conn-Kowlessar 2026-05-23 23:04:23 +00:00
parent ca56fdee5b
commit 8520a52ee9
3 changed files with 13 additions and 12 deletions

View file

@ -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

View file

@ -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),

View file

@ -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