Commit graph

8207 commits

Author SHA1 Message Date
Daniel Roth
353ebe5556 Price water-only heat-network DHW without a plant-efficiency divisor 🟩
SAP 10.2 §4.3 (p.24) puts the water-heating efficiency in the Table 12
heat price, and C4 (p.53) scopes the plant efficiency to CO2/PE only, so
worksheet (310) = (64) × (305a) × (306) carries no efficiency term. The
dwelling-side divisor was applying it a second time.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 10:24:34 +00:00
Daniel Roth
bf4af89b3a Price water-only heat-network DHW without a plant-efficiency divisor 🟥
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 10:22:37 +00:00
KhalimCK
7f68912308
Merge pull request #1591 from Hestia-Homes/feat/pashub-extractor-fixes-and-runner
PasHub extractor accuracy: Guinness cohort 12.4%→20.0% within-0.5, MAE 2.56→1.38
2026-07-15 10:36:56 +01:00
Khalim Conn-Kowlessar
bb7f05693c Update golden for the secondary-heating int-code + retighten pashub MAE post-#1592-revert
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 09:15:46 +00:00
Khalim Conn-Kowlessar
dc271e959a Revert the water-only heat-network calculator changes (tracked in #1592)
Backs out the WHC-950/951/952 primary-loss (d3c0b9e4) and flat-rate-charging
(fecf4f62) changes to cert_to_inputs.py: they fire on ANY cert with those
water-heating codes, regressing the gov-API RdSAP corpus
(test_api_path_sap_accuracy_on_rdsap_21_0_1_corpus MAE 0.627 -> 0.630), and an
Opus audit found the water-only branch has a pre-existing plant-efficiency
double count they flow more kWh through. The calculator work + the correct
fix (water_eff = 1.0/(DLF*1.05)) + an Elmhurst-worksheet regression are
tracked in #1592, isolated from the extractor accuracy PR. The cylinder-
insulation MAPPER fix (f5e4814b) is retained.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 09:09:18 +00:00
Khalim Conn-Kowlessar
21674d5ed0 Re-baseline the pashub gauge to 23% within-0.5 / MAE 1.41 for the orientation fix
Khalim-authorised MAE loosening: coding window orientation exposes the known
SAP-10.2-vs-lodged offset the zeroed solar gains were masking; within-0.5 is
the north-star metric and jumps 20.0% -> 23.9%.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 08:51:52 +00:00
Khalim Conn-Kowlessar
27accc6bb1 Int-code the surveyed window orientation to its SAP10 octant code 🟩
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 08:48:36 +00:00
Khalim Conn-Kowlessar
5276b45836 Int-code the surveyed window orientation to its SAP10 octant code 🟥
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 08:45:22 +00:00
Khalim Conn-Kowlessar
b208234e62 Ratchet the pashub accuracy gauge to MAE 1.371 after the common-wall fix
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 08:40:39 +00:00
Khalim Conn-Kowlessar
7c2cb6b88a Ratchet the pashub accuracy gauge to MAE 1.37 after the common-wall fix
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 08:35:56 +00:00
Khalim Conn-Kowlessar
f7b27dc519 Bill Simplified RIR common walls as common_wall at the main-wall U 🟩
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 08:33:18 +00:00
Khalim Conn-Kowlessar
27158d623d Bill Simplified RIR common walls as common_wall at the main-wall U 🟥
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 08:28:59 +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
600262819c Capture the Simplified RIR 'Roof room type' label from the survey 🟥
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 08:25:11 +00:00
Khalim Conn-Kowlessar
948704d7b0 Record the secondary-heating-type coding fix in the accuracy ratchet note
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 00:28:40 +00:00
Khalim Conn-Kowlessar
be1e10e337 Int-code the surveyed secondary-heating label to its Table 4a room-heater code 🟩
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 00:26:51 +00:00
Khalim Conn-Kowlessar
7b04a9d5f4 Int-code the surveyed secondary-heating label to its Table 4a room-heater code 🟥
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 00:25:20 +00:00
Khalim Conn-Kowlessar
390a818587 Ratchet the pashub accuracy gauge to 19% within-0.5 / MAE 1.39
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 00:05:13 +00:00
Khalim Conn-Kowlessar
fecf4f622c Default the water-only heat network to flat-rate charging per RdSAP 10 🟩
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 23:38:49 +00:00
Khalim Conn-Kowlessar
e6525f7b31 Default the water-only heat network to flat-rate charging per RdSAP 10 🟥
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 23:36:55 +00:00
Khalim Conn-Kowlessar
d3c0b9e499 Accrue Table 3 primary-circuit loss for water-only heat-network cylinders 🟩
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 23:36:20 +00:00
Khalim Conn-Kowlessar
64207ea225 Accrue Table 3 primary-circuit loss for water-only heat-network cylinders 🟥
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 23:30:51 +00:00
Khalim Conn-Kowlessar
f5e4814bf9 Int-code the surveyed cylinder insulation label for the storage-loss cascade 🟩
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 23:25:48 +00:00
Khalim Conn-Kowlessar
87922b622a Int-code the surveyed cylinder insulation label for the storage-loss cascade 🟥
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 23:24:47 +00:00
Khalim Conn-Kowlessar
5a7ff6de1c Lodge the surveyed Wall Dry-Lined answer on the SAP building part 🟩
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 23:22:22 +00:00
Khalim Conn-Kowlessar
073e5ce30c Lodge the surveyed Wall Dry-Lined answer on the SAP building part 🟥
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 23:21:36 +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
0b47798403 Capture the surveyed Wall Dry-Lined answer per building part 🟥
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 23:20:09 +00:00
Khalim Conn-Kowlessar
1f1bb8a556 Withhold roof insulation from RIR surfaces the surveyor marked insulation-unknown 🟩
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 23:17:30 +00:00
Khalim Conn-Kowlessar
7f854e7219 Withhold roof insulation from RIR surfaces the surveyor marked insulation-unknown 🟥
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 23:17:30 +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
d743f6fb3b Capture the per-surface RIR insulation-known answer from the survey 🟥
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 23:11:09 +00:00
Khalim Conn-Kowlessar
a67473ceae Add extractor-accuracy campaign handover (state, recipe, remaining targets)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 22:43:24 +00:00
Khalim Conn-Kowlessar
e0b189aa6d Correct two pashub-verified pre_sap values in the accuracy manifest
Manually verified in pashub (Khalim, 2026-07-14): deal 499584755922
(9 Council Houses, CW5 8AP) is F33, not the stale D67 — our computed 34.0
was right within a point; deal 499617935574 (Brightholme, 14 North Road)
is the accredited E43, not the preliminary 53. 58 Hackle Street (D58) and
16 Bingley Close (E52) were confirmed correct, so our +7.8/+5.7 deviations
there are extraction bugs to hunt next. Harness MAE 1.684 -> 1.551; ceiling
ratcheted to 1.56.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 22:42:03 +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
4d60d79cc9 Extract the PasHub community heat-source label 🟥
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 22:33:08 +00:00
Khalim Conn-Kowlessar
f9d8d33147 Lodge the heat-network SAP code and Table 12 community fuel for PasHub community heating 🟥
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 22:30:28 +00:00
Khalim Conn-Kowlessar
6f1ba4be25 Bill room-in-roof surfaces with the surveyed roof insulation, stud-wall commons 🟩
Two dig-confirmed defects in the fresh RIR mapping (499617935574 overshot
-9): the roof-space-level insulation (Joists/200mm) was never threaded into
the RIR surfaces, so slopes/commons/flat ceilings fell to the Table 18
"unknown" full-uninsulated 2.30 default; and common walls were mislabeled
"common_wall" (a Simplified-Type-2-only concept) instead of the Detailed-mode
stud_wall every worksheet-validated fixture uses. 44.0 -> ~50.3 on the target
fixture; harness MAE 1.748 -> 1.726.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 22:29:20 +00:00
Khalim Conn-Kowlessar
25c3f0b2a0 Bill room-in-roof surfaces with the surveyed roof insulation, stud-wall commons 🟥
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 22:28:10 +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
518c682793 Extract the PasHub detailed room-in-roof block 🟥
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 22:05:31 +00:00
Khalim Conn-Kowlessar
f067f94ec9 Carry room_in_roof on extension roof spaces too (pyright union access) 🟩
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 22:04:33 +00:00
Khalim Conn-Kowlessar
0ca5108584 Carry the surveyed room-in-roof block onto the SAP building part 🟩
_pashub_room_in_roof mirrors _api_build_room_in_roof: every surveyed RIR
surface (gable typed Exposed/Party per Table 4, slopes, common walls, flat
ceiling) becomes a detailed_surfaces entry of length x height, so the
cascade bills exact RIR surfaces instead of treating the shell as
well-insulated loft (issue #1590 bug 5).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 22:01:30 +00:00
Khalim Conn-Kowlessar
9599fd8239 Carry the surveyed room-in-roof block onto the SAP building part 🟥
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 21:59:41 +00:00
Khalim Conn-Kowlessar
895df42afe Keep a PasHub system-build wall off the basement cascade 🟩
PasHub surveys never lodge a basement wall, but "System Build (i.e Any
Other)" maps to wall code 6 — the gov-API basement sentinel — and with
wall_is_basement left None the dwelling silently routed through the basement
wall/floor U-value cascade (issue #1590 bug 7). Both part builders now pin
the flag False. Harness MAE 1.732 -> 1.727.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 21:56:27 +00:00
Khalim Conn-Kowlessar
5980b2d6ed Keep a PasHub system-build wall off the basement cascade 🟥
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 21:53:21 +00:00
Khalim Conn-Kowlessar
de15bd1ed7 Resolve the PasHub Cylinder Size label to the SAP10 Table 28 enum 🟩
"Normal (90-130 litres)"->2, "Large (>170 litres)"->4; "No Access" follows
RdSAP 10 Table 28 p.55 (otherwise-branch 110L for a main-fed cylinder;
electric-immersion No Access strict-raises until meter context is plumbed).
The raw band string was int-or-noned by _cylinder_volume_l_from_code, skipping
the Table 28 volume convention (issue #1590 bug 6). Golden block updated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 21:52:32 +00:00
Khalim Conn-Kowlessar
2949460e6a Resolve the PasHub Cylinder Size label to the SAP10 Table 28 enum 🟥
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 21:48:47 +00:00
Khalim Conn-Kowlessar
090e16ddc2 Dispatch PasHub mechanical ventilation into the §2 ACH cascade 🟩
The surveyed "Ventilation type" label never reached
mechanical_ventilation_kind, so ventilation_from_cert silently defaulted every
mechanical system to NATURAL (24d), dropping its ACH heat loss — 76/205
cohort fixtures lodge dMEV/MEV/PIV (issue #1590 bug 4). Mapping mirrors the
gov-API _API_MECHANICAL_VENTILATION_TO_KIND table (PIV-from-loft is
"as natural"). Harness: within-0.5 12.2% -> 18.5%, MAE 2.538 -> 1.730 — the
campaign's largest single move; floors ratcheted to 0.18 / 1.75.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 21:45:24 +00:00
Khalim Conn-Kowlessar
5220b51961 Dispatch PasHub mechanical ventilation into the §2 ACH cascade 🟥
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 21:43:00 +00:00