Model/backend/documents_parser/tests
Khalim Conn-Kowlessar 273e9c7bb0 Slice S0380.106: MEV fans PE split via Table 12a Grid 2 + Table 12e (SAP 10.2 §10a / §10c)
PE-side mirror of S0380.103 (cost) + S0380.105 (CO2). Completes the
MEV cascade trifecta for off-peak tariff certs. Cert 000565
worksheet line (281):

  Pumps, fans and electric keep-hot  252.5159  1.5239  383.3796 (281)

The displayed factor (1.5239) is the ALL_OTHER_USES Table 12e Σ
days-weighted blend; the displayed product (383.3796) is the kWh-
weighted blend across the two Grid 2 categories:

  F_FANS  = 0.58 × F_code34 + 0.42 × F_code33 = 1.51268 kWh/kWh
  F_OTHER = 0.80 × F_code34 + 0.20 × F_code33 = 1.52391 kWh/kWh
  F_eff   = (127.5159 × 1.51268 + 125.0 × 1.52391) / 252.5159
          = 1.51824 kWh/kWh
  PE      = 252.5159 × 1.51824 = 383.3796 kWh/yr ✓

Pre-slice the cascade applied 1.52391 to ALL 252.5159 kWh →
384.81 → +1.43 over ws.

SAP 10.2 Table 12a Grid 2 (PDF p.191) — same dispatch as Slice
S0380.105 — splits the off-peak high-rate fraction by end-use
between `FANS_FOR_MECH_VENT` and `ALL_OTHER_USES`.

SAP 10.2 Table 12e (PDF p.195) verbatim header:

  "Where electricity is the fuel used, the relevant set of factors
   in the table below should be used to calculate the monthly
   primary energy instead the annual average factor given in
   Table 12."

The Grid 2 high-rate fraction blends Table 12e high-rate × low-
rate codes per `F_blended = high_frac × F_high + (1 − high_frac)
× F_low`. MEV fans bill at the lower 0.58 high_frac → lower PE
factor on the higher-PE high-rate code 34. Identical structural
fix as the .105 CO2 slice; the only delta is the underlying Table
12 column.

2-layer fix:
1. New helper `_pumps_fans_primary_factor` in cert_to_inputs.py
   — mirror of `_pumps_fans_co2_factor_kg_per_kwh`. Returns kWh-
   weighted blend of FANS_FOR_MECH_VENT + ALL_OTHER_USES factors.
   Falls back to ALL_OTHER_USES rate on STANDARD / no-MEV certs.
2. Call site at line 4640 wires `mev_kwh_for_cost_split` +
   `pumps_fans_kwh` through the helper.

Movement at HEAD `8a3aaf7a` → post-slice (cert 000565):

| Pin                            | Pre        | Post       |
|--------------------------------|-----------:|-----------:|
| pumps_fans_primary_factor       |    1.52391 |    1.51824 |
| pumps_fans_pe_kwh_per_yr        |   384.8122 |   383.3797 |  ✓ EXACT vs ws (281)
| primary_energy_kwh_per_yr       | 62228.4896 | 62227.0570 |
| primary_energy_kwh_per_m2       |   194.5187 |   194.5143 |

No effect on sap_score_continuous (ECF is cost-based, not PE-based),
ecf, or any of the 7 currently-failing 000565 pins. The total PE
residual remains dominated by an unrelated SH cascade PE factor
gap (cascade 170 kWh/m² vs ws 135.6 — separate slice).

Cohort safety: STANDARD-tariff and no-MEV certs return the existing
ALL_OTHER_USES rate (helper falls through). No-MEV certs return
the same rate (mev_kwh_per_yr=0 short-circuit). Pyright net-zero
per touched file (45 baseline → 45 post-change).

Test count: 605 pass + 7 expected 000565 fails → **606 pass + 7
expected 000565 fails** (new
test_summary_000565_mev_fans_pe_factor_uses_table_12a_grid_2_
fans_for_mech_vent_split GREEN; 7 known 000565 fails set unchanged).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-01 16:28:47 +00:00
..
fixtures Slice S0380.52: cert 000565 Elmhurst-only mapper-driven cascade pin + glazing-label coverage 2026-06-01 16:28:47 +00:00
__init__.py Map to RdSapSiteNotes from site notes JSON 🟥 2026-04-16 13:54:03 +00:00
test_elmhurst_end_to_end.py Slice S0380.17: map Elmhurst §11 glazing-type labels to SAP10 codes 2026-06-01 16:28:46 +00:00
test_elmhurst_extractor.py extract window frame details from elmhurst site notes 🟥 2026-04-27 15:50:25 +00:00
test_end_to_end.py P6.1 follow-on: unbox BuildingPartIdentifier at backend boundaries 2026-05-20 09:58:23 +00:00
test_extractor.py Handle wall thickness "Unmeasurable" 🟩 2026-04-30 16:41:16 +00:00
test_pdf.py rename example site notes to PasHub_ and add Elmhurst example 2026-04-24 13:01:51 +00:00
test_summary_pdf_mapper_chain.py Slice S0380.106: MEV fans PE split via Table 12a Grid 2 + Table 12e (SAP 10.2 §10a / §10c) 2026-06-01 16:28:47 +00:00