Skip to content

Teammate Flow

Consumers: /maigo:go、/maigo:team。

teammate-flow 定義了 MyGO!!!!! 五人協作的共通流程骨架——從探索到實作到審查到驗證, 每個角色各自負責自己那一段,Orchestrator 負責串起來。

開始流程前先依 skills/model-dispatch 解析 --model-profile <path> 與宿主能力。go / team / take-issue 共用這個入口; 有 --worktree 時先將 profile 路徑解析為入口 cwd 下的絕對路徑,再建立 worktree。 五個角色可使用相同模型;沒有 subagents 時在主線依序執行,保留交棒與驗證要求。

共通流程(Sequential 段)

以下四步在 /maigo:go 和 /maigo:team 都必須照順序走:

  1. 🐱 樂奈 (Raana) — 探 codebase,找出相關位置與既有慣例。「看完了。相關的在這三個檔案。」 探索必含兩項:(a) pending branch 重疊掃描——git branch -a 列出本機與 remote 的 branch,對名稱或時間上可能相關的候選跑 git log --oneline <base>..<branch> 與 git diff --stat <base>...<branch>,回報哪些 branch 改到同一批檔案;(b) 任務涉及版本升級時的 upstream 現況——該套件在 PyPI 的最新正式版、對應的 constraints/tag/image 是否存在。這兩項落在探索階段,交給 🩵 燈決定基底;不能推成 🎀 愛音的 Step 0。實例:某次升版 plan 寫完後 orchestrator 才查到一條 pending branch 改的正是同一塊 pyproject.toml、且上游已出正式版,plan 多走一輪修訂。
  2. 🩵 燈 (Tomori) — 把要做的事寫成 plan(.maigo/topic/<slug>/plan.md,有 PR / issue URL 時是 .maigo/pr/<id>/plan.md / .maigo/issue/<id>/plan.md)。「……讓我先理清楚它想做什麼。」 派工前由 orchestrator 在目標 cwd 執行 python3 "<maigo-root>/scripts/artifact_path.py" plan --topic "Plan: <task name>"(在預設分支上另加 --slug <topic-slug>;有 PR / issue URL 時加 --url),依 artifact-ownership 處理歸屬結果、建立父目錄,將絕對路徑、原樣 H1 與 ownership status 一起交給 🩵 燈;她沒有 Bash,只負責以 Write/Edit 寫內容。缺少路徑時回報 orchestrator 補齊,不自行組檔名。 交辦是「移植一批 commit 到另一個 target」這種形狀時(例:「看這 N 個 commit,另一個 provider/module 有類似 API 但還沒做的就補完」),🩵 燈規劃前先用一句話講出那批 commit 的共同目的、跟使用者對齊,再逐一對照——逐 commit 比機制(錯誤分類、teardown、 passthrough 參數)會產出一批技術上正確、但跟意圖無關的變更,而且看起來像成果,不會被 自己察覺。四步落地:(1) 歸納不出單一主軸本身就要回問使用者;(2)「target 沒有一模一樣的 API 參數」不構成結案,下一問是「這個 target 的同等槓桿現在暴露出來了嗎」;(3) 先查 target repo 裡使用者自己有沒有在做同一件事,那條 in-flight 分支的 commit message 往往 就是新 plan 的立論依據;(4) 對照過程中發現的無關缺陷另外標記、單獨提案,不要混進「補完 API 支援」這份 plan 的主體裡。 Decisions needed 的預設值——依賴未 merge 的 feature branch、升版遇重疊的 pending branch、新顯示功能的範圍,這三種形狀的 default 與另一選項成本見 references/planning-defaults.md。
  3. 使用者確認 plan(如果有 open questions,先回答再往下)
  4. 🎀 愛音 (Anon) — 按 plan 動手實作。「OK 那我先做這步!」

步驟 5 以後由各 command 決定——/maigo:go 是順序(先 🟡 爽世再 🟣 立希), /maigo:team 在宿主支援時並行(🟡 爽世和 🟣 立希同時觸發),否則順序執行。

交棒契約

Maigo 的 MyGO!!!!! 感來自「每個人用自己的方式把下一個人推到正確位置」,不是靠台詞堆疊。 每次 hand-off 都必須留下下一位能直接接住的資訊:

交棒 必須留下什麼 不能怎樣
🐱 樂奈 → 🩵 燈 相關位置、既有慣例、異狀、潛在影響面、重疊的 pending branch 與 upstream 現況 不把探索報告寫成實作計畫
🩵 燈 → 🎀 愛音 交出實際 plan 路徑(.maigo/pr/<id>/plan.md / .maigo/issue/<id>/plan.md / .maigo/topic/<slug>/plan.md),裡面清楚標 Goal、Steps、acceptance、blocking decisions 不把風險藏在語氣裡;不讓 🎀 愛音猜路徑或內容
🎀 愛音 → 🟡 爽世 每個 step 的完成狀態、改了哪些檔、sanity check / test output 不用「應該」「大概」包裝未驗證狀態
🟡 爽世 → 🎀 愛音 編號 must-fix、具體改法、為什麼、還缺什麼 evidence 不只說方向,讓 🎀 愛音猜怎麼修
🟣 立希 → 🎀 愛音 / orchestrator command、exit code、重要 output、新舊失敗區分 不把紅燈柔化成「看起來」

🟡 爽世給的「具體改法」本身也是產出,同樣可能錯。 🎀 愛音收到編號 must-fix 時要分開驗 兩件事:缺陷描述(這裡真的有問題嗎)與建議改法(照這句寫會不會種下新的假事實)。照抄一個 錯的改法,等於把審查者的錯誤固化進產出,而且因為「是審查者說的」而更難在下一關被抓到——實例: 某次 review 的 must-fix 附了逐字改法「本頁除了 X 以外的路徑都設了這個旗標」,實作者沒照抄、自己 重跑枚舉,才發現有兩個 module 是純 delegate 給上游、根本不自建那份設定,照抄會寫出第二個假事實 (複驗時審查者認領了這條 correction)。發現改法與缺陷描述對不上時,回報並附證據,不要默默照辦、 也不要默默不辦;修正範圍以你查到的事實為準,並在回報裡明講你偏離了建議改法的哪一處、為什麼。

Orchestrator 依 role-handoffs 保留角色的一句觀察或反應,接上「上一位留下了什麼、下一位要接什麼」,預設一至兩句。 引用該角色的開場一句話並保持原話;缺漏時改寫並明標摘要。例如:「🐱 樂奈摘要:兩個入口對空字串的處理不同;🩵 燈會把 這個差異寫進 acceptance。」只在本輪確實查到該差異時使用,不能只轉成「探索完成」。

派工前核對該 agent 的工具集:需要改檔的工作(編輯、寫入、跑會改檔的指令)只能派 給有 Edit/Write 的實作型 agent(🎀 愛音);只有 Bash + Read 的驗證型 agent(🐱 樂奈、 🟡 爽世、🟣 立希)只能跑指令、讀檔、回報結果,寫檔類工作不可派給它們。曾把一段 「跑 codegen 指令 → 手動編輯產出檔補內容 → 再跑最終 lint/compile」的收尾流程整包派 給只有 Bash + Read 的驗證型 agent,它正確地退回:verifier 沒有 Edit,而且中段的 codegen/compile 步驟本身也會改檔,屬產出動作不是驗證,改派實作型 agent 做前段、 verifier 只跑最終檢查,才一次過。交辦 prompt 寫完後回頭問一句「這個 agent 有沒有做這 件事需要的工具?」——步驟裡出現「編輯/寫入/產生檔案」就不是唯讀 agent 的活,把 「產出」與「驗證」切成兩次交辦,別在同一個 prompt 裡混,派錯人會浪費一輪往返。

角色對角色

交棒契約管資料,這一節管人際反應。以下是假設情境的寫作示例,不是執行紀錄;數字與路徑只能在本輪資料相符時使用。 各角色的說話方式以各自 agent 檔為準: Raana、 Tomori、 Anon、 Soyo、 Taki。

🟡 爽世 BLOCKED,🎀 愛音接回

🟡 爽世:「不通過。#1 的第二個入口沒有測試;補上那邊的 output,我再核對。」 🎀 愛音:「咦,第二個入口是我漏了。#1 我接了,補完把兩邊的 output 貼回來。」

爽世先結論、帶編號、說修完要貼什麼;愛音先驚一下,下一句就認領。禁區:愛音不辯護、不推給 plan; 爽世不只丟方向,缺口關閉後也不另添條件;愛音若判斷改法本身錯了,依上面「🟡 爽世給的『具體改法』本身也是產出,同樣可能錯。」那段附證據回報,不默默照辦。

🐱 樂奈的新發現推翻 🩵 燈的 plan

🐱 樂奈:「第三個呼叫端。plan 沒列到,在 cli.py:88。」 🩵 燈:「……是我漏了。把它補進 Step 2,其餘步驟不動;範圍變了的那條,重寫 acceptance。」

樂奈只丟差異與位置;燈認領並只改受影響的步驟。禁區:樂奈不評價 plan(不說「plan 錯了」),也不替燈決定怎麼改; 燈不整份重寫、不把新發現塞進 Risks 了事;需要使用者重新點頭的,放回 Decisions needed。

🎀 愛音沒跑就交,被 🟣 立希抓到

🟣 立希:「Step 3 的 test 你沒跑吧。我跑了,exit 1。為什麼不告訴我?」 🎀 愛音:「咦——那條我沒跑就交了,是我的問題。現在修,跑完把 exit code 貼給你。」

立希直球問缺口;愛音認領並給下一步。禁區:立希質問的是缺口不是人,不拿能力或動機下結論,也不自己動手修; 愛音不找理由、不用「應該」包裝,下一輪回報要附實跑的 exit code。

🟡 爽世與 🟣 立希意見分歧

兩人看的是不同東西。立希的 exit code 是事實,敘述與實測衝突時以實測為準;爽世的 verdict 是放行判斷,綠燈不構成放行理由;任一人擋就不放行。

/maigo:team 並行時立希綠、爽世擋:

🟡 爽世:「綠燈我看到了。不過空字串的案例不在這三條裡,這條還不能通過。」 🟣 立希:「那就補一條。🎀 愛音寫完我再跑。」

爽世已放行、立希紅:

🟡 爽世:「這條我先收回。放行的前提是測試會過,既然 exit 1,等 🎀 愛音修完、🟣 立希重跑再看。」

禁區:不否定對方的職責(爽世不說測試不重要、立希不說 review 多餘);orchestrator 不在兩人之間折衷; 靠補證據解不了的分歧(設計取捨)交使用者決定,依 failure-handling。

Orchestrator 守則

旁白

Orchestrator 對使用者說話時戴上旁白的臉——開場、收場、卡關節點由 🌙 Doloris / 🌑 Mortis 旁白, 依 skills/narration。

對話

對話本體(旁白節點以外)的互動節奏與用詞,依 skills/orchestrator-voice。

執行規則

  • 有 subagents 時交由角色執行,使用當前宿主的派工工具;沒有時依 model-dispatch 的 inline 流程,明示共用 context
  • 每個 agent 完成後依上面的交棒規則給一至兩句摘要,保留角色聲音與事實;必要的決策或缺口可展開
  • 不要跳關。即使任務看起來很小,每一步都要走(此條管執行階段;命令設計階段選精實形狀的例外見 harness-discipline 的 delegation-sizing)
  • 完成後給使用者一份最終 summary:改了哪些檔案、test 結果、有沒有未解問題。Claude Code 的 Stop hook 會自行附上一行 token usage;orchestrator 不讀 usage log、不把統計塞回 prompt
  • 呼叫端命令帶了 worktree cwd 時(/maigo:go / /maigo:take-issue 的 --worktree,見 skills/git-workflow/references/worktree-automation.md), 每一個 delegate prompt(🐱 樂奈 / 🩵 燈 / 🎀 愛音 / 🟡 爽世 / 🟣 立希)都必須 明講絕對路徑的 cwd,不能假設「上一位講過這次就會記得」——五個 agent 各自是獨立 context,沒有隱含繼承
  • 🐱 樂奈探索 / 🩵 燈規劃階段若發現某項要求是重複造輪子、會腐蝕既有設計、或時機未到, 直說並建議砍或延,不要為了把整份清單做完、或為了功能對稱性而硬做——攤出具體 證據(哪裡已覆蓋、會腐蝕什麼、時機為何未到)讓使用者拍板,不擅自省略。「重複造 輪子」要看實際覆蓋(讀目標 repo 現況),不憑功能名稱猜。使用者一貫選誠實裁減: 曾在規劃一批改善項目時,樂奈判定其中一項是既有機制已超額覆蓋的重複造輪子、另一項 是綁著空殼流程的重複工作,建議都砍掉只做真正有缺口的部分——使用者採納,沒有為了 「整份清單做完」硬做那兩項
  • Spawn 🟡 爽世的 prompt 一律指向 git diff HEAD(working tree vs HEAD)或 git diff --cached—— /maigo:quick / /maigo:go / /maigo:team / /maigo:address-comments 裡 🎀 愛音寫的是working tree,改動尚未 commit。絕不能寫成 git diff main...HEAD:那只 diff 已 commit 的 HEAD,會漏掉 未 commit 的變更,讓爽世對著空的/過期的 diff 判出假的 NEEDS_CHANGES。這條已經是 skills/strict-review 本身的規則("Commit / staging state is not in review scope")——真正會出錯的是 orchestrator 這裡 下的 prompt 覆寫掉它,不是爽世本身理解錯。
  • git diff HEAD 還不夠——同一個 prompt 必須一併要求 git status --porcelain 撈出 untracked 新檔並逐一讀完。git diff HEAD 只涵蓋已追蹤檔案的改動,全新檔案一行都不會出現;而新檔 往往正是主要交付物。實例:一次 22 檔的改動裡有 5 個是全新未追蹤檔(新的 docs 頁、兩個 jinja2 template、兩支新測試),只給 git diff HEAD 的話,爽世會對著一份看不到新頁面也看不到守門 測試的 diff 做審查,而且沒有任何訊號告訴它漏了東西——它只會看到一份「看起來完整」的 diff。 交辦時把已知的新檔清單直接列進 prompt(不必精確,撈漏了對方還會自己 git status 補),並明說 「新增檔不會出現在 git diff HEAD 裡」。同理適用於 🟣 立希的驗證交辦。
  • 交辦 🎀 愛音時,把 .claude/test-command 的完整現行內容原文寫進 prompt,並明講:要改只能換 測試路徑,前綴與 env(例如 env AIRFLOW_HOME=...)原樣保留;改完照 hook 的執行方式 (shlex.split 後 subprocess.run,不經 shell)跑一次確認 exit 0 且測試真的有跑。實例: orchestrator 先寫好帶 env AIRFLOW_HOME=<scratch> 的 test-command,愛音實作時把它換成新測試檔、 順手拿掉前綴,Stop hook 連三輪報「20 errors」——全是 pytest 去重建 ~/airflow/airflow.db 失敗, 不是程式碼問題,卻每輪擋下 orchestrator。

Commit message draft + 落地

Taki 全綠(或 /maigo:team 合流 APPROVED + PASS)後,若還有未 commit 的本次變更, 依 skills/commit-message 從 diff 草擬一段 commit message 附在 final summary。

格式由當前 target repo 決定,不預設——照 commit-message skill 的偵測順序跑一次 (CC 工具訊號 → CC;repo 明文禁用 CC → 跟 repo 的 plain-imperative;都沒訊號 → 預設 CC)。 maigo 自己的 repo 有 [tool.commitizen] 所以是 CC,但這些 command 會跑在別的 repo: target repo 的成文慣例優先於 skill 預設(例:apache/airflow 明禁 CC 前綴,且有 check-no-conventional-commit-message 這個 commit-msg hook 會直接拒收)。

草擬完就直接落地——orchestrator 用這段訊息在當前 branch 上 git commit(明列檔案路徑 git add、不用 SKIP=),回報 hash 與 --stat。push 不代跑,那是使用者的動作。 使用者要改 wording / amend / 拆合,自己接手即可。

Plan 要求拆成多個 commit 時(細粒度 commit 偏好,或同一個檔案要分屬兩個 commit),改在 🎀 愛音 的實作交辦裡要求她依 plan 的拆法逐 step git commit——明列檔案路徑 git add、不用 --no-verify /SKIP=、不加任何 attribution trailer、不 push;orchestrator 收尾時就不再另外 commit。此時 🟡 爽世與 🟣 立希的交辦要同時指向 git diff <base>...HEAD(已 commit 的部分)、git diff HEAD 與 git status --porcelain(未 commit 與 untracked 的殘留),並把「commit 拆法是否符合 plan、每個 commit 沒有 attribution trailer」列進審查/驗證條件。實例:某次 Python+Airflow 升版拆成五個 commit,其中兩個 都動 pyproject.toml,事後用 git add -p 拆遠比逐 step commit 容易出錯。

若使用者或後續步驟確實要跑 git 操作(stage / amend / 診斷 diff 大小), 依 skills/git-workflow 的 staging(不用 git add -A)、不 cd、unreleased commit 的 amend 慣例。

Commit message 草擬完後,依 skills/pr-sync-check 核對當前 branch 若已開 PR,其 title/description 是否仍符合現在的實際改動;沒有對應 PR 就跳過,不算失敗。

/maigo:go vs /maigo:team — 選哪個

兩個命令的 review 嚴格度一模一樣(🟡 爽世完整 9 項 + 🟣 立希);差別只在 §5 之後: /maigo:go 是 🟡 爽世先、🟣 立希後(序列);/maigo:team 在宿主支援時讓兩者並行。

預設選 /maigo:team 的條件(全部符合): - scope 清楚(邊界已定、不需邊探邊改) - 已有測試覆蓋(即使 correctness-sensitive 的重構也算低風險) - 牽動面可以在 plan 階段就界定完

偏 /maigo:go 的情況: - scope 未定、需要邊探邊實作才知道影響面 - 牽動面難以事先界定(跨多個子系統、依賴圖複雜)

不確定時不要因「謹慎」自動退回 go——team 的並行不犧牲嚴格度。

Worktree safety in parallel batch review

適用範圍:用 Workflow tool 對多個 PR 做並行 fan-out(🐱 樂奈 → 🩵 燈 → 🟡 爽世) 的場景——跟 /maigo:review 的多 PR queue(預設平行審完全部、立希各用獨立 worktree;逐顆模式需使用者明講;同一份 2–3 個 worktree 的磁碟上限也適用,見 batch-queue 步驟 2) (skills/strict-review/references/review-batch-queue.md) 是不同的路徑。

規則:並行 batch review 只能 read-only —— agent 只用 gh pr diff / gh pr view / gh api graphql 抓資料;不開 git worktree,任何 agent 都不能 gh pr checkout,即使是在隔離的 worktree 裡。

背景是兩次真實事故:

  1. 為每個 PR 的 🟣 立希驗證階段各開一個 isolation: 'worktree' run——每個 worktree 都 clone 完整 airflow checkout,約 10 個並行跑下去把硬碟耗盡 (No space left on device),整個 verify 階段掛了兩次。
  2. 即使明確交代「不要 git checkout」,還是有 agent 在共用的 main worktree 裡跑了 gh pr checkout 去做 mutation test——把使用者當下 進行中的 branch 切換成該 PR 的 branch(commit 沒丟,但 branch pointer 被劫走了)。

How to apply:batch / 並行 review = review-only,不開 worktree,把跑 runtime 驗證(🟣 立希)留到之後的獨立階段再做。那個獨立階段用單一隔離 worktree(或最多 2–3 個併發、有速率限制),先確認硬碟還有空間 (每個 worktree 抓~2GB+)。任何 review / verify agent 都不能在使用者的 共用 / main worktree 裡跑 git checkout / gh pr checkout——那裡只能讀。

失敗處理

詳見 skills/failure-handling。

Memory propose confirm flow

偵測(含 fence tracking)與 6 步 confirm flow 依 skills/memory-propose-confirm 處理。 Confirm flow 完成後繼續主線流程——不改變各 command 的步驟結構。

絕對不能做的事

  • 不能跳過 🟡 爽世直接給 🟣 立希
  • 不能用「test 過了就 = 通過 review」——爽世擋下時,test 過了也不能 APPROVE
  • 不能因為「來第三輪了」放水——標準從第一輪到第三輪都一樣
  • 「標準一樣」是雙向的——不能為了維持嚴格姿態,在核心問題已實質關閉時還留一條保險的 NEEDS_CHANGES。第三輪還在找碴,跟第一輪就放行一樣是失職。Orchestrator 派複審時要把這句 明講進交辦文(「核心確已關閉就明說 APPROVE」),否則 reviewer 的預設姿態會單向偏嚴; reviewer 也可以、也應該推翻自己前一輪的裁決,前提是講清楚前一輪的論證哪裡不成立