diff --git a/src/agents/subagent-announce.format.test.ts b/src/agents/subagent-announce.format.test.ts index 712d1d204b9..4cb6070a9bd 100644 --- a/src/agents/subagent-announce.format.test.ts +++ b/src/agents/subagent-announce.format.test.ts @@ -1064,6 +1064,32 @@ describe("subagent announce formatting", () => { expect(params.accountId).toBe("kev"); }); + it("does not report cron announce as delivered when it was only queued", async () => { + embeddedRunMock.isEmbeddedPiRunActive.mockReturnValue(true); + embeddedRunMock.isEmbeddedPiRunStreaming.mockReturnValue(false); + sessionStore = { + "agent:main:main": { + sessionId: "session-cron-queued", + lastChannel: "telegram", + lastTo: "123", + queueMode: "collect", + queueDebounceMs: 0, + }, + }; + + const didAnnounce = await runSubagentAnnounceFlow({ + childSessionKey: "agent:main:subagent:test", + childRunId: "run-cron-queued", + requesterSessionKey: "main", + requesterDisplayKey: "main", + announceType: "cron job", + ...defaultOutcomeAnnounce, + }); + + expect(didAnnounce).toBe(false); + expect(agentSpy).toHaveBeenCalledTimes(1); + }); + it("keeps queued idempotency unique for same-ms distinct child runs", async () => { embeddedRunMock.isEmbeddedPiRunActive.mockReturnValue(true); embeddedRunMock.isEmbeddedPiRunStreaming.mockReturnValue(false); diff --git a/src/agents/subagent-announce.ts b/src/agents/subagent-announce.ts index 6861ce85a11..f8ad0164d47 100644 --- a/src/agents/subagent-announce.ts +++ b/src/agents/subagent-announce.ts @@ -1346,7 +1346,17 @@ export async function runSubagentAnnounceFlow(params: { directIdempotencyKey, signal: params.signal, }); - didAnnounce = delivery.delivered; + // Cron delivery state should only be marked as delivered when we have a + // direct path result. Queue/steer means "accepted for later processing", + // not a confirmed channel send, and can otherwise produce false positives. + if ( + announceType === "cron job" && + (delivery.path === "queued" || delivery.path === "steered") + ) { + didAnnounce = false; + } else { + didAnnounce = delivery.delivered; + } if (!delivery.delivered && delivery.path === "direct" && delivery.error) { defaultRuntime.error?.( `Subagent completion direct announce failed for run ${params.childRunId}: ${delivery.error}`,