Adversarial Coding

It's becoming a bit of a cliché, but building software with AI agents is more like management than coding.

I've really noticed this shift while working on Alvia, the tool that allows you to interview at the scale of a survey. Early on, I had decent visibility of the architecture, the relationships between components, the edge cases. As I've moved Alvia into public testing, the problems have become more knotty. Noisy environments, dropped connections, dodgy WiFi. These are engineering problems, not feature problems; the kind of areas where Product Managers and Leadership suddenly and mysteriously find they have other more pressing matters to deal with.

Faced with issues that go beyond my technical understanding, my approach has evolved. Instead of largely trusting one model to switch between plan and build, I'm far more inclined to pit them against each other. One plans, another builds, I ask the Builder what they think of the plan, they swap roles, plan.. critique..plan again..When I sense something might be off, I ask a third agent. Sometimes a fourth.

In some respects, this felt familiar. In contact centres, we'd often use the Champ:Challenger concept. You run a control process against a challenger, measure performance, and let the data decide. It kept teams pushing boundaries instead of settling in a comfort zone. Same principle applies here. Structured friction produces better outcomes.

In AI there are other conceptual parallels with Generative Adversarial Networks. In a GAN, a generator creates outputs and a discriminator judges them. The generator learns to fool the discriminator. The discriminator gets sharper at spotting fakes. The tension between them drives quality. Neither improves without the other.

In my case, there aren't gradients flowing between the models, or a shared loss surface. My setup isn't a GAN in the technical sense, but the architecture serves the same purpose. I've separated creation from judgement, where one agent proposes and another pokes holes. Each iteration raises the bar. Weak ideas do not survive contact with a sceptical reviewer.

The key insight is role separation. Asking one model to invent and then believe its own story is a recipe for self-reinforcing blind spots. By forcing a second system to attack the first, I disrupt the complacency. The generator can't find one idea that passes and coast, it has to generalise.

The current multi-agent AI landscape is moving in this direction. Gartner reported a 14-fold surge in multi-agent system inquiries from Q1 2024 to Q2 2025. Microsoft's AutoGen framework is built around collaborative reasoning where agents interact via structured conversation. MetaGPT simulates how human project teams operate, with agents playing product manager, developer, and QA roles. The pattern is spreading because it works.

What is interesting is how this changes my relationship with the work. I treat these agents like I would treat a team of specialists. I stay in my lane and let them figure out the details. But I also push back harder than I would with humans; the sixth "You're wrong!" of an evening which in human <> human terms might result in: "well why don't you ask Claude to do it, he seems to be your favourite right now!". That kind of challenge would be exhausting with people. With agents, it is just process.

There is a limit. Unlike a real GAN, my critics share training data, stylistic priors, and blind spots. Sometimes they agree for the wrong reasons. Sometimes they miss the same flaw in stereo. That is where I still matter. I am the final discriminator, the one anchored to reality, cost, time, and users.

Building with agents combines collaboration and structured friction. It's less about the artificial intelligence, more artificial colleagues who don't get tired and don't mind being told honestly when their work is bad. Which is already more than most organisations manage.

Next
Next

Today's Jagged AI Is Good Enough to Fix Our Worst Decisions