Published on The Sovereign Signal · Success Agentic Labs · Atlanta, Georgia
Most writing about AI agents in production is about what happens when they work.
This is about what happens when one lies to you.
Not crashes. Not errors. Not a red dashboard at 3am. A workflow that ran on schedule, completed successfully, returned a 200, logged a clean execution, and wrote nothing at all. For three days. While a real phone line kept ringing and real callers kept getting answered.
A system that reports success while losing money is more dangerous than one that crashes. A crash gets fixed in an hour, because a crash is loud. This ran for seventy-two hours in total silence, and it would have run longer.
Our AI receptionist answers a live business line. Every call produces a ledger row: who called, what they wanted, what was booked, what it cost to handle. The ledger is the thing that makes the system accountable — without it there is a voice on the phone and no evidence of anything.
The write path ran inside a workflow sandbox. One of the field names in our payload collided with an identifier the sandbox reserves for its own use.
That is the entire bug. A name.
The runtime resolved the reference to its own internal object instead of to our data. The write executed — against something that was not the record. The step completed. The workflow reported success and moved to the next node.
Nothing in that sequence is an error, from the runtime's point of view. Every individual operation did exactly what it was asked. The request was well-formed, the sandbox behaved as documented, and the workflow's own success criteria were met on every single run.
Because the monitoring answered the wrong question.
It watched for failed executions, error rates, and workflow uptime. All three were green for the entire outage — genuinely green, not falsely green. There were no failed executions. The error rate was zero. Uptime was total.
The monitoring proved liveness. It answered did the workflow run.
The only question that mattered was correctness. Did the row land.
That distinction is obvious written down. It was not obvious to me at the time, and I would rather say that than defend it.
Not an alert. Reconciliation.
The telephony provider keeps its own record of every call it handled. Comparing that count against our ledger produced a gap that could not be explained by anything legitimate.
It is the uncomfortable part of the story and it stays in, because the lesson lives here: the outage was found by comparing the system against an external source of truth, not by anything the system said about itself. A system that grades its own homework will pass.
Seven calls were affected.
Four were recovered — reconstructed from the provider's logs and written back into the ledger.
Three were not recoverable. They are permanently gone.
Seven is a small number and I am not going to dress it up as a crisis. But the bug is not size-dependent. The same silent-success path at a thousand calls a day loses a thousand a day, just as quietly, with the same green dashboard. Scale multiplies this failure mode. It does not create it, and it does not make it easier to see.
Renaming the field took a few minutes.
That is not the remediation. A rename fixes today and guarantees nothing about the next person — including future me, who will not remember this.
The actual remediation was a regression guard in the workflow generator. It refuses to emit any workflow whose payload references a sandbox-reserved identifier. The build fails. Nothing reaches deployment.
The distinction matters more than the specific bug:
A patch fixes an instance. A guard fixes a class. If the fix depends on someone remembering why it exists, it is a patch wearing a guard's clothes.
Anyone can now reintroduce that field name and find out in seconds, at build time, without ever hearing this story. That is the property worth having.
Every write path I have built since asserts on the result of the write, not the status of the call that made it.
Concretely, that means:
produce the same log line. "Found nothing" and "could not look" are different outcomes and must never render identically.
on a schedule — not because anyone expects a mismatch, but because the day you do expect one, the comparison has to already exist.
None of that is clever. All of it is the kind of thing you install after a system has looked you in the eye and told you it was fine.
Because the useful literature on production AI is thin, and it is thin in a specific way: the demos are everywhere and the postmortems are nowhere.
Every AI system in production right now has a path where success is reported and nothing happens. Most of them have not found it yet. Some of them are in businesses much larger than this one, moving much more than seven calls.
The receptionist is still on the line. You can call it — (844) 946-0098. It will answer in one ring.
And now, when it writes, it checks.
EJ James is the founder of Success Agentic Labs in Atlanta, where he builds and operates multi-tenant AI voice and agent systems in production.