Model/domain
Khalim Conn-Kowlessar 9338914f8a Slice S0380.81: RdSAP 10 Table 32 default prices close cert 000565 sap_score 28 → 29 EXACT
Per ADR-0010 §10a amendment (2026-05-21) + RdSAP 10 Specification §19.1
(PDF page 80-81):

  "The SAP rating for RdSAP 10 is to be calculated using Table 32 prices
   (not Table 12) for section 10a and 10b."

The §10a `fuel_cost` orchestrator already used RdSAP 10 Table 32 prices
for STANDARD-tariff certs (via `table_32_unit_price_p_per_kwh`). The
legacy off-peak fallback scalar path on `CalculatorInputs.*_fuel_cost_
gbp_per_kwh` (which fires when `tariff is not STANDARD` →
`_ZERO_FUEL_COST_FOR_OFF_PEAK`) was reading from `prices.unit_price_p_
per_kwh`, which was still wired to SAP 10.2 Table 12 prices via the
`SAP_10_2_SPEC_PRICES` PriceTable constant. For cert 000565 (Dual meter
→ TEN_HOUR tariff + mains-gas DHW via WHC 914), this leaked Table 12's
3.64 p/kWh mains gas rate (vs Table 32's 3.48) into HW cost — a £6
over-count on 3755 HW kWh that landed continuous SAP 0.041 below the
28.5 integer rounding boundary, flipping sap_score 29 → 28.

Verbatim Table 32 (PDF page 95) rows touched by this slice:
  Mains gas             3.48 p/kWh   (Table 12 was 3.64)
  7-hour low tariff     5.50 p/kWh   (Table 12 was 9.40)
  Standard electricity  13.19 p/kWh  (Table 12 was 16.49)

Fix is one PriceTable constant — `RDSAP_10_TABLE_32_PRICES` wires
`table_32_unit_price_p_per_kwh` + the 5.50 / 13.19 scalars per the
amendment. `SAP_10_2_SPEC_PRICES` becomes a back-compat alias so existing
`prices=SAP_10_2_SPEC_PRICES` test imports continue working but route
through Table 32 at the call site.

Cert 000565 movements at HEAD (this commit):
- sap_score:               28 → **29 ✓ EXACT**  (was Δ−1)
- sap_score_continuous:    28.4680 → 28.5355  (Δ−0.041 → Δ+0.027)
- total_fuel_cost_gbp:     4683.88 → 4677.87  (Δ+3.62 → Δ−2.39)
- ecf:                     5.3910 → 5.3841    (Δ+0.004 → Δ−0.003)
- hot_water_kwh_per_yr:    3755.03 = 3755.03 ✓ EXACT (unchanged)

Cumulative cert 000565 closure across S0380.77/78/79/80/81:
- hot_water_kwh:          +1399 → +260 → −238 → 0 → 0 ✓
- sap_score (integer):    +1 → −1 → 0 → −1 → 0 ✓ EXACT
- sap_score_continuous:   +0.60 → −0.035 → +0.057 → −0.041 → +0.027

Cohort impact: STANDARD-tariff certs (the 6 U985 fixtures
000474/000477/000480/000487/000490/000516 and all cohort-2/golden gas
combi certs) route through the §10a orchestrator that already used
Table 32 — zero shift. Off-peak certs in the test suite are cert 000565
only at this point (Dual / TEN_HOUR); golden cohort unaffected. Three
existing scalar-pin tests in `test_cert_to_inputs.py` re-pinned to
Table 32 values:
- `test_gas_heating_with_electric_immersion_charges_hw_at_electricity_
   rate` (0.0364 → 0.0348 gas; 0.1649 → 0.1319 std elec)
- `test_off_peak_meter_routes_electric_costs_to_low_rate` (0.094 → 0.055
   7-hour low fallback)
- `test_standard_meter_keeps_electric_costs_on_standard_rate` (0.1649 →
   0.1319 std elec)

New test pins the rule:
`test_rdsap_10_table_32_prices_charge_mains_gas_hot_water_at_3p48_per_kwh`
quotes the §19.1 spec and asserts cert 000565 HW £/kWh = 0.0348.

Test baseline: 553 pass + 8 expected `test_sap_result_pin[000565-*]`
fails (was 551 + 9; sap_score now closes EXACT). The remaining 8 fails
on cert 000565 are the documented work-queue residuals — RR fold-in
(space_heating, main_heating_fuel), Table 12d/12e dual-rate blend for
lighting + CO2, MEV PCDB record (pumps_fans). Pyright net-zero on
touched files (45 errors, matching baseline).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 22:32:59 +00:00
..
addresses get rid of comments 2026-05-20 13:21:11 +00:00
sap10_calculator Slice S0380.81: RdSAP 10 Table 32 default prices close cert 000565 sap_score 28 → 29 EXACT 2026-05-29 22:32:59 +00:00
sap10_ml Slice S0380.26: RdSAP10 §5.8 dry-lining adjustment on alt walls — closes cert 7700 -0.44 → +5e-5 2026-05-28 10:56:11 +00:00
tasks added postcode splitter rewrite to ddd 2026-05-19 16:35:09 +00:00
postcode.py get rid of comments 2026-05-20 13:21:11 +00:00