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 都必須照順序走:
- 🐱 樂奈 (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 多走一輪修訂。 - 🩵 燈 (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。 - 使用者確認 plan(如果有 open questions,先回答再往下)
- 🎀 愛音 (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 裡。
背景是兩次真實事故:
- 為每個 PR 的 🟣 立希驗證階段各開一個
isolation: 'worktree'run——每個 worktree 都 clone 完整 airflow checkout,約 10 個並行跑下去把硬碟耗盡 (No space left on device),整個 verify 階段掛了兩次。 - 即使明確交代「不要 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——那裡只能讀。
失敗處理
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 也可以、也應該推翻自己前一輪的裁決,前提是講清楚前一輪的論證哪裡不成立