UX-11 review: restored stops log their figures to events, the quiet-meter WARNING is rate-limited
checks / unit (pull_request) Successful in 9m7s
infra-pin / fresh (pull_request) Successful in 1s

- After a restart, each restored stop (direction per inverter and site,
  delivery, circulation) also writes its saved reason to the action log.
  log_level defaults to info and events starts empty, so the DEBUG
  evidence alone left the figures only in state.json.
- A flapping meter (ha_signed under a flat load, 42-97 s between changes)
  logs at most one WARNING/INFO pair per 10 minutes, with the episodes in
  between at DEBUG.
- LONG_LINE_OK refuses any key whose text is a safety reason.
- test_watchdog keeps the byte pin beside the meaning pin, since the text
  did not change.
- DOCS says the DEBUG line needs log_level debug.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-27 14:21:05 +02:00
co-authored by Claude Opus 5.5
parent c628099e69
commit 3c298af3d8
5 changed files with 82 additions and 13 deletions
+6
View File
@@ -1438,6 +1438,12 @@ check("⚠️ THE SITE INSTANCE'S REASON SAYS WHAT SHIPPED, IN THE SAME ORDER: "
_sr.startswith("SIGN_DISAGREEMENT: ")
and messages.reason_code(_sr) == "SIGN_DISAGREEMENT"
and all(i > 0 for i in _order) and _order == sorted(_order))
# UX-11 review: the text itself did not change, and it is what state.json
# holds, so the byte pin stays beside the meaning pin.
check("...and it is still byte-identical to the one that shipped",
_sr == ("SIGN_DISAGREEMENT: commanded -1000 W against a meter reading "
"+1500 W for 180 s continuously (limits: both over 300 W, held "
"over 180 s)"))
check("...and the per-unit instance names what it ACTUALLY compared instead. "
"'against a meter reading' there would be a false statement about which "
"instrument produced the evidence, on the one line somebody woken by "