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 | | 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.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.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. | | **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_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 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║ %-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 # $1=row_bg $2=badge_bg $3=tag $4=n $5=label_fg — full-width-ish row
_sum_row() { _sum_row() {

View file

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