From d4d7af3400614a38509ea4bfff7a3b99250c1436 Mon Sep 17 00:00:00 2001 From: openperf <16864032@qq.com> Date: Sat, 14 Mar 2026 12:44:26 +0800 Subject: [PATCH] fix: set deliveryAttempted on filtered NO_REPLY to prevent timer fallback --- .../delivery-dispatch.double-announce.test.ts | 27 +++++++++++++++++++ src/cron/isolated-agent/delivery-dispatch.ts | 3 +++ 2 files changed, 30 insertions(+) diff --git a/src/cron/isolated-agent/delivery-dispatch.double-announce.test.ts b/src/cron/isolated-agent/delivery-dispatch.double-announce.test.ts index 39ecd7d7560..3b93dc67964 100644 --- a/src/cron/isolated-agent/delivery-dispatch.double-announce.test.ts +++ b/src/cron/isolated-agent/delivery-dispatch.double-announce.test.ts @@ -428,6 +428,21 @@ describe("dispatchCronDelivery — double-announce guard", () => { expect(deliverOutboundPayloads).not.toHaveBeenCalled(); // No delivery was sent, so delivered stays false. expect(state.delivered).toBe(false); + // deliveryAttempted must be true so the heartbeat timer does not fire + // a fallback enqueueSystemEvent with the NO_REPLY sentinel text. + expect(state.deliveryAttempted).toBe(true); + + // Verify timer guard agrees: shouldEnqueueCronMainSummary returns false + expect( + shouldEnqueueCronMainSummary({ + summaryText: "NO_REPLY", + deliveryRequested: true, + delivered: state.delivered, + deliveryAttempted: state.deliveryAttempted, + suppressMainSummary: false, + isCronSystemEvent: () => true, + }), + ).toBe(false); }); it("suppresses NO_REPLY payload with surrounding whitespace", async () => { @@ -440,5 +455,17 @@ describe("dispatchCronDelivery — double-announce guard", () => { expect(deliverOutboundPayloads).not.toHaveBeenCalled(); expect(state.delivered).toBe(false); + expect(state.deliveryAttempted).toBe(true); + + expect( + shouldEnqueueCronMainSummary({ + summaryText: " NO_REPLY ", + deliveryRequested: true, + delivered: state.delivered, + deliveryAttempted: state.deliveryAttempted, + suppressMainSummary: false, + isCronSystemEvent: () => true, + }), + ).toBe(false); }); }); diff --git a/src/cron/isolated-agent/delivery-dispatch.ts b/src/cron/isolated-agent/delivery-dispatch.ts index e80ce5d424d..fad44594333 100644 --- a/src/cron/isolated-agent/delivery-dispatch.ts +++ b/src/cron/isolated-agent/delivery-dispatch.ts @@ -325,6 +325,9 @@ export async function dispatchCronDelivery( (p) => !isSilentReplyText(p.text, SILENT_REPLY_TOKEN), ); if (payloadsForDelivery.length === 0) { + // Mark attempted so the heartbeat timer does not fire a fallback + // enqueueSystemEvent with the NO_REPLY sentinel text. + deliveryAttempted = true; return null; } if (params.isAborted()) {