agentsclimarketplace

Crash reporting strategy

Skill almasumdev/awesome-mobile-agent-skills/.github/skills/operations/crash-reporting-strategy

Stack-agnostic agent skills and workflows shared across iOS, Android, Flutter, React Native, and KMP.

Install
npx -y skills add almasumdev/awesome-mobile-agent-skills --skill crash-reporting-strategy

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Crash reporting for mobile - symbolication, SLOs, tagging, triage workflow, and comparing Crashlytics, Sentry, Bugsnag, Firebase, and native (APM) reporters. Use when setting up or improving crash reporting.

SKILL.md

6.4 KB, as published. Nobody here has run it

Crash Reporting Strategy

Instructions

Crash reports are the most reliable signal from real users. Without a disciplined strategy they become noise. Good crash reporting gives you an actionable ranked list, readable stack traces, and an SLO you can hold yourself to.

1. Pick a Reporter (or two)

ReporterStrengthsNotes
Firebase CrashlyticsFree, deep Android + iOS supportDefault for most teams
SentryUnified across mobile, web, backend; release health; rich contextPair with Sentry for tracing/logging
BugsnagRelease stability scoresPaid
Instabug, Embrace, ShakeSession replay, user-contextHeavier footprint
Xcode Organizer + Play ConsoleAlways-on, no SDK neededLimited grouping, no pre-release

Running two reporters is reasonable (e.g., Crashlytics for crash signal + Sentry for release health + logs). Two is the max.

2. Symbolication

Unsymbolicated stack traces are useless. Upload debug symbols on every release.

  • iOS: upload dSYMs after every archive. Crashlytics and Sentry both have Fastlane plugins. Bitcode is deprecated; modern builds no longer require the bitcode compiler re-symbolication dance.
  • Android: upload ProGuard/R8 mapping and native symbol files (.so debug symbols) per build.
  • Flutter: upload --split-debug-info symbols.
  • React Native: upload Hermes bundle + source map for the JS side, plus native symbols for the native side.

Automate upload in the pipeline; fail the release if upload fails.

3. Release Tagging

Every event carries:

  • app.version and app.build.
  • env (dev, staging, prod).
  • flavor if applicable.
  • releaseStage (beta, production).
  • deviceModel, osVersion, locale.
  • userId as a hashed id, never PII.
  • Current screen / feature flag state on crash.
Crashlytics.crashlytics().setUserID(hashedUserId)
Crashlytics.crashlytics().setCustomValue(flags.value("checkout_v2"), forKey: "checkout_v2")
FirebaseCrashlytics.getInstance().setUserId(hashedUserId)
FirebaseCrashlytics.getInstance().setCustomKey("checkout_v2", flags.bool("checkout_v2"))

4. Breadcrumbs and Logs

  • Record navigation events, network requests (method + path only, no query strings with secrets), and important state transitions as breadcrumbs.
  • Attach the last 20-50 breadcrumbs to each crash.
  • Do not log PII, tokens, or message content.
  • Use CLS_LOG / SentryBreadcrumb or equivalent; avoid sending every print to the reporter.

5. Handled Exceptions

Not every error is a crash. Handle errors in domain code, report the serious ones:

  • FirebaseCrashlytics.recordException(...) or Sentry.captureException(...) for errors that indicate a bug, not user input.
  • Tag them with severity so they do not dominate the crash list.
  • Never report user-cancelled or offline-expected errors.

6. SLOs

Define crash SLOs and display them on a dashboard.

  • Crash-free sessions: 99.8% (typical target for a mature consumer app; higher for fintech/health).
  • Crash-free users: 99.5%.
  • ANR rate (Android): below 0.47% (Play Console threshold).
  • Foreground hang rate (iOS): monitor via Xcode Organizer "Hangs" metric.

Gate rollouts on these (see staged-rollouts).

7. Triage Workflow

  • Daily triage during active release. New or regressed issues get an owner within 24 hours.
  • Group issues by stack trace fingerprint; the reporter does this, but review for false groups.
  • Rank by user impact, not raw count. A crash affecting 0.5% of users in onboarding beats 50 crashes in a settings corner.
  • Assign owners per area (payments, sync, onboarding) so issues route fast.
  • Version hygiene: do not fight crashes from two versions ago; focus on current + previous.

8. Actionable Rules

  • Every new-in-release issue must be acknowledged before the next rollout step.
  • Every top-10 issue has an assignee, a hypothesis, and a reproduction attempt.
  • Every fix must reference the issue ID in the commit message.
  • Crashes that cannot be reproduced get a defensive fix (null check, guard) only if the context justifies it, never a silent swallow.

9. Beware of Blind Spots

  • Early-boot crashes: many reporters require the SDK to be initialized before the crash. Pair with a native uncaughtException logger or platform breadcrumbs.
  • Background processes: some reporters do not capture crashes in separate processes (widgets, app extensions, isolates). Configure per process.
  • ProcessLifecycle on Android differs from Activity lifecycle. Use the broader one for app-level breadcrumbs.
  • React Native: JS errors and native errors are different worlds. Capture both.
  • Flutter: Dart errors via FlutterError.onError and PlatformDispatcher.instance.onError (async errors) separately.
void main() {
  runZonedGuarded(() {
    FlutterError.onError = (details) => Crashlytics.recordError(details.exception, details.stack);
    PlatformDispatcher.instance.onError = (e, s) { Crashlytics.recordError(e, s); return true; };
    runApp(const MyApp());
  }, (e, s) => Crashlytics.recordError(e, s));
}

10. Anti-Patterns

  • Shipping without symbol upload. You will regret it.
  • Logging PII or secrets in breadcrumbs.
  • Silencing crashes with broad catch blocks to clean up dashboards.
  • Chasing old-version tails. Fix current and previous; accept drift beyond that.
  • Ignoring ANRs because "they are not crashes". Users see them the same way.
  • One reporter with no native-level coverage on a platform.

Checklist

  • A primary crash reporter is integrated; optional secondary is justified.
  • Symbol uploads happen on every release for every platform.
  • Events tagged with version, build, env, flag state, and hashed user id.
  • Breadcrumbs record navigation, network, and state transitions; no PII.
  • Crash-free session / user SLOs are defined and displayed.
  • Triage workflow has named owners and daily cadence during releases.
  • Blind spots covered: early-boot, background processes, JS/native split.
  • Fixes reference issue IDs in commits for traceability.
  • Handled exceptions are reported selectively with severity tags.

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.