From 26c6856d734544b83f7e600746d72c467ecee876 Mon Sep 17 00:00:00 2001 From: luvs01 Date: Thu, 13 Aug 2026 10:05:05 +0900 Subject: [PATCH] fix(lab): supervise producers through child exit --- src/lab/fabric/producer-isolate.ts | 1 - tests/lab-fabric-task.test.ts | 50 +++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/lab/fabric/producer-isolate.ts b/src/lab/fabric/producer-isolate.ts index 6a2aa4561..30c1aa6b0 100644 --- a/src/lab/fabric/producer-isolate.ts +++ b/src/lab/fabric/producer-isolate.ts @@ -114,7 +114,6 @@ export async function runIsolatedFabricProducer(request: IsolateRequest): Promis if (message.type === "result") { if (settled) return; receivedResult = message.patch; - finish(() => resolve({ patch: message.patch, lastActivityAt })); return; } if (message.type === "error") { diff --git a/tests/lab-fabric-task.test.ts b/tests/lab-fabric-task.test.ts index b9b8c3442..ee26b556f 100644 --- a/tests/lab-fabric-task.test.ts +++ b/tests/lab-fabric-task.test.ts @@ -145,6 +145,38 @@ export async function execute(_input: FabricPatchExecutorInput): Promise { + process.stdout.write(JSON.stringify({ type: "result", patch }) + "\\n"); + const deadline = Date.now() + ${FAST_FABRIC_ISOLATION.totalTimeoutMs + 500}; + while (Date.now() < deadline) { + input.reportActivity(); + await Bun.sleep(100); + } + writeFileSync(${JSON.stringify(marker)}, "late\\n"); + return patch; +} +`); + return { + executor: createHostIssuedFabricPatchExecutor(modulePath, async () => correctSyntheticPatch()), + marker, + }; +} + function fabricTraversalPatchExecutor(home: string): TrustedFabricPatchExecutor { const dir = join(home, "fabric-executors"); mkdirSync(dir, { recursive: true }); @@ -561,6 +593,22 @@ describe("CL-07 task effectiveness producer", () => { expect(result.outcome.failure?.code).toBe("inactivity_timeout"); }, 20_000); + test("producer result remains supervised until the child exits", async () => { + const home = tempHome(); + process.env.OPENCODEX_HOME = home; + const { executor, marker } = fabricEarlyResultPatchExecutor(home); + const result = await runFabricSyntheticPatchTaskForRoute({ + routeContext: fabricMockRoute(), + destination: await fabricDestination(home), + patchExecutor: executor, + configDir: home, + }); + expect(result.outcome.outcome).not.toBe("pass"); + expect(result.outcome.failure?.code).toBe("timeout"); + await Bun.sleep(750); + expect(existsSync(marker)).toBe(false); + }, 20_000); + test("activity resets inactivity deadline within total budget", async () => { const home = tempHome(); process.env.OPENCODEX_HOME = home; @@ -1081,4 +1129,4 @@ describe("CL-07 task effectiveness producer", () => { expect(text.includes("system prompt")).toBe(false); expect(text.includes(CREDENTIAL_CANARY)).toBe(false); }); -}); \ No newline at end of file +});