ReactBench
ReactBench is an evaluation for coding agents on realistic React work. Today’s models can pass tests in benchmarks but still write React that fails in production. Tests verify behavior, but they miss React performance, accessibility, and quality issues.
Here’s what ReactBench does differently:
A higher bar than just passing tests
Every solution must pass both behavioral tests and React Doctor, our open-source, deterministic verifier for React code. Its 400+ rules scan the agent's code for broken effects, unnecessary renders, accessibility problems, and maintainability issues.Built by React experts
Our team built React Doctor ★ 13.8k, React Scan ★ 21.6k, and Million.js ★ 17.7k, used by engineers at GitHub, PayPal, Rippling, and Airbnb. We spent hundreds of hours curating tasks to measure real gaps in model capabilities.Real work in real codebases
ReactBench spans open-source repositories and realistic changes grounded in existing projects (not synthetic puzzles). Agents must implement, preserve behavior, and meet the React-specific quality checks.
Results
We evaluate two complementary capabilities: implementing new features and improving existing code.
Writing React
Implement a real feature or fix, pass held-out behavioral tests, and validate no new React Doctor issues were introduced. See exampleFixing React
Refactor React failures from existing code while preserving existing behavior without introducing new React Doctor issues. See example
We report pass@1 averaged across 5 trials per task. Error bars are 95% run-to-run intervals: each trial index forms one complete pass over the fixed task set.
ReactBench score vs. cost / output tokens
Ranked by score. Cost is the average per rollout.
| Model | Score | Cost |
|---|---|---|
| GPT 5.6 Sol · MaxOpenAI | 47.8% | $3.62 |
| GPT 5.6 Sol · XHighOpenAI | 43.9% | $2.32 |
| Opus 5 · MaxAnthropic | 43.5% | $6.47 |
| Fable 5 · XHighAnthropic | 43.1% | $10.45 |
| Fable 5 · MaxAnthropic | 42.0% | $14.07 |
| Opus 5 · HighAnthropic | 40.8% | $4.16 |
| GPT 5.6 Sol · HighOpenAI | 40.8% | $1.87 |
| GPT 5.6 Terra · MaxOpenAI | 40.8% | $1.36 |
| Fable 5 · HighAnthropic | 40.4% | $7.37 |
| GPT 5.6 Terra · HighOpenAI | 38.8% | $0.46 |
| GPT 5.6 Terra · XHighOpenAI | 38.4% | $0.73 |
| Opus 5 · XHighAnthropic | 37.3% | $5.34 |
| Grok 4.6 · XHighxAI | 37.3% | $2.37 |
| GPT 5.6 Sol · MediumOpenAI | 36.5% | $1.23 |
| Grok 4.6 · HighxAI | 35.3% | $1.88 |
| Opus 5 · MediumAnthropic | 34.9% | $2.45 |
| GPT 5.6 Luna · MaxOpenAI | 34.9% | $0.99 |
| Fable 5 · LowAnthropic | 33.7% | $3.71 |
| Opus 4.8 · MaxAnthropic | 32.5% | $7.30 |
| Grok 4.5 · HighxAI | 32.5% | ~$0.67 |
| GPT 5.6 Luna · HighOpenAI | 32.5% | $0.41 |
| GPT 5.6 Sol · LowOpenAI | 32.5% | $0.64 |
| Grok 4.6 · LowxAI | 31.0% | $0.77 |
| GPT 5.6 Luna · XHighOpenAI | 31.0% | $0.65 |
| Grok 4.5 · MediumxAI | 30.6% | ~$0.69 |
| Grok 4.6 · MediumxAI | 30.6% | $1.24 |
| Grok 4.5 · LowxAI | 30.2% | ~$0.67 |
| Kimi K3Kimi | 30.2% | $2.32 |
| Opus 4.8 · XHighAnthropic | 29.8% | $6.19 |
| GLM 5.2 · HighZ.ai | 29.8% | $2.44 |
| Sonnet 5 · MaxAnthropic | 29.4% | $5.98 |
| GPT 5.6 Terra · LowOpenAI | 29.0% | $0.23 |
| GPT 5.6 Terra · MediumOpenAI | 28.6% | $0.28 |
| Sonnet 5 · HighAnthropic | 28.2% | $2.62 |
| Opus 4.8 · HighAnthropic | 27.8% | $4.75 |
| GLM 5.2 · MaxZ.ai | 27.1% | $2.65 |
| Sonnet 5 · XHighAnthropic | 26.7% | $3.52 |
| Muse Spark 1.1 · MaxMeta | 26.3% | $3.85 |
| GLM 5.2 · XHighZ.ai | 26.3% | $2.90 |
| GLM 5.2 · LowZ.ai | 25.5% | $2.51 |
| GLM 5.2 · MediumZ.ai | 25.5% | $2.94 |
| Opus 4.8 · MediumAnthropic | 25.1% | $3.92 |
| Muse Spark 1.1 · MediumMeta | 24.3% | $2.09 |
| Opus 5 · LowAnthropic | 23.5% | $1.43 |
| Muse Spark 1.1 · HighMeta | 23.1% | $3.75 |
| Gemini 3.1 Pro Preview · HighGoogle | 22.4% | $0.93 |
| Gemini 3.5 Flash · MediumGoogle | 22.4% | $1.67 |
| Muse Spark 1.1 · XHighMeta | 22.4% | $4.02 |
| Kimi K2.7 CodeKimi | 22.0% | $1.43 |
| Sonnet 5 · MediumAnthropic | 21.6% | $1.47 |
| Gemini 3.5 Flash · HighGoogle | 21.2% | $1.68 |
| Gemini 3.1 Pro Preview · MediumGoogle | 20.4% | $0.97 |
| Gemini 3.5 Flash · XHighGoogle | 20% | $1.73 |
| Gemini 3.1 Pro Preview · XHighGoogle | 19.6% | $0.89 |
| GPT 5.6 Luna · MediumOpenAI | 18.8% | $0.15 |
| Opus 4.8 · LowAnthropic | 18.4% | $1.92 |
| Gemini 3.1 Pro Preview · MaxGoogle | 18.4% | $0.94 |
| Muse Spark 1.1 · LowMeta | 17.6% | $1.01 |
| Gemini 3.5 Flash · LowGoogle | 17.3% | $1.17 |
| Sonnet 5 · LowAnthropic | 16.9% | $0.68 |
| Composer 2.5Cursor | 13.3% | $0.16 |
| Gemini 3.1 Pro Preview · LowGoogle | 11.0% | $0.35 |
| GPT 5.6 Luna · LowOpenAI | 11.0% | $0.07 |
| Inkling SmallThinking Machines | 7.5% | $0.10 |
Score: a weighted aggregate of the rubric items. Solutions that don’t pass blocking criteria receive 0.
Cost: the mean cost of a model rollout in US dollars.
~ Grok 4.5 cost and output-token values include calibrated estimates for runs whose Cursor telemetry omitted generated tokens.
ReactBench remains unsaturated. GPT 5.6 Sol at Max has the highest observed aggregate score at 47.8%. The next four configurations are GPT 5.6 Sol at XHigh at 43.9%, Opus 5 at Max at 43.5%, Fable 5 at XHigh at 43.1%, and Fable 5 at Max at 42.0%.
We also evaluated task discrimination across model configurations. In the 51-task panel, 39 tasks (76.5%) had a cross-configuration standard deviation above 0.10.
Among configurations within 5.0 percentage points of the leader, GPT 5.6 Sol at XHigh has the lowest average cost. It reaches 43.9%, 3.9 percentage points behind the leader, while costing 36.0% less per trial ($2.32 versus $3.62).
GPT 5.6 Sol at Max achieved the highest observed pass rate. Its 95% run-to-run interval overlaps GPT 5.6 Sol at XHigh’s, so this revision does not identify a clear winner with confidence.
Bugs dominate newly introduced React issues
| Model | Bugs per 100 trials | Performance per 100 trials | Accessibility per 100 trials | Correctness per 100 trials | Issues per 100 trials |
|---|---|---|---|---|---|
| Fable 5 | 46.5 | 1.7 | 0.9 | 0 | 49.1 |
| Sonnet 5 | 54.4 | 2.2 | 3.0 | 0 | 59.6 |
| GPT-5.6 Sol | 49.3 | 0.4 | 0.4 | 10.7 | 60.9 |
| Opus 4.8 | 63.4 | 1.5 | 0.9 | 0 | 65.8 |
| GPT-5.6 Terra | 67.4 | 3.1 | 1.5 | 0.1 | 72.1 |
| Gemini 3.1 Pro Preview | 59.9 | 3.7 | 9.5 | 0 | 73.0 |
| Opus 5 | 63.3 | 5.2 | 5.9 | 0 | 74.4 |
| GPT-5.6 Luna | 74.2 | 3.0 | 1.9 | 0 | 79.1 |
| Kimi K3 | 82.2 | 0.7 | 0 | 0 | 83.0 |
| GLM 5.2 | 88.6 | 2.4 | 1.6 | 0.1 | 92.7 |
| Kimi K2.7 Code | 80.7 | 6.7 | 5.2 | 1.5 | 94.1 |
| Grok 4.5 | 84.0 | 5.4 | 7.9 | 0 | 97.3 |
| Composer 2.5 | 83.0 | 5.9 | 11.9 | 0 | 100.7 |
| Grok 4.6 | 95 | 5.7 | 8.0 | 3.0 | 111.7 |
| Inkling Small | 109.6 | 7.4 | 5.9 | 0 | 123.0 |
| Gemini 3.5 Flash | 120.7 | 2.4 | 8.3 | 0 | 131.5 |
| Muse Spark 1.1 | 138.2 | 6.2 | 2.5 | 0.7 | 147.7 |
Across 8,640 Writing React trials, the evaluated models introduced 7,409 graded React Doctor issues. Bugs, including security findings, accounted for 6,682, or 90.2%.
Harbor exposes component verifier rewards for 4,826 of 5,558 failed Write trials and 5,343 of 6,116 failed Fix trials in ReactBench v1.1. Among the covered Write failures, 2,279 failed behavioral tests only, 1,303 failed React Doctor only, and 1,244 failed both gates. Among covered Fix failures, the corresponding counts are 1,127, 3,035, and 1,181.
The remaining Harbor jobs do not expose gate-level rewards publicly, so these partial splits are not presented as estimates for the full revision.
Why we built ReactBench
React is the dominant frontend framework and the most popular target for coding agents. Roughly 70% of websites built on a JavaScript framework choose React.
We have seen the risks firsthand. React Doctor is our open source tool for scanning React issues used by engineers at PayPal, Rippling, Polymarket, and the Centers for Disease Control and Prevention (CDC). Adoption is largely driven by the increase of model-generated code that makes it easier for subtle defects to reach production. As models write more React, small mistakes can propagate at enormous scale. In the worst cases, these defects lead to production failures:
Outages
IncorrectuseEffectusage takes down production. Cloudflare traced its September 2025 dashboard and API outage to one effect with a faulty dependency. Despite human review and test, the bug still shipped to production.Lost revenue
Slow interfaces cost sales. Google and Deloitte found that a 0.1s mobile speedup increased retail conversions by 8.4%. Rakuten 24 increased revenue per visitor by 53.4% after improving Core Web Vitals.Legal risk
Interfaces that are not accessible exclude customers and expose companies to lawsuits. WebAIM found automated accessibility failures on 95.9% of the top one million home pages and US federal web accessibility lawsuits increased by 27% in 2025.
Building ReactBench
Each task type uses a different construction and evaluation process.
Writing React
Writing React measures whether an agent can implement real work without introducing a React regression. Each task starts from a merged pull request in an open-source repository. The agent receives the base repository and an issue-style instruction. The reference patch and verifier are not provided.
Behavior
The verifier injects the hidden behavior tests and verifies the results in a separate container after the agent completes.React health
A pinned React Doctor scan compares the submission with the base commit. If a new issue is detected, it fails.
Writing React score by model
Fixing React
Fixing React measures whether an agent can recognize and refactor React problems from source code alone. We select a component with known React issues and ask the agent to improve it without naming those findings.
React health
The agent must remove every target without introducing another graded React issue. The grader ignores line shifts.Behavior
The task’s test suite must still pass to ensure refactoring the component did not regress it in functionality.
We strip React Doctor and other React-aware linters from the agent image. Only the verifier contains the pinned scanner and its clean baseline.
Fixing React score by model
React Doctor as a verifier
We built React Doctor, an open-source, deterministic React verifier with 400+ rules to cover problems outside behavioral test assertions:
Correctness
Catches conditional hooks, unstable list keys, hydration mismatches, and deprecated React APIs.State and effects
Flags derived or duplicate state, useEffect abuse, and infinite rerenders.Performance
Finds unnecessary renders, layout thrashing, sequential async work, and bundle-heavy imports.Accessibility and security
Detects unlabeled controls, keyboard-inaccessible interactions, unsafe HTML, and secrets exposed to client bundles.
Example
Diagnostics are attached to the exact lines introduced by the agent.
Derived state stored in an effect
Compute filtered products during render instead of synchronizing state after commit.
Array index used as a key
Use product.id so identity survives insertions and reordering.
ReactBench does not use every rule or an LLM-as-a-judge. We curate the specific React Doctor rules used for grading, then pin the scanner version and clean baseline.
From real pull requests to verified tasks
ReactBench converts merged changes from public repositories into evaluation tasks.
Mine candidates
We collect merged pull requests from open-source React projects.Filter candidates
We built automated filters to check if there were meaningful changes to product code. Then, reviewers assess exceptions that cover broader feature work or important projects, and have realistic behavioral tests.Author tasks
Each reviewer converts validated pull requests into a realistic issue-style instruction. If the candidate’s tests are too strict, reviewers will rebuild a custom test harness to validate behavior.Validate behavior
The tests must fail against the pinned base commit and pass with the reference solution. The unchanged repository must score 0, while the reference solution must score 1.Test the verifier
An adversarial agent attempts to earn full credit without implementing the requested behavior.Pin the release
For each task, we pin the source commit, environment, test suite, reference solution, and verifier configuration. We also have a versioned manifest that records a hash for each published artifact.
Filter criteria
| Filter | Requirement |
|---|---|
| Changed code | At least 50 changed lines |
| Additions | At least 40 added lines |
| React signal | Changes React product code |
| Recency | Merged on or after February 1, 2026 |
| Repository size | Fewer than 20,000 GitHub stars during our audit |
92% percent of Writing React tasks meet both the recency and repository-size criteria. These thresholds are implemented to reduce likely training exposure.
Behavioral coverage
Every task defines deterministic behavioral checks before release. We use the repository’s existing Vitest, Jest, or Playwright tests when they fully specify the requested behavior.
When existing tests leave gaps, we build a separate harness around observable behavior. Reviewers confirm that the verifier accepts valid implementations beyond the reference solution.
Clean-room grading
The agent and verifier run in separate containers. Before grading, the verifier restores its own Git metadata, dependencies, protected configuration, hidden tests, and pinned React Doctor binary.
Continuous integration (CI) confirms that both containers use the same source commit. The verifier runs offline and doesn’t make external network requests. The agent cannot access hidden tests or the reference solution during its run.
Separating model failures from benchmark failures
A zero can reflect a model failure, unclear instructions, a brittle test, a verifier error, an infrastructure failure, or an invalid run.
Reviewers inspect the trajectory and final patch before including a result in model-performance conclusions. They classify each reviewed rollout as a legitimate solve, genuine model failure, verifier false positive, verifier false negative, or invalid run.
Testing ReactBench against reward hacking
The adversarial agent probes the test infrastructure, reward files, Git history, and React Doctor inputs. Its goal is to earn full credit without implementing the requested behavior.
We fix or remove any task that exposes a cheat, then rerun every control. This final check tests whether ReactBench measures the requested work rather than an agent’s ability to exploit the grader.
Limitations
React Bench evaluates agents, not models in isolation. Differences among Codex CLI, Claude Code, Cursor, Gemini CLI, and other harnesses can affect results.
Every task combines behavioral tests with React Doctor as a verifier. These checks catch important React problems, but they cannot guarantee visual correctness and other important attributes.
Also, the benchmark primarily covers open-source React projects. Results may not generalize to proprietary codebases, different architectures, or other frontend frameworks or setups.
React Bench will publish versioned tasks, solutions, manifests, and release records so others can inspect and reproduce each evaluated task set.
Future work
We plan to compare more models, on more effort levels. Additionally, we plan to run not only on the commercial harnesses, but also on mini-swe-agent to get a more solid baseline.
We also plan to expand into visual design and other frontend frameworks and diversify the repositories and task types represented.
We’re constantly improving ReactBench. Report benchmark issues on GitHub. Model labs and coding-agent teams can reach out to evaluate models on our held-out task set, get early access to new benchmarks, or collaborate with us.
Acknowledgments
ReactBench exists because engineers and open-source maintainers contributed their time and expertise. We thank everyone who reviewed its tasks, drafts, and evaluation infrastructure.
Research
Design
External contributors
- Michał Pierzchała(React Native team)
- Jovi De Croock(Preact core team)
- Dev Agrawal(SolidJS core team)
- ryoppippi(creator of ccusage)
- Rahim Alwer(creator of Vidstack, Video.js v10 team)
- Tiger Abrodi(early Lovable team)
- Isabelle Reksopuro
Data Advisory
Parth Patel (Founding Engineer at AfterQuery)
Special thanks to the engineers who built, verified, and reviewed ReactBench’s tasks and evaluation infrastructure, and to the maintainers of the open-source repositories represented in the current task set.