diff --git a/tests/runner-e2e/README.md b/tests/runner-e2e/README.md
index df9809fd140..f1abc8d33a5 100644
--- a/tests/runner-e2e/README.md
+++ b/tests/runner-e2e/README.md
@@ -14,6 +14,10 @@ environments × cases; an **execution/cell** is one parallel job; and an
The browser creates and assigns the task. The harness does not call a private
runner hook or write fixtures directly to the database.
+The launcher always sets `PAPERCLIP_ANNOUNCEMENTS_ENABLED=false` for its isolated
+instances so announcement panels do not obscure screenshot evidence. No shell
+or workflow configuration is needed, including for Daytona cells.
+
## Credentials
Copy `.env.runner-e2e.example` to `.env.runner-e2e.local` and fill only the
diff --git a/tests/runner-e2e/dashboard.ts b/tests/runner-e2e/dashboard.ts
index 6ea1002e22e..5537e80c39f 100644
--- a/tests/runner-e2e/dashboard.ts
+++ b/tests/runner-e2e/dashboard.ts
@@ -1154,7 +1154,7 @@ export function renderRunnerE2EDashboard(input: RunnerDashboardInput) {
Screenshot evidence
-
+ Environment:
@@ -1225,7 +1225,7 @@ export function renderRunnerE2EDashboard(input: RunnerDashboardInput) {
profile.textContent = item.dataset.galleryProfile;
profileDetail.textContent = item.dataset.galleryGeneration + " · " + item.dataset.galleryProvider + " · " + item.dataset.galleryModel;
environment.textContent = item.dataset.galleryEnvironment;
- environmentDetail.textContent = item.dataset.galleryEnvironmentProvider + " · " + item.dataset.galleryExecutionTarget;
+ environmentDetail.textContent = "Provider: " + item.dataset.galleryEnvironmentProvider + " · Target: " + item.dataset.galleryExecutionTarget;
caseLabel.textContent = item.dataset.galleryCase;
runtime.textContent = item.dataset.galleryRuntime + " runtime";
status.textContent = item.dataset.galleryStatus;
diff --git a/tests/runner-e2e/harness-env.ts b/tests/runner-e2e/harness-env.ts
index d37a3964c8c..d1e9cede374 100644
--- a/tests/runner-e2e/harness-env.ts
+++ b/tests/runner-e2e/harness-env.ts
@@ -104,6 +104,8 @@ export function buildRunnerE2EProcessEnvironment(
executions: readonly MatrixExecution[],
): NodeJS.ProcessEnv {
const result = { ...source };
+ // Announcements are unrelated to the scenarios and obscure screenshot evidence.
+ result.PAPERCLIP_ANNOUNCEMENTS_ENABLED = "false";
delete result.OPENCODE_ALLOW_ALL_MODELS;
// Hiring needs the opt-in native API surface. Scope this to the explicit
// manual hiring story; production and other suites retain their defaults.
diff --git a/tests/runner-e2e/support.test.ts b/tests/runner-e2e/support.test.ts
index 9e48f68ea22..655a3c4195c 100644
--- a/tests/runner-e2e/support.test.ts
+++ b/tests/runner-e2e/support.test.ts
@@ -162,7 +162,7 @@ describe("runner E2E provider environment", () => {
{ KEEP_ME: "yes", OPENCODE_ALLOW_ALL_MODELS: "ambient" },
[execution],
),
- ).toEqual({ KEEP_ME: "yes", OPENCODE_ALLOW_ALL_MODELS: "true" });
+ ).toEqual({ KEEP_ME: "yes", OPENCODE_ALLOW_ALL_MODELS: "true", PAPERCLIP_ANNOUNCEMENTS_ENABLED: "false" });
}
for (const execution of [nativeOpenCode, breadthOpenCode]) {
@@ -171,7 +171,16 @@ describe("runner E2E provider environment", () => {
{ KEEP_ME: "yes", OPENCODE_ALLOW_ALL_MODELS: "ambient" },
[execution],
),
- ).toEqual({ KEEP_ME: "yes" });
+ ).toEqual({ KEEP_ME: "yes", PAPERCLIP_ANNOUNCEMENTS_ENABLED: "false" });
+ }
+ });
+
+ it("disables announcements through the server boundary for every runner cell", () => {
+ for (const execution of runnerMatrix) {
+ const source = { PAPERCLIP_ANNOUNCEMENTS_ENABLED: "true" };
+ const env = buildRunnerE2EProcessEnvironment(source, [execution]);
+ expect(buildPaperclipServerEnvironment(env).PAPERCLIP_ANNOUNCEMENTS_ENABLED).toBe("false");
+ expect(source.PAPERCLIP_ANNOUNCEMENTS_ENABLED).toBe("true");
}
});
});