事件循环在你已连接的工具里发生某件事时触发。没有周期设置,没有指派仪式,也没有人输入提示词:拉取请求刚打开,审查就已经在进行,快到还没人来得及切换标签页。
它的指令是叠加在事件本身之上的常驻指引。哥布林会自动拿到那个合并请求或 issue 作为上下文;你的指令告诉它,你希望针对它做什么。
可以用来触发循环的事件
| 事件 | 来源 | 触发时机 |
|---|---|---|
| 合并请求打开 | GitLab | MR 被打开、重新打开,或推入新提交后更新 |
| Issue 被指派 | GitLab | issue 被指派给 @taskgoblin 机器人 |
| 拉取请求打开 | GitHub | PR 被打开、重新打开,或推入新提交后更新 |
| Issue 被打标签 | GitHub | issue 被加上 taskgoblin 标签 |
| Issue 被指派 | Linear | issue 被指派给 TaskGoblin 智能体 |
| Issue 被指派 | Jira | issue 被指派给 TaskGoblin 账号 |
因为"打开"类事件也涵盖更新,所以审查循环是在对账而不是重复:第二轮它会读取上次留下的问题,把你已经修好的标记为已解决,只发布真正新增的内容。
你已经拥有的循环
你不是从一张白纸开始。某个提供商刚在你的组织里存在,TaskGoblin 就会安装它的默认循环:
- GitLab — 审查合并请求 与 处理被指派的 issue。
- GitHub — 审查拉取请求 与 处理被打标签的 issue。
- Linear — 处理被指派的 issue。
- Jira — 处理被指派的 issue。
它们复刻了人们对一个开箱即用的编码智能体的期待。区别在于:它们是你的——你 Loops 页面上真实存在的循环,指令你都能读、都能改。
安装只会发生一次,永远只有一次。删掉一个默认循环,它就是删掉了——重新连接提供商也不会悄悄把它带回来。
改写指令,正是重点所在
默认的审查指令要求关注正确性、安全性与可维护性,并告诉哥布林:改动稳妥时就闭嘴。这是一个合理的起点,而不是你必须忍受的政策。团队通常会收紧或放宽它:
- "只指出安全问题和数据丢失风险。其他都不要说。"
- "对测试覆盖要严格——任何行为变更都需要测试,缺了就说出来。"
- "另外检查新增的接口是否都走了我们的限流中间件。"
指令是自由文本,所以它能编码 linter 编码不了的东西:你们的约定、你们过去的事故、这个团队反复犯的那个错。
默认版本,以及它的强化版
这是随产品附带的版本:
审查这个合并请求。关注正确性、安全性与可维护性——指出真正的问题,而不是 linter 就能抓到的风格细节。只在真正有价值的地方留行内评论,保持具体且可执行,改动稳妥时保持沉默。
它刻意克制,因为一个什么都要评论的审查者最后会被静音。而这是同一个循环,在某个团队用了一个月并经历过一次事故之后的样子:
审查这个合并请求的正确性、安全性与可维护性。指出真正的问题,而不是风格细节。
另外始终检查:每个行为变更都有测试;新接口不得绕过我们的限流中间件;不得修改已存在的迁移文件;不得记录完整请求体。即使改动其余部分没问题,这些也要按严重级别提出。
如果 MR 超过 400 行,在摘要里说明,并优先审查风险最高的文件,而不是通篇略读。改动稳妥时保持沉默。
第二个版本没有任何花哨之处——它是原本躺在没人打开的 wiki 里的组织知识,现在被贴到了它真正起作用的那一刻。这就是"继承来的循环"和"属于你的循环"之间的差别。
关闭开关
这一段值得读两遍,因为它解释的行为否则看起来就像 bug。
一个受循环管辖的事件,如果没有匹配的活跃循环,就不会启动任何运行。 暂停你的审查循环,合并请求就不再被审查。删掉它也一样。TaskGoblin 仍然接收 webhook——它只是没有可依据的常驻指令,所以没有哥布林被唤醒,也不产生任何费用。
这就是"行为归你所有"而不是"被施加于你"所要付的代价。如果自动审查停了,第一个要看的地方就是它的循环是否还处于活跃状态。
永远不受循环管辖的部分
明确的人类请求总会执行,无论是否存在循环:
- 在合并请求、拉取请求或 issue 评论中
@taskgoblin - 在 Slack 或 Microsoft Teams 中的消息或提及
- 在哥布林已在处理的 Linear issue 上的后续评论
- 在 Jira issue 评论中的提及
- 回复
@taskgoblin fix到它自己留下的某条审查评论
只要是人直接开口问的,哥布林就会回答。循环管的是没人开口的那部分工作,也仅限于此。
当多个循环同时匹配
没有什么阻止你在同一个事件上跑多个循环——比如一个通用审查循环,加一个更严格的安全循环。当一个事件匹配到多个时,哥布林会看到全部候选指令并判断哪个适用,并把这个选择记录在本次运行上,让历史保持诚实。工作仍然只发生一次:循环不会在同一个合并请求上繁殖出重复的审查。