diff --git a/tests/runner-e2e/chat-flow.ts b/tests/runner-e2e/chat-flow.ts
index e9e8422cb9b..f45fca22476 100644
--- a/tests/runner-e2e/chat-flow.ts
+++ b/tests/runner-e2e/chat-flow.ts
@@ -341,12 +341,7 @@ export function assertChatHandoff(
export async function sendChatMessage(page: Page, message: string, remainingBudget?: () => number) {
const options = () => remainingBudget ? { timeout: remainingBudget() } : {};
const composer = page.getByTestId("task-chat-composer-input").last();
- const takeover = page.getByTestId("task-chat-composer-takeover").last();
- await expect(composer.or(takeover).first()).toBeVisible(options());
- if (await takeover.isVisible()) {
- // Close the card's composer view without answering, skipping, or approving it.
- await takeover.getByRole("button", { name: /^Dismiss / }).click(options());
- }
+ await expect(composer).toBeVisible(options());
await composer
.locator('[contenteditable="true"], textarea')
.first()
diff --git a/tests/runner-e2e/chat-message-ui.test.ts b/tests/runner-e2e/chat-message-ui.test.ts
new file mode 100644
index 00000000000..590de178ed1
--- /dev/null
+++ b/tests/runner-e2e/chat-message-ui.test.ts
@@ -0,0 +1,22 @@
+import { expect, it } from "vitest";
+import { chromium } from "@playwright/test";
+import { sendChatMessage } from "./chat-flow.js";
+
+it.skipIf(process.env.PAPERCLIP_CHAT_EVAL_MESSAGE_CANARY !== "1")("sends ordinary chat without dismissing a current form on desktop and mobile", async () => {
+ const browser = await chromium.launch({ headless: true, ...(process.env.PAPERCLIP_RUNNER_E2E_CHROMIUM_EXECUTABLE ? { executablePath: process.env.PAPERCLIP_RUNNER_E2E_CHROMIUM_EXECUTABLE } : {}) });
+ try {
+ for (const viewport of [{ width: 1280, height: 900 }, { width: 390, height: 844 }]) {
+ const page = await browser.newPage({ viewport });
+ await page.setContent(` Launch page details