Two kinds of scheduled work in Codex

1. Codex 中的两种定时任务

📌 本文翻译自 Two kinds of scheduled work in Codex,作者 Jason Liu

大部分自动化的复杂度都超过了任务本身。

你想让 Codex 在未来的某个时间做某件事,或者持续检查某件事直到它发生变化。这听起来像是一个功能,但实际上对应两种不同的工作模式,区别很简单:

  • Scheduled Tasks(定时任务)——每次运行时都会创建一个新线程。
  • Scheduled Messages(定时消息)——每次运行时都使用同一个已有线程。

这就是整个模型。

[!info] 阅读导览
第 1 章 Scheduled Task(每次可重新开始) → 第 2 章 Scheduled Message(需要持续上下文) → 第 3 章 决策规则:上下文放在哪里 → 第 4 章 自己做一个循环 skill

维度 Scheduled Tasks(定时任务) Scheduled Messages(定时消息)
线程 每次运行创建新线程 复用同一个已有线程
上下文 不需要创建时的对话上下文 需要之前检查的上下文
典型场景 每日汇总、跨项目独立运行 轮询监控 PR、状态变更
核心判断 明天再跑不需要之前的对话 明天再跑需要之前的对话

2. 每次运行可以重新开始时,用 Scheduled Task

当任务不需要创建它的那个对话上下文也能正常执行时,Scheduled Task 是最佳选择。

2.1.1. 典型场景

例如:

每天早上 9 点,汇总我的邮件、日历和团队消息中我需要跟进的内容。

今天的总结不需要记住昨天的总结。它需要同样的指令、最新的信息,以及一个全新的地方来报告结果。

2.1.2. 跨项目与独立运行

这也适用于一个任务需要跨多个项目运行,或者希望每次运行在 Triage 中独立展示的场景。每次运行都是独立的线程,把它们联系在一起的是调度本身。

3. 下次检查需要上下文时,用 Scheduled Message

Scheduled Message(有时称为线程自动化)每次运行时都会回到同一个已有的线程。

3.1.1. 持续监控示例

例如:

每 30 分钟检查这个 PR。如果有评论,处理它们并保持 CI 绿色。PR 合并后停止运行。

下一次检查依赖于已经完成的工作结果。线程知道你说的是哪个 PR、哪些评论已处理、CI 中哪里失败了,以及自上次检查以来发生了什么变化。

3.1.2. 适用场景

这种模式适合:

  • 轮询等待更新
  • 检查状态变更
  • 持续调研或分类
  • 有明确停止条件的工作

把运行连接在一起的是线程。

4. 决策规则在于上下文

4.1.1. 核心判断标准

问一个问题:

如果明天再跑一次,它需要之前的对话吗?

如果不需要,用 Scheduled Task。给它一个持久的 prompt,让每次运行从零开始。

如果需要,用 Scheduled Message。把工作保持在一个线程中,这样每次检查都能基于之前的决策和结果继续推进。

flowchart TD
    A[明天再跑一次,需要之前的对话吗?] -->|不需要| B[Scheduled Task<br>每次运行从零开始]
    A -->|需要| C[Scheduled Message<br>保持同一线程继续推进]

4.1.2. 调度 vs 上下文

调度本身很重要,但它不是主要决策。主要决策是有用的上下文应该放在哪里。

5. 自己做一个循环 skill

我不想每次都记住那些配置问题,所以我会做一个小型 skill,把粗略的需求转化为正确的定时工作流。

5.1.1. 构建可复用的 skill

给 Codex 这个 prompt:

为定时工作创建一个可复用的循环 skill。

当我给它一个需求时,先判断:每次运行是否可以重新开始,还是下一次检查需要当前线程的上下文。

如果每次运行可以重新开始,帮我创建一个 Scheduled Task。
如果下一次检查需要当前线程,帮我创建一个 Scheduled Message。

从对话中尽可能推断。只问那些真正会改变工作流的关键问题:
- Codex 每次应该做什么?
- 多久运行一次?
- 什么样的变化值得报告?
- 什么时候应该停止?
- 什么时候需要问我?

然后用一个简短、持久、在后续运行时仍然有意义的 prompt 创建定时工作流。

5.1.2. 简单开始

最好的自动化不是从一个复杂的系统开始的。它们始于一个简单的问题:下一次运行需要一张白纸,还是同一个线程?

[!success] 核心要点

  • 两种模式:Scheduled Tasks 每次新建线程(从零开始);Scheduled Messages 复用同一线程(延续上下文)
  • 决策问题:明天再跑一次,它需要之前的对话吗?——不需要用 Task,需要则用 Message
  • 本质:调度本身不是主要决策,上下文放在哪里才是
  • 实践:做一个循环 skill,让 Codex 自动判断需求属于哪种模式,并生成对应的定时工作流