fix(workbench): require terminal authority before sealing turn (#2041)

This commit is contained in:
Lyon
2026-06-24 14:05:43 +08:00
committed by GitHub
parent 50734e5117
commit 3e33eb5803
+13 -4
View File
@@ -157,8 +157,14 @@ export function traceTerminalEvidence(trace = null) {
}
const finalResponse = objectValue(trace?.finalResponse);
if (finalResponse) {
const status = terminalStatusFromValue(finalResponse.status ?? trace?.status) ?? "completed";
return { source: "trace-final-response", status, evidence: { textPresent: Boolean(projectionText(finalResponse)), valuesRedacted: true }, valuesRedacted: true };
// finalResponse is display text evidence only. AgentRun may surface an
// assistant/finalResponse payload while the runner is still draining tools
// or waiting for its terminal report; using that text as lifecycle authority
// seals the Workbench card too early and makes terminal elapsed jump later.
if (trace?.terminal === true || trace?.sealed === true || firstTimestamp(trace?.finishedAt, trace?.completedAt, trace?.endedAt)) {
const status = terminalStatusFromValue(finalResponse.status ?? trace?.status) ?? "completed";
return { source: "trace-final-response", status, evidence: { textPresent: Boolean(projectionText(finalResponse)), valuesRedacted: true }, valuesRedacted: true };
}
}
const events = Array.isArray(trace?.events) ? trace.events : [];
return terminalTraceEventEvidence(events);
@@ -197,8 +203,11 @@ function resultHasTerminalAuthority(result = null, traceTerminal = null) {
if (result.terminal === true || result.sealed === true) return true;
if (result.error || result.blocker) return true;
if (firstTimestamp(result.finishedAt, result.completedAt, result.endedAt)) return true;
const finalText = projectionText(result.finalResponse, result.assistantText, result.reply, result.text, result.summary);
return Boolean(finalText && terminalStatusFromValue(result.status));
// A completed-looking status plus final text is not enough authority to seal
// a Workbench turn. For AgentRun-backed turns the final text can arrive before
// the runner terminal event; sealing here makes the visible completed card
// keep changing once later trace snapshots arrive.
return false;
}
function activeTurnEvidence({ result = null, session = null, trace = null } = {}) {