Skip to content

Commit 3742a48

Browse files
fix(autopilot): rectify review handling and run-failure handoff
#815: drive Draft/Ready from Status (not the HITL label), derive PR approval from individual reviews when reviewDecision is empty, and route every Review HITL-release through address-review so the skill reads the diff and all comments to classify intent (question/request/LGTM/unclear) instead of branching on structured signals. #816: when a run fails or stalls, always post an explanatory comment and set Status=Blocked (no more silent 🙋), and detect items stuck at In Progress + an AI working status with no live run, handing them to a human after a grace period. Closes #815 Closes #816 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 4922f8b commit 3742a48

8 files changed

Lines changed: 451 additions & 125 deletions

File tree

Lines changed: 65 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,107 @@
11
---
22
name: autopilot-address-review
3-
description: autopilot のレビュー指摘対応フェーズ。人間が PR に残した指摘に対応し、修正を push して再び人間レビューに渡す。autopilot Runner から非対話で起動される。
3+
description: autopilot のレビュー対応フェーズ。人間が HITL を解除した PR について diff と全コメントを理解し、質問・改善依頼に対応し、再び人間に渡す。autopilot Runner から非対話で起動される。
44
argument-hint: "[issue number]"
55
disable-model-invocation: true
66
---
77

8-
# /autopilot-address-review — Address review phase
8+
# /autopilot-address-review — Review handling phase
99

1010
**Follow the autopilot autonomous contract: `docs/autopilot/autonomous-contract.md`.**
1111
対話的に質問しない。終了時に `AUTOPILOT_RESULT_FILE` へ JSON を書き、pane に signal トークンを出す。
1212

13-
対象 Issue は `$ARGUMENTS` または `AUTOPILOT_ISSUE`。人間が **HITL=No に戻した(差し戻した)** PR の指摘に対応する
13+
対象 Issue は `$ARGUMENTS` または `AUTOPILOT_ISSUE`。人間が **`🙋 HITL` を外した(差し戻した)** PR を扱う
1414

15-
ゴール: **人間レビューコメントを読み、対応(修正/返信)し、再び人間レビュー(HITL=Yes)に渡す。**
15+
このフェーズは Review 解除時の**唯一の入口**#815)。daemon は approve / changes-requested などの
16+
構造化シグナルで分岐せず、解除されたら必ずこのスキルを起動する。**何をすべきかはここで判断する**:
17+
PR の diff と全コメントを読んで意図を分類し、対応する/何もしない/人間に聞く、を決める。
1618

1719
## 前提: 既存 PR ブランチで作業する
1820

19-
このフェーズは新規ブランチではなく **既存 PR のブランチ**で作業する。worktree は #767
20-
既存ブランチ checkout モードで用意する:
21+
新規ブランチではなく **既存 PR のブランチ**で作業する(daemon が `--pr` で worktree を用意する):
2122

2223
```bash
2324
PR=$(GH_TOKEN="$(bin/bot-token)" gh pr list --repo "$AUTOPILOT_REPO" --search "Closes #$AUTOPILOT_ISSUE in:body" --state open --json number -q '.[0].number')
24-
bin/autopilot-worktree create "$AUTOPILOT_ISSUE" --pr "$PR" # PR ヘッドブランチを checkout
25+
bin/autopilot-worktree create "$AUTOPILOT_ISSUE" --pr "$PR"
2526
```
2627

27-
(daemon がこのフェーズの worktree を `--pr` で用意する。スキル内で再実行しても冪等。)
28-
2928
## 手順
3029

31-
### 1. 未対応のレビュー指摘を集める
30+
### 1. PR 全体を理解する(diff + 全コメント)
31+
32+
レビューを「未対応スレッドだけ」ではなく **PR 全体の文脈**で理解する:
3233

3334
```bash
34-
GH_TOKEN="$(bin/bot-token)" gh pr view "$PR" --repo "$AUTOPILOT_REPO" --json comments,reviews,reviewThreads
35-
GH_TOKEN="$(bin/bot-token)" gh api repos/$AUTOPILOT_REPO/pulls/$PR/comments # inline コメント
35+
# diff(何が変わったか)
36+
GH_TOKEN="$(bin/bot-token)" gh pr diff "$PR" --repo "$AUTOPILOT_REPO"
37+
# 会話コメント・レビュー本文・レビュースレッド
38+
GH_TOKEN="$(bin/bot-token)" gh pr view "$PR" --repo "$AUTOPILOT_REPO" --json title,body,comments,reviews,reviewThreads
39+
# inline(行コメント)
40+
GH_TOKEN="$(bin/bot-token)" gh api repos/$AUTOPILOT_REPO/pulls/$PR/comments
3641
```
3742

38-
bot 自身のコメントや解決済みは除外。人間からの未対応指摘だけを対象にする。
43+
bot 自身のコメント・解決済みスレッドは文脈として読むだけ(対応対象からは外す)。
44+
45+
### 2. 人間のフィードバックを分類する
46+
47+
人間(bot 以外)の各コメント・レビューを、**自由文の意図**で次のいずれかに分類する。
48+
構造化シグナル(approve/changes-requested)だけに頼らない — approve でも本文に改善依頼が
49+
書かれていれば対応する。逆に "changes requested" でも実質 LGTM なら対応不要なことがある。
50+
51+
| 種別 || 対応 |
52+
|---|---|---|
53+
| **LGTM / 称賛 / 単なる感想** | 「いいですね」「approve します」「OK」 | **何もしない**(コードも返信も不要) |
54+
| **質問** | 「ここはなぜ X にした?」「Y は考慮した?」 | bot で**返信**する。コードを変える必要があれば変える |
55+
| **改善依頼 / 変更要求** | 「Z に直して」「テストを追加して」「命名を変えて」 | worktree で**修正**する |
56+
| **判断がつかない** | 意図が曖昧・複数解釈・前提が不明 | **人間に質問**(後述 HITL) |
3957

40-
### 2. 対応する
58+
### 3. 対応する
4159

42-
- コード修正が要る指摘 → worktree 内で修正 → 関連テスト/lint → `bin/bot-git` でコミット・push。
43-
- 議論/質問の指摘 → PR に bot で返信(必要なら判断を仰ぐ場合は HITL)。
44-
- 各指摘に「対応した/返信した」が辿れるよう、まとめコメントを 1 件残す。
60+
- **改善依頼**: worktree 内で修正 → 関連テスト/lint → `bin/bot-git` でコミット・push。
61+
- **質問**: PR に bot で返信。コード変更を伴うならあわせて push。
62+
- 対応の有無が辿れるよう、**まとめコメントを 1 件**残す(「指摘 N 件: 対応 a 件 / 返信 b 件 / 対応不要 c 件」)。
63+
- LGTM など対応不要のみで、コードに触る必要が無ければコミットしない(冪等・無駄 push をしない)。
64+
65+
### 4. 終了する(3 つの出口)
66+
67+
**(a) 質問・改善依頼に対応した → 再び人間レビューへ**(再レビュー/マージ判断を仰ぐ):
68+
69+
```bash
70+
cat > "$AUTOPILOT_RESULT_FILE" <<EOF
71+
{"issue":$AUTOPILOT_ISSUE,"phase":"address-review","signal":"done","summary":"指摘 <N> 件対応(修正 <a>/返信 <b>)。再レビューへ。",
72+
"nextStatus":"Review","nextAiStatus":null,"hitl":true,"size":null,"kind":null,"createdSubIssues":[],"prUrl":"<PR URL>"}
73+
EOF
74+
echo AUTOPILOT_DONE
75+
```
4576

46-
### 3. 再び人間レビューへ
77+
**(b) LGTM のみ・対応不要 → 人間のマージ待ち**(こちらからは何もしない。Review のまま人間に戻す):
4778

4879
```bash
4980
cat > "$AUTOPILOT_RESULT_FILE" <<EOF
50-
{"issue":$AUTOPILOT_ISSUE,"phase":"address-review","signal":"done","summary":"レビュー指摘 <N> 件対応。再レビューへ。",
81+
{"issue":$AUTOPILOT_ISSUE,"phase":"address-review","signal":"done","summary":"対応不要(LGTM)。人間のマージ待ち。",
5182
"nextStatus":"Review","nextAiStatus":null,"hitl":true,"size":null,"kind":null,"createdSubIssues":[],"prUrl":"<PR URL>"}
5283
EOF
5384
echo AUTOPILOT_DONE
5485
```
5586

56-
判断が割れる指摘で人間の意見が要るなら、論点を整理してコメント + `AUTOPILOT_HITL` で確認する。
87+
**(c) 判断がつかない → 人間に質問**(論点を整理してコメント済み):
88+
89+
```bash
90+
cat > "$AUTOPILOT_RESULT_FILE" <<EOF
91+
{"issue":$AUTOPILOT_ISSUE,"phase":"address-review","signal":"hitl","summary":"指摘の意図が不明。確認待ち。",
92+
"reason":"<何を判断してほしいか>","commentUrl":"<投稿コメント URL>","nextStatus":"Review"}
93+
EOF
94+
echo AUTOPILOT_HITL
95+
```
96+
97+
> (a)(b) はどちらも `hitl:true` で人間の番に戻す。違いは「コードを変えたか」だけ。
98+
> 人間は再び 🙋 を外せば、また本スキルが起動して続きを判断する。
5799
58100
## 注意
59101

60102
- **既存 PR ブランチで作業**(新ブランチを切らない)。1 Issue = 1 PR。
61-
- 冪等: 同じ指摘に二重対応・二重コメントしない。
103+
- **コンフリクトは autopilot で解消しない。** rebase/merge コンフリクトに遭遇したら解消を試みず、
104+
論点を整理した**コメント + `AUTOPILOT_HITL`** で人間に渡す(コンフリクト解消は人間の役割)。
105+
- 冪等: 同じ指摘に二重対応・二重コメントしない。既存の bot まとめコメントがあれば編集して使う。
62106
- `AskUserQuestion` を使わない。Project/PR の状態反映は daemon(単一ライター)。
63107
- bot 認証(`bin/bot-git` / `bin/bot-token`)。

docs/autopilot/README.md

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -150,23 +150,32 @@ merge 済みか**を GitHub に問い合わせ(`closedByPullRequestsReferences
150150

151151
---
152152

153-
## Review 解除後の自動遷移(address-review / verify
153+
## Review 解除後の自動遷移(address-review に一本化・#815
154154

155155
`Review` の item は人間レビュー待ち(`🙋 HITL` ラベルあり)。人間がレビューを終えてラベルを外すと、
156-
daemon が PR のレビュー状態を見て次フェーズを自動ディスパッチする(`phaseForItem` + `getReviewContext`)。
156+
daemon は **構造化シグナル(approve/changes-requested)で機械的に分岐せず、必ず
157+
`autopilot-address-review` を起動する**`phaseForItem` が Review 解除 → `address-review`)。
157158

158-
| PR レビュー状態(HITL 解除後) | 自動ディスパッチ |
159+
approve でも本文に改善依頼が書かれていたり、"changes requested" でも実質 LGTM だったりと、
160+
自由文の意図は構造化シグナルでは判定できない。そこで**判断はスキル側に置く**: address-review が
161+
PR の **diff と全コメント(Issue/レビュー本文/インライン)**を読んで分類する。
162+
163+
| スキルの分類(HITL 解除後) | 対応 |
159164
|---|---|
160-
| 変更要求 / 未対応の人間レビューコメントが残る | `autopilot-address-review`(指摘対応へ) |
161-
| approve のみ(未対応コメントなし) | `autopilot-verify`(DoD 確認へ) |
162-
| どちらの signal も無い | 何もしない(保守的に待つ) |
165+
| 質問 | bot で返信(必要ならコード修正)→ 再レビューへ |
166+
| 改善依頼 / 変更要求 | worktree で修正・push → 再レビューへ |
167+
| LGTM / 対応不要 | 何もしない → 人間のマージ待ち |
168+
| 判断がつかない | 論点を整理してコメント + `AUTOPILOT_HITL`(人間に質問) |
163169

164-
- コメントは approve より優先する(approve しつつ未対応コメントを残したら指摘対応が先)。
165170
- 解除シグナルは **OR セマンティクス**: Issue の `🙋 HITL` ラベル / PR の `🙋 HITL` ラベルの
166171
**いずれか1つでも除去**なら解除(`getReviewContext` が2面を集め、`phaseForItem``isHitlReleased`
167172
で判定)。daemon が両面を atomic に同期する(後述「PR 側の状態可視化」)ので、人間は目の前の
168173
PR ラベルを外すだけで差し戻せる。
169-
- address-review / verify は **既存 PR ブランチ**で作業する(daemon が worktree を `--pr` で用意)。
174+
- address-review は **既存 PR ブランチ**で作業する(daemon が worktree を `--pr` で用意)。
175+
- **コンフリクトは autopilot で解消しない**(rebase/merge コンフリクトは人間の役割)。スキルは
176+
解消を試みず HITL で人間に渡す。
177+
- `autopilot-verify`(DoD 確認)は Review 解除では自動起動しない。必要なら人間が手動で
178+
inject する(多くの PR は DoD が Playwright 不要なため、自動 verify は外した)。
170179

171180
---
172181

@@ -197,7 +206,7 @@ PR 側は読み取り投影)。実装は daemon の `applyPrProjection`(ポ
197206
|---|---|---|
198207
| `🤖 autopilot` ラベル | autopilot 管理対象(AI 処理対象) | Issue/PR に常時担保 |
199208
| `🙋 HITL` ラベル | 人間の対応待ち(**HITL の唯一の真実**#813| 人間に渡すとき Issue/PR の両面に付与 / release・merge で除去 |
200-
| Draft ⇄ Ready for review | Draft=AI 作業中 / Ready=人間レビュー待ち | `🙋 HITL` ラベルあり→Ready / それ以外→Draft |
209+
| Draft ⇄ Ready for review | Draft=AI 作業中 / Ready=人間が見る段階 | **Status 基準**#815): `Review`/`DoD`/`Close`/`Blocked`→Ready / それ以外`In Progress` 等)→Draft |
201210
| sticky ステータスコメント | bot が1コメントを編集し続け、連携 Issue の Project 状態を投影 | Status / AI Status / HITL(ラベル由来)/ Size をマーカー付き 1 コメントに upsert |
202211

203212
- 対象は連携 PR を持ちうる post-PR ステータス(In Progress / Review / DoD / Blocked)の leaf。

docs/autopilot/autonomous-contract.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ PR を見ただけで連携 Issue の状態が分かるよう、**daemon が PR
162162
|---|---|---|
163163
| `🤖 autopilot` ラベル | autopilot 管理対象(AI 処理対象)の PR/Issue | 常時付与 |
164164
| `🙋 HITL` ラベル | 人間の対応待ち(レビュー/判断/マージ)。**HITL の唯一の真実**#813| 人間に渡すとき Issue/PR の両面に付与、release で除去 |
165-
| **Draft ⇄ Ready for review** | Draft=AI 作業中 / Ready=人間レビュー待ち | 実装中は Draft、HITL に渡すとき Ready |
165+
| **Draft ⇄ Ready for review** | Draft=AI 作業中 / Ready=人間が見る段階 | **Status 基準**#815): `Review`/`DoD`/`Close`/`Blocked`→Ready、それ以外(`In Progress` 等)→Draft。HITL ラベルでは判定しない(解除しても Status が Review なら Ready を維持) |
166166
| **sticky ステータスコメント** | bot が1つのコメントを編集し続け、連携 Issue の Project 状態(Status / AI Status / HITL / Size)を投影 | フェーズ遷移ごとに更新 |
167167

168168
- 専用の「作業中」ラベルは作らない(**Draft** が「AI 作業中・触らないで」を兼ねる)。

0 commit comments

Comments
 (0)