kanly HANDOFF — how two people's AI agents hand off work (team mode)
หลาย agent หลาย repo ให้ส่งงานกันผ่านไฟล์ handoff ที่ commit ลง repo แล้วใช้ handoff verify เทียบ contract กับโค้ดจริง จับ DRIFT ได้ก่อน ship
รัน Claude Code สองสามหน้าต่างพร้อมกัน แล้วเคยเจอไหม frontend สร้าง UI มารับ field นึง แต่ backend ตัด field นั้นทิ้งไปตั้งแต่ loop ที่แล้ว สอง terminal ตกลงกันคนละเรื่อง โดยไม่มีใครรู้จนของมันชนกัน
ผมทำงานคนเดียวข้าม 3 repos frontend backend contract เปิด Claude Code คนละหน้าต่าง terminal แต่ละตัวเห็นแค่ repo ตัวเอง มันไม่รู้ว่าอีกฝั่งเพิ่งเปลี่ยนอะไร พอ session ยาวขึ้น พอ /compact กินความจำ สิ่งที่ terminal นึงตกลงไว้เมื่อวาน อีก terminal ไม่เคยรู้ตั้งแต่แรก
วิธีที่คนส่วนใหญ่แก้คือนั่งเป็นคนกลางเอง copy context จากหน้าต่างนึงไปแปะอีกหน้าต่าง ทั้งวัน คุณกลายเป็น message bus ระหว่าง AI สองตัว
ผมเลยทำอีกแบบ ให้ terminal มันส่งของกันเองผ่านไฟล์กลาง เรียกว่า handoff
handoff คืออะไร
ก่อน terminal นึงส่งงานข้าม repo มันเขียน dispatch สั้นๆ ลงไฟล์ markdown: แก้อะไรไป, อีกฝั่งต้องทำอะไรต่อ, มี breaking change อะไร แค่ delta ไม่ต้องเล่าทั้งเรื่อง อีก terminal เปิด session ใหม่ อ่าน handoff ก่อนเริ่มงาน ทำเสร็จลบทิ้ง git history เก็บให้เอง
พอทำคนเดียว handoff อยู่ใน ~/.claude/handoffs/ เห็นแค่ terminal ผมเอง
จุดที่มันกลายเป็นของทีมคือตรงนี้: ย้ายไฟล์ handoff เข้าไปใน repo .claude/handoffs/ แล้ว commit ลง git ทีนี้ handoff ไม่ใช่ note ถึงตัวเองแล้ว มันคือ dispatch จาก agent ของคนนึง ส่งถึง agent ของอีกคน ทุกคน pull ก็เห็น
ตั้งชื่อไฟล์ <คนส่ง>--<คนรับ>.md — alice--bob.md คือ alice ส่งถึง bob แต่ละคนเขียนไฟล์ของตัวเอง สองคนเขียน handoff พร้อมกันก็ไม่ conflict เพราะคนละไฟล์ repo กลายเป็นที่ที่ agent ทุกตัวอ่านตรงกันก่อนลงมือ
ตัวที่กันของชนกันจริงๆ คือ verify
เขียน handoff เฉยๆ ยังไม่พอ ปัญหาคือโค้ดที่ ship จริงมันจะ drift ออกจากสิ่งที่ handoff บอกไว้เงียบๆ
handoff verify แก้ตรงนี้ มันอ่าน API contract ที่ handoff ประกาศไว้ (endpoint, request body, response shape, auth) แล้วไปสแกนโค้ดจริงในอีก repo เทียบทีละอัน ออกมาเป็น 4 กอง:
- MATCH — ตรงตามที่ handoff บอก
- DRIFT — โค้ดไม่ตรง เช่น handoff บอก response เป็น array แต่โค้ดจริงห่อเป็น object
- MISSING — handoff ประกาศไว้ แต่ในโค้ดไม่มี
- UNDOCUMENTED — ในโค้ดมี แต่ไม่มี handoff ไหนพูดถึง
เคสที่เล่าตอนต้น frontend สร้าง field ที่ backend ตัดทิ้งไปแล้ว คือ verify จับได้ก่อน ship handoff บอกว่า field นี้ไม่อยู่ใน contract แล้ว โค้ด frontend ยังอ้างถึงมันอยู่ = DRIFT ชี้ไฟล์ ชี้บรรทัด บอกว่า handoff ว่าไง โค้ดว่าไง แล้วให้เราเลือกว่าจะแก้โค้ดให้ตรง handoff หรือ update handoff ใหม่
นี่คือส่วนที่ยังไม่มีใครพูดถึง มีเครื่องคอยเช็คว่า agent สองตัวของสองคน ยังเห็นตรงกันอยู่ไหม ไม่ใช่แค่คุยกันผ่านไฟล์เฉยๆ
ทำไมเรื่องนี้กำลังจะสำคัญ
ตอนนี้ content เรื่อง AI dev เกือบทั้งหมดพูดเรื่องคนเดียว prompt ให้ดีขึ้น ใช้ tool ตัวไหน แต่ของจริงที่ทีมกำลังจะเจอคือ หลายคน แต่ละคนรัน AI agent ของตัวเอง บน codebase เดียวกัน
พอถึงจุดนั้น ปัญหาไม่ใช่ AI เขียนโค้ดเก่งแค่ไหน มันคือ agent ของแต่ละคนจะรู้ได้ยังไงว่าอีกฝั่งเปลี่ยนอะไร ผมเจอปัญหานี้ตั้งแต่ทำคนเดียว 3 terminals ทีมจริงมันแค่คูณเข้าไป handoff ที่ commit ลง repo + verify ที่จับ drift คือ layer ที่มารับตรงนี้
เอาไปใช้ได้เลย
repo link อยู่ comment แรก โหลด kanly ไปทั้งชุด มี handoff กับอีก 11 skill เริ่มจาก handoff ตัวเดียวก่อนก็ได้ ทำคนเดียวก็ใช้ได้ พอมีคนที่สอง ย้ายไฟล์เข้า repo แล้ว commit มันก็กลายเป็นของทีมทันที
หลายคน + หลาย AI บน repo เดียว ไม่พังเพราะ AI เก่งขึ้น มันไม่พังเพราะมีที่กลางให้ agent ทุกตัวส่งของกัน แล้วมีเครื่องคอยเช็คว่ายังตรงกันอยู่