Record ADR-0053: companion taxonomy complete, incomplete set raises 🟪

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Khalim Conn-Kowlessar 2026-07-03 14:23:44 +00:00
parent 6707ab084f
commit 77110f2260

View file

@ -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.