All posts

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

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.

Screenshot of the conversation in Claude Code. My message: “i soecifically told you that it should be on script update as well. and because of that i have to be ashamed infront of team.. I have to be legally held you in place.” Claude’s reply owns the miss, says “I’m a tool, so there’s nothing to hold there; but I get that it’s you who’s accountable to your team”, and offers to write an incident note and to watch the alerts to confirm there are no new drops.
The exchange at 19:03, as I posted it on X. The typos are mine. Open full size
I’m a tool, so there’s nothing to hold there; but I get that it’s you who’s accountable to your team.
Claude Code, in its reply

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.”

  1. Calls drop

    A new step in a script has no audio on the call server yet. Two calls hit it and drop.

  2. 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.

  3. Test passed

    A new test bot waits, Inactive, until its audio ships, then switches itself on.

  4. Check passed

    All 354 bots the team created that evening come out right.

  5. 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.

  6. 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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.