Your Crashlytics inbox has 40 new issues since Friday. Most are duplicates, three are real, one is on fire. The cost is not the fix. It is the 45 minutes of reading stack traces in a Monday standup before anyone agrees which is which. AI is good at this exact first pass: read the trace, name the area, suggest an owner.
This guide gives you a copy-ready prompt that turns any symbolicated stack trace into a 3-line triage card, plus a clear-eyed comparison of when to use a generic chat model versus the AI now built into Crashlytics and Sentry.
TL;DR
- Paste the top frame plus 5 to 8 surrounding frames, not the full 1,200-line log. The crash site is rarely the cause.
- Give the model a code-area map (
path prefix -> owner) and a severity rubric. Without them it guesses owners from method names and over-rates severity. - Demand a fixed 3-line card: severity + summary, area + owner + why, first debug step naming file/line/method.
- Tools with codebase access (Sentry Seer Autofix, Crashlytics MCP) beat a bare chat window once you have more than ~50 issues a week. Seer reports 94.5% root-cause accuracy as of June 2026.
- Always keep a human in the loop on the owner call. AI does not know your team’s politics or who is on PTO.
The task
Turn a raw crash log (Crashlytics, Sentry, Firebase) into a 3-line triage card: severity, area, suggested owner. Output one card per issue, no fluff. The goal is to walk into standup with cards already drafted so the meeting is a review, not a read-along.
When this is the right job for AI
- You already have a code-area map (“payments lives in
/billing”, “auth in/session”). - You have a small team with named owners by area, not “everyone owns everything.”
- You can paste the top frame and the next 5 to 8 frames, not the full log.
- You will sanity-check the owner suggestion. AI does not know your team’s politics.
If you have none of these, fix that first. A triage prompt with no area map and no rubric produces confident, wrong cards.
What to feed the AI
- The top frame of the stack and 5 to 8 surrounding frames (symbolicated — see the FAQ).
- App version where it first appeared, and the current version.
- Affected sessions, users, and device counts (whatever Crashlytics or Sentry gives you).
- The code-area map: file path prefix to owner.
- The severity rubric: when something is P0, P1, P2, P3.
- Anything the issue shares with a recent change (“we rewrote receipt parsing in 4.2.0”).
Copy-ready prompt
Paste this into Claude Opus 4.7, GPT-5.5, or Gemini 3.1 Pro. All three handle a single trace fine; for batching 5 to 10 issues, the 1M-token context on Opus 4.7, Sonnet 4.6, and Gemini 3.1 Pro means you can paste the whole batch in one shot.
You are triaging an iOS crash for a 4-engineer team.
Stack (top 8 frames):
0 CRASH __exceptionPreprocess
1 objc_exception_throw
2 -[NSDictionary getObjects:andKeys:count:]
3 -[BillingCoordinator _hydratePurchaseRecords:] (BillingCoordinator.swift:218)
4 -[BillingCoordinator restorePurchases] (BillingCoordinator.swift:74)
5 -[SettingsViewController didTapRestore:] (SettingsViewController.swift:312)
6 UIControlEventInvocation
7 UIApplicationMain
First seen: app version 4.2.0 (current is 4.2.1).
Affected: 218 sessions across 41 users in the last 24 hours.
Device skew: 89% iPhone 14/15, 11% older.
iOS skew: 92% iOS 17+, 8% iOS 16.
Code-area map:
- /billing -> owner: Sara
- /session -> owner: Jin
- /ui -> owner: Mei
- /core, /storage -> owner: Ravi
Recent changes:
- 4.2.0 shipped a refactor of BillingCoordinator (Sara): receipt parsing rewrite.
- 4.2.0 also bumped minimum iOS to 16.
Severity rubric:
- P0: crash-on-launch OR more than 1% of sessions OR blocks revenue path.
- P1: revenue path or auth path, less than 1% of sessions.
- P2: non-blocking, less than 0.2% of sessions.
- P3: cosmetic / log-only.
Output: a 3-line triage card.
Line 1: Severity + one-sentence summary of what crashed.
Line 2: Area (which file / subsystem) + suggested owner + WHY them.
Line 3: First debug step they should take, in one sentence. Be specific (file, line, method).
Rules:
- Do not invent line numbers I did not give you.
- If you cannot tell who the owner is from the area map, say "owner unclear" and propose Sara as escalation point.
- If the severity is ambiguous, default UP one level and explain.
Sample output
P1 — BillingCoordinator crashes while restoring purchases; receipt-hydration is force-unwrapping or mis-counting on an empty or partial dictionary. Area:
/billing-> owner: Sara. She owns the 4.2.0 receipt-parsing rewrite, and the crashing method is_hydratePurchaseRecords:at BillingCoordinator.swift:218, directly in her diff. First step: add a guard or unwrap-with-default at BillingCoordinator.swift:218 around the dictionarygetObjects:andKeys:count:call; reproduce with an empty restore response in the sandbox account.
This is P1 not P0 because 218 sessions out of an app doing tens of thousands a day is under the 1% bar, but it sits on the revenue path, so the rubric floors it at P1.
Generic chat vs. built-in AI: which to use
A bare chat window is the fastest way to start, but Crashlytics and Sentry now ship AI that reads the issue (and, via MCP, your repo) directly. Use this to decide:
| Option | Codebase access | Best for | Cost (as of June 2026) |
|---|---|---|---|
| Chat model + this prompt (Opus 4.7 / GPT-5.5 / Gemini 3.1 Pro) | No (you paste) | Ad-hoc triage, batching, any tracker | Your existing plan ($20/mo Plus/Pro tier) |
| Crashlytics AI Insights (Gemini in Firebase) | No (dashboard only) | Crashes + ANRs already in Firebase | Free for individuals; bundled with Gemini Code Assist |
| Crashlytics MCP (Gemini CLI / Claude Code / Cursor) | Yes (reads + edits repo) | Reproduce and fix in your editor | Your AI tool’s plan |
| Sentry Seer Autofix | Yes (reads repo, opens PRs) | High-volume teams, auto root-cause | $40 per active contributor/mo |
Notes that matter for triage:
- Crashlytics AI Insights generates a cause summary and next steps inside the dashboard, but only for crashes and ANRs — not non-fatal events as of June 2026. It cannot see or change your code.
- Crashlytics MCP exposes Crashlytics issues to Gemini CLI, Claude Code, and Cursor so the model can pull prioritized issues, change state, and patch the code that caused them.
- Sentry Seer scans issues as they arrive, adds a root-cause guess, and can open a fix PR or hand the code change to Claude Code or a Cursor agent. Sentry reports Autofix lands the correct root cause 94.5% of the time and a working fix 53.6% of the time, and its semantic issue grouping cuts duplicate noise by roughly 40%. Pricing moved to $40 per active contributor per month (anyone with 2+ PRs in a connected repo) on January 21, 2026.
Rule of thumb: stay in a chat window until the inbox volume hurts (~50+ new issues/week), then turn on the tool that lives where your code does.
How to refine the prompt
- AI invents line numbers: repeat “use only the frames I gave you; do not invent lines.”
- Severity is always P2: enforce the rubric. “If the revenue path is touched, it is at minimum P1.”
- Owner is always the most recent committer: require “match by area first, recent change second.”
- Output is paragraphs: insist on “3 lines, fixed structure.”
- AI proposes a generic fix (“add error handling”): demand “first step names file, method, and what to check.”
Common mistakes
- Triaging without a code-area map. AI guesses owner from method names and gets it wrong.
- Pasting only the top frame. The crash site is rarely the cause; AI needs the next 5 to 8 frames.
- Ignoring device skew. A crash that is 89% iPhone 14/15 on a 60/40 iOS-version split is structural, not OS-specific.
- Auto-assigning to the most recent committer. Recent changes are a signal, not a rule.
- Triaging unsymbolicated traces. Hex addresses tell the model nothing; upload your dSYM first.
FAQ
- Can AI read obfuscated or unsymbolicated traces? No. Hex addresses carry no meaning. Upload your dSYM (Apple) or mapping file (Android) so the dashboard symbolicates, then paste the readable trace. Crashlytics and Sentry both symbolicate server-side once the symbol file is uploaded.
- What about iOS hangs and Android ANRs? Crashlytics AI Insights already covers ANRs. For the prompt, swap the rubric: on Android, “P0 if the user-perceived ANR rate exceeds Google Play’s 0.47% bad-behavior ceiling; P1 otherwise.” On iOS there is no ANR metric — the watchdog terminates after roughly 5 to 10 seconds of an unresponsive main thread, so treat those as P0/P1 by session count.
- Should I batch issues? Yes. Feed the model 5 to 10 stack traces in one prompt and ask for one card per issue. With 1M-token context on Opus 4.7, Sonnet 4.6, and Gemini 3.1 Pro, a full Monday batch fits easily and cuts triage time more than running one at a time.
- What severity floor is “healthy” so I know what P0 means? Industry crash-free session rates run about 99.93% on iOS and 99.81% on Android as of 2026. If a single issue drops you below ~99% sessions, that is your P0 regardless of the area.
- What about Sentry breadcrumbs? Paste the last 5 to 8 breadcrumbs after the stack frames. They often name the real cause (a failed network call, a state transition) that the frames alone hide.
- Will Seer or Crashlytics MCP replace this prompt? For Firebase-and-Sentry-only shops, largely yes — let the built-in tool do the first pass. The manual prompt still wins when you triage across multiple trackers, want a fixed card format for standup, or are on a free tier and not paying $40 per contributor.
Related
Tags: #AI writing #crash-reports #Triage #app-product-ops #Indie dev