Introducing eval.horse
I built a new benchmark called eval.horse. It has AI models handicap real horse races using the same race card, research tools, and lock time. Each model ranks the full field from first to last and gives every horse a probability of winning. The picks are published before the race, the race happens, and then they’re scored against the result.
I mostly built it because I thought it would be fun and also a good test for ZeroSignal. I’ve been spending more time around horse racing lately and was curious whether the models would be any good at handicapping.
Most benchmarks are built from questions where the answer was already known when the benchmark was created. That’s obviously useful, but it also creates problems around contamination, memorization and eventually saturation. The recent OpenAI / Hugging Face incident is a good example of how messy benchmarking can get.
A horse race has a convenient property: the answer doesn’t exist yet.
When the models handicap a race nobody knows which horse is going to win. The result can’t be sitting somewhere in their training data because the event hasn’t happened. And there’s no chance a model can actually influence the result (atleast yet).
An unknown answer on its own would make for a terrible benchmark. The useful part is that these questions resolve quickly and unambiguously. Each race is basically a new prediction problem generated by the real world, with ground truth arriving shortly after the models commit.
Horse racing also gives them quite a lot to reason over. There are speed figures, recent form, class changes, pace, distance, surface, post position, trainers, jockeys, workouts, pedigree, weather, scratches and whatever else the model decides is useful. Much of the information is public and reasonably structured, but there’s no formula that tells you which horse crosses the line first.
I don’t think this isolates some pure concept of model “reasoning,” nor am I sure that’d even be possible here. A model can search badly, choose bad sources, interpret good information poorly, or be badly calibrated despite reaching the right conclusion. eval.horse measures that whole process, which is closer to how people actually use these models anyway.
How it works
Every model gets the same race card and the same output contract. They also get web search and web read tools, so they can research the race before answering.
I didn’t want this to become a test of which model happened to memorize the most horse racing data during training. If one model thinks trainer statistics matter and another wants to spend its time reading workouts or looking at pace, they’re free to do that. The tools are the same; what they do with them isn’t.
Every model has to rank every horse from first to last. It can’t sit out a difficult race, only give me the three horses it likes, or refuse to make a call. The first three positions become its win, place and show predictions.

It also has to assign a win probability to every horse. I think those probabilities may eventually be more interesting than the picks themselves. Picking a 3/5 favorite to win and giving it a 60% chance is very different from picking the same horse and giving it 20%. Over enough races we can start looking at calibration, not just how often the horse at the top of the list happened to win.

Before the first post time the predictions are published and hashed. Once the race starts, nothing can be revised with the benefit of hindsight.
One race tells us almost nothing. Horse racing is noisy, and a good prediction can lose because a horse breaks badly, gets boxed in, or simply has a bad day. The benchmark gets more interesting as the sample grows.
The scoring itself will probably evolve too. Winner accuracy is obvious and easy to understand, but it shouldn’t be the only thing that matters. I want to look at probability calibration, the quality of the full rankings, and eventually compare the models against some boring baselines: always picking the betting favorite, using market-implied probabilities, and so on. If a model is ahead after hundreds of races but can’t reliably beat the morning line, that’s important context. If one stays ahead across several measures and the difference persists as the sample grows, that’s more interesting.
I also wouldn’t call whoever sits at the top of eval.horse the smartest model. It’d mean it’s been better at this particular combination of research, tool use, prediction and uncertainty. That’s narrower, but still useful.
Why not let them gamble?
I considered giving every model a bankroll and letting them bet. I still think that could be fun, but it changes the question.
A model can be an excellent handicapper and a terrible bettor. Once money is involved it has to decide whether its estimated probability differs enough from the market to have an edge, how large the edge is, how much to wager, and how much variance it’s willing to tolerate. Now I’m evaluating betting strategy on top of handicapping.
For the first version I wanted fewer moving parts. Every model calls every race and gets graded on the prediction.
The market comparison can come later. In fact, one of the results I’d find most interesting is whether any model can consistently produce probabilities that are better calibrated than the betting market. I’m nowhere near having enough races to say anything useful about that yet.
ZeroSignal
There’s also a ZeroSignal connection to all of this.
I built the site using my current favorite coding agent (PI) pointed at the ZeroSignal proxy. When I needed to actually run all of the models for the benchmark, I ended up using ZeroSignal there too. It allowed me to set-up a harness to test dozens of models at once.
eval.horse can send the same request to a bunch of different models through one interface, and those models can use web search and page reading during inference. I didn’t have to build and maintain a different provider integration for each model I wanted to evaluate.
What happens now
I’ve got no idea what the leaderboard will look like after a meaningful number of races. One model might separate itself. They might all converge around the same obvious horses. One might pick more winners while another is much better calibrated. They might mostly recreate what the betting market already knows. They might all suck.

For now I mostly want to let eval.horse accumulate races and see if anything real starts to emerge from the noise.