UX-08 2d: plain log lines, the rest of the status page, and DOCS
Every WARNING and ERROR line is one plain line of at most 25 words, with no card ids, capitals or semicolons; the reasoning of the ten longest is on a DEBUG line. The ux08 allowlist is empty and its cap is 0 (43 -> 0). The status page: the month-peak and peak-guard rows, the stale-reading row, the top table (Why, Tariff, Arbitrage, Shadow mode, labels), the Stopped banner and the line under the buttons, which now shows the plain hint of each event instead of the raw action log. The Supervisor question at start logs one line with a real reason. Refusals are counted as shown (labels expanded, long cases driven), seven were shortened, the card and parse errors lost their internals, a blank value reads "empty", and the panel no longer files inverters.max_w under the flat max_w. Option names lose "(JSON)", the NL texts are checked too. DOCS gets a glossary (control board, isolator, Developer Tools) and card ids move from headings to a "For installers" line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LyR88rXETvwhTgx6yHE39p
This commit is contained in:
@@ -1223,7 +1223,8 @@ def _verdict(opts, token):
|
||||
ps = [p for p in validate_startup_config(opts, -5000, 5000) if token in p]
|
||||
if not ps:
|
||||
return (False, None, None)
|
||||
m = re.search(r"for (\S+) \(inverters\.max_w\) is (\d+) W", ps[0])
|
||||
m = re.search(r"for (\S+) \(inverters\.max_w\),? (?:is|at) (\d+) W",
|
||||
ps[0])
|
||||
return (True, m.group(1) if m else None, float(m.group(2)) if m else None)
|
||||
|
||||
|
||||
@@ -1431,8 +1432,8 @@ check("the table AND a non-default price_taxes_eur_kwh is refused, and the "
|
||||
"refusal says WHICH ONE WINS and what to do - not merely that the two "
|
||||
"are incompatible",
|
||||
why(_T17_P_BOTH, "(price_taxes_profile) is set, so")
|
||||
and why(_T17_P_BOTH, "(price_taxes_eur_kwh) is not used, but it reads "
|
||||
"0.1198"))
|
||||
and why(_T17_P_BOTH, "(price_taxes_eur_kwh) is not used. Set it "
|
||||
"back to"))
|
||||
check("...and the SHIPPED scalar beside the table is NOT refused, or every "
|
||||
"Walloon site would have to clear a key it never touched. The refusal is "
|
||||
"about a value the operator chose, and the shipped default is the one "
|
||||
@@ -1482,8 +1483,7 @@ check("...while a value that is NEITHER the shipped default NOR a superseded "
|
||||
"one is still REFUSED beside the table, naming it - the set of "
|
||||
"'untouched' figures widened by exactly the old defaults and by nothing "
|
||||
"else",
|
||||
why(_T17_P_BOTH, "(price_taxes_eur_kwh) is not used, but it reads "
|
||||
"0.1198")
|
||||
why(_T17_P_BOTH, "from 0.1198, or clear")
|
||||
and 0.1198 not in _T18_SUPERSEDED
|
||||
and abs(0.1198 - _T18_SHIPPED_TAXES) > 1e-9)
|
||||
# ⚠️ AND THE REFUSAL SAYS SO, so an operator who HAS typed a number is told
|
||||
@@ -1660,7 +1660,7 @@ check("...and a malformed blob is refused as a malformed blob, naming the "
|
||||
# coefficients against arithmetic done with the same coefficients. So the leg
|
||||
# starts, and the operator is told WHICH check did not run.
|
||||
_T16_UNGRADED = [m for lvl, m in _T16_OK_LOG
|
||||
if lvl == "WARNING" and "UNGRADED" in m]
|
||||
if lvl == "WARNING" and "not checked against a printed price" in m]
|
||||
print(f" {(_T16_UNGRADED or [''])[0][:118]}")
|
||||
check("a leg with no card block starts, and says at startup that its "
|
||||
"coefficients are UNGRADED - naming what was checked instead, so the "
|
||||
@@ -1683,13 +1683,13 @@ check("...and a leg that DOES carry a card does NOT print it, or the sentence "
|
||||
"would be noise an operator learns to ignore rather than a report of "
|
||||
"which check ran",
|
||||
_T16_WITH_CARD == []
|
||||
and not [m for lvl, m in _T16_CARD_LOG if "UNGRADED" in m])
|
||||
and not [m for lvl, m in _T16_CARD_LOG if "not checked against a printed price" in m])
|
||||
# ⚠️ AND A CARD ON THIS LEG IS STILL GRADED, at startup, by the same rung.
|
||||
check("...and a card ON THIS LEG that the coefficients do not reproduce is "
|
||||
"REFUSED at startup, so the optional block is optional and not inert",
|
||||
why(_t16_start(price_export_formula=_T16_CONS.replace(
|
||||
'"expect_incl_vat":15.55', '"expect_incl_vat":15.05'))[0],
|
||||
"price_export_formula does not match its own card"))
|
||||
"price_export_formula gives"))
|
||||
|
||||
# ⚠️ THE SENTENCE DOCS.md RESTS ON, AND IT IS THE ONE MOST LIKELY TO ROT.
|
||||
_T16_INFO = [m for lvl, m in _T16_OK_LOG if lvl == "INFO"
|
||||
|
||||
Reference in New Issue
Block a user