CLAUDE LABEN
FORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられていますFORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられています
記事一覧/API & SDK
API & SDK/2026-06-01上級

Crashlyticsのクラッシュを根本原因ごとに束ねる — Claude APIで作るトリアージの設計メモ

Crashlyticsの「Issue」は同じ原因を別物として散らしてしまうことがあります。累計5,000万DLのアプリ運用で溜まったクラッシュを、Claude APIで根本原因ごとに束ね直して優先順位をつける設計を、動くコードと実測値とともに共有します。

Claude API115Crashlytics8クラッシュ解析個人開発110Python17アプリ開発8バッチ処理4

プレミアム記事

アプリが増えるほど、Crashlyticsのダッシュボードは「読むもの」から「眺めるだけのもの」に変わっていきました。

2014年から個人でアプリを作り続けてきて、いまは累計5,000万ダウンロードほどになりました。本数が増え、OSのバージョンも端末も多様になると、Crashlyticsの「Issue(問題)」は数百単位で並びます。やっかいなのは、件数の多さそのものではありません。同じ根本原因が、別々のIssueとして散らばってしまうことでした。

たとえば、ある画像デコード処理の不具合は、呼び出し元のスレッドが違うだけで3つのIssueに分かれていました。逆に、シンボルが解決できていない難読化済みのトレースは、まったく別の原因がひとつのIssueに同居していることもありました。Crashlyticsのグルーピングはスタックトレースの先頭フレームに強く依存するため、こうした「分かれすぎ」と「混ざりすぎ」が同時に起きます。

毎朝この一覧を前に、どれから手をつけるべきかを判断する時間が、いつのまにか開発そのものより長くなっていました。そこでClaude APIを使い、クラッシュを「根本原因」という単位で束ね直し、優先順位を機械的に出す仕組みを組みました。以下では、その設計判断と動くコード、そして運用して分かった実測値を共有します。

なぜ「LLMで全部分類」ではうまくいかないのか

最初に試したのは、クラッシュのスタックトレースをそのままClaudeに渡して「これらをグループ分けして」と頼む素朴なやり方でした。これは二つの理由で破綻します。

ひとつはコストです。1日に数千件のクラッシュイベントが届く規模だと、毎件をLLMに通すのは費用的に現実的ではありません。もうひとつは安定性です。同じトレースでも、入力の並び順やわずかな文言差で、束ね方が日によって揺れてしまいます。クラスタが毎日違う形になると、「昨日対応した原因が今日も上位にいるのか」を追えなくなります。

開発現場で実際に使えるものにするには、決定論的に処理できる部分は決定論的に処理し、LLMは人間でも判断に迷う「境界」だけに使うという割り切りが要ります。私はこの設計を、宮大工だった祖父が「墨付けは機械、刻みは手」と道具を使い分けていた話と重ねて考えるようになりました。揺れてはいけない寸法は治具で固定し、判断が要る部分にだけ手をかける。クラッシュ解析も同じで、揺れてはいけない指紋は決定論で固定し、意味の判断だけをClaudeに委ねます。

そこで採ったのが次の三段構成です。

  1. 正規化と指紋化(決定論)— トレースから可変要素を削り、安定した指紋を作る
  2. 指紋による事前クラスタリング(決定論)— 同一指紋を機械的にまとめる
  3. Claudeによるラベル付けとクラスタ統合(LLM)— 指紋が違っても原因が同じものを束ね、根本原因名と優先度を付ける

スタックトレースを正規化して指紋にする

LLMに渡す前に、まずトレースを「同じ原因なら同じ文字列になる」形へ正規化します。メモリアドレス、行番号、ユーザーIDのような可変要素を取り除き、安定したフレーム列だけを残すのが狙いです。

import re
import hashlib
 
# 可変要素を消すための置換ルール
NOISE_PATTERNS = [
    (re.compile(r"0x[0-9a-fA-F]+"), "0xADDR"),      # メモリアドレス
    (re.compile(r":\d+\)"), ":N)"),                   # 行番号
    (re.compile(r"\b\d{4,}\b"), "NUM"),               # 長い数値ID
    (re.compile(r"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"), "UUID"),
]
 
# アプリ自身のフレームだけ残す(OS/SDKのノイズを落とす)
APP_FRAME_HINT = re.compile(r"(MyWallpaperApp|com\.dolice\.)")
 
def normalize_frame(frame: str) -> str:
    for pattern, repl in NOISE_PATTERNS:
        frame = pattern.sub(repl, frame)
    return frame.strip()
 
def fingerprint(stacktrace: str, top_n: int = 5) -> str:
    """上位フレームのうちアプリ由来のものを正規化して指紋を作る"""
    frames = [normalize_frame(f) for f in stacktrace.splitlines() if f.strip()]
    app_frames = [f for f in frames if APP_FRAME_HINT.search(f)]
    # アプリフレームが取れなければ上位フレームで代替
    key_frames = (app_frames or frames)[:top_n]
    digest = hashlib.sha256("\n".join(key_frames).encode()).hexdigest()
    return digest[:16]

ここで効くのが「アプリ由来のフレームを優先して指紋にする」工夫です。UIKitlibsystem のような共通フレームを先頭から拾うと、原因の違うクラッシュが同じ指紋に潰れてしまいます。逆に、自分のアプリのフレームを軸にすると、原因の単位で素直に分かれてくれます。公式ドキュメントには書かれていませんが、私の経験ではこの一手で事前クラスタの精度が体感で大きく変わりました。

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

この記事の続きを読む

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

この記事で得られること
スタックトレースを決定論的に正規化してから指紋化し、LLM呼び出しを「境界」に絞ってコストと安定性を両立させる三段構成
Claude APIの構造化出力(tool use)で根本原因ラベル付けとクラスタ統合を行う、実行可能なPython実装一式
影響ユーザー数とクラッシュフリー率の差分で優先度を採点する式、Batch APIとプロンプトキャッシュでコストを抑える運用ノウハウ
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

API & SDK2026-05-12
App Storeのレビュー1,000件をClaude APIで分析したら、自分のアプリの本当の問題が見えてきた
個人開発10年超・累計5,000万DLの経験から語る。App StoreレビューをClaude APIでバッチ分析し、次の改善優先順位を自動生成する実装パターンと、試して気づいた落とし穴を共有します。
API & SDK2026-06-28
ストリーミング応答のCPUと取りこぼしを実測して長時間バッチを安定させる
夜間に走らせた長時間バッチが、朝には半分しか終わっていない。原因はCPU張り付きとストリームの中断でした。streamのCPU・スループットを実測し、中断から再開する監視ラッパーの実装を紹介します。
API & SDK2026-06-25
API リクエスト1本でリモート MCP サーバーに直接つなぐ — Messages API の MCP コネクタ実装メモ
ローカルに MCP クライアントを立てずに、Messages API の mcp_servers と mcp_toolset だけでリモート MCP サーバーのツールを呼ぶ実装をまとめました。allowlist/denylist 設計、レスポンス処理、無人運用での落とし穴まで。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →