All posts

The AI wrote
the fix.
I answered
for it.

AI Engineering September 23, 2026 7 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
Script updated, voices regenerated, bots still live
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
33dropped calls
Found, patched
2 / 4min, once I asked
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 I had approved 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 one path: an operator edits a script and adds a step, then clicks “Update Related Agent Voices” to regenerate the audio for every bot on that script. The bots keep taking calls while that runs, so any call that reaches the new step before its clip lands on the server drops.

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.

02 The fix

Every check passed

The plan Claude put in front of me 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, and none of them was the path we had diagnosed. Script updates weren’t on the list, and nothing in the plan said it was leaving them for later. I approved it, and 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. Plan approved

    The fix: new bots stay Inactive until their audio ships. Script updates aren’t in the plan.

  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 updates a script and regenerates its voices. Six live bots keep dialing, and 33 calls drop before the new audio lands.

  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 updated a script and regenerated the voices of 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

Early the next morning an operator updated a script and clicked “Update Related Agent Voices”: the exact path we had diagnosed. Six of the bots on that script were live, and they stayed live while the system generated the new clip. From around 2:54, 33 calls reached the new step before its audio did; the clip landed about 19 minutes later.

That evening I asked Claude to investigate the missing-audio alerts. It found the gap in about two minutes and said it plainly: the gate made new bots wait for their audio, but did nothing when that button sent live bots back for new audio. Four minutes later it had patched that path too. Then I typed the message in the screenshot.

Its apology owned the miss, with one claim that wasn’t true. It said it had flagged script edits as “deferred” when it built the gate. There’s no such flag anywhere in the transcript, 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 step after it. The fix covered three other paths, skipped the one we had diagnosed, 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.

But the plan listed its scope, and I approved it. I reviewed the code too, 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. I read the code carefully and never held the plan up against the diagnosis. That check was mine to make.

When calls drop, nobody on the team asks the model what happened. They ask me.

05 The job

The part AI didn’t take

Give the AI its due. 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 by reading the processes running on them, 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 plan against the diagnosis

    We had diagnosed one path: a script update followed by “Update Related Agent Voices”. The plan covered three other paths. Comparing the two takes a minute, and neither of us did it.

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

For the record, I gave Claude its next task about fifteen minutes after that message, and I still use it every day. The difference now is that I read its plans against the problem, not just its code against the plan.

FAQ

Quick answers

Is software engineering dead because of AI?
No. AI tools can write much of the code, but someone still has to decide what a change must cover, prove that it covers it, 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 approved and 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 plan claims to cover. Here, every test used newly created bots, while the calls dropped when an operator updated a script and regenerated the voices of 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 that doesn’t move to a tool: 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.