|
1 | 1 | --- |
2 | 2 | name: autopilot-address-review |
3 | | -description: autopilot のレビュー指摘対応フェーズ。人間が PR に残した指摘に対応し、修正を push して再び人間レビューに渡す。autopilot Runner から非対話で起動される。 |
| 3 | +description: autopilot のレビュー対応フェーズ。人間が HITL を解除した PR について diff と全コメントを理解し、質問・改善依頼に対応し、再び人間に渡す。autopilot Runner から非対話で起動される。 |
4 | 4 | argument-hint: "[issue number]" |
5 | 5 | disable-model-invocation: true |
6 | 6 | --- |
7 | 7 |
|
8 | | -# /autopilot-address-review — Address review phase |
| 8 | +# /autopilot-address-review — Review handling phase |
9 | 9 |
|
10 | 10 | **Follow the autopilot autonomous contract: `docs/autopilot/autonomous-contract.md`.** |
11 | 11 | 対話的に質問しない。終了時に `AUTOPILOT_RESULT_FILE` へ JSON を書き、pane に signal トークンを出す。 |
12 | 12 |
|
13 | | -対象 Issue は `$ARGUMENTS` または `AUTOPILOT_ISSUE`。人間が **HITL=No に戻した(差し戻した)** PR の指摘に対応する。 |
| 13 | +対象 Issue は `$ARGUMENTS` または `AUTOPILOT_ISSUE`。人間が **`🙋 HITL` を外した(差し戻した)** PR を扱う。 |
14 | 14 |
|
15 | | -ゴール: **人間レビューコメントを読み、対応(修正/返信)し、再び人間レビュー(HITL=Yes)に渡す。** |
| 15 | +このフェーズは Review 解除時の**唯一の入口**(#815)。daemon は approve / changes-requested などの |
| 16 | +構造化シグナルで分岐せず、解除されたら必ずこのスキルを起動する。**何をすべきかはここで判断する**: |
| 17 | +PR の diff と全コメントを読んで意図を分類し、対応する/何もしない/人間に聞く、を決める。 |
16 | 18 |
|
17 | 19 | ## 前提: 既存 PR ブランチで作業する |
18 | 20 |
|
19 | | -このフェーズは新規ブランチではなく **既存 PR のブランチ**で作業する。worktree は #767 の |
20 | | -既存ブランチ checkout モードで用意する: |
| 21 | +新規ブランチではなく **既存 PR のブランチ**で作業する(daemon が `--pr` で worktree を用意する): |
21 | 22 |
|
22 | 23 | ```bash |
23 | 24 | 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" |
25 | 26 | ``` |
26 | 27 |
|
27 | | -(daemon がこのフェーズの worktree を `--pr` で用意する。スキル内で再実行しても冪等。) |
28 | | - |
29 | 28 | ## 手順 |
30 | 29 |
|
31 | | -### 1. 未対応のレビュー指摘を集める |
| 30 | +### 1. PR 全体を理解する(diff + 全コメント) |
| 31 | + |
| 32 | +レビューを「未対応スレッドだけ」ではなく **PR 全体の文脈**で理解する: |
32 | 33 |
|
33 | 34 | ```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 |
36 | 41 | ``` |
37 | 42 |
|
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) | |
39 | 57 |
|
40 | | -### 2. 対応する |
| 58 | +### 3. 対応する |
41 | 59 |
|
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 | +``` |
45 | 76 |
|
46 | | -### 3. 再び人間レビューへ |
| 77 | +**(b) LGTM のみ・対応不要 → 人間のマージ待ち**(こちらからは何もしない。Review のまま人間に戻す): |
47 | 78 |
|
48 | 79 | ```bash |
49 | 80 | 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)。人間のマージ待ち。", |
51 | 82 | "nextStatus":"Review","nextAiStatus":null,"hitl":true,"size":null,"kind":null,"createdSubIssues":[],"prUrl":"<PR URL>"} |
52 | 83 | EOF |
53 | 84 | echo AUTOPILOT_DONE |
54 | 85 | ``` |
55 | 86 |
|
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 | +> 人間は再び 🙋 を外せば、また本スキルが起動して続きを判断する。 |
57 | 99 |
|
58 | 100 | ## 注意 |
59 | 101 |
|
60 | 102 | - **既存 PR ブランチで作業**(新ブランチを切らない)。1 Issue = 1 PR。 |
61 | | -- 冪等: 同じ指摘に二重対応・二重コメントしない。 |
| 103 | +- **コンフリクトは autopilot で解消しない。** rebase/merge コンフリクトに遭遇したら解消を試みず、 |
| 104 | + 論点を整理した**コメント + `AUTOPILOT_HITL`** で人間に渡す(コンフリクト解消は人間の役割)。 |
| 105 | +- 冪等: 同じ指摘に二重対応・二重コメントしない。既存の bot まとめコメントがあれば編集して使う。 |
62 | 106 | - `AskUserQuestion` を使わない。Project/PR の状態反映は daemon(単一ライター)。 |
63 | 107 | - bot 認証(`bin/bot-git` / `bin/bot-token`)。 |
0 commit comments