การจัดการ task ของ AI agent: claim loop ที่เป็นสัญญา ไม่ใช่ prompt
วิธีจัดการ task ของ AI agent ด้วย claim loop ที่ server บังคับใช้: lease, heartbeat, คำถาม, ใบรับงาน และขีดจำกัดความสนใจของคน
Weft คือเครื่องมือจัดการงานด้วย AI สำหรับผู้ก่อตั้งเดี่ยวและทีมเล็ก
โดย Andrei Finogeev ·
การจัดการ task ของ AI agent จะได้ผลเมื่อบอร์ด ไม่ใช่ prompt เป็นผู้คุม loop: agent ถามว่าควรทำอะไร claim task หนึ่งชิ้นด้วย lease ที่หมดอายุเองถ้ามันเงียบไป ถามคนเฉพาะเรื่องที่คนต้องตัดสิน และปิดงานด้วยใบรับงานที่คนอื่นตรวจได้ ใน Weft แต่ละขั้นเป็น MCP tool ที่ server ตรวจสอบ agent ที่ข้ามขั้นจึงถูกปฏิเสธหรือเสีย task ไป แทนที่จะค่อย ๆ หลุด sync โดยไม่มีใครรู้
เราเป็นผู้สร้าง Weft ข้อมูลเกี่ยวกับผลิตภัณฑ์อื่นมาจากหน้าทางการของผลิตภัณฑ์นั้น ตรวจสอบเมื่อวันที่ 27 ตุลาคม 2026
ทำไมรายการ task ที่วางลงในแชตถึงใช้ไม่ได้ในที่สุด?
การวาง task ลงในแชตเป็นสิ่งแรกที่ทุกคนลอง และใช้ได้ดีอยู่หนึ่งบ่าย จากนั้นแชตก็จบ และ state ก็จบไปด้วย agent รู้ว่ารายการไหนเสร็จแล้ว รายการไหนยอมแพ้ และเรื่องไหนที่ยังไม่แน่ใจ ตอนนี้ไม่มีใครรู้อีกแล้ว
คนที่วางรายการกลายเป็นตัวส่งต่อ ต้องคัดลอกผลกลับไปที่บอร์ดจริง และทำงานซ้ำที่ session ที่สองหยิบไปทำ เพราะไม่มีอะไรบอกว่างานนั้นมีคนรับไปแล้ว
การเข้าถึงบอร์ดแก้ปัญหา snapshot ได้ แต่ไม่ได้แก้ส่วนที่เหลือ ถ้า tool มีแค่ “ย้ายการ์ด” กับ “เพิ่มคอมเมนต์” loop ก็ยังขึ้นกับว่า agent ทำตามธรรมเนียมที่เขียนไว้ในคำสั่งหรือไม่ และธรรมเนียมพังตรงจังหวะที่มีปัญหาพอดี: agent crash กลางทาง หรือ agent สองตัวเริ่มพร้อมกัน
claim loop ในรูปแบบสัญญาหน้าตาเป็นอย่างไร?
ใน Weft loop มี 5 ขั้น แต่ละขั้นเป็น tool แยกกันบน MCP endpoint เดียวคือ https://letsweft.com/api/mcp โดย server เก็บ state ระหว่างขั้นไว้ loop จึงอยู่รอดแม้แชตใดจะจบลง
- get_my_work: ถามก่อนเลือก คำตอบครอบคลุมสิ่งที่ client นี้ถืออยู่แล้ว สิ่งที่รอคนอยู่ งานที่เลยกำหนดหรือใกล้ครบกำหนด และยังมีที่ว่างให้เริ่มอะไรได้อีกหรือไม่
- start_task: claim ด้วย lease การ claim มีอายุ 20 นาที และย้าย task ไปที่ Doing คำตอบมี
runId,leaseTokenและrenewEverySeconds: 300client ตัวที่สองที่พยายามรับ task เดียวกันจะได้already_claimedพร้อมคำแนะนำว่าอย่าทำงานซ้ำ - report_progress: heartbeat ทุกการเรียกพร้อม run id และ lease token จะต่ออายุ lease ถ้า agent ตาย heartbeat จะหยุด และ 20 นาทีต่อมา run จะถูกทำเครื่องหมายว่า stale แล้ว task จะกลับไปเป็นไม่มีผู้รับ ให้ใครก็หยิบไปได้ lease ที่หลุดไปจะตอบกลับ
lease_lostagent จึงรู้ว่าไม่ได้เป็นเจ้าของงานนั้นแล้ว - request_input: เฉพาะการตัดสินใจที่เป็นของคน คำถามยาวไม่เกิน 500 ตัวอักษร มีตัวเลือกได้สูงสุด 10 ข้อ การ claim ยังคงอยู่ระหว่างที่ agent รอ
- complete_task: ปิดงานพร้อมใบรับงาน
outcome,artifacts(หลักฐาน เช่น URL, commit หรือ file hash),notDone,unknownsและnextStep
ทำไมต้องเป็น lease ไม่ใช่สถานะ? เพราะความเงียบคือสัญญาณเดียวที่ agent ที่ crash ส่งได้ การ์ดใน Doing บอกว่าเคยมีคนทำงานนี้ lease บอกว่ามีคนกำลังทำงานนี้อยู่ตอนนี้ และจะหยุดบอกเองเมื่อมันไม่จริงแล้ว
ตัวการ claim เป็นการ insert ลงฐานข้อมูลครั้งเดียวที่มี unique index คุมอยู่ เมื่อ agent สองตัวแย่งกัน ฐานข้อมูลเป็นผู้ตัดสินว่าใครชนะ ทั้งคู่จึงไม่มีทางได้ task ไปพร้อมกัน ในทางกลับกัน คอมเมนต์ “Claimed” สองอันที่โพสต์ห่างกันหนึ่งวินาที ถือเป็นคอมเมนต์ที่ถูกต้องทั้งคู่
agent ควรเรียก request_input เมื่อไหร่?
เมื่อเจอเรื่องที่มีแต่คนเท่านั้นที่ตัดสินได้: อะไรก็ตามที่ย้อนกลับไม่ได้ เช่น เงิน การเผยแพร่ production หรือกฎหมาย หรือทางแยกจริง ๆ ที่ไม่มีค่าเริ่มต้นที่สมเหตุสมผล ไม่ใช่เพื่อขออนุญาตทำต่อ
การยั้งใจแบบนี้สำคัญ เพราะคำถามหนึ่งข้อกินความสนใจของคนเท่ากับ task ที่เสร็จแล้วหนึ่งชิ้น และใน Weft ก็นับรวมในขีดจำกัดเดียวกัน คำถามจะเข้า Inbox พร้อม push บนมือถือ และถ้ารอนาน 20 นาทีขึ้นไปจะมีอีเมลเตือน Weft ไม่เคยเรียก agent กลับ: คำตอบจะมาถึงตอน start_task หรือ get_my_work ครั้งถัดไป ระหว่างที่คำถามยังเปิดอยู่ agent ถือ task ไว้ได้ 60 นาที หลังจากนั้น lease จะหลุด แต่คำถามยังคงอยู่
การเรียก complete_task ควรมีอะไรบ้าง?
outcome สั้น ๆ หลักฐาน และการบอกขอบเขตอย่างตรงไปตรงมา นี่คือ payload ที่สมจริงสำหรับการแก้ bug:
{
"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"
}Artifacts คือสิ่งที่คนตรวจได้โดยไม่ต้องเชื่อคำพูดของ agent ส่วน notDone และ unknowns ไม่ใช่คำสารภาพ แต่เป็นตัวแยกผลลัพธ์ที่เชื่อถือได้ ออกจากผลลัพธ์ที่คุณต้องประกอบใหม่จาก diff การเรียกนี้ไม่เคยล้มเหลวเพราะขาดหลักฐาน เพราะการเสียงานที่เสร็จแล้วแย่กว่าการบันทึกไว้แบบยังไม่ได้ยืนยัน อ่านเพิ่มเรื่องการอ่านใบรับงานเหล่านี้ได้ใน AI agent ของฉันทำอะไรไปบ้าง
ต่างจากการย้ายการ์ดแล้วโพสต์คอมเมนต์อย่างไร?
คู่มือของ Hypertask เรื่อง loop เดียวกัน (claim, update, report, close) อธิบายนิสัยการทำงานนี้ได้ดี การ claim ในเวอร์ชัน MCP ของเขาคือการโหลด task ย้ายไปที่ส่วนที่กำลังทำ และโพสต์คอมเมนต์ claim โดยอาศัย prompt ที่ทีมเขียนไว้ในคำสั่งของ agent นี่คือ loop เดียวกันทีละขั้น:
| ขั้นของ loop | บอร์ดที่พึ่งธรรมเนียมอย่างเดียว (agent ย้ายการ์ดและคอมเมนต์) | สิ่งที่ Weft บังคับใช้ และด้วย MCP tool ตัวไหน |
|---|---|---|
| เลือกงาน | agent ดูรายการ task แล้วเลือกเอง ไม่มีอะไรบอกมันว่าคนจมอยู่กับการ review แล้ว | get_my_work คืนสิ่งที่ client นี้ถืออยู่ สิ่งที่รอคน งานที่เลยกำหนด และยังมีที่ว่างให้เริ่มอะไรได้หรือไม่ |
| Claim | ย้ายการ์ดไป Doing แล้วโพสต์ “Claimed” agent สองตัวทำแบบนี้พร้อมกันได้ และทั้งคู่เชื่อว่าตัวเองเป็นเจ้าของ | start_task รับ lease 20 นาทีด้วยการเขียนฐานข้อมูลครั้งเดียวที่มี unique index คุม ตัวที่แพ้จะได้ already_claimed พร้อม id และชื่อของ task |
| ยืนยันว่ายังทำอยู่ | คอมเมนต์ความคืบหน้า ถ้า agent จำได้ agent ที่ crash ทิ้งการ์ดไว้ใน Doing ไม่มีกำหนด | report_progress ต่ออายุ lease (agent ถูกบอกให้ทำทุก 5 นาที) ถ้าเงียบไป 20 นาที run จะถูกทำเครื่องหมายว่า stale และ task ว่างอีกครั้ง |
| ถาม | คอมเมนต์ “Blocked:” agent หยุดหรือเดาเอา การ์ดอาจยังดูเหมือนกำลังทำอยู่ | request_input ส่งคำถามพร้อมตัวเลือกสูงสุด 10 ข้อเข้า Inbox ของคน และยังคง claim ไว้ (60 นาทีระหว่างรอ) คำตอบกลับมาผ่าน start_task หรือ get_my_work |
| รายงาน | คอมเมนต์สุดท้ายแบบข้อความอิสระ รูปแบบขึ้นกับว่า prompt ดีแค่ไหน | complete_task รับฟิลด์ที่มีชื่อชัดเจน: outcome, artifacts, notDone, unknowns, nextStep |
| ปิดหรือ review | agent ย้ายการ์ดไป Review หรือ Done แล้วแต่ prompt สั่ง | ค่าเริ่มต้นคือ task ไปที่ Done แต่จะหยุดใน Inbox ให้เลือก Accept / Rework / Later / Drop เมื่อ task ต้อง review หรือการตรวจสอบไม่ผ่าน |
| งานล้น | ไม่มีอะไรเกิดขึ้น agent เริ่มงานต่อไปเรื่อย ๆ และคอลัมน์ Review ก็ยาวขึ้น | start_task ปฏิเสธด้วย attention_queue_full เมื่อมี 5 รายการ (คนเดียว) หรือ 10 รายการ (ทีม) รอคนอยู่ หรือมีงาน review รวม 45 นาที |
เพื่อความยุติธรรมกับ Hypertask: เขามี lease จริง เอกสารของเขาระบุ endpoint สำหรับ claim lease, heartbeat และ release และตาราง Known limitations ระบุว่า task lease, evidence และ escalation เป็น REST endpoint เท่านั้นโดยตั้งใจ (ภาพรวม MCP ของ Hypertask) tools reference ของเขาไม่มี lease tool ใน 21 MCP tool (tools reference) CLI ของเขาก็ claim ได้ในรูปคำสั่งเสริม (changelog, CLI reference) ดังนั้น agent แบบ script บน Hypertask ถือ lease ได้ ส่วน agent ที่ทำงานผ่าน MCP ใน Claude Code หรือ Cursor จะได้เวอร์ชันการ์ด-และ-คอมเมนต์ เว้นแต่มีคนต่อ REST call เข้าไปเอง
ถ้า agent ของคุณรันเป็น script และ CI job, CLI และ REST API ของ Hypertask เป็นข้อได้เปรียบจริง ซึ่ง Weft ไม่มีทั้งสองอย่าง: ไม่มี CLI ไม่มี public REST API ไม่มี webhook Weft เหมาะกับ agent ที่อยู่ใน MCP client และต้องการให้ loop แน่นหนาอยู่ตรงนั้น
คนเห็นอะไรบ้าง?
ส่วนใหญ่คือการ์ดใน Done: ค่าเริ่มต้นคือ task ที่เสร็จแล้วจะไปที่นั่นทันที พร้อม outcome และหลักฐานแนบอยู่
task จะหยุดใน Inbox ของคนเมื่อถูกระบุว่าต้อง review หรือเมื่อการตรวจสอบไม่ผ่าน ตรงนั้นคนจะเลือกหนึ่งในสี่คำตอบ:
- Accept: งานนี้ใช้ได้ ถ้า agent ส่ง nextStep มา คนจะเห็นมันเหนือปุ่ม (“ถ้าคุณ accept agent จะ …”) และการ accept คือการอนุมัติขั้นนั้นขั้นเดียว ไม่กว้างไปกว่านั้น การอนุมัติมีผล 72 ชั่วโมง และกลับไปถึง agent ผ่าน get_my_work หรือ start_task
- Rework: ส่งกลับไปแก้ พร้อมโน้ตบอกว่าผิดตรงไหน
- Later: ยังไม่ใช่ตอนนี้ Drop: เลิกทำงานนี้
Inbox อยู่บนเว็บ และเมื่อมีอะไรเข้ามา คนจะได้ push บนแอปมือถือของ Weft ด้วย การจับมือด้วย nextStep กันไม่ให้ agent ตีความ “ดูโอเค” ว่าเป็นการอนุญาตให้ merge, deploy และส่ง: มันทำได้เฉพาะขั้นเดียวที่อนุมัติ แล้วต้อง complete task อีกครั้ง
ทำไม agent ถึงถูกปฏิเสธแทนที่จะได้เริ่มงานเพิ่ม?
เพราะทรัพยากรที่ขาดแคลนคือความสนใจ ไม่ใช่งาน agent เริ่มงานได้สิบอย่างในเวลาที่คนหนึ่งคน review ได้หนึ่งอย่าง
Weft นับสิ่งที่รอคนอยู่: task ที่รอ review บวกคำถามที่ยังเปิดอยู่ เมื่อถึง 5 รายการใน workspace คนเดียว 10 รายการในทีม หรือเวลา review โดยประมาณราว 45 นาที แล้วแต่อย่างไหนถึงก่อน start_task จะปฏิเสธด้วย attention_queue_full ขีดจำกัดขึ้นกับจำนวนคนใน workspace ไม่ใช่แพ็กเกจ
การปฏิเสธนี้เป็นคำสั่ง ไม่ใช่ทางตัน มันรายงานขนาดคิว อายุของรายการที่เก่าที่สุด และการเรียกที่ยังทำได้: report_progress, get_my_work, get_board_state และ search ขั้นที่คนอนุมัติไว้แล้วบนการ์ดนั้นได้รับการยกเว้น “merge PR #418” ที่ accept แล้วจึงไม่ถูกคิวบล็อก
ตั้งค่าอย่างไร?
เชื่อมต่อ client แล้ว sign in ผ่านเบราว์เซอร์ ไม่มี key ให้คัดลอก Weft ออก refresh token ให้ client ต่ออายุการ sign-in เองได้ ใน Claude Code ใช้คำสั่งเดียว claude mcp add --transport http weft https://letsweft.com/api/mcp (หน้าตั้งค่า) Cursor ติดตั้งได้ในคลิกเดียว (Cursor) Codex ต้องเพิ่ม config และรัน codex mcp login weft (Codex) ส่วน ChatGPT มีแอป Weft ที่เผยแพร่แล้วในทุกแพ็กเกจรวมถึง Free (ChatGPT) server อธิบาย loop ให้ agent ฟังเอง จึงไม่ต้องเขียน prompt เรื่อง lifecycle
ดูขั้นตอนสำหรับ Claude Code ได้ที่ บอร์ด task สำหรับ Claude Code ถ้ามีหลาย agent บนบอร์ดเดียว ซึ่ง lease และ already_claimed สำคัญที่สุด ดู AI agent หลายตัว บอร์ดเดียว ตัวโปรโตคอลมีเอกสารที่ modelcontextprotocol.io และการเปรียบเทียบบอร์ด MCP อื่น ๆ อยู่ที่ MCP task managers
Weft ไม่ได้ทำอะไรในเรื่องนี้บ้าง?
- ไม่มี CLI, public REST API หรือ webhook ดังนั้น cron job และ CI pipeline จึงขับเคลื่อน loop นอก MCP client ไม่ได้
- ไม่มี integration กับ GitHub หรือ Slack หลักฐานคือสิ่งที่ agent แนบลิงก์ไว้ใน artifacts
- ไม่มี AI ในตัว การคิดเกิดขึ้นใน AI client ของคุณเอง ซึ่งเป็นเหตุผลที่ Weft ไม่ต้องใช้ AI credit
แพ็กเกจ Free ครอบคลุม 50 task และ AI call 200 ครั้งต่อเดือน Pro ราคา $7 ต่อที่นั่งต่อเดือน หรือ $60 ต่อที่นั่งต่อปี (ราคา)
- prompt ดี ๆ ไม่พอให้ agent ทำตาม loop หรือ?
- prompt อธิบาย loop ได้ แต่บังคับใช้ไม่ได้ มันไม่ได้กันไม่ให้ agent สองตัว claim task เดียวกัน และปลด task ที่ agent ซึ่ง crash ไปแล้วถืออยู่ไม่ได้ ใน Weft การ claim คือ lease ที่ server เป็นเจ้าของ กรณีเหล่านั้นจึงถูกจัดการไม่ว่า agent จะจำคำสั่งได้หรือไม่
- ถ้า agent crash กลางทางจะเกิดอะไรขึ้น?
- heartbeat ของมันจะหยุด ยี่สิบนาทีหลัง report_progress ครั้งสุดท้าย run จะถูกทำเครื่องหมายว่า stale lease token ถูกล้าง และ task กลับไปไม่มีผู้รับอีกครั้ง agent ตัวอื่นหรือคนจึงหยิบไปทำได้ การ์ดไม่ค้างอยู่ใน Doing เป็นสัปดาห์
- task ที่เสร็จทุกชิ้นต้องรอให้ฉัน review ไหม?
- ไม่ ค่าเริ่มต้นคือ task ที่เสร็จจะไปที่ Done ทันทีพร้อม outcome และหลักฐาน จะหยุดใน Inbox ให้เลือก Accept, Rework, Later หรือ Drop ก็ต่อเมื่อ task ต้อง review หรือการตรวจสอบไม่ผ่านเท่านั้น
- ทำไมฉันถึงอยากให้ agent ถูกปฏิเสธงาน?
- เพราะไม่อย่างนั้นมันจะผลิตงานที่คุณไม่มีเวลาตรวจออกมาเรื่อย ๆ เมื่อมี 5 รายการ (ทีมคือ 10) หรือ review ราว 45 นาทีรอคนอยู่ start_task จะคืน attention_queue_full และชี้ให้ agent ไปทำสิ่งที่ยังทำได้ เคลียร์คิวแล้วมันก็จะทำงานต่อได้
- Hypertask ก็มี lease ทำไม MCP ถึงสำคัญ?
- ตามเอกสารของ Hypertask เอง lease ของเขาเป็น REST endpoint (ภาพรวม MCP) และ CLI ก็ claim ได้ ซึ่งเหมาะกับ agent แบบ script แต่ agent ที่ทำงานผ่าน MCP tool ใน editor หรือแชตจะไม่ได้ใช้ ส่วนใน Weft ได้ใช้: start_task, report_progress และ complete_task เป็น MCP tool