分流(Triage)
让项目 issue tracker 上的 issues 沿着小型 triage 角色状态机流转。
如果本仓库把外部 pull request 也当作请求入口(参见 issue-tracker 配置),triage 同样覆盖它们:PR 就是附带了代码的 issue——同样的角色、同样的状态、同样的状态机,只是下面标注了几处 "for a PR" 的差异。根据 tracker 配置把裸 #42 解析为 issue 或 PR。
triage 期间发布到 issue tracker 的每条评论或 issue 必须以这段免责声明开头:
> *This was generated by AI during triage.*
参考文档
- AGENT-BRIEF.md — 如何撰写持久的 agent brief
- OUT-OF-SCOPE.md —
.out-of-scope/知识库如何运作
角色
两个 分类(category) 角色:
bug— 某样东西坏了enhancement— 新功能或改进
五个 状态(state) 角色:
needs-triage— 维护者需要评估needs-info— 等待报告者提供更多信息ready-for-agent— 已完整说明,可供 AFK agent 接手ready-for-human— 需要人类实现wontfix— 不会被处理
对于 PR,同样的状态要对照其附带的代码来解读:ready-for-agent 意味着已附上 brief,agent 应对 diff 采取下一步行动;ready-for-human 意味着已准备好由人类合并。
每个经过 triage 的 issue 应恰好携带一个 category 角色和一个 state 角色。如果 state 角色冲突,先标记出来并向维护者询问,再做任何其它事情。
这些是规范角色名——issue tracker 中实际使用的标签字符串可能不同。映射关系应当已经提供给你。如果没有,告诉用户运行 setup-matt-pocock-skills。
状态转换:未打标签的 issue 通常先进入 needs-triage;从那里它移动到 needs-info、ready-for-agent、ready-for-human 或 wontfix。报告者回复后,needs-info 返回 needs-triage。维护者可以随时覆盖——标记看起来不寻常的转换,并在继续之前询问。
调用
维护者调用 triage 并用自然语言描述需求。解读请求并执行。示例:
- "把需要我关注的东西都展示给我"
- "我们看看 #42"(issue 或 PR)
- "把 #42 移到 ready-for-agent"
- "有哪些是 agent 可以认领的?"
展示需要关注的内容
查询 issue tracker,按最旧在前呈现三个桶:
- 未打标签(Unlabeled) — 从未被 triage 过。
needs-triage— 评估进行中。needs-info且自上次 triage 笔记以来报告者有新活动 — 需要重新评估。
当 PR 在范围内时,把外部 PR 纳入这些桶,并为每行标注 [PR] 或 [issue]。发现(discovery)只暴露_外部_PR(tracker 配置定义谁算外部)——协作者进行中的 PR 不是 triage 工作。这个过滤只作用于发现阶段;明确点名的 PR 无论作者是谁都始终会被 triage。
显示每个条目的计数和一行摘要。让维护者挑选。
Triage 一个具体的 issue 或 PR
收集上下文。 通读完整的 issue 或 PR(正文、评论、标签、作者、日期;PR 还要看 diff)。解析任何先前的 triage 笔记,避免重复询问已解决的问题。使用项目的领域词汇表探索代码库,尊重所触及区域的 ADR。对照代码库执行两项检查:(a) 冗余(redundancy)——按领域概念(而不只是请求的措辞)搜索请求的行为是否已有实现,并报告你查找过哪里。如果找到了,它就是一个已实现的
wontfix(第 5 步)。(b) 先前拒绝(prior rejection)——阅读.out-of-scope/*.md,指出任何与本次请求相似的条目。给出建议。 把你的 category 和 state 建议连同理由告诉维护者,并附上与请求相关的简要代码库摘要——包括它是否已实现。等待指示。
验证主张。 在任何 grilling 之前,先核实主张是否成立。对于 bug,按报告者的步骤复现它。对于 PR,确认 diff 确实做了它所声称的事——checkout 它,运行相关测试或命令。报告发生了什么:已确认(附代码路径)、失败,或细节不足(一个强烈的
needs-info信号)。确认过的验证能形成强得多的 agent brief。Grill(如需要)。 如果请求需要充实,调用 skill tool 两次,分别使用 "grilling" 和 "domain-modeling"——一轮一轮地把它追问成可用的形状,随着决策落地同步打磨领域术语并更新
CONTEXT.md/ADR。应用结果:
ready-for-agent— 发布 agent brief 评论(AGENT-BRIEF.md)。ready-for-human— 与 agent brief 结构相同,但注明为什么不能委派(需要判断、外部访问、设计决策、人工测试)。needs-info— 发布 triage 笔记(模板见下)。wontfix— 关闭,评论内容取决于_原因_:- 已实现 — 该改动已存在于代码库中。指出它在哪里;不要写入
.out-of-scope/(那个知识库存的是_被拒绝_的请求,不是已构建的)。 - 被拒绝(bug) — 礼貌解释,然后关闭。
- 被拒绝(enhancement) — 写入
.out-of-scope/,在评论中链接它,然后关闭(OUT-OF-SCOPE.md)。
- 已实现 — 该改动已存在于代码库中。指出它在哪里;不要写入
needs-triage— 应用该角色。如果有部分进展,可选地评论。
快速状态覆盖
如果维护者说"把 #42 移到 ready-for-agent",信任他们并直接应用该角色。确认你将要做的事(角色变更、评论、关闭),然后执行。跳过 grilling。如果在没有 grilling 会话的情况下移动到 ready-for-agent,询问他们是否想写一份 agent brief。
Needs-info 模板
## Triage Notes
**What we've established so far:**
- point 1
- point 2
**What we still need from you (@reporter):**
- question 1
- question 2
把 grilling 期间解决的所有内容记录在 "established so far" 下,以免工作丢失。问题必须具体且可操作,而不是"请提供更多信息"。
恢复之前的会话
如果 issue 或 PR 上已有先前的 triage 笔记,阅读它们,检查报告者是否回答了任何未决问题,并在继续之前呈现更新后的图景。不要重复询问已解决的问题。