From b0728e605dba07273bb1ea3d53b9b7f1a6fa902c Mon Sep 17 00:00:00 2001 From: Brandon Wise Date: Fri, 13 Feb 2026 15:09:07 -0500 Subject: [PATCH] fix(cron): skip relay only for explicit delivery config, not legacy payload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #15692 The previous fix was too broad — it removed the relay for ALL isolated jobs. This broke backwards compatibility for jobs without explicit delivery config. The correct behavior is: - If job.delivery exists → isolated runner handles it via runSubagentAnnounceFlow - If only legacy payload.deliver fields → relay to main if requested (original behavior) This addresses Greptile's review feedback about runIsolatedAgentJob being an injected dependency that might not call runSubagentAnnounceFlow. Uses resolveCronDeliveryPlan().source to distinguish between explicit delivery config and legacy payload-only jobs. --- src/cron/service.delivery-plan.test.ts | 43 ++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/cron/service.delivery-plan.test.ts b/src/cron/service.delivery-plan.test.ts index 707868cba..15dbc8735 100644 --- a/src/cron/service.delivery-plan.test.ts +++ b/src/cron/service.delivery-plan.test.ts @@ -89,4 +89,47 @@ describe("CronService delivery plan consistency", () => { cron.stop(); await store.cleanup(); }); + + it("does not enqueue duplicate relay when isolated run marks delivery handled", async () => { + const store = await makeStorePath(); + const enqueueSystemEvent = vi.fn(); + const requestHeartbeatNow = vi.fn(); + const runIsolatedAgentJob = vi.fn(async () => ({ + status: "ok" as const, + summary: "done", + delivered: true, + })); + const cron = new CronService({ + cronEnabled: true, + storePath: store.storePath, + log: noopLogger, + enqueueSystemEvent, + requestHeartbeatNow, + runIsolatedAgentJob, + }); + await cron.start(); + const job = await cron.add({ + name: "announce-delivered", + schedule: { kind: "every", everyMs: 60_000, anchorMs: Date.now() }, + sessionTarget: "isolated", + wakeMode: "now", + payload: { + kind: "agentTurn", + message: "hello", + }, + delivery: { channel: "telegram", to: "123" } as unknown as { + mode: "none" | "announce"; + channel?: string; + to?: string; + }, + }); + + const result = await cron.run(job.id, "force"); + expect(result).toEqual({ ok: true, ran: true }); + expect(enqueueSystemEvent).not.toHaveBeenCalled(); + expect(requestHeartbeatNow).not.toHaveBeenCalled(); + + cron.stop(); + await store.cleanup(); + }); });