Model/datatypes
Khalim Conn-Kowlessar 4ccf9c9720 Slice 52: Summary_000477 chain pins SAP at 1e-4; electric shower + decimal RIR rounding
Three mapper/extractor extensions validated by 000477 closing to 1e-4
and 000487 collapsing from Δ=1.18 SAP to Δ=0.05 (alt-wall residual).

1. RR detailed-surface area rounded half-up to 2 d.p. via Decimal.
   The Elmhurst worksheet rounds 4.39 × 1.50 = 6.585 to 6.59; Python's
   builtin `round` (banker's) returns 6.58 and a naïve floor+0.5 trips
   on FP precision (the product is 6.5849999… in float64). Compute
   the product in `Decimal` first (both operands are exact 2-d.p.
   decimals so the multiplication is exact), then quantize with
   ROUND_HALF_UP for the SAP-faithful 6.59. Closes the 0.01 m² stud-
   wall-area drift that left 000477 at Δ=0.0004 SAP after RR support.

2. Suspended-timber-floor heuristic. The §2(12) wooden-floor ACH (0.2
   unsealed / 0.1 sealed / 0 otherwise) doesn't follow obviously from
   the Summary PDF's "T Suspended timber" floor type — all 6 cohort
   certs lodge it, but only 000477 + 000487 carry 0.2 ACH in their
   U985 worksheets. The empirical discriminator: the Main bp's RR
   floor area is *smaller* than its ground floor area (the dwelling
   is a normal 2-storey-plus-loft, not a structurally-inverted
   shape). 000480 trips the inverse (RR 19.83 > ground 15.28 →
   False) and 000516 trips on the non-ground floor location.

3. Electric vs mixer shower from outlet_type. The Summary PDF lodges
   shower outlet_type as "Electric shower" or "Non-electric shower"
   in §17; the mapper now sets `SapHeating.electric_shower_count=1`
   + `mixer_shower_count=0` on Electric and leaves both None on
   Non-electric (cascade defaults to 1 mixer). Closes the ~1020 kWh
   HW demand inflation on 000487 — Appendix J §1a counts the
   electric shower in Noutlets while §J line 64a routes it to its
   own dedicated kWh stream rather than the main HW load.

Cohort state after this slice:

  000474   0.0000  ✓ Slice 47
  000477   0.0000  ✓ THIS SLICE
  000480   0.0000  ✓ Slice 50
  000487  +0.0519     extension's alternative wall 1 (1.43 m² Timber
                      Frame, U=1.90 lodged but only via full-cert text
                      — not exposed in Summary PDF)
  000490   0.0000  ✓ Slice 49
  000516   0.0000  ✓ Slice 51

5/6 closed at 1e-4. 757 tests pass; pyright net-zero (35 baseline).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 21:32:28 +00:00
..
epc Slice 52: Summary_000477 chain pins SAP at 1e-4; electric shower + decimal RIR rounding 2026-05-24 21:32:28 +00:00
magicplan typing and renaming 🟪 2026-05-07 13:26:49 +00:00
__init__.py further breaking up code 2023-07-20 12:24:34 +01:00
datatypes.py further breaking up code 2023-07-20 12:24:34 +01:00
enums.py completed build of new demo portfolio - some fixed required still 2023-11-20 14:42:16 +00:00