◉CLAUDE LABEN
●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/Claude Code
⟐ Claude Code/2026-05-11上級

Claude Code でクラッシュレポートから修正コミットまでの導線を引く — 個人開発のリリース後障害対応を仕組み化する

Crashlytics や Sentry に届くクラッシュレポートを Claude Code で自動診断し、修正コミットまでつなげる個人開発者向けの実装パイプラインを、今も自分が回している運用とコード例で具体的に書きます。

Claude Code265クラッシュレポート個人開発130Crashlytics8Sentry障害対応

✦ プレミアム記事

個人で複数のアプリを長く運用していると、毎朝の習慣がひとつ重荷になっていることに、あるときふと気づきました。Firebase Crashlytics のダッシュボードを開く時間です。前日の夜にリリースした更新がどこかで小さくこけていないかを、コーヒーをいれる前に確認します。それが3〜4分で済む朝もあれば、新しい OS の細かな挙動変化に巻き込まれて1時間以上溶ける朝もありました。

リリース後の障害対応というのは、本来は分業で吸収する仕事です。SRE がいて、運用エンジニアがいて、サポート窓口がいます。けれど個人開発者は、これらをすべて一人で抱える前提で動いています。広告収益がそれなりの規模に育った時期も、その裏側ではほとんど毎日、何かしらのクラッシュレポートを読んでいました。他の活動と並行しながら、それでも個人開発を細く長く続けていくためには、この朝のルーチンを何とかしなければならない、と静かに思い続けていました。

Claude Code を本格的に使い始めて変わったのは、クラッシュレポートを「読む対象」から「処理する対象」に置き直せたことです。本記事はその仕組みを、私自身が今でも回している運用とコード例で書きます。表面的な「ログをAIに貼り付けて聞いてみよう」という話ではなく、レポートの取得・正規化・仮説生成・該当コード特定・差分提案までを、ひとつのパイプラインとして組む方法を紹介します。

なぜ個人開発者ほど「リリース後の障害対応」が重い負荷になるのか

クラッシュレポートの対応コストは、単に「件数 × 1件あたりの調査時間」では測れません。もう少し正確に言えば、個人開発者には以下のような特殊な構造的負荷がかかっています。

ひとつは、コンテキストスイッチの代償です。新規開発でコードを書いている最中に Crashlytics の通知メールが届くと、頭の中の作業記憶を一度退避してクラッシュ調査に切り替えなくてはいけません。組織の中であれば「あとで担当者が見る」と委ねられる場面でも、個人開発では自分の中でこれを切り替えるしかありません。私の経験では、新機能の設計に集中している1時間と、クラッシュ調査に1時間使った後の1時間では、生産性が体感で3〜4倍違います。

もうひとつは、ユーザー数のスケールです。長く配信を続けたアプリは、月間アクティブで見れば数十万人規模になることもあり、しかもタブレット・スマホ・国・OS バージョンが多様に分布します。クラッシュ率が0.1%しかなくても、毎日数百件は何らかのレポートが上がってきます。手で開いて読むのは現実的ではなく、しかし「無視する」と評価が落ちて売上が削れる。この板挟みが個人開発者の日常です。

そしてもうひとつ、心理的な負荷があります。クラッシュレポートを開くということは、自分が書いたコードに穴があったことを直視する作業です。何年やっても、スタックトレースの先頭に自分のソースが乗っていると静かに胃が縮みます。これを毎朝続けるのは、技術的にも精神的にも持続可能ではありません。

ここで私が出した結論は単純です。「読む」のをやめる。代わりに、Claude Code に処理させ、自分は判断と意思決定だけに集中します。この発想の転換が、本記事の出発点です。

レポートを「Claude Code に渡せる形」に整える前処理

Claude Code に直接スタックトレースを貼り付けて聞いても、ある程度の答えは返ってきます。けれど個人開発の運用に耐える品質には届きません。理由は単純で、生のレポートはノイズが多すぎ、また同じ原因のレポートが何百件と複製されているからです。仕組み化の最初のステップは前処理です。

私が組んでいる流れはこうです。

    1. Crashlytics または Sentry の API を叩いて、過去24時間の Issue を JSON で取得する
    1. スタックトレースを正規化(行番号の差異を吸収)し、signature を計算する
    1. 同じ signature のレポートをマージし、発生件数・影響ユーザー数・初出時刻・最終発生時刻だけを残す
    1. 上位 N 件を「優先トリアージキュー」として JSON ファイルに書き出す

ここまでをスクリプトで自動化しておけば、Claude Code に渡すのは「整理済みの優先キュー」だけで済みます。ノイズが落ち、重複が消え、調査対象が明確になります。

実装例を示します。Sentry を使っている方を想定したスクリプトですが、Crashlytics でも考え方は同じです。

# fetch_top_issues.py
# 直近24時間のクラッシュ Issue を取得し、影響ユーザー数の多い順に上位10件を整形して出力します。
# 期待出力: triage_queue.json (Claude Code に渡す形式)
 
import os
import json
import time
import urllib.request
 
SENTRY_TOKEN = os.environ["SENTRY_AUTH_TOKEN"]
ORG_SLUG = os.environ["SENTRY_ORG_SLUG"]
PROJECT_SLUG = os.environ["SENTRY_PROJECT_SLUG"]
 
def fetch_issues(hours: int = 24, limit: int = 50) -> list:
    url = (
        f"https://sentry.io/api/0/projects/{ORG_SLUG}/{PROJECT_SLUG}/issues/"
        f"?statsPeriod={hours}h&query=is:unresolved&sort=user&limit={limit}"
    )
    req = urllib.request.Request(url, headers={"Authorization": f"Bearer {SENTRY_TOKEN}"})
    with urllib.request.urlopen(req, timeout=30) as r:
        return json.loads(r.read())
 
def normalize(issue: dict) -> dict:
    # 末端のフレームだけを正規化キーとして使う(行番号は外す)
    frames = issue.get("metadata", {}).get("function") or ""
    return {
        "id": issue["id"],
        "title": issue["title"],
        "culprit": issue.get("culprit"),
        "signature": frames.split("(")[0].strip(),
        "users": issue.get("userCount", 0),
        "events": issue.get("count", 0),
        "first_seen": issue.get("firstSeen"),
        "last_seen": issue.get("lastSeen"),
        "permalink": issue.get("permalink"),
    }
 
if __name__ == "__main__":
    issues = fetch_issues()
    triaged = [normalize(i) for i in issues]
    # 影響ユーザー数の多い順
    triaged.sort(key=lambda x: x["users"], reverse=True)
    queue = triaged[:10]
    with open("triage_queue.json", "w") as f:
        json.dump(queue, f, ensure_ascii=False, indent=2, default=str)
    print(f"wrote {len(queue)} issues to triage_queue.json at {time.strftime('%Y-%m-%d %H:%M')}")

このスクリプトを cron か GitHub Actions で1日1回流しておくだけで、毎朝 triage_queue.json がリポジトリに用意されます。Claude Code はこのファイルを起点に作業を始めればよく、ダッシュボードを開きにいく必要はありません。

ここで重要なのは、シンボリケーション(iOS の dSYM や Android の Proguard mappings の解決)はこのステップより前に済ませておくことです。Sentry も Crashlytics も、シンボル解決前のスタックトレースをそのまま渡されると Claude Code の仮説生成が大きく外れます。私はリリースパイプラインの中で fastlane upload_symbols_to_sentry を必ず叩くようにしています。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦Crashlytics や Sentry を毎朝目視確認する運用から抜け出し、Claude Code に15分以内でトリアージさせる仕組みに置き換えられるようになります
✦重複レポートの統合・原因仮説の生成・該当コード箇所の特定までを連続したパイプラインとして実装できるようになります
✦AI が提案した修正をそのまま適用してはいけないケース(再現条件不明・ライブラリ起因・スレッド競合)の見極め基準を、個人開発の現場で再利用できる形で持ち帰れます
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⟐ Claude Code2026-10-12
SPM に移したら、起動した瞬間にアプリが落ちるようになりました — dyld の一行を Claude Code と読み解いた記録
CocoaPods から Swift Package Manager へ移した直後、ビルドは通るのに起動した瞬間に落ちました。dyld の一行から原因を切り分け、直し方と確認コマンドまでをまとめます。
⟐ Claude Code2026-09-20
Pro を払っているのに Console に請求が立っていたとき、私が最初に見た一行
サブスクリプションと API の従量は別会計で、Claude Code はそのどちらでも動きます。どちらが選ばれているかを決めるのは優先順位で、ログインはその最下段です。status の読み方と、無人実行だけが別の答えを返す理由を書き残します。
⟐ Claude Code2026-09-10
plugin.json を1枚置くと、スキルの棚がまとめて外せる単位になります
スキルを用途ごとに色分けしたら、毎日使う一群は全体の5パーセントしかありませんでした。.claude-plugin/plugin.json を1枚置いてフォルダをプラグインに変え、その日に使わない棚をグループごと外せるようにするまでの手順と、途中で二度つまずいた読み込みの規則を書き残します。