Lesson 12 · 協作

不同 agent 不要搶同一棵樹

「Isolate by directory, coordinate by task ID.」兩個平面,互不打擾。

⏱ 約 10 分鐘 · 📝 3 個可互動元件 · 🧑‍💻 基於 shareAI-lab · s12_worktree_task_isolation.py

並行 agent 的難題

s09-s11 讓你能同時啟多個 teammate,但有個暗坑:他們都在同一個工作目錄裡。 alice 改 auth.py、bob 同時也在改 auth.py——git 衝突、文件錯亂、測試互相污染。

s12 的解法是 git worktree:同一個倉庫,透過 git worktree add 可以在不同目錄裡 checkout 不同分支。每個 agent 拿到自己的 worktree,在自己的目錄裡工作,互不可見。

my-repo/                           # 主工作区(lead 用)
.worktrees/
  alice-auth/                      # alice 的隔离目录
    (branch: wt/alice-auth)
  bob-api/                         # bob 的隔离目录
    (branch: wt/bob-api)
  index.json                       # worktree 注册表
  events.jsonl                     # 生命周期事件日志

兩平面分工

s12 把系統明確地拆成兩個平面:

  • 控制面 (control plane).tasks/ 裡的 JSON 檔案。 task 是「要做什麼」的抽象單位,有依賴、owner、status。
  • 執行面 (execution plane).worktrees/ 裡的目錄。 worktree 是「在哪裡做」的實體容器,一個目錄 + 一個分支。

兩者透過 task.worktreeworktree.task_id 雙向綁定。

這種解耦讓你可以:重複使用 task 管理機制但換執行環境(例如不是 git worktree,而是 docker 容器)。 或換 task 機制但重複使用 worktree(例如不是 JSON 檔案而是資料庫)。

生命週期演示

下面要完整走一次:create task → create worktree → run commands → keep 或 remove。每步都有事件日誌記錄(events.jsonl),production 裡靠它做可觀測性。

keep vs remove

worktree 完成使命時有兩個終局:

  • remove: git worktree remove --force,目錄刪除。分支一般也會被清理。相當於「這個探索不要了」。
  • keep: 只在 .worktrees/index.json 裡標 status: kept,實體目錄保留。相當於「這個結果要了,等我合併」。

常見模式:subagent 跑一個實驗性 refactor → 跑出來效果好 → keep → 人類 review → 合入主分支 → 手工 remove。效果差?直接 remove 丟掉。

Interactive

Widget 1 · Lifecycle · 從 create task 到 keep/remove

按步驟觸發 5 個事件。左邊看磁碟狀態(.tasks/ + .worktrees/),右邊是事件日誌(events.jsonl)。

磁盘状态
events.jsonl(append-only)
Interactive

Widget 2 · Parallel Lanes · 3 個 agent 在 3 個 worktree 並發

alice / bob / charlie 在不同 worktree 裡同時改同一個檔案。互相可見嗎?會衝突嗎?

📂 .worktrees/alice/
📂 .worktrees/bob/
📂 .worktrees/charlie/
Interactive

Widget 3 · Decision Flow · 每個步驟都選對下一步

Production 裡一個 agent 完成 worktree 裡的工作時,應該 keep 還是 remove? 5 個場景。

答对 0 / 5