在 issue-driven AI engineering 里,最容易混淆的一件事是:到底谁负责调度,谁负责执行?
很多人会本能地把 Codex 或其他 coding agent 当成“全能工程师”:它读 issue、决定优先级、判断风险、改代码、开 PR、甚至继续追踪发布。这种想法很自然,但工程上很危险。
更稳妥的边界是:Codex 应该是 worker,不应该是 scheduler。
Worker 适合一次性、局部、可验证的工作
Codex 擅长的是在一个明确上下文里做局部工程任务。
它可以读一个 issue,理解当前代码,定位相关文件,提出实现方案,改一小组文件,运行测试,然后把证据写出来。这个过程天然像一次 worker run。
worker run 的特点是:
- 有清晰输入;
- 有明确边界;
- 有开始和结束;
- 可以超时;
- 可以失败;
- 可以重跑;
- 可以被 human review。
这正是 AI coding 工具比较适合的形态。
如果你让 Codex 一直守着仓库、扫描所有 issue、管理并发、处理锁、恢复失败任务、判断哪些 PR 应该进入发布,那它就不再是 worker,而是在承担 scheduler 的职责。
Scheduler 需要的是稳定状态,不是一次聊天上下文
Scheduler 的任务不是“聪明”,而是“可靠”。
一个 scheduler 至少要处理:
- 哪些 issue 被允许进入自动化;
- 哪些 issue 仍然需要 triage;
- 当前哪个 worker claim 了哪个 issue;
- 一个 issue 是否已经有对应 branch;
- worker 是否超时;
- 上一次执行停在了哪里;
- label 和 comment 是否与真实状态一致;
- 失败任务是否需要重试或升级给人;
- PR merged 之后是否还需要 release verification。
这些事情不适合放在一次 AI 对话里。
原因很简单:对话上下文会丢,进程会中断,模型会升级,prompt 会变化,worker 也可能被替换。长期状态应该放在更稳定的系统里:GitHub label、branch、comment、PR、workflow log、本地 state file 或专门的 daemon。
AI 可以参与判断,但不应该成为唯一状态源。
一个清晰的分工
在一个健康的 issue-driven workflow 里,scheduler 和 worker 的职责应该分开。
Scheduler 负责:
- 扫描 issue;
- 判断是否 opt-in;
- 检查风险标签;
- 分配 workspace;
- 建立 branch claim;
- 启动 worker;
- 记录状态转移;
- 处理超时和恢复;
- 把不确定任务交回 human。
Codex worker 负责:
- 阅读 issue contract;
- 阅读相关代码;
- 分析原因;
- 判断是否触发停工条件;
- 在授权范围内改代码;
- 运行测试;
- 生成 evidence;
- 准备 PR summary;
- 报告 blocked 或 needs-human。
这个分工的好处是:worker 可以替换,scheduler 不必重写;scheduler 可以升级,worker prompt 也不必变成一个庞大的状态机。
不要让 worker 偷偷变成 release controller
最需要警惕的是发布边界。
Codex worker 可以开 PR,可以写 release notes,可以给出验证建议。但它不应该因为“测试通过”就把 issue 标记为 done,更不应该默认接管生产发布。
PR open 只是进入 review。PR merged 只是代码进入主干。生产验证是否完成,是另一个边界。
如果 worker 既负责实现,又负责判断任务完成,又负责发布闭环,那么系统会失去审计分层:你很难知道一个状态变化到底是业务判断、工程判断,还是 AI 的自我确认。
最小可行做法
如果你暂时没有 daemon,也可以手动模拟这个边界:
- human 负责选择 issue;
- human 判断 automation mode;
- human 在本地启动 Codex;
- Codex 只执行这一个 issue;
- Codex 输出 evidence;
- human review PR;
- human 决定是否发布和关闭 issue。
这已经比“在聊天里让 AI 随便改一下”稳定很多。
真正重要的不是第一天就自动化,而是先把职责切开。
当 Codex 是 worker 时,它可以很强。当 Codex 被迫变成 scheduler、reviewer、release controller 和 product owner 时,它反而会变成系统风险。
