Pipeline 狀態機
Pipeline 的所有行為由有限狀態機(Finite State Machine)驅動。本頁定義完整的狀態、轉換規則、安全限制。
狀態定義
| 狀態 | 語義 | 可執行操作 |
|---|---|---|
IDLE | 空閒,等待啟動新 Phase | start_phase, set_phase_plan, stop_pipeline |
PHASE_PREPARING | Phase 初始化中,正在配置 Issues | begin_developing, stop_pipeline |
PHASE_DEVELOPING | Dev 正在開發,PM 監控中 | report_completion, request_human, stop_pipeline |
PHASE_REVIEWING | PR 已建立,Reviewer 審查中 | report_review, request_human, stop_pipeline |
COMPLETED | Pipeline 所有 Phase 完成 | stop_pipeline(清理用) |
HUMAN_NEEDED | 需要人工介入(自動暫停) | resume, stop_pipeline |
PAUSED | 手動暫停 | resume, stop_pipeline |
STOPPED | 已終止,不可恢復 | 無(需重新建立 Pipeline) |
完整狀態圖
轉換規則詳解
IDLE → PHASE_PREPARING
| 項目 | 內容 |
|---|---|
| 觸發 | start_phase(phase: number, issues: string[]) |
| Guard | 當前狀態必須是 IDLE |
| 動作 | 初始化 Phase 資料結構,將所有 issues 標記為 todo |
| 結果 | 進入 PHASE_PREPARING |
PHASE_PREPARING → PHASE_DEVELOPING
| 項目 | 內容 |
|---|---|
| 觸發 | begin_developing() |
| Guard | 當前狀態必須是 PHASE_PREPARING |
| 動作 | 將第一個 issue 標記為 in_progress,開始接收訊息 |
| 結果 | 進入 PHASE_DEVELOPING |
PHASE_DEVELOPING → PHASE_DEVELOPING(Issue 完成,還有下一個)
| 項目 | 內容 |
|---|---|
| 觸發 | report_completion(issue, "pass") |
| Guard | 尚有 todo 狀態的 issues |
| 動作 | 將完成的 issue 標記為 done,下一個 issue 標記為 in_progress |
| 結果 | 維持 PHASE_DEVELOPING |
PHASE_DEVELOPING → PHASE_REVIEWING(所有 Issues Done)
| 項目 | 內容 |
|---|---|
| 觸發 | report_completion(issue, "pass") |
| Guard | 本 Phase 所有 issues 都已 done |
| 動作 | 標記 Phase 開發完成,通知 PM 建立 PR |
| 結果 | 進入 PHASE_REVIEWING |
PHASE_DEVELOPING → HUMAN_NEEDED(Issue 失敗 3 次)
| 項目 | 內容 |
|---|---|
| 觸發 | report_completion(issue, "fail") |
| Guard | 該 issue 的 failCount >= 3 |
| 動作 | 記錄失敗原因,暫停 Pipeline,通知所有 Agent |
| 結果 | 進入 HUMAN_NEEDED |
PHASE_REVIEWING → IDLE(Review 通過,還有下一個 Phase)
| 項目 | 內容 |
|---|---|
| 觸發 | report_review("approved", hasNextPhase: true) |
| Guard | Phase Plan 中存在下一個 Phase |
| 動作 | Merge PR,如果 Auto-Advance 開啟則啟動冷卻計時 |
| 結果 | 進入 IDLE(等待 Auto-Advance 或手動啟動下一 Phase) |
PHASE_REVIEWING → COMPLETED(最終 Phase 通過)
| 項目 | 內容 |
|---|---|
| 觸發 | report_review("approved", hasNextPhase: false) |
| Guard | 這是最後一個 Phase |
| 動作 | Merge PR,標記整個 Pipeline 完成 |
| 結果 | 進入 COMPLETED |
PHASE_REVIEWING → PHASE_DEVELOPING(Review 要求修正)
| 項目 | 內容 |
|---|---|
| 觸發 | report_review("changes") |
| Guard | fixCount < 2 |
| 動作 | PM 產出 fix instructions,重新派工給 Dev |
| 結果 | 回到 PHASE_DEVELOPING |
PHASE_REVIEWING → HUMAN_NEEDED(Review 修正超過 2 輪)
| 項目 | 內容 |
|---|---|
| 觸發 | report_review("changes") |
| Guard | fixCount >= 2 |
| 動作 | 記錄修正歷史,暫停 Pipeline |
| 結果 | 進入 HUMAN_NEEDED |
Error Escalation 決策樹
安全限制摘要
| 機制 | 閾值 | 觸發結果 |
|---|---|---|
| Issue 開發失敗 | 3 次 | HUMAN_NEEDED |
| PR Review 被拒 | 2 輪 | HUMAN_NEEDED |
| Dev 無回應 | 20 分鐘(2 次 timeout) | HUMAN_NEEDED |
| 緊急停止 | .stop-pipeline 檔案存在 | STOPPED |
| Broker 重啟 | — | 從 state.json 恢復 |
狀態持久化
state.json 結構
{
"state": "PHASE_DEVELOPING",
"phase": 2,
"issues": {
"JOP-240": { "status": "done", "failCount": 0 },
"JOP-238": { "status": "in_progress", "failCount": 0 },
"JOP-239": { "status": "todo", "failCount": 0 }
},
"phasePlan": {
"planId": "jope-core",
"phases": [
{ "phase": 1, "issues": ["JOP-237"] },
{ "phase": 2, "issues": ["JOP-240", "JOP-238", "JOP-239", "JOP-241"] }
],
"autoAdvance": true,
"cooldownMinutes": 5
},
"fixCount": 0,
"autoAdvance": {
"active": false,
"targetPhase": null,
"cooldownEndTime": null
},
"agents": {
"pm": { "connected": true, "lastSeen": "2026-04-11T01:10:00Z" },
"dev": { "connected": true, "lastSeen": "2026-04-11T01:16:00Z" },
"reviewer": { "connected": false, "lastSeen": null }
}
}
恢復邏輯
Broker 重啟時:
- 讀取
state.json,恢復到最後的狀態 - 如果 Auto-Advance 正在冷卻中,計算剩餘時間並繼續計時
- Agent 重連後,佇列中的未投遞訊息自動重新發送
- 如果重啟前是
PHASE_DEVELOPING,等待 Dev 重連後繼續監控