分诊
它的作用¶
triage 会处理你项目跟踪器中的工单。它让每个工单经过一个由 分诊角色(一个类别角色和一个状态角色)组成的小型状态机。每个工单最终会成为一份代理就绪简报、一个向报告者提出的具体问题,或一个已关闭且记录了原因的工单。
它只适用于你没有创建的工单。也就是说,原始的 bug 报告、传入的功能请求,或一个不请自来的外部 pull request:这些工作从外部进入跟踪器,无论报告者留下时是什么形态。来自 to-tickets 的 工单 已经是代理就绪的,因此如果你对它们运行 triage,就会浪费已有工作。规则很简单:/triage 只用于传入的工单,而不是你自己创建的工单。
它也与手动打标签不同,因为它会给出建议,然后等待。它会给出它的类别和状态判断及理由,外加它在代码库中发现的内容,并且在你指示之前不会应用任何内容。
何时使用¶
你通过输入 /triage 来调用它,然后用自然语言描述你想要什么。代理 不会主动使用它。示例:“给我看任何需要我关注的内容”、“我们来看看 #42”、“把 #42 移到 ready-for-agent”。
| 你拥有什么 | 去哪里 |
|---|---|
| 跟踪器里满是来自其他人的原始报告 | /triage |
| 你自己的粗略想法,还没有写下来 | grill-with-docs |
| 一场已经谈妥的对话,要转成一份 规格说明 | to-spec |
| 一份要拆分成代理就绪工单的规格说明 | to-tickets |
| 一个已确认的 bug,需要根本原因,而不是标签 | diagnosing-bugs |
前置条件¶
triage 会读取和写入你的工单跟踪器,因此 setup-matt-pocock-skills 必须先配置该跟踪器及其标签词汇表。下面的角色名称是规范的。你跟踪器中的标签字符串可能不同,而 setup 会提供映射。如果你的跟踪器已经精确使用规范名称,则你无需映射,也无需设置。
跟踪器配置还会决定外部 pull request 是否算作请求入口,以及谁算作外部。该标志默认关闭,且 setup 不再询问它。要将 PR 纳入范围,请在 docs/agents/issue-tracker.md 中将其打开。
状态机¶
每个经过分诊的条目最终都恰好拥有一个类别角色和一个状态角色。有两个类别:bug(某处坏了)和 enhancement(新功能或改进)。有五个状态:
| 状态 | 含义 |
|---|---|
needs-triage |
你需要评估它。未打标签的工单通常首先落在这里。 |
needs-info |
等待报告者回复。他们回复后会返回 needs-triage。 |
ready-for-agent |
已完整指定,并附带一份代理简报。一个 AFK 代理可以接手它。 |
ready-for-human |
同一份简报,外加为什么代理无法处理它:判断、外部访问、手动测试。 |
wontfix |
已关闭,并记录了原因。 |
这就是全部词汇。每个条目恰好一个状态角色的规则让查询保持简单。状态也是 技能 中最常被请求的领域。用户曾请求一个用于已指定但被另一个工单阻塞的工作的状态、一个用于等待未来触发器的工作的 deferred 状态,以及一个终态 implemented 状态。这些都没有发布。见下文的问题。
wontfix 有三种情况。区别很重要,因为其中只有一种会写入知识库:
| 你关闭它的原因 | 会发生什么 |
|---|---|
| 已实现 | 一条指向该功能已存在位置的评论。不会有任何内容进入 .out-of-scope/,因为它是已构建的功能,而不是被拒绝的功能,而且那里的文件会破坏去重检查。 |
| 被拒绝的 bug | 礼貌地解释,然后关闭。 |
| 被拒绝的 enhancement | 在 .out-of-scope/ 中创建一个文件,从关闭评论中链接到它,然后关闭。 |
.out-of-scope/ 为每个被拒绝的概念保存一个 markdown 文件,而不是为每个工单保存一个。每个文件都是一份简短的设计文档,而不是数据库行。它说明被拒绝的是什么、为什么,并列出所有提出该请求的工单。triage 在评估任何内容之前会读取整个目录。它按概念匹配,而不是按关键词匹配,因此 “夜间主题” 会匹配 dark-mode.md。当它找到匹配项时,它会向你展示旧决定,并询问你是否仍然同意,而不是从头再次争论该请求。
在生成简报前进行验证¶
在任何 追问 之前,triage 会检查该声明是否成立。对于 bug,它会按照报告者的步骤复现它。对于 PR,它会检出分支并运行相关测试。然后它会报告三种结果之一:
- 已确认,并附带代码路径。
- 无法复现。
- 细节不足以尝试。这是最强的
needs-info信号。
在同一轮中,它会针对代码库运行另外两项检查。冗余检查会询问该功能是否已实现,并按领域概念搜索,而不是按报告者的措辞搜索。先前拒绝检查会询问 .out-of-scope/ 是否已经表示拒绝。这两项检查都很廉价,任一命中都会产生 wontfix。
所有这些工作都让一种产物变得有价值:代理简报。这是 triage 在工单移动到 ready-for-agent 时发布的结构化评论。在 triage 发布它之后,简报就是契约,而原始报告只是上下文。简报是持久的而非精确的,因为一个工单可能在代码变化期间停留在 ready-for-agent 数周。因此,简报会指明类型、签名和行为契约,而从不指明文件路径或行号。已确认的复现比猜测能形成强得多的简报。
PR 是附带了代码的 issue¶
如果跟踪器将外部拉取请求视为请求入口,它们会经过同一套机制,使用相同的类别、状态和转换。这些状态适用于 diff。ready-for-agent 表示已附带简报,并且代理应对代码采取下一步行动。ready-for-human 表示可以有人来合并它。PR 上的简报描述的是对现有 diff 还需做些什么,而不是如何从零开始构建它。
Discovery 只显示外部 PR,因为协作者进行中的分支不属于 triage 工作。这个筛选仅适用于 discovery。如果你明确指定某个 PR,无论作者是谁,triage 都会处理它。
常见问题¶
我运行了 /to-spec 和 /to-tickets,现在那些工单就那样放着,处于未 triage 状态。我需要再对它们运行 /triage 吗?
不需要。它们已经是可供代理接手的了。to-tickets 在发布这些工单时会应用 ready-for-agent 标签,因此 AFK runner 无需再经过一轮就会接手它们。遇到这个问题的用户当时运行了 spec 流程,并在输出中看到了 needs-triage,而他们的 AFK runner 忽略了所有内容。triage 是来自外部工作的入口。spec 流程是你自己启动的工作的通道。两者在 ready-for-agent 处汇合,而不是在此之前。
现在既然有了 to-spec → to-tickets → implement 流程,triage 还有用吗?
只有当你有外部进来的工作才需要。triage 比那个流程更早,而且职责不同:它负责处理其他人提交的报告。如果你的跟踪器里所有内容都来自你自己的规划,你很少会用到它。如果你维护任何公开项目,或者你的团队会给你提交 bug,那么这个工作就从这里开始。它的主要用途是接纳外部贡献者提交 issue 的开源仓库。
代理尝试应用 ready-for-agent,但 gh 提示该标签不存在。
这是一个已知的未修复 bug(#616)。setup-matt-pocock-skills 会把标签词汇写入 docs/agents/triage-labels.md,但不会在你的跟踪器中创建这些标签。请自行用 gh label create 或跟踪器的 UI 一次性创建五个状态标签和两个类别标签,错误就会消失。该 issue 链接到了一个尚未合并的社区修复分支。
五个状态不够用。那 blocked、deferred 或 implemented 呢? 这是关于该技能收到反馈最多的缺口。它有三种形式:
- 一个已被完整定义,但需要等另一个 issue 关闭的 issue(#139)。报告者说,在这种情况下
ready-for-agent“技术上没错”但具有误导性,因此代理会接手它然后卡住。 - 打算做但需要等待触发条件的未来工作,因此目前还不可执行(#297)。
- 一个用于“已实现,等待验证”的终态。如果没有它,AFK runner 可能会把已经完成的工单再次加入队列。
blocked 这种情况被认可为真实存在,但名称尚未确定(blocked 还是 paused)。这些功能都尚未发布。作为变通方案,人们会在类别标签旁额外添加一个仓库本地的标签。这样状态位就保存了一个准确的值,但该技能并不知道这个额外标签。一个社区 fork 走得更远,增加了 needs-slicing、tracking 和工作量标签。这确实有效,但它属于那个 fork,而不是这个技能。
这和 /diagnosing-bugs 有什么不同?
这里的验证步骤是刻意保持浅层的。它回答的是“这是否真实,以及大致位于哪里”,而不会寻找根本原因。如果按照报告者的步骤几分钟内无法复现 bug,请使用 needs-info;如果你现在就想调查,可以使用 diagnosing-bugs。目前这两个技能的文档都没有提到对方。有用户反馈了这个缺口,目前仍未解决。
我能让它指向我整个 backlog 然后运行吗?
你可以这样要求,但要注意它会读取什么。“显示需要关注的内容”这一步只是一个用于选择的低成本列表。你选择一个 issue,然后 triage 会收集该 issue 的完整上下文。如果你让它一次性处理二十个 issue,代理可能会把那个低成本列表当作唯一证据,而不会告诉你。该列表返回 issue 正文,但不返回评论。恰好有一位用户遇到过这种情况。有三个 issue 的评论里已经写着“已修复,建议关闭”,但这三个 issue 却都生成了新的代理简报。如果要批量处理,请明确说明它必须阅读每个 issue 的评论。
它能与 Linear 或除 GitHub Issues 以外的其他工具一起使用吗?
可以。跟踪器是配置项,而不是硬编码的假设。人们会针对 Linear(通过 linear CLI)、GitLab,以及 .scratch/ 目录下的纯 markdown 文件运行它。一种常见的分工是:Linear 用于 issue 和规划,GitHub 用于代码和 PR。那么,提到“issue tracker”的技能就映射到 Linear,提到“PR”的技能就映射到 GitHub。本地 markdown 跟踪器有一个未修复的模板 bug:生成的文件可能包含两遍验收标准,一次在顶层,一次在代理简报内部(#200)。
它正常工作的表现¶
- 它处理的每个条目最终都恰好有一个类别角色和一个状态角色,绝不会为零,也绝不会出现两个相互冲突的状态。
- 它会给出带有理由的建议然后停止,而不会给 issue 重新打上标签就继续处理。
- 在一切进入
ready-for-agent之前,它就已经复现了 bug,或者检出并运行了 PR。 - 它写出的简报会指明类型和行为,并且不包含文件路径和行号。
- 当你六个月前拒绝的请求再次出现时,它会告诉你并引用当时的理由,而不是重新进行 triage。
- 它发布的每条评论都以
> *This was generated by AI during triage.*开头。
它适用于哪里¶
triage 是一个入口,而不是主链路中的一步。主流程从你产生的一个想法开始(grill、spec、tickets、implement、review)。triage 是面向来自他人工作的并行通道。两条通道最终都在同一处汇合:一个带有 ready-for-agent 标签并附有简报的 issue。implement 会用与接收来自 to-tickets 的工单相同的方式接手它。当某个请求需要更多细节,triage 才能为其编写简报时,triage 会同时运行 grilling 和 domain-modeling,一次只问一轮问题,从而在做出决策时将它们记录到 GLOSSARY.md 和 ADR 中。当你不确定自己处于哪条通道时,ask-matt 会为你指路。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 skills13/skills