fix(web-probe): surface archive red findings (#721)
Co-authored-by: Codex <codex@noreply.local>
This commit is contained in:
@@ -1980,6 +1980,7 @@ console.log(JSON.stringify({
|
||||
runtimeAlerts: runtimeAlerts.summary,
|
||||
findingCount: findings.length,
|
||||
redFindingCount: findings.filter((item) => item.severity === "red").length,
|
||||
redFindings: prioritizeFindings(findings.filter((item) => item.severity === "red")).slice(0, 12).map((item) => ({ kind: item.id ?? item.kind ?? item.code, severity: item.severity, count: item.count ?? item.sampleCount ?? null, summary: String(item.summary ?? item.message ?? "").slice(0, 180) })),
|
||||
},
|
||||
analysisWindow: recentWindow.summary,
|
||||
jsonlReadIssues: jsonlReadIssues.slice(0, 3).map((item) => ({ file: item.file, line: item.line ?? null, error: String(item.error ?? "").slice(0, 160) })),
|
||||
@@ -2396,7 +2397,10 @@ function buildFindings(samples, control, network, errors, sampleMetrics, promptN
|
||||
if ((runtimeAlerts?.summary?.domDiagnosticSampleCount ?? 0) > 0) findings.push({ id: "runtime-dom-diagnostics", severity: "amber", summary: "diagnostic/error/warning-like text was visible in sampled DOM", count: runtimeAlerts.summary.domDiagnosticSampleCount, groupCount: runtimeAlerts.summary.domDiagnosticGroupCount ?? 0, groups: runtimeAlerts.domDiagnosticsByText.slice(0, 12), samples: runtimeAlerts.domDiagnostics.slice(0, 12) });
|
||||
if ((runtimeAlerts?.summary?.executionErrorCount ?? 0) > 0) findings.push({ id: "runtime-execution-errors", severity: "red", summary: "Workbench rendered execution failure/error rows during observation", count: runtimeAlerts.summary.executionErrorCount, groups: runtimeAlerts.runtimeExecutionErrorsByCode.slice(0, 12) });
|
||||
if ((runtimeAlerts?.summary?.significantConsoleAlertCount ?? runtimeAlerts?.summary?.consoleAlertCount ?? 0) > 0) findings.push({ id: "runtime-console-alerts", severity: "amber", summary: "browser console warning/error entries were captured during observation", count: runtimeAlerts.summary.significantConsoleAlertCount ?? runtimeAlerts.summary.consoleAlertCount, groups: (runtimeAlerts.significantConsoleAlertsByPath ?? runtimeAlerts.consoleAlertsByPath).slice(0, 12) });
|
||||
const crossPageDiffs = detectCrossPageProjectionDiffs(samples);
|
||||
const crossPageDiffs = mergeCrossPageDiffRows(
|
||||
detectCrossPageProjectionDiffs(samples),
|
||||
detectAdjacentCrossPageProjectionDiffs(samples)
|
||||
);
|
||||
const crossPageProjectionDiffs = crossPageDiffs.filter((item) => item.diffKind !== "trace-visibility");
|
||||
const crossPageTraceVisibilityDiffs = crossPageDiffs.filter((item) => item.diffKind === "trace-visibility");
|
||||
if (crossPageProjectionDiffs.length > 0) findings.push({ id: "cross-page-projection-divergence", severity: "red", summary: "control and observer pages saw different projection state for the same sampled session", count: crossPageProjectionDiffs.length, samples: crossPageProjectionDiffs.slice(0, 20) });
|
||||
@@ -4536,6 +4540,72 @@ function detectCrossPageProjectionDiffs(samples) {
|
||||
return rows;
|
||||
}
|
||||
|
||||
function mergeCrossPageDiffRows(...groups) {
|
||||
const rows = [];
|
||||
const seen = new Set();
|
||||
for (const group of groups) {
|
||||
if (!Array.isArray(group)) continue;
|
||||
for (const row of group) {
|
||||
const key = [
|
||||
row?.diffKind || "projection",
|
||||
row?.control?.seq ?? null,
|
||||
row?.observer?.seq ?? null,
|
||||
row?.controlMessageCount ?? null,
|
||||
row?.observerMessageCount ?? null,
|
||||
row?.controlTraceRowCount ?? null,
|
||||
row?.observerTraceRowCount ?? null
|
||||
].join(":");
|
||||
if (seen.has(key)) continue;
|
||||
seen.add(key);
|
||||
rows.push(row);
|
||||
}
|
||||
}
|
||||
return rows;
|
||||
}
|
||||
|
||||
function detectAdjacentCrossPageProjectionDiffs(samples) {
|
||||
const rows = [];
|
||||
const ordered = (Array.isArray(samples) ? samples : []).slice().sort((a, b) => Number(a?.seq ?? 0) - Number(b?.seq ?? 0));
|
||||
for (let i = 1; i < ordered.length; i += 1) {
|
||||
const a = ordered[i - 1];
|
||||
const b = ordered[i];
|
||||
const roles = new Set([a?.pageRole, b?.pageRole]);
|
||||
if (!roles.has("control") || !roles.has("observer")) continue;
|
||||
const control = a?.pageRole === "control" ? a : b;
|
||||
const observer = a?.pageRole === "observer" ? a : b;
|
||||
const controlSession = control.routeSessionId || control.activeSessionId || null;
|
||||
const observerSession = observer.routeSessionId || observer.activeSessionId || null;
|
||||
if (!controlSession || controlSession !== observerSession) continue;
|
||||
const controlAt = Date.parse(String(control.ts || ""));
|
||||
const observerAt = Date.parse(String(observer.ts || ""));
|
||||
if (Number.isFinite(controlAt) && Number.isFinite(observerAt) && Math.abs(controlAt - observerAt) > 1500) continue;
|
||||
const controlMessages = Array.isArray(control.messages) ? control.messages.length : 0;
|
||||
const observerMessages = Array.isArray(observer.messages) ? observer.messages.length : 0;
|
||||
const controlTraceRows = Array.isArray(control.traceRows) ? control.traceRows.length : 0;
|
||||
const observerTraceRows = Array.isArray(observer.traceRows) ? observer.traceRows.length : 0;
|
||||
const controlZero = detectTerminalZeroElapsed([control]).length > 0;
|
||||
const observerZero = detectTerminalZeroElapsed([observer]).length > 0;
|
||||
const missingInObserver = [...visibleTraceIds(control)].filter((item) => !visibleTraceIds(observer).has(item));
|
||||
const projectionDivergent = missingInObserver.length > 0 || controlMessages !== observerMessages || controlZero !== observerZero || digestMessageTexts(control) !== digestMessageTexts(observer);
|
||||
const traceVisibilityDivergent = !projectionDivergent && controlTraceRows !== observerTraceRows;
|
||||
if (!projectionDivergent && !traceVisibilityDivergent) continue;
|
||||
rows.push({
|
||||
sampleGroupSeq: control.sampleGroupSeq ?? observer.sampleGroupSeq ?? null,
|
||||
adjacentPair: true,
|
||||
diffKind: traceVisibilityDivergent ? "trace-visibility" : "projection",
|
||||
control: ref(control),
|
||||
observer: ref(observer),
|
||||
missingTraceIdsInObserver: missingInObserver.slice(0, 8),
|
||||
controlMessageCount: controlMessages,
|
||||
observerMessageCount: observerMessages,
|
||||
controlTraceRowCount: controlTraceRows,
|
||||
observerTraceRowCount: observerTraceRows,
|
||||
terminalZeroElapsedDiff: controlZero !== observerZero
|
||||
});
|
||||
}
|
||||
return rows;
|
||||
}
|
||||
|
||||
function detectTraceMessageDuplication(samples) {
|
||||
const rows = [];
|
||||
for (const sample of samples) {
|
||||
|
||||
Reference in New Issue
Block a user