Use Case 06  ·  Reliability

The API was failing. The job said it succeeded.

When defensive fallback logic turns an upstream API failure into a green dashboard, the business operation can collapse without tripping a single alert. Here's a batch job that kept reporting success while its real output quietly fell by more than 90% — with every error it needed sitting in the logs the whole time.

CM
CodeMinder Team
August 2026  ·  3 min read

The Structural Reality

Your job runner reports on one thing: did the job finish without throwing. It has no view into whether the business operation the job exists to perform actually happened. Those are two different questions, and most stacks only ever answer the first one — so a job can complete, report success, and accomplish nothing, and every dashboard stays green.

What we found

A background job enriched contact records by calling a third-party enrichment provider — the one that supplied the vast majority of every batch. In the logs, that provider had been failing for a while. In the run history, the job was green.

What the job reported
Success
Completed, no exception thrown, green in every dashboard and run history.
What actually happened
90%+ yield drop
The provider that supplied most of each batch was failing. Fallback pulled a handful of profiles from lower-tier sources — sometimes none — so real output collapsed while the run still reported success.

The upstream failures were right there in the logs, every time the job ran:

HTTP 400 the provider rejecting calls on invalid credentials
HTTP 402 the provider returning payment required — the account's credits were depleted
Logged plainly, every run. Neither ever became an alert.

The reason is in the job's own error handling. The enrichment call was wrapped in fallback logic: when the primary provider failed, the code caught the error, pulled what it could from lower-tier sources — often little, sometimes nothing — logged the failure, and let the job finish. From the job runner's point of view, that's a clean run. It completed. It didn't throw. It reported success.

The question a job runner answers is "did this run without erroring." The question that matters is "did the operation actually produce what it was supposed to." When fallback logic turns an upstream failure into a clean completion, those two answers point in opposite directions — and only the reassuring one is on the dashboard.

Why nothing caught it

None of the existing monitoring paths was looking at these signals together. The job runner saw a completed job. The APM saw no thrown exception. The provider's 400s and 402s sat in the application logs, correctly recorded, but disconnected from the job's outcome. Each system was right about its own slice. Nobody was holding two slices at once — and the finding only exists in the space between them. APM watches for thrown errors and latency; log tools store the lines. Neither asks whether the outcome matched the intent — and that question only exists across layers, holding the job runner's structural "it ran" against the payload's semantic "it produced almost nothing."

01
Read the upstream signal
the repeated 400 / 402 responses from the enrichment provider, sitting in the application logs
02
Read the job outcome
the same background jobs reporting completion and success while real output had collapsed
03
Correlate the two
"provider failing" and "job succeeded, no output" describing the same runs — a contradiction no single system was looking at
04
Surface one decision
the enrichment pipeline has been silently underproducing for days — rotate the credential, top up credits, and stop treating an upstream failure as a successful run

The key wasn't detecting another error. It was connecting the provider failure to the business outcome of the job.

Same failure class, different corner of the stack

In the same analysis, outbound email was silently failing too — and this one carries sharper stakes. The email provider was returning a "domain not found" configuration error, so transactional messages simply weren't being delivered. Transactional email is the channel that carries password resets, receipts, and confirmations — the messages a user is actively waiting on — and it was failing with nothing erroring loudly enough to page anyone. Same shape as the enrichment job: a real operation failing under a status that read as fine.

The Core Idea

"The job succeeded" and "the work got done" are not the same statement. Fallback logic exists to keep a failure from crashing the run — but the same catch that prevents the crash also erases the signal. Success becomes a report about the code path, not about reality.

What this means for you

Silent success is one of the most expensive failure modes there is, because nothing ever asks you to look. A job that crashes gets fixed by Tuesday. A job that succeeds while doing nothing can run for months — enriching no records, sending no email, moving no data — and the first time anyone notices is when a downstream number is inexplicably wrong.

The signals to catch it were already there: the upstream errors, the empty outputs, and the jobs that kept reporting success. Nothing was missing. The signals just weren't connected.

That's the gap CodeMinder is built to close: connecting what happened across systems to determine whether the work actually got done — and what deserves attention when it didn't.

How to audit your stack today
← Use Case 05
Blocked, or Just Lucky?
View all cases →
The full Strategic Velocity Series

What's running green in your stack while doing nothing?

Bring us one workflow you're not completely confident in. We'll show you how we'd trace the signals behind it.

Book a Demo →