fix(P3): root-cause suppression — an empty-name GA no longer cascades

Council #2: the empty GA 2/5/2 spawned missing_status + policy_taxonomy_outlier +
a lighting classification on top of its real defect. An empty name means the
classifier can't be trusted, so detect_missing_status and check_policy now skip
blank-name GAs; the single root cause is empty_name (check_naming). Demo 2/5/2:
3 findings -> 1. tests/test_root_cause.py; full suite green (10 tests).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Nikolay1
2026-07-15 09:29:54 +02:00
co-authored by Claude Opus 4.8
parent 10169275e3
commit 84c1c7dbd9
4 changed files with 63 additions and 0 deletions
+6
View File
@@ -61,6 +61,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
- **Root-cause suppression (external-review noise).** A GA with an **empty name** has an unreliable
classification, so it no longer cascades into a `missing_status_address` warning and a
`policy_taxonomy_outlier` — the single root cause (`empty_name` from `check_naming`) is kept and the
dependent findings are suppressed. On the demo house the empty `2/5/2` now yields one finding instead
of three. `tests/test_root_cause.py`.
- **Noise & unsafe repairs surfaced by an external expert review on the demo house.** (1) Scene-control
GAs (DPT 17/18) are no longer flagged as `missing_status` — they recall a preset and have no single
state to read back (now `scene_no_status`, INFO), and `suggest_repairs` no longer synthesises a bogus