很多人开始用 AI 写代码以后,会自然形成一个工作方式:在聊天里描述问题,让 Codex 或其他 coding agent 读代码、改文件、跑测试。

这在个人小项目里够用。但一旦进入长期项目、多人仓库、生产系统,聊天就不够了。

真正的问题不是“AI 会不会改代码”。真正的问题是:AI 凭什么知道这次任务的边界?谁判断它可以自动执行?它改完以后留下了什么证据?PR 打开以后谁负责发布?发布以后什么时候才算 done?

我的答案是:不要把 issue 当成 todo。把 issue 写成 AI 可执行合同。

Todo 太弱,合同才够用

普通 todo 往往只有一句话:

修复移动端下单按钮问题

人类工程师看到这句话,可能会主动追问上下文、打开页面、找复现路径、判断风险、补测试、问产品要确认。但 AI worker 没有稳定的长期记忆,也不应该靠猜测补完整个任务。

对 AI 来说,一个可执行 issue 至少要回答这些问题:

  • 用户在什么场景遇到什么问题?
  • 期望行为是什么?
  • 当前行为或证据是什么?
  • 验收标准是什么?
  • 这次明确不做什么?
  • 哪些风险会让 AI 停下来?
  • 是否允许自动实现,还是只允许分析?

这些不是形式主义。它们决定 AI 是在安全边界内工作,还是在模糊任务里自由发挥。

自动化必须 opt-in

AI issue workflow 的第一条规则应该是:默认不自动跑。

只有明确标记为 auto-run 的 issue,才允许 daemon 或 dispatcher 自动 claim、分析、实现、开 PR。没有 opt-in 的 issue,即使写得很清楚,也应该停在人工 triage 或手动执行。

这个规则看起来保守,但很必要。

GitHub issue 里会有很多内容:产品想法、用户反馈、线上事故、运营请求、合规疑问、截图、日志、临时记录。并不是每个 issue 都适合让 AI 自动改代码。

auto-run label 的意义不是“这个任务简单”,而是“这个任务被明确授权进入自动化控制面”。

Issue 应该保留原始证据

另一个容易犯的错误,是为了让 issue 更结构化,就重写用户原始正文。

这很危险。

用户原始描述、截图、附件、日志、复现路径和具体用词都是证据。AI 可以在评论里补充结构化分析,可以追加验收合同,但不应该为了格式漂亮把原始材料覆盖掉。

一个好的 issue-driven workflow 应该区分两层:

  • 原始 issue body:用户证据和初始需求;
  • Codex comments:结构化合同、triage、风险、证据和状态变更。

这样后续 reviewer 才能回到原始事实,而不是只看 AI 整理过的版本。

Issue 合同应该包含停工条件

可执行合同不是授权 AI 一路做到底。

它必须写清楚什么时候停下来。

常见停工条件包括:

  • 需求矛盾;
  • 验收标准缺失;
  • 需要改变核心业务语义;
  • 涉及数据库 schema 或持久化格式;
  • 涉及支付、交易、权限、安全、风控或合规;
  • 需要生产状态变更;
  • 测试或证据门禁失败。

这些条件一旦触发,AI 不应该继续扩大改动,而应该把 issue 切到 needs-inputreview-requiredfailed-needs-human 这类状态。

这不是降低 AI 效率。相反,这是让 AI 能长期进入真实工程系统的前提。

Issue 是控制面,不是聊天记录

Issue-driven AI engineering 的核心,是把工程状态放回 GitHub,而不是放在一次聊天里。

聊天适合讨论,issue 适合审计。

一个稳定的 issue 控制面应该记录:

  • 当前状态;
  • 谁 claim 了任务;
  • 哪个 branch 对应这个 issue;
  • triage 结论是什么;
  • 风险等级是什么;
  • PR 在哪里;
  • 测试和证据在哪里;
  • 是否进入 release boundary;
  • 是否已经生产验证。

这样即使某个 Codex worker 退出、某个本地进程重启、某次对话丢失,项目仍然知道任务走到了哪里。

AI 可执行合同的最小模板

一个通用模板可以很简单:

## 任务类型
bug | feature | improvement | test | investigation

## 用户问题
谁在什么场景下遇到什么问题?

## 期望行为
用户或系统应该看到什么结果?

## 当前行为
现在发生了什么?有哪些证据?

## 验收标准
- [ ] 可观察条件 1
- [ ] 可观察条件 2
- [ ] 测试、截图、数据证明或文档要求

## 非目标
这次明确不做什么?

## 风险和停工条件
什么情况下 AI 必须停止并等待人工确认?

这个模板不复杂,但它改变了 AI coding 的协作方式。

任务不再只是“让 AI 帮我改一下”。任务变成了一个可执行、可验证、可停止、可追溯的合同。

这就是 issue-driven AI engineering 的起点。