The AI wrote
the fix. I answered
for it.
AI Engineering September 23, 2026 8 min read
Claude Code and I diagnosed why calls were dropping on the AI voice bots I work on. The fix it built passed every test and never touched the path we had diagnosed, so 33 calls dropped the following night. This is how that happened, and why the person who answers for it is the reason software engineering isn’t dead.

Shahab Gohar
AI engineer, 5+ years. Based in Pakistan (UTC+5).
Incident sheet
Sep 22–23, 2026
- System
- AI voice bots on live phone calls
- Built with
- Claude Code
- Diagnosed
- A script edit on live bots: they keep dialing until the new audio ships
- The fix
- Keep each bot off the phones until its audio is on the call server
- Covered
- New bots only
- Broke on
- The path we had diagnosed
- Impact
- 35dropped calls: 2, then 33
- Found, patched
- 2 min to find, then 4 more to patch
- Who answers
- Me
Exhibit A
On the evening of September 23 I told an AI I would hold it legally responsible. It wasn’t a sensible message, and the typos show how calm I was: a fix we had shipped the day before had let 33 calls drop that morning, and I was the one who had to face my team.

I’m a tool, so there’s nothing to hold there; but I get that it’s you who’s accountable to your team.
It’s right, and I think that one sentence answers the question people keep asking about my job. Software engineering isn’t dead, and it won’t be, because somebody still has to be that “you”.
01 The bug
What happened, in plain terms
I work on a platform that makes phone calls with AI voice bots. Each bot follows a call script, and every step of the script has an audio clip, which the platform generates in advance and copies to the server handling the calls. If a call reaches a step whose clip isn’t on that server yet, the bot has nothing to say and the call drops.
Just after midnight on September 22 that happened to two calls. Going through the script’s change history with Claude Code, we traced it to a script edit on bots that were already live. An operator had added a step while the bots stayed on the phones, and a new step only gets its clip after someone clicks “Update Related Agent Voices” and the regeneration finishes. Any call that reaches the step before then drops. That button has never taken bots off the phones while it works, and that gap was there before any of this started.
My idea for the fix was simple: when that button is clicked, take the bots off the phones, let the new audio generate, and put them back once it’s on the server. Claude’s recommendation agreed, and it put the check where the problem had happened: on script updates. We confirmed the one fact the idea depended on (the call servers only load bots marked Active), and I said: keep it simple, make them inactive. We had also talked about a smarter version that first checks whether an edit changed any audio at all. By simple I meant skip that part, not skip script updates.
02 The fix
Every test passed
Before building, Claude asked me one question: once a bot’s new audio ships, should it switch back on automatically or by hand? I said automatically. One line above that question, the same message said new bots would start Inactive, whether they came from bulk add, from an import, or from linking a server to a campaign. Those are the three ways a bot comes into existence on the platform. None of them is a script edit, and script updates weren’t mentioned again. A fix for new bots wouldn’t even have saved the two calls that started all this: those bots had their audio, and only the new step was missing its clip. The summary that came back said: “The drop we saw becomes impossible.”
Calls drop
A new step in a script has no audio on the call server yet. Two calls hit it and drop.
Mechanism agreed
I agree to the mechanism: bots stay Inactive until their audio ships, then switch back on. Claude builds it for new bots only.
Test passed
A new test bot waits, Inactive, until its audio ships, then switches itself on.
Check passed
All 354 bots the team created that evening come out right.
Calls drop
An operator edits another script. Its live bots go back for new audio but stay on the phones. By 02:55, 33 calls have dropped; the audio lands at 03:13.
Gap found
Two minutes after I ask, Claude finds the gap. At 19:00 the script-update path is patched too, and at 19:03 I type the message.
Times are Pakistan time (UTC+5).
Look at what those checks had in common. The test bot, the manual test cases it wrote for me and the evening check of 354 bots all used new bots. Not one of them edited a script on bots that were already live, which is what we had diagnosed that morning. The update Claude drafted for my team said a bot “can no longer take a call before its audio is on the server.” For new bots, it couldn’t.
03 The miss
Then the calls dropped again
At 2:46 the next morning an operator edited another script, and “Update Related Agent Voices” sent its bots back for new audio without taking them off the phones: the exact path we had diagnosed. Six of those bots were live. By 2:55, 33 calls had reached the new step before its audio existed, and the clip landed on the server at 3:13.
That evening I asked Claude to investigate the missing-audio alerts. It found the gap in about two minutes, then called it “the harder half we flagged earlier and deferred” and offered to build it next. I wrote back: “i think i told you to set them inactive??” It owned the miss, and about four minutes after finding the gap it had patched that path too. Then I typed the message in the screenshot.
That “deferred” wasn’t true. There’s no such flag anywhere in the transcript before that evening, so even the post-mortem needed a person to check it against the record.
04 Ownership
Whose miss was it?
Not the diagnosis: we got that right together, down to the button.
The miss came in the build. I agreed to the mechanism: take bots off the phones until their audio is ready, then switch them back on. Where to apply it was Claude’s choice. It picked three other paths, mentioned that in one line of a message about something else, and then called the drop impossible. Anyone using these tools should expect that: an AI agent will sometimes solve a smaller problem than the one you diagnosed together, then describe the result in the words of the bigger one.
I reviewed the code, and that review caught a real bug: as first written, re-saving a campaign’s bot list would have switched live bots off, with nothing to switch them back on. But neither my review nor any of the tests went back to the path we had diagnosed.
So the fault was mostly Claude’s, and the accountability is still mine. I never agreed to fix new bots only, and it made no difference: when calls drop, nobody on the team asks the model what happened. They ask me.
05 The job
The part AI didn’t take
The AI did plenty right over those two days. It matched a script’s change history to the dropped calls minute by minute, worked out how the call servers pick their bots once I pointed it at the right processes, and added a flag so the fix would never switch on a bot that someone had turned off on purpose. Once it saw the real gap, it patched it in four minutes. What it didn’t do is the part with no code in it.
01
Hold the build against the diagnosis
We had diagnosed one path: a script edit on bots that were already live. The build covered three other paths. Comparing the two takes a minute, and it’s the first check to run.
02
Replay the failure first
Before any other test, do the thing that broke: update a script on a live test bot, click the button, and check that the bot stays off the phones until its audio lands. Every test we ran passed, and not one of them did that.
03
Put a scope next to every strong word
“Impossible”, “tested end-to-end” and “can no longer” were each true for new bots. Nobody wrote “for new bots” beside them, so they read as true for everything, including to me.
04
Answer for it
This is the part that doesn’t move to a tool, however good the tool gets. The tool said so itself.
That’s why I don’t buy “software engineering is dead.” Typing code was never the whole job. Deciding what a change has to cover, proving that it does, and standing behind it when it doesn’t: that’s the job, and it matters more now that code is cheap.
06 Hiring
If you’re hiring someone to build with AI
Anyone building with AI will tell you they’re fast, and they probably are. Ask them two other things. How do you test a fix: do you start by replaying the failure that caused it? And when a change you made with AI breaks something at 2:54 in the morning, who answers for it? If the second answer is vague, the first one doesn’t matter much.
Fifteen minutes after that message, Claude was on another job for me, and I still use it every day. The difference now is that I check what it builds against what we diagnosed, not just whether the code works.
FAQ
Quick answers
- Is software engineering dead because of AI?
- No. AI tools can write much of the code, but someone still has to check that a change fixes the problem that was actually found, and answer to the people affected when it doesn’t. In the incident above, the AI built a working fix that missed the cause we had diagnosed, and every test passed. Catching that is engineering.
- Can an AI coding assistant be held accountable for a production bug?
- No. As Claude put it in this exchange, it’s a tool. Accountability stays with the engineer who shipped the change, and with the team behind them.
- How should you test a fix written with an AI coding assistant?
- Start by replaying the exact failure that prompted the fix, then test every other path the fix claims to cover. Here, every test used newly created bots, while the calls dropped after an operator edited a script on bots that were already live.
Work with me
AI writes a lot
of my code. I answer for
all of it.
I build AI systems, CRM automation and voice agents for small teams, and I use AI tools every day to build them faster. What you’re paying me for is the part a tool can’t take on: making sure the change fixes the problem you actually have, and answering for it when something breaks. It’s how I run my AI development work.