Your team is exhausted. Commits are flying. Slack is buzzing. JIRA tickets are moving from column to column. But the "Done" column is empty, the roadmap is slipping, and your stakeholders are getting impatient. You have a team that looks busy but is not actually shipping. This is the High Activity, Low Progress syndrome, and it is more common than most engineering leaders want to admit.
This guide will help you diagnose why your team is busy but not shipping, introduce a diagnostic framework for identifying the root cause, and give you specific action plans for each pattern we uncover. Because until you know why velocity is not translating to value, you cannot fix it.
🔥 Our Take
High velocity is often a warning sign, not a success metric. Teams going "fast" are often just generating work, not shipping value.
If your team's commit count doubled but customer satisfaction did not budge, you optimized the wrong thing. Velocity measures motion, not progress. Many teams ship fast but do not ship right. Before celebrating high numbers, ask what actually reached production and made a difference.
The Trap: Motion vs. Progress
In physics, Work = Force x Distance. If you push a wall for eight hours, you did zero work despite being sweaty and exhausted. Engineering is the same. Activity is not accomplishment.
"A team that merges 50 small PRs a week might ship less value than a team that merges 10 thoughtful ones. Count what reaches users, not what reaches the merge button."
| Motion (Looks Like Work) | Progress (Is Work) |
|---|---|
| High commit count | Features deployed to production |
| Lots of PRs opened | PRs merged and released |
| Tickets moving between columns | Tickets closed and validated |
| Busy calendars full of meetings | Decisions made and documented |
| Rewriting code multiple times | Code stable and serving users |
| Long hours worked | User problems solved |
When teams are under pressure, they default to motion because it feels productive. "Look how busy I am!" But motion without direction makes the problem worse. It burns people out while delaying actual delivery.
The HALT Diagnostic Framework
When you see high activity but low progress, the root cause falls into one of four patterns. We call this the HALT Framework because these patterns stop your team from shipping:
| Pattern | Symptom | Root Cause |
|---|---|---|
| High Churn | Lots of code written, then rewritten | Requirements unclear or changing mid-sprint |
| Abandon Rate | PRs opened but never merged | Scope creep, blocked dependencies, or perfectionism |
| Long Review Queues | PRs waiting days for review | Review bottleneck or poor review distribution |
| Too Much WIP | Everyone has multiple PRs open | Context switching killing focus and throughput |
Most struggling teams have a combination of these patterns, but one is usually dominant. Diagnosing correctly matters because the fix for each is different. Throwing more developers at a review bottleneck makes it worse. Limiting WIP will not help if the real problem is changing requirements.
HALT Diagnostic Questions
H - High Churn
- What % of code written gets deleted within 2 weeks?
- Are developers rewriting the same files repeatedly?
- How often do requirements change mid-sprint?
A - Abandon Rate
- What % of PRs opened never get merged?
- How old is your oldest open PR?
- Are developers abandoning work to context switch?
L - Long Review Queues
- What is average time from PR open to first review?
- Who is doing most of the reviews?
- Are certain PRs waiting much longer than others?
T - Too Much WIP
- How many open PRs per developer right now?
- How often do developers switch between tasks?
- What is the ratio of PRs opened to PRs merged?
📊Diagnosing HALT Patterns in CodePulse
CodePulse surfaces the metrics you need for each pattern:
- High Churn: Check Developer Analytics for code churn rate and productive throughput
- Abandon Rate: View Repository Metrics for PR merge rate and stale PR count
- Long Review Queues: See Dashboard for wait-for-review time in cycle time breakdown
- Too Much WIP: Check Developer Analytics for active PRs per developer
Pattern 1: High Churn - The Rewrite Treadmill
"I wrote 1,000 lines of code on Monday and deleted 800 of them by Thursday. That is not productivity. That is expensive learning."
Code churn is the percentage of code that gets rewritten shortly after being written. Some churn is healthy, it means developers are iterating and improving. But excessive churn means something upstream is broken: unclear requirements, changing scope, or architectural issues that force rewrites.
How to Detect High Churn
- Churn rate above 25%: More than a quarter of code being rewritten within two weeks indicates instability
- Same files modified repeatedly: If the same file appears in 5+ PRs in a sprint, requirements are not stable
- High additions + high deletions: A developer with both metrics elevated is churning, not building
- Productive throughput diverging from raw output: Lots of code written but little sticking around
Root Causes of High Churn
| Root Cause | Pattern You Will See | Fix |
|---|---|---|
| Unclear requirements | Churn spikes after sprint planning | Better spec process, design docs before coding |
| Changing requirements | Churn spikes mid-sprint after stakeholder meetings | Freeze scope once sprint starts, defer changes |
| Architecture fighting you | Churn concentrated in specific areas | Refactor the high-churn zones, pay down tech debt |
| Review feedback too late | Large rewrites after PR review | Earlier design reviews, pair programming |
| Learning on the job | Churn high for new team members | Onboarding, pairing, smaller initial tasks |
Action Plan for High Churn
- Identify the churn zones: Which files, features, or developers have the highest churn? Focus investigation there.
- Trace churn to cause: Interview developers. "What caused you to rewrite this?" The answer tells you where to fix.
- Institute design reviews: For anything taking more than a day, review the approach before coding starts.
- Freeze sprint scope: Once planning is done, changes go to next sprint unless truly critical.
- Measure and track: Set a churn target (under 20%) and monitor weekly trends.
For a deeper dive into measuring and reducing churn, see our Code Churn Guide.
Pattern 2: High Abandon Rate - PRs That Never Ship
Every abandoned PR represents wasted effort: hours or days of work that never reached users. Some abandonment is normal (experiments that did not pan out, approaches that proved wrong), but if your abandon rate is above 15%, you have a systemic problem.
Why PRs Get Abandoned
Common Reasons PRs Are Abandoned
"Started as a "small fix," grew into major refactor. Original estimate was 2 hours, now on day 3. Developer gives up and starts fresh."
"Waiting on another team or PR. Blocked by failing tests in shared code. Need decision that never comes."
"Urgent work pulled developer away. By the time they return, PR is stale. Merge conflicts make resurrection painful."
"Developer keeps polishing instead of shipping. "One more improvement" cycle. Review feedback leads to rewrites."
"Discovery during coding that approach is wrong. This is healthy abandonment."
"A PR that sits open for two weeks is not 'almost done.' It is dead. The context is lost, merge conflicts are growing, and the developer has mentally moved on. Close it or merge it. Zombie PRs drain cognitive capacity."
Action Plan for High Abandon Rate
- Set a PR age limit: Any PR open longer than 7 days gets reviewed in standup. "What is blocking this? Can we help?"
- Kill zombies ruthlessly: PRs open longer than 14 days get closed. If the work matters, it can be re-started fresh.
- Address scope creep at the source: Require breaking large work into multiple PRs. Maximum PR size of 400 lines.
- Track abandon reasons: When closing abandoned PRs, note why. Patterns will emerge that point to systemic issues.
- Unblock faster: Create explicit SLAs for decisions and dependencies. If blocked for 48 hours, escalate.
Pattern 3: Review Bottleneck - The Waiting Game
According to the 2024 State of DevOps Report, wait time is often the largest component of cycle time. Your developers spend more time waiting for reviews than writing code. And every hour a PR sits waiting is an hour of context that fades from the author's mind.
Signs of a Review Bottleneck
- Wait-for-review time exceeds coding time: Developers finish work in hours but wait days for reviews
- Uneven reviewer distribution: One or two people doing 50%+ of all reviews
- Review queue growing: More PRs opened than merged each week
- Authors doing other work while waiting: Starting new tasks instead of shepherding current ones
🔄Spotting Review Bottlenecks in CodePulse
Use these CodePulse features to diagnose review problems:
- Dashboard shows wait-for-review as a segment of cycle time
- Review Network visualizes who reviews whose code and reveals imbalances
- Developer Analytics shows review load ratio per person
- Set up Alert Rules to notify when PRs wait longer than your SLA
Root Causes of Review Bottlenecks
| Root Cause | How to Identify | Fix |
|---|---|---|
| Single expert reviewer | One person reviews 50%+ of PRs in an area | Train additional reviewers, rotate responsibility |
| PRs too large | Average PR size above 500 lines | Enforce smaller PRs, break up large changes |
| No review SLA | Review times vary wildly (1 hour to 5 days) | Set explicit SLA (e.g., first review within 4 hours) |
| Reviews not prioritized | Reviews done in batches instead of continuously | Make review time sacred, block calendar time for it |
| Too many required reviewers | PRs require 3+ approvals | Reduce to 2 reviewers for most PRs |
Action Plan for Review Bottlenecks
- Set and enforce a review SLA: First review within 4 business hours, all reviews complete within 24 hours.
- Distribute review load: No one should do more than 2x the team average. Actively assign reviews to underloaded reviewers.
- Make reviews smaller: Enforce maximum PR size. Smaller PRs get reviewed faster and reviewed better.
- Create dedicated review time: Block 1-2 hours daily specifically for review. Treat it as non-negotiable.
- Reduce required reviewers: Two reviewers catch 90%+ of issues. Three adds latency without proportional benefit.
For more on optimizing code review, see our Review Load Balancing Guide and PR Size Optimization Guide.
Pattern 4: WIP Explosion - Too Many Plates Spinning
"A developer with four PRs in flight is not four times as productive. They are context switching so much that all four PRs move slower than one would."
Work in Progress (WIP) is the silent killer of team productivity. Every open item represents context that must be maintained. Every context switch costs 20+ minutes of focus recovery. A developer switching between tasks five times a day loses over an hour and a half to transitions alone.
Signs of WIP Explosion
- High open PR count per developer: More than 2 active PRs per person suggests too much parallelism
- PRs opened faster than merged: Growing PR backlog week over week
- Everything in progress, nothing done: Lots of movement across sprint board, few items reaching "Done"
- Long PR ages: Average PR taking 5+ days suggests work getting abandoned mid-stream
- Developers feeling scattered: Complaints about interruptions, difficulty focusing
The Mathematics of Context Switching
Context Switching Cost (Research-Backed)
Each context switch costs 20-30 minutes of recovery time (Source: American Psychological Association, 2001). WIP limits are not about going slower - they are about eliminating waste so you go faster.
Examples:
Interpretation:
Action Plan for WIP Explosion
- Set explicit WIP limits: Maximum 2 active items per person. New work cannot start until current work is merged.
- Stop starting, start finishing: Team priority is always to finish in-progress work before picking up new work.
- Make WIP visible: Put open PR count per person on a dashboard. Social pressure helps maintain limits.
- Protect focus time: Block 4-hour windows where no meetings or interruptions are allowed.
- Finish what you start: If blocked on PR #1, the answer is to unblock it, not to start PR #2.
For more on managing focus and context switching, see our Context Switching Patterns Guide.
The Hidden Drain: Shadow Work
Sometimes the team is shipping, but not on the roadmap. They are doing "shadow work" that is invisible to stakeholders but very real to Git:
- Fixing a flaky CI pipeline (again)
- Helping Customer Support manually run SQL queries
- Attending "alignment meetings" that produce no decisions
- Debugging that one microservice that keeps timing out
- Onboarding new team members without allocated time
- Writing documentation because support keeps asking the same questions
Shadow work is not bad work. It is often essential. But if it is not visible, it creates a gap between what stakeholders expect and what gets delivered.
Making Shadow Work Visible
Shadow Work Categories and Visibility Strategies
TOIL (Operational Busywork)
- Git signals: Commits to CI configs, scripts, monitoring
- Make visible: Track "platform" vs "feature" work ratio
SUPPORT ESCALATIONS
- Git signals: Hot-fix branches, ad-hoc query scripts
- Make visible: Tag support tickets, track interrupt-driven PRs
MEETINGS & COORDINATION
- Git signals: Low commit activity despite busy calendars
- Make visible: Audit meeting load, protect maker time
ONBOARDING & MENTORING
- Git signals: Senior devs with lower output during onboarding
- Make visible: Explicitly budget onboarding time in capacity
TECHNICAL DEBT INTEREST
- Git signals: Commits to files with high historical churn
- Make visible: Track time spent in "legacy" areas
For more on tracking the balance between feature work and maintenance, see our Feature vs. Maintenance Balance Guide and KTLO vs Innovation Guide.
CodePulse Metrics to Check
When diagnosing high activity, low progress, these are the specific metrics to examine in CodePulse:
| HALT Pattern | Metric to Check | Where in CodePulse | Warning Threshold |
|---|---|---|---|
| High Churn | Code churn rate | Developer Analytics | Above 25% |
| High Churn | File hotspots | File Hotspots | Same file in 5+ PRs/sprint |
| Abandon Rate | PR merge rate | Repository Metrics | Below 85% |
| Abandon Rate | Stale PRs | Dashboard | PRs older than 7 days |
| Review Bottleneck | Wait-for-review time | Dashboard cycle time | Exceeds coding time |
| Review Bottleneck | Review load ratio | Developer Analytics | Anyone above 3:1 |
| WIP Explosion | Open PRs per developer | Developer Analytics | More than 2 per person |
| WIP Explosion | PR throughput ratio | Repository Metrics | Opened/Merged ratio above 1.5 |
🔔Setting Up Progress Alerts
Create alerts in CodePulse to catch problems early:
- Navigate to Alert Rules
- Create alert: Wait-for-review time exceeds 8 hours
- Create alert: Any PR open longer than 7 days
- Create alert: Code churn rate exceeds 25%
- Create alert: Any developer with more than 3 active PRs
Action Plan: This Week
Do not try to fix everything at once. Start with diagnosis, then address the dominant pattern.
Day 1: Diagnose
- Review your Dashboard cycle time breakdown. Where is time being spent?
- Check Developer Analytics for churn rates and open PR counts.
- Examine Review Network for review distribution.
- Identify which HALT pattern is dominant.
Day 2-3: Quick Wins
- If High Churn: Freeze scope for rest of sprint. No new requirements.
- If High Abandon: Close all PRs older than 14 days. Clean slate.
- If Review Bottleneck: Set 4-hour SLA starting today. Enforce it.
- If WIP Explosion: Implement 2-item WIP limit immediately.
Week 2+: Systemic Fixes
- Institute design reviews for any work taking more than a day. Catch churn-causing misalignment early.
- Set up progress alerts in CodePulse to catch regression.
- Review in retrospectives: "Did we ship, or just move things around?"
- Track the output metric: Features deployed and validated, not activity counts.
Measuring Success: The Efficiency Rate
To know if you are improving, track your efficiency rate:
Efficiency Rate
Proxy metrics: PRs merged / PRs opened, Code shipped / Code written (1 - churn rate), Features released / Tickets touched. Warning: If your team is at 30% efficiency, hiring more developers will drop it to 20% (Brooks' Law). You are not capacity constrained - you are flow constrained. Fix the friction first.
Interpretation:
"The goal is not to do more. The goal is to ship more. When those diverge, you have found your problem."
Conclusion: Ship, Do Not Just Work
High activity with low progress is frustrating for everyone: engineers feel busy but unfulfilled, managers feel confused, and stakeholders feel misled. The path forward is not working harder but working differently.
Use the HALT Framework to diagnose whether your problem is Churn, Abandonment, Review bottlenecks, or WIP explosion. Then apply the targeted fix for that pattern. Measure your efficiency rate to track improvement. And remember: velocity is not the goal. Shipping value is.
For related guidance, see our Engineering Velocity Metrics Guide, Cycle Time Breakdown Guide, and Stop Estimating, Start Forecasting.
See these insights for your team
CodePulse connects to your GitHub and shows you actionable engineering metrics in minutes. No complex setup required.
Free tier available. No credit card required.
Related Guides
High Code Churn Isn't Bad. Unless You See This Pattern
Learn what code churn rate reveals about your codebase health, how to distinguish healthy refactoring from problematic rework, and when to take action.
Context Switching Costs You $47K Per Developer Per Year
Learn to detect context switching costs from PR data, distinguish productive breadth from harmful fragmentation, and help developers maintain focus.
Story Points Are a Scam. Here's What Actually Works
Story points are often waste. Learn how to use historical throughput and cycle time to forecast delivery dates with higher accuracy and less meeting time.
Your Best Engineer Is About to Quit. (Check Their Review Load)
Learn how to identify overloaded reviewers, distribute review work equitably, and maintain review quality without burning out your senior engineers.
The 4-Minute Diagnosis That Reveals Why Your PRs Are Stuck
Learn to diagnose exactly where your PRs are getting stuck by understanding the 4 components of cycle time and how to improve each one.