From 04ce879858786e8b1a7e1fa6628c41fd1b9d0a27 Mon Sep 17 00:00:00 2001 From: Paul Frederiksen Date: Sat, 2 May 2026 23:55:10 +0000 Subject: [PATCH] Preserve cron task ledger run IDs --- src/cron/service/ops.test.ts | 29 +++++++++++++++++++++++++++++ src/cron/service/ops.ts | 4 +--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/cron/service/ops.test.ts b/src/cron/service/ops.test.ts index d308f4deac5..9c254d4d54b 100644 --- a/src/cron/service/ops.test.ts +++ b/src/cron/service/ops.test.ts @@ -182,6 +182,35 @@ describe("cron service ops seam coverage", () => { stop(state); }); + it("keeps manual acknowledgement IDs separate from recoverable task run IDs", async () => { + const { storePath } = await makeStorePath(); + const now = Date.parse("2026-03-23T12:00:00.000Z"); + const restoreStateDir = withStateDirForStorePath(storePath); + + try { + await writeDueIsolatedJobSnapshot(storePath, now); + + const state = createOkIsolatedCronState({ storePath, now, summary: "done" }); + const manualRunId = `manual:isolated-timeout:${now}:1`; + + await expect( + run(state, "isolated-timeout", "force", { runId: manualRunId }), + ).resolves.toEqual({ + ok: true, + ran: true, + }); + + expect(findTaskByRunId(`cron:isolated-timeout:${now}`)).toMatchObject({ + runtime: "cron", + status: "succeeded", + sourceId: "isolated-timeout", + }); + expect(findTaskByRunId(manualRunId)).toBeUndefined(); + } finally { + restoreStateDir(); + } + }); + it("records timed out manual runs as timed_out in the shared task registry", async () => { const { storePath } = await makeStorePath(); const now = Date.parse("2026-03-23T12:00:00.000Z"); diff --git a/src/cron/service/ops.ts b/src/cron/service/ops.ts index 2dabd216a91..c0232937fad 100644 --- a/src/cron/service/ops.ts +++ b/src/cron/service/ops.ts @@ -508,9 +508,8 @@ function tryCreateManualTaskRun(params: { state: CronServiceState; job: CronJob; startedAt: number; - runId?: string; }): string | undefined { - const runId = params.runId ?? createCronExecutionId(params.job.id, params.startedAt); + const runId = createCronExecutionId(params.job.id, params.startedAt); try { createRunningTaskRun({ runtime: "cron", @@ -662,7 +661,6 @@ async function prepareManualRun( state, job, startedAt: preflight.now, - runId: opts?.runId, }); const executionJob = structuredClone(job); return {