Commit graph

35 commits

Author SHA1 Message Date
Khalim Conn-Kowlessar
5324ae0e57 PasHub floor exposure + alternative walls + extension floor 🟩
Resolve #1601 and land #1602/#1603 on the merged-#1609 tree, adjudicated
against Khalim's verified ground truth (not pre_sap).

#1601 (upper-floor +0.25 m joist void) — RESOLVED as keep-raw. The
gov-API/Elmhurst mappers add 0.25 m to upper-storey heights because their
lodged height is a clear internal ceiling. Against verified truth RAW beats
+0.25 on all 7 verified dwellings (16 Stillwater raw -0.35 within-band vs
+0.25 -0.75; every verified property is already under truth and +0.25 only
lowers SAP). pashub surveys internal dimensions (202/205 "Measurements
Location: Internal") and its upper-ground height gap is modal 0.00, so the
joist void is not differentially present and a blanket +0.25 is unsafe.
_map_floor_dimensions keeps the raw surveyed height with a RESOLVED note.

#1602 — semi-exposed / exposed floor exposure. The surveyed "Floor type"
"Semi Exposed (unheated)" now sets is_above_partially_heated_space (RdSAP
§5.14 U=0.7) and "Exposed Floor" sets is_exposed_floor (§5.13 Table 20), on
the lowest storey (floor==0) only, mirroring the gov-API/Elmhurst siblings.
New strict-raise _pashub_floor_exposure (ADR-0015).

#1603a — alternative walls. New AlternativeWall survey dataclass +
extract_alternative_walls (the "Alternative Wall"->"Windows" section) +
_map_pashub_alternative_walls -> sap_alternative_wall_1/2. The cascade
deducts each alt-wall area from the part's main opaque wall (no double
count), so a mixed-facade dwelling is billed at each sub-area's own
construction. The alt-wall block lodges "As Built" (capital B) — aliased to
the existing default insulation code.

#1603b — extension floor construction. ExtensionConstruction gains a floor
block (parsed like the main building) and _map_extension_building_part now
threads floor_type/construction/insulation/u_value_known, which the main
path already did and the extension silently dropped.

Cohort: within-0.5 50.2% -> 51.2%, MAE 0.652 -> 0.624, 0 strict-raise
errors across all 205. Verified-truth safe: none of the 7 verified
dwellings have alt walls, and #1602 moves the one it touches (2 Philips
exposed ext floor) by -0.00. pyright 0-new (mapper baseline 39). Goldens
test_full_building_construction + end_to_end EXTENSION_1 updated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 15:46:06 +00:00
Khalim Conn-Kowlessar
8a753822c8 Capture the Simplified RIR 'Roof room type' label from the survey 🟩
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 08:27:01 +00:00
Khalim Conn-Kowlessar
483b69ff41 Capture the surveyed Wall Dry-Lined answer per building part 🟩
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 23:20:36 +00:00
Khalim Conn-Kowlessar
8e58f7e871 Capture the per-surface RIR insulation-known answer from the survey 🟩
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 23:12:08 +00:00
Khalim Conn-Kowlessar
f45651dbc0 Lodge the heat-network SAP code and Table 12 community fuel for PasHub community heating 🟩
The extractor now captures "Heating System (Other):" and the mapper resolves
it to the Table 4a code (301, community boilers) + Table 12 community fuel
(51 via the shared _resolve_community_heating_fuel_code), so
is_heat_network_main routes the DLF / standing-charge / 80%-efficiency
branch instead of pricing the dwelling as an ordinary mains-gas boiler
(fixture 507644414148: +14.3 over-rate closes by ~8.6). Harness MAE
1.726 -> 1.684; ceiling ratcheted to 1.70.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 22:34:50 +00:00
Khalim Conn-Kowlessar
955b4dc1e8 Extract the PasHub detailed room-in-roof block 🟩
_parse_room_in_roof captures the RdSAP §3.10 block (age range, floor area,
gables with Exposed/Party type, slopes, common walls, flat ceiling as
length x height) on main and extension roof spaces; both part builders now
carry it to sap_room_in_roof (issue #1590 bug 5 — closes the last #1590
subtask). Harness MAE 1.748 (754917 corrects to pashub's own pre-SAP; RIR
surfaces now billed per-surface instead of as insulated loft).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 22:09:44 +00:00
Khalim Conn-Kowlessar
f92d4f26b8 Extract the PasHub per-system PV block and diverter flag 🟩
"Photovoltaic array kWp Known? Yes" lodges a per-system block (kWp, pitch,
orientation, overshading) instead of the percent-roof estimate; the extractor
only read the estimate, so measured PV never reached the mapper and the
Appendix M credit was silently zero (issue #1590 bug 1). Harness MAE
2.632 -> 2.571 (fixture 507639151843's 13.5-SAP under-rate closes to +0.5);
ceiling ratcheted to 2.58.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 21:38:07 +00:00
Daniel Roth
8529c71ff2 Capture PAS Hub main-heating fuel from the colon 'Fuel:' label variant 🟩
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 17:19:12 +00:00
Daniel Roth
78da2f88b6 Handle wall thickness "Unmeasurable" 🟩 2026-04-30 16:41:16 +00:00
Daniel Roth
6c70c5a535 Extract address when Property photo element is missing from PDF 🟩 2026-04-30 16:25:41 +00:00
Daniel Roth
8b4b345f7a extract renewables pv connection 🟥 2026-04-21 15:17:34 +00:00
Daniel Roth
61dfb34e5b extracy heating immersion type 🟩 2026-04-21 15:08:47 +00:00
Daniel Roth
fc3742d84d extract cylinder thermostat 🟩 2026-04-21 15:04:45 +00:00
Daniel Roth
771c700643 extract secondary heating system 🟩 2026-04-21 11:48:39 +00:00
Daniel Roth
0976088cc9 extract no extensions 🟩 2026-04-21 10:53:37 +00:00
Daniel Roth
6b4a8dfef1 extract water heating cylinder thickness alternative field name 🟩 2026-04-21 10:45:56 +00:00
Daniel Roth
825f5fb096 address JTK review comments 2026-04-20 15:11:17 +00:00
Daniel Roth
0a8b9e0767 Include inspection metadata in output 2026-04-20 09:04:54 +00:00
Daniel Roth
968f025bc3 inspection date is date not str 2026-04-20 08:17:01 +00:00
Daniel Roth
edecbe6bef pdf json to RdSapSiteNotes full extract 🟩 2026-04-20 08:10:45 +00:00
Daniel Roth
326ed20015 Load Conservatories, Renewables, RoomCountElements, WaterUse, CustomerReponse, SurveyAddendum from SiteNotes JSON 🟩 2026-04-16 14:30:46 +00:00
Daniel Roth
47cae167c8 Load Conservatories, Renewables, RoomCountElements, WaterUse, CustomerReponse, SurveyAddendum from SiteNotes JSON 🟥 2026-04-16 14:30:15 +00:00
Daniel Roth
7833413c8b Load Ventilation from SiteNotes JSON 🟩 2026-04-16 14:24:41 +00:00
Daniel Roth
4bcdb4823b Load Ventilation from SiteNotes JSON 🟥 2026-04-16 14:24:11 +00:00
Daniel Roth
a169280b28 Load HeatingAndHotWater from SiteNotes JSON 🟩 2026-04-16 14:22:26 +00:00
Daniel Roth
29f9a664a5 Load HeatingAndHotWater from SiteNotes JSON 🟥 2026-04-16 14:19:01 +00:00
Daniel Roth
cf0a9a6326 Load Windows from SiteNotes JSON 🟩 2026-04-16 14:16:22 +00:00
Daniel Roth
4a415ab4a2 Load Windows from SiteNotes JSON 🟥 2026-04-16 14:15:11 +00:00
Daniel Roth
c0801b9e07 Load RoofSpace from SiteNotes JSON 🟩 2026-04-16 14:12:58 +00:00
Daniel Roth
3960998fee Load RoofSpace from SiteNotes JSON 🟥 2026-04-16 14:11:44 +00:00
Daniel Roth
770bf1293d Load BuildingMeasurements from SiteNotes JSON 🟩 2026-04-16 14:09:36 +00:00
Daniel Roth
2ed741df5c Load BuildingMeasurements from SiteNotes JSON 🟥 2026-04-16 14:08:20 +00:00
Daniel Roth
5f9c3e9bea Load BuildingConstruction from SiteNotes JSON 🟩 2026-04-16 14:05:11 +00:00
Daniel Roth
bb648b8223 Map to RdSapSiteNotes from site notes JSON 🟩 2026-04-16 13:56:27 +00:00
Daniel Roth
4f3c7894ae Map to RdSapSiteNotes from site notes JSON 🟥 2026-04-16 13:54:03 +00:00