UX-09 review: short start-up timeout, latch rows pinned in shadow, plainer rows
checks / unit (pull_request) Successful in 8m50s
infra-pin / fresh (pull_request) Successful in 1s

The Supervisor questions for the Details link are asked together with a
3 s budget instead of one after the other at 10 s each, so a hung
Supervisor cannot hold control start for 20 s. In shadow mode the
circulating and site-direction latches are pinned to keep their own red
row that says how they clear. Plainer inverter and battery wording.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-27 04:45:06 +02:00
co-authored by Claude Opus 5.5
parent 00e3ee9de8
commit 63dee6db1e
4 changed files with 51 additions and 16 deletions
+25
View File
@@ -960,6 +960,19 @@ check("the banner leads with it - above the sign failsafe, because a sign "
"disagreement is visible on every dashboard in the house and this is "
"visible nowhere at all",
_c.status_payload()["banner"] == messages.banner_circulating())
# UX-09: the red shadow banner no longer names the latch, so the latch's own
# red row must stay on the list in shadow mode, name it and say how it clears.
_c_mode = _c.o.get("shadow_mode")
_c.o["shadow_mode"] = "on"
check("in shadow mode the banner goes red and says a safety stop stays on, and "
"the circulating row is still red and says only starting control clears "
"it",
_c.status_payload()["level"] == "bad"
and "safety stop" in _c.status_payload()["banner"]
and any(ck.get("id") == "circulating" and not ck["ok"] and not ck["warn"]
and "Only starting control clears this" in ck["text"]
for ck in _c.checks()))
_c.o["shadow_mode"] = _c_mode
_pub = {}
_c.mqtt = type("P", (), {"enabled": True,
"publish": lambda _s, v: _pub.update(v),
@@ -1919,6 +1932,18 @@ check("the status page carries a SITE row of its own, and the banner says the "
for ck in _c31.checks())
and "Total command" in _c31.status_payload()["banner"]
and "inverter-" not in _c31.status_payload()["banner"])
_c31_mode = _c31.o.get("shadow_mode")
_c31.o["shadow_mode"] = "on"
check("UX-09: in shadow mode the banner goes red and says a safety stop stays "
"on, and the site row is still red and says only starting control "
"clears it",
_c31.status_payload()["level"] == "bad"
and "safety stop" in _c31.status_payload()["banner"]
and any(ck.get("id") == "site_direction" and not ck["ok"]
and not ck["warn"]
and "Only starting control clears this" in ck["text"]
for ck in _c31.checks()))
_c31.o["shadow_mode"] = _c31_mode
_pub30 = {}
_c31.mqtt = type("P", (), {"enabled": True,
"publish": lambda _s, v: _pub30.update(v),