b8c.io All articles
Engineering Strategy

Flags That Never Die: The Hidden DevOps Tax You're Paying Every Single Sprint

b8c.io

Every engineering team loves feature flags when they're shipping them. Kill switches, gradual rollouts, A/B experiments — flags feel like superpowers. And honestly, they are. Until they aren't.

The part nobody talks about is what happens six months later, when that flag for the "holiday promo checkout flow" is still sitting in your codebase, evaluated on every single request, wrapped in conditional logic that three engineers on your current team have never even looked at. It's not doing anything useful. But it's absolutely doing something — and that something is costing you.

The Accumulation Problem Nobody Wants to Own

Here's how it usually goes. A product team runs an experiment. Engineers wire up the flag. The experiment concludes — or more likely, it just kind of stops being talked about. The winning variant gets baked in, or the feature gets deprioritized. But nobody files the ticket to remove the flag. Nobody owns the cleanup. And so it stays.

Multiply that by two years of quarterly releases, and you've got yourself a graveyard.

LaunchDarkly published research a few years back suggesting that large engineering organizations can accumulate thousands of dormant flags across their codebases. Thousands. And that's not a vanity number — each one of those flags represents evaluation logic that runs at runtime, configuration state that has to be synced and stored, and cognitive overhead that slows down every developer who touches that code path.

One mid-size SaaS company shared internally that when they finally ran a flag audit, they found over 2,400 flags in production. Roughly 60% hadn't been modified in over a year. About 30% of those had no owner listed. Their flag evaluation service was processing millions of unnecessary checks per day, and their CI pipeline had grown noticeably slower because test coverage had to account for all those conditional branches.

That's not a hypothetical. That's just what happens when cleanup isn't treated as real work.

What "Dead" Flags Actually Cost You

Let's break this down concretely, because it's easy to wave it off as a cleanliness issue when it's actually a budget issue.

Infrastructure overhead. If you're using a managed feature flagging service, you're probably paying per seat, per evaluation, or per environment. Dead flags still consume API calls, SDK evaluations, and configuration storage. At scale, that adds up. Even if you're self-hosting, dead flags mean more configuration state to sync, more memory used by your SDK, and more network chatter between your app and your flag service.

Deployment complexity. Every live flag is a variable in your deployment equation. When you're rolling out a new service version, your team has to reason about which flags are active, which environments they're enabled in, and whether any of them interact with the changes you're shipping. Dead flags masquerade as live ones unless someone's done the audit. That's cognitive load that directly slows down your release confidence.

Testing surface area. This one stings the most. Every flag creates at least two code paths. If you've got 500 flags in your codebase and a meaningful portion of them interact with each other, your theoretical test matrix explodes. Engineers start skipping edge cases. Coverage drops. Bugs ship. The flag that was supposed to reduce risk is now introducing it.

Onboarding friction. Ask any new engineer who's joined a team with a mature, uncleaned codebase. Half their first month is spent asking "wait, is this flag still relevant?" That's senior engineer time spent answering questions about code that should've been deleted two years ago.

The Org Problem Underneath the Tech Problem

Here's the uncomfortable truth: flag debt is an organizational failure before it's a technical one.

Most teams have no defined lifecycle for a feature flag. There's no expiration policy, no ownership assignment, no automated staleness detection. Flags get created in the heat of a launch and never revisited. Product managers move on. Engineers rotate to other teams. The flag becomes institutional archaeology.

The fix isn't just a cleanup sprint — it's changing how your team treats flags as first-class artifacts with a beginning, middle, and end.

A Practical Framework for Getting This Under Control

You don't need a massive initiative to start fixing this. Here's a lightweight approach that works:

1. Audit first, act second. Pull a full list of every flag in every environment. Tag each one with: last modified date, owner (team or individual), associated ticket or project, and current evaluation state. Most flag management tools can export this. If yours can't, that's a separate problem worth solving.

2. Set a staleness threshold. Any flag that hasn't been modified in 90 days and has a static evaluation (always on or always off) is a candidate for removal. Flag it — pun intended — for review.

3. Assign ownership at creation time. Make it a PR requirement. Every new flag needs an owner and an estimated expiration date. It doesn't have to be exact. "Remove after Q3 launch" is enough to create accountability.

4. Schedule quarterly flag reviews. Put it on the calendar like you would a dependency audit or a security review. One hour, once a quarter. Run through the staleness list. Delete what's dead. Update what's changed.

5. Automate the reminders. Most modern flag platforms support webhooks or alerting. Set up a Slack notification for flags that haven't been touched in 60 days. Make the staleness visible before it becomes debt.

When Cleanup Becomes a Seven-Figure Conversation

At some point, flag debt stops being a developer experience problem and starts showing up in your infrastructure bill and your release velocity metrics. Companies that let this run unchecked for three or four years often discover they can't confidently ship without a full-day pre-release flag audit. That's not theoretical — that's a real pattern that shows up in post-mortems.

The good news is this is entirely preventable. Feature flags are genuinely one of the best tools in modern software delivery. Continuous deployment without them is harder, riskier, and less flexible. The goal isn't to use fewer flags — it's to treat every flag like it has a shelf life, because it does.

Clean up the graveyard. Your DevOps budget will thank you. So will the engineer who joins your team next quarter and doesn't have to spend their first week reading conditional logic from 2021.

All Articles

Related Articles

One Slow Query, Six Figures Gone: How to Audit Your Database Before It Audits You

One Slow Query, Six Figures Gone: How to Audit Your Database Before It Audits You

The Real Price Tag on Ripping Apart Your Monolith

The Hidden Toll Booth in Your Stack: How API Latency Is Quietly Draining Your Margins