From c0959b7343c3216a78c087beb53f5f04deebace4 Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Fri, 28 Aug 2026 02:40:27 -0700 Subject: [PATCH] test(native-chat): restore settled-error session-switch regression a6e2379bd1 replaced this test with the in-flight settlement race test, leaving the render-time error reset unpinned: deleting the reset block still passed the whole native-chat suite. Keep both scenarios pinned; they are distinct (settled error clears on switch vs stale settlement invalidated in the commit-to-passive window). --- ...e-structured-agent-session-outbox.test.tsx | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/renderer/src/components/native-chat/use-structured-agent-session-outbox.test.tsx b/src/renderer/src/components/native-chat/use-structured-agent-session-outbox.test.tsx index 1c9f64af7b1..403769144fa 100644 --- a/src/renderer/src/components/native-chat/use-structured-agent-session-outbox.test.tsx +++ b/src/renderer/src/components/native-chat/use-structured-agent-session-outbox.test.tsx @@ -379,6 +379,32 @@ describe('useStructuredAgentSessionOutbox', () => { }) }) + it('drops a session error on switch and does not resurrect it on return', async () => { + const redispatch = deferred>() + mocks.call + .mockResolvedValueOnce(refusedResult('agent_session_checkpoint_stale')) + .mockReturnValueOnce(redispatch.promise) + const { result, rerender } = renderHook( + ({ sessionId }: { sessionId: string }) => + useStructuredAgentSessionOutbox({ + sessionId, + target: LOCAL_TARGET, + fence: 1, + submissions: [] + }), + { initialProps: { sessionId: 'session-1' } } + ) + + act(() => expect(result.current.send('hello')).toBe(true)) + await waitFor(() => expect(result.current.error).toBe('agent_session_checkpoint_stale')) + + rerender({ sessionId: 'session-2' }) + expect(result.current.error).toBeNull() + + rerender({ sessionId: 'session-1' }) + expect(result.current.error).toBeNull() + }) + it('invalidates an old dispatch before it settles during a session switch', async () => { const oldDispatch = deferred>() const sessionTwoCommitted = deferred()