DEV Community

Elena Revicheva
Elena Revicheva

Posted on Originally published at aideazz.xyz

The lead pipeline that answered nobody for four days

Originally published on AIdeazz — cross-posted here with canonical link.

A field note from the AIdeazz AI Lab — a real incident on a live production system, written up from the logs. August 19, 2026.

A prepaid balance inside a hosted workflow tool was the single point of failure for every inbound lead.

What it looked like from outside

Inbound enquiries produced a customer record and an acknowledgement email, but no reply draft ever reached the operator. Test submissions produced nothing at all, which is indistinguishable from a completely dead pipeline.

What was actually happening

The component that wrote every reply lived inside a hosted workflow tool and could call only one model vendor. That vendor's prepaid balance reached zero, and the workflow returned "credit balance is too low" on every run for four days. Five other providers were configured and healthy on the application server the whole time, but the call was not made there, so none of them could be reached. Compounding it, the drafting instructions existed in four separate copies; three had drifted out of date, and one still pitched a sales call to job applicants.

The fix

Drafting moved into the application itself, behind a five-provider fallback chain ordered by use case. The reply endpoint now writes the draft when no draft text is supplied, which made the workflow tool optional rather than required, and drafting happens inline the moment a lead arrives instead of waiting on an external schedule. All four copies of the instructions were reduced to one.

How I know it worked

Read from production logs rather than configuration. A provider probe returned HTTP 400 "credit balance too low" for the primary vendor while the chain routed to the next provider and produced a 605-character reply in 2.4 seconds. End-to-end runs were confirmed for both a first-time enquirer and a returning one, each producing a customer record, an acknowledgement to the sender, a copy to the shared mailbox, and an approval card -- under 30 seconds from submission.

The rule this earned

Redundancy only counts if it sits in the path where the call is made. A fallback chain configured elsewhere in the estate protects nothing.

The named concepts behind it

Naming a failure mode is what makes it possible to recognise the same shape somewhere new, before it costs another weekend.

Single point of failure (SPOF)

One component whose death kills the whole chain.

Every system has a critical path -- the sequence of steps that must all succeed for the thing to work. A single point of failure is any step in that path with no alternative.

The trap is that these are usually invisible until they fire, because they hide behind something that has never failed before: a vendor account, a prepaid balance, one API key, one machine, one person who knows how the deploy works.

The lesson that generalises, and the one most teams get wrong: redundancy only counts if it is in the path. Having five interchangeable providers configured somewhere in your estate does nothing if the one place that actually makes the call can only reach one of them. Spare tyres in the garage do not help on the motorway.

Practical test: for each external dependency on your critical path, ask "if this returns an error for the next 72 hours, what does the user see?" If the answer is "nothing at all", that dependency is a single point of failure, and the fallback belongs where the call is made -- not elsewhere.

Silent failure

The system did something reasonable, and told nobody.

The most expensive bug class there is, because the clock keeps running while everyone assumes things are fine.

A silent failure is not a crash. A crash is loud and gets fixed. A silent failure is a component making a defensible local decision -- drop this message, skip this record, return an empty string -- that nobody downstream is told about. From the outside, a system that is working perfectly and a system that is completely dead can produce the identical observation: nothing happened.

The defence is not "add more logging". It is to make the healthy state provable, so that "nothing happened" can be distinguished from "nothing was supposed to happen". Two things do that:

  • Log the outcome, not the attempt. "sending notification" tells you nothing. "notification DELIVERED (id 4661)" versus "notification REJECTED 400" tells you everything.
  • Run a canary. A synthetic transaction pushed through the real path on a schedule, which shouts when it does not come out the far end. Without one, you are relying on a customer to report your outage.

Single source of truth

Copy logic instead of calling it, and you have scheduled a bug for a date nobody will tell you about.

When the same rule, prompt, threshold or piece of logic exists in more than one place, the copies begin identical and end different. Nothing announces the divergence. Someone updates one copy, the others keep running the old behaviour, and the system's actual conduct is now split across versions that no single file describes.

The failure is especially nasty when a copy lives somewhere code review cannot see it: a hosted workflow builder, a dashboard setting, a scheduled job on one machine, a prompt pasted into a vendor interface. Those copies never appear in a diff, so the drift stays invisible until it produces a visibly wrong result in front of a customer.

Two defences that work:

  • One definition, imported everywhere. Every consumer reads the same file. Where a copy must physically live elsewhere, generate and push it from that file rather than editing it by hand.
  • Detect drift automatically. Re-read the remote copies on a schedule and raise an alert when one no longer matches the source. A copy you cannot diff is a copy you must monitor.

This note is one entry in a running wiki of production engineering lessons — every concept linked to the incident that taught it — at aideazz.xyz/ai-ops-wiki.html.

No customer data, credentials, hostnames or internal record identifiers appear in these write-ups.

Top comments (0)