.claude/skills/review-spec/SKILL.md
Review and validate specification before implementation (仕様レビュー)
npx skillsauth add AtsushiHashimoto/research-project-template .claude/skills/review-specInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
仕様の対話後に、抽象化チェック(Aufheben)と複数の観点から仕様をレビューし、検証チェックリストを生成します。
/review-spec
仕様の対話が完了した後に実行してください。
# Issue番号の取得
BRANCH=$(git branch --show-current)
ISSUE_ID=$(echo "$BRANCH" | grep -oE '[0-9]+' | head -1)
# Issue内容を取得
gh issue view "$ISSUE_ID" --json title,body,comments
# 既存の仕様ファイルがあれば読み込み
SPEC_FILE=".spec/issues/${ISSUE_ID}-*.md"
ls $SPEC_FILE 2>/dev/null
検索なし・内省のみで、解決策を一段上の視点から検討する。
このステップでは、コード検索やWeb検索を行わない。純粋に目の前の仕様・解決策から抽象化を試みる。
| 具体 | パターン | 波及効果 | |------|---------|---------| | merge.md にコマンド列を直書き | 実行ロジックのドキュメント埋め込み | 他のスキル(finish, auto)も同様 → スクリプト化で一元管理 | | 特定のエラーを try-catch で握りつぶす | エラー隠蔽パターン | 他の箇所でも同様の問題 → エラー伝播ポリシーの策定 |
## 抽象化チェック結果
### 検出されたパターン
| 具体的な解決策 | 抽象パターン | 波及する箇所 |
|---------------|-------------|-------------|
| [具体] | [パターン名] | [他に影響する箇所] |
### 上位解決策の提案
- [ ] [パターンレベルで解決する場合の提案]
### 判断
- ✅ 現在の解決策で進める(パターンの波及が限定的)
- ⚠️ 上位解決策を検討すべき(理由: [理由])
注意: このステップの結果(検出されたパターン、上位解決策の提案)は、Step 3 の各サブエージェントに渡す。
Task tool でサブエージェントを並列起動し、それぞれ異なる観点でレビューを行います。
各サブエージェントには以下を渡します:
Task tool で subagent_type=general-purpose を使用。
レビュー観点:
必須出力: リソース見積もり、代替案比較
出力形式:
## 実現性レビュー結果
### リソース見積もり
| リソース | 予想値 | 備考 |
|---------|--------|------|
| CPUメモリ | ~2GB | [計算根拠] |
| GPUメモリ | ~8GB | [計算根拠] |
| 処理時間 | ~30分 | [条件: データN件] |
| ストレージ増加 | ~500MB | [出力ファイル内訳] |
### 代替案比較
| 案 | 概要 | Pros | Cons |
|----|------|------|------|
| A: 現在の実装 | [概要] | [メリット] | [デメリット] |
| B: 代替案1 | [概要] | [メリット] | [デメリット] |
| C: 代替案2 | [概要] | [メリット] | [デメリット] |
**選定理由**: 案Aを選択。理由: [具体的な理由]
### 技術的ブロッカー
- [リスト]
### 事前調査が必要な項目
- [リスト]
### 再利用可能な既存資産
- [リスト]
Task tool で subagent_type=general-purpose を使用。
レビュー観点:
必須出力: 状態遷移図(mermaid形式)、ログ戦略
## 品質レビュー結果
### 状態遷移図
```mermaid
stateDiagram-v2
[*] --> 初期状態
初期状態 --> 処理中: 入力条件
note right of 初期状態
前提: [前段処理の結果]
入力: [必要なデータ]
end note
処理中 --> 成功: 正常完了
処理中 --> エラー: データ不在
note right of エラー
出力: エラーログ出力
後続: 処理停止、呼び出し元に伝播
end note
成功 --> [*]
エラー --> [*]
| レベル | 用途 | 例 | |--------|------|-----| | DEBUG | 開発時の詳細追跡 | 変数値、分岐判定 | | INFO | 正常な処理の進捗 | 「ユーザー123の処理開始」 | | WARN | 異常だが続行可能 | 「キャッシュミス、DBから取得」 | | ERROR | 処理失敗 | 「ユーザー123が見つからない」 |
処理名: N件中M件完了 (XX%) 形式| 箇所 | 出力内容 | |------|---------| | 入口 | 関数名、引数の要約 | | 分岐 | どの条件に該当したか | | 出口 | 処理結果、所要時間 | | エラー | 入力値、状態、スタックトレース |
#### 3-3. 設計レビュー(Design Review)
Task tool で `subagent_type=general-purpose` を使用。
レビュー観点:
- **単一責任原則**: 1機能が複数責務を持っていないか
- **単一情報源の原則(SSOT)**: 同じ情報を複数箇所で定義していないか
- **既存コードとの一貫性**: 命名規則、ディレクトリ構造、コーディングスタイルが既存と整合するか
- **既存パターンとの整合**: プロジェクトで使われているデザインパターン・アーキテクチャに沿っているか
- **過度な複雑性(YAGNI)**: 現時点で不要な拡張性・抽象化を入れていないか
- **依存関係**: 不要な依存の追加や循環依存がないか
- **境界・インターフェース**: 他機能との境界が明確か。将来変更時の影響範囲が限定できるか
- **対症療法の回避**: 根本原因を特定しているか。挙動を上書きする形での修正を計画していないか
- **ファイル分割計画**: 各ファイルが単一責務を持ち、適切なサイズに収まる設計か
**必須出力: ファイル構成計画**
出力形式:
```markdown
## 設計レビュー結果
### ファイル構成計画
| ファイル | 責務 | 想定行数 |
|---------|------|---------|
| `user_service.py` | ユーザーCRUD | ~150行 |
| `user_validator.py` | バリデーション | ~80行 |
### 分割基準
- 1ファイル300行超過 → 分割検討
- 1関数50行超過 → 分割検討
- 複数責務 → 分割必須
### 設計上の懸念点
- [リスト]
### アーキテクチャ判断が必要な項目
- [リスト]
Task tool で subagent_type=general-purpose を使用。
レビュー観点: 仕様・状態遷移から、else/default/catchケースを抽出し、それぞれが:
許容するFallbackパターン:
config.timeout ?? 30000)user.nickname ?? user.name)cache.get(key) ?? fetch(key))logLevel ?? "info")data.description ?? "説明なし")禁止するFallbackパターン:
user ?? guestUser)try: ... except: return None)items[0] ?? defaultItem)status ?? "pending")apiResponse.data ?? [])出力形式:
## Fallback分岐の確認
### 許可推奨(設定・UI・キャッシュ)
- [ ] `パターン` - 理由
### 要検討
- [ ] `パターン` - リスク説明
### 許可非推奨(エラーにすべき)
- [ ] `パターン` - 理由
Task tool で subagent_type=general-purpose を使用。
WebSearch ツールを使用して、仕様の各項目の妥当性を検証します。
レビュー観点:
検索例:
{ライブラリ名} vs {代替} 2024 comparison{パターン名} best practices pitfalls{技術名} known issues vulnerabilities{処理名} typical performance benchmarks出力形式:
## 妥当性検証結果
### ライブラリ選定の検証
| ライブラリ | 検証結果 | 出典 |
|-----------|---------|------|
| `requests` | ⚠️ `httpx` の方がasync対応で推奨 | [URL] |
| `pandas` | ✅ 妥当 | [URL] |
### 設計パターンの検証
- Repository パターン: ✅ 適切(出典: [URL])
### 見積もりの検証
- 処理時間30分: ✅ 妥当(類似事例で20-40分、出典: [URL])
### 発見された懸念事項
- ⚠️ {ライブラリ} v1.2.3 にはメモリリークの既知問題あり(出典: [URL])
- ⚠️ {パターン} 使用時は {エッジケース} に注意(出典: [URL])
### 推奨アクション
- [ ] {ライブラリ} を {代替} に変更を検討
- [ ] {エッジケース} のテストを追加
GUI/フロントエンド実装の場合のみ実行。
Task tool で subagent_type=general-purpose を使用。
発動条件(いずれかに該当):
**/*.html, **/*.css, **/*.js, **/templates/**, **/static/**レビュー観点:
出力形式:
## UI/UX レビュー結果
### 一貫性チェック
| 要素 | 現状 | 問題 | 改善案 |
|------|------|------|--------|
| [要素] | [現状の表示] | [問題点] | [改善案] |
### 直感性チェック
- ✅ / ⚠️ / ❌ [項目ごとの判定]
### メリハリチェック
- 情報の優先順位が適切か
- 補助情報の位置が適切か
### ベストプラクティス適合
| 項目 | 適合 | 備考 |
|------|------|------|
| [項目] | ✅ / ❌ | [備考] |
### エラー状態の区別
- 正常/エラーの区別方法: [説明]
- 問題点: [あれば]
### 改善提案
1. [具体的な改善案]
6つのサブエージェントの結果を統合し、以下の形式で仕様ファイルを生成:
# Issue #N: タイトル
## メタ情報
- 作成日: YYYY-MM-DD
- 最終更新: YYYY-MM-DD
- ステータス: draft
## 状態遷移図
[品質レビューからの状態遷移図]
## リソース見積もり
| リソース | 予想値 | 備考 |
|---------|--------|------|
| CPUメモリ | [値] | [計算根拠] |
| GPUメモリ | [値] | [計算根拠] |
| 処理時間 | [値] | [条件] |
| ストレージ増加 | [値] | [内訳] |
## 代替案比較
| 案 | 概要 | Pros | Cons |
|----|------|------|------|
| 現在の実装 | [概要] | [メリット] | [デメリット] |
| 代替案1 | [概要] | [メリット] | [デメリット] |
**選定理由**: [具体的な理由]
## 妥当性検証結果
### ライブラリ選定
| ライブラリ | 検証結果 | 出典 |
|-----------|---------|------|
| [名前] | [結果] | [URL] |
### 発見された懸念事項
- [懸念事項と出典]
### 推奨アクション
- [ ] [アクション項目]
## ファイル構成計画
| ファイル | 責務 | 想定行数 |
|---------|------|---------|
| [ファイル名] | [責務] | [行数] |
### 分割基準
- 1ファイル300行超過 → 分割検討
- 1関数50行超過 → 分割検討
- 複数責務 → 分割必須
## ログ戦略
### ログレベル設計
| レベル | 用途 |
|--------|------|
| DEBUG | [用途] |
| INFO | [用途] |
| WARN | [用途] |
| ERROR | [用途] |
### 進捗ログ
- [進捗ログの設計]
### デバッグポイント
| 箇所 | 出力内容 |
|------|---------|
| [箇所] | [内容] |
## 検証チェックリスト
### 機能要件
- [ ] [正常系の要件]
### 状態遷移
- [ ] [各遷移の検証項目]
### 異常系
- [ ] [エラーケースの検証項目]
### 設計制約
- [ ] [設計レビューからの制約]
- [ ] 各ファイルが想定行数以内か
- [ ] ログ戦略に従ったログ出力があるか
## 承認済みFallbackホワイトリスト
| 箇所 | パターン | 理由 | 承認日 |
|------|---------|------|--------|
| [ユーザーが許可したもの] |
## 問題リスト
### 🔴 Critical(修正必須)
- [ ] [リスト]
### 🟡 Warning(確認必要)
- [ ] [リスト]
## 質問リスト
1. [未決定事項への質問]
## 新規依存パッケージ
### Python パッケージ(pyproject.toml に追加)
| パッケージ | バージョン | 用途 |
|-----------|-----------|------|
| [パッケージ名] | [バージョン] | [用途] |
### システムパッケージ(Dockerfile に追加)
| パッケージ | 用途 |
|-----------|------|
| [パッケージ名] | [用途] |
### 備考
- 動作確認後、マージ前に必ず永続化を確認すること
- `/commit/merge` で永続化チェックが行われる
## 変更履歴
### YYYY-MM-DD
- 初版作成
Fallback分岐の承認: 許可するfallbackをユーザーに選択してもらう
質問への回答: 質問リストの項目についてユーザーに確認
/qa/ask で Slack に質問を投げる# 例: 質問リストの項目をQAに投稿
/qa/ask --type provisional --decision "案A" "質問リストの項目1について、案Aと案Bどちらが好ましいですか?"
重要な決定事項のQA記録
/qa/ask で記録することを推奨仕様ファイルの保存: .spec/issues/{issue_id}-{description}.md に保存
# ディレクトリ作成
mkdir -p .spec/issues
# ファイル保存
# ファイル名: {issue_id}-{short-description}.md
/issue/start フローから自動的に呼び出される/review-spec を再実行して最終確認可能data-ai
Set up data directories in a new worktree
testing
Safely remove a worktree after checking for important data
data-ai
Initialize worktree data protection configuration (run once in main repository)
research
Sync updates from research-project-template (テンプレート更新の取り込み)