Uber's engineers are assigned about 50,000 issues a year from the in-app bug reporter and the crash pipeline. Around 90% affect customers, and the average one took close to 28 days to resolve. Picture the engineer paged at 2 a.m., one of roughly 12,000 pagers, facing a vague error and context scattered across code, logs, and configs.
Uber's answer is DebugAssist, an AI agent that takes a bug report all the way to a reviewable fix. It is generative AI applied to agentic workflows on real production issues. In this post, we discuss how it works, node by node.
What Is DebugAssist?
DebugAssist is Uber's AI agent that takes a bug or crash from discovery to a reviewable fix. It is a LangGraph pipeline that collects crash and bug-report data without an LLM, then uses LLM nodes to classify and root-cause the issue, mitigate or fix it, validate the fix with tests, and open a pull request for a developer to review.
It comes from Kriti Dangi's talk at AGNTCon + MCPCon, Building a Debugging Agent Harness at Uber, and it is a piece of Uber AI engineering and internal tooling. We follow her structure throughout.
The Four-Stage Resolution Pipeline
Four stages turn raw bug tracking noise into an actionable change:
- Discovery: Issues arrive from two systems. Wisdom is the in-app bug reporter for employees and beta testers, and it does far more than a bug tracking template: It captures the description, app version, OS, city, logs, and screenshots. Healthline captures crashes and hangs automatically, stack trace included.
- Auto-triage: The system works out the priority, the severity, and the owner, so the right on-call engineer is tagged early.
- Deep root cause analysis: DebugAssist runs here, finishing in under 30 minutes.
- Resolution: The goal is an actionable fix, not a big dump of data for the developer to sift through.
Why It Goes Beyond Root Cause Analysis
Classic root cause analysis methods, such as a fishbone diagram root cause analysis, end with a template filled in by hand. Most root cause analysis tools stop at the same point: They hand you a diagnosis and leave the rest to you.
DebugAssist carries on well past the diagnosis. It adds four more steps that a template never covers:
- Mitigate: Roll back a correlated feature flag to contain the impact while the fix is built.
- Fix: Draft the change in the source code, narrowed to the affected module.
- Validate: Reproduce the issue and test the fix before a developer sees it.
- Open a PR: Link it to the Jira ticket and send it over Slack, ready to merge.
Demo: Two Real Bugs DebugAssist Fixed
One Uber developer woke up, booked a cab, and noticed his phone burning up in his pocket. He filed a one-line Wisdom report: The Uber app was using nearly 30% of his battery. About 20 minutes later, DebugAssist had a fix waiting for review.
The Battery Drain Report
The RCA found a hot-looping code path and backed every claim with evidence. It is one of the cleaner root cause analysis examples from the talk:
- Cause: Work meant to run in the background was being treated as a foreground loop, burning CPU and battery.
- Context: The app had been backgrounded for 17 minutes.
- Evidence: A timeline sat behind every claim.
The P1 Crash Caught at 5% Rollout
A bad rollout made the app crash whenever someone tapped a push notification very quickly. The crash was severe enough to be marked P1, so speed mattered:
- Output: A deep RCA, the offending source code pinpointed, and a drafted fix.
- Outcome: Caught at 5% rollout, sent to the developer on Slack, and merged the same day.
Architecture: How DebugAssist Works Under the Hood
DebugAssist is a LangGraph graph that mixes deterministic nodes with LLM nodes. Agents normally plan, then execute, but Uber skips the planning by handing over fixed steps, which removes a layer of hallucination. Uber supplies the plan, and the model only reasons inside each step.
Context Collector: Why This Node Isn't an LLM
The first node uses no LLM at all. Uber gave three reasons:
- Context bloat: Logs run to gigabytes, so the collector prunes them in code first.
- Latency: No extra model calls for data Uber can fetch directly.
- Cost: Tokens spent on fetching are tokens wasted.
Not everything has to be an agent. Ordinary log analysis tools already filter well, and good log analysis is mostly deletion.
Classification and RCA Node
This is where the first LLM calls happen. The node works in this order:
- Categorise: Uber code, third-party library, infrastructure or network, and whether a PR is needed.
- Score: Attach a confidence score.
- Fetch more: Query Uber systems through MCP servers, built on the Model Context Protocol, for Jaeger tracing, logging, and incident data.
- Fan out: Parallel subagents do the RCA. Breadcrumb analysis rebuilds the user's timeline, and crash correlation ties a crash to a release.
On Uber's slide, this node runs Claude Sonnet with 20 maximum turns. Uber found by trial and error that past 20 turns, an agent is usually down a rabbit hole.
Fix and Mitigation Node
Uber's codebase runs to billions of lines, so it narrows to the affected module and code path in the source code.
- Mitigate first: Correlate the crash with a feature flag through a feature-flag MCP, hard when tens of thousands are live. On a strong match, roll the flag back and fix at leisure.
- Then fix: Claude Opus, 30 to 50 maximum turns, with plugins such as android-debugger and go-debugger.
Bazel Testing and Diff Creation
The stage is called Bazel testing for legacy reasons, but it is really validation. It follows three steps:
- Reproduce: Unit test first, then integration test, then a simulator-based end-to-end test.
- Iterate: Sonnet, 20 turns, until the command passes or reproduces the failure.
- Deliver: Diff creation attaches the PR to the Jira ticket and source issue and posts it to Slack.
This is AI testing in practice, with test generation and validation in one loop, because the agent checks its own fix. Standard software testing tools report a pass or fail, while this loop uses the result to try again.
How Uber Scales DebugAssist Across Engineering Teams
Uber maintains the harness; teams contribute the knowledge. Each LLM node has its own skills, and the skeleton never changes:
- One shared harness: About eight agents run across five monorepos on one developer platform, and the agent type decides which Docker image and pipelines load.
- Skills and plugins: Skills are fetched at runtime from almost 3,000 plugins, so weak skills mean weak agents.
- Tracing and turn caps: Arize traces every tool call, and Uber's rule of thumb is 20 to 30 turns per agent.
- Security: Beyond the talk, The Pragmatic Engineer reports a central MCP gateway that works like a security service for tool calls, handling authorisation, telemetry, and logging.
Results: How Well Does Uber's Debugging Agent Perform?
These figures come from Kriti Dangi's talk and are self-reported. Here is what Uber reports for DebugAssist:
- Volume: About 9,000 RCAs a month.
- Time to fix: Almost 28 days on average before DebugAssist.
- Accuracy: About 50% of RCAs matched the developer's actual fix, and about 40% of the remainder pointed in the right direction.
- PR merge rate: Up from 5% a year ago to about 48%.
- Jira resolution: Roughly doubled.
A half-right RCA in 30 minutes is still a useful head start on a bug that used to wait 28 days for resolution. It works because a developer still reviews every PR before it merges.
Three caveats matter most:
- Self-reported data: All of it comes from Uber, with no independent check.
- Developer velocity: Gains are asserted, not independently measured.
- Cost of a wrong RCA: Whether 50% accuracy is good enough depends on what a wrong answer costs your team.
How Frugal Testing Helps You Build AI-Assisted Debugging Workflows
As a software testing service, we help teams build AI-assisted test automation and root cause analysis workflows, including agentic workflows. We start with your logs, traces, and test data, then design a deterministic collector that prunes evidence before any model reads it, just as Uber does.
Next come capped reasoning steps, validation through a test automation framework, and a human approval gate. We weigh the options using our guide to AI testing tools, and our software test automation services and QA outsourcing services usually begin with test automation in CI/CD.
What Our Engagement Looks Like
Our engagements mirror DebugAssist: Evidence first, automation second, a human at every gate. The plan runs in four steps:
- Week 1: Scope your evidence sources, such as logs, traces, and crash reports.
- Week 2: Build the deterministic collector that prunes context before any model reads it.
- Week 3: Add capped RCA steps, test-based validation, and approval gates.
- Week 4: Hand over the pipeline, skills, and traces, with a review of what the agent got right.

Conclusion
Uber's debugging agent works because it is boring in the right places. The plan is fixed, collection is deterministic, turns are capped, and a developer reviews every PR. The model is clever only inside those walls, and the PR merge rate rose from 5% to about 48%.
For your team, the question is how much to build and how much to borrow. Start with one deterministic collector, one capped reasoning step, and a human-reviewed PR. Track merge rate, then widen scope once the first workflow earns trust, instead of copying Uber's scale.
People Also Ask (FAQs)
Q1. What is root cause analysis, and what is a root cause analysis template?
Ans: Root cause analysis traces a failure to its underlying fault, for example, with the five whys or a fishbone diagram. A template records the timeline, impact, evidence, cause, fix, and owner.
Q2. What does regression testing mean in QA?
Ans: Regression testing means re-running tests after a change to confirm nothing broke. Pair it with performance testing tools or performance testing software, which check speed and stability under load.
Q3. What is test automation in software, and how do I pick a test automation framework?
Ans: Test automation in software means scripts run checks instead of people. Pick a test automation framework by language fit, CI integration, reporting, and maintenance cost, then track test coverage.
Q4. Which software testing tools should a QA team start with?
Ans: Start with Playwright for browser checks and a test management tool for cases and runs. Add bug tracking and log analysis tools so failures reach developers with evidence attached.
Q5. When should you hire software testing companies for QA outsourcing services?
Ans: Consider QA outsourcing services when releases outpace your team or specialist skills are missing. Software testing companies supply software testing services covering qa automation and AI test automation.





.webp)
