---
{
  "id": "platform.cron.lifecycle-and-replacement",
  "topic": "cron",
  "title": "Cron 生命週期與 replacement update",
  "locale": "zh-TW",
  "version": "2026-09-05.1",
  "summary": "暫停會保留 Cron 工作，取消會停止未來 fires，而更新會建立新 ID 並連回已取消的舊工作。",
  "content": "Cron job statuses 是 `active`、`paused`、`firing`、`completed`、`cancelled`、`expired`、`failed`。`set_enabled(false)` 會暫停仍符合條件的工作並保留歷史；`set_enabled(true)` 會恢復 eligible paused job、清除連續 failure/skip counters 與 first-loss timestamp、移除 cancellation reason，並重新計算 next fire time。`completed`、`cancelled`、`expired`、`failed` 是 terminal outcomes，必須依目前 action result 解釋。\n\n`update_job` 是 replacement，不是原 row in-place mutation。成功後應從 response 讀取新的 `cronJobId`，所有後續操作都改用新 ID；`replacesCronJobId` 指向舊工作，舊工作會以 `system:replaced` 原因取消。dry-run 不代表 replacement 已寫入。\n\n`run_now` 需要使用者確認，只接受 `active` 或 `paused` job。它會建立 manual fire，但不改動 `nextFireAt`、`runCount`、排程或 skip counters。第一次呼叫後即使 job 變成 terminal，使用相同 idempotency key 重試仍會回傳原結果。\n\nWeb/API 的 `duplicate` 會建立 `active` 但停用的草稿、清空 dedupe key，且除了正常 floor 以外不複製 Agent grants。已 completed 的 once job 與已 expired 的 recurring job 也可複製；歷史 `runAt`、`endAt`、`expiresAt` 會保留供編輯，但在排程有未來 occurrence 前不可啟用。\n\n`cancel_job` 需要使用者確認，之後會停止未來正常 fires，但保留歷史與 telemetry，並不是刪除。terminal `completed`、`expired`、`failed`、`cancelled` job 不可恢復或取消。update、cancel、run-now 都使用 strict drift；update 採用 `ConfirmationPolicy::None`，cancel 與 run-now 採用 `ConfirmationPolicy::UserConfirm`。\n",
  "aliases": [
    "暫停 Cron",
    "恢復排程",
    "取代工作",
    "新 cronJobId",
    "取消排程",
    "system replaced"
  ],
  "tags": [
    "cron",
    "lifecycle",
    "replacement"
  ],
  "relatedActions": [
    "arinova.cron.get_job",
    "arinova.cron.update_job",
    "arinova.cron.set_enabled",
    "arinova.cron.cancel_job",
    "arinova.cron.run_now"
  ],
  "relatedActionPrefixes": [],
  "sourceReviewedAt": "2026-09-06",
  "url": "https://docs.arinova.ai/zh-tw/kb/cron/lifecycle-and-replacement/"
}
---

Cron job statuses 是 `active`、`paused`、`firing`、`completed`、`cancelled`、`expired`、`failed`。`set_enabled(false)` 會暫停仍符合條件的工作並保留歷史；`set_enabled(true)` 會恢復 eligible paused job、清除連續 failure/skip counters 與 first-loss timestamp、移除 cancellation reason，並重新計算 next fire time。`completed`、`cancelled`、`expired`、`failed` 是 terminal outcomes，必須依目前 action result 解釋。

`update_job` 是 replacement，不是原 row in-place mutation。成功後應從 response 讀取新的 `cronJobId`，所有後續操作都改用新 ID；`replacesCronJobId` 指向舊工作，舊工作會以 `system:replaced` 原因取消。dry-run 不代表 replacement 已寫入。

`run_now` 需要使用者確認，只接受 `active` 或 `paused` job。它會建立 manual fire，但不改動 `nextFireAt`、`runCount`、排程或 skip counters。第一次呼叫後即使 job 變成 terminal，使用相同 idempotency key 重試仍會回傳原結果。

Web/API 的 `duplicate` 會建立 `active` 但停用的草稿、清空 dedupe key，且除了正常 floor 以外不複製 Agent grants。已 completed 的 once job 與已 expired 的 recurring job 也可複製；歷史 `runAt`、`endAt`、`expiresAt` 會保留供編輯，但在排程有未來 occurrence 前不可啟用。

`cancel_job` 需要使用者確認，之後會停止未來正常 fires，但保留歷史與 telemetry，並不是刪除。terminal `completed`、`expired`、`failed`、`cancelled` job 不可恢復或取消。update、cancel、run-now 都使用 strict drift；update 採用 `ConfirmationPolicy::None`，cancel 與 run-now 採用 `ConfirmationPolicy::UserConfirm`。
