mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
chore: commit cert 001479 fixture + RdSAP/PCDF spec PDFs
Three load-bearing files that the post-Slice-95 tests and docs cite but were never tracked: 1. `packages/domain/src/domain/sap/rdsap/tests/fixtures/golden/ 0535-9020-6509-0821-6222.json` — API JSON for cert 001479 (Elmhurst worksheet P960-0001-001479, lodged 31 Oct 2025). Required by `test_api_001479_full_chain_sap_matches_worksheet_pdf_ exactly` (Slice 95's Layer 4 1e-4 gate) and by `test_golden_cert_residual_matches_pin` (residual-from-integer pin path). Without this committed, both tests fail to find the fixture file. 2. `docs/sap-spec/RdSAP 10 Specification 10-06-2025.pdf` — replaces the previously-tracked `rdsap-10-specification-2025-06-10.pdf` (same content, cleaner filename). Cited from 5 source files (`table_32.py`, `pcdb/parser.py`, README.md, SAP_CALCULATOR.md, NEXT_AGENT_PROMPT.md) and every spec-citation commit message in Slices 87-95. Git auto-detected the rename. 3. `docs/sap-spec/PCDF_Spec_Rev-06b_12_May_2021.pdf` — cited from `pcdb/parser.py:69` and the §4-water-heating combi-loss docstrings; needed to validate the PCDB Table 3a/3b/3c routing logic. Also fixes the one stale reference in `test_dimensions.py:471` that still pointed to the old `rdsap-10-specification-2025-06-10 .pdf` filename — now points to the renamed file. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
b2c6a57247
commit
a75052dcca
4 changed files with 514 additions and 1 deletions
BIN
docs/sap-spec/PCDF_Spec_Rev-06b_12_May_2021.pdf
Normal file
BIN
docs/sap-spec/PCDF_Spec_Rev-06b_12_May_2021.pdf
Normal file
Binary file not shown.
513
packages/domain/src/domain/sap/rdsap/tests/fixtures/golden/0535-9020-6509-0821-6222.json
vendored
Normal file
513
packages/domain/src/domain/sap/rdsap/tests/fixtures/golden/0535-9020-6509-0821-6222.json
vendored
Normal file
|
|
@ -0,0 +1,513 @@
|
|||
{
|
||||
"address_line_1": "67 Howick Park Drive",
|
||||
"address_line_2": "Penwortham",
|
||||
"air_tightness": {
|
||||
"description": "(not tested)",
|
||||
"energy_efficiency_rating": 0,
|
||||
"environmental_efficiency_rating": 0
|
||||
},
|
||||
"assessment_type": "RdSAP",
|
||||
"built_form": 2,
|
||||
"calculation_software_version": "5.02r0316",
|
||||
"cfl_fixed_lighting_bulbs_count": 6,
|
||||
"co2_emissions_current": 2.5,
|
||||
"co2_emissions_current_per_floor_area": 37,
|
||||
"co2_emissions_potential": 2.2,
|
||||
"completion_date": "2025-10-31",
|
||||
"conservatory_type": 1,
|
||||
"country_code": "ENG",
|
||||
"created_at": "2025-10-31 17:58:26",
|
||||
"current_energy_efficiency_band": "C",
|
||||
"door_count": 1,
|
||||
"draughtproofed_door_count": 0,
|
||||
"dwelling_type": "Semi-detached house",
|
||||
"energy_consumption_current": 201,
|
||||
"energy_consumption_potential": 171,
|
||||
"energy_rating_average": 60,
|
||||
"energy_rating_current": 69,
|
||||
"energy_rating_potential": 76,
|
||||
"environmental_impact_current": 68,
|
||||
"environmental_impact_potential": 72,
|
||||
"extensions_count": 2,
|
||||
"extract_fans_count": 2,
|
||||
"floors": [
|
||||
{
|
||||
"description": "Suspended, no insulation (assumed)",
|
||||
"energy_efficiency_rating": 0,
|
||||
"environmental_efficiency_rating": 0
|
||||
},
|
||||
{
|
||||
"description": "Suspended, insulated (assumed)",
|
||||
"energy_efficiency_rating": 0,
|
||||
"environmental_efficiency_rating": 0
|
||||
}
|
||||
],
|
||||
"habitable_room_count": 4,
|
||||
"has_fixed_air_conditioning": "false",
|
||||
"has_heated_separate_conservatory": "false",
|
||||
"has_hot_water_cylinder": "false",
|
||||
"heated_room_count": 4,
|
||||
"heating_cost_current": {
|
||||
"currency": "GBP",
|
||||
"value": 763
|
||||
},
|
||||
"heating_cost_potential": {
|
||||
"currency": "GBP",
|
||||
"value": 705
|
||||
},
|
||||
"hot_water": {
|
||||
"description": "From main system",
|
||||
"energy_efficiency_rating": 4,
|
||||
"environmental_efficiency_rating": 4
|
||||
},
|
||||
"hot_water_cost_current": {
|
||||
"currency": "GBP",
|
||||
"value": 155
|
||||
},
|
||||
"hot_water_cost_potential": {
|
||||
"currency": "GBP",
|
||||
"value": 155
|
||||
},
|
||||
"incandescent_fixed_lighting_bulbs_count": 0,
|
||||
"inspection_date": "2025-10-29",
|
||||
"insulated_door_count": 0,
|
||||
"language_code": 1,
|
||||
"led_fixed_lighting_bulbs_count": 17,
|
||||
"lighting": {
|
||||
"description": "Good lighting efficiency",
|
||||
"energy_efficiency_rating": 4,
|
||||
"environmental_efficiency_rating": 4
|
||||
},
|
||||
"lighting_cost_current": {
|
||||
"currency": "GBP",
|
||||
"value": 46
|
||||
},
|
||||
"lighting_cost_potential": {
|
||||
"currency": "GBP",
|
||||
"value": 46
|
||||
},
|
||||
"main_heating": [
|
||||
{
|
||||
"description": "Boiler and radiators, mains gas",
|
||||
"energy_efficiency_rating": 4,
|
||||
"environmental_efficiency_rating": 4
|
||||
}
|
||||
],
|
||||
"main_heating_controls": [
|
||||
{
|
||||
"description": "Programmer, room thermostat and TRVs",
|
||||
"energy_efficiency_rating": 4,
|
||||
"environmental_efficiency_rating": 4
|
||||
}
|
||||
],
|
||||
"measurement_type": 1,
|
||||
"mechanical_ventilation": 0,
|
||||
"multiple_glazed_proportion": 100,
|
||||
"percent_draughtproofed": 90,
|
||||
"post_town": "PRESTON",
|
||||
"postcode": "PR1 0LX",
|
||||
"potential_energy_efficiency_band": "C",
|
||||
"pressure_test": 4,
|
||||
"property_type": 0,
|
||||
"region_code": 19,
|
||||
"registration_date": "2025-10-31",
|
||||
"renewable_heat_incentive": {
|
||||
"space_heating_existing_dwelling": 7428.0,
|
||||
"water_heating": 2074.92
|
||||
},
|
||||
"report_type": 2,
|
||||
"roofs": [
|
||||
{
|
||||
"description": "Pitched, 300 mm loft insulation",
|
||||
"energy_efficiency_rating": 5,
|
||||
"environmental_efficiency_rating": 5
|
||||
},
|
||||
{
|
||||
"description": "Pitched, insulated",
|
||||
"energy_efficiency_rating": 5,
|
||||
"environmental_efficiency_rating": 5
|
||||
}
|
||||
],
|
||||
"sap_building_parts": [
|
||||
{
|
||||
"building_part_number": 1,
|
||||
"construction_age_band": "C",
|
||||
"floor_heat_loss": 7,
|
||||
"floor_insulation_thickness": "NI",
|
||||
"identifier": "Main Dwelling",
|
||||
"party_wall_construction": 2,
|
||||
"roof_construction": 4,
|
||||
"roof_insulation_location": 2,
|
||||
"roof_insulation_thickness": "300mm",
|
||||
"sap_floor_dimensions": [
|
||||
{
|
||||
"floor": 0,
|
||||
"floor_construction": 2,
|
||||
"floor_insulation": 1,
|
||||
"heat_loss_perimeter": {
|
||||
"quantity": "metres",
|
||||
"value": 11.99
|
||||
},
|
||||
"party_wall_length": {
|
||||
"quantity": "metres",
|
||||
"value": 6.94
|
||||
},
|
||||
"room_height": {
|
||||
"quantity": "metres",
|
||||
"value": 2.39
|
||||
},
|
||||
"total_floor_area": {
|
||||
"quantity": "square metres",
|
||||
"value": 30.45
|
||||
}
|
||||
},
|
||||
{
|
||||
"floor": 1,
|
||||
"heat_loss_perimeter": {
|
||||
"quantity": "metres",
|
||||
"value": 13.55
|
||||
},
|
||||
"party_wall_length": {
|
||||
"quantity": "metres",
|
||||
"value": 6.94
|
||||
},
|
||||
"room_height": {
|
||||
"quantity": "metres",
|
||||
"value": 2.28
|
||||
},
|
||||
"total_floor_area": {
|
||||
"quantity": "square metres",
|
||||
"value": 30.77
|
||||
}
|
||||
}
|
||||
],
|
||||
"wall_construction": 4,
|
||||
"wall_dry_lined": "N",
|
||||
"wall_insulation_thickness": "NI",
|
||||
"wall_insulation_type": 2,
|
||||
"wall_thickness": 280,
|
||||
"wall_thickness_measured": "Y"
|
||||
},
|
||||
{
|
||||
"building_part_number": 2,
|
||||
"construction_age_band": "M",
|
||||
"floor_heat_loss": 7,
|
||||
"floor_insulation_thickness": "NI",
|
||||
"identifier": "Extension 1",
|
||||
"party_wall_construction": "NA",
|
||||
"roof_construction": 8,
|
||||
"roof_insulation_location": 7,
|
||||
"sap_floor_dimensions": [
|
||||
{
|
||||
"floor": 0,
|
||||
"floor_construction": 2,
|
||||
"floor_insulation": 1,
|
||||
"heat_loss_perimeter": {
|
||||
"quantity": "metres",
|
||||
"value": 6.67
|
||||
},
|
||||
"party_wall_length": {
|
||||
"quantity": "metres",
|
||||
"value": 0
|
||||
},
|
||||
"room_height": {
|
||||
"quantity": "metres",
|
||||
"value": 2.48
|
||||
},
|
||||
"total_floor_area": {
|
||||
"quantity": "square metres",
|
||||
"value": 5.37
|
||||
}
|
||||
}
|
||||
],
|
||||
"sloping_ceiling_insulation_thickness": "AB",
|
||||
"wall_construction": 4,
|
||||
"wall_dry_lined": "N",
|
||||
"wall_insulation_thickness": "NI",
|
||||
"wall_insulation_type": 4,
|
||||
"wall_thickness": 280,
|
||||
"wall_thickness_measured": "Y"
|
||||
},
|
||||
{
|
||||
"building_part_number": 3,
|
||||
"construction_age_band": "C",
|
||||
"floor_heat_loss": 1,
|
||||
"floor_insulation_thickness": "NI",
|
||||
"identifier": "Extension 2",
|
||||
"party_wall_construction": "NA",
|
||||
"roof_construction": 8,
|
||||
"roof_insulation_location": 7,
|
||||
"sap_floor_dimensions": [
|
||||
{
|
||||
"floor": 0,
|
||||
"floor_construction": 2,
|
||||
"floor_insulation": 1,
|
||||
"heat_loss_perimeter": {
|
||||
"quantity": "metres",
|
||||
"value": 2.81
|
||||
},
|
||||
"party_wall_length": {
|
||||
"quantity": "metres",
|
||||
"value": 0
|
||||
},
|
||||
"room_height": {
|
||||
"quantity": "metres",
|
||||
"value": 2.1
|
||||
},
|
||||
"total_floor_area": {
|
||||
"quantity": "square metres",
|
||||
"value": 1.92
|
||||
}
|
||||
}
|
||||
],
|
||||
"sloping_ceiling_insulation_thickness": "AB",
|
||||
"wall_construction": 4,
|
||||
"wall_dry_lined": "N",
|
||||
"wall_insulation_thickness": "NI",
|
||||
"wall_insulation_type": 2,
|
||||
"wall_thickness": 280,
|
||||
"wall_thickness_measured": "Y"
|
||||
}
|
||||
],
|
||||
"sap_energy_source": {
|
||||
"electricity_smart_meter_present": "true",
|
||||
"gas_smart_meter_present": "true",
|
||||
"is_dwelling_export_capable": "false",
|
||||
"mains_gas": "Y",
|
||||
"meter_type": 2,
|
||||
"photovoltaic_supply": {
|
||||
"none_or_no_details": {
|
||||
"percent_roof_area": 0
|
||||
}
|
||||
},
|
||||
"pv_connection": 0,
|
||||
"wind_turbines_count": 0,
|
||||
"wind_turbines_terrain_type": 2
|
||||
},
|
||||
"sap_heating": {
|
||||
"cylinder_size": 1,
|
||||
"has_fixed_air_conditioning": "false",
|
||||
"immersion_heating_type": "NA",
|
||||
"main_heating_details": [
|
||||
{
|
||||
"boiler_flue_type": 2,
|
||||
"central_heating_pump_age": 0,
|
||||
"emitter_temperature": 0,
|
||||
"fan_flue_present": "Y",
|
||||
"has_fghrs": "N",
|
||||
"heat_emitter_type": 1,
|
||||
"main_fuel_type": 26,
|
||||
"main_heating_category": 2,
|
||||
"main_heating_control": 2106,
|
||||
"main_heating_data_source": 1,
|
||||
"main_heating_fraction": 1,
|
||||
"main_heating_index_number": 17507,
|
||||
"main_heating_number": 1
|
||||
}
|
||||
],
|
||||
"number_baths": 0,
|
||||
"number_baths_wwhrs": 0,
|
||||
"secondary_fuel_type": 26,
|
||||
"secondary_heating_type": 605,
|
||||
"shower_outlets": [
|
||||
{
|
||||
"shower_outlet": {
|
||||
"shower_outlet_type": 1,
|
||||
"shower_wwhrs": 1
|
||||
}
|
||||
}
|
||||
],
|
||||
"water_heating_code": 901,
|
||||
"water_heating_fuel": 26
|
||||
},
|
||||
"sap_version": 10.2,
|
||||
"sap_windows": [
|
||||
{
|
||||
"draught_proofed": "true",
|
||||
"glazing_gap": 12,
|
||||
"glazing_type": 3,
|
||||
"orientation": 8,
|
||||
"permanent_shutters_insulated": "N",
|
||||
"permanent_shutters_present": "N",
|
||||
"pvc_frame": "true",
|
||||
"window_height": 1.32,
|
||||
"window_location": 0,
|
||||
"window_type": 1,
|
||||
"window_wall_type": 1,
|
||||
"window_width": 2.53
|
||||
},
|
||||
{
|
||||
"draught_proofed": "true",
|
||||
"glazing_gap": 12,
|
||||
"glazing_type": 3,
|
||||
"orientation": 2,
|
||||
"permanent_shutters_insulated": "N",
|
||||
"permanent_shutters_present": "N",
|
||||
"pvc_frame": "true",
|
||||
"window_height": 1.3,
|
||||
"window_location": 0,
|
||||
"window_type": 1,
|
||||
"window_wall_type": 1,
|
||||
"window_width": 0.56
|
||||
},
|
||||
{
|
||||
"draught_proofed": "true",
|
||||
"glazing_type": 13,
|
||||
"orientation": 4,
|
||||
"permanent_shutters_insulated": "N",
|
||||
"permanent_shutters_present": "N",
|
||||
"window_height": 2.11,
|
||||
"window_location": 1,
|
||||
"window_type": 1,
|
||||
"window_wall_type": 1,
|
||||
"window_width": 3.02
|
||||
},
|
||||
{
|
||||
"draught_proofed": "true",
|
||||
"glazing_gap": 12,
|
||||
"glazing_type": 3,
|
||||
"orientation": 8,
|
||||
"permanent_shutters_insulated": "N",
|
||||
"permanent_shutters_present": "N",
|
||||
"pvc_frame": "true",
|
||||
"window_height": 1.53,
|
||||
"window_location": 0,
|
||||
"window_type": 1,
|
||||
"window_wall_type": 1,
|
||||
"window_width": 1.99
|
||||
},
|
||||
{
|
||||
"draught_proofed": "true",
|
||||
"glazing_gap": 12,
|
||||
"glazing_type": 3,
|
||||
"orientation": 2,
|
||||
"permanent_shutters_insulated": "N",
|
||||
"permanent_shutters_present": "N",
|
||||
"pvc_frame": "true",
|
||||
"window_height": 1.28,
|
||||
"window_location": 0,
|
||||
"window_type": 1,
|
||||
"window_wall_type": 1,
|
||||
"window_width": 1.04
|
||||
},
|
||||
{
|
||||
"draught_proofed": "true",
|
||||
"glazing_gap": 12,
|
||||
"glazing_type": 3,
|
||||
"orientation": 2,
|
||||
"permanent_shutters_insulated": "N",
|
||||
"permanent_shutters_present": "N",
|
||||
"pvc_frame": "true",
|
||||
"window_height": 1.28,
|
||||
"window_location": 0,
|
||||
"window_type": 1,
|
||||
"window_wall_type": 1,
|
||||
"window_width": 0.55
|
||||
},
|
||||
{
|
||||
"draught_proofed": "true",
|
||||
"glazing_gap": 12,
|
||||
"glazing_type": 3,
|
||||
"orientation": 2,
|
||||
"permanent_shutters_insulated": "N",
|
||||
"permanent_shutters_present": "N",
|
||||
"pvc_frame": "true",
|
||||
"window_height": 1.16,
|
||||
"window_location": 0,
|
||||
"window_type": 1,
|
||||
"window_wall_type": 1,
|
||||
"window_width": 0.85
|
||||
},
|
||||
{
|
||||
"draught_proofed": "true",
|
||||
"glazing_gap": 12,
|
||||
"glazing_type": 3,
|
||||
"orientation": 4,
|
||||
"permanent_shutters_insulated": "N",
|
||||
"permanent_shutters_present": "N",
|
||||
"pvc_frame": "true",
|
||||
"window_height": 1.29,
|
||||
"window_location": 0,
|
||||
"window_type": 1,
|
||||
"window_wall_type": 1,
|
||||
"window_width": 1.65
|
||||
},
|
||||
{
|
||||
"draught_proofed": "true",
|
||||
"glazing_gap": 12,
|
||||
"glazing_type": 3,
|
||||
"orientation": 1,
|
||||
"permanent_shutters_insulated": "N",
|
||||
"permanent_shutters_present": "N",
|
||||
"pvc_frame": "true",
|
||||
"window_height": 1.32,
|
||||
"window_location": 0,
|
||||
"window_type": 1,
|
||||
"window_wall_type": 1,
|
||||
"window_width": 1.29
|
||||
}
|
||||
],
|
||||
"schema_type": "RdSAP-Schema-21.0.1",
|
||||
"schema_version_original": "21.0.1",
|
||||
"secondary_heating": {
|
||||
"description": "Room heaters, mains gas",
|
||||
"energy_efficiency_rating": 0,
|
||||
"environmental_efficiency_rating": 0
|
||||
},
|
||||
"solar_water_heating": "N",
|
||||
"status": "entered",
|
||||
"suggested_improvements": [
|
||||
{
|
||||
"energy_performance_rating": 71,
|
||||
"environmental_impact_rating": 71,
|
||||
"improvement_category": 5,
|
||||
"improvement_details": {
|
||||
"improvement_number": 57
|
||||
},
|
||||
"improvement_type": "W1",
|
||||
"indicative_cost": "\u00a35,000 - \u00a310,000",
|
||||
"sequence": 1,
|
||||
"typical_saving": {
|
||||
"currency": "GBP",
|
||||
"value": 58
|
||||
}
|
||||
},
|
||||
{
|
||||
"energy_performance_rating": 76,
|
||||
"environmental_impact_rating": 72,
|
||||
"improvement_category": 5,
|
||||
"improvement_details": {
|
||||
"improvement_number": 34
|
||||
},
|
||||
"improvement_type": "U",
|
||||
"indicative_cost": "\u00a38,000 - \u00a310,000",
|
||||
"sequence": 2,
|
||||
"typical_saving": {
|
||||
"currency": "GBP",
|
||||
"value": 196
|
||||
}
|
||||
}
|
||||
],
|
||||
"tenure": 3,
|
||||
"total_floor_area": 69,
|
||||
"transaction_type": 15,
|
||||
"uprn": 100010634425,
|
||||
"uprn_source": "Energy Assessor",
|
||||
"walls": [
|
||||
{
|
||||
"description": "Cavity wall, filled cavity",
|
||||
"energy_efficiency_rating": 4,
|
||||
"environmental_efficiency_rating": 4
|
||||
},
|
||||
{
|
||||
"description": "Cavity wall, as built, insulated (assumed)",
|
||||
"energy_efficiency_rating": 5,
|
||||
"environmental_efficiency_rating": 5
|
||||
}
|
||||
],
|
||||
"window": {
|
||||
"description": "Fully double glazed",
|
||||
"energy_efficiency_rating": 3,
|
||||
"environmental_efficiency_rating": 3
|
||||
}
|
||||
}
|
||||
|
|
@ -468,7 +468,7 @@ def test_all_rir_shapes_apply_section_1_2_45m_convention_uniformly(
|
|||
) -> None:
|
||||
"""RdSAP §3.9.2 wall-area formulas and §3.10 detailed measurements
|
||||
are for §3 heat-loss U-value calculation, **not** §1 dimensions —
|
||||
confirmed at docs/sap-spec/rdsap-10-specification-2025-06-10.pdf
|
||||
confirmed at `docs/sap-spec/RdSAP 10 Specification 10-06-2025.pdf`
|
||||
pages 22-24. The §1 storey-height convention of 2.45 m from §3.9.1
|
||||
extends uniformly to every RR shape: each contributes exactly
|
||||
`floor_area` to TFA, `floor_area × 2.45` to volume, and +1 storey.
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue