Benchmark · Leaderboard

VISTA Leaderboard

Visual Spec-To-App Benchmark — how well do coding agents build real web apps from a design?

10 app categories · 128 annotated pages · 458 visual anchor points · built from Figma designs

Leaderboard

Combined score — condition C4 · latest harness
#ModelHarnessEffortCombined scoreSTokensCost
1Grok 4.5cursor-agent 2026.07.01Med
0.367161K$1.83
2GPT-5.6-solcodex 0.144 · highHigh
0.309357K$4.66
3fable-5claude code 2.1.152High
0.274757K$12.04
4GPT-5.6-terracodex 0.144High
0.27098K$0.68
5GLM-5.2claude code 2.1.152 · z.aiMax
0.269304K$3.65
6Opus 4.8claude code 2.1.126High
0.263602K$10.45
7GPT-5.5codex 0.134 · highHigh
0.262279K$3.90
8Sonnet 4.6claude code 2.1.152High
0.248252K$3.85
9Opus 4.7claude code 2.1.126High
0.246229K$6.54
10Composer 2.5cursor-agent 2026.06.15
0.212120K
11GPT-5.5codex 0.134 · mediumMed
0.205272K$3.33
12MAI-Code-1-Flashcopilot 1.0.68
0.2047.4M
13GPT-5.4-minicodex 0.134Med
0.194646K$1.83
14GPT-5.4codex 0.134Med
0.190
15Gemini 3.5 FlashantigravityMed
0.145
16Haiku 4.5claude code 2.1.152High
0.105224K$1.03

Agents are ranked by the Combined score S — DOM-grounded localization × behavior on human-annotated UI anchors, averaged over 10 apps (failures count as 0). Each model runs on its latest harness release (Codex-CLI 0.134–0.144 / Claude Code 2.1.152), with a free choice of stack. Condition C4 gives the agent the richest spec: the page's rendered Figma image (a screenshot mockup) and its pruned Figma structure (the layout tree as JSON) — but no target framework.

Reasoning effort used

Each harness exposes a different reasoning-effort ladder, so levels aren't directly comparable. The highlighted dot marks the level each model ran at; the row length shows the granularity available. Notably, GLM-5.2 ran at its ceiling (max), while the Claude and Codex models still had headroom above the level used.

High · 3 / 6 ClaudeClaude Code (6 levels) — fable-5, Opus 4.8, Opus 4.7, Sonnet 4.6, Haiku 4.5
High · 3 / 4 OpenAICodex (4 levels) — GPT-5.6-sol, GPT-5.6-terra, GPT-5.5 (high runs)
Medium · 2 / 4 OpenAICodex (4 levels) — GPT-5.5, GPT-5.4, GPT-5.4-mini
Max · 2 / 2 Zhipu GLMz.ai GLM-5.2 (2 levels: high · max) — ran at max
Medium · 2 / 3 Cursorcursor-agent (Grok 4.5: medium · high · xhigh) — Grok 4.5 (ran at high = "Medium")
Medium · 2 / 3 AntigravityAntigravity (3 levels: low · medium · high) — Gemini 3.5 Flash

Cursor Composer 2.5 runs at its agent default; its effort ladder isn't published in a directly comparable form.

Cost & speed

Tokens & wall-clock per task

Median over the 10 apps — the median is outlier-robust, so a single runaway or oversized task doesn't skew a model's value. Bars are colored by harness.

Billable tokens per task
Grok 4.5 161K GPT-5.6-sol 357K fable-5 757K GPT-5.6-terra 98K GLM-5.2 304K Opus 4.8 602K GPT-5.5 high 279K Sonnet 4.6 252K Opus 4.7 229K Composer 2.5 120K GPT-5.5 med 272K GPT-5.4-mini 646K Haiku 4.5 224K
Median non-cached input + output tokens per task — the cost-relevant tokens, excluding cheap repeated cache-reads (which otherwise just track a harness's turn count).
Time per task
Grok 4.5 9m GPT-5.6-sol 18m fable-5 43m GPT-5.6-terra 7m GLM-5.2 29m Opus 4.8 28m GPT-5.5 high 15m Sonnet 4.6 21m Opus 4.7 16m Composer 2.5 10m GPT-5.5 med 12m GPT-5.4-mini 23m Haiku 4.5 12m
Median wall-clock to build each app (agent run only, excludes eval).

Harness: Claude Code · Codex · Cursor · z.ai GLM. Same 10 C4 tasks per model. Externally-provided entries (GPT-5.4, Gemini 3.5 Flash) have no local logs, and MAI-Code-1-Flash reports output-only tokens (not comparable), so all three are omitted here.

How tokens are counted: per task we take non-cached input + output — Claude/Cursor: input + cache-creation + output; Codex: (input − cached) + output + reasoning — then the median over the 10 tasks. Cached re-reads (cache_read) are excluded: they bill at ~10% and, summed over a multi-turn harness, mostly track turn count rather than usage (counting them made Claude look ~6× heavier). GLM-5.2's totals come from each run's final result event, since z.ai's endpoint leaves per-message usage empty. MAI-Code-1-Flash (GitHub Copilot): Tokens shows real input+output — median 7.4M/task (input ~7.3M + output ~98K), captured via the Copilot CLI's OpenTelemetry export (gen_ai.usage.input_tokens/output_tokens). It is not comparable to the other rows and is excluded from the token sort: Copilot re-sends the full, growing context on each of ~55 LLM calls per task and its usage accounting exposes no cache-read discount, so the input side is inflated relative to the non-cached input+output figures above. (Copilot's plain JSONL stream reports only per-message output tokens — the input figure is available solely through the OTel export.)

How cost is estimated: real median API cost per task in USD = each run's actual billed tokens (input, cached, output/reasoning — cache included) × the provider's official published per-token pricing, then the median over the 10 tasks. Claude models use the CLI's own total_cost_usd (Anthropic's real bill). Codex/GPT and z.ai GLM-5.2 are computed from captured tokens × official pricing (OpenAI, z.ai, Anthropic): e.g. GPT-5.6-terra $2.50/$0.25/$15 and GLM-5.2 $1.40/$0.26/$4.40 per 1M input/cached/output. Note GLM's real z.ai bill (~$3.65) is far below the Anthropic-priced figure Claude Code would report (~$9.44). Grok 4.5 (also run through Cursor, which exposes no per-token or per-run cost) uses Cursor's actual billed total from the dashboard — $54.75 across all 3 rounds ÷ 30 task-builds = $1.83/task — rather than a per-token computation. Cost is left blank where even that isn't available: Composer 2.5 (no dashboard total captured; Cursor publishes only a $3/$15 fast-variant rate, no cached-token rate, and the variant used isn't confirmed), MAI-Code-1-Flash (GitHub Copilot bills in AI-credits, not USD, with no cache breakdown), and GPT-5.4 / Gemini 3.5 Flash (no local token logs captured).

Co-evolution

Harness × LLM — co-evolving over releases

An agent is a model inside a harness, and both ship on their own cadence. Tracking the same model across harness releases shows the two co-evolving — sometimes lifting each other, sometimes regressing. Combined score by npm release date.

0.300.200.100.00 0.1160.1280.134 Mar 19Apr 30May 26 Codex-CLI version (release date) → GPT-5.4 GPT-5.5 GPT-5.4-mini
Codex-CLI — all three GPT models dip from the Apr-30 (0.128) to May-26 (0.134) build; GPT-5.4 peaks at 0.128.
0.300.200.100.00 2.1.582.1.1262.1.152 Feb 25Apr 30May 26 Claude Code version (release date) → Sonnet 4.6 Haiku 4.5 Opus 4.7 Opus 4.8 fable-5
Claude Code — Sonnet 4.6 rises monotonically across releases; fable-5 (2.1.152) tops the field; Haiku 4.5 trails. Opus 4.7/4.8 shown at 2.1.126.

Mean C4 combined score (n=10, failures scored 0). Codex-CLI and Claude Code use independent version schemes, shown as separate panels.

How it's scored

DOM-grounded, behavior-aware

Each task asks an agent to build and launch a multi-page web app from a visual spec. We bring the app up in Docker and, for every human-annotated UI anchor, match it to a rendered DOM element — scoring localization L (IoU / distance to the mockup position) and behavior B (interaction-specific browser checks). The headline Combined score is S = mean(L · B) over the critical anchors.

Visual spec Agent Live app Anchor → DOM Combined S mockup · Figma · anchors model × harness docker compose up localize L × behavior B mean(L · B)
Pipeline: a visual spec drives the agent (model × harness) to build a runnable app; each annotated UI anchor is matched to a DOM element and scored on localization and behavior, combined into S.