fix(P5): classifier dogfood round — range-map depth bug, fallback-DPT softness, RU terms

Building a deliberately messy synthetic house instantly exposed four real gaps:

- _build_range_name_map: a middle group 0 starts at the same raw address as its
  main, so the modulo heuristic let "Вкл/Выкл" clobber "Освещение" and the
  main-range rescue silently died. Depth in the range tree decides now.
- a category from a whole-main DPT fallback (e.g. 20.609 -> hvac) was treated as
  strong; only an exact (main,sub) table entry is strong now (is_exact_dpt).
- DPT 1.010 start/stop marked soft: ventilation timers use it, not just shutters.
- terms learned: Cyrillic а/с, сплит, вытяжк, яркост (RU only); weather/метео in
  sensor, and sensor now outranks hvac so weather-station temperature is a
  sensor, not an HVAC actuator.

Real-project noise after the round: Minsk 1 outlier/685 GAs (was 31 pre-P5),
demo 2/239, Razdory 46/3646. Regressions in test_domain_classifier. 13/13 green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Nikolay1
2026-07-15 11:27:22 +02:00
co-authored by Claude Opus 4.8
parent e9105d45aa
commit 3c086fe228
5 changed files with 66 additions and 17 deletions
+11
View File
@@ -39,6 +39,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
parameters as the cross-cutting GAs they are. `explain_ga` shows the winning signal and tier; the HA
generator still emits a switch for a now-HVAC simple on/off, so no device is dropped.
Dogfooding the classifier against a deliberately messy synthetic house then hardened it further:
the **main-range name map no longer lets a "middle 0" clobber its main group's name** (both start at
the same raw address, so the old modulo heuristic overwrote "Освещение" with "Вкл/Выкл" and the
range rescue silently died — depth in the range tree decides now); a category that comes from a
**whole-main-group DPT fallback is soft** (a guess by construction — only an exact `(main, sub)`
table entry is strong), so a vendor enum like 20.609 no longer poses as authoritative HVAC;
**DPT 1.010 start/stop is soft** (ventilation timers use it too, not just shutters); terms learned:
Cyrillic **а/с**, **сплит**, **вытяжк**, **яркост** (RU only — EN "brightness" also means weather
lux), meteo/weather (sensor now outranks hvac so "Метеостанция - Температура" is a sensor, not an
HVAC actuator). Real-project noise after the round: Minsk 1 outlier / 685 GAs, demo 2 / 239.
### Added
- **Explainable aggregate scores** (`advanced.py`, `handover.py`). Every headline percentage now ships