We Beat Two Frontier Vision Models With Arithmetic

This morning our attention model lost to a blurred circle. By the afternoon it was beating GPT-5.6 Sol and Claude Fable-5 at predicting where humans look on a web page, with no model call at all.
Nothing clever happened in between. Three unglamorous fixes did the work, and the biggest one is something we had simply never implemented.
The starting position was bad
We score attention prediction with AUC-Judd against real eye-tracking data: UI screenshots from the UEyes corpus, 62 participants, 554 raw fixation logs, 495 web-category pages. Chance is 0.5.
| model | AUC |
|---|---|
| a centered Gaussian blob | 0.6493 |
| our shipped model | 0.6567 |
| uniform (floor) | 0.5000 |
A blob that has never seen the page scores within 0.007 of a model that analyzes it. That is not a model of attention. That is a model that has rediscovered "content tends to be in the middle."
We published that finding rather than sitting on it. Then we went and fixed it.
Fix 1: the blend weight was seven times too high
Our attention map mixes two channels: bottom-up visual saliency (what pops by color contrast) and a semantic map (what matters structurally — headings, CTAs, navigation). The mix was hardcoded at 35% visual.
That number came from the literature, which is a reasonable place to get a prior and a poor place to stop. We swept it from 0 to 1 in 0.05 steps across all 495 pages:
| visual weight | 0.00 | 0.05 | 0.10 | 0.20 | 0.35 | 1.00 |
|---|---|---|---|---|---|---|
| AUC | 0.6466 | 0.6567 | 0.6521 | 0.6427 | 0.6336 | 0.5854 |
Five-fold cross-validation picked 0.05 in five of five folds, optimism gap 0.0000.
The useful number is not the optimum, it is the break-even at about 0.16. Above that, mixing in the visual channel is worse than not having it at all. We had been sitting well past that line, which is why our full model scored below its own semantic half.
Fix 2: the map was too sharp to be a map of eyes
Our heatmap painted crisp rectangles around elements. The human fovea covers roughly one to two degrees of visual angle — about 35 to 60 pixels at normal viewing distance — and fixations scatter around a target rather than landing inside its bounding box.
A map with hard element edges claims a precision the eye does not have. One Gaussian blur, sigma 2.5 grid cells: +0.0197 AUC.
Fix 3: we had no idea where people look
This is the one that hurts to write. Every competitive saliency model since Judd et al. in 2009 multiplies in a learned spatial prior — a plain, image-independent map of where eyes go on a screen. We had none.
We fitted one from 554 participant logs. It is the F-pattern, recovered rather than assumed: peak just above and left of center, decaying toward the bottom right.
+0.0774 AUC. More than the blend weight and the smoothing combined.
Worth being honest about what that is. A spatial prior is not page comprehension; it is the model learning where people look on average and applying it everywhere. It is also the cheapest known gain in this literature, and skipping it was not principled restraint on our part. We just had not done it.
Where that leaves the numbers
We fitted the three jointly, because they interact: the best smoothing depends on whether a prior is already absorbing the same signal, and the best blend weight depends on both. Fitting them one at a time and stacking the winners overfits three times. Outer five folds hold out test images, and the prior is estimated from training fixations only.
| AUC | |
|---|---|
| human inter-observer ceiling | 0.8112 |
| our model, held out | 0.7367 |
| in-sample (optimism 0.0005) | 0.7372 |
| where we started this morning | 0.6567 |
| centered Gaussian | 0.6493 |
That ceiling is the number that makes the rest interpretable. We split the 62 participants in half, built a fixation map from one half, and scored it against the other half's fixations with the identical metric. That is a real model — 31 actual humans looking at the actual page — so it approximates the best any model of "the average viewer" can do.
Humans predict each other at 0.81. We started the day at 0.6567 and finished at 0.7367. That closes 52% of the reachable gap.
Then we checked the vision models
The obvious question: why do any of this when you can hand the screenshot to a vision model and ask where people will look?
So we did. The same 60 stimuli, the same metric, paired per image, against GPT-5.6 Sol, Claude Fable-5, and Gemini 3 Flash Preview.
| AUC | |
|---|---|
| our model | 0.7567 |
| frontier VLMs (GPT-5.6 Sol, Claude Fable-5) | 0.69 - 0.71 |
| centered Gaussian | 0.6794 |
| Gemini 3 Flash Preview | 0.6548 |
| paired comparison | delta | wins | p |
|---|---|---|---|
| vs Claude Fable-5 | +0.0500 | 41/60 | 0.0002 |
| vs GPT-5.6 Sol | +0.0582 | 43/60 | <0.0001 |
| vs centered Gaussian | +0.0773 | 47/60 | <0.0001 |
We are deliberately not ranking GPT-5.6 Sol against Claude Fable-5, and an earlier version of this post did. Our first run put Claude at 0.7067 and GPT at 0.6985. A second run on the identical images reversed them — GPT 0.7066, Claude 0.7040 — and paired, GPT wins 31 of 59, which is 52.5%. That is a coin flip. Two runs, opposite orderings, no separation. The honest statement is that both sit somewhere around 0.70 and we cannot tell them apart at this sample size, so the table now says that instead of implying a winner.
We are leaving the correction visible rather than quietly swapping the numbers, because a post arguing that measurement is the hard part does not get to hide a measurement it got wrong.
The margins that matter are unaffected: our model beats both by roughly 0.05 AUC, which is an order of magnitude larger than the wobble between them.
Gemini 3 Flash Preview is the one clear ordering, and it goes the other way — it lands below the centered Gaussian, beating it on only 24 of 50 images. It is a Flash-tier model against two flagships, so that is not an indictment, but it does mean "use a vision model" is not automatically the strong move. One caveat on its number: it returned HTTP 503 on 10 of 60 images even with retry, so its mean is computed over a different 50-image subset. The paired win-rates are the trustworthy comparison there, not the mean.
Both flagship models beat the blob, which is a genuine result for them — the blob is a stronger baseline on web layouts than people expect. All three lose to a pipeline of OCR, some arithmetic, and a lookup table.
The cost difference is what matters commercially. A vision-model call runs about a cent per page and takes 30 to 60 seconds. Ours runs locally in roughly 1.5 seconds and costs nothing per page. Across a ten-thousand-page crawl that is the difference between a line item and a rounding error.
Three caveats we are not going to bury
UEyes is free-viewing. Participants were given no task. Our product models goal-directed attention, and the goal-relevance layer never executes on this corpus. A vision model handed the actual task might close the gap or beat us. We have not tested that.
One corpus, one page genre. Static screenshots. No scrolling, no interaction, no state.
We fitted an element-weight table and did not ship it. The learned weights said body text and navigation matter far more than CTAs and images — roughly the inverse of what our table assumed. On free-viewing data that is exactly what you would expect, because given no task, people read; given a task, they hunt buttons. Shipping those weights would have baked browsing behavior into a model meant for goal-directed use, so they stayed in the drawer despite being worth +0.0265.
The part that generalizes
The three fixes were: a constant nobody had measured, a physical property of the eye nobody had modeled, and a standard technique nobody had implemented. None required a new idea.
We had assumed the way to beat this problem was a better model. The measurement was the thing we were missing. Once we could tell which direction was up — a real ceiling, a real baseline, cross-validated held-out scoring — the climb took an afternoon.
The negative result we published first is still up.