release 1.15.1: SUMMARY severity backgrounds on mon HTML; fix section paint

Phase section() ╔═║╚ boxes are class section (no sum-header). Real
SUMMARY rows keep solid OK/WARN/ERROR/INFO backgrounds on the web.
This commit is contained in:
Hernâni Marques 2026-07-19 04:41:24 +02:00
parent 25cb8216b3
commit 66fa471d00
No known key found for this signature in database
GPG key ID: CB5738652768F7E9
4 changed files with 85 additions and 48 deletions

View file

@ -1 +1 @@
1.15.0
1.15.1

View file

@ -17,6 +17,7 @@ Git tags: `vMAJOR.FEATURE.FIX` (e.g. `v1.8.0`). File `VERSION` omits the `v` pre
| Tag | Date (UTC) | Notes |
|-----|------------|--------|
| **v1.15.1** | 2026-07-19 | **Bugfix:** mon HTML — phase `section()` boxes no longer painted as SUMMARY (were blue/green `sum-header`); only real SUMMARY rows get solid severity backgrounds (OK/WARN/ERROR/INFO). |
| **v1.15.0** | 2026-07-19 | **Feature:** CHF **fake-incoming amount ladder** in `devtesting` (`DEVTESTING_LADDER=1`, default **23** log-spaced rungs **CHF:0.01 → CHF:50000**); synthetic geniban debit funds each rung; baseline plumbing probe kept. |
| **v1.14.0** | 2026-07-19 | **Feature:** SUMMARY box rows are **colour-distinct** (per-severity badge + tinted background + bold counts; verdict-coloured header); HTML mon pages style `sum-ok` / `sum-warn` / `sum-err` / … panels the same way. |
| **v1.13.13** | 2026-07-19 | **Bugfix:** progress estimate for **devtesting** / fake-franken is 8 (happy-path numbered checks), not 10 — avoids mid-run 42/48 then end snap 46/46. |

6
lib.sh
View file

@ -921,9 +921,11 @@ _summary_totals_box() {
local ROW_BLK=$'\e[1;97;48;5;53m' # bold white on dark magenta
local ROW_TOT=$'\e[1;37;48;5;236m' # bold white on dark gray
printf -- '\n%s╔══════════════════════════════════════╗%s\n' "$hdr_bg" "$N"
# Include SUMMARY on all three frame lines so HTML classify maps them to sum-header
# (phase section() boxes use the same ╔═║╚ glyphs but must not get sum-* paint).
printf -- '\n%s╔════════ %s ════════════════════╗%s\n' "$hdr_bg" "$_sum_lbl" "$N"
printf -- '%s║ %-34s ║%s\n' "$hdr_bg" "$_sum_lbl" "$N"
printf -- '%s╚══════════════════════════════════════╝%s\n' "$hdr_bg" "$N"
printf -- '%s╚════════ %s ════════════════════╝%s\n' "$hdr_bg" "$_sum_lbl" "$N"
# $1=row_bg $2=badge_bg $3=tag $4=n $5=label_fg — full-width-ish row
_sum_row() {

View file

@ -277,19 +277,13 @@ def is_numbered_check_line(line: str) -> bool:
def classify(line: str) -> str:
u = line.upper()
low = line.lower()
# section / summary headers before badge matching (they contain the word ERROR)
if re.search(r"[╔═║╚]|SUMMARY", u) and (
"SUMMARY" in u or "═══" in line or "" in line or "" in line
):
if "SUMMARY" in u or ("" in line and "" in line) or ("" in line and "" in line):
if "SUMMARY" in u or (not is_numbered_check_line(line) and ("" in line or "" in line or "" in line)):
if "SUMMARY" in u or re.match(r"^\s*[╔╚║]", line):
if "SUMMARY" in u:
return "sum-header"
if re.match(r"^\s*[╔╚]", line) and "" in line:
return "sum-header"
if re.match(r"^\s*║", line) and not is_numbered_check_line(line):
return "sum-header"
# SUMMARY box header only when the word SUMMARY is present (not phase section() boxes).
# Phase section() also uses ╔═║╚ with blue BG_SEC — those must stay class "section".
if "SUMMARY" in u:
return "sum-header"
# Double-line box frames from section() → section (no sum-* paint)
if re.match(r"^\s*[╔╚].*═", line) or re.match(r"^\s*║\s", line):
return "section"
if "--- ERRORS" in u or "ERRORS ·" in u or "ERRORS (" in u:
return "meta"
if "numbered checks" in low:
@ -1883,59 +1877,99 @@ main {{ padding: 12px 14px 48px; max-width: 1200px; }}
.line.warn {{ color: var(--warn); }}
.line.info {{ color: var(--info); }}
.line.blocker {{ color: var(--blocker); }}
.line.section {{ color: var(--sec); margin-top: 8px; font-weight: 600; }}
/* Phase section titles ( from section()) light chrome, NOT sum-* paint */
.line.section {{
color: #9cf;
margin-top: 10px;
font-weight: 700;
background: transparent;
border-left: 3px solid #345;
padding: 2px 0 2px 8px;
}}
.line.meta {{ color: var(--dim); }}
.line.plain {{ color: var(--fg); }}
/* v1.14.0: SUMMARY box rows distinct bg + bold per severity */
/* SUMMARY box full-width solid backgrounds matching terminal ROW_* tints */
.line.sum-header,
.line.sum-ok,
.line.sum-err,
.line.sum-warn,
.line.sum-info,
.line.sum-block,
.line.sum-totals,
.line.sum-verdict-ok,
.line.sum-verdict-warn,
.line.sum-verdict-err {{
display: block;
box-sizing: border-box;
width: 100%;
margin: 2px 0;
padding: 6px 10px;
border-radius: 3px;
font-weight: 800;
letter-spacing: 0.02em;
}}
.line.sum-header {{
color: #fff; font-weight: 800; letter-spacing: 0.04em;
background: linear-gradient(90deg, #1a3a1a 0%, #0a1a0a 100%);
border-left: 4px solid var(--ok); padding: 4px 8px; margin-top: 10px;
color: #e8ffe8;
background: #145214; /* solid green header (not blue) */
border: 1px solid #2a8a2a;
border-left: 6px solid #3d3;
margin-top: 14px;
text-shadow: 0 1px 0 #0008;
}}
.line.sum-ok {{
color: #b8f0b8; font-weight: 700;
background: #0d1f0d; border-left: 4px solid var(--ok);
padding: 3px 8px; margin: 2px 0;
color: #d4ffd4;
background: #0f3d0f;
border: 1px solid #1a6b1a;
border-left: 6px solid var(--ok);
}}
.line.sum-err {{
color: #ffc9c9; font-weight: 700;
background: #2a0a0a; border-left: 4px solid var(--err);
padding: 3px 8px; margin: 2px 0;
color: #ffe0e0;
background: #4a1010;
border: 1px solid #822;
border-left: 6px solid var(--err);
}}
.line.sum-warn {{
color: #1a1400; font-weight: 800;
background: #c9a227; border-left: 4px solid #8a7010;
padding: 3px 8px; margin: 2px 0;
color: #1a1400;
background: #e6c200; /* bright gold — clearly not blue */
border: 1px solid #a68b00;
border-left: 6px solid #8a7010;
}}
.line.sum-info {{
color: #c8e7ff; font-weight: 700;
background: #0a1520; border-left: 4px solid var(--info);
padding: 3px 8px; margin: 2px 0;
color: #e0f2ff;
background: #0c2a4a; /* navy INFO row only */
border: 1px solid #1a4a7a;
border-left: 6px solid var(--info);
}}
.line.sum-block {{
color: #f5d0ff; font-weight: 700;
background: #1a0a1a; border-left: 4px solid var(--blocker);
padding: 3px 8px; margin: 2px 0;
color: #ffe0ff;
background: #3a1040;
border: 1px solid #6a2a70;
border-left: 6px solid var(--blocker);
}}
.line.sum-totals {{
color: #eee; font-weight: 700;
background: #1a1a1a; border-left: 4px solid #666;
padding: 4px 8px; margin: 4px 0 2px;
color: #f0f0f0;
background: #2a2a2a;
border: 1px solid #555;
border-left: 6px solid #888;
margin-top: 6px;
}}
.line.sum-verdict-ok {{
color: #b8f0b8; font-weight: 800;
background: #0d1f0d; border: 1px solid #2a5a2a;
padding: 4px 8px; margin: 4px 0 8px;
color: #d4ffd4;
background: #0f3d0f;
border: 2px solid #2a8a2a;
margin-bottom: 10px;
}}
.line.sum-verdict-warn {{
color: #1a1400; font-weight: 800;
background: #c9a227; border: 1px solid #8a7010;
padding: 4px 8px; margin: 4px 0 8px;
color: #1a1400;
background: #e6c200;
border: 2px solid #8a7010;
margin-bottom: 10px;
}}
.line.sum-verdict-err {{
color: #ffc9c9; font-weight: 800;
background: #2a0a0a; border: 1px solid #622;
padding: 4px 8px; margin: 4px 0 8px;
color: #ffe0e0;
background: #4a1010;
border: 2px solid #a33;
margin-bottom: 10px;
}}
a.jump {{ color: inherit; text-decoration: underline dotted; }}
footer {{