From 8cf5a57766e95ce6faab3ad1857c8b12436a69ac Mon Sep 17 00:00:00 2001 From: Yuhan Lei Date: Tue, 26 May 2026 18:21:48 +0800 Subject: [PATCH] fix(ci): stabilize recent dev smoke flakes --- .../scripts/report-problem-smoke.mjs | 34 ++++++++++++++++++- .../test/session/prompt-effect.test.ts | 2 ++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/packages/desktop-electron/scripts/report-problem-smoke.mjs b/packages/desktop-electron/scripts/report-problem-smoke.mjs index 3012b42c9..eb0d2894b 100644 --- a/packages/desktop-electron/scripts/report-problem-smoke.mjs +++ b/packages/desktop-electron/scripts/report-problem-smoke.mjs @@ -55,6 +55,38 @@ function latestMarkdownReport(reportRoot) { } } +function childIsRunning(child) { + return child.exitCode === null && child.signalCode === null +} + +async function withTimeout(promise, ms, timeoutValue) { + let timeout + try { + return await Promise.race([ + promise, + new Promise((resolve) => { + timeout = setTimeout(() => resolve(timeoutValue), ms) + }), + ]) + } finally { + clearTimeout(timeout) + } +} + +async function waitForExit(child, ms) { + if (!childIsRunning(child)) return + await withTimeout(new Promise((resolve) => child.once("exit", resolve)), ms, undefined) +} + +async function closeApp(app) { + const child = app.process() + const closed = await withTimeout(app.close().then(() => true).catch(() => false), 5_000, false) + if (closed || !childIsRunning(child)) return + + child.kill("SIGKILL") + await waitForExit(child, 5_000) +} + const homeDir = mkdtempSync(join(tmpdir(), "pawwork-report-smoke-")) const app = await electron.launch({ executablePath: require("electron/index.js"), @@ -101,6 +133,6 @@ try { assert(summary.markdownHasRendererError, "expected full report to include renderer error details") assert(summary.markdownHasReportPayload, "expected full report to include the fenced JSON payload") } finally { - await app.close().catch(() => undefined) + await closeApp(app) rmSync(homeDir, { force: true, maxRetries: 5, recursive: true, retryDelay: 100 }) } diff --git a/packages/opencode/test/session/prompt-effect.test.ts b/packages/opencode/test/session/prompt-effect.test.ts index 8bcd9899f..da575d3c1 100644 --- a/packages/opencode/test/session/prompt-effect.test.ts +++ b/packages/opencode/test/session/prompt-effect.test.ts @@ -300,6 +300,7 @@ function makeHttp(httpLayer: Layer.Layer = FetchHttpClien // setup; default the live() timeout instead of bandaging individual tests. // An explicit third-arg timeout still overrides. const defaultLiveTimeout = process.platform === "win32" ? 10_000 : 3_000 +const slowWindowsLiveTimeout = process.platform === "win32" ? 30_000 : undefined function withDefaultLiveTimeout< T extends { live: ((...args: any[]) => any) & { only: any; skip: any } }, @@ -1049,6 +1050,7 @@ it.live("loop gate records same-step repeated tool errors without block or stop" }), { git: true, config: providerCfg }, ), + slowWindowsLiveTimeout, ) it.live("loop gate blocks repeated tool errors across model steps", () =>