Slice 86: 1:1 windows expansion in cohort 000516 (2 → 5 entries)

Closes the final `sap_windows: LEN 5 vs 2` divergence by replacing
the cohort 000516 hand-built's 2-window collapsed encoding with 5
SapWindow entries mirroring the Summary §11 1:1. Single-bp dwelling;
single glazing-type group (PVC double / g⊥=0.76 / U=2.8); per-
orientation totals preserved:

  NE (orient=2): 3.88 m² split 2.15 + 1.73 (2 rows)
  SW (orient=6): 4.43 m² split 1.94 + 1.67 + 0.82 (3 rows)

Mapper interleaves NE/SW rows; hand-built mirrors that order so
list-position diffs are zero.

Cascade output unchanged: all 11 `_FIXTURE_PINS["000516"]` SapResult
pins remain GREEN at 1e-4 against worksheet `SAP value 62.7937`.

**Cohort 000516 is now fully Layer-2 GREEN.**

**All 6 cohort certs (000474, 000477, 000480, 000487, 000490, 000516)
are now Layer-2 zero-diff** — the mapper produces a load-bearing-
field-equivalent EpcPropertyData for every cohort cert. This clears
the way for closing cert 001479 (the load-bearing API↔Elmhurst
parity-test fixture; Slice 62 skeleton at 2/11 cascade pins green,
gap −3.02 SAP) and then adding the API mapper diff test (Layer 3)
and the production acceptance test (Layer 4 — ±0.5 of published SAP
69 for cert 0535-9020-6509-0821-6222).

Full sweep: 107 passed (was 105 pre-Slice-84; +2 new diff tests for
000490 + 000516), 10 failed (same 10 001479-related). Pyright net-
zero on every touched fixture across Slices 71–86.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Khalim Conn-Kowlessar 2026-05-25 18:19:51 +00:00
parent f863598d39
commit 2d3355ee48

View file

@ -373,12 +373,25 @@ LINE_73_M_TOTAL_INTERNAL_GAINS_W: tuple[float, ...] = (
# ============================================================================
# §6 Solar gains — cert-derived inputs + expected outputs
# ============================================================================
# 2 wall windows (Manufacturer g⊥=0.76 / PVC): NE 3.88, SW 4.43.
# 1 roof window (NE 1.18, Manufacturer g⊥=0.76, pitch 45° per RdSAP10
# Table 24 default, Wood frame FF=0.70). No rooflights.
# 5 wall windows mirroring the Summary §11 1:1, matching the Elmhurst
# mapper's per-row extraction. Single glazing-type group (PVC double /
# g⊥=0.76 / U=2.8); per-orientation totals preserved (cascade-equivalent):
# NE (orient=2): 3.88 m² split 2.15 + 1.73 (2 rows)
# SW (orient=6): 4.43 m² split 1.94 + 1.67 + 0.82 (3 rows)
# Plus 1 roof window (NE 1.18, Manufacturer g⊥=0.76, pitch 45° per
# RdSAP10 Table 24 default, Wood frame FF=0.70). Single-bp dwelling so
# every window's window_location is "Main". No rooflights.
SECTION_6_VERTICAL_WINDOWS: tuple[SapWindow, ...] = (
make_window(orientation=2, width=3.88, height=1.0, solar_transmittance=0.76),
make_window(orientation=6, width=4.43, height=1.0, solar_transmittance=0.76),
make_window(orientation=2, width=2.15, height=1.0, solar_transmittance=0.76,
u_value=2.8, window_location="Main"),
make_window(orientation=6, width=1.94, height=1.0, solar_transmittance=0.76,
u_value=2.8, window_location="Main"),
make_window(orientation=2, width=1.73, height=1.0, solar_transmittance=0.76,
u_value=2.8, window_location="Main"),
make_window(orientation=6, width=1.67, height=1.0, solar_transmittance=0.76,
u_value=2.8, window_location="Main"),
make_window(orientation=6, width=0.82, height=1.0, solar_transmittance=0.76,
u_value=2.8, window_location="Main"),
)
SECTION_6_ROOF_WINDOWS: tuple[RoofWindowInput, ...] = (
RoofWindowInput(