この記事は「モバイルアプリ開発における AI 活用術」の詳細記事です。
目次
- はじめに
- 運用フローの全体像
- @claude メンションの仕組み(Claude Code Action)
- GA 分析 → 週次レポート → Claude 分析
- クラッシュ監視 → 自動 Issue → Claude 分析
- 週次クラッシュサマリー
- 学びの蓄積(LEARNINGS.md)
- 👤 人の判断ポイント
- 運用 → 企画へのループ
- まとめ
- 参考リンク
はじめに
リリース後は運用フェーズに入ります。ここでも AI を活用して、継続的な改善を行います。
このフェーズのゴール:
- Crashlytics によるクラッシュ監視と自動 Issue 化
- GA 分析による改善提案
- 学びの蓄積と活用
運用フローの全体像
┌─────────────────────────────────────────────────────────────────────┐
│ 運用フロー │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ GitHub Actions ┌──────────────┐ │
│ │ Firebase │─────────────────────▶ │ GitHub │ │
│ │ Crashlytics │ (毎日 0:30 JST) │ Issue │ │
│ └──────────────┘ 閾値フィルタ └──────┬───────┘ │
│ 優先度自動付与 │ │
│ ▼ @claude │
│ ┌──────────────┐ │
│ │ Claude │ │
│ │ 分析・修正 │ │
│ └──────────────┘ │
│ │
│ ┌──────────────┐ GitHub Actions ┌──────────────┐ │
│ │ Google │─────────────────────▶ │ GitHub │ │
│ │ Analytics │ (週1回 月曜 9:00) │ Issue │ │
│ └──────────────┘ 週次レポート └──────┬───────┘ │
│ │ │
│ ▼ @claude │
│ ┌──────────────┐ │
│ │ Claude │ │
│ │ 分析・提案 │ │
│ └──────────────┘ │
│ │
│ 週次サマリー(月曜 9:00) │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Crashlytics │─────────────────────▶ │ 週次サマリー │ │
│ │ 週間集計 │ 前週比較 │ Issue │ │
│ └──────────────┘ └──────────────┘ │
│ │
│ 学びの自動蓄積 │
│ ┌──────────────┐ GitHub Actions ┌──────────────┐ │
│ │ クローズ済み │─────────────────────▶ │ PR 自動 │ │
│ │ Issue │ (毎週月曜 11:00) │ 作成 │ │
│ └──────────────┘ └──────┬───────┘ │
│ │ │
│ ▼ 人がレビュー │
│ ┌──────────────┐ │
│ │ LEARNINGS.md │ │
│ │ 更新 │ │
│ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
スケジュール一覧
| ジョブ | スケジュール | 説明 |
|---|---|---|
| Crashlytics 日次 | 毎日 JST 0:30 | 新規クラッシュの早期発見 |
| GA 週次レポート | 月曜 JST 9:00 | 週間 KPI レポート |
| Crash 週次サマリー | 月曜 JST 9:00 | クラッシュ傾向まとめ |
| Learnings | 月曜 JST 11:00 | 学び分析 |
なぜ GA は日次ではなく週次?
日次データはノイズが多く、有意な傾向が見えにくいです。週次にすることで:
- トレンドが明確になる
- 通知疲れを防げる
- アクションにつながりやすい
@claude メンションの仕組み(Claude Code Action)
運用フェーズの自動化において重要な役割を果たすのが Claude Code Action です。
Claude Code Action とは
Claude Code Action は、GitHub の Issue や PR で @claude とメンションすることで Claude を呼び出せる GitHub Actions です。
特徴:
- Issue/PR のコメントで
@claudeと書くだけで起動 - リポジトリのコードベースを理解した上で回答
- コードの分析、修正提案、Issue 化などが可能
なぜ @claude で Claude が起動するのか
┌─────────────────────────────────────────────────────────────────────┐
│ @claude メンションの仕組み │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 1. Issue/PR に @claude メンションを含むコメント │
│ │ │
│ ▼ │
│ 2. GitHub Webhook がイベントを検知 │
│ │ │
│ ▼ │
│ 3. Claude Code Action ワークフロー(.github/workflows/claude.yml) │
│ が起動 │
│ │ │
│ ▼ │
│ 4. Claude がリポジトリのコードを読み込み │
│ │ │
│ ▼ │
│ 5. コメント内容を理解し、分析・回答をコメントとして投稿 │
│ │
└─────────────────────────────────────────────────────────────────────┘
認証方式: Claude Code Action では anthropic_api_key(API キー)または claude_code_oauth_token(OAuth トークン)のいずれかを使用できます。OAuth トークンを使用すると、より安全な認証が可能です。
📖 詳細: Claude Code Action 公式リポジトリ
GA 分析 → 週次レポート → Claude 分析
仕組み
毎週月曜(JST 9:00)に GA 週次レポートを GitHub Issue に投稿し、@claude をコメント内に記載することで分析・改善提案までを自動化しています。
週次レポート方式
GA レポートは 週ごとの Issue に週次レポートを投稿します。日次ではなく週次にすることで、ノイズを減らしトレンドを見やすくしています。
[GA] 週次レポート 2025-W03
├─ 📊 週間サマリー(1週間分の集計)
├─ 📈 日別トレンド(ミニチャート)
├─ 📱 プラットフォーム別
└─ 🎯 イベント別(変化が大きい順)
レポート内容
| セクション | 内容 |
|---|---|
| 💡 今週のハイライト | 30%以上変化した指標を自動検出・強調 |
| 📈 日別推移 | ミニバーチャートで 1 週間の推移を可視化 |
| KPI サマリー | アクティブユーザー、新規ユーザー、セッション、エンゲージメント率(前週比較) |
| プラットフォーム別 | iOS / Android 別の KPI |
| イベント別 | 主要イベントの発生回数(変化が大きい順にソート) |
レポート出力例
## 📊 GA週次レポート
**期間**: 2025-01-13 〜 2025-01-19(前週: 2025-01-06 〜 2025-01-12)
### 💡 今週のハイライト
- 📈 **アクティブユーザー** が前週比 +35% と大幅増加
- 🎯 イベント「**send_message**」が前週比 +52% と急増
### 📈 日別推移
**アクティブユーザー**: ▁▃▅▇█▇▅ (120〜450)
**セッション**: ▃▅▇█▇▅▃ (200〜680)
### KPIサマリー
| 指標 | 今週 | 前週 | 変化 | トレンド |
| --- | ---: | ---: | ---: | :---: |
| アクティブユーザー | 2,450 | 1,815 | +35% | 📈 |
| 新規ユーザー | 320 | 280 | +14% | ↗️ |
| セッション | 4,200 | 3,800 | +11% | ↗️ |
| エンゲージメント率 | 68.5% | 65.2% | +3.3% | ➖ |
必要な設定
- Google Analytics Data API の有効化(GCP)
- サービスアカウントを GA プロパティに 閲覧者 で追加(GA のアクセス管理)
- GA の権限は IAM ではなく、GA 側のアクセス管理で付与
-
GA_PROPERTY_IDを GitHub Actions Variables に設定 - ラベルはスクリプトが自動作成(
type/ga-report,env/prod)
Claude への分析依頼
レポートコメントの末尾に @claude と分析指示を含めることで、レポート投稿と同時に Claude Code Action が起動します。
---
@claude このレポートを分析して以下を教えてください:
1. **注目すべきトレンド**: 数値の変化から読み取れる傾向
2. **ユーザー行動の変化**: イベントデータから推測できること
3. **改善アクション**: 来週に向けて検討すべきこと
クラッシュ監視 → 自動 Issue → Claude 分析
仕組み
GitHub Actions で毎日 Crashlytics をチェックし、新しいクラッシュを GitHub Issue として自動作成します。閾値フィルタと優先度自動付与により、ノイズを減らし対応優先度を明確にしています。
改善ポイント
| 機能 | 説明 |
|---|---|
| 🚦 優先度自動計算 | 影響ユーザー数と発生回数から Critical/High/Medium/Low を自動判定 |
| 🔢 閾値フィルタ | 指定した閾値未満のクラッシュはスキップ(ノイズ削減) |
| 📋 テーブル形式 | Issue ボディを見やすく整形 |
優先度の自動計算ロジック
スコア = (影響ユーザー数 × 10) + 発生回数
Critical (🔴): スコア >= 100 または ユーザー >= 10
High (🟠): スコア >= 30 または ユーザー >= 5
Medium (🟡): スコア >= 10 または ユーザー >= 2
Low (🟢): それ以外
Crashlytics データの取得方法
Firebase Crashlytics のデータは BigQuery API で取得します。Crashlytics → BigQuery エクスポートを事前に設定しておく必要があります。
┌─────────────────────────────────────────────────────────────────────┐
│ Crashlytics → GitHub Issue 自動作成の流れ │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 1. GitHub Actions(毎日 0:30 JST) │
│ │ │
│ ▼ │
│ 2. scripts/monitoring/crashlytics_daily_issues.js を実行 │
│ │ │
│ ▼ │
│ 3. BigQuery API を呼び出し(サービスアカウント認証) │
│ - firebase_crashlytics データセットから前日分を取得 │
│ - 影響ユーザー数、発生回数などを集計 │
│ │ │
│ ▼ │
│ 4. 閾値フィルタ(MIN_USER_COUNT, MIN_EVENT_COUNT) │
│ - 閾値未満のクラッシュはスキップ │
│ │ │
│ ▼ │
│ 5. 既存 Issue との重複チェック(Issue ID で判定) │
│ │ │
│ ▼ │
│ 6. 優先度を自動計算(Critical/High/Medium/Low) │
│ │ │
│ ▼ │
│ 7. 新規クラッシュを GitHub Issue として作成 │
│ - 優先度ラベルを自動付与 │
│ - Issue 本文に @claude 分析依頼を含める │
│ - Claude Code Action が自動で分析を開始 │
│ │
└─────────────────────────────────────────────────────────────────────┘
必要な設定:
- Firebase サービスアカウント JSON(GitHub Secrets に設定)
- Crashlytics → BigQuery エクスポート の有効化(Firebase Console)
- サービスアカウントに BigQuery データ閲覧者 の権限を付与(GCP IAM)
- 対象アプリの設定(
FIREBASE_PROJECT_ID/CRASHLYTICS_APPS_JSON) -
MONITORING_PAT(GitHub PAT、@claude トリガー用) - ラベルはスクリプトが自動作成(
type/crash,env/prod,priority/*)
閾値設定(環境変数):
| 環境変数 | デフォルト | 説明 |
|---|---|---|
CRASH_MIN_USER_COUNT |
1 | 影響ユーザー数の最小値 |
CRASH_MIN_EVENT_COUNT |
1 | 発生回数の最小値 |
ワークフロー
name: Issue Monitoring (Crashlytics/GA)
on:
schedule:
# Crashlytics: 毎日 JST 0:30(新規クラッシュの早期発見)
- cron: '30 15 * * *'
# GA + Crash Summary: 毎週月曜 JST 9:00(週次レポート)
- cron: '0 0 * * 1'
# Learnings: 毎週月曜 JST 11:00(学び分析)
- cron: '0 2 * * 1'
workflow_dispatch:
inputs:
run_ga:
description: 'Run GA Weekly Report'
type: boolean
default: false
run_crash:
description: 'Run Crashlytics Daily Issues'
type: boolean
default: false
run_crash_summary:
description: 'Run Crashlytics Weekly Summary'
type: boolean
default: false
run_learnings:
description: 'Run Weekly Learnings Analysis'
type: boolean
default: false
env:
# Crashlytics 閾値設定(ノイズ削減)
CRASH_MIN_USER_COUNT: '1'
CRASH_MIN_EVENT_COUNT: '1'
jobs:
crashlytics:
name: Crashlytics Daily Issues
if: |
(github.event_name == 'workflow_dispatch' && github.event.inputs.run_crash == 'true') ||
(github.event_name == 'schedule' && github.event.schedule == '30 15 * * *')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Create Crashlytics Issues
env:
FIREBASE_SERVICE_ACCOUNT_JSON: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_JSON }}
GITHUB_TOKEN: ${{ secrets.MONITORING_PAT }}
run: node scripts/monitoring/crashlytics_daily_issues.js
MONITORING_PAT について: @claude メンションで Claude Code Action をトリガーするには、GITHUB_TOKEN ではなく Personal Access Token(PAT)が必要です。GITHUB_TOKEN はワークフロー内で別のワークフローをトリガーできないためです。
自動作成される Issue の例
# [Crash][Prod] 🟠 NullPointerException at ChatScreen.build
Crashlytics Issue ID: abc123
## 🟠 優先度: High
### 概要
| 項目 | 値 |
| --- | --- |
| プラットフォーム | Android |
| 例外 | `NullPointerException` |
| サブタイトル | ChatScreen.build (line 42) |
| 影響ユーザー数 | **15** |
| 発生回数 | **42** |
| 影響バージョン | 1.2.3 |
### タイムライン
- 初回発生: 2025-01-14 10:23:45
- 最新発生: 2025-01-15 08:15:32
- 対象期間(JST): 2025-01-15
🔗 [Crashlyticsで詳細を確認](https://console.firebase.google.com/...)
Claude への分析依頼(Issue 本文に含める)
Issue 本文の末尾に @claude と分析指示を含めることで、Issue 作成と同時に Claude Code Action が起動します。
---
@claude このクラッシュを分析してください:
**分析手順:**
1. 上記の例外名・サブタイトルからエラーの種類を特定
2. このリポジトリのコードベースを検索して関連箇所を探す
3. 影響ユーザー数と発生回数から優先度を判断
**回答フォーマット:**
- 🔍 原因推測: (エラー内容から考えられる原因)
- 📍 関連コード: (該当しそうなファイル・関数名)
- ⚡ 優先度: High/Medium/Low(理由も添えて)
- 🛠️ 修正方針: (具体的な修正アプローチ)
Claude の分析コメント例
## クラッシュ分析
- 🔍 **原因推測**: `ChatScreen.build`内で `messages` リストが null の状態でアクセスされている可能性が高いです。非同期でデータ取得中に build が呼ばれた場合に発生すると推測されます。
- 📍 **関連コード**: `lib/screens/chat_screen.dart:42` 付近の `ListView.builder` での `messages.length` アクセス
- ⚡ **優先度**: **High** - 15 ユーザーに影響、継続的に発生しており放置すると影響拡大の恐れあり
- 🛠️ **修正方針**:
1. `messages` が null の場合のガード追加
2. または `AsyncValue` パターンで loading/error/data を適切にハンドリング
3. テスト追加: messages が null/empty の場合のテスト
週次クラッシュサマリー
毎週月曜に、1 週間のクラッシュ傾向をまとめた週次サマリーを自動生成します。

仕組み
┌─────────────────────────────────────────────────────────────────────┐
│ 週次クラッシュサマリーの流れ │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 毎週月曜 JST 9:00 │
│ │ │
│ ▼ │
│ crashlytics_weekly_summary.js 実行 │
│ (過去1週間のクラッシュデータを BigQuery から集計) │
│ │ │
│ ▼ │
│ 週次サマリー Issue を作成 │
│ - 今週 vs 前週の比較 │
│ - プラットフォーム別統計 │
│ - Top クラッシュ一覧 │
│ - GitHub Issue 対応状況 │
│ │ │
│ ▼ │
│ @claude が分析・改善提案 │
│ │
└─────────────────────────────────────────────────────────────────────┘
サマリー内容
| セクション | 内容 |
|---|---|
| 💡 今週のハイライト | クラッシュ傾向(増減)、解決状況 |
| 📊 統計サマリー | ユニーク Issue 数、総発生回数、影響ユーザー(前週比較) |
| 📱 プラットフォーム別 | iOS / Android 別の統計 |
| 🔝 Top クラッシュ | 影響ユーザー数順の Top 5 |
| 📋 GitHub Issue 状況 | 今週解決済み / 現在オープン |
サマリー出力例
## 🔥 クラッシュ週次サマリー
**期間**: 2025-01-13 〜 2025-01-19
### 💡 今週のハイライト
- 📉 影響ユーザー数が前週比で減少しました
- ✅ 今週 **3件** のクラッシュIssueを解決しました
- ⏳ 現在 **5件** のクラッシュIssueが未対応です
### 📊 統計サマリー
| 指標 | 今週 | 前週 | 変化 | トレンド |
| --- | ---: | ---: | ---: | :---: |
| ユニーク Issue | 8 | 12 | -4 (-33%) | 📉 |
| 総発生回数 | 156 | 245 | -89 (-36%) | 📉 |
| 影響ユーザー | 42 | 68 | -26 (-38%) | 📉 |
### 🔝 Top クラッシュ(影響ユーザー数順)
#### iOS
| # | Issue | ユーザー | 発生回数 |
| --- | --- | ---: | ---: |
| 1 | `NullPointerException at ChatScreen...` | 15 | 42 |
| 2 | `IndexOutOfBoundsException in List...` | 8 | 23 |
学びの蓄積(LEARNINGS.md)
運用で得た学びを LEARNINGS.md に蓄積します。週次で自動更新 PR が作成される仕組みを導入しています。
自動更新の仕組み
スクリプトで Issue を作成し、@claude に分析と PR 作成を任せるシンプルな設計です。
┌─────────────────────────────────────────────────────────────────────┐
│ LEARNINGS.md 週次自動更新フロー │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 毎週月曜 JST 11:00 (cron) │
│ │ │
│ ▼ │
│ learnings_weekly_analysis.js 実行 │
│ (過去1週間のクローズ済み type/crash Issue を検索) │
│ │ │
│ ▼ │
│ 「学びまとめ Issue」を自動作成 │
│ (@claude メンション + 指示を含む) │
│ │ │
│ ▼ │
│ Claude Code Action が起動 │
│ │ │
│ ▼ │
│ Claude が Issue を分析 → LEARNINGS.md 更新 PR を作成 │
│ │ │
│ ▼ 人がレビュー │
│ マージ → 学びが蓄積される │
│ │
└─────────────────────────────────────────────────────────────────────┘
ポイント: 正規表現でコメントを解析するのではなく、Claude に自然な分析を任せることで、より柔軟で質の高い学びを抽出できます。
ワークフロー設定
issue-monitoring.yml に週次ジョブを追加しています:
learnings:
name: Weekly Learnings Issue
if: |
(github.event_name == 'workflow_dispatch' && github.event.inputs.run_learnings == 'true') ||
(github.event_name == 'schedule' && github.event.schedule == '0 2 * * 1')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Create Learnings Issue
env:
GITHUB_TOKEN: ${{ secrets.MONITORING_PAT }}
run: node scripts/monitoring/learnings_weekly_analysis.js
自動作成される Issue の例
## 週次学び分析依頼
2025-W03 にクローズされた Crash Issue から学びを抽出し、
LEARNINGS.md を更新してください。
### 対象 Issue(2 件)
- #42: [Crash][Prod] 🟠 NullPointerException at ChatScreen.build
- #58: [Crash][Prod] 🟡 IndexOutOfBoundsException in ListView
---
@claude 上記の Issue を分析して、LEARNINGS.md を更新する PR を作成してください。
自動生成される LEARNINGS.md のセクション例
### 2025-W03 (自動生成)
- **[#42](https://github.com/.../issues/42)**: NullPointerException at ChatScreen.build
- 原因: 非同期処理完了前に build が呼ばれて null アクセス
- 対策: AsyncValue パターンで loading/error/data を適切にハンドリング
- **[#58](https://github.com/.../issues/58)**: IndexOutOfBoundsException in ListView
- 原因: リストの長さチェックが不十分
- 対策: itemCount と実データの整合性チェックを追加
LEARNINGS.md の構成例
# 学びの蓄積
## クラッシュから学んだこと
### 2025-01: Null安全でない箇所でクラッシュ多発
- **問題**: 非同期処理完了前に build が呼ばれて NullPointerException
- **対策**: Lint ルール追加、AsyncValue パターンの徹底
- **Issue**: #42
### 2025-01: 非同期処理のエラーハンドリング不足
- **問題**: API エラー時にユーザーへのフィードバックがない
- **対策**: try-catch 必須化、エラー表示コンポーネント共通化
- **Issue**: #58
## GA分析から学んだこと
### チュートリアル完了率
- 3ステップ以内が最適(それ以上は離脱率上昇)
- スキップボタンは必須
### 継続率との相関
- 初回チャット完了率が Day7 継続率に強く相関
- オンボーディングで最初のチャットまで誘導すべき
## レビューで指摘されがちなこと
### Riverpod の dispose 忘れ
- **対策**: テンプレートに dispose 処理を追加
### コメント不足
- **対策**: 複雑なロジックには必須化(レビューチェックリストに追加)
CLAUDE.md への反映
学びは CLAUDE.md に反映し、AI の品質向上に活かします。
## Development Guidelines から学んだこと
### 非同期処理
- AsyncValue パターンを使用すること
- null チェックを徹底すること
### エラーハンドリング
- try-catch は必須
- ユーザーへのフィードバックを忘れずに
👤 人の判断ポイント
| # | 判断内容 | タイミング |
|---|---|---|
| 1 | クラッシュ対応方法の選択 | Issue 作成後(優先度ラベルを参考に) |
| 2 | 改善施策をやるかどうか | GA 週次レポート確認後(月曜) |
| 3 | 学びの PR をマージするか | 週次 PR 作成後(月曜) |
対応方法の選択肢
クラッシュ対応:
- 🔴 Critical → 即時対応
- 🟠 High → 今週中に対応
- 🟡 Medium → 次スプリントで検討
- 🟢 Low → Backlog へ
- @claude に修正を依頼
改善施策:
- 実施する → 企画フェーズへループ
- 保留 → Backlog へ
- 却下 → 理由を記録
運用 → 企画へのループ
運用で得た学びやデータは、次の機能開発(企画フェーズ)にフィードバックします。
運用
│
├─ クラッシュ分析 → バグ修正(優先度に応じて)
│
├─ GA週次分析 → 改善施策立案
│
├─ 週次サマリー → 傾向把握・リソース配分
│
└─ 学びの蓄積 → CLAUDE.md 更新
│
▼
企画(次の機能開発)
まとめ
運用フェーズでも AI と自動化を活用することで:
- クラッシュの早期発見・分析: 自動 Issue 化 + 優先度自動付与 + Claude 分析
- 週次での傾向把握: GA 週次レポート + クラッシュ週次サマリー
- データドリブンな改善: 週次レポート + Claude 提案
- 知識の蓄積: LEARNINGS.md → CLAUDE.md
監視頻度の最適化
- 日次: クラッシュ検出(早期発見が重要)
- 週次: GA レポート + クラッシュサマリー(トレンド把握)
日次データはノイズが多いため、週次でまとめて確認する方が有意義です。ただしクラッシュは早期発見が重要なため日次で検出しています。
これにより、継続的な品質向上と効率的な運用が実現できます。
参考リンク
- Claude Code Action - GitHub での @claude メンション
- Firebase Crashlytics
- Crashlytics を BigQuery にエクスポート - BigQuery 連携の設定
- BigQuery API - Crashlytics データ取得
- Google Analytics Data API
- GitHub Actions


