← Reports へ戻る

AI時代の個人開発でIssueをどう書くべきか

AIに作業を任せやすくするためのIssueの書き方。背景・目的・制約・完了条件の整理方法と具体例を説明します。

AI時代の個人開発でIssueをどう書くべきか

はじめに

AI(Claude Code、ChatGPT)を使った開発では、Issue の品質が実装の品質に直結します。曖昧な Issue では AI に曖昧な実装をされてしまうため、明確で構造化された Issue が必須です。本記事では、AI に任せやすい Issue の書き方を具体例で解説します。

悪い Issue の例

Title: ユーザー機能を改善

Description:
ユーザー管理画面を改善したい。
UI をわかりやすくして、
バグも修正してほしい。

問題

良い Issue の構造

# Issue Title: ユーザープロフィール編集画面のバリデーション改善

## 背景

現在のユーザープロフィール編集画面では、
フォーム送信時に全フィールドを送信しており、
空白値でも送信可能。

ユーザーから「入力忘れに気づきにくい」という
フィードバックが複数件。

## 目的

各フィールドの入力漏れを事前に検出し、
わかりやすいエラーメッセージを表示する。

## 実装範囲

対象ファイル:
- src/components/UserProfileForm.tsx(修正)
- tests/components/UserProfileForm.test.tsx(テスト追加)

対象フィールド:
- ユーザー名(必須、1-50 文字)
- メールアドレス(必須、有効形式)
- 自己紹介(任意、0-500 文字)

対象外:
- プロフィール画像のアップロード機能
- DB スキーマ変更
- サーバーサイド validation(既存使用)

## 完了条件

- [ ] 各フィールドの入力チェックが実装されている
- [ ] 空白のまま送信ボタンを押すと、
      「必須フィールドを入力してください」と表示
- [ ] 文字数制限超過時に「nn 文字以内で入力してください」と表示
- [ ] メールアドレスが不正形式の場合、
      「有効なメールアドレスを入力してください」と表示
- [ ] 既存テスト全 pass
- [ ] 新規テストケース 5 個以上で検証

## 参考資料

既存の validation 例: src/components/LoginForm.tsx
テストパターン: tests/components/LoginForm.test.tsx
エラーメッセージ定義: src/constants/messages.ts

## 注意点

- 修正中は既存機能を壊さない
- エラーメッセージは既存の messages.ts を参照
- UX 関連の変更は避ける(エラー表示のロジックのみ)

Issue の 5 要素

1. 背景(Why)

## 背景

現状の問題:
- ユーザーがどのフィールドが必須か判からない
- エラーメッセージが技術的

根拠:
- サポートチケット過去 3 件が「入力エラーで困った」
- ユーザーテスト結果:入力エラー率 35%

2. 目的(Goal)

## 目的

実装後の期待状態:
- 入力エラー率 10% 以下
- サポートチケット削減
- ユーザー満足度向上

3. 実装範囲(Scope)

## 実装範囲

対象ファイル: 明確に列挙

修正対象:
- src/components/UserForm.tsx

作成対象:
- なし

テスト:
- tests/components/UserForm.test.tsx に 5 ケース追加

対象外:
- DB スキーマ
- サーバーサイド
- デザイン変更

4. 完了条件(Definition of Done)

## 完了条件

実装完了とみなす基準:

技術的:
- [ ] TypeScript で型エラーなし
- [ ] 既存テスト全 pass
- [ ] 新規テスト 5 ケース pass
- [ ] git diff が 100 行以下

機能的:
- [ ] 各フィールド validation が動作
- [ ] エラーメッセージが表示される
- [ ] 正常な入力で送信可能

品質:
- [ ] ChatGPT コードレビュー通過
- [ ] 既存メッセージ定義を使用

5. 参考資料(Reference)

## 参考資料

既存コード例:
- src/components/LoginForm.tsx(validation 参考)

テストパターン:
- tests/components/LoginForm.test.tsx

メッセージ定義:
- src/constants/messages.ts

API 仕様:
- docs/api/users.md

Issue を書くときのチェックリスト

背景(Why)
- [ ] 現状の問題が説明されているか
- [ ] なぜこの Issue が必要か理由が明確か
- [ ] 根拠(ユーザーフィードバック、バグなど)があるか

目的(Goal)
- [ ] 実装後の期待状態が明確か
- [ ] 測定可能な成功基準があるか

実装範囲(Scope)
- [ ] 対象ファイルが明記されているか
- [ ] 対象外(やらないこと)が明確か
- [ ] テスト対象が具体的か

完了条件(DoD)
- [ ] テスト項目がチェックリスト形式か
- [ ] 合格基準が数値化されているか
- [ ] AI が判定可能か

参考資料(Reference)
- [ ] 似た機能の実装例があるか
- [ ] テストパターン例があるか
- [ ] API 仕様へのリンクがあるか

AI に Issue を渡すときのコツ

コツ1:Issue をそのまま AI に渡す

人間:「Issue を実装してください」

Claude Code が Issue を読んで実装開始
  → 背景と完了条件が明確なら、質問が少ない
  → スムーズに実装が進む

コツ2:迷ったら Issue で確認

実装中に質問が出た時:

Claude Code:「ここはどうしますか?」

Issue を再度確認:
  「対象外」と書かれていれば、その部分は実装しない
  「参考資料」で例を確認

コツ3:Issue の優先度を示す

## 優先度

High: バグ、セキュリティリスク
Medium: 機能改善、パフォーマンス
Low: UI 改善、ドキュメント更新

この Issue は: Medium(完了期限なし)

まとめ

AI を使った開発では、Issue の質が実装の質を決めます。

良い Issue の要素:

Issue が明確なら:

AI に任せるタスクと人間が決めるタスクの分け方と合わせることで、Issue ベースの開発が最大の効果を発揮します。

Issueタスク管理AI開発ドキュメント