博客

AI 智能体任务管理:把认领循环做成契约,而不是提示词

如何用服务器强制执行的认领循环管理 AI 智能体的任务:租约、心跳、提问、回执,以及对人的注意力设上限。

Weft 是为独立创业者和小团队打造的 AI 任务管理工具。

全部文章

作者: Andrei Finogeev ·

AI 智能体任务管理要想行得通,循环得归看板管,而不是归提示词管:智能体先问该做什么,用一个沉默就会过期的租约认领一个任务,只在真正该由人拍板的事上找人,最后交上一张别人能核查的回执。在 Weft 里,每一步都是服务器会检查的 MCP 工具,所以跳过某一步的智能体会被拒绝或丢掉任务,而不是悄无声息地和实际状态脱节。

Weft 是我们做的。关于其他产品的事实来自它们的官方页面,核对于 2026年10月27日。

为什么粘贴进对话里的任务清单会失灵?

把任务粘贴进对话,是每个人首先会尝试的办法,而且能管用一个下午。然后对话结束了,状态也跟着没了。智能体本来知道哪一项做完了、哪一项放弃了、哪里拿不准。现在没人知道了。

粘贴清单的那个人变成了中转站:把结果抄回真正的看板,还得返工第二个会话接走的活,因为没有任何东西表明那个活已经有人在做。

能访问看板解决了快照问题,但解决不了其余的问题。如果工具只有“移动卡片”和“添加评论”,循环就仍然依赖智能体遵守写在指令里的约定。而约定恰恰会在出问题时失效:智能体运行到一半崩溃,或者两个智能体在同一时刻开工。

作为契约的认领循环是什么样的?

在 Weft 里,循环有五步,每一步都是同一个 MCP 端点 https://letsweft.com/api/mcp 上的独立工具。服务器在各步之间保存状态,所以任何一次对话结束,循环都还在。

  1. get_my_work:先问再选。答复包括这个客户端已经持有的任务、在等人处理的事、已逾期或即将到期的事,以及到底还有没有余量开始新任务。
  2. start_task:带租约认领。认领持续 20 分钟,并把任务移到 Doing。响应里带有 runId、leaseToken 和 renewEverySeconds: 300。第二个尝试同一任务的客户端会收到 already_claimed,并被提示不要重复劳动。
  3. report_progress:心跳。每次带着 run id 和租约令牌调用,都会续租。如果智能体挂了,心跳就停了,20 分钟后这次运行会被标记为过期,任务回到未分配状态,谁都可以接。丢失的租约会返回 lease_lost,让智能体知道这活已经不归它了。
  4. request_input:只用于该由人做的决定。一个最多 500 字符的问题,最多 10 个选项。智能体等待期间,认领保持不变。
  5. complete_task:带回执完成。outcome、artifacts(URL、提交或文件哈希这类证据)、notDone、unknowns 和 nextStep。

为什么用租约而不是状态?因为沉默是崩溃的智能体唯一能发出的信号。Doing 里的一张卡片只说明曾经有人在做它。租约说明现在有人在做,而当这不再属实时,它会自己停止这么说。

认领本身是一次由唯一索引把关的数据库插入。两个智能体争抢时,由数据库裁定谁赢,所以两边不可能都拿到任务。相比之下,相隔一秒发出的两条“已认领”评论,都是合法的评论。

智能体什么时候该调用 request_input?

当它碰到只有人才能决定的事时:钱、发布、生产环境、法律这类不可逆的事,或者没有合理默认值的真正岔路。而不是为了征求能否继续的许可。

这种克制很重要,因为一个问题占用的注意力和一个完成的任务一样多,在 Weft 里它也计入同一个上限。问题会进入收件箱,同时有手机推送;等待 20 分钟及以上的项目还会有邮件提醒。Weft 从不主动回调智能体:答案会在它下一次调用 start_task 或 get_my_work 时送达。问题未关闭期间,智能体保留任务 60 分钟;之后租约失效,但问题仍在。

complete_task 调用里该写什么?

一个简短的结果、证据,以及对边界情况的如实交代。下面是一个修复缺陷时的真实示例:

{
  "id": "9b2f6c1e-4d7a-4c3b-8e21-5a0f3d9c7b14",
  "runId": "d41e8a90-2f6b-4e17-9c3a-71b5e0a4c8f2",
  "leaseToken": "lt_3f9a…",
  "outcome": "Fixed the 500 on /api/invoices when the customer has no billing address. Fix is in PR #418; the route now returns 422 with a field error.",
  "artifacts": [
    { "kind": "url", "uri": "https://github.com/acme/app/pull/418" },
    { "kind": "commit", "uri": "a1c9e07" },
    { "kind": "url", "uri": "https://preview-418.acme.dev/api/invoices/health", "httpStatus": 200 }
  ],
  "claims": [
    "Added a test for an empty billing address; the invoices test file passes locally"
  ],
  "notDone": [
    "Did not merge the PR",
    "Did not backfill the 14 invoices that failed last week"
  ],
  "unknowns": [
    "Whether the mobile app shows the 422 message or a generic error"
  ],
  "nextStep": "Merge PR #418 to main"
}

产物是人不必轻信智能体就能自己核查的东西。notDone 和 unknowns 不是认错;它们区分了一个你能依赖的结果和一个你得从 diff 里重新推敲的结果。这个调用永远不会因为缺少证据而失败,因为丢掉已完成的工作,比把它记成未经验证更糟。怎么读这些回执,详见我的 AI 智能体到底做了什么。

这和移动卡片、发条评论有什么不同?

Hypertask 关于同一个循环的指南(认领、更新、汇报、关闭)很好地描述了这个习惯。它的 MCP 版认领是:载入任务,把它移到进行中的分区,再发一条认领评论,全靠团队写进智能体指令里的提示词来引导。下面逐步对比同一个循环:

循环步骤只靠约定的看板(智能体移动卡片并评论)Weft 强制执行什么,用哪个 MCP 工具
挑活智能体列出任务然后自己选。没有任何东西告诉它,人已经被审阅淹没了。get_my_work 返回这个客户端已经持有的任务、在等人处理的事、已逾期的事,以及还有没有余量开始新任务。
认领把卡片移到 Doing,发一条“已认领”。两个智能体可能在同一时刻这么做,并且都以为任务归自己。start_task 用一次由唯一索引把关的数据库写入拿到 20 分钟租约。输的一方收到 already_claimed,附带任务 id 和标题。
保持存活进度评论——如果智能体记得发的话。崩溃的智能体会让卡片无限期地留在 Doing。report_progress 续租(智能体被告知每 5 分钟一次)。沉默 20 分钟后,这次运行被标记为过期,任务重新空出来。
提问一条“受阻:”评论。智能体要么停下要么瞎猜;卡片可能看起来还在进行中。request_input 把一个最多 10 个选项的问题放进对方的收件箱,并保留认领(挂起期间 60 分钟)。答案通过 start_task 或 get_my_work 传回来。
汇报一条自由文本的最终评论。它长什么样,取决于提示词写得有多好。complete_task 接收具名字段:outcome、artifacts、notDone、unknowns、nextStep。
关闭或审阅智能体按提示词说的,把卡片移到 Review 或 Done。默认情况下任务进 Done。当任务需要审阅或验证检查没通过时,它会停在收件箱里,等待“接受 / 返工 / 以后再说 / 放弃”。
过载什么都不发生。智能体不停开新活,Review 列越来越长。一旦有 5 项(单人)或 10 项(团队)在等人,或审阅量达到 45 分钟,start_task 就会用 attention_queue_full 拒绝。

对 Hypertask 公平地说:它确实有真正的租约。它的文档列出了租约认领、心跳和释放的端点,它的“已知限制”表格写明,任务租约、证据和升级请求只作为 REST 端点提供,有意为之(Hypertask MCP 概览)。它的工具参考里,21 个 MCP 工具中没有租约工具(工具参考)。它的 CLI 也能认领,作为一个可选命令(更新日志、CLI 参考)。所以 Hypertask 上用脚本驱动的智能体可以持有租约;而在 Claude Code 或 Cursor 里通过 MCP 工作的智能体,除非有人把 REST 调用接进去,拿到的就是“卡片加评论”的版本。

如果你的智能体以脚本和 CI 任务的形式运行,Hypertask 的 CLI 和 REST API 是实打实的优势,而 Weft 两者都没有:没有 CLI,没有公开的 REST API,没有 webhook。Weft 是给那些待在 MCP 客户端里、需要循环在那里站得住的智能体用的。

人看到的是什么?

大多数时候,是 Done 里的一张卡片:默认情况下,完成的任务会带着结果和证据直接进到那里。

当任务被标记为需要审阅,或验证检查没通过时,它会停在对方的收件箱里。在那里,人从四个答复中选一个:

  • 接受:工作成立。如果智能体传了 nextStep,人会在按钮上方看到它(“如果你接受,智能体会……”),而接受批准的恰好就是这一步,不多不少。批准有效期 72 小时,会通过 get_my_work 或 start_task 回到智能体那里。
  • 返工:退回去,附一条说明哪里不对的备注。
  • 以后再说:现在不做。放弃:不再做这件事。

收件箱在网页上,有东西进来时,人还会在 Weft 手机应用上收到推送。nextStep 这道握手,能防止智能体把“看着没问题”当成合并、部署、发送的许可:它只能做那一个被批准的步骤,然后再次完成任务。

为什么要拒绝智能体,而不是让它开更多活?

因为稀缺的是注意力,不是工作。一个人审阅一件事的时间里,智能体能开十件。

Weft 统计的是在等人处理的东西:等待审阅的任务加上未关闭的问题。当单人工作区达到 5 项、团队达到 10 项,或预估审阅时间达到约 45 分钟(以先到者为准)时,start_task 会用 attention_queue_full 拒绝。这个上限取决于工作区里有多少人,和方案无关。

这个拒绝是一条指示,不是死胡同。它会报告队列长度、最早一项的等待时长,以及仍然允许的调用:report_progress、get_my_work、get_board_state 和 search。人已经在那张卡片上批准过的步骤不受限制,所以一个已被接受的“合并 PR #418”不会被队列挡住。

怎么配置?

连接你的客户端,通过浏览器登录;没有密钥要复制。Weft 发放刷新令牌,客户端会自己续期登录。在 Claude Code 里只需一条命令:claude mcp add --transport http weft https://letsweft.com/api/mcp(设置页面)。Cursor 支持一键安装(Cursor),Codex 需要一条配置加 codex mcp login weft(Codex),ChatGPT 里有已发布的 Weft 应用,所有方案都能用,包括免费版(ChatGPT)。服务器会自己向智能体说明这个循环,所以不需要写生命周期提示词。

Claude Code 的完整演示见给 Claude Code 配一块任务看板。多个智能体共用一块看板时,租约和 already_claimed 最为要紧,见多个 AI 智能体,一块看板。协议本身的文档在 modelcontextprotocol.io,其他 MCP 看板的对比见 MCP 任务管理器。

这方面 Weft 不做什么?

  • 没有 CLI、公开的 REST API 或 webhook,所以定时任务和 CI 流水线无法在 MCP 客户端之外驱动这个循环。
  • 没有 GitHub 或 Slack 集成。证据就是智能体在 artifacts 里附上的链接。
  • 没有内置 AI。思考发生在你自己的 AI 客户端里,这也是 Weft 不需要 AI 点数的原因。

免费版包含 50 个任务和每月 200 次 AI 调用。Pro 每席位每月 $7 或每年 $60(价格)。

写一个好提示词,不就能让智能体遵守循环了吗?
提示词能描述循环,但没法强制执行。它拦不住两个智能体认领同一个任务,也没法释放一个被崩溃智能体占着的任务。在 Weft 里,认领是服务器掌管的租约,所以不管智能体记不记得自己的指令,这些情况都能被处理。
如果我的智能体做到一半崩溃了会怎样?
它的心跳停了。最后一次 report_progress 之后 20 分钟,这次运行被标记为过期,租约令牌被清除,任务重新变成未分配,其他智能体或人就可以接手。卡片不会在 Doing 里一躺就是一周。
每个完成的任务都要等我审阅吗?
不是。默认情况下,完成的任务会带着结果和证据直接进 Done。只有当任务需要审阅或验证检查没通过时,它才会停在你的收件箱里,等你选择“接受”、“返工”、“以后再说”或“放弃”。
我为什么会希望智能体被拒绝接活?
因为不然它会不停地产出你根本没时间检查的东西。一旦有 5 项(团队是 10 项)或约 45 分钟的审阅量在等人,start_task 就会返回 attention_queue_full,并把智能体引向它仍然能做的事。清空队列就能解除阻塞。
Hypertask 也有租约,为什么 MCP 很重要?
按 Hypertask 自己的文档,它的租约是 REST 端点(MCP 概览),它的 CLI 也能认领。这适合脚本驱动的智能体。而在编辑器或聊天里通过 MCP 工具工作的智能体在那里拿不到租约,在 Weft 里则能拿到:start_task、report_progress 和 complete_task 都是 MCP 工具。