MENU

13|Issueは何を決め、Pull Requestは何を証明するのか

AIとGitHubで、目的・設計・差分・完了を混ぜない

AI Work Governance|専門テーマ — Issue / Pull Requestの責務

GitHubで仕事を管理するとき、多くの人はIssueとPull Requestを使います。

Issueへ課題を書く。変更を作る。Pull Requestを開く。レビューしてマージする。

流れは単純に見えます。

しかしAIと多くの作業を進めると、IssueとPull Requestを使っているだけでは役割が自然に分かれないことが分かります。

  • Issueの目的がPR途中で別の目的へ変わる
  • 重要な設計判断がコメントにだけ残る
  • PRがmergeされたため親Issueまで完了扱いになる
  • 最新説明がPR本文にしかなく、Issueが古い
  • 設計と実装が一つのPRへ混ざる
  • AIが「新しい文章」を「最上位の正本」と誤認する

問題はGitHubの機能不足ではありません。

どの成果物が、何を所有するのかを決めていないこと。

です。


目次

まずGitHubの機能と、自分たちの運用ルールを分ける

GitHub Issuesは、アイデア、フィードバック、タスク、不具合などの仕事を計画・議論・追跡する柔軟な場所です。

Pull Requestはリポジトリ変更を提案し、議論、レビュー、確認を経てマージするための場所です。

ここまではGitHubの機能です。

一方、

Issue = 問題・目的の責任主体
設計記録 = 設計判断の責任主体
進捗管理Issue = 進捗の責任主体
実装PR = 差分・検証の責任主体

といった分け方は、私たちがAI協働のために追加した運用モデルです。

これをGitHub一般の唯一の正解として扱ってはいけません。


一番短い理解

まずは次だけ覚えると分かりやすいです。

Issueからマージ後の完了確認までの責務Issueが目的と範囲を持ち、設計が解き方を決め、Pull Requestが変更と検証を提示し、レビューとマージの後に親の目的まで完了したかを別に確認する。GIIssue / なぜ・何を・どこまでD設計 / なぜこの解き方かI->DPPull Request / 何を変え・どう確かめたかD->PRレビュー / 現在の差分は妥当かP->RMマージ / リポジトリ変更を受理R->MC親の目的も完了した?M->C

IssueとPRだけで全部を表現する必要はありません。

変更が小さければIssue → PRで十分です。

設計判断が重ければ、その間に設計記録や設計PRを置きます。


Issueが主に保持するもの

Issueが強いのは、何を解く仕事なのかを保持することです。

  • 問題
  • 望む結果
  • 対象範囲 / 扱わないこと
  • 関係
  • 完了条件
  • 未解決の問い
問題
  ↓
望む結果
  ↓
対象範囲 / 扱わないこと
  ↓
完了条件

Issueは実装の全履歴を抱える必要はありません。

一方、目的そのものが変わったのにPR本文だけを書き換え、Issueを古いままにすると、仕事の識別が壊れます。


Pull Requestが主に提示するもの

Pull Requestが強いのは、実際の差分をレビューできることです。

  • 何を変更したか
  • 親Issue / 設計との関係
  • どの選択をしたか
  • 何をテストしたか
  • 何をまだしていないか
  • 既知の限界
  • レビューで確認してほしい点
親Issueの目的
  ↓
具体的な差分
  ↓
検証の証拠
  ↓
レビュー
  ↓
マージ判断

PRが暗黙にやってはいけないのは、親Issueの目的を勝手に再定義することです。

実装中に「問題自体が違った」と分かったなら、PRの一節で確定するのではなく、Issueや設計の責任主体へ戻します。


設計PRと実装PRを分ける理由

すべての変更で分ける必要はありません。

しかし、次のような変更では「なぜその解き方を選ぶのか」を先にレビューする価値があります。

  • 複数案にトレードオフがある
  • 共有スキーマ / 契約を変える
  • 権限の責任主体を変える
  • 複数実行環境へ影響する
  • 移行 / 巻き戻しコストが大きい
設計と実装を分離する流れIssueから設計記録、設計PR、実装PR、検証へ進み、設計受理と実装完了を別状態として扱う。GIIssue / 何を解く?DR設計記録 / なぜ・どう解く?I->DRDP設計PR / この設計を受理する?DR->DPIP実装PR / 受理設計を差分へDP->IPV検証IP->V

ここで重要なのは、

設計が受理された
  !=
実装済み
  !=
実行環境で有効
  !=
運用で検証済み

ということです。

AIはリポジトリに文書が存在すると、「もう実装されている」と誤認しやすいため、この状態分離は特に重要です。


進捗管理Issueは「設計」ではなく「進行」を持つ

一つの設計を複数PRで実装するとき、進捗管理Issueが役立ちます。

設計
  ├─ スキーマ
  ├─ adapter
  ├─ 移行
  ├─ docs
  └─ rollout

進捗管理Issueが持つのは、

  • 分割作業
  • 前提条件
  • 依存関係
  • 進捗
  • 残る受け入れ条件
  • 後続作業の責任主体

です。

設計の意味まで進捗管理Issueで再定義すると、正本が二つになります。

逆に、小さな変更へ毎回進捗管理Issueを追加すると保守費用になります。


レビューは「現在の差分」に対する証拠

レビューは、その後の変更まで永続的に保証する承認ではありません。

レビュー結果
  = ある差分 / 対象範囲を見た評価

マージ権限
  = 別の権限

レビュー後に大きな変更が入れば、鮮度を再確認する必要があります。

この分離はAIのレビュー担当を使う場合にも重要です。

レビューする能力があることと、マージしてよいことは別です。


コメントは重要だが、隠れた正本にしない

GitHubのコメントには重要な判断が残ります。

しかし、長く使う判断をコメントだけに残すと、後から見つけにくくなります。

コメントの重要判断を正本へ昇格する流れコメントで出た重要判断が長期利用されるかを確認し、必要ならIssue、設計、方針など適切な正本へ昇格して元コメントを根拠として残す。GCコメントで重要判断Q長期的に使う?C->QE議論 / 記録として保持Q->EいいえPIssue / 設計 / 方針等へ昇格Q->PはいR元コメントを根拠として参照P->R

コメントを無価値にするのではなく、長期的な権限・正本になるなら適切な責任主体へ昇格すると考えます。


マージは「親Issueの完了」と同じではない

PRのマージが証明するのは、基本的には、

そのリポジトリ変更が受け入れられた。

ということです。

必ずしも証明しないものがあります。

  • 親Issueの全受け入れ条件
  • 実行環境で有効化済み
  • 移行完了
  • 外部公開
  • 後続リスク解消
  • 進捗管理Issueの全分割作業完了
PRがマージされた
  ≠ 親の目的が完了
  ≠ 配備済み
  ≠ 公開済み
  ≠ 検証済み

この区別があると、「マージしたから全部クローズ」という機械的な誤りを減らせます。


すべてを重くしない

責務を分けることと、成果物を増やすことは同じではありません。

小さな変更なら、

Issue
  ↓
実装PR

で十分です。

設計判断を独立させる経路が必要なのは、独立した設計判断を残す価値があるときです。

責務分離
  !=
成果物の増殖

です。


まとめ

IssueとPull Requestの役割を一言で分けるなら、

Issue
  = なぜ、何を、どこまで解くか

Pull Request
  = 何を変え、どう確かめたか

です。

ただし本当に大切なのはこの文言そのものではありません。

目的、設計、差分、検証、進捗、完了判断を、一つの成果物へ暗黙に押し込まないこと。

AIとGitHubで長い仕事を続けるほど、この責務分離が効いてきます。

この記事を書いた人

コメント

コメントする

目次