UX-08 2c: short refusals, error texts and option texts
Validator refusals name the setting by its label and key, say what is wrong and what to change, and keep the rejected value and limit. Option names and descriptions are short in en and nl; citations moved to DOCS "For installers" and the test_translations citation check now pins the instruction on the tab and the record in DOCS. No rule, key, schema, default or exit code changed. Allowlist 167 -> 43 (log lines only). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LyR88rXETvwhTgx6yHE39p
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
e1d0970b23
commit
2c516a032c
@@ -236,7 +236,7 @@ check("the stored options are byte-identical to what they were",
|
||||
check("...and the refusal carries the validator's OWN sentence, unedited",
|
||||
refused.problems == validate_startup_config(bad, None, None))
|
||||
check("...which is the sentence that names the key and says what it costs",
|
||||
any("setpoint_entity is not set" in p for p in refused.problems))
|
||||
any("(setpoint_entity) is empty" in p for p in refused.problems))
|
||||
|
||||
_good = base()
|
||||
res = run(selfconfig.save(sup, _good, fp))
|
||||
@@ -316,7 +316,7 @@ _probs, _ = run(selfconfig.problems_and_ranges(dict(_live, max_w=""), None))
|
||||
check("⚠️ CLEARING max_w ON THE LIVE SHAPE IS REFUSED - rule 10 catches the "
|
||||
"rail collapsing to the 2000 default under an explicit 400 W slew, so "
|
||||
"the box cannot be emptied into a quietly halved rail",
|
||||
any("site rail of 2000 W" in p for p in _probs))
|
||||
any("for a 2000 W site" in p for p in _probs))
|
||||
|
||||
# HALF TWO: the backstop cannot report "no problems" for a config it could not
|
||||
# compose. Returning [] there enables Save - a crash became a green.
|
||||
@@ -430,7 +430,7 @@ _probs = run(selfconfig.problems_for(base(max_w=4000), FakeHass(_ranges)))
|
||||
_by, _un = configui.problems_by_field(_probs, ALL_KEYS)
|
||||
check("the device-range rule is REACHED from the panel - the setpoint entity's "
|
||||
"own range is read, so rule 1 fires here exactly as it does at startup",
|
||||
any("THE DEVICE WINS" in p for p in _probs))
|
||||
any("Lower the rating to" in p for p in _probs))
|
||||
check("...and it lands on `max_w`, which is the field the operator has to "
|
||||
"change", "max_w" in _by)
|
||||
# ⚠️ THE COLLISION, CHECKED HERE AND NOT ONLY IN THE PROBE. `sign_disagree_w`
|
||||
@@ -467,7 +467,7 @@ _p2, _unread2 = run(selfconfig.problems_and_ranges(base(max_w=4000),
|
||||
FakeHass(_ranges)))
|
||||
check("...and with the same device answering, the same config IS refused - "
|
||||
"which is what makes the line above a skip rather than a pass",
|
||||
any("THE DEVICE WINS" in p for p in _p2) and _unread2 == [])
|
||||
any("Lower the rating to" in p for p in _p2) and _unread2 == [])
|
||||
check("the note is about the config UNDER TEST, not about the running roster: "
|
||||
"a newly typed entity that does not answer is the one named",
|
||||
run(selfconfig.problems_and_ranges(
|
||||
@@ -495,8 +495,9 @@ _leaked = sorted(k for k in ALL_KEYS
|
||||
_script))
|
||||
check(f"the page's script names NOT ONE option key - so it cannot be rendering "
|
||||
f"a field list of its own. Leaked: {_leaked}", not _leaked)
|
||||
_phrases = ["THE DEVICE WINS", "has no actuator", "two writers",
|
||||
"setpoint_entity is not set", "would silently never happen"]
|
||||
_phrases = ["Lower the rating to", "cannot control the inverter",
|
||||
"point at the same inverter entity", "(setpoint_entity) is empty",
|
||||
"accepts at most"]
|
||||
_copied = sorted(p for p in _phrases
|
||||
for f, text in _ui_files.items() if p in text)
|
||||
check(f"no phrase out of a validate.py refusal appears anywhere in the three "
|
||||
|
||||
Reference in New Issue
Block a user