Vivarium /Blog

Writing my last lines of code

Ten years at Google, one missing flag, and the month of side projects that changed how I work.

· John Uckele

My last code commit added one missing flag.

I'd just started an experiment at Google when I found one of its arms was missing a flag, so some data expected from the back end was getting dropped. I added the flag, fixed the arm, and left for six weeks of baby bonding leave. I worked at Google for ten years and wrote thousands of lines of code there. That commit was the last code I'd write by hand.

It was a good way to stop. I've always been a proponent of TDD, of fixing your bugs, and of code quality as a craft. I didn't stop writing code because I wasn't good at it anymore. I stopped writing code because I found a better way to do it.

For five years, the models kept missing the mark

I've been hearing hype about LLMs for half a decade now, and I've been dutifully checking them out the whole time. Google's Meena was available for internal testing many years ago, and when I tried it, I remember thinking it was a cute toy, but its fundamental lack of understanding was obvious. Over the years I kept testing new models. Inevitably, they'd get weird, hallucinate, or really miss the mark.

One of my most frustrating LLM experiences was earlier this year. I asked Gemini 3.1 Pro to implement a specific algorithm: model each player in a tournament as a normal distribution, so that when two players meet, the odds of player 1 winning are

P(p1 wins) = Φ( (μ1 − μ2) / √(σ12 + σ22) )

(where Φ is the standard normal CDF), and then use gradient descent to find the player models that best describe all of the observed match results.

Gemini happily said yes, and then wrote something much closer to Microsoft's TrueSkill. TrueSkill is a fine system, but it's a different one: it updates each player after every game (winner's mean up, loser's mean down, uncertainty shrinking as games pile up) instead of fitting a model to the whole history. Same family of idea, different algorithm, and most importantly, not the one I asked for.

That was the pattern for years. The output looked good until you checked it.

LLMs can play chess now

During a trip to San Francisco, in a conversation about the state of LLMs, I made some hot jabs, including a quip that LLMs can't play chess.

I got challenged on that. One of my friends pulled out their ChatGPT app and started a game. Fifteen moves in, no hallucinations.

Some reading later, I learned that LLMs being able to play chess is a fairly new development, and one I'd missed. I found the LLM chess leaderboard.

The top of the LLM Chess leaderboard as of October 6, 2026. Magnus Carlsen sits first at 2941 Elo. Below him, the top LLMs score between about 1511 and 1614 Elo, with claude-opus-5-5-high fourth at 1575.3 and $1.396 per game, then a Class C player at 1500.
The leaderboard as it stood on October 6, rendered from maxim-saplin/llm_chess (© Maxim Saplin, Apache License 2.0).

It made me wonder: if LLMs could play chess now, what else could they do?

It was time to start retesting my assumptions

I signed up for a Claude Pro account. My first prompt to Claude Opus 5.5 was on October 6 at 8:41 PM: a cute one-page prototype of a game idea that's been kicking around in my head for years. My last prompt that night was less than an hour later, and I was left with something fun to play.

That opened the floodgates. Over the next few weeks, I knocked out back-burner hobby projects one after another.

Personality chess. Back in 2023 and 2024 I wrote stockfish-remix by hand, a chess engine that blends Stockfish's evaluation with simple personality traits (capture pieces, avoid being threatened, and so on). I put 46 commits into it over 16 days of work and never finished it. On October 8, Claude and I rebuilt the idea from scratch in a single evening.

Hex-grid triangle chart: Queen-Star's average centipawn loss per move across blends of Stockfish, the Queen-Star trait and random moves. Loss stays near 64 while Stockfish has 50% or more of the weight, rises gradually through a useful band from 40% down to 10%, and jumps to 326 to 436 at 0% Stockfish.

Since then the bots have played about 28 million games against each other, which gave me the data I needed for another project...

Normal-distribution fit (No Diggity). The gradient descent player model Gemini didn't write for me went from untested against good player data to tested and laid to rest.

Scatter chart of a 16-bot chess-personality league over 400 simulated leagues: ranking quality against match quality. Swiss pairing is the baseline at about 0.525 ranking and 0.628 match quality. The normal-distribution fit raises ranking quality by 0.088 with no significant gain in match quality. Bradley-Terry raises ranking quality by 0.089 and match quality by 0.0095.

I'm really happy to see that my normal distribution algorithm beats Swiss pairing (the usual chess tournament format) on ranking by a wide margin, but it's also painfully slow to run and itself loses to Bradley-Terry on match quality by a compelling margin. I think the conclusion is that Bradley-Terry is the answer I was looking for. Notably, Opus 5.5 was the partner that suggested we benchmark Bradley-Terry here.

A Factorio mod. Anti-jam stack inserters went from "I know the key line I need to change, but there's a bunch of extra boilerplate I don't want to write" to done in 5 days, and with more bells and whistles than I ever would have been willing to do by hand (options for how to access the core functionality, color settings, and compatibility with another small mod).

A game concept or three. A few game ideas went from "wouldn't that be interesting" to "I don't think I like that game very much." Those count as finished projects too. Killing an idea in days lets you move on to the next one.

The jump from bad to good is the editing you don't have to do

In my last few weeks at Google, I came back and worked in an entirely different manner. It helped that a new generation of Gemini models was available internally by then, and they launched publicly right after I got back.

There's a big difference between asking an LLM for some code that you then have to go in and edit (because it added a bunch of unneeded CSS attributes, say) and asking for code that it nails on the first try. The first saves you some typing. The second changes how you spend your day.

After my return, I was running LLMs four wide throughout the day: knocking out old low-priority bugs, doing audits on my entire product, and setting up daily reports to automate the most tedious parts of experiment rollouts. I wasn't writing the code anymore. I was deciding what got written and checking that it was right.

Judgment is the part that doesn't get automated

Now I'm taking this new direction and building something with it. LLMs don't replace human judgment. Somebody still has to decide what's worth building, notice when the output is wrong, and say so. What they do replace is most of the time between an idea and finding out whether it's any good.

That's what Vivarium is for: incubating projects in weeks that would have taken months before.

Cartoon: a sweating horse hitched to a carriage stares at a Model T rolling out of a motor car factory. Caption: Horses still have jobs, just fewer of them.
Made with Gemini 4 Pro Argon. I'm aware of the irony.

If you're an engineer who wrote LLMs off the last time one let you down, try a current model (I personally endorse Claude Opus 5.5 and Gemini 4 Pro Argon). A lot has changed in a few months. If you have a project that's been sitting on a back burner for years, I'd like to hear about it at hello@vivarium.io.

I collaboratively wrote this post with Claude Opus 5.5 High.