Skip to main content
All Guides
Delivery

Lots of Commits, No Features: The Productivity Illusion

Your engineers are committing code, but features aren't launching. Use the HALT Framework to diagnose churn, abandon rate, review bottlenecks, and WIP explosion - with targeted fixes for each.

18 min readUpdated January 3, 2026By CodePulse Team

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 countFeatures deployed to production
Lots of PRs openedPRs merged and released
Tickets moving between columnsTickets closed and validated
Busy calendars full of meetingsDecisions made and documented
Rewriting code multiple timesCode stable and serving users
Long hours workedUser 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:

PatternSymptomRoot Cause
High ChurnLots of code written, then rewrittenRequirements unclear or changing mid-sprint
Abandon RatePRs opened but never mergedScope creep, blocked dependencies, or perfectionism
Long Review QueuesPRs waiting days for reviewReview bottleneck or poor review distribution
Too Much WIPEveryone has multiple PRs openContext 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:

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 CausePattern You Will SeeFix
Unclear requirementsChurn spikes after sprint planningBetter spec process, design docs before coding
Changing requirementsChurn spikes mid-sprint after stakeholder meetingsFreeze scope once sprint starts, defer changes
Architecture fighting youChurn concentrated in specific areasRefactor the high-churn zones, pay down tech debt
Review feedback too lateLarge rewrites after PR reviewEarlier design reviews, pair programming
Learning on the jobChurn high for new team membersOnboarding, pairing, smaller initial tasks

Action Plan for High Churn

  1. Identify the churn zones: Which files, features, or developers have the highest churn? Focus investigation there.
  2. Trace churn to cause: Interview developers. "What caused you to rewrite this?" The answer tells you where to fix.
  3. Institute design reviews: For anything taking more than a day, review the approach before coding starts.
  4. Freeze sprint scope: Once planning is done, changes go to next sprint unless truly critical.
  5. 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.

Identify bottlenecks slowing your team with CodePulse

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

SCOPE CREEP (30% of cases)

"Started as a "small fix," grew into major refactor. Original estimate was 2 hours, now on day 3. Developer gives up and starts fresh."

BLOCKED DEPENDENCIES (25% of cases)

"Waiting on another team or PR. Blocked by failing tests in shared code. Need decision that never comes."

CONTEXT SWITCH (25% of cases)

"Urgent work pulled developer away. By the time they return, PR is stale. Merge conflicts make resurrection painful."

PERFECTIONISM (15% of cases)

"Developer keeps polishing instead of shipping. "One more improvement" cycle. Review feedback leads to rewrites."

WRONG APPROACH (5% of cases)

"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

  1. Set a PR age limit: Any PR open longer than 7 days gets reviewed in standup. "What is blocking this? Can we help?"
  2. Kill zombies ruthlessly: PRs open longer than 14 days get closed. If the work matters, it can be re-started fresh.
  3. Address scope creep at the source: Require breaking large work into multiple PRs. Maximum PR size of 400 lines.
  4. Track abandon reasons: When closing abandoned PRs, note why. Patterns will emerge that point to systemic issues.
  5. 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:

Root Causes of Review Bottlenecks

Root CauseHow to IdentifyFix
Single expert reviewerOne person reviews 50%+ of PRs in an areaTrain additional reviewers, rotate responsibility
PRs too largeAverage PR size above 500 linesEnforce smaller PRs, break up large changes
No review SLAReview times vary wildly (1 hour to 5 days)Set explicit SLA (e.g., first review within 4 hours)
Reviews not prioritizedReviews done in batches instead of continuouslyMake review time sacred, block calendar time for it
Too many required reviewersPRs require 3+ approvalsReduce to 2 reviewers for most PRs

Action Plan for Review Bottlenecks

  1. Set and enforce a review SLA: First review within 4 business hours, all reviews complete within 24 hours.
  2. Distribute review load: No one should do more than 2x the team average. Actively assign reviews to underloaded reviewers.
  3. Make reviews smaller: Enforce maximum PR size. Smaller PRs get reviewed faster and reviewed better.
  4. Create dedicated review time: Block 1-2 hours daily specifically for review. Treat it as non-negotiable.
  5. 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)

Daily Lost Time = Switches x 25 min

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:
5 active tasks
switches: 4/day, time: 25 min
= 100 min lost/day
2 active tasks
switches: 1/day, time: 25 min
= 25 min lost/day
Interpretation:
4 switches/day1.5 hours lost daily, 30+ hours/month (nearly a full week)
1 switch/day25 minutes lost daily, saves 25+ hours/month vs high WIP

Action Plan for WIP Explosion

  1. Set explicit WIP limits: Maximum 2 active items per person. New work cannot start until current work is merged.
  2. Stop starting, start finishing: Team priority is always to finish in-progress work before picking up new work.
  3. Make WIP visible: Put open PR count per person on a dashboard. Social pressure helps maintain limits.
  4. Protect focus time: Block 4-hour windows where no meetings or interruptions are allowed.
  5. 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.

Identify bottlenecks slowing your team with CodePulse

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 PatternMetric to CheckWhere in CodePulseWarning Threshold
High ChurnCode churn rateDeveloper AnalyticsAbove 25%
High ChurnFile hotspotsFile HotspotsSame file in 5+ PRs/sprint
Abandon RatePR merge rateRepository MetricsBelow 85%
Abandon RateStale PRsDashboardPRs older than 7 days
Review BottleneckWait-for-review timeDashboard cycle timeExceeds coding time
Review BottleneckReview load ratioDeveloper AnalyticsAnyone above 3:1
WIP ExplosionOpen PRs per developerDeveloper AnalyticsMore than 2 per person
WIP ExplosionPR throughput ratioRepository MetricsOpened/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

  1. Review your Dashboard cycle time breakdown. Where is time being spent?
  2. Check Developer Analytics for churn rates and open PR counts.
  3. Examine Review Network for review distribution.
  4. 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

  1. Institute design reviews for any work taking more than a day. Catch churn-causing misalignment early.
  2. Set up progress alerts in CodePulse to catch regression.
  3. Review in retrospectives: "Did we ship, or just move things around?"
  4. 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

Efficiency Rate = Value Delivered / Activity Generated

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:
> 70%Healthy flow, activity translating to progress
50-70%Some friction, investigate dominant cause
< 50%Significant waste, urgent intervention needed
< 30%Crisis mode, stop and fix before continuing

"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.