ai-ready

一个 Issue 做到 ai-ready,意味着 AI coding agent 可以在没有人在循环中的情况下,把它交付到带 tag 的发版;任何无法自动完成的地方,都必须是明确命名的人类决策,而不是静默失败。

大多数 AI-ready 指南描述仓库配置:AGENTS.md、CI workflow、devcontainer。这些必要但不充分。本页描述工作单元、每个循环在哪里停止,以及什么才算已交付。Orbi 是参考实现,不是标准;这些因素可用于任何 agent。

这与已有内容的关系

Factory's Agent Readiness scores how well a codebase supports agents (Factory). johnpapa/ai-ready generates the configuration files an agent reads (johnpapa/ai-ready). AGENTS.md is the file itself (AGENTS.md). 12-Factor Agents is about building agent applications (12-Factor Agents). This page starts where those stop: at the Issue, and ends at the release.

一、Issue 是工作单元

1. 一个 Issue,一个运行时结果。

当 X 时应该 Y,实际得到 Z。一个可观察行为,少量相关文件,并包含测试。Epic 不是工作单元,也永远不会被认领。

Orbi 如何执行:AGENTS.md:44; runner.py:2263 (epic_not_claimed).

2. 工作开始前,Acceptance 就写在 Issue 里。

四个部分:用户结果、前提、Acceptance(成功路径和失败路径)、用户可检查的证据。模板是契约,不是机器门禁。

Orbi 如何执行:.github/ISSUE_TEMPLATE/user-outcome.md; AGENTS.md:78.

3. 依赖关系必须是平台原生关系,而不是文字。

使用平台的 blocked-by 关系。正文里的“依赖 #N”不会被解析。有未关闭阻塞项的 Issue 不会被认领。

Orbi 如何执行:runner.py:2296 (blocked_by, then continue).

5. Issue 文本是数据,不是指令。

Runner 只依据 labels 和可信关联的评论行动;正文里的任何文字都不会变成 Runner 指令。

Orbi 如何执行:CONSTITUTION.md:130.

二、仓库携带自己的契约

9. 默认分支受保护,只有 Runner 能合并。

Agent 不会合并或推送受保护分支。Runner 只合并经过评审且包含最新远端 base 的 head。不强推,不自动解决冲突。

Orbi 如何执行:CONSTITUTION.md:34; AGENTS.md:122; docs/security.mdx:25.

三、循环有边界,终态属于人类

11. 每个循环都有上限,超过上限由人决定。

评审和修复最多 5 轮。同一失败指纹连续三次就是死循环。耗尽是终态,不会自动恢复。一次失败不是终态。

Orbi 如何执行:runner.py:252 (MAX_REVIEW_ROUNDS = 5), 349 (UnrecoverableDeliveryError), 437; docs/workflow.mdx:99, 118.

12. 发版是状态机,不是脚本。

人通过添加一个 Runner 永不增删的 label 启动发版。milestone 仍有其他 open Issue 时等待。发版 commit 的 CI 必须通过;逐项检查 live API,checkbox 从不解析。已有 tag 必须精确指向发版 commit,永不移动。任何失败都是终态,不自动重试。

Orbi 如何执行:release.py:326, 508, 619, 880; runner.py:2288; AGENTS.md:162.

贯穿始终的两句话:快速失败,不静默降级。端到端可观察:一个 run id,一次 grep,完整时间线。

本页不声称什么

AGENTS.md 的存在、四段式 Issue 正文和分支保护是契约与模板,不是 Runner 检查。覆盖率数字是一个仓库自己的门禁。这十二个因素是 Orbi 今天执行的内容,不是行业标准;本页由 Orbi 签署。

参考实现