Turn
issue 追踪器通常只有一条轴:状态。Backlog、Todo、In Progress、Done,从左到右像一条时间线。人组成的团队一直是这么用的。
当大部分步骤由 AI 助手来做,时间线就不再是你真正关心的问题。一个 feature 先交给写代码的 agent,再交给审代码的 agent,然后到你这里审 PR,然后由 agent 部署到 staging,再回到你这里确认,然后又交给 agent。步骤每小时都在变。早上九点你想知道的事其实很简单:有没有什么在等我?
Bonsai 用第二条轴来回答它。
现在到哪一步。 看板按 Turn 分列,Issue 类型 按四个 Turn 列出状态,自动推进 在 issue 进到轮到 agent 的状态时自动派出角色,到了你的 Turn 就停下来等你。
四个 Turn
任何时候,一篇 issue 都恰好处在四个 Turn 中的一个:
| Turn | 含义 |
|---|---|
| Todo | 没有人在动它:在排队,或者被项目之外的事卡住 |
| Agent’s turn | 有 agent 在做,或者现在就该派一个 |
| Your turn | 在等人 |
| Closed | 没有人需要再看它 |
Turn 是 Bonsai 内置的。四个不能改名,也不能加第五个。这是有意的:看板、派发器和每个 agent 都靠这同样的四个词表达同样的意思。
Turn 说的是轮到谁,不是一个工作单位。Codex 这类编码 agent 把会话里的一次执行叫 “turn”,Bonsai 不这么用这个词。agent 在一篇 issue 上被派一次叫 run,review 走一遍叫 round(第几轮)。run 发生在 agent 的 turn 里;一个 round 可能跨过 agent 的 turn 和你的 turn。
状态由你定
每个 Turn 下面是状态,状态由你来定义。一个状态是流程里的一步;它所属的 Turn 说的是这一步球在谁手里。内置的 Feature 类型是这样的:
| Turn | 状态 |
|---|---|
| Todo | Backlog、Blocked、Ready |
| Agent’s turn | Developing、Reviewing、Revising、Deploying to Staging、Deploying to Production |
| Your turn | Review PR、Verify Staging、Needs Decision |
| Closed | Done、Canceled、Duplicate |
把一个 feature 的一生按顺序读一遍,Turn 来回翻转:
Ready → Developing → Reviewing → Review PR → Deploying to Staging → Verify Staging → Deploying to Production → Done
粗体是 agent 的回合,斜体是你的。这种来回跳是和 agent 一起工作的常态,不是例外。Turn 这条轴让它一眼能看清。
一个状态只属于一个 Turn,所以「该谁动」从来不含糊:
- Agent’s turn 里的状态在 issue 类型里有一行 Automation:issue 到了,这一行说派哪个角色。
- Your turn 里的状态没有行。你不动它,什么都不会跑。
- Todo 里的状态在等调度:依赖做完、有空闲的机器,或者外面的阻碍解除。
- 自动化从不把 issue 挪进 Closed。收尾是人的动作。
和 Issue 类型 里的状态一样,名字随你起。Bug 可以把第一个状态叫 Triage,用 Won’t Fix 收尾;下面的四个 Turn 不变。
看板
issue 看板按 Turn 分组,Your turn 是最左边那一列。打开一个项目,第一眼看到的就是在等你的事。下一列是 agent 此刻在做的事。然后才是 Todo 和 Closed。
同一列里,每张卡片仍然显示它的状态,所以 Review PR 和 Verify Staging 并排在 Your turn 下面,一眼能分清。
为什么是内置的轴
我们试过让五个大类来承担这件事。做不到,因为大类描述的是 issue 在时间线上的位置,而时间线已经说不清该谁动。审代码的 agent 和审 PR 的人在时间线上都是「进行中」,在 Turn 上却是相反的两边。
Turn 固定不变,也让所有项目、所有类型、所有 agent 共用同一套词。角色笔记里写一句「做完交回给人」,含义只有一种:把 issue 改到 Your turn 里的某个状态。
下一步:Issue 类型 讲一种类型怎么列出它的状态,以及 Agent’s turn 里的每个状态派哪个角色。