Everyone argues about which AI coding tool writes the best code. I ran the test and the code turned out to be the least interesting part. I gave three tools the identical task, in the same repo, each on its own branch off the same clean base, and what they wrote came back a flat tie. Where they split was behaviour: what each one does when you are not watching.
The task was small on purpose. Add a GET /health endpoint to a FastAPI backend, one of my actual products, not a toy. Return a status, the app version, and whether the database connection is alive. Match the existing patterns, do not touch other routes, tell me how to test it. Same one-paragraph spec for every tool. Each one got its own git branch off the same base so none of them could crib off another. Each ran on its strongest model:
- Codex on gpt-5.5
- Antigravity on Gemini 3.1 Pro (High)
- Claude Code on Opus 4.8
Here is how each one went.
Codex
Gave it the spec and walked away. It branched, read the codebase, and worked out that the project splits into controllers, schemas and tests, so it matched that layout instead of dumping everything into one file. Then it wrote its own tests, ran them, both passed, and handed back the exact curl command to check it myself.
I never asked for tests. It wrote them and ran them anyway. Fire and forget: it did the whole job, verification included, with nothing from me after the spec.
Antigravity
Google's new AI IDE, a VS Code fork with an agent panel built in. First time I installed it, and the onboarding imported my VS Code setup, so it felt like home in about a minute.
Same spec. It branched off the right base, read the backend, and wired in a new health router cleanly. Correct code, first try. It even pulled the port number out of my README and noted how curl behaves differently in PowerShell on Windows, which nothing else bothered to do. It knew what machine it was on.
Then it stopped at "here, go test it yourself." No tests. So I typed one line: also write a test for this and run it. A minute later it had two, including one I did not expect, the failure case where the database throws and the endpoint has to fail gracefully. It found my virtualenv on its own, ran pytest, both passed.
So it verifies its own work fine. It just will not do it unless you ask.
Claude Code
My daily driver, so no surprises. It reads my project rules first, proposes a short plan, then stops and waits for me to approve before it writes a line. Then it writes the failing test first, makes it pass, and runs the thing to prove it works before it calls it done.
That pause before it codes is not slowness, it is the whole point. On real work in my own companies I want that gate sitting there. On a throwaway health check the same gate is friction I do not need.
The one real difference
All three wrote correct code. All three matched my patterns. All three branched properly. On the code itself it is a tie, and that is exactly the point: the model is not where these tools separate anymore.
What separates them is what they do unprompted.
- Codex verifies itself without being told.
- Antigravity builds correctly, then waits to be told to verify, and does it well, sometimes better than I asked for.
- Claude Code verifies itself but makes you approve the plan first.
That is the whole comparison in three lines.
What I would reach for, and when
- Something small I want done and checked without babysitting: Codex.
- Working inside an editor, especially on Windows, wanting something context-aware: Antigravity.
- Anything I actually care about shipping into a real product: Claude Code, because the approval gate is a feature, not a bug.
The thing that stuck with me is that the model matters less than what wraps it. The defaults, the scaffolding, whether it tests itself, whether it knows what machine it is sitting on. Pick the behaviour you want, not the benchmark. Done.