From 385a22eb1d1da21cf5de791d21c9e0c6bc9600ba Mon Sep 17 00:00:00 2001 From: Michael Yong Date: Thu, 27 Aug 2026 11:18:06 -0700 Subject: [PATCH] Publish ACP signal marker atomically --- .../provider-bridge-acp/src/bridge/fake-acp-agent.mjs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/provider-bridge-acp/src/bridge/fake-acp-agent.mjs b/packages/provider-bridge-acp/src/bridge/fake-acp-agent.mjs index b89ba38828..086f3b3ff0 100755 --- a/packages/provider-bridge-acp/src/bridge/fake-acp-agent.mjs +++ b/packages/provider-bridge-acp/src/bridge/fake-acp-agent.mjs @@ -68,7 +68,7 @@ */ import { createInterface } from "node:readline"; -import { appendFileSync, writeFileSync } from "node:fs"; +import { appendFileSync, renameSync, writeFileSync } from "node:fs"; const failLoad = process.env.FAKE_ACP_FAIL_LOAD === "1"; const loadSession = process.env.FAKE_ACP_LOAD_SESSION === "1" || failLoad; @@ -144,7 +144,12 @@ for (let i = fakeModels.length; i < modelCount; i += 1) { process.on("SIGTERM", () => { if (process.env.FAKE_ACP_SIGNAL_FILE) { - writeFileSync(process.env.FAKE_ACP_SIGNAL_FILE, "SIGTERM\n"); + const signalFile = process.env.FAKE_ACP_SIGNAL_FILE; + const stagedSignalFile = `${signalFile}.${process.pid}.tmp`; + // The final path is the test's completion boundary: publish it only after + // the marker bytes are complete. + writeFileSync(stagedSignalFile, "SIGTERM\n"); + renameSync(stagedSignalFile, signalFile); } process.exit(0); });