概要
stuck 検知(#816 isStuckCandidate / daemon detectStuck)が、decompose 完了済みの EPICを
誤って stuck 扱いし Blocked にする。
実例
(対照: #680/#681 は AI Status=Decomposing のまま run 中断で 0 サブ = 本当に stuck。
これらの検知は正しい。区別すべきは「完了済み resting 状態」か「実行中のまま止まった状態」か。)
原因
tools/autopilot/src/phases.js の isStuckCandidate:
status === 'In Progress' && aiStatus && aiStatus !== 'Self-Reviewing'
EPIC Decomposed は decompose が正常終了した EPIC のresting 状態(子の完了待ち)で、実行中の
run を持たなくて当然。これを stuck 扱いするのが誤り。
修正方針
isStuckCandidate の除外に EPIC Decomposed を追加する(Self-Reviewing と同様、
「run が無くて当然の状態」)。Decomposing / Implementing 等の実行中を表す AI Statusは
引き続き stuck 検知の対象に残す(run 中断を正しく捕捉するため)。
phases.js: isStuckCandidate が aiStatus === 'EPIC Decomposed' を false にする。
- 既存の
isStuckCandidate の node:test に「EPIC Decomposed は false」ケースを追加。
(補足: decompose 完了後の EPIC の理想 Status は別途検討の余地があるが、本 issue は
「completed resting 状態を stuck 検知から除外する」最小修正に絞る。)
受け入れ条件
概要
stuck 検知(#816
isStuckCandidate/ daemondetectStuck)が、decompose 完了済みの EPICを誤って stuck 扱いし Blocked にする。
実例
Status=In Progress/AI Status=EPIC Decomposedで子の実装待ち(正常な待機)。ところが 35 分後、stuck 検知が「In Progress + 非 Self-Reviewing の AI Status」を一律 stuck とみなし
誤 Blocked(daemon ログ:
#679: stuck at In Progress/EPIC Decomposed for 36min -> Blocked)。(対照: #680/#681 は
AI Status=Decomposingのまま run 中断で 0 サブ = 本当に stuck。これらの検知は正しい。区別すべきは「完了済み resting 状態」か「実行中のまま止まった状態」か。)
原因
tools/autopilot/src/phases.jsのisStuckCandidate:EPIC Decomposedは decompose が正常終了した EPIC のresting 状態(子の完了待ち)で、実行中のrun を持たなくて当然。これを stuck 扱いするのが誤り。
修正方針
isStuckCandidateの除外にEPIC Decomposedを追加する(Self-Reviewingと同様、「run が無くて当然の状態」)。
Decomposing/Implementing等の実行中を表す AI Statusは引き続き stuck 検知の対象に残す(run 中断を正しく捕捉するため)。
phases.js:isStuckCandidateがaiStatus === 'EPIC Decomposed'を false にする。isStuckCandidateの node:test に「EPIC Decomposed は false」ケースを追加。(補足: decompose 完了後の EPIC の理想 Status は別途検討の余地があるが、本 issue は
「completed resting 状態を stuck 検知から除外する」最小修正に絞る。)
受け入れ条件
isStuckCandidate({status:'In Progress', aiStatus:'EPIC Decomposed'})が falseDecomposing/Implementing等は引き続き true(回帰なし)cd tools/autopilot && node --test緑