task-planner · git:20260911.0837ebf · 2026-09-11 · sha256 f12143327c7315ed

task-planner git:20260911.0837ebfA

Immutable. This exact content is served forever at /api/v1/blob/f12143327c7315ed.

---
name: task-planner
description: 功能段落規劃:把工作拆成依序執行的功能段落(段落內再列小任務),進度表寫進設計文件。當提到任務拆解、微任務、task breakdown、工作分解時啟用;或動手前判斷出這件工作要跨多輪 8 步開發迴圈(多個功能段落)才做得完時主動啟用。一輪迴圈內做得完的工作不啟用。
allowed-tools: Read, Write, Edit, Grep, Glob, Bash, AskUserQuestion
---

# Task Planner — 功能段落規劃

把一件要跨好幾輪 8 步開發迴圈的工作,拆成**段落**(`S1`、`S2`…)與段落裡的**小任務**(`S2-1`、`S2-2`…),
進度表寫進設計文件。換 session、`/compact` 之後,照表就知道做到哪、下一段是哪段。

## 段落與小任務

| 層 | 做法 | 完成條件 |
|---|---|---|
| 小任務 `S2-1` | 實作、驗證、commit(迴圈的步驟 1、2) | 驗證通過且已 commit |
| 段落 `S2` | 小任務全部完成後,整段跑一次步驟 3–8 | 步驟 3–8 全部跑完,才標 `DONE` |

小任務 commit 了,只代表那個小任務完成;段落還差整段的步驟 3–8。

```
S2 租金產生
├── S2-1 DB schema:實作、驗證、commit
├── S2-2 service:實作、驗證、commit
└── S2-3 API:實作、驗證、commit
    ↓ 小任務全部 commit 完
S2 整段跑步驟 3–8
    ↓
S2 = DONE
```

## 步驟

### 1. 讀來源

依序找,存在的才讀:

1. 使用者指定的設計文件(`docs/designs/*.md`,design-brainstorm 的產物)
2. issue、規格或使用者口頭描述

相關的既有程式碼、目錄結構、git 歷史自己查。

完成條件:列出「要做的項目」清單——口頭需求逐句拆開、設計文件逐個模組/端點/元件,加上會被改到的既有程式。

### 2. 切段落

- 段落照功能切:一段做完一個步驟 5 驗得到的功能(打得到的 API、點得到的頁面、跑得出結果的指令)
- 高風險工作不跟其他功能混在同一段,讓 review 專心看它:產生帳款、改帳款狀態、金額計算、改變權限規則、批次或排程刪除資料。
  一般的新增修改(例如表單存月租金)、沿用既有的權限檢查、有外鍵擋著的單筆刪除,照功能放在一起。
  高風險工作單獨驗不到時,只帶上讓它驗得到的最少工作一起成段
- 被依賴的段落排前面,依賴只標在段落層級;表格由上往下就是執行順序

完成條件:清單每一項都放進了某一段;每段都寫得出「步驟 5 要看到什麼」;依賴沒有繞圈,第一段沒有依賴。

### 3. 列小任務

每段拆成小任務,編號 `S<段>-<序>`,照資料模型、服務、API、前端的先後排。
一個小任務的大小以「一次 commit 看得懂」為準(一個 migration、一個服務、一種資源的 API、一個頁面)。每個小任務寫:

- 動詞開頭的名稱、要動的檔案路徑、commit 訊息(結尾帶編號,例如 `feat: 新增租金產生(S2-1)`)
- **驗證方式**,二選一:
  - 用測試驗:先寫會失敗的測試,寫明測試檔、測什麼、跑哪個指令
  - 用其他方式驗(lint、tsc、curl 打真實 API、開頁面看):寫出為什麼這樣比寫測試合適(例如專案規定走真 HTTP、前端沒有測試框架、行為零改動)

設計細節用章節名指回原文,不重抄。開工前得先查清楚的事(外部 API 文件、舊實作的算法),
寫成該段的「開工前提」,不列成小任務。

完成條件:每個小任務都有檔案路徑、驗證方式、commit 訊息;所有要新增的測試整理成一份清單。

### 4. 給使用者批准

在對話裡列出:進度表草稿、每段的小任務、**要新增的測試清單**、假設。
專案裡已經在記進度的地方也列出來,說明打算怎麼換:舊的段落表、「進度以…為準」的句子、專案狀態檔,以及描述這些紀錄用途的句子。

用 AskUserQuestion 問(一次最多 4 題):

- 決策題:來源有多種讀法、或會改變段落與小任務內容的假設,每題附建議答案
- 批准題:「批准:寫進設計文件並 commit」或「要修改」

決策題超過 3 題就分批問,批准題放在最後一批。決策題選了非建議答案,就回步驟 2 重出草稿再問。
使用者批准的測試清單,就是使用者要求加的測試(全域 §3.5:不主動新增測試,使用者要求時例外);實作時想加清單以外的測試,先問。

完成條件:使用者選了批准。

### 5. 寫進設計文件並 commit

- 已有設計文件:在標題與開頭說明之後、第一個 `##` 之前加 `## 進度表`;文件末尾加 `## 段落與小任務`,開頭寫假設、結尾附批准的測試清單。
  文件裡已經有本 skill 產的進度表時,新段落接在同一張表後面,不另開一張
- 沒有設計文件:建 `docs/designs/YYYY-MM-DD-<topic>-design.md`,寫四節:來源、假設、進度表、段落與小任務(結尾附測試清單)
- 步驟 4 列出的舊進度紀錄,照講好的方式換掉,不留兩份各說各話的進度
- 專案根目錄 CLAUDE.md 第一個 `##` 之前,另起一行加指路(原本的連結保持不動):
  `進度以 docs/designs/<檔名>.md 的「進度表」為準:開工先讀表,照表下方的規則做。`
- 專案 CLAUDE.md 對新資料夾、新文件另有規定的(例如新資料夾要附 CLAUDE.md),照規定一起補
- commit:`docs: 新增<主題>的段落進度表`

還沒有 git repo 時,先只寫文件,做到文件寫好為止;S1 的第一個小任務負責 `git init`,
這份文件與指路跟它一起 commit,S1 的 `--start-segment` 在 `git init` 之後跑。

完成條件:步驟 4 講好要換的舊紀錄都換好了;`git log -1` 看得到這個 commit;`git status` 沒有留下這次寫的檔。

## 進度表格式

照這個骨架寫進設計文件。規則區塊整段照抄:接手的 session 只讀文件、沒載入本 skill,也要照得做。

```markdown
## 進度表

| ID | 段落 | 狀態 | 依賴 | 驗收(步驟 5 要看到什麼) | commits |
|---|---|---|---|---|---|
| S1 | 帳號登入 | TODO | — | curl 登入拿到 token;密碼錯回 401 | |
| S2 | 租金產生 | TODO | S1 | 手動觸發 job 產生 1 筆;再觸發不重複 | |

- 狀態只有 `TODO`、`IN_PROGRESS`、`BLOCKED`、`DONE`;同一時間最多一段 `IN_PROGRESS`
- 下一段:由上往下第一個 `TODO`,而且它依賴的段落都已 `DONE`。有段落 `BLOCKED` 時先停下來問使用者,不自己跳去做別段
- 開工:`~/.claude/scripts/check-claude-md.sh --start-segment` 記起點;這段標 `IN_PROGRESS`,commits 欄先填 `<起點>..`(短 SHA;起點是空樹時填它印出的完整 SHA);該段有「開工前提」就先查完,結果寫進段落明細。這些改動跟第一個小任務的 commit 一起送
- 每個小任務:實作、驗證、commit,訊息結尾帶編號(例如 `(S2-1)`)。可用 `SKIP_DOC_CHECK=1` 先跳過 CLAUDE.md 檢查,gate 會記帳
- 小任務 commit 了不等於段落完成。小任務全部 commit 完,而且 SKIP 欠下的 CLAUDE.md 都補上了(最後一個小任務用正常 commit,被 gate 擋就照訊息補),才對整段跑步驟 3–8。範圍從表上這段的起點算。步驟 6、7、8 的 commit 訊息結尾帶段落編號(例如 `(S2)`)
- 標 `DONE`:步驟 3–8 全部跑完才標;commits 欄補上終點(標 `DONE` 之前最後一個 commit 的短 SHA),跟步驟 7、8 的 commit 一起送,7、8 都沒改檔就單獨開一個 docs commit。最後一段標 `DONE` 的同一個 commit,刪掉根目錄 CLAUDE.md 的指路那行
- 接手:`IN_PROGRESS` 那段就是目前這段。`git log --oneline` 找結尾帶 `(S2-` 的 commit,看做完哪幾個小任務;已經有帶 `(S2)` 的 commit,代表步驟 6 之後的步驟做到一半,沒有就從步驟 3 開始
- `BLOCKED` 只用在外部卡住(等使用者決定、環境壞了):同一格寫原因,停下來問使用者。使用者要先做別段時,先用正常 commit 補完這段 SKIP 欠下的 CLAUDE.md(不然 `--start-segment` 會拒絕);回頭做這段時,範圍一樣從表上這段的起點算。依賴還沒完成的段落維持 `TODO`
- 做到一半冒出新工作:先問使用者,同意才加一列 `TODO` 排進該在的位置;ID 不重編,插在中間用 `S2.5`
- 每列一行,細節寫進 commit 訊息
```