大多数 AI 编码工具都围绕提示词打转。你描述想要什么,智能体回答,交流结束。这套做法一直有效,直到某一刻——真正有价值的不再是一个好答案,而是同一件工作可靠地、每一次都发生,且不需要任何人记得开口。
TaskGoblin 转而围绕循环来构建。
循环 = 触发器 + 指令
这就是整个原语。
- 触发器决定哥布林何时醒来。它要么是事件——拉取请求被打开、issue 被指派给哥布林——要么是计划:每个工作日 07:00。
- 指令是自然语言,描述醒来后做什么。"审查这个合并请求的正确性与安全性——指出真正的问题,而不是 linter 就能抓到的风格细节。" 或者:"检查
acme/web中安全的依赖升级,跑一遍测试,然后打开合并请求。"
把两者放在一起,你拥有的就不再是一次请求,而是一项常驻能力。没有人需要守在键盘前,也没有人需要记得。
一切都是循环
这不是摆在产品旁边的一个功能——它就是产品。那些你会以为是内置魔法的行为,都是普普通通的循环:
| 从外面看到的样子 | 底下的循环 |
|---|---|
| 每个拉取请求都被审查 | 拉取请求打开 上的事件循环 |
| 指派一个 issue,拿回一个合并请求 | issue 被指派 上的事件循环 |
| 依赖无需开工单就保持更新 | 每周一 08:00 的计划循环 |
| 文档从不与代码脱节 | 每周三的计划循环 |
| 每天早上 Slack 收到一份动态摘要 | 09:00 的计划循环 |
当你连接 GitLab 或 GitHub 时,TaskGoblin 会给你装上一套起步循环——这就是为什么代码审查在你还没配置任何东西之前就开始工作了。它们并不特殊:打开它们,读指令,用你自己的话改写,暂停,或者删掉。
循环的一轮
每一轮的运行方式都一样,无论触发它的是 webhook 还是时钟,也无论这是第一轮还是第五百轮:
- 触发。 触发器匹配。TaskGoblin 为这件工作打开——或复用——一个线程。
- 上下文。 在动任何东西之前,哥布林会读 issue、线程、diff、你组织的约定,以及此前哥布林留下的笔记。
- 工作。 它在一个装有你仓库检出的隔离云端沙箱里运行:读文件、改文件、跑命令和测试。
- 交付。 它打开合并请求、留下行内审查评论,或在线程里回复——工作该去哪儿就去哪儿。
- 交接。 它写下学到了什么、还有什么悬而未决,好让下一轮从那里开始,而不是从零开始。
第 5 步正是循环与定时任务的分野。每一轮都被之前的轮次所塑造:一个连跑一年的每周循环,不是同一个循环重复了一百次,而是一个一直在留意的循环。
循环为什么胜过提示词
- 它不需要你在场。 你去看的时候工作已经做完了,而不是等着有人注意到该做了。
- 它可审查。 每一轮都以分支和合并请求收尾,像审查同事一样审查。没有东西会自己合并。
- 它会累积。 纠正哥布林一次,这条纠正就为之后每一个哥布林写了下来。
- 它有开关。 循环是属于你的一行记录。暂停它,行为立刻停止。
循环住在哪里
在你组织的 Loops 区域管理它们(/{organisation}/loops)。每个循环都有自己的页面:指令、触发器、启用开关,以及最近运行的历史——这样你能看到它到底做了什么,而不是靠猜它有没有触发。
哥布林也能在运行途中自己创建循环。一个注意到你每周五都提同样要求的哥布林,可以主动提议那个让你不必再提的循环。
接下来去哪
- 事件循环 — 由拉取请求、被指派的 issue 或标签触发的循环,以及你已经拥有的那些。
- 计划循环 — 按周期触发的循环,以及可以起步的模板。
- 临时运行 — 那些不是循环的直接请求,以及如何判断哪一个想变成循环。
- 一次运行是如何工作的 — 单独一轮里发生了什么。