fix: surface Workbench message-order root cause
This commit is contained in:
@@ -1369,10 +1369,18 @@ function buildSessionInvariantFindings(control, manifest = {}) {
|
|||||||
const traceIds = arrayStrings(messageOrder.traceIds).slice(0, 12);
|
const traceIds = arrayStrings(messageOrder.traceIds).slice(0, 12);
|
||||||
const findingId = stringOrNull(detail.findingId) ?? "workbench-message-order-user-clustered-after-navigation";
|
const findingId = stringOrNull(detail.findingId) ?? "workbench-message-order-user-clustered-after-navigation";
|
||||||
const severity = stringOrNull(detail.severity) ?? "amber";
|
const severity = stringOrNull(detail.severity) ?? "amber";
|
||||||
|
const rootCause = "workbench-message-order-projection-drops-terminal-cards-after-navigation";
|
||||||
|
const rootCauseStatus = "confirmed-from-controlled-refresh-dom;otel-read-model-comparison-required";
|
||||||
|
const rootCauseConfidence = "medium";
|
||||||
|
const nextAction = "Use OTel session_messages_read/session detail for the same canarySessionId and traceIds. If the read model is interleaved but DOM is clustered, fix Workbench renderer/hydration ordering; if the read model is already clustered, fix session message projection/read-model ordering.";
|
||||||
findings.push({
|
findings.push({
|
||||||
id: findingId,
|
id: findingId,
|
||||||
severity,
|
severity,
|
||||||
summary: "controlled refresh/switch-back afterRound=" + (afterRound ?? "-") + " left consecutive user message cards without interleaved assistant/code-agent terminal cards" + (sentinelRange ? " (" + sentinelRange + ")" : ""),
|
summary: "message-order root cause visible: controlled refresh/switch-back afterRound=" + (afterRound ?? "-") + " left consecutive user message cards without interleaved assistant/code-agent terminal cards" + (sentinelRange ? " (" + sentinelRange + ")" : ""),
|
||||||
|
rootCause,
|
||||||
|
rootCauseStatus,
|
||||||
|
rootCauseConfidence,
|
||||||
|
nextAction,
|
||||||
count: Math.max(1, consecutiveUserMessageCount),
|
count: Math.max(1, consecutiveUserMessageCount),
|
||||||
blocking: detail.blocking === true ? true : false,
|
blocking: detail.blocking === true ? true : false,
|
||||||
afterRound,
|
afterRound,
|
||||||
@@ -1389,6 +1397,17 @@ function buildSessionInvariantFindings(control, manifest = {}) {
|
|||||||
stateDir: stringOrNull(manifest.stateDir),
|
stateDir: stringOrNull(manifest.stateDir),
|
||||||
commandId: stringOrNull(row.commandId),
|
commandId: stringOrNull(row.commandId),
|
||||||
commandTs: stringOrNull(row.ts),
|
commandTs: stringOrNull(row.ts),
|
||||||
|
evidence: {
|
||||||
|
afterRound,
|
||||||
|
consecutiveUserMessageCount,
|
||||||
|
sentinelRange,
|
||||||
|
sampleSeq: numberOrNull(detail.sampleSeq),
|
||||||
|
traceIds,
|
||||||
|
canarySessionId: stringOrNull(detail.canarySessionId),
|
||||||
|
routeSessionId: stringOrNull(detail.routeSessionId),
|
||||||
|
activeSessionId: stringOrNull(detail.activeSessionId),
|
||||||
|
valuesRedacted: true,
|
||||||
|
},
|
||||||
messageOrder: {
|
messageOrder: {
|
||||||
sequence: Array.isArray(messageOrder.sequence) ? messageOrder.sequence.slice(-20) : [],
|
sequence: Array.isArray(messageOrder.sequence) ? messageOrder.sequence.slice(-20) : [],
|
||||||
clusters: Array.isArray(messageOrder.clusters) ? messageOrder.clusters.slice(0, 8) : [],
|
clusters: Array.isArray(messageOrder.clusters) ? messageOrder.clusters.slice(0, 8) : [],
|
||||||
|
|||||||
Reference in New Issue
Block a user