像 Claude Code、Codex 這類 AI 程式開發代理,可以一起處理程式碼調查、實作、測試、文件更新等工作。
如果只是小型修正,有時只要下達「請修正這個 bug」的指示就能得到足夠好的結果。
但在包含數十到數百個任務的開發中,同樣的做法就行不通了。
這類問題,光靠 AI 的程式開發能力無法解決。
重點在於,要把任務設計成讓 AI 能不迷失地工作、讓人類之後也能驗證的形式。
本文將介紹我們在實際把多個開發任務依序交給 AI 程式開發代理處理時,整理出的以下運作方式:
task-list.md 作為任務管理的唯一正本另外,本文不會列出特定專案名稱、客戶名稱、儲存庫名稱或實際任務 ID,而是以一般化方式整理。
大規模開發最先容易發生的,就是 Prompt 變得巨大。
如果每次都把需求、設計、禁止事項、過去的決策、測試方法、剩餘任務貼到 Prompt 裡,發指令的人和 AI 都很容易看漏重要事項。
另外,如果只用聊天內容來管理進度,會出現以下問題:
聊天很適合作為工作的入口,但不適合當作專案的正本。
因此,必須在對話之外留下「目前正確狀態」。
task-list.md 作為唯一正本作為任務管理中心,在 repository 內放置 docs/task-list.md。
這裡所說的「唯一正本」,意思是當進度判斷出現分歧時,最後以這個檔案為準。
即使 Slack、GitHub Issue、聊天內容與 AI 完成報告的記載不同,正式狀態仍以 task-list.md 內反映的內容為準。
例如可以使用以下格式:
| ID | 任務 | 狀態 | 進度 | 相依性 | 完成條件 | 證據 |
|---|---|---|---:|---|---|---|
| DEV-001 | 建立文章草稿 API | 完成 | 100% | - | API 測試成功 | Test #18 / PR #12 |
| DEV-002 | 防止重複建立 | 進行中 | 70% | DEV-001 | 相同 ID 發送時不會增加投稿 | 等待驗證 |
| DEV-003 | 新增審核畫面 | 未著手 | 0% | DEV-002 | 可執行規格書記載的操作 | - |
至少要包含以下資訊。
項目目的ID用來唯一識別任務任務名稱簡短說明要實現什麼狀態顯示未著手、進行中、等待驗證、完成、保留等進度用來補充狀態本身看不出的中間過程相依性明確指出必須先完成的任務完成條件定義什麼才算結束證據連結測試、PR、log、畫面確認等### 任務 ID 途中不可重複使用
一旦發行過的任務 ID,即使該任務已刪除,也不要再拿去用在別的用途上。
如果重複使用,過去的 commit、PR、測試結果、對話裡提到的 ID 都會變成另一個意思。
如果任務不做了,不要刪掉那一列,而是把狀態改成「中止」或「非對象」,並保留理由。
作業中即使發現其他 bug 或改善項目,也不要直接塞進目前任務。
先判斷它屬於以下哪一類:
若是 1,就在目前任務內處理。
若是 2 或 3,就登錄成新任務,並繼續目前作業。
如果不這樣切分,一個任務就會無限膨脹,永遠無法完成。
正因為是大規模開發,通常才要把進行中的任務限制為 1 件。
AI 可以快速處理多個工作,但如果在同一個 repository 中同時修改多個任務,人類要檢查的組合就會暴增。
例如,若 3 個任務同時對同一個 API 或 DB 做變更,就很難判斷:
因此,基本流程如下:
即使要平行化,也只限於不會寫入相同檔案或相同資料的獨立調查與測試。
若要平行進行多個實作,則要分離 branch 或 Git worktree。
交給 AI 的任務,至少要包含以下 6 項。
不只寫「要改什麼」,也要寫「為什麼要改」。
不好範例:
請修正重複建立。
改善範例:
即使外部系統重新送出相同的候選資料,
也不要建立出多個相同的草稿。
請將重送視為正常流程,重用既有的草稿。
目的清楚後,AI 就不只是把錯誤遮起來,而是能以使用者預期的狀態為基準來實作。
明確列出可以調查與修改的檔案或功能。
變更對象:
- 草稿登錄 API
- 處理外部候選 ID 的投稿 metadata
- 對應的自動化測試
- 相關設計文件與 task-list.md
縮小變更範圍,可以避免 AI 連「順手重構」都一起做了。
明確寫出不能做的事。
禁止事項:
- 不要修改已公開資料
- 不要變更 API 既有回應格式
- 不要一次修正與本任務無關的警告
- 不要為了讓測試通過而把實作改成符合期待值
- 不要在沒有根據下自行補完規格
特別是「不要用推測補上不明點」這條非常重要。
完成條件要寫成第三方能以 Yes/No 判定的形式。
完成條件:
- 第一次請求時會建立 1 筆草稿
- 即使同一個外部候選 ID 重新送出,也不會增加新投稿
- 第二次會回傳與第一次相同的投稿 ID
- 不同的外部候選 ID 會建立不同的草稿
- 包含既有測試在內的相關測試全部通過
像「能正常運作」「已妥善實作」這類說法,不能當作判定標準。
指定要在哪一層驗證什麼內容。
測試 確認內容Unit Test判定邏輯本身是否正確Integration TestAPI、DB、外部 ID 的串接Regression Test既有功能是否被破壞實際環境確認在接近正式環境的配置下是否可操作不是所有任務都必須做齊全部類型。
但要清楚區分哪些測試有做、哪些沒有做,並要求如實回報。
定義 AI 不能自行判斷的界線。
遇到以下情況時,請停止作業並在不變更任何內容的情況下回報:
- 規格文件彼此有矛盾
- 需要刪除目標資料
- DB migration 會影響既有資料
- 需要認證資訊或額外的正式環境權限
- 超出 task-list.md 記載的變更範圍
- 開始時工作樹中已有未確認變更
停止條件不是在限制 AI 的能力。
而是為了先把應由人類判斷的部分切分出來。
實務上,可以使用如下模板:
# 目標任務
DEV-002 防止重複建立
## 開始前確認
- 確認目前 branch、HEAD、git status
- 閱讀 task-list.md 與相關規格文件
- 確認前置任務 DEV-001 已完成
- 若工作樹中已有既有變更,則停止
## 目的
即使同一個外部候選被重新送出,也不要重複建立新的草稿。
## 變更範圍
- 草稿登錄 API
- 外部候選 ID 的保存與查詢處理
- 相關測試
- 相關文件
## 禁止事項
- 不要變更既有 API 的回應格式
- 不要修改已公開投稿
- 不要進行無關的重構
- 規格不明時不要用推測實作
## 完成條件
- 只會在第一次建立草稿
- 重送時會回傳既有投稿 ID
- 不同候選 ID 會被當成不同投稿建立
- 相關測試與既有測試都成功
## 完成時要做的事
- 更新 task-list.md 的狀態、進度與證據
- 自我檢查變更差異
- 建立包含任務 ID 的 commit
- 視需要建立 Draft PR
- 依指定格式回報完成
## 停止條件
- 若發現規格矛盾、破壞性變更、權限不足、既有變更,則停止
每次都要用到的規則,與其反覆貼在 prompt 裡,不如放進 repository 內可持續維護的指示檔。
Codex 可使用 AGENTS.md,Claude Code 可使用 CLAUDE.md。若兩者都要用,建議把共通規則集中在同一處,再由另一方引用,以減少重複。
但不應把單一任務的目的與完成條件也塞進長期規則裡。
放置位置內容AGENTS.md / CLAUDE.md測試指令、禁止事項、Git 運作、review 標準task-list.md任務狀態、相依性、完成條件、證據個別任務指示這次的目的、對象範圍、特定確認事項設計文件系統整體規格、資料結構、判斷理由---
在大規模開發中,特別重要的是把狀態細分。
只有程式碼存在,不代表功能就正確。
例如,下列狀態都不同:
狀態意義未著手調查與實作都還沒開始調查中正在確認規格或既有程式碼實作中正在修改程式碼本地已驗證自動測試等已成功實際環境等待驗證還剩下部署端或真實資料的確認完成已滿足定義的完成條件與必要驗證保留等待外部回覆、權限、規格決定等如果沒有這種區分,AI 可能在把程式寫出來後就回報「完成」,而人類會誤以為已能在實際環境使用。
若還有只能在實際環境確認的項目,不要硬把進度設成 100%,而要標示為「實作完成・等待實際環境驗證」。
即使 AI 回報像下面這樣,也不足以作為完成確認。
已實作防止重複建立的功能。
也新增了測試,運作沒問題。
真正需要的是第三方能追蹤的資訊。
## 結果
- 已實作 DEV-002
- 第一次請求:建立投稿 ID 120
- 使用相同外部候選 ID 的第二次:重用投稿 ID 120
- 投稿數量:維持 1 筆
- 不同的候選 ID:新建立投稿 ID 121
## 測試
- 目標測試:12 件成功、0 件失敗
- 相關回歸測試:48 件成功、0 件失敗
- 實際環境確認:未執行
## Git
- 開始時 HEAD:abc1234
- 結束時 HEAD:def5678
- branch:feature/DEV-002-idempotency
- commit:DEV-002 Prevent duplicate drafts
## 剩餘事項
- 部署到驗證環境後,還需要確認相同請求的重送
- 將 task-list.md 更新為「等待實際環境驗證,90%」
git status重點不是把所有事情看起來都包裝成成功。
而是要如實回報尚未確認的事項。
如果先大量實作程式碼,之後才一起更新測試與文件,就會搞不清楚哪些更新對應到哪個變更。
因此,一個任務要用以下單位來收斂:
task-list.md 與相關文件在 commit message 或 branch 名稱中加入任務 ID,之後會更容易追蹤。
feature/DEV-002-idempotency
fix(DEV-002): prevent duplicate draft creation
Draft PR 不代表「全部都完成了」,而是用來表示變更已整理到可供 review 的單位。
若還有實際環境驗證尚未完成,必須在 PR 內文與 task-list.md 兩邊都明確標示。
對於變更範圍較廣的任務,不要一開始就直接實作,先只要求調查與規劃。
在規劃階段要確認:
如果在這個階段發現變更範圍比預期更大,就要拆分任務。
無論是 Claude Code 還是 Codex,都可以使用在變更前先確認規劃的 Plan 類流程。
但光是做出計畫並不代表就安全。人類要確認這份計畫是否與 task-list.md 的完成條件一致,這點很重要。
如果把 ChatGPT、Claude Code、Codex 等組合起來,就可以分工處理需求整理、實作、review。
但讓多個 AI 都理解同一個 repository 全貌,不一定會提升準確度。若沒有先分配職責一起使用,它們往往會讀同樣的程式與設計文件,重複做相似的調查與說明。
例如可以這樣分工:
擔任者主要職責主要參考資訊輸出人類優先順位、規格判斷、完成判定任務清單、證據、業務需求開始判斷、核准、退回ChatGPT需求整理、指示撰寫、結果 review目標任務、必要規格、變更差異實作指示、指摘事項Claude Code / Codex 程式碼調查、實作、測試目標任務所需的 repository 內資訊差異、測試結果、完成回報重點是,不要在 AI 之間的交接內容裡,每次都附上整個 repository 的說明。
交接資訊原則上只縮限於以下範圍:
實作負責的 AI 會直接從 repository 內確認必要檔案。review 負責的 AI 則先接收目標任務、差異與測試結果,必要時才再確認相關檔案。
像這樣連「誰要看什麼」都先決定好,才是多 AI 運作的 harness 設計。
在把大規模開發交給 AI 時,「希望它自律推進」與「不希望它自行決定」可以同時成立。
日常判斷可以交給 AI,但只要涉及業務、契約、資安、破壞性變更,就要停下來。
停止時的回報也要有固定格式。
## 停止理由
規格書 A 寫明重複時要回傳 409,但規格書 B 則寫成回傳既有 ID。
## 已確認
- 對象:API 規格書 4.2、基本設計書 7.1
- 目前實作:回傳 409
- 檔案變更:無
- Git 狀態:從開始到現在都沒有變更
## 需要判斷的事項
重複時的正式回應,應該是 409 還是回傳既有 ID。
「因為不知道所以停止」不是失敗。
比起毫無根據地實作、增加返工,這是更安全的成果。
實際上,我曾經把 ChatGPT 與 GitHub 串接,並把實作交給 Claude Code 的運作方式。
當初流程如下:
這樣來回反覆時,同樣的程式碼、設計文件、完成回報會一次又一次進入 context。確認精度並沒有因為讀得更多而提升,反而只是不正常地消耗 token。
問題不在於使用了多個 AI,也不在於把較大範圍交給 AI。
真正的問題在於,沒有先在 harness 端設計以下事項,就讓兩個 AI 同時理解整個專案:
之後我把 ChatGPT 限定為需求整理與 review,Claude Code 限定為實作與測試。此外,交接內容只保留目標任務、變更對象、完成條件、差異、測試結果、未確認事項。
對策:
越是擴大 AI 的負責範圍,就越需要人類設計 AI 之間的職責分工與上下文邊界。
請把所有尚未完成的任務從上到下全部實作完。
這種要求一旦在中途遇到規格矛盾或測試失敗,就很難判斷哪些變更該保留。
對策:
AI 並不會完全掌握優先順序、業務重要性與外部相依。
對策:
task-list.md 記錄優先順序與相依性即使測試程式碼通過,也可能因為實際環境設定或資料條件而無法運作。
對策:
如果 AI 把失敗測試的期待值改成符合實作,雖然測試會過,但其實沒有滿足原本需求。
對策:
就算把任務清單更新成 100%,程式碼或環境本身也不會因此改變。
對策:
每次都重複寫同樣的注意事項,遲早會漏掉。
對策:
AGENTS.md 或 CLAUDE.mdgit status把大規模開發交給 Claude Code 或 Codex 時,重點不是寫很長的 prompt。
重點是以下 6 件事:
task-list.md 作為進度管理的唯一正本AI 程式開發代理很擅長執行明確的任務。
但它們不會自動正確決定專案優先順序、業務判斷、風險承受度。
由人類管理「要做什麼、做到哪裡、交給誰、以什麼為完成」,由 AI 推進調查、實作、驗證、記錄。
只要能做到這樣,即使是數十件、數百件任務,也比較能在不迷失狀態下持續開發。
交給 AI 的範圍越大,就越不是減少管理,而是要把職責、資訊流向、完成條件變成可判定的形式。