For AI agents: a documentation index is available at the root level at /llms.txt and /llms-full.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.
Sign inTry it free
DocsGuidesSDKsIntegrationsAPI docsTutorialsFlagship blog
DocsGuidesSDKsIntegrationsAPI docsTutorialsFlagship blog
  • Tutorials
    • The AI Iteration Loop for Deploying Reliable Agents with LangGraph
    • Using LaunchDarkly feature flags and Experimentation with Wordpress
    • Migrate a Hardcoded LangGraph Agent to LaunchDarkly AgentControl in 20 Minutes
    • Offline Evaluation of RAG-Grounded Answers in AgentControl
    • Beyond n8n for Workflow Automation: Agent Graphs as Your Universal Agent Harness
    • Catch your first silent AI failure with Vega AI in under 10 minutes
    • Evaluate LLM code generation with LLM-as-judge evaluators
    • OpenTelemetry for LLM Applications: A Practical Guide with LaunchDarkly and Langfuse
    • Use LaunchDarkly Agent Skills in Claude Code and Cursor
    • Detection to Resolution: Real World Debugging with Rage Clicks and Session Replay
    • Compare AI orchestrators: LangGraph vs Strands vs OpenAI Swarm
    • Building a data extraction pipeline with LaunchDarkly
    • Day 12 | 🎊 New Year, New Observability
    • Day 11 | ✉️ Letters to Santa: What engineering teams really want from Observability in 2026
    • Day 10 | Why observability and feature flags go together like milk and cookies
    • Day 9 | 👻 The Three Ghosts Haunting Your AI This Holiday Season
    • Day 7 | 🎄✨The Rockefeller tree in NYC: SLOs that actually drive decisions
    • Day 6 | 💸 The famous green character that stole your cloud budget: the cardinality problem
    • Day 5 | 🧹 Using a Popular Tidying Method to Consolidate Your Observability Stack
    • Day 4 | ❄️ Tracing the impact of holiday styling in your Node.js app
    • Day 8 | 🎁 Observable Multi-Modal Agentic Systems
    • Day 3 | 🔔 Jingle All the Way to Zero-Config Observability
    • Day 2 | 🎅 He knows if you have been bad or good... But what if he gets it wrong?
    • Collecting user feedback in your app with feature flags
    • Day 1 | 🎄 Observability Under the Tree: What Changed in 2025
    • Build a User Frustration Detection & Response System
    • When to Add Online Evals to Your AgentControl
    • Detecting User Frustration: Understanding Rage Clicks and Session Replay
    • AgentControl config CI/CD Pipeline: Automated Quality Gates and Safe Deployment
    • A Deeper Look at LaunchDarkly Architecture: More than Feature Flags
    • Add Observability to Your React Native App in 5 minutes
    • Smart AI Agent Targeting with MCP Tools
    • Build a LangGraph Multi-Agent System in 20 Minutes with LaunchDarkly AgentControl
    • Snowflake Cortex Completion API + LaunchDarkly SDK Integration
    • Using AgentControl to review database changes
    • How to implement WebSockets and kill switches in a Python application
    • 4 hacks to turbocharge your Cursor productivity
    • Create a feature flag in your IDE in 5 minutes with LaunchDarkly's MCP server
    • Observability for Your Go ORM: OpenTelemetry Integration with GORM
    • The complete guide to OpenTelemetry in Next.js
    • How to instrument your React Native app with OpenTelemetry
    • The complete guide to OpenTelemetry in Python
    • Monitoring Browser Applications with OpenTelemetry
    • How to Use OpenTelemetry to Monitor Next.js Applications
    • What is OpenTelemetry and Why Should I Care?
    • Distributed Tracing in Next.js Apps
    • Tracing Distributed Systems in Next.js
    • Real-time Monitoring in Django: Essential Tools and Techniques
    • DeepSeek vs Qwen: local model showdown featuring LaunchDarkly AgentControl
    • Application Tracing in .NET for Performance Monitoring
    • The Ultimate Guide to Ruby Logging: Best Libraries and Practices
    • Using Materialized Views in ClickHouse (vs. Postgres)
    • Filtering and Sampling LaunchDarkly Ingest
    • How to Set Up Your Production AWS MSK Kafka Cluster
    • Publishing an NPM Package with Private pnpm Monorepo Dependencies
    • How To Use The Chrome Inspector & Debugger
    • 3 Levels of Data Validation in a Full Stack Application With React
    • The power of the monorepo: Keep your fullstack app in sync!
    • Compression: The simple, powerful upgrade for your web stack
    • Video tutorials
Sign inTry it free
LogoLogo
On this page
  • Overview
  • The Debugging Workflow: An Observability Loop
  • Scenario 1: Form Validation Frustration
  • The Setup
  • Investigation Steps
  • The Root Cause
  • The Fix
  • Resolution
  • Scenario 2: The Infinite Scroll Frustration
  • The Setup
  • Investigation Steps
  • The Root Cause
  • The Fix
  • Resolution
  • Building your debugging playbook
  • Bringing it all together
  • Series recap
  • Additional Resources
Tutorials

Detection to Resolution: Real world debugging with rage clicks and session replay

Was this page helpful?
Previous

Building Framework-Agnostic AI Swarms: Compare LangGraph, Strands, and OpenAI Swarm

Next
Built with

Published February 11, 2026

portrait of Alexis Roberson.

by Alexis Roberson

Part 3 of 3: Rage Click Detection with LaunchDarkly

Overview

In Part 1, we set up rage click detection using LaunchDarkly’s Session Replay. In Part 2, we connected those frustration signals to guarded releases for automated rollback protection.

Now it’s time to put it all together. In this final installment, we’ll walk through real-world debugging scenarios using our WorkLunch app—a cross-platform application built with React Native and Expo where coworkers can swap lunches.

These scenarios demonstrate how the integrated system of feature flags, session replay, and guarded releases can transform the way you diagnose and fix production issues.

All code for this blog post can be found here.

The Debugging Workflow: An Observability Loop

Before diving into scenarios, let’s understand the complete workflow we’ve built:

Flowchart showing detect, alert, investigate, fix, verify cycle

The Debugging Workflow using rage click detection, session replay, and guarded releases.

This workflow enables you to:

  • Detect frustration signals automatically as they happen.
  • Alert when thresholds are breached during rollouts.
  • Investigate with full session context, not just error logs.
  • Fix with confidence knowing the exact user experience.
  • Verify the fix works by monitoring the new rollout.

Feature Flag Snapshot

Feature Flag Snapshot.

When a guarded release detects a spike in rage clicks, it automatically correlates the frustration with specific flag variations:

Example of join-community-redesign flag variation

Example of join-community-redesign flag variation.

The alert tells you exactly which feature caused the problem: “Rage clicks increased 10x for users on join-community-redesign: true” It’s important to note that rage clicks aren’t the only measure for frustration signals around user experience.

When items are out of place, confusing or navigation is not consistent across mobile and web, it can cause users to rage scroll. Unlike rage clicks that can be measured and tracked, rage scrolls are a little more nuanced, which will result in relying heavily on session replay and drops and traffic to diagnose.

Just as llm observability tools monitor model outputs for hallucinations or drift, rage click detection monitors the human layer, catching UX failures that no server-side metric would reveal.

Using feature flags, session replay and guarded releases, let’s take a closer look at both scenarios to debug in a real-world worklunch app.

Scenario 1: Form Validation Frustration

The Setup

Your team ships a new “Create Community” button redesign and places the feature behind a feature flag called (inline-form-validation).

Feature flag for Inline-Form-Validation breaking change

Feature flag for Inline-Form-Validation breaking change.

After the feature flag is toggled on, you notice users on this form are rage clicking the Create Community button. Your metrics show community creation conversions dropped 15 percent since enabling the flag, but there are no errors in the logs.

How the feature flag status impacts the app UI

How the feature flag status impacts the app UI.

Thankfully, you connected your feature flag with a Guarded Release and can use it to debug the issue.

Investigation Steps

Step 1: Search for sessions with rage clicks

Since we attached a Guarded Rollout to your feature flag using a metric for detecting rage clicks, we can navigate to the LaunchDarkly’s Session page and filter for those specific sessions.

In the LaunchDarkly Sessions tab search bar, apply this filter:

has_rage_clicks=true featureflag.key=inline-form-validation

This query filters for sessions with rage clicks and where the inline-form-validation flag is enabled.

Step 2: Watch for user behavior patterns

In the session replay, you see:

  1. User fills out the form completely.
  2. User clicks Create Community.
  3. User sees a loading spinner and nothing else.
  4. User clicks button repeatedly.
  5. User abandon forms altogether.

Step 3: Identify the UX failure The community was being created successfully meaning the API returned a 200 and the new community existed. The new feature was intended to simply change the button color (baby blue → purple), but it broke the code that allows the success card to be shown.

The Root Cause

When the flag is off, the code does the right thing after a successful create:

  1. Success → Set createdSpace → Show verification card (name, join code, “Back to community list”)
  2. User taps Back → Return to community list

When the flag is on, the success path was missing:

  1. Success → Nothing. The if (!useInlineValidation) block runs only for the old flow, so when the flag is on, setCreatedSpace is never called.
  2. The user stays on the form with no confirmation, no join code, and no way to know the create worked.
1// Only the control (flag OFF) got success UI; the treatment (flag ON) did not
2if (!useInlineValidation) {
3 setCreatedSpace({ name: space.name, join_code: space.join_code });
4}

The Fix

To fix the issue, you can either rollback to previous working code or fix the issue and toggle flag back on.

Option A – Roll back the flag: Set inline-form-validation to off in LaunchDarkly. Users are no longer on the new feature; they get the existing, working code path and see the verification card after Create Community.

Option B – Fix the new feature so it no longer breaks the success card: The new feature (flag on) breaks the code that shows the success card. Fix it by adding the success handling to the flag-on path. Also, when the flag is on, also call setCreatedSpace after a successful create so the success card is shown again.

Resolution

With the root cause identified from Session Replay, you update the code and resolve the rollout:

  1. Roll back inline-form-validation to false so users get the verification card and can return to the list (instant, no deployment needed).
  2. Fix the flag-on success path so it shows the verification card (or redirects) after create.
  3. Deploy and re-enable the flag with the guarded rollout (rage click metrics) still attached, then monitor to confirm rage clicks return to baseline.

Time to resolution: 30 minutes to an hour (compared to potentially days of user complaints and support tickets).

Scenario 2: The Infinite Scroll Frustration

The Setup

Your team ships a feature flag (new-filter-location) that moves the existing Category and Sort controls on the “Lunches for Swap” feed from the top of the list to the bottom.

Feature flag for changing the position of the sort and filter options

Feature flag for changing the position of the sort and filter options.

Everything works fine until you notice a drop in traffic.

How the feature flag status impacts the app UI for the filter options

How the feature flag status impacts the app UI for the filter options.

Since you see no uptick in rage clicks for your Guarded Release, you know it must be another user signal you’re missing that could indicate user frustration. So you decide to investigate further by placing yourself in the user’s shoes using session replay.

Investigation Steps

Step 1: Filter by flag variation

feature_flag.key=new-filter-location feature_flag.result.value=true

This query will filter for sessions where the feature flag new-filter-location is set to true.

Step 2: Watch for user behavior patterns

In session replay, you see:

  1. users scroll down the feed, then back up, then down again.
  2. Minimal item taps.
  3. Constantly moving through the list without making selections.
  4. User navigates to a different page.

The pattern suggests they’re looking for something rather than browsing items.

Step 3: Identify UX Failure Replay shows the issue: “Category” and “Sort” are not at the top where users expect them. With the flag on, the controls were moved to below every post in the feed.

The Root Cause

The feature flag moves the existing filter bar from the top to the bottom of the list (ListFooterComponent when the flag is on). Same controls, different position.

1// Flag ON: same filter bar rendered as ListFooterComponent — breaks user expectation
2ListFooterComponent={
3 useFiltersAtBottom ? (
4 <View style={styles.filterBar}>...</View>
5 ) : null
6}

The Fix

Step 1 – Roll back the flag: Set new-filter-location to false. Filters return to the top (original position); rage scrolls drop.

Step 2 – Fix the experiment: Don’t move the filters to the bottom. Keep the filter bar at the top regardless of the flag, or remove the flag and leave filters in their original place.

1// Fix: always show filter bar at top (original place)
2{/* Filters always above the list */}
3<View style={styles.filterBar}>
4 <TouchableOpacity style={styles.filterButton} onPress={openCategoryFilter}>
5 <Text style={styles.filterButtonText}>Category: {categoryLabel}</Text>
6 </TouchableOpacity>
7 <TouchableOpacity style={styles.filterButton} onPress={openSortMenu}>
8 <Text style={styles.filterButtonText}>Sort: {sortOrder === 'newest' ? 'Newest' : 'Oldest'}</Text>
9 </TouchableOpacity>
10</View>
11<FlatList ... ListFooterComponent={null} />

Resolution

  1. Roll back new-filter-location to false so filters are at the top again
  2. Fix keep the filter bar at the top.
  3. Deploy and re-enable the flag with monitoring.

Building your debugging playbook

Based on these scenarios, here’s a systematic approach to rage click debugging:

Step 1: Triage with Filters

What to look forSearch query
All frustrated usershas_rage_clicks=true
Specific page issueshas_rage_clicks=true visited-url="*/spaces/create*"
Browser-specifichas_rage_clicks=true browser_name=Chrome
High frustrationhas_rage_clicks=true active_length>180s

Step 2: Identify the Pattern When reviewing session replays, look for:

  • Visual feedback gaps (Did the UI acknowledge the click?)
  • Loading states (Is there a spinner? Does it ever resolve?)
  • Error visibility (If there’s an error, can the user see it?)
  • Touch target issues (On mobile, are elements too small or overlapping?)
  • Timing problems (Does the click happen before the element is ready?)

Step 3: Correlate with Technical Data Session replay shows you the user’s experience. Pair it with:

  • Network tab (API response codes and payloads.)
  • Console errors (JavaScript exceptions.)
  • Feature flag state (Which variation was the user seeing?)
  • Timing (When in the session did frustration peak?)

Step 4: Fix and Verify

  1. Roll back using your feature flag (instant, no deployment needed).
  2. Fix the root cause in code.
  3. Re-deploy with the guarded rollout active.
  4. Monitor rage click metrics to confirm the fix worked.

Whether you’re shipping traditional features or AI-powered experiences, this playbook reflects a devops for ai mindset: continuous monitoring, fast rollback, and data-driven debugging that closes the gap between deployment and user impact.

Bringing it all together

The combination of rage click detection, session replay, and guarded releases creates something powerful: observability that starts with the human experience.

Traditional monitoring asks: “Is the system healthy?”

This approach asks: “Are users successful?”

When you can detect frustration in real-time, watch exactly what users experienced, and roll back problematic features instantly, you fundamentally change how fast you can ship with confidence.

This workflow fits into the broader ai deployment lifecycle, treating user frustration signals as first-class deployment metrics, just like error rates or latency. By embedding rage click detection into your ai lifecycle management strategy, every release becomes a feedback loop that improves both the product and the process.

Series recap

Image of the three-part rage click detection series recap.

The three-part rage click detection series recap.

The next time your users are frustrated, you’ll know exactly what went wrong, which users were affected, and why. And the best part is you’ll fix it before most users even notice.

Additional Resources

  • Session replay documentation
  • Guarded releases documentation
  • Observability SDK reference
  • Part 1: Detecting user frustration
  • Part 2: Connecting to guarded releases