Skip to content

Commit 6935557

Browse files
fix(live): also drop server-forwarded SYS/diagnostic strings from public log
The prior gate only suppressed client-generated cat:'sys' objects and deliberately let raw strings through, on the assumption they were already node-filtered server-side. They are not: the server's classifyLogCategory is a denylist that defaults any line without a SYS/EVENTS keyword to 'node', so operational diagnostics (RPC: N nodes fetched, ⏱ hard timeout, 🔄 VPN interference, [Blue C#], retry/reconnect lines, Round summaries) reach the public stream and rendered with a SYS pill. appendLog now drops every entry that resolves to cat 'sys'/'events', strings included. The per-line string heuristic (sent1 address / PASS / SLOW / FAIL) is the stronger signal for a genuine node line, so real per-node activity and node failures (incl. address-bearing "failed" strings → cat 'fail') stay visible; the noise is gone. Also surfaced the Skipped bucket on the Current Batch panel so Passed SLA + Slow + Failed + Skipped always reconciles with Tested.
1 parent f2c451d commit 6935557

1 file changed

Lines changed: 12 additions & 9 deletions

File tree

live.html

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1413,15 +1413,18 @@ <h1 class="live-page-title">
14131413
o = opts || {};
14141414
}
14151415

1416-
// Public /live is NODE-ONLY: drop the operator/system + lifecycle entries
1417-
// the client generates itself (Testing started/stopped, Round N starting/
1418-
// done). Node activity (cat 'node') and node failures (cat 'fail') stay —
1419-
// the failure-log UX requires failures to remain visible. Only gate
1420-
// explicit-cat objects: raw strings here are already node-filtered
1421-
// server-side (publicLogBuffer + the /api/public/events sys/events drop),
1422-
// so re-judging them with the weaker string heuristic would risk hiding a
1423-
// legitimate node line the server already approved.
1424-
if (typeof opts !== 'string' && (o.cat === 'sys' || o.cat === 'events')) return;
1416+
// Public /live is NODE-ONLY: keep per-node activity (cat 'node') and node
1417+
// failures (cat 'fail', required by the failure-log UX); drop everything
1418+
// that resolves to 'sys'/'events'. This covers BOTH the client-generated
1419+
// lifecycle objects (Testing started/stopped, Round N…) AND server-
1420+
// forwarded diagnostic strings. The server's log classifier is a denylist
1421+
// that defaults any unmatched line to 'node', so operational noise (RPC:
1422+
// N nodes fetched, ⏱ hard timeout, 🔄 VPN interference, [Blue C#], retries/
1423+
// reconnects) DOES reach the public stream — but the per-line heuristic
1424+
// above (address / PASS / SLOW / FAIL) re-derives 'sys' for those, which is
1425+
// the stronger signal for "is this a genuine node line." Failure strings
1426+
// carrying an address/"failed" still resolve to 'fail' and stay visible.
1427+
if (o.cat === 'sys' || o.cat === 'events') return;
14251428

14261429
const div = document.createElement('div');
14271430
const cls =

0 commit comments

Comments
 (0)