Model/backend/documents_parser
Khalim Conn-Kowlessar cb4e31a135 Slice 51: Summary_000516 chain pins SAP at 1e-4; roof-window separation
Three mapper extensions, validated by 000516 closing to 1e-4:

1. Roof-window separation by U-value threshold. Elmhurst Summary PDFs
   pool roof windows into the §11 vertical-window table with no type
   marker. The U-value is the only reliable signal — vertical glazing
   in the cohort tops out at 2.80 W/m²K, while Table 24 roof windows
   start at 3.0+. `_is_elmhurst_roof_window` filters U > 3.0 into
   `sap_roof_windows`; the rest flow through the `sap_windows` path.

2. Table-24 roof-window U-value lookup. The cohort lodges Manufacturer
   U=3.10 for the 000516 roof window, but the worksheet's (27a) line
   (U_eff=2.99) reverse-engineers to a raw U=3.40 — the RdSAP10
   Table 24 "Double pre 2002" roof-window default. `_elmhurst_roof_
   window_u_value` keyed on glazing-type captures the +0.3 W/m²K step;
   falls back to the lodged U for glazing types not yet in the table.

3. `SapWindow.window_width × window_height = lodged Area` convention.
   The Elmhurst Summary PDF carries lodged W (2 d.p.) × lodged H
   (2 d.p.) AND a precomputed Area (2 d.p., not always equal to
   product after rounding). The cascade reads only the W×H product
   across §3 / §5 / §6, so flattening to `(area, 1.0)` keeps the
   downstream area aligned with the worksheet's rounded value rather
   than reconstructing W×H with its own rounding drift (e.g. 1.22 ×
   1.76 = 2.1472 m² vs lodged 2.15 m²). The existing
   `test_first_window_*` tests pinning literal W/H were updated to
   pin the area product (the cascade-relevant invariant).

Cohort state after this slice:

  000474   0.0000  ✓ Slice 47
  000477  +1.1161     Elmhurst floor_ach quirk
  000480   0.0000  ✓ Slice 50
  000487  +1.1844     extractor still drops most §11 windows
  000490   0.0000  ✓ Slice 49
  000516   0.0000  ✓ THIS SLICE

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

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 21:16:46 +00:00
..
handler address JTK review comments 2026-04-20 15:11:17 +00:00
tests Slice 51: Summary_000516 chain pins SAP at 1e-4; roof-window separation 2026-05-24 21:16:46 +00:00
__init__.py Map to RdSapSiteNotes from site notes JSON 🟥 2026-04-16 13:54:03 +00:00
db_writer.py include updating epc_property_data to pashub to ara workflow 2026-04-29 09:55:14 +00:00
elmhurst_extractor.py Slice 50: Summary_000480 chain pins SAP at 1e-4; Room-in-Roof + baths + party-wall + roof-none 2026-05-24 21:09:22 +00:00
extractor.py Handle wall thickness "Unmeasurable" 🟩 2026-04-30 16:41:16 +00:00
local_runner.py update local runner to work for elmhurst 2026-04-24 14:01:36 +00:00
parser.py load ecmk site notes to db 2026-04-29 11:20:47 +00:00
pdf.py update local runner to work for elmhurst 2026-04-24 14:01:36 +00:00