去年 11 月我寫了一套 Claude Code 的 subagent 定義,8 個角色、12,069 行。我當時很滿意——每個角色我都把能想到的情境寫進去了。
今年 8 月我把它重寫,同樣 8 個角色,1,239 行。少了 90%,但它現在才真的能用。
這篇是那次重構的紀錄,也是我對「寫給 AI 的規則」這件事的認知修正。
名稱:AI_Agent_For_Full_Stack_Engineer(Claude Code Subagent 團隊定義)
簡介:一套「主 agent 派工、subagent 執行、PM 決策」的開發團隊定義,供 Claude Code 全域使用、跨專案共用。核心不是 8 個角色檔,而是一份派工協定(_PROTOCOL.md)——規定任務書長什麼樣、回報長什麼樣、什麼叫做完、卡住了怎麼辦。
目前狀態:v2 已完成並在自己的專案上實際使用中(2026-08 重構完成)。持續依實際踩到的問題修正。
連結:
git clone https://github.com/timwei0801/AI_Agent_For_Full_Stack_Engineer.git ~/.claude/agents

圖說:8 個角色檔 + 一份共同協定,就是全部了
先講清楚 subagent 是什麼:Claude Code 可以開子代理(subagent)去做事,每個 subagent 有自己獨立的 context,做完把結果回報給主 agent。好處是主 agent 的 context 不會被一堆檔案內容塞爆。
我一開始的用法很單純:寫幾個角色檔,需要時叫它們。問題是實際跑起來,我一直在處理同一批狀況:
這些都不是模型能力問題,是規範問題。我缺的不是更聰明的 agent,是一份所有角色共同遵守的協定。
這個「只跟主 agent 對話」的限制很重要:它強迫所有跨角色的協調都走主 agent,資訊流是一棵樹而不是一張網。需要別的角色配合的事、需要 PM 決策的事,一律寫進回報讓主 agent 轉達。
~/.claude/agents/
├── _PROTOCOL.md ★ 派工協定:所有 agent 共同遵守
│ (任務書格式、統一回報格式、DoD、阻塞協定、
│ scope 鎖、一次性回覆、產出路徑、git 規範)
├── product-manager.md PRD
├── tech-lead.md 架構/技術選型/schema/任務拆解/ADR
├── research-analyst.md 技術、資料源、市場、競品調研
├── backend-engineer.md 所有非 UI 程式碼(服務端、資料管線、腳本、ML)
├── frontend-engineer.md UI 層(web、儀表板、TUI、通知模板)
├── qa-code-reviewer.md 實跑測試+逐檔審查,只審不修
├── devops-engineer.md 容器化、CI、部署、排程、密鑰、備份、監控
└── risk-manager.md 專案健康度與風險(讀狀態文件與 issues,不訪談人)
配套是每個專案根目錄一份 CLAUDE.md(專案憲法)與 docs/PROJECT_STATE.md(交接文件)。
衝突時專案 CLAUDE.md 優先於全域協定——這樣同一套 agents 才能跨專案共用。
v1 的心態是「把所有可能情境都寫進去」。tech-lead.md 2,518 行、devops-engineer.md 2,343 行——裡面有 K8s 部署範例、有電商系統的架構樣板、有完整的 web 全端流程。我以為寫得越完整,它做得越好。
症狀一:context 被自己的定義吃掉。 subagent 一開工先讀 2,000 行自我介紹,真正該讀的專案設計文件反而排在後面、權重被稀釋。
症狀二:角色重疊導致派工錯誤。 8 個檔案各自獨立成長,同一條規則(git 怎麼開分支、commit 訊息怎麼寫、測試要不要真的跑)在 6 個檔案裡各寫了一次——而且寫得不完全一樣。backend 說 commit 用繁中,devops 那份還留著英文範例。Claude 讀到互相矛盾的規則時不會報錯,它會挑一個。
症狀三:預設了我沒有的技術棧。 一堆 web/電商/K8s 的範例,讓它在一個純 Python 資料管線的專案裡建議我加 Ingress。
重構的核心動作只有一個——把所有角色共用的規則抽進 _PROTOCOL.md,角色檔第一句話都改成「先讀協定」:
開工前先完整閱讀
~/.claude/agents/_PROTOCOL.md(派工協定)。本檔只描述你這個角色與眾不同的部分;協定寫過的規則不在此重複,兩者衝突以專案CLAUDE.md為準。
結果:
| v1(2025-11) | v2(2026-08) | |
|---|---|---|
| 8 個角色檔總行數 | 12,069 | 1,239 |
| 單一角色檔 | 712 ~ 2,518 行 | 150 ~ 169 行 |
| 共同規則 | 散在 8 個檔案,版本不一致 | 集中在 _PROTOCOL.md(140 行) |
| 技術棧預設 | web/電商/K8s | 無(由專案 CLAUDE.md 帶入) |

這裡真正的教訓不是「文件要精簡」,是「規則不能有兩份」。 12K 行本身不是問題,同一條規則在 6 個地方有 6 個版本才是。抽 _PROTOCOL.md 之所以有效,是因為它讓每條規則只有一個定義位置——跟寫程式時把重複邏輯抽成函式是同一件事。
這是 v1 最致命、也最不明顯的 bug。
v1 的角色檔裡有大量這種模板:
這些指令在 subagent 身上完全不成立。subagent 是一次性的:一次派工、一次最終回覆,中間沒有對話回合。它照著我的模板寫了「請確認後我再繼續」,然後就結束了——那次派工什麼都沒產出,我還要重派一次。
我寫這些模板的時候,腦子裡想的是「跟 Claude 對話」的體驗。但 subagent 不是對話,它比較像送出一個 job 然後拿回一份 report。
你是**一次性**的:這次任務只有一次最終回覆,沒有中途對話。
不要寫「請確認後我再繼續」「回報進度 60%」「等待指示」
——那些永遠不會有人回。能做的做完,不能做的說清楚,一次交齊。
配套是把「不確定怎麼辦」講死,讓它不需要問也能動:
不腦補需求。 任務書不清楚時:先做不依賴那個答案的部分,其餘選一個保守假設完成,把假設寫清楚。只有在「任何假設都會讓工作作廢」時才停下來,交出 partial 產出+明確問題。
以及一個統一的回報格式,狀態只有三種:DONE / PARTIAL / BLOCKED。
## 回報:<角色> — <任務一句話>
<選填:一段不超過五行的摘要>
### 狀態
DONE
### 產出
- <路徑>:<一句話說明>(commit:<hash> on <branch>)
### 驗證
- 測試:<指令> → <N passed / N failed,或「未執行:原因」>
- lint/型別:<結果>
### 假設
- <未確認就採用的假設,或「無」>
### 待決事項(需主 agent/PM 拍板)
- <問題+你的建議選項>
### 發現與建議(scope 外,未動手)
- <bug/風險/技術債;建議開 issue 的標明>
### 未完成
- <PARTIAL/BLOCKED 時:缺什麼、為什麼、建議下一步>
「用不到的欄位寫『無』,不要刪欄位」——這句也要明寫,否則它會把空欄位整段刪掉,主 agent 就沒辦法機械式地讀。
第一版的狀態長這樣,寫在標題正下方、當作一個裸行:
## 回報:<角色> — <任務一句話>
**狀態**:DONE | PARTIAL | BLOCKED
它不聽。我用同一份任務書派了兩次,兩次都把那行改寫掉——第一次變成「## 摘要」,第二次變成「## 結論」加一句「完成。」。中間我還特地在協定裡加了三條逐字要求,明寫「不要寫成『完成。』」「不要變成 ## 狀態 區塊」。
結果很有意思:三條裡只有一條生效。管欄位層級的那條(一律 ###、名稱照抄、額外欄位附加在後面)一次就聽,所有欄位立刻歸位、連空的 ### 未完成 都會乖乖寫「無」。但管開頭那兩行的兩條,寫得再白都沒用。
想通之後答案就浮出來了:模型在開口的第一句服從「先講結論」的習慣,那是它最強的行為傾向之一,一段散文規則蓋不過去。 但只要進到「欄位」這個結構裡,它就照做。
所以我不再對抗它,改成順著它設計:
### 狀態 欄位,內容限定 DONE / PARTIAL / BLOCKED 一個字### 狀態 後面第一個出現的那個詞,不要求整份逐字相符第三次派工,標題、狀態、欄位順序、額外欄位,全數符合。
這件事的教訓比格式本身重要:寫給 AI 的規則,不是寫得越嚴越有效。你要先分清楚哪些是它「結構上會遵守」的(欄位、層級、清單),哪些是它「行為傾向壓得過規則」的(開場白、語氣、先講什麼)。前者用規則管,後者要順著設計,或者在讀取端容錯。

圖說:第三版格式下的真實回報。注意「lint/型別檢查:未執行」那行——
它沒有假裝跑過
這個我 debug 了一陣子才發現。
v1 的回報範本我為了「讓它知道長什麼樣」,直接寫了填好的範例:
### 驗證
- 測試:pytest tests/ → ✅ 18 passed
- lint:✅ 通過
然後我就開始收到「✅ 18 passed」的回報——在一個根本沒有 18 個測試的專案裡。它不是在說謊,它是在照抄範本。我給它看的是一個已填好的表格,它理解成這是輸出的樣子。
同樣的事發生在 PRD 跟調研報告上:範本裡的假數字、假結論,會原封不動出現在產出裡。
**不偽造結果。** 測試要真的跑、數字要真的量。沒跑就寫「未執行」,
失敗就貼失敗輸出。回報範本裡的 ✅ 是要你填的,不是預設值。
文件類產出的完成定義也對應加上一條:沒有預填的假數字、假結論、佔位符。
順帶配上阻塞協定,讓它失敗時有地方去,不用硬掰:
同一個問題最多嘗試 3 次不同做法;仍失敗就停,交出目前產出+失敗紀錄。
阻塞不代表交白卷:完成能完成的部分,把阻塞點、已試過的方法、你建議的解法寫進回報。
model: inherit — 角色檔不寫死模型。派工時由主 agent 決定用哪個(規劃、審查類的吃重推理,機械性的任務用便宜的),同一個角色可以逐次覆寫。寫死在角色檔裡會讓你每次改主意都要編輯檔案。
文件角色給 tools 白名單。 product-manager、research-analyst、risk-manager 的 frontmatter 明確限制成 Read, Glob, Grep, Write, WebSearch, WebFetch——沒有 Bash、沒有 Edit。理由很現實:PM agent 一旦能動程式碼,它就會忍不住去動。權限限制比在文件裡叮嚀「你不要寫程式」有效得多。
產出路徑總表。 協定裡有一張表寫死每種產出去哪(PRD → docs/prd/、審查報告 → docs/reviews/<YYYY-MM-DD>-<feature>.md……),並且明寫「工作項目、bug、風險一律用 GitHub Issues,不要用 markdown 自建追蹤表」。不寫這條的話,每個 agent 都會熱情地幫你生一個 TODO.md,然後你有五份互相矛盾的待辦清單。
qa-code-reviewer 只審不修。 審查跟修改分開,是為了讓「修」這件事一定會回到工程師角色、走一樣的測試與 commit 規範。審查者順手修掉的東西不會有測試。
先講限制,這些是真的:
現況:8 個角色檔在我自己的專案上實際使用中,協定 v1(2026-08-19)。
下一步大概是把「主 agent 側」的東西也整理出來——目前專案 CLAUDE.md 跟 docs/PROJECT_STATE.md 的寫法還在各專案裡各寫各的,應該要有一份範本。
# 安裝
git clone https://github.com/timwei0801/AI_Agent_For_Full_Stack_Engineer.git ~/.claude/agents
# 之後更新
cd ~/.claude/agents && git pull
裝完之後,直接在 Claude Code 裡這樣派工就會生效:
請用 backend-engineer 實作 issue #12。
目標:新增 FinMind 台股價量 provider
範圍外:不要動既有的資料清洗流程
必讀:docs/architecture/data-pipeline.md
分支:feature/12-finmind-provider
但我的建議是不要照抄。 這套協定裡有很多是我自己的偏好(繁中 commit、GitHub Issues、產出路徑)。真正值得帶走的是三個結構性決定:
Fork 一份,把裡面的專案規範換成你自己的,比整套照用有用。

圖說:一張任務書長這樣。欄位定義在
_PROTOCOL.md第 2 節
如果你是剛開始用 Claude Code、還沒到需要多 agent 協作的階段,我另外有一個從零開始的系列「Claude Code 實戰手冊」,從安裝、用量計費、CLAUDE.md 一路寫下來,可以先從那邊開始。
有踩到不一樣的坑,歡迎在留言區告訴我——這套協定的每一條都是踩出來的,我很想知道還有哪些我還沒踩到。