A cupped hand shields a small lit match against dark, driving rain. It is like protecting the customer while you triage.

Don't Triage at the Customer's Expense4f0391c

By

On this page

The scene is familiar. Production is broken, and a handful of engineers are on a call. Someone is reading logs, someone is querying data, someone else is digging through traces, and every few minutes a voice says, "We think we're close." Everyone is busy and everyone is trying, and nobody on that call is being lazy.

But the customer is still broken.

Teams get used to that part without ever deciding to. The bridge feels like the center of the story because that's where the urgency and the smart people are. For the customer, the story is a product that stopped working, and once a defect is in production, the customer should not become part of your debugging environment.

Motion Is Easy to Mistake for Mitigation

It is easy to confuse motion with mitigation. A team can be adding logs, trying to reproduce the issue, and preparing another release, and all of that can be useful work that does nothing to reduce what the customer is going through. Everything happening on the bridge can be necessary and still leave the customer exactly where they were when the call started.

When the product is broken in production, the first question is "Can we safely stop the bleeding?" Whether anyone is close to understanding it comes second.

Why It Feels Reasonable on the Bridge

None of this is obvious in the moment. The team is under pressure, and they may believe the fix is close. They may worry that rolling back will make things worse, or not trust the deployment pipeline enough to know whether the previous version is safe, or realize halfway through the call that nobody has ever tried to reverse the database migration that shipped with this release, and even a team that invested in feature flags can find out that none of them isolates the broken behavior.

So they say things that sound responsible and engineering-minded. They'd rather fail forward, they can't reproduce it in lower environments, and they don't want to roll back until they know exactly what happened. Sometimes that's all true. It can also cover for the actual issue, which is that nobody built the system to recover cleanly.

When Fail Forward Becomes a Reflex

Fail-forward has its place, and there are cases where a forward fix is safer than a rollback. It turns dangerous when it stops being a judgment call and becomes a reflex, especially when it's used to justify leaving customers broken while engineering searches for certainty.

A lot of that instinct comes from a world where releases were expensive. You shipped rarely, rollbacks were scary, and deployment was a ceremony, so pushing one more fix made sense because every release already hurt. With a modern CI/CD pipeline that thinking is legacy baggage. If releases are cheap, rollbacks should be cheap too, and a team whose rollbacks are still expensive has found the first thing to fix.

If You Can Only Understand Production in Production

"We can't reproduce it outside production" should start a conversation instead of ending one. It usually points to missing test data, thin logging, or configuration that has drifted between environments, and sometimes to a system that only behaves correctly under production load.

Not every production defect can be reproduced somewhere safe. Systems are messy, and some behavior only shows up at scale. But a team that keeps needing production to understand production has an engineering hygiene problem, and the organization has been borrowing confidence from the customer to cover it.

Shipping a Better Microscope

There's a particularly revealing version of this, where instead of mitigating, the team ships a new release that adds instrumentation to help find the problem. Sometimes that's necessary. Be clear about what it means, though. The customer is still absorbing the failure while the team gets a better view of it, which turns production into a microscope with the customer under the glass.

A release that only helps you understand the outage tells you the system was too opaque when it mattered. Instrumentation releases have their uses, but they belong near the bottom of the incident playbook, after every move that would have protected the customer.

The Bill You Never See

Engineering teams optimize for the costs they can measure, like time on the bridge, mean time to recovery, and incident counts. Some of the most expensive damage never shows up in any of them. Support volume climbs, and the account team has to explain what happened. Renewals get harder, and executives start asking whether the platform is stable. Some customers build workarounds, and some stop trusting the product at exactly the moment they needed it to work.

That damage is hard to act on precisely because it's hard to see. Customer confidence is expensive because you usually do not get a clean invoice for losing it.

Mitigation Before Diagnosis

"Always roll back" is too simplistic. The better rule is that when production is harming customers, mitigation comes before diagnosis. Root cause and the permanent fix still matter, and the order matters more than teams admit.

A mature production system gives you moves when something breaks. You can roll back the release, hit the kill switch on a feature or an integration, route traffic away, or fall back to a known-good path, and then debug with the pressure off.

The Customer Is Not Your Debugger

This is what boring software looks like during an incident. Things still go wrong, and when they do, the customer doesn't have to sit there while engineering discovers how the system actually works.

You can hear the difference in how a team talks on the bridge. A weaker team says, "We are still trying to figure out what happened." A stronger one says, "We have stopped the customer impact, and now we are figuring out what happened." It's the same incident, run by two teams who disagree about whose problem it is.

A mature engineering organization shows what it is made of by how quickly it can protect customers once production starts lying, and rollback, kill switches, and test environments that behave like production all exist so that production isn't where the team finally learns the truth. The next time a bridge call spends its second hour almost having the answer, somebody on it should ask what the customer is seeing right now.

Frequently asked questions

Is this article saying you should always roll back?

No. Always rolling back is too simplistic, and sometimes a forward fix is the safest way to reduce customer impact. The point is about order: when production is harming customers, mitigation comes before diagnosis. Stop the bleeding first, then debug with less pressure.

What is wrong with "fail forward"?

Nothing, when it is the safest way to reduce customer impact. It becomes dangerous when it turns into a reflex that justifies continued customer pain while engineering looks for certainty. It is a recovery tactic, and it stops being one when it becomes the reason customers stay broken.

We genuinely can't reproduce the issue outside production. Now what?

It happens, but it should start a different conversation rather than end one. Repeatedly needing production to understand production points to gaps in logging, observability, test data, or environment parity. Not being able to reproduce a problem outside production is a signal that the organization has been borrowing confidence from the customer.

Isn't shipping more instrumentation during an incident a good thing?

Sometimes it is necessary, but it should be a last resort. A release that only helps you understand the outage shows the system was too opaque when it mattered, and the customer is still absorbing the failure while you improve your view of it.

Why focus on customer cost instead of MTTR and incident counts?

Because the most expensive damage is the hardest to measure. Time on the bridge is visible; lost customer confidence, higher support volume, harder renewals, and eroded trust are not. Customer confidence is expensive because you usually do not get a clean invoice for losing it.

How does this connect to boring software?

This is what boring software looks like during an incident. Boring production gives you safe moves when something breaks: rollback, flags, kill switches, known-good paths, and graceful degradation. Things still go wrong; the point is that when they do, the customer does not have to wait inside your debugging loop.

Conversation

    Log in to join the conversation.

    © 2026 ABWaters. Thinking out loud.