From 77110f22604f3009075ad61e052b0e50bfe770c4 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Fri, 3 Jul 2026 14:23:44 +0000 Subject: [PATCH] =?UTF-8?q?Record=20ADR-0053:=20companion=20taxonomy=20com?= =?UTF-8?q?plete,=20incomplete=20set=20raises=20=F0=9F=9F=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- ...taxonomy-complete-incomplete-set-raises.md | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 docs/adr/0053-heating-override-companion-taxonomy-complete-incomplete-set-raises.md diff --git a/docs/adr/0053-heating-override-companion-taxonomy-complete-incomplete-set-raises.md b/docs/adr/0053-heating-override-companion-taxonomy-complete-incomplete-set-raises.md new file mode 100644 index 000000000..152e19224 --- /dev/null +++ b/docs/adr/0053-heating-override-companion-taxonomy-complete-incomplete-set-raises.md @@ -0,0 +1,89 @@ +# The heating-override companion taxonomy is complete; an incomplete set now raises + +## Status + +accepted + +## Context + +[ADR-0048](0048-heating-override-forces-category-and-control-defers-fuel-and-meter.md) +set the invariant — a system-replacing heating override emits a complete +category + control companion set, never inheriting the replaced system's — and +intended, once the taxonomy was covered, to "flip the log to a raise, so the +coherence invariant is enforced" (#1444 Part C). +[ADR-0050](0050-electric-underfloor-override-drags-category-8-and-conservative-group-7-control.md) +(underfloor) and +[ADR-0052](0052-electric-boiler-and-cpsu-overrides-drag-category-2-and-conservative-group-1-control.md) +(electric boilers) filled two families. Two archetype families remained on the +gap-log, and with them Part C stayed blocked: + +- **"Air source heat pump" (SAP 211)** — category 4 already forced, control + `None` (Table 4e Group 2 unmapped). No live overrides today (census across + all portfolios: 0), so this is taxonomy completion, not a live defect. +- **"Community heating, boilers" / "…, CHP and boilers" (301/302)** — category + 6 already forced, control `None` (Group 3 unmapped). **2,220 live + overrides** — the largest population on the log. The inherited control is + doubly load-bearing for heat networks: it feeds the Table 4e temperature + adjustment *and* the SAP 10.2 Table 4c(3) charging factors (worksheet + (305)/(305a)). + +## Decision + +1. **Wet heat pumps (Table 4a 211-224) drag control 2201** — Table 4e Group 2 + "no time or thermostatic control of room temperature", **+0.3 °C**, the + largest Group 2 adjustment: the conservative in-group default (the heat-pump + mirror of storage 2401 / room-heater 2601 / underfloor 2701 / boiler 2101). + Warm-air heat pumps (521-527) are deliberately left unmapped — no archetype + reaches them, and the raise below is the guard that a future warm-air + archetype cannot land without choosing its Group 5 control. + + This is the *existing-system* fill policy: the ASHP **Measure** overlay + installs 2210 (time-and-temperature zone control) because a measure designs + a modern end-state (ADR-0024); a landlord override describes an existing + pump whose control was never observed, so the conservative default applies. + +2. **Community heating (301/302) drags control 2301** — Table 4e Group 3 + "flat rate charging, no thermostatic control of room temperature". It is + the never-over-crediting default on **both** axes the control drives: the + largest Group 3 temperature adjustment (**+0.3 °C**, tied with 2302) and + the worst Table 4c(3) charging factors (space **1.10**, DHW **1.05** — an + unobserved charging arrangement is never assumed to be usage-linked). + As with every forced companion (ADR-0035/0048 pattern), this overwrites a + better control lodged for the replaced system: the override asserts the + system afresh and synthesis owns coherence. + +3. **An incomplete companion set now raises** (`ValueError`) instead of + logging. Every archetype in `_MAIN_HEATING_CODES` resolves a complete + category + control (gas boilers via their dedicated overlay; all others via + `_category_for`/`_control_for`), so the log-and-continue mitigation has no + remaining population — and a silent log was only ever a stop-gap + (ADR-0048: "the intended end-state is to fill each archetype's + category/control … and then flip the log to a raise"). A future archetype + added without companions now fails loudly at overlay time rather than + shipping a silently-incoherent cert. + +## Consequences + +- The companion-gap error log is gone; #1444 closes. +- Community overrides re-model against the conservative 2301: dwellings whose + replaced-system control was inherited converge on one defensible assumption. + Live sample (portfolio 796, 12 properties): baseline shifts of **0 to −3 + SAP** (typically −1 to −2). The inherited controls were unobserved + usage-linked credits (2306/2307/2309) or outright group-incoherent — two + dwellings carried a Group-1 *boiler* zone control (2110) on a heat network — + so the shift removes credit that was never evidenced. +- Adding a heating archetype now *requires* choosing its category + control + (or extending the family sets) — the raise turns the ADR-0048 checklist into + an enforced contract. + +### Alternatives rejected + +- **A zero-adjustment / usage-linked community default (2307+).** Rejected: + credits a charging arrangement and thermostat the landlord never reported; + the conservative default is the established pattern. +- **Keep log-and-continue indefinitely.** Rejected: the log was the interim + mitigation while the taxonomy was incomplete; leaving it means the next + archetype ships the ADR-0048 inheritance bug silently again. +- **Raise on warm-air heat-pump codes' missing control now.** Not applicable — + no archetype maps to 521-527; the raise fires exactly when one is added + without its Group 5 control, which is the point.