fix: avoid blocking sentinel on terminal timing correction (#992)

Co-authored-by: Codex <codex@noreply.local>
This commit is contained in:
Lyon
2026-06-26 15:06:19 +08:00
committed by GitHub
parent dc4d94e62a
commit 5fa5708fe1
2 changed files with 21 additions and 3 deletions
@@ -91,6 +91,7 @@ export function nodeWebObserveAnalyzerTimingSource(): string {
elapsedZeroResets: timingEvents.elapsedZeroResets,
totalElapsedForwardJumps: timingEvents.totalElapsedForwardJumps,
terminalElapsedGrowth: timingEvents.terminalElapsedGrowth,
terminalElapsedCorrections: timingEvents.terminalElapsedCorrections,
recentUpdateResets: timingEvents.recentUpdateResets,
recentUpdateSteps: timingEvents.recentUpdateSteps
};
@@ -120,6 +121,7 @@ function detectTurnTimingNonMonotonic(columns, rows) {
const elapsedZeroResets = [];
const totalElapsedForwardJumps = [];
const terminalElapsedGrowth = [];
const terminalElapsedCorrections = [];
const recentUpdateResets = [];
const recentUpdateSteps = [];
for (const column of columns) {
@@ -135,6 +137,9 @@ function detectTurnTimingNonMonotonic(columns, rows) {
const previous = previousByMetric.get(metric);
if (previous && metric === "totalElapsedSeconds" && current < previous.value) {
const anomaly = previous.value > 0 && current === 0 ? "zero-reset" : "decrease";
const terminalTransition = !isTerminalTurnStatus(previous.status) && isTerminalTurnStatus(cell.status);
const dropSeconds = previous.value - current;
const allowedDropSeconds = Math.max(1, Number(alertThresholds?.turnTimingSampleSlackSeconds || 0));
const event = {
columnId: column.id,
columnLabel: column.label,
@@ -144,9 +149,11 @@ function detectTurnTimingNonMonotonic(columns, rows) {
fromSeq: previous.seq,
fromTs: previous.ts,
fromValue: previous.value,
fromStatus: previous.status ?? null,
toSeq: row.seq ?? null,
toTs: row.ts ?? null,
toValue: current,
toStatus: cell.status ?? null,
delta: current - previous.value,
traceId: cell.traceId ?? column.traceId ?? null,
messageId: cell.messageId ?? column.messageId ?? null,
@@ -158,8 +165,17 @@ function detectTurnTimingNonMonotonic(columns, rows) {
pageEpoch: cell.pageEpoch ?? row.pageEpoch ?? column.pageEpoch ?? null,
valuesRedacted: true
};
anomalies.push(event);
if (anomaly === "zero-reset") elapsedZeroResets.push(event);
if (terminalTransition && anomaly === "decrease" && dropSeconds <= allowedDropSeconds) {
terminalElapsedCorrections.push({
...event,
anomaly: "terminal-boundary-correction",
expectedPattern: "terminal-sealed-duration-may-correct-running-elapsed-within-slack",
allowedDropSeconds,
});
} else {
anomalies.push(event);
if (anomaly === "zero-reset") elapsedZeroResets.push(event);
}
}
if (previous && metric === "totalElapsedSeconds" && current > previous.value) {
const sampleDeltaSeconds = elapsedSecondsBetween(previous.ts, row.ts);
@@ -319,7 +335,7 @@ function detectTurnTimingNonMonotonic(columns, rows) {
}
}
}
return { anomalies, elapsedZeroResets, totalElapsedForwardJumps, terminalElapsedGrowth, recentUpdateResets, recentUpdateSteps };
return { anomalies, elapsedZeroResets, totalElapsedForwardJumps, terminalElapsedGrowth, terminalElapsedCorrections, recentUpdateResets, recentUpdateSteps };
}
function elapsedSecondsBetween(fromTs, toTs) {