Model/domain/modelling
Khalim Conn-Kowlessar 07f534ee11 feat(modelling): system tune-up options (standard + zone controls)
Add the system tune-up to the heating Recommendation: keep the existing wet
boiler but install better heating controls and fix the cylinder. Two competing
Options (the Optimiser picks <=1 across the whole heating rec) per the user's
two best control end-states:

- system_tune_up        — standard controls (programmer + room thermostat +
  TRVs, SAP 10.2 Table 4e code 2106)
- system_tune_up_zoned  — time-and-temperature zone control (code 2110, type 3):
  more SAP uplift for more cost

Both keep the boiler (no fuel / SAP code / flue change), set the control
ABSOLUTELY to their end-state, and apply the conditional cylinder fixes (an
80 mm jacket when under-insulated, a thermostat when absent — only when a
cylinder exists). Each control option is offered only when it genuinely improves
the existing control — standard is skipped when the control is already 2106 /
2110 / 2112, zone when already 2110 / 2112 — so neither is ever a downgrade or a
no-op.

Validated against the Elmhurst "system tune up" re-lodgements (cert 001431):
nine befores spanning controls 2101-2113 all converge to the two common afters,
proving the control overlay is absolute. The cascade pin is parametrised over
two starting controls (2101 "no control" + 2113 "room thermostat and TRVs") x
both afters, delta 0 (SAP/CO2/PE).

Wires the two MeasureTypes through contingencies (0.15), the offline catalogue
(500 / 900), the catalogue-coverage list, the report triggers, and the ARA
first-run seed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 10:20:46 +00:00
..
generators feat(modelling): system tune-up options (standard + zone controls) 2026-06-10 10:20:46 +00:00
optimisation refactor(modelling): type measure_type fields as MeasureType 2026-06-08 20:13:31 +00:00
scoring feat(modelling): solid-fuel(coal)->gas boiler upgrade + boiler_flue_type end-state 2026-06-10 08:27:07 +00:00
__init__.py feat(modelling): Overlay Applicator folds EpcSimulation onto EpcPropertyData 2026-06-02 22:13:51 +00:00
ashp_rates.json refactor(modelling): load ASHP rates from a committed costs file 2026-06-06 23:19:53 +00:00
considered_measures.py feat(modelling): considered_measures allowlist on the orchestrator 2026-06-08 20:32:11 +00:00
contingencies.py feat(modelling): system tune-up options (standard + zone controls) 2026-06-10 10:20:46 +00:00
measure_type.py feat(modelling): system tune-up options (standard + zone controls) 2026-06-10 10:20:46 +00:00
plan.py refactor(modelling): type measure_type fields as MeasureType 2026-06-08 20:13:31 +00:00
portfolio_goal.py refactor(modelling): move PortfolioGoal to domain/modelling/ 2026-06-03 22:44:48 +00:00
product.py feat(modelling): persist recommendation.material_id from the catalogue 2026-06-04 08:26:58 +00:00
products.py feat(modelling): Products.solar_bundle_cost + committed solar rate sheet 2026-06-08 12:10:27 +00:00
recommendation.py refactor(modelling): type measure_type fields as MeasureType 2026-06-08 20:13:31 +00:00
scenario.py feat(modelling): domain Scenario + ScenarioPostgresRepository (#1157) 2026-06-03 11:19:52 +00:00
simulation.py feat(modelling): solid-fuel(coal)->gas boiler upgrade + boiler_flue_type end-state 2026-06-10 08:27:07 +00:00
solar_potential.py feat(modelling): typed SolarPotential projection over Google buildingInsights 2026-06-08 09:55:55 +00:00
solar_rates.json feat(modelling): Products.solar_bundle_cost + committed solar rate sheet 2026-06-08 12:10:27 +00:00
valuation.py feat(modelling): ValuationUplift domain class (percentage-primary) 2026-06-04 08:33:19 +00:00