Research Gap Analyzer
プロジェクト プロジェクトの機能文書と既存リサーチをランタイムスキャンし、高収益、高LTV、低離脱率達成に必要なリサーチギャップを自動識別するスキルである。
核心原則
SSOT (Single Source of Truth)
┌─────────────────────────────────────────────────────────────┐
│ SSOT 構造 (v2.0 - Frontmatter ベース) │
├─────────────────────────────────────────────────────────────┤
│ docs/research/*.md Frontmatter → リサーチメタデータ (SSOT) │
│ スキーマ: docs/_schemas/ │
│ research-frontmatter. │
│ schema.json │
│ docs/_manifests/research-manifest.json │
│ → Frontmatter から自動 │
│ 生成されたキャッシュ (読取専用)│
│ assets/research-status.json → リサーチ作業状態 (SSOT) │
│ references/kpi-targets.md → KPI 定義 + Feature マッピング │
│ references/critical-gaps.md → クリティカルギャップリスト │
│ docs/features/ → 動的スキャン (SPEC 読込) │
│ docs/research/README.md → 文書リスト (参照用) │
└─────────────────────────────────────────────────────────────┘
⚠️ 禁止: 同じデータを複数ファイルにハードコーディングしない。
- Feature Tier は kpi-targets.md でのみ定義
- リサーチ状態は assets/research-status.json でのみ管理
- リサーチメタデータは各文書の Frontmatter でのみ定義
- Manifest は直接修正しない (スクリプトで自動生成)
- README.md は文書リストのみ、状態管理 X
批判的思考 5段階
- 根本原因把握: なぜこのギャップが発生したのか?
- 完全性検証: このリサーチが KPI 達成に十分か?
- 業界標準比較: Duolingo/Speak/ELSA はどうしているか?
- 代替案検討: 他のアプローチはないか?
- ROI 分析: 効率性の観点から実行可能か?
核心 KPI 目標
詳細: references/kpi-targets.md
| KPI | 目標値 | 現在のリサーチ状態 | ギャップ深刻度 |
|---|---|---|---|
| D7 リテンション | 25%+ | ✅ 十分 | - |
| 有料転換率 | 8%+ | ✅ 過剰供給 | - |
| 月間離脱率 | <8% | 🔴 深刻なギャップ | P0 |
| LTV | $30+ | 🔴 深刻なギャップ | P0 |
| AI Max アップグレード | 20%+ | 🟡 部分的不足 | P1 |
識別されたクリティカルギャップ (2026-01-19 分析基準)
詳細: references/critical-gaps.md
🔴 P0 ギャップ (即座にリサーチ必要)
| # | ギャップ領域 | KPI 影響 | 現況 | 必要なリサーチ |
|---|---|---|---|---|
| 1 | Churn 防止プログラム設計 | 月間離脱率 | 概念のみで実行計画なし | 再活性化キャンペーン、離脱信号検出 |
| 2 | LTV 改善パス | LTV $30+ | 計算式のみで改善戦略なし | サブスク期間延長、クロスセル戦略 |
| 3 | AI コスト管理 & 価格戦略 | AI アップグレード | 心理学のみでコスト分析なし | トークン/クレジット システム、マージン分析 |
| 4 | ペイウォール UX 最適化 | 有料転換率 | 価格のみで UX 設計なし | 参入障壁設計、転換ポイント |
| 5 | 学習動機再活性化 | D7 リテンション | プッシュのみで信号検出なし | D7/D14 閾値、最後の信号 |
🟡 P1 ギャップ (1ヶ月以内にリサーチ必要)
| # | ギャップ領域 | KPI 影響 | 現況 |
|---|---|---|---|
| 6 | FTUE 収益化ポイント | 有料転換率 | D1~D7 最適転換ポイント未分析 |
| 7 | 習慣形成周期 | D7 リテンション | 最適学習頻度/周期データ不足 |
| 8 | Duolingo Max 対応シナリオ | 差別化 | 競合他社韓国語サポート時戦略なし |
| 9 | 日本人価格心理 | Japan-First | 月/年/生涯転換率差異未分析 |
| 10 | AI コンテンツパイプライン ROI | 開発効率性 | 検収時間 & 品質測定データなし |
Workflow
Step 1: ランタイムスキャン
docs/features/ と docs/research/ を直接スキャンする。
# スキャン対象
features = scan("docs/features/*/PRD-*.md") # 28個 Feature
research = scan("docs/research/*.md") # 99個 リサーチ
重要: ハードコーディングされた Feature リストを使用せず、常に最新状態をスキャンする。
Step 2: KPI-Feature-Research マッピング
references/kpi-targets.md を参照して KPI 別必要リサーチを導出する。
# 例示: D7 リテンション KPI
d7_retention:
target: 25%+
primary_features: [004, 005, 006, 023]
required_research:
- FTUE 最適化 (ftue, onboarding, first-time)
- 習慣形成 (habit, streak, routine)
- プッシュ通知 (notification, push, reminder)
Step 3: ギャップ識別 (批判的分析)
各リサーチの品質を評価する:
| 状態 | アイコン | 判断基準 |
|---|---|---|
| なし | 🔴 | 該当主題ファイル 0個 |
| 概念のみ存在 | 🟡 | ファイルあるが Action Items なし |
| 完了 | ✅ | ファイル + 実行計画 + データ根拠 |
| 更新必要 | ⚪ | 修正日 > 180日 |
品質チェックリスト:
- Executive Summary 存在?
- 定量的データ含む? (% 数値、ベンチマーク)
- Action Items 具体的? (誰が、何を、いつ)
- Japan-First 戦略と一致?
Step 4: 優先順位決定
詳細: references/critical-gaps.md
ROI 基準優先順位:
優先順位スコア = (KPI 影響度 × 3) + (実装容易性 × 2) + (Japan-First 適合性 × 1)
| 優先順位 | 基準 | 例 |
|---|---|---|
| P0 | 収益/生存に直接影響 | Churn 防止、LTV 改善 |
| P1 | 6ヶ月以内に必要 | 差別化、価格最適化 |
| P2 | 1年以内に必要 | グローバル展開、高機能 |
Step 5: 状態登録 + ディープリサーチ実行
⚠️ 重要: P0 ギャップ発見時 ユーザー確認なしに即座 にディープリサーチを実行する。
5.1 状態ファイルに作業登録
ディープリサーチ開始前に assets/research-status.jsonに作業を登録する:
{
"job_id": "{topic}-{year}",
"topic": "{リサーチ主題}",
"phase": "processing",
"provider": "openai|google",
"created_at": "{現在時間}",
"started_at": "{現在時間}",
"ttl_expires_at": "{現在時間 + 24h}",
"kpi_target": "{関連 KPI}",
"priority": "P0|P1|P2"
}
スキーマ: references/research-status-schema.json
5.2 ディープリサーチ実行
Provider 選択ガイド:
| Provider | 用途 | コスト | 使用法 |
|---|---|---|---|
openai |
深層分析、長文レポート | 高 | deep-research --provider openai |
google |
最新データ、幅広い検索 | 中 | deep-research --provider google |
リサーチ要求テンプレート:
## リサーチ要求: {gap_topic}
### 目標
プロジェクト アプリの {kpi_target} 達成
### コンテキスト
- Japan-First 戦略 (日本市場優先)
- 効率性重視 (自動化/低コスト必須)
- AI コンテンツ 100% (著作権 Free)
### 必須含む内容
1. 定量的データ (% 数値、ベンチマーク)
2. 競合社比較 (Duolingo, Speak, ELSA)
3. 実行可能な Action Items
4. 日本市場特殊性反映
### 出力形式
- 言語: 韓国語
- 形式: マークダウン
- 長さ: 1500-3000 単語
Step 6: 結果保存 + 自動メタデータ生成
⚠️ v5.0 変更: AI が文書保存時に Frontmatter を自動生成し スクリプトを自動実行する。 人の手動作業が不要になるよう完全自動化される。
6.1 ファイル保存 + 自動 Frontmatter 生成
ファイル命名規則:
{topic}-{subtopic}-{year}.md
例: churn-prevention-program-design-2026.md
自動 Frontmatter 生成ロジック:
AI がディープリサーチ結果を保存する際、文書内容を分析して 自動的に Frontmatter を生成する:
# AI メタデータ抽出ロジック (概念的)
def extract_metadata(document_content, topic, kpi_target):
# 1. research_id 生成: R-{YYYYMMDD}-{順番}
research_id = generate_research_id()
# 2. category 自動決定
category = classify_category(document_content)
# 規則: 競合社言及多 → competitor
# 価格/収益主題 → monetization
# 技術詳細 → technical
# 既定値 → strategy
# 3. kpi_relevance: kpi_target + 本文キーワード分析
kpi_relevance = detect_kpi_keywords(document_content, kpi_target)
# 4. feature_domains: 本文から機能キーワード抽出
feature_domains = extract_feature_keywords(document_content)
# 5. competitors: 本文から競合社名抽出
competitors = extract_competitor_names(document_content)
# 6. scanner.keywords: 核心キーワード抽出 (上位 5-10個)
keywords = extract_top_keywords(document_content)
# 7. scanner.priority: kpi_relevance + category で決定
priority = calculate_priority(kpi_relevance, category)
# 8. quality 評価
quality = assess_document_quality(document_content)
# 9. 検索メタデータ抽出 (全てのリサーチ文書に適用)
# 9.1 target_apps: 本文からアプリ名抽出
target_apps = extract_app_names(document_content)
# 9.2 target_user_levels: レベルキーワード抽出
target_user_levels = extract_user_levels(document_content)
# 9.3 pain_points: ペインポイントカテゴリキーワードマッチング
pain_points = extract_pain_point_categories(document_content)
# 9.4 learning_topics: 韓国語学習主題抽出
learning_topics = extract_learning_topics(document_content)
# 9.5 actionability: 実行可能性自動判断
actionability = determine_actionability(document_content)
return frontmatter_dict
Frontmatter 自動生成規則:
| フィールド | 自動決定方法 |
|---|---|
research_id |
R-{今日日付}-{既存最大+1} |
title |
文書最初の # ヘッダー |
category |
本文主題分析 (下記表参照) |
kpi_relevance |
ディープリサーチ要求の kpi_target + 本文 KPI キーワード |
feature_domains |
本文から機能キーワードマッチング |
competitors |
本文から会社名抽出 |
scanner.priority |
category + kpi_relevanceで計算 |
scanner.keywords |
本文 TF-IDF 上位 5-10個 |
quality.actionable |
Action Items セクション存在/品質 |
quality.has_data |
数字/% 含有有無 |
quality.has_actions |
- [ ] または "Action" セクション存在 |
ai_confidence |
ディープリサーチソース品質により 0.6-0.9 |
target_apps |
本文からアプリ名抽出 (デュオリンゴ、Duolingo、TTMIK 等キーワードマッチング) |
target_user_levels |
レベルキーワード抽出 (初級、中級、beginner、intermediate 等) |
pain_points |
ペインポイントカテゴリキーワードマッチング (コンテンツ、UX、価格等) |
learning_topics |
韓国語学習主題抽出 (発音、文法、語彙、会話等) |
actionability |
Action Items + 緊急性キーワードで自動判断 |
category 自動分類規則:
| 本文特徴 | category |
|---|---|
| 競合社3個以上比較 | competitor |
| 市場規模/トレンド | market |
| ユーザーインタビュー/アンケート | user |
| 新技術/革新 | innovation |
| 価格/収益/コスト | monetization |
| 法律/規制/GDPR | legal |
| 技術実装詳細 | technical |
| 日本市場特化 | localization |
| 既定値 | strategy |
検索メタデータ自動抽出規則 (全てのリサーチ文書に適用):
ℹ️ 適用範囲: 全てのリサーチ文書に自動適用して AI/人間検索利便性向上
| フィールド | 抽出方法 | キーワード例示 |
|---|---|---|
| target_apps | アプリ名キーワードマッチング | "デュオリンゴ"、"Duolingo"、"TTMIK"、"世宗学堂"、"Speak"、"ELSA"、"Memrise" 等 |
| target_user_levels | レベルキーワード抽出 | "初級"、"入門"、"beginner"、"中級"、"intermediate"、"高級"、"advanced" |
| pain_points | ペインポイントカテゴリキーワード | "コンテンツ品質"、"UX/UI 不便"、"価格不満"、"学習設計"、"動機付け"、"技術エラー" |
| learning_topics | 韓国語学習主題キーワード | "発音"、"文法"、"語彙"、"会話"、"聞き取り"、"書き込み"、"敬語"、"タメ口"、"方言" |
| actionability | Action Items + 緊急性 | Action Items 存在 + "即座"、"速い" → immediate "検討必要" → review_needed "長期" → long_term |
抽出ロジック詳細 (Python 概念的):
def extract_app_names(content):
"""本文からアプリ名抽出"""
app_keywords = {
"duolingo": ["デュオリンゴ", "duolingo", "デュオリンゴ"],
"ttmik": ["TTMIK", "Talk To Me In Korean", "トークトゥミーインコリアン"],
"sejong": ["世宗学堂", "sejong", "世宗韓国語"],
"speak": ["Speak", "スピーク"],
"elsa": ["ELSA", "エルサ"],
# ... 其他アプリ
}
found = []
for app, keywords in app_keywords.items():
if any(kw.lower() in content.lower() for kw in keywords):
found.append(app)
return found
def extract_user_levels(content):
"""本文からユーザーレベル推定"""
level_keywords = {
"beginner": ["初級", "入門", "beginner", "初心者", "A1", "A2"],
"elementary": ["初中級", "elementary", "B1"],
"intermediate": ["中級", "intermediate", "B2"],
"advanced": ["高級", "advanced", "C1", "C2", "ネイティブ級"]
}
found = []
for level, keywords in level_keywords.items():
if any(kw in content for kw in keywords):
found.append(level)
return found
def extract_pain_point_categories(content):
"""ペインポイントカテゴリ自動分類"""
category_keywords = {
"content": ["コンテンツ", "内容", "資料", "教材", "品質"],
"learning_design": ["学習設計", "カリキュラム", "進度", "難易度"],
"ux_ui": ["UX", "UI", "インターフェース", "デザイン", "画面", "操作"],
"motivation": ["動機付け", "面白さ", "退屈", "興味", "習慣"],
"technical": ["バグ", "エラー", "遅い", "クラッシュ", "エラー"],
"pricing": ["価格", "高い", "サブスク", "無料", "有料"],
"social": ["ソーシャル", "友達", "コミュニティ", "リーダーボード", "競争"]
}
found = []
for category, keywords in category_keywords.items():
if any(kw in content for kw in keywords):
found.append(category)
return found
def extract_learning_topics(content):
"""韓国語学習主題抽出"""
topics = ["発音", "文法", "語彙", "会話", "読み", "書き込み", "聞き取り",
"敬語", "タメ口", "方言", "スラング", "文化文脈",
"ハングル字母", "パッチム", "発音変化"]
return [topic for topic in topics if topic in content]
def determine_actionability(content):
"""実行可能性自動判断"""
has_actions = "## Action Items" in content or "- [ ]" in content
# 緊急性キーワードチェック
immediate_keywords = ["即座", "緊急", "速く", "critical", "P0"]
review_keywords = ["検討必要", "考慮", "分析必要", "P1"]
long_term_keywords = ["長期", "ロードマップ", "未来", "P2"]
if any(kw in content for kw in immediate_keywords) and has_actions:
return ["immediate"]
elif any(kw in content for kw in review_keywords):
return ["review_needed"]
elif any(kw in content for kw in long_term_keywords):
return ["long_term"]
else:
return ["reference_only"]
Frontmatter 生成例示:
---
research_id: R-20260206-001
title: 'Duolingo アプリストアレビューペインポイント分析 2026'
category: user
kpi_relevance:
- monthly_churn
- d7_retention
feature_domains:
- content
- retention
competitors:
- duolingo
target_apps:
- duolingo
target_user_levels:
- intermediate
- advanced
pain_points:
- content
- learning_design
- motivation
learning_topics:
- 発音
- 文法
- 会話
actionability:
- immediate
- review_needed
scanner:
scannable: true
priority: P0
expected_insights:
- feature_gap
- user_behavior
keywords:
- duolingo
- intermediate
- 発音
- コンテンツ
- ペインポイント
quality:
actionable: high
source_reliability: A
has_data: true
has_actions: true
created_at: 2026-02-06
created_by: research-gap-analyzer
ai_confidence: 0.85
schema_version: 3
---
必須本文セクション:
- Executive Summary (100単語以内)
- 核心インサイト (3-5個、定量データ含む)
- 競合社ベンチマーク
- Action Items (優先順位 + 予想工数)
- 出所 (信頼度表示: A/B/C級)
6.2 状態ファイル更新
ディープリサーチ完了後 assets/research-status.jsonの該当作業を更新:
{
"phase": "completed",
"doc_path": "docs/research/{ファイル名}.md",
"completed_at": "{完了時間}"
}
失敗時:
{
"phase": "failed",
"last_error": "{エラーメッセージ}",
"attempt": 2
}
6.3 Manifest 自動再生成 (Bash 実行)
⚠️ 自動化: AI が文書保存後 Bash ツールでスクリプトを直接実行する。
自動実行手順:
# AI が自動的に実行 (人間介入不要)
Bash: python scripts/generate_research_manifest.py
AI 行動指針:
- Step 6.1 で Frontmatter 含む文書を Write ツールで保存
- 即座 に Bash ツールで
python scripts/generate_research_manifest.py実行 - スクリプト出力で成功有無確認:
- ✅ "Generation Complete" → 正常
- ❌ エラー発生 → Frontmatter 検証後再試行
検証 (選択的):
# Frontmatter スキーマ検証 (問題発生時のみ)
Bash: python scripts/validate_research_frontmatter.py
Frontmatter フィールドレファレンス (AI 自動生成用):
---
research_id: R-{YYYYMMDD}-{NNN} # 必須、固有 ID (例: R-20260126-001)
title: '{文書タイトル}' # 必須 - 最初の # ヘッダーから抽出
category: strategy # 必須 - 9個 enum (自動分類)
kpi_relevance: # 関連 KPI (kpi_target + 本文分析)
- ltv
- monthly_churn
feature_domains: # 関連機能ドメイン (本文キーワード)
- retention
- monetization
competitors: # 言及された競合社 (本文から抽出)
- duolingo
- speak
scanner: # market-intelligence-scanner用
scannable: true
priority: P1 # P0|P1|P2|P3 (自動計算)
expected_insights:
- feature_gap
- pricing
keywords: # 本文核心キーワード 5-10個
- churn
- retention
quality: # 文書品質 (自動評価)
actionable: high # high|medium|low
source_reliability: B # A|B|C (ディープリサーチソース基準)
has_data: true # 数字/% 含有有無
has_actions: true # Action Items 存在有無
created_at: 2026-01-26 # YYYY-MM-DD (今日日付)
created_by: research-gap-analyzer
ai_confidence: 0.85 # 0.6~0.9 (ソース品質基準)
schema_version: 1
---
category 有効値: competitor, market, user, innovation, strategy, technical, legal, monetization, localization
kpi_relevance 有効値: d7_retention, paid_conversion, monthly_churn, ltv, ai_max_upgrade, cac
scanner.priority 自動計算:
- P0: 競合社分析 + P0 KPI(monthly_churn, ltv, paid_conversion) 関連
- P1: 競合社分析または P0 KPI 関連
- P2: P1 KPI(d7_retention, ai_max_upgrade) 関連
- P3: 其他
Step 7: README.md 自動インデックス更新
⚠️ 自動化: AI が Read → 挿入位置計算 → Edit ツールで自動更新する。
自動実行手順:
# AI 自動実行ロジック
1. Read("docs/research/README.md") # 現在リスト読取
2. アルファベット順挿入位置計算
3. Edit()で新項目挿入
AI 行動指針:
docs/research/README.md読取## List of Documentsセクション検索- アルファベット順挿入位置 自動計算:
# 新ファイル名: "churn-reactivation-campaign-2026.md" # 既存リストで "churn-p..." 次、"churn-r..." 前の位置検索 for i, line in enumerate(lines): if line.startswith("- [x]"): existing_filename = extract_filename(line) if new_filename < existing_filename: insert_at = i break - Edit ツールで新項目挿入
項目形式 (自動生成):
- [x] [{Frontmatterの title}](./{ファイル名}.md)
例示 (AI が自動実行):
# 1. Read で現在状態確認
- [x] [Churn Prevention Strategy 2025](./churn-prevention-strategy-2025.md)
- [x] [Competitor Analysis 2026](./competitor-analysis-2026.md)
# 2. 挿入位置計算: "churn-r..." → "churn-p..." 次
# 3. Edit で挿入
- [x] [Churn Prevention Strategy 2025](./churn-prevention-strategy-2025.md)
- [x] [Churn Reactivation Campaign 2026](./churn-reactivation-campaign-2026.md) ← 自動挿入
- [x] [Competitor Analysis 2026](./competitor-analysis-2026.md)
自動検証 (AI が Edit 後確認):
- ✅ ファイル名とリンクパス一致
- ✅ アルファベット順序維持
- ✅ チェックボックス形式(
- [x]) 使用 - ✅ 文書タイトル = Frontmatterの title
使用例示
注意事項
- ランタイムスキャン必須: ハードコーディングされたリスト代わりに常に最新ファイル構造確認
- SSOT 遵守: リサーチ状態は 必ず
assets/research-status.jsonでのみ管理 - スキーマ遵守: 状態ファイル修正時
references/research-status-schema.json参照必須 - タイムアウト規則:
processing状態が 24時間経過時pendingに復帰 - 実行可能性: リソース制約を考慮して実行不可能なリサーチは価値なし
- Japan-First 整合性: グローバルリサーチよりも日本市場データ優先
- 品質 > 量: 概念のみあるリサーチは "未完成"で処理
- README.md は参照用: 状態管理 X、文書リストのみ記録
- Manifest 直接修正禁止: Frontmatter 作成後
python scripts/generate_research_manifest.py実行 - Frontmatter スキーマ遵守:
docs/_schemas/research-frontmatter.schema.json参照、検証はpython scripts/validate_research_frontmatter.py
ファイル構造
.claude/skills/research-gap-analyzer/
├── SKILL.md # このファイル (ワークフロー定義)
├── assets/
│ └── research-status.json # リサーチ作業状態 (SSOT)
├── references/
│ ├── kpi-targets.md # KPI 定義 + Feature マッピング
│ ├── critical-gaps.md # クリティカルギャップリスト
│ └── research-status-schema.json # 状態ファイル JSON スキーマ
└── scripts/
└── analyze_gaps.py # 自動化スクリプト (選択的)
Changelog
| バージョン | 日付 | 変更内容 |
|---|---|---|
| 5.0 | 2026-01-26 | 完全自動化: Step 6-7 全面改編 - AI が本文分析 → Frontmatter 自動生成 → Bash で Manifest 再生成 → README.md 自動挿入。人間手動作業 0 に減少 |
| 4.0 | 2026-01-26 | Frontmatter 基準 SSOT 転換: Step 6.3 全面改編 - Manifest 直接修正 → Frontmatter 作成 + generate_research_manifest.py 実行。SSOT セクション更新、Data Drift 防止 |
| 3.1 | 2026-01-25 | Research Manifest 連動: Step 6.3 追加 - ディープリサーチ完了後 docs/_manifests/research-manifest.jsonにメタデータ登録必須化。market-intelligence-scannerとの cross-skill 連動支援 |
| 3.0 | 2026-01-25 | 状態トラッキングシステム導入: assets/research-status.jsonが SSOT、JSON スキーマ基準一貫性保証、ワークフローに状態登録/更新段階追加 |
| 2.1 | 2026-01-25 | Step 7 追加: リサーチ保存後 docs/research/README.md インデックス更新必須化 |
| 2.0 | 2026-01-19 | 全面改編: SSOT 原則強化、クリティカルギャップリスト追加、品質チェックリスト導入 |
| 1.0 | 2026-01-15 | 初期バージョン |