fix: classify trace visibility separately (#698)

Co-authored-by: Codex <codex@noreply.local>
This commit is contained in:
Lyon
2026-06-22 23:09:48 +08:00
committed by GitHub
parent 205b34eba6
commit 376f2604c8
@@ -2137,8 +2137,11 @@ 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?.consoleAlertCount ?? 0) > 0) findings.push({ id: "runtime-console-alerts", severity: "amber", summary: "browser console warning/error entries were captured during observation", count: runtimeAlerts.summary.consoleAlertCount, groups: runtimeAlerts.consoleAlertsByPath.slice(0, 12) });
const crossPageProjectionDiffs = detectCrossPageProjectionDiffs(samples);
const crossPageDiffs = detectCrossPageProjectionDiffs(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) });
if (crossPageTraceVisibilityDiffs.length > 0) findings.push({ id: "cross-page-trace-visibility-divergence", severity: "info", summary: "control and observer pages differed only in visible trace row count; this is local disclosure/hydration visibility, not session/message projection divergence", count: crossPageTraceVisibilityDiffs.length, samples: crossPageTraceVisibilityDiffs.slice(0, 20) });
const traceMessageDuplicates = detectTraceMessageDuplication(samples);
if (traceMessageDuplicates.length > 0) findings.push({ id: "trace-assistant-message-duplicates-final-response", severity: "amber", summary: "trace rendered assistant message rows that duplicate the sealed final response", count: traceMessageDuplicates.length, samples: traceMessageDuplicates.slice(0, 20) });
const turnTraceMissing = detectTurnTraceIdMissing(samples);
@@ -4082,10 +4085,12 @@ function detectCrossPageProjectionDiffs(samples) {
const controlZero = detectTerminalZeroElapsed([control]).length > 0;
const observerZero = detectTerminalZeroElapsed([observer]).length > 0;
const sameSession = (control.routeSessionId || control.activeSessionId || null) && (control.routeSessionId || control.activeSessionId || null) === (observer.routeSessionId || observer.activeSessionId || null);
const divergent = sameSession && (missingInObserver.length > 0 || Math.abs(controlMessages - observerMessages) > 0 || Math.abs(controlTraceRows - observerTraceRows) > 0 || controlZero !== observerZero || digestMessageTexts(control) !== digestMessageTexts(observer));
if (!divergent) continue;
const projectionDivergent = sameSession && (missingInObserver.length > 0 || Math.abs(controlMessages - observerMessages) > 0 || controlZero !== observerZero || digestMessageTexts(control) !== digestMessageTexts(observer));
const traceVisibilityDivergent = sameSession && !projectionDivergent && Math.abs(controlTraceRows - observerTraceRows) > 0;
if (!projectionDivergent && !traceVisibilityDivergent) continue;
rows.push({
sampleGroupSeq,
diffKind: traceVisibilityDivergent ? "trace-visibility" : "projection",
control: ref(control),
observer: ref(observer),
missingTraceIdsInObserver: missingInObserver.slice(0, 8),