CTO & co-founder @v7labs. Reliable AI agents at work, strange small models and weird interfaces for fun. I build everything I write about.

London, England
Joined October 2010
I trained an AI model to autocomplete my piano prompts. Here’s what happens when I give it the first few notes:
6
6
3
36
2,721
Me: Mum, can we have a world model? Mum: We have a world model at home. World model at home:
2
166
Trained a 360M model to pretend to be a terminal. There's no real shell behind it, but it runs vim, tmux and snake, and mostly remembers your files 😅
6
4
6
43
2,952
Very well thought through outline of the future of maths. I see so many parallels to software engineering and can only assume that, as time goes on, more and more groups will have to face very similar challenges
I’m very opinionated. So it’s nearly impossible for me to hear someone’s arguments and *not* find something I disagree with. (This includes reading things I myself wrote years - or weeks - ago.) And yet the amazing Grant Sanderson @3blue1brown has put out a long, detailed video on the future of mathematics, in which I cannot find a single flaw. I’ll be sending this to every PhD student and postdoc I know, and strongly recommend everyone watch it. youtube.com/watch?v=LKrwhjOI… (Of course I tried to say many of the same things in my conversation with Thomas Koberda. But Grant’s version, unsurprisingly, does an infinitely better job at communicating those ideas!)
69
Great to finally see a promising diffusion LLM
1/4 Today, we’re releasing Mercury 3. Mercury 3 is by far our most powerful model and the most intelligent diffusion LLM ever released. It outperforms GPT-6 Luna and Haiku 5.5 on quality while running at 1000+ tok/sec.
5
186
Since we’re all rewriting everything in Rust, here’s my contribution: Dialyzer. ~3× faster on cold runs, matching warnings on tested projects. Uses more memory though.
5
2
1
9
550
I'm backporting some of the algorithmic changes to the Erlang version. Stay tuned!
24
London just got chilly. There's probably a German word for putting on your winter coat for the first time and finding things in the pockets you'd forgotten about.
1
3
140
I ran Gemini 4 on my coco bounding box benchmark, and it performances much better than previous models
Gemini 4 Argon is here. It’s available globally today for developers and enterprises in the paid tier of the Gemini API and the Gemini platform, for Ultra subscribers in Google Antigravity, and Ultra and Pro subscribers in the Gemini app and Search. Hope you all enjoy it!
1
122
A treat as always. Pretty massive gap in AI spend per employee
welcome to the 9th annual @stateofai report! ai building better ai, world models, physical ai, geopolitics, cyber defense and 12-month predictions. read it at stateof(dot)ai or watch my editor’s cut here. a few of this year’s biggest findings follow:
4
141
I think I built the world’s most overengineered TAS. I trained a small CNN+GRU on a handful of recorded DuckTales runs (Gemma didn’t work out). It plays those runs perfectly at ~1ms/decision. Deviate more than a few steps and it’s completely lost.
2
4
176
It used DuckTales TAS by Aglar and MESHUGGAH as training data
35
Nice to finally share this piece we worked on with OpenAI about V7 Go and our Context Graph. One interesting detail: GPT-5.6 Sol had saturated many of our existing evals, so we built a harder set with messier, real-world data. GPT-6 Astra scored 89% on the hardest tier.
3
144
Gemma 4 E2B went from 1% to 87.5% at locating Scrooge McDuck in DuckTales. After letting it play Doom yesterday, I fine-tuned it on 2,716 NES screenshots, using positions read directly from RAM as labels. Training and evaluation took 18 minutes on one RTX 4090. It still didn’t play any better, so perception wasn’t the only bottleneck. What would you try next?
1
3
168
The Jev Doom demo by @CompleteSkeptic is really cool, so while I’m waiting for access I tried the same thing with Gemma 4 E2B from @GoogleGemma. Mine takes 640×480 frames directly, with no intermediate text description of the scene. It shares the image prefill across batched action queries, then reads the controls directly from logits. It sort of works.
3
6
10
624
Think of the screenshot and shared instructions as the prompt. Gemma processes that once, and we cache the resulting keys and values. For each JSON field, we append a short question to an independent continuation of that cached prompt. All those questions run together in one batch. Instead of generating the answers autoregressively, we read the logits for a fixed set of answer tokens and map them to the allowed enum values. A boolean is simply an enum with two values.
1
2
115
The schema here is very basic: { move: "none" | "forward" | "backward"; strafe: "none" | "left" | "right"; turn: "none" | "left" | "right"; fire: boolean; use: boolean; }
2
75