Vibe coding workflow

要件からIssueへ。AIに作らせる前に、作るものを決める段取り

AIに「こういうアプリ作って」と頼むと、最初は驚くほど速く動くものが出てきます。ところが機能を足すたびに前の動きが壊れ、何が完成で何が未完成なのか自分でも分からなくなる。この段取りは、その状態を避けるために、作るものを先に文章で固め、小さなタスクに切ってGitHub Issueで管理し、1本ずつAIに渡していく流れです。

読み手
コードは書かないがAIでアプリを作っている人。GitHubのアカウントが無くても、段0で作ります。
使うもの
ファイルやターミナルを代わりに操作できるAI(Claude Code、Cursor など)と、GitHub。この段取りでは、コマンドを打つ工程はすべてAIに頼みます。文章を作る段1〜4だけなら、ChatGPTのような会話だけのAIでも回せます。
題材
本文の例はすべて、架空の「オフ会の出欠管理アプリ」で通します。

全体の流れ

本編は6段あります。各段は「前の段の成果物を受け取り、次の段の成果物を作る」だけの単純な受け渡しです。本題は最初の5段で、6段目の実行はここで作ったIssueを1本ずつ消化する作業になります。その前に、GitHubのアカウントと道具を用意する事前準備(段0)を一度だけ行います。

STAGE 1 要件定義 STAGE 2 仕様書 STAGE 3 設計書 STAGE 4 タスク分解 STAGE 5 Issue登録 STAGE 6 実行 要件定義書(1枚) 仕様書 設計書 タスク一覧(順番つき) 子Issue #2 〜 #6 動くアプリ + PR 入力: 頭の中の構想 Issueを1本ずつ この5段が本題。ここで決めたことが、後の実行の質を決める
矢印の上を流れているのは、各段が作る成果物そのものです。段を飛ばすと、次の段に渡すものが無いまま進むことになります。

なぜこの順番か

理由は3つに絞れます。

  • 作りたいものは、言葉にするまで自分でも決まっていない。AIに丸投げしてぶれるのは、AIの問題ではなく、依頼側の要件が固まっていないからです。要件定義と仕様書は、AIのためというより自分のために書きます。
  • 仕様が先にあると、AIの出力が安定する。会話のたびに前提を言い直す代わりに、仕様書を貼るだけで同じ前提から始められます。
  • 小さく切ると、確認できる。「アプリ全部」は動作確認のしようがありませんが、「日程候補に○×で答えられる」なら5分で確認できます。Issueはその確認単位を記録する場所です。

以下、まず一度だけ行う事前準備(段0)を置き、そのあと6段それぞれを同じ型で説明します。型は、目的、入力と出力、AIに渡すプロンプト、成果物のテンプレート、オフ会アプリでの例、完了チェック、よくある失敗の7項目です。プロンプトとテンプレートはそのままコピーして使えます。

0

事前準備

GitHubのアカウントを自分で作り、道具の導入とリポジトリ作成はAIに頼む

最初に一度だけ

目的

段1〜6は、GitHubを「記録の置き場」として使います。段5でIssueを作り、段6でPull Requestを作るとき、GitHub側の準備が無いとそこで止まります。ここで準備を済ませておきます。

準備は3つです。GitHubのアカウント作成、GitHubをターミナルから扱う道具 gh の導入、アプリ用リポジトリ(保管庫)の作成。このうち自分で行うのはアカウント作成だけで、残りの2つはAIに頼みます。ターミナルは開きません。

入力と出力

入力
メールアドレスと、アプリを置くフォルダ(AIを開いているフォルダ)。
出力
ログイン済みのGitHubアカウント、AIがGitHubを操作できる状態、中身が空のアプリ用リポジトリ。

1. アカウント(自分で)

  1. github.com/signup を開き、メールアドレスとパスワードを入れる。
  2. ユーザー名を決める。半角英数とハイフンだけ。後でリポジトリのURLに入るので、あとから変えにくい。
  3. 届いたメールの確認コードを入れる。プランは無料(Free)で足りる。
  4. 設定から二段階認証(Two-factor authentication)を有効にしておく。スマホの認証アプリで済む。

パスワードやメールの確認コードは、AIに渡さず自分で入力します。

2. 道具とリポジトリ(AIに頼む)

アプリを置きたいフォルダでAIを開き、下の文をそのまま渡します。AIが道具を入れ、GitHubへのログインを案内し、リポジトリを作ってつなぎます。

AIに渡す
GitHub を使う準備を、私の代わりにしてください。私はコードを書かない人間で、ターミナルの操作はしません。

やってほしいこと:
1. GitHub の公式コマンド gh が入っているか確認し、無ければインストールする(git も無ければ一緒に)
2. gh auth status でログイン済みか確認する。未ログインなら gh auth login を実行し、私がブラウザで押す場面になったら「今、何をどこで押すか」を一言で教える
3. このフォルダを git で管理する状態にして、README.md と、docs フォルダ(中に案内用の README.md)を作り、初回コミットする
4. gh repo create で GitHub 上に private(自分だけが見られる)のリポジトリ {アプリ名。半角英数。例: offkai-app} を作り、このフォルダとつないで push する
5. 最後に gh repo view --web でブラウザに開き、README が見えるかを私に確認してもらう

守ってほしいこと:
- 各手順で何をしたかを、私に分かる言葉で1行ずつ報告する
- 途中で私の操作が必要になったら、止まって待つ
- 私のパスワードや確認コードを聞かない

途中でAIが「ブラウザを開いてください」と言う場面が1回あります。ログインの許可です。ブラウザにGitHubのページが開くので、AIが示した8桁のコードを貼って「Authorize」を押します。これだけが自分の操作で、あとはAIが進めます。

最後にブラウザで開いたリポジトリに、README と docs が見えていれば完了です。docs は、段1〜3で作る要件定義書・仕様書・設計書の置き場になります。

参考: AIが裏で実行しているコマンド(自分で打つ必要はありません)
道具の導入
# Mac
brew install gh
# Windows(PowerShell)
winget install GitHub.cli
winget install Git.Git

# GitHub にログインし、確認する
gh auth login
gh auth status
リポジトリの作成
git init
echo "# {アプリ名}" > README.md
mkdir docs
echo "要件定義書・仕様書・設計書をここに置く" > docs/README.md
git add .
git commit -m "初回コミット"
gh repo create {アプリ名} --private --source=. --push
gh repo view --web

AIの報告にこれらの名前が出てきたときに、何をしているかを照らし合わせる用です。

完了チェック

  • GitHubにブラウザでログインでき、二段階認証が有効になっている
  • AIに「gh auth status の結果を見せて」と頼むと、「Logged in」を含む結果が返ってくる
  • ブラウザでリポジトリを開くと、README と docs が見える
  • リポジトリ名の横に Private と表示されている

よくある失敗

コマンドを自分で打とうとして詰まる。この段取りでは、ターミナルに向かう工程はすべてAIに頼みます。AIの報告に知らない言葉が出てきたら、「それは何をしたの」と聞き返せば十分です。
ログインの許可を飛ばす。AIが「ブラウザで押してください」と言った場面を放置すると、段5のIssue登録が「認証されていません」で失敗します。AIに「もう一度ログインを案内して」と頼めば、やり直せます。
private のつもりが public になっている。会場や会費のような実データを入れる前に、リポジトリ名の横の表示を確認します。切り替えはAIに「このリポジトリを private にして」と頼めます。
1

要件定義

誰が、何に困っていて、できると何が嬉しいかを1枚にする

本題

目的

機能の一覧を書く段階ではありません。「困りごと」と「嬉しさ」を言葉にする段階です。ここが曖昧だと、後のすべての段が曖昧なまま進みます。

コツは、AIに書かせるのではなく、AIに聞かせることです。自分が答えているうちに要件が固まります。

入力と出力

入力
頭の中の構想。まとまっていなくて構いません。
出力
要件定義書。A4で1枚に収まる長さ。

プロンプト

AIに渡す
あなたは、これから作るアプリの要件を引き出すインタビュアーです。
私はコードを書かない人間です。技術用語を使わず、私に質問を1つずつしてください。

作りたいもの: {一言で。例: オフ会の出欠を管理するアプリ}

次のことが分かるまで質問を続けてください。
- 誰が使うのか(主催者と参加者など、立場ごとに)
- 今どうやっていて、何に困っているのか
- できるようになると、何が嬉しいのか
- 最低限これができれば十分、と言える範囲
- やらなくていいこと

分かったと判断したら、下のテンプレートの形で要件定義書を書いてください。
私が答えていない項目は「未定」と書き、勝手に補わないでください。

テンプレート:
# 要件定義書
## 目的(一文)
## 使う人
## 今の困りごと
## できるようになること(必須)
## できるようになること(あれば嬉しい)
## やらないこと
## 完成の目安

例

要件定義書(オフ会の出欠管理アプリ)

目的(一文)

趣味の集まりのオフ会について、日程決めと出欠の把握を、主催者がチャットを追いかけずに済ませられるようにする。

使う人

  • 主催者(月1回、10〜20人規模のオフ会を開く。1人)
  • 参加者(常連と初参加が混ざる。スマホから使う)

今の困りごと

  • グループチャットで日程を聞くと、返事が流れて誰が来るのか数えられない
  • 会場と会費を毎回聞かれる
  • 前日に「明日でしたっけ」と聞かれる

できるようになること(必須)

  • 主催者がオフ会を作り、日程の候補を複数出せる
  • 参加者が候補ごとに ○ △ × で答えられる
  • 主催者が、候補ごとの ○ の人数と名前を一覧で見られる
  • 会場と会費をオフ会のページに書いておける

できるようになること(あれば嬉しい)

  • 前日にリマインドのメールが届く

やらないこと

  • 会費の集金(現地で現金)
  • 写真の共有(既存のチャットで足りる)
  • 参加者どうしのチャット

完成の目安

次回のオフ会の日程決めを、グループチャットを使わずこのアプリだけで終えられる。

完了チェック

  • 「目的」が一文で書けている
  • 使う人が立場ごとに分かれている(主催者と参加者、など)
  • 「やらないこと」が3つ以上ある
  • 「完成の目安」が、実際にやってみれば確認できる形になっている
  • 技術の話(データベース、フレームワークなど)が一切出てこない

よくある失敗

機能の羅列から始める。「ログイン、投稿、いいね、通知」と並べても、誰が何に困っているかが無いので、どれが必須か判断できません。
「やらないこと」が空。境界が無いと、AIは善意で機能を足し続けます。やらないことを決めるのは、要件定義の半分です。
AIに全部書かせる。質問なしで書かれた要件定義書は、AIが平均的なアプリを想像して埋めたものです。自分の困りごとは自分しか知りません。
2

仕様書

要件を「画面・データ・ルール」に翻訳する

本題

目的

要件定義書は「何のために」を書いたものです。仕様書はそれを「具体的に何があるか」に翻訳します。画面が何枚あり、それぞれで何ができ、どんなデータを覚えておき、誰に何が許されるか。

ここは技術の一歩手前です。「データベースに何のテーブルを作るか」ではなく、「オフ会には名前と日程候補と会場がある」という日本語の粒度で書きます。

入力と出力

入力
段1の要件定義書。
出力
仕様書。画面一覧、データ、ルール、やらないこと、用語の5節。

プロンプト

AIに渡す
下の要件定義書をもとに、仕様書を書いてください。私はコードを書かない人間です。

守ってほしいこと:
- 技術の選択(言語、データベース、ライブラリ)は書かない
- 要件定義書に無い機能を足さない。足したくなったら「提案」として末尾に分けて書く
- 判断に迷う点があれば、書き始める前に私に質問する
- 「やらないこと」は要件定義書から必ず引き継ぐ

仕様書の形:
# 仕様書
## 画面一覧(画面の名前と、そこで誰が何をできるか)
## 扱うデータ(覚えておく情報を、項目ごとに日本語で)
## ルール(誰が何をできるか。できないことも書く)
## やらないこと
## 用語(この仕様書で使う言葉の定義)
## 提案(要件に無いが、あると良さそうなこと。採用するかは私が決める)

要件定義書:
{段1で作った要件定義書をここに貼る}

例

仕様書(抜粋)

画面一覧

画面誰ができること
ログイン全員メールアドレスでログインする
オフ会一覧全員自分が関わるオフ会を新しい順に見る。主催者は「新しく作る」に進める
オフ会作成主催者名前、説明、会場、会費、日程候補(複数)を入れて作る
オフ会詳細全員会場と会費を見る。参加者は候補ごとに ○ △ × を選ぶ。主催者は候補ごとの人数と名前を見る

扱うデータ

  • 利用者: 表示名、メールアドレス
  • オフ会: 名前、説明、会場、会費、主催者、日程候補(日付と時刻の組を複数)
  • 出欠回答: どの利用者が、どの日程候補に、○ △ × のどれで答えたか。1人1候補につき1つ。あとから変えられる

ルール

  • オフ会を作れるのはログインしている人。作った人が主催者になる
  • オフ会を編集・削除できるのは主催者だけ
  • 出欠に答えられるのはログインしている人。他人の回答は変えられない

やらないこと

  • 会費の集金、写真共有、参加者どうしのチャット(要件定義書から引き継ぎ)
  • オフ会の公開・非公開の区別(初回はリンクを知っている人だけが見る前提)

提案

  • 主催者が「この日に決定」を押すと、詳細画面の先頭に決定日が出る。採用するかは要判断

完了チェック

  • 画面一覧の各行に「誰が」がある
  • 要件定義書の「必須」がすべて、どこかの画面に対応している
  • 「ルール」に、できないことが書いてある(他人の回答は変えられない、など)
  • 「やらないこと」が要件定義書と一致している
  • AIが勝手に足した機能が「提案」に隔離され、本文に混ざっていない

よくある失敗

仕様書が長くなりすぎる。10画面を超えたら、要件定義書の「必須」が多すぎます。段1に戻って「あれば嬉しい」に降ろしてください。
実装の話が混ざる。「Supabaseで認証」「Reactで作る」は仕様ではなく手段です。手段は次の設計書(段3)で決めます。ここで固めると、仕様の議論と技術の議論が混ざって、どちらも決まりません。
提案を全部採用する。AIの提案は、よくある機能を並べているだけのことが多いです。要件定義書の「困りごと」に効くものだけ採用します。
3

設計書

「何があるか」を「どう作るか」に翻訳し、技術の選択を1か所に残す

本題

目的

仕様書には技術を書きませんでした。設計書は、その仕様をどんな道具で、どんな形で作るかを決める段です。ここで初めて「使う技術」「データの持ち方」「権限の実現方法」が出てきます。

技術を自分で選べる必要はありません。AIに選ばせて、理由を自分が読める言葉で書かせ、決めたことを1か所に残します。設計書が無いと、AIは会話のたびに違う技術や違うデータの形を選び、Issueをまたいだ途端に噛み合わなくなります。

入力と出力

入力
段2の仕様書。
出力
設計書。使う技術と理由、画面の遷移、データの構造、権限の実現方法、外部サービス、動作確認の方法の6節。

プロンプト

AIに渡す
下の仕様書をもとに、設計書を書いてください。私はコードを書かない人間で、この設計書を読んで「なぜこの技術なのか」を人に説明できる必要があります。

守ってほしいこと:
- 技術を選ぶときは、候補を2つまでに絞って比べ、推奨と理由を書く。理由は私が理解できる言葉で(例:「ログインとデータベースとホスティングが1つのサービスで済む」)
- 無料か、少額で始められる構成にする
- 仕様書に無い機能を足さない。設計の都合で仕様を変えたくなったら、変えずに「仕様書への相談」として末尾に分けて書く
- 専門用語を使うときは、初出で一言の説明を付ける
- 判断に迷う点があれば、書き始める前に私に質問する

設計書の形:
# 設計書
## 使う技術と理由(何に何を使うか。候補と、選んだ理由)
## 画面の遷移(どの画面からどの画面へ行けるか)
## データの構造(表ごとに、項目と、表どうしのつながり)
## 権限の実現方法(仕様書の「ルール」を、どこでどう守らせるか)
## 外部サービス(メール送信など、外部に頼るもの)
## 動作確認の方法(各タスクの完了条件を、誰のアカウントでどう確認するか)
## 仕様書への相談(設計の都合で仕様を変えたい点。採用するかは私が決める)

仕様書:
{段2で作った仕様書をここに貼る}

例

設計書(抜粋)

使う技術と理由

  • 形態: スマホのブラウザで使うWebアプリ。アプリストアには出さない(参加者に「インストールして」と頼まなくて済む)
  • 画面と処理: Next.js。候補は Next.js と Rails。AIが最も安定してコードを書け、次の Vercel でそのまま公開できるため Next.js を選ぶ
  • ログインとデータベース: Supabase。候補は Supabase と Firebase。データが普通の表(テーブル)で見られて、権限の規則をデータベース側に置けるため Supabase を選ぶ
  • 公開: Vercel。Next.js の開発元で、無料枠で始められる

画面の遷移

ログイン → オフ会一覧 → オフ会詳細。一覧から「新しく作る」でオフ会作成へ行き、作成後は詳細へ戻る。

データの構造

表主な項目つながり
利用者表示名、メールアドレスログインの仕組みが持つ利用者と1対1
オフ会名前、説明、会場、会費、主催者主催者は「利用者」の1人
日程候補日時、どのオフ会のものか1つのオフ会に複数
出欠回答誰が、どの日程候補に、○ △ × のどれか利用者と日程候補の組み合わせにつき1行

権限の実現方法

  • 「主催者だけが編集できる」は、オフ会の主催者欄とログイン中の利用者が同じかどうかで判定する
  • 「他人の回答は変えられない」は、画面側だけでなくデータベース側の規則(RLS: 行ごとのアクセス制限)でも守らせる。画面のバグで破られないようにするため

外部サービス

前日リマインドのメール送信に Resend を使う。無料枠で足りる。

動作確認の方法

主催者用と参加者用の2つのアカウントを用意し、各Issueの完了条件を両方の立場で手で確認する。

仕様書への相談

  • 出欠回答を「○ △ ×」の3択でなく「○ ×」の2択にすると集計が単純になる。ただし仕様書は3択なので、変えるなら仕様書側を直してから

完了チェック

  • 使う技術ごとに、理由が一文で書いてあり、自分が人に説明できる
  • 「データの構造」の表が、仕様書の「扱うデータ」と一対一で対応している
  • 仕様書の「ルール」がすべて、「権限の実現方法」のどこかで扱われている
  • 仕様書に無い機能が増えていない。変えたい点は「仕様書への相談」に隔離されている
  • 読んで分からない用語が残っていない(残っていたらAIに説明を足させる)

よくある失敗

設計を飛ばして実装に入る。AIは頼まれるたびに、そのとき最もらしい技術とデータの形を選びます。Issueが2本目に入った時点で、1本目と噛み合わなくなります。
理解できない設計を承認する。読めない設計書は、後で「なぜこうなっているの」と聞かれたときに答えられません。分からない箇所は、分かるまで説明を足させてから先へ進みます。
設計の都合で仕様を書き換える。「実装が楽だから機能を減らす」は、設計書の中で勝手にやらず、仕様書に戻って直します。仕様書と設計書が食い違うと、タスク分解がどちらを信じればいいか分からなくなります。
4

タスク分解

1回のAI作業で完成して、動作確認できる単位に切る

本題

目的

仕様書と設計書をそのままAIに渡して「全部作って」と言うと、途中で壊れたときに戻る場所がありません。仕様書の機能を、設計書の順序に沿って、1つずつ完成させて確認できるタスクに切り、順番を決めます。

切り方の基準は一つです。そのタスクだけが終わった状態で、自分で動かして「できた」と言えるか。言えないなら、大きすぎるか、依存する別のタスクが先です。

入力と出力

入力
段2の仕様書と、段3の設計書。
出力
タスク一覧。各タスクに、名前、完了条件、順番、依存があるもの。

プロンプト

AIに渡す
下の仕様書と設計書をもとに、開発タスクに分解してください。

タスクの条件:
- 1つのタスクだけが終わった状態で、私がアプリを触って「できた」と確認できること
- 1つのタスクは、AIとの1回の作業(数時間以内)で終わる大きさ
- 最初のタスクは「ログインして、空っぽの一覧画面が出る」のような、いちばん薄い一本道にする
- 各タスクに「完了条件」を書く。私が触って確認できる文にする(「〜が表示される」「〜を押すと〜になる」)
- 順番を付け、前のタスクに依存する場合はそれを書く
- 仕様書の「やらないこと」はタスクにしない
- 設計書の「使う技術」を前提にする。技術を選び直さない

出力の形(タスクごと):
### タスク N: {名前}
- 依存: タスク {番号}(無ければ「なし」)
- 内容: {何を作るか、2〜3行}
- 完了条件:
  - [ ] {私が確認できる文}
  - [ ] ...

最後に、全体で何本になったかと、順番の理由を短く書いてください。

仕様書:
{段2で作った仕様書をここに貼る}

設計書:
{段3で作った設計書をここに貼る}

切り方の決まり

1タスク = 1つの完成した変更

1つのタスクは、後で1つのPull Request(変更のまとまり)になります。「ログイン機能一式」のような大きさは、途中で止まると全部が中途半端になるので、「ログインできる」「ログアウトできる」まで分けます。

親タスクは束ねるだけ。中身を持たない

「オフ会アプリ v1」のような親タスクを1つ作り、子タスクを列挙して進捗を見る場所にします。親自体には作業内容を書きません。段5で、親が勝手に閉じないための書き方を説明します。

分けるなら、着手する前に全部分ける

作業を始めてから「やっぱり分けよう」とすると、どこまでが何だったか分からなくなります。段階分けは、この段で終わらせます。

例

タスク一覧(オフ会の出欠管理アプリ)
順タスク依存完了条件(抜粋)
1ログインと空のオフ会一覧なしメールでログインすると、空の一覧画面が出る。ログアウトできる
2オフ会の作成と詳細表示1名前・会場・会費・日程候補を入れて作ると、一覧と詳細に出る。主催者だけが編集できる
3日程候補への出欠回答2参加者が候補ごとに ○ △ × を選べる。選び直せる。他人の回答は変えられない
4主催者向けの集計表示3候補ごとに ○ の人数と名前が一覧で見える
5前日リマインドのメール3各日程候補の前日に、その候補に ○ と答えた参加者へメールが届く

5本。1で一本道を通し、2から4は仕様書の「必須」を上から順に。5は「あれば嬉しい」なので最後に置く。回答(3)には依存するが集計(4)には依存しないため、4と入れ替えても構わない。

完了チェック

  • タスク1が「一本道」になっている(ログインして何か1画面が出る、程度)
  • すべてのタスクに、自分が触って確認できる完了条件がある
  • 依存関係が一方向で、順に進めれば詰まらない
  • 要件定義書の「必須」がすべて、どれかのタスクに含まれている
  • 本数が3〜10本に収まっている(超えるなら仕様が大きすぎる)
  • 設計書に無い技術や外部サービスが、タスクの中に出てきていない

よくある失敗

大きすぎるタスク。「オフ会機能」は1本ではありません。完了条件が3行を超えたら分ける合図です。
順番を考えない。「出欠回答」を先に作ると、答える相手のオフ会が無くて確認できません。依存を書けば順番は自然に決まります。
完了条件が「実装する」になっている。「出欠機能を実装する」は確認できません。「○ を押すと ○ が保存され、再読み込みしても残っている」が完了条件です。
5

Issue登録

タスクをGitHub Issueに書き、進捗と記録の置き場にする

本題

目的

段4で作ったタスク一覧を、GitHubのIssueとして1本ずつ登録します。チャットのログやメモ帳ではなくIssueにする理由は4つあります。

  • 番号が付く。「#3をやって」とAIにも人にも一言で渡せる
  • 完了条件がチェックリストとして残り、終わったかどうかを後から見返せる
  • 変更(Pull Request)と自動で結びつき、「この機能はどの変更で入ったか」を辿れる
  • 閉じたIssueが、そのまま開発の履歴になる

入力と出力

入力
段4のタスク一覧。
出力
GitHub Issue。子Issueがタスクの本数分と、それを束ねる親Issueが1本。

Issueの型

子Issueの本文は、いつも同じ4節にします。この型は、著者が実際に運用しているプロジェクトのIssueの形をそのまま一般化したものです。

子Issueのテンプレート
## 概要
{何を作るか、1〜3文}

## 背景と目的
{要件定義書のどの困りごとに効くか。仕様書のどの画面・ルール、設計書のどの表に対応するか}

## 対応チェックリスト
- [ ] {作業の区切り1}
- [ ] {作業の区切り2}

## 完了条件(Acceptance Criteria)
- [ ] {自分が触って確認できる文1}
- [ ] {自分が触って確認できる文2}

Refs #{親Issueの番号}

タイトルには種類を接頭辞で付けます。新機能は feat:、不具合の修正は fix:、文書は docs:。一覧で見たときに種類が揃って読めます。

親と子の関係

親 Issue #1 オフ会アプリ v1 #2 ログインと空の一覧 #3 オフ会の作成と詳細 #4 出欠回答 #5 主催者向け集計 #6 前日リマインド PR(変更) PR(変更) PR(変更) PR(変更) PR(変更) Refs: 束ねるだけ。閉じない Closes: マージで自動的に閉じる
子IssueからPRへは Closes #番号、子から親へは Refs #番号。ここを逆にすると、最初の子が終わった時点で親が自動で閉じてしまい、進捗を見る場所が消えます。
親Issueのテンプレート
## 概要
{何を作るかを1〜2文}。本Issueは作業を持たず、子Issueを束ねる。
子Issueがすべて閉じたら、手動でこのIssueを閉じる。
子IssueからこのIssueへは Closes ではなく Refs で参照すること(自動クローズ防止)。

## 子Issue
- [ ] #{番号} {タスク1の名前}
- [ ] #{番号} {タスク2の名前}
- [ ] #{番号} {タスク3の名前}

## 参照
- 要件定義書: {置き場所へのリンク}
- 仕様書: {置き場所へのリンク}
- 設計書: {置き場所へのリンク}

プロンプト

Issueは自分でGitHubの画面から作っても構いませんが、本文をタスク一覧から起こす作業はAIに任せられます。

AIに渡す
下のタスク一覧を、GitHub Issue の本文に書き起こしてください。

- 子Issueは、タスク1本につき1つ。下のテンプレートの4節で書く
- タイトルは「feat: {何ができるようになるか}」の形
- 「完了条件」は、タスク一覧の完了条件をそのまま使う。私が触って確認できる文になっていなければ直す
- 親Issueを1つ作り、子Issueを並べる。親の本文には「子から親へは Refs で参照」と明記する
- 書き終えたら、私に一度見せて確認を取る。確認後に gh issue create で登録する。親を先に作り、返ってきた番号を子の Refs に入れる
- 登録が終わったら gh issue list の結果を見せる

子Issueのテンプレート:
## 概要
## 背景と目的
## 対応チェックリスト
## 完了条件(Acceptance Criteria)
Refs #{親の番号}

タスク一覧:
{段4で作ったタスク一覧をここに貼る}

gh コマンド

GitHubの画面でIssueを5本作るのは、手作業としては意外に重いです。段0で入れた gh(GitHub公式のコマンドラインツール)があると、AIがIssueの登録、一覧、内容の確認、書き換えをすべて代行できます。上のプロンプトの最後の2行が、その指示です。

登録後の確認や手直しも、AIに頼みます。

AIに渡す(確認と手直し)
登録した Issue を確認したい。
- gh issue list で一覧を見せて
- Issue #{番号} の本文を見せて
- 親 Issue #{親の番号} の「子Issue」の一覧を、確定した番号で書き直して

うまくいかないときは、たいてい段0のログインが切れています。AIに「gh auth status を確認して、未ログインなら案内して」と頼めば直ります。

参考: AIが裏で実行しているコマンド(自分で打つ必要はありません)
よく使う gh コマンド
# 親Issueを作る(本文はファイルから渡す。番号が返ってくる)
gh issue create --title "chore: オフ会アプリ v1(親)" --body-file parent.md

# 子Issueを作る(ラベルも同時に付ける)
gh issue create --title "feat: 日程候補への出欠回答" --body-file issue-4.md --label enhancement

# 一覧を見る / 1本を見る
gh issue list
gh issue view 4

# 親Issueの本文を、子の番号が決まったあとで書き直す
gh issue edit 1 --body-file parent.md

# 終わったIssueを閉じる(PRの Closes #4 で自動的に閉じるなら不要)
gh issue close 4

本文は --body-file でファイルから渡すのが安全で、ファイルが手元に残るので後から見直せます。

例

Open feat: 日程候補への出欠回答 #4

概要

参加者がオフ会の各日程候補に ○ △ × で答えられるようにする。答えは選び直せる。

背景と目的

要件定義書の困りごと「返事が流れて誰が来るのか数えられない」に対する中核機能。仕様書「オフ会詳細」画面とルール「他人の回答は変えられない」、設計書の表「出欠回答」と権限の実現方法(データベース側の規則)に対応する。

対応チェックリスト

  • 出欠回答のデータを保存できるようにする
  • オフ会詳細画面に、候補ごとの ○ △ × の選択を付ける
  • 自分の回答だけ変更できるようにする

完了条件(Acceptance Criteria)

  • 参加者としてログインし、詳細画面で候補ごとに ○ △ × のどれかを選べる
  • 選び直すと、最後に選んだものだけが残る。再読み込みしても残っている
  • 別の参加者でログインしても、前の人の回答を変更できない

Refs #1

完了チェック

  • 子Issueがタスクの本数分あり、それぞれに完了条件がある
  • 親Issueに子が全部並び、「Refs で参照」と書いてある
  • 子Issueの本文に Refs #親 があり、Closes #親 になっていない
  • タイトルに feat: などの接頭辞がある
  • 要件定義書・仕様書・設計書の置き場所が、親Issueからリンクされている

よくある失敗

完了条件が無い。Issueに「出欠機能」とだけ書くと、AIは自分の解釈で完成を宣言します。完了条件はAIへの依頼文であり、自分が確認するときのチェック表でもあります。
1つのIssueに複数のタスク。「作成と回答と集計」を1本にすると、途中で止まったときに何が終わっているのか分からなくなります。段4の切り方に戻ります。
親を Closes で参照する。最初の子がマージされた瞬間に親が閉じます。閉じた親は一覧から消え、残りの進捗を見失います。
6

実行

Issueを1本ずつAIに渡し、完了条件を自分で確認して閉じる

1本ずつ繰り返す

目的

ここまでで、AIに渡す単位と、終わったかどうかの判定基準が全部揃っています。実行は、その単位を上から順に消化する作業です。段1〜5が丁寧なら、ここは単純になります。

手順

  1. 次のIssueの番号を選ぶ。依存が終わっているものだけ。
  2. AIに「Issue #番号 を読んで実装して」と頼む。会話の最初に仕様書と設計書を貼っておくと前提がぶれない。gh があれば、AIがIssueの本文を自分で読みに行く。
  3. AIが「できた」と言ったら、そのAIに「レビュー用に、変更した内容をまとめて review.md に書いて」と頼む。それを別の新しい会話のAIに貼ってレビューさせる。同じ会話の中のAIは自分の仕事を甘く採点する。
  4. レビューの指摘を、実装した側の会話に貼って直させる。
  5. AIに「動かして」と頼み、表示されたURLをブラウザで開いて、Issueの完了条件を1つずつ自分で確認する。満たしていなければ2に戻る。
  6. AIに「Pull Request を作って。本文に Closes #番号 を入れて」と頼む。GitHubの画面でそのPull Requestを開き、「Merge pull request」を押す。Issueは自動で閉じる。
  7. AIに「親Issueの #番号 にチェックを入れて」と頼み、次のIssueへ。

プロンプト

実装させる
次のIssueを実装してください。仕様書に無いことは足さず、設計書で決めた技術とデータの構造を守ってください。
完了条件をすべて満たしたと自分で確認できたら、何をどう確認したかを書いてから「できた」と報告してください。

仕様書:
{段2の仕様書}

設計書:
{段3の設計書}

Issue #{番号}:
{Issueの本文をそのまま貼る。gh があれば「gh issue view {番号} で読んで」でもよい}
別の会話でレビューさせる
あなたはこの変更を初めて見るレビュアーです。実装した人の説明は読まず、変更内容だけを見てください。

確認してほしいこと:
- Issue の完了条件が、本当に満たされるか。満たされない条件があれば、どの条件か
- 仕様書に無い機能や、設計書と違う技術・データの形が混ざっていないか
- 明らかに壊れそうな箇所(保存されない、他人のデータが見える、など)

指摘は「場所、何が問題か、どう直すか」の3点で、重要な順に並べてください。

Issue #{番号}:
{Issueの本文}

変更内容:
{実装したAIに作らせた review.md の中身を貼る}

完了チェック

  • 完了条件を、AIの報告ではなく自分の手で確認した
  • レビューを、実装したのとは別の会話で行った
  • PRの本文に Closes #番号 があり、マージでIssueが閉じた

よくある失敗

AIの「できました」を信じてマージする。完了条件は自分で触って確認するためのものです。マージのボタンを押すのは自分なので、その前に手順5を必ず通します。ここを省くと、段1〜5の意味が無くなります。
レビューを同じ会話でやる。実装したAIに「問題ないか」と聞くと、ほぼ「問題ありません」と返ってきます。会話を分けるだけで指摘の質が変わります。
実行中に仕様を変える。作りながら「やっぱりこうしたい」と思ったら、その場で足さず、新しいIssueにして親に追加します。今のIssueは今の完了条件で終わらせます。

Claude Codeで回す場合

著者はこの流れを Claude Code で回しています。上の6段は Claude Code が無くても成立しますが、Claude Code には「決まった手順をスラッシュコマンドとして保存する」機能があり、段4〜6の繰り返し部分をかなり自動化できます。

先に一つ注意。下に出てくる /issue-create や /issue-complete は、著者が自分用に作ったコマンドで、Claude Code に最初から入っているものではありません。素の Claude Code では、上の各段のプロンプトをそのまま貼れば同じことができます。コマンドは、同じプロンプトを何度も貼るのが面倒になってから作れば十分です。
段素の Claude Code でやること著者が使っているコマンド/スキル何が自動になるか
1 要件定義段1のプロンプトを貼って対話するなし(対話そのもの)自動化しない。ここは人が答える段
2 仕様書段2のプロンプトを貼るsuperpowers プラグインの brainstorming スキル(著者の自作ではなく公開プラグイン)質問を1つずつ出して、仕様の穴を埋めていく
3 設計書段3のプロンプトを貼る同じ brainstorming スキルの後半合意した設計を、日付つきのファイル(docs/ 配下)に保存する。著者のプロジェクトでは仕様と設計を同じ対話で続けて決めている
4 タスク分解段4のプロンプトを貼るなし(段3の対話の続きで行う)分けるべきかの判断を、設計の段階で必ず聞く決まりにしている
5 Issue登録段5のプロンプトを貼り、gh issue create を頼む/issue-create(自作)自由文から4節の本文・接頭辞つきタイトル・ラベルを組み立て、確認1回で登録する
6 実行段6の2つのプロンプトを、会話を分けて貼る/issue-complete 番号(自作)下の4段を一気に回し、最後にレポートを出す

/issue-complete の中身(4段の要約)

  1. 設計。Issueと、段3の設計書やプロジェクトの決まりを読み、そのIssue1本分の実装計画をファイルに書く。段3が全体の設計、こちらは1本分の手順書という関係。ここは判断力の高いモデルに任せる。
  2. 実装。計画に沿って、別の作業者(サブエージェント)がコードを書く。計画が良ければ、ここは速いモデルで足りる。
  3. レビューと修正。実装を知らない別のエージェントに差分だけを渡してレビューさせ、指摘を直す。指摘が出なくなるまで繰り返す。段6の手順3〜4を、機械的に何周も回す仕組み。
  4. 報告。何を作り、何を指摘され、何を直したかをまとめる。人はこれと完了条件を見てマージを判断する。

趣味のアプリなら、ここまでの仕組みは不要です。段6のプロンプト2本を会話を分けて使えば、同じ効果の大半が得られます。

自作コマンドの作り方(さわりだけ)

スラッシュコマンドはただの Markdown ファイル

プロジェクトの .claude/commands/ に issue-create.md のようなファイルを置くと、/issue-create と打てるようになります。中身は「この手順でやって」という指示文で、上の各段のプロンプトをそのまま入れれば最初のコマンドになります。

まずは段5のプロンプトを .claude/commands/issue-create.md に保存するところから始めると、効果が分かりやすいです。

CLAUDE.md にプロジェクトの決まりを書く

プロジェクト直下に CLAUDE.md というファイルを置くと、Claude Code は毎回それを読んでから作業します。「やらないこと」「Issueなしでコードを変えない」「タスクは1 Issue = 1 PR」のような決まりをここに書いておくと、会話のたびに言い直さずに済みます。

段1〜5で決めたことのうち、次の作業でも守ってほしいもの(特に設計書の「使う技術」)を、少しずつここへ移していくのがおすすめです。

次の一歩

いきなり本命のアプリでやらず、まず小さな題材で1周してみてください。オフ会アプリなら、段1から段5までで2〜3時間、Issueは5本ほどです。

  • 1周したら、振り返りを3行書く。どの段で迷ったか、どのIssueが大きすぎたか。次の題材で切り方が変わります。
  • 守れた決まりを、常設のメモに移す。「やらないことを先に決める」「完了条件は触って確認できる文」など、自分に効いたルールを、AIが毎回読む場所(Claude Code なら CLAUDE.md)に書きます。
  • 要件定義書・仕様書・設計書は、リポジトリに置く。チャットの中に置いたままだと、次の会話から見えません。docs/ のようなフォルダに置き、親Issueからリンクします。