diff --git a/ui/src/e2e/chat-flow.sidebar-presentation.e2e.test.ts b/ui/src/e2e/chat-flow.sidebar-presentation.e2e.test.ts index 707991a52632..edee17cdfc59 100644 --- a/ui/src/e2e/chat-flow.sidebar-presentation.e2e.test.ts +++ b/ui/src/e2e/chat-flow.sidebar-presentation.e2e.test.ts @@ -162,6 +162,12 @@ suite.define(() => { }); const key = "agent:main:session-a"; const runId = "run-sidebar-metadata"; + const rosterPeer = { + key: "agent:main:roster-peer", + kind: "direct", + label: "Roster peer", + updatedAt: 1, + }; const running = chatSessionListResponse([ { key, @@ -180,6 +186,7 @@ suite.define(() => { revision: 1, }, }, + rosterPeer, ]); const completed = chatSessionListResponse([ { @@ -200,8 +207,10 @@ suite.define(() => { revision: 2, }, }, + rosterPeer, ]); const gateway = await installMockGateway(page, { + deferredMethods: ["chat.startup"], methodResponses: { "sessions.list": running }, sessionKey: key, }); @@ -210,6 +219,11 @@ suite.define(() => { await page.goto(controlUiSessionUrl(suite.server.baseUrl, key)); const row = page.locator(`.sidebar-recent-session[data-session-key="${key}"]`); await row.getByText("Implementing the repair").waitFor(); + // A descriptor can render the selected row before startup releases the roster. + // Wait for a roster-only row before measuring event-triggered list reads. + await gateway.waitForRequest("chat.startup"); + await gateway.resolveDeferred("chat.startup"); + await page.locator(`.sidebar-recent-session[data-session-key="${rosterPeer.key}"]`).waitFor(); if (captureUiProofEnabled) { await writeFile( path.join(