From bc0cfeba6c2f25bf2059e701d9cc74f0d14a7403 Mon Sep 17 00:00:00 2001 From: Dallin Romney Date: Fri, 21 Aug 2026 10:07:20 -0700 Subject: [PATCH] fix(qa): retain Slack presentation history --- .../slack/slack-live.observations.ts | 6 +- .../slack/slack-live.runtime.test.ts | 63 ++++++++++--------- 2 files changed, 39 insertions(+), 30 deletions(-) diff --git a/extensions/qa-lab/src/live-transports/slack/slack-live.observations.ts b/extensions/qa-lab/src/live-transports/slack/slack-live.observations.ts index 246e05aec399..b0cb798e775e 100644 --- a/extensions/qa-lab/src/live-transports/slack/slack-live.observations.ts +++ b/extensions/qa-lab/src/live-transports/slack/slack-live.observations.ts @@ -26,6 +26,10 @@ import { } from "./slack-live.contracts.js"; import { buildSlackInvalidBlocksTableProbe } from "./slack-live.invalid-blocks.js"; +// Isolated Slack flows share one live QA channel. Presentation sends precede +// their final markers, so retain enough history to survive concurrent traffic. +const SLACK_QA_CHANNEL_HISTORY_LIMIT = 200; + export async function getSlackIdentity(token: string): Promise { const client = createSlackWebClient(token, { timeout: SLACK_QA_WEB_API_TIMEOUT_MS }); const auth = slackAuthTestSchema.parse(await client.auth.test()); @@ -70,7 +74,7 @@ export async function listSlackMessages(params: { await params.client.conversations.history({ channel: params.channelId, inclusive: true, - limit: 50, + limit: SLACK_QA_CHANNEL_HISTORY_LIMIT, oldest: params.oldestTs, }), ); diff --git a/extensions/qa-lab/src/live-transports/slack/slack-live.runtime.test.ts b/extensions/qa-lab/src/live-transports/slack/slack-live.runtime.test.ts index 31bfc6c8ee62..95f03fb08d8a 100644 --- a/extensions/qa-lab/src/live-transports/slack/slack-live.runtime.test.ts +++ b/extensions/qa-lab/src/live-transports/slack/slack-live.runtime.test.ts @@ -993,38 +993,43 @@ describe("Slack live QA runtime helpers", () => { throw new Error("missing Slack chart scenario verifier"); } const accessibleText = renderExpectedSlackChartAccessibleText(summaryText); - const history = vi.fn(async () => ({ - messages: [ - { - blocks: [ - { - type: "data_visualization", - title: "QA latency trend", - chart: { - type: "line", - series: [ + const history = vi.fn(async (request: { limit: number }) => ({ + // Shared-channel concurrency can push the earlier chart beyond the old + // 50-message observation window before the final marker arrives. + messages: + request.limit >= 200 + ? [ + { + blocks: [ { - name: "Latency", - data: [ - { label: "P50", value: 120 }, - { label: "P95", value: 240 }, - ], + type: "data_visualization", + title: "QA latency trend", + chart: { + type: "line", + series: [ + { + name: "Latency", + data: [ + { label: "P50", value: 120 }, + { label: "P95", value: 240 }, + ], + }, + ], + axis_config: { + categories: ["P50", "P95"], + x_label: "Percentile", + y_label: "Milliseconds", + }, + }, }, ], - axis_config: { - categories: ["P50", "P95"], - x_label: "Percentile", - y_label: "Milliseconds", - }, + // Slack history flattens the top-level accessibility newlines on readback. + text: accessibleText.replace(/\s+/gu, " "), + ts: "2.000000", + user: "U999999999", }, - }, - ], - // Slack history flattens the top-level accessibility newlines on readback. - text: accessibleText.replace(/\s+/gu, " "), - ts: "2.000000", - user: "U999999999", - }, - ], + ] + : [], })); await expect( @@ -1041,7 +1046,7 @@ describe("Slack live QA runtime helpers", () => { expect(history).toHaveBeenCalledWith({ channel: "C123456789", inclusive: true, - limit: 50, + limit: 200, oldest: "1.000000", }); });