diff --git a/src/renderer/src/components/terminal-pane/agent-completion-coordinator.test.ts b/src/renderer/src/components/terminal-pane/agent-completion-coordinator.test.ts index ade471d0517..572df1515ce 100644 --- a/src/renderer/src/components/terminal-pane/agent-completion-coordinator.test.ts +++ b/src/renderer/src/components/terminal-pane/agent-completion-coordinator.test.ts @@ -1277,7 +1277,7 @@ describe('agent completion coordinator', () => { ) }) - it('pairs a background all-clear with the turn it announced even after a working title blip', () => { + it('does not replay a stamped turn or its all-clear after a working title blip', () => { const dispatchCompletion = vi.fn() const dispatchHookLifecycle = vi.fn() const coordinator = createAgentCompletionCoordinator({ @@ -1308,6 +1308,15 @@ describe('agent completion coordinator', () => { vi.advanceTimersByTime(2_000) coordinator.observeTitleWorking() + coordinator.observeHookStatus({ + state: 'working', + prompt: 'review the PR', + agentType: 'claude', + stateStartedAt: 1_700_000_000_000, + turnCompletedAt: 1_700_000_005_000 + }) + expect(dispatchCompletion).toHaveBeenCalledTimes(1) + coordinator.observeHookStatus({ state: 'done', prompt: 'review the PR', diff --git a/src/renderer/src/components/terminal-pane/agent-completion-coordinator.ts b/src/renderer/src/components/terminal-pane/agent-completion-coordinator.ts index 6cff9056260..f9da6ca62f2 100644 --- a/src/renderer/src/components/terminal-pane/agent-completion-coordinator.ts +++ b/src/renderer/src/components/terminal-pane/agent-completion-coordinator.ts @@ -832,7 +832,11 @@ export function createAgentCompletionCoordinator( : undefined if (turnCompletedAt !== undefined) { // Why: Claude's lead Stop already ended the turn; the pane stays `working` only for background inventory. Announce now, keep lifecycle on the reported working row. - if (workingStatusObserved) { + if ( + workingStatusObserved && + !turnCompletedAtAlreadyNotified(turnCompletedAt) && + lastCompletionIdentity?.lastTurnCompletedAtNotified !== turnCompletedAt + ) { const completionSnapshot: AgentCompletionStatusSnapshot = { ...payload, state: 'done',