部落格

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(證據,例如網址、commit 或檔案雜湊值)、notDone、unknowns 和 nextStep。

為什麼用租約而不是狀態?因為沉默是當掉的代理人唯一能發出的訊號。Doing 裡的一張卡,說的是曾經有人在做它。一份租約說的是現在有人在做它,而當這件事不再屬實時,它會自己停止這麼說。

認領本身是一次由唯一索引把關的資料庫寫入。兩個代理人搶的時候,由資料庫決定誰贏,所以不可能兩個都拿到任務。相較之下,相隔一秒發出的兩則「已認領」留言,都是合法的留言。

代理人什麼時候該呼叫 request_input?

當它碰到只有人能決定的事:任何不可逆的事,例如金錢、發布、正式環境或法務,或是一個沒有合理預設的真正岔路。不是用來請求繼續的許可。

這份克制很重要,因為一個問題花掉人的注意力,跟一個完成的任務一樣多,而在 Weft 裡,它也算進同一個上限。問題會進到收件匣,同時發出手機推播;等了 20 分鐘以上的項目還會寄一封提醒信。Weft 從不回頭呼叫代理人:答案會在它下一次呼叫 start_task 或 get_my_work 時送到。問題還沒回答時,代理人會保留任務 60 分鐘;之後租約失效,但問題會留著。

complete_task 呼叫裡要放什麼?

一段簡短的結果、證據,以及對邊界誠實的交代。下面是一個修 bug 的實際範例:

{
  "id": "9b2f6c1e-4d7a-4c3b-8e21-5a0f3d9c7b14",
  "runId": "d41e8a90-2f6b-4e17-9c3a-71b5e0a4c8f2",
  "leaseToken": "lt_3f9a…",
  "outcome": "修好了客戶沒有帳單地址時 /api/invoices 回 500 的問題。修正在 PR #418;這個路由現在會回 422 並附上欄位錯誤。",
  "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": [
    "新增了帳單地址為空的測試;invoices 測試檔在本機通過"
  ],
  "notDone": [
    "沒有合併 PR",
    "沒有補處理上週失敗的 14 張發票"
  ],
  "unknowns": [
    "手機 App 顯示的是 422 的訊息,還是一般性的錯誤"
  ],
  "nextStep": "把 PR #418 合併到 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 手機 App 上收到推播。nextStep 這個交握機制,防止代理人把「看起來沒問題」當成合併、部署、寄出的許可:它可以做那一個被核准的步驟,然後再次完成任務。

為什麼代理人會被拒絕,而不是開始更多工作?

因為稀缺的是注意力,不是工作。在人審閱一件事的時間裡,代理人可以開始十件。

Weft 計算的是在等人的東西:等待審閱的任務加上未回答的問題。當這個數字在單人工作區達到 5 項、團隊達到 10 項,或估計審閱時間約 45 分鐘,以先到者為準,start_task 就會以 attention_queue_full 拒絕。這個上限取決於工作區裡有幾個人,而不是方案。

這個拒絕是一個指示,不是死路。它會回報佇列大小、最舊項目的等待時間,以及仍然允許的呼叫:report_progress、get_my_work、get_board_state 和 search。人已經在那張卡上核准的步驟不受限制,所以一個已被接受的「合併 PR #418」不會被佇列擋住。

怎麼設定?

接上你的客戶端,透過瀏覽器登入;沒有金鑰要複製。Weft 會發 refresh token,所以客戶端會自己續期登入。在 Claude Code 裡是一行指令:claude mcp add --transport http weft https://letsweft.com/api/mcp(設定頁面)。Cursor 點一下就能安裝(Cursor),Codex 需要一筆設定和 codex mcp login weft(Codex),而 ChatGPT 有已上架的 Weft App,所有方案都能用,包含免費版(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 的二十分鐘後,這次執行會被標為過期,租約權杖被清除,任務再次回到未指派,讓另一個代理人或人接手。卡片不會在 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 工具。