ANTIGRAVITY LABJP
Articles/Agents & Manager
Agents & Manager/2026-05-18Advanced

Splitting Daily Crashlytics Triage Across Five Antigravity Sub-Agents

Running six indie iOS and Android apps, the morning Crashlytics triage was draining me. I split the workflow across five Antigravity sub-agents (Fetcher, Classifier, Repro, Patch, PR) and locked their input and output to JSON schemas. Two weeks of production data shows where the human review boundary belongs.

antigravity429agents123crashlytics5firebase11ios36android27multi-agent49indie-dev19

Premium Article

Opening the Crashlytics console every morning and chasing the top ten crashes one by one was the most draining part of running six apps in parallel. As an indie developer running six iOS and Android apps on my own, the morning backlog of crash reports had stopped being something I could handle in a single sitting. For a while I thought handing everything to a single Antigravity agent would solve it, but production use convinced me that a single all-purpose agent is the wrong structure.

So I split the work across five sub-agents. Each one owns a single responsibility, accepts a JSON payload from the previous stage, and emits a JSON payload that the next stage can validate. After two weeks of production use, the morning triage time dropped from 89 minutes to 14, and the false positive rate on suggested patches fell from 18 percent to 6. This is the design, the rationale, and the things I would tell an indie developer who wants to build the same pipeline.

Why a single agent could not carry the whole pipeline

The first attempt was the obvious one: paste the Crashlytics stack trace into a single Antigravity agent and ask it to find the root cause and produce a patch. It works for a week. It breaks within two weeks for three reasons.

First, the context window inflates beyond the agent's ability to prioritize. The crash payload, the surrounding codebase, similar crashes from the past 90 days, the release notes, the dependency diffs — concatenated, this easily exceeds 20K tokens, and the agent starts treating the tail end of the stack trace carelessly. With four or more apps flowing through the same workflow, this got worse.

Second, you cannot decide where humans should step in. Asking yourself "do I trust this agent's patch enough to merge it to main right now?" rarely yields a confident yes. The handful of my apps where AdMob revenue is significant cannot tolerate even a single regression that ripples into a two-digit percent monthly swing. No-review merges were never on the table.

Third, you cannot roll back at the boundary that broke. Was the root cause analysis wrong? Was the repro script too thin? Was the patch applied at the wrong layer? A single-agent log makes that question impossible to answer retroactively.

Splitting into five sub-agents that exchange validated JSON solves all three at once. Each boundary is logged, each stage's failure is identifiable, and each agent's prompt can be tuned without touching the others.

Five sub-agents and their explicit responsibilities

The design is straightforward. Each agent receives a JSON payload conforming to a schema, executes only within its own domain, and emits a JSON payload that the next stage can parse and validate.

  1. Fetcher Agent — pulls crashes from Crashlytics, normalizes them, and outputs structured JSON
  2. Classifier Agent — labels each crash as regression, known-open, external, or device-specific, with a priority score
  3. Repro Agent — drafts repro scripts for the top priority crashes and runs them in a simulator
  4. Patch Agent — produces a minimal patch and a regression test for any successfully reproduced crash
  5. PR Agent — opens a Draft PR, assigns reviewers, and posts a Slack notification

Each agent has an explicit allow list and deny list for what it may include in its output. The Fetcher Agent may forward raw stack traces, but PII fields like user emails or internal user IDs must be stripped at normalization time. This is not just a privacy nicety. It keeps PII out of every downstream log, which matters when you operate apps on both the App Store and Google Play and want to keep audit trails small.

Here is an excerpt from the agents.md that captures the pipeline declaratively for Antigravity to read.

# Crashlytics Triage Pipeline
 
## Agents
 
### fetcher
- role: pull last 24h fatal crashes from Crashlytics, emit normalized JSON
- inputs: { app_ids: string[] }
- outputs: schema://crash-batch-v1.json
- tools: gcp-bigquery, firebase-crashlytics-rest
- constraints:
  - strip PII (user_email, custom_keys.user_id) before output
  - cap at 50 crashes per run
 
### classifier
- role: label crashes into 4 buckets and score priority
- inputs: schema://crash-batch-v1.json
- outputs: schema://crash-triaged-v1.json
- tools: codebase-search, git-log-since
- constraints:
  - when labeling as regression, attach the suspected commit hash
 
### repro
- role: draft repro scripts for top 5 priority crashes and run them in simulator
- inputs: schema://crash-triaged-v1.json
- outputs: schema://crash-reproduced-v1.json
- tools: xcodebuild-test, gradle-test, simctl
- constraints:
  - if not reproduced in 5 minutes, record the skip reason

Keeping the pipeline declarative in a single agents.md file lets Antigravity load the whole graph as one document. Pairing that with explicit JSON schemas means every stage's output can be validated before the next stage sees it.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
Declarative responsibility split across five sub-agents with locked JSON schemas
Scoring logic that decides which patches require human review and which can be auto-flagged
Two-week numbers: triage time dropped from 89 to 14 minutes, false positive rate from 18 to 6 percent
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Antigravity Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

Agents & Manager2026-05-27
Orchestrating Six iOS App Updates in Parallel with Antigravity's Main and Sub Agents
Running six iOS app updates in parallel — new resolutions, Firebase SPM migration, StoreKit 2, and ATT ordering — with Antigravity's Main + 6 Sub agents. The notes on what to parallelize and what to keep serial.
Agents & Manager2026-05-26
Splitting Pre-release QA Across Four Antigravity Subagents — A Design Note from a Solo Mobile Developer
A design note from a solo indie developer running six iOS / Android apps in parallel, sharing how Antigravity subagents are split into four parallel paths for pre-release QA. Covers the boundary decisions, prompt templates, termination rules, and merge logic with concrete examples.
Agents & Manager2026-05-22
Handing Nightly Wallpaper Asset Updates to a Background Agent — Time Budgets, Duplicate Detection, and a Completion Gate
A reproducible account of handing nightly wallpaper asset updates to Antigravity's Background Agent. Covers how to write the task definition, perceptual-hash duplicate detection, one-pass resizing across 12 device profiles, a morning report you can review in five minutes, and the time-budget and completion-gate design that makes unattended runs safe.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →