Back to blog

The Bug That Showed Me What Agents Actually Cost My Junior Hire

Sep 3, 2026
The Bug That Showed Me What Agents Actually Cost My Junior Hire

Ticket PHX-2114: "Webhook deliveries silently drop under retry storms." I handed it to Minh on a Tuesday morning — four months into his first job out of school. Wednesday afternoon, PR #742 was up: exponential backoff, jitter, a dead-letter queue for anything that failed five times. 180 lines, clean diff, tests green. He'd done it exactly the way we'd trained the whole team to — describe the failure mode to the agent, let it draft the retry logic, review the plan before it touched a single line of code. Thursday standup, I held this up as the payoff we'd been promising junior hires when we rolled out agent tooling. Two days, production-ready, and Minh didn't look like he'd been carried. He looked like someone who'd shipped.

What actually happened: the agent produced correct code and zero understanding, and for six weeks nobody — me included — noticed the gap.

The edge case surfaced on a Sunday. A partner's webhook endpoint started timing out instead of failing outright, so retries piled up instead of draining, and the dead-letter queue Minh had built filled with messages that weren't dead at all — just stuck in flight. I paged him. On the call I asked him to walk me through why the queue was filling. He read me the code. I asked why the backoff wasn't kicking in before it filled. He read me the code again, slower this time. "It says here it should back off after the third attempt." So what happens on attempt three if the endpoint hasn't failed yet, just hung? Long pause. "I... don't know. I didn't write the timeout logic, the agent did, and it looked right." That last part is the sentence I still think about — not "I made a mistake," but "it looked right," from someone with no independent way to judge whether it was.

What I actually did next

We didn't fix it together on that call. I fixed it, because it was Sunday and production was bleeding. What I did with Minh came Monday morning — whiteboard, no agent open anywhere. I made him draw the request lifecycle from scratch: what "failure" means at each layer, the difference between a timeout and a rejection, where a hung connection even sits in a retry count. Ninety minutes to reconstruct something a senior engineer picks up over months of getting paged for this exact class of bug. Minh wasn't slow, and he wasn't careless. He'd just never been forced to build the model, because the friction that used to force it — sitting inside a bug until the system underneath it clicked — had been quietly engineered away by the same tool that shipped his ticket in two days.

This isn't a Minh problem

If Minh were the outlier, I'd be writing a performance review, not a post. He's not. Every junior who's ramped up on my team in the last year shows the same shape of gap, because the on-ramp itself moved out from under them. Before agents, a junior's first year was mostly spent stuck — stuck on a stack trace, stuck tracing a race condition, stuck rereading the same service for the third time until it finally made sense. That stuck-ness was slow and it was miserable, and it was also the entire mechanism that built the mental model. Agents remove the stuck part. Nobody sat down and decided to cut the apprenticeship — we optimized away the friction that used to cause it, one ticket at a time, without ever stopping to redesign what should take its place.

The reframe

If the agent is the one writing the code, a junior's actual job this year was never "produce working diffs." It was "understand this system well enough to catch what the agent gets wrong" — a harder, more senior-shaped skill than the one we've spent years hiring and onboarding for. We never told Minh that was the assignment. We graded him on merged PRs and clean standups, which happens to be exactly the metric an agent is best at gaming on his behalf. The output looked like competence. It was actually the absence of the one thing his first year was supposed to build.

What changed on my team

  • Before any agent-authored PR from a junior merges, they narrate the diff line by line in review — not what it does, but why this line handles this failure mode and what would break it. Can't answer, it doesn't merge that day.
  • Once a sprint, every junior takes one incident — theirs or someone else's — closes the agent, and traces it by hand before opening it back up to check their work.
  • Agent-assisted tickets get tagged separately on the board from hand-written ones, so in performance conversations we're not quietly crediting "shipped fast" as "understood deeply." They're two different skills and we track them as two different skills.
  • New hires now hear this explicitly, week one: the job this year is model-building, not diff-production. We interview for it directly, by handing them agent-written code they didn't write and asking them to explain it.

None of this is an argument against agents, and it's not nostalgia for a time when juniors suffered more usefully. The leverage is real — PHX-2114 genuinely shipped faster than it would have a year ago. But the apprenticeship still has to happen somewhere. On most teams I talk to, it's being deleted by default, one clean PR at a time, without anyone deciding to delete it. The teams that figure out where to put it back — on purpose, this quarter, not as a nostalgia project — are the ones whose junior hires will still be worth the title three years from now.

Discussion

Chat with Chi Cong (AI) about this article. Your conversation is private to you — you can publish a summary for others when you're done.

Ask me anything about “The Bug That Showed Me What Agents Actually Cost My Junior Hire” — trade-offs, decisions, or the story behind it.