Skip to main content
mobster test repro takes one crash report, writes a check that follows the path the crash names, runs it on a simulator with the screen recorded, and tells you whether the app crashed the same way. Your coding agent gets the same answer from the repro_crash tool, fixes the app, and runs the check again: it passes once the app no longer crashes. Mobster runs the check on a simulator and writes files in your project. It merges nothing and opens no pull request. The pull request is yours to merge. It doesn’t run on a real iPhone.

Bring a crash

Pass the crash as a file. Mobster tells the kind from the file. Mobster doesn’t read Crashlytics’ own export. Ask your agent to write the brief from the issue it reads through the Crashlytics connector.

What a repro contains

Mobster writes these under your project’s .mobster: <id> is eight characters from the app, the exception and the function that crashed, so one crash is one check. A check that exists is kept as you edited it. crashes/ ignores itself in git; commit the check with the fix. The steps come from the crash’s breadcrumbs: a tap becomes Tap “label” and a screen becomes Go to the “name” screen. The label is cut to 60 characters, stripped of quote marks and run through the secret filter. Nothing else in a crash report becomes a step, because the report is text from outside and never instructions. A .ips or a TestFlight log has no breadcrumbs, so its check launches the app and stops; pass --link for the screen it crashed on, or --arg for a launch argument. Steps that need Smart use your key, as any check does. A check that is only a launch link runs with no key (--keyless).

The answer

The run is not repeated to be sure. A crash that depends on timing may need a second mobster test repro.

Hand it to your agent

repro_crash takes one of ips_path, sentry_json, crash_log or brief, and the same bundle, app, launch_args and link. It answers with the same text and the paths of the check and the video. A run that outlasts the call answers with a suite_id; repro_crash {suite_id} waits for it. After the fix, the agent builds the app and runs the check:
It passes when the app no longer crashes on that path. mobster test pr runs it with the rest of your checks.

Try it on Daybreak

Daybreak plants five crashes behind launch arguments, one tap each. Launch it with -DaybreakBug crash-weekly-plan, crash-reminder, crash-restore, crash-trial or crash-terms. Without the argument it doesn’t crash, which stands in for the fixed build. A link reaches each tap: daybreak://paywall?press=weekly (also trial, restore, terms) and daybreak://settings?press=reminder.