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 example
  • Fixing 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.

Models ranked by ReactBench score with average rollout cost
ModelScoreCost
GPT 5.6 Sol · MaxOpenAI47.8%$3.62
GPT 5.6 Sol · XHighOpenAI43.9%$2.32
Opus 5 · MaxAnthropic43.5%$6.47
Fable 5 · XHighAnthropic43.1%$10.45
Fable 5 · MaxAnthropic42.0%$14.07
Opus 5 · HighAnthropic40.8%$4.16
GPT 5.6 Sol · HighOpenAI40.8%$1.87
GPT 5.6 Terra · MaxOpenAI40.8%$1.36
Fable 5 · HighAnthropic40.4%$7.37
GPT 5.6 Terra · HighOpenAI38.8%$0.46
GPT 5.6 Terra · XHighOpenAI38.4%$0.73
Opus 5 · XHighAnthropic37.3%$5.34
Grok 4.6 · XHighxAI37.3%$2.37
GPT 5.6 Sol · MediumOpenAI36.5%$1.23
Grok 4.6 · HighxAI35.3%$1.88
Opus 5 · MediumAnthropic34.9%$2.45
GPT 5.6 Luna · MaxOpenAI34.9%$0.99
Fable 5 · LowAnthropic33.7%$3.71
Opus 4.8 · MaxAnthropic32.5%$7.30
Grok 4.5 · HighxAI32.5%~$0.67
GPT 5.6 Luna · HighOpenAI32.5%$0.41
GPT 5.6 Sol · LowOpenAI32.5%$0.64
Grok 4.6 · LowxAI31.0%$0.77
GPT 5.6 Luna · XHighOpenAI31.0%$0.65
Grok 4.5 · MediumxAI30.6%~$0.69
Grok 4.6 · MediumxAI30.6%$1.24
Grok 4.5 · LowxAI30.2%~$0.67
Kimi K3Kimi30.2%$2.32
Opus 4.8 · XHighAnthropic29.8%$6.19
GLM 5.2 · HighZ.ai29.8%$2.44
Sonnet 5 · MaxAnthropic29.4%$5.98
GPT 5.6 Terra · LowOpenAI29.0%$0.23
GPT 5.6 Terra · MediumOpenAI28.6%$0.28
Sonnet 5 · HighAnthropic28.2%$2.62
Opus 4.8 · HighAnthropic27.8%$4.75
GLM 5.2 · MaxZ.ai27.1%$2.65
Sonnet 5 · XHighAnthropic26.7%$3.52
Muse Spark 1.1 · MaxMeta26.3%$3.85
GLM 5.2 · XHighZ.ai26.3%$2.90
GLM 5.2 · LowZ.ai25.5%$2.51
GLM 5.2 · MediumZ.ai25.5%$2.94
Opus 4.8 · MediumAnthropic25.1%$3.92
Muse Spark 1.1 · MediumMeta24.3%$2.09
Opus 5 · LowAnthropic23.5%$1.43
Muse Spark 1.1 · HighMeta23.1%$3.75
Gemini 3.1 Pro Preview · HighGoogle22.4%$0.93
Gemini 3.5 Flash · MediumGoogle22.4%$1.67
Muse Spark 1.1 · XHighMeta22.4%$4.02
Kimi K2.7 CodeKimi22.0%$1.43
Sonnet 5 · MediumAnthropic21.6%$1.47
Gemini 3.5 Flash · HighGoogle21.2%$1.68
Gemini 3.1 Pro Preview · MediumGoogle20.4%$0.97
Gemini 3.5 Flash · XHighGoogle20%$1.73
Gemini 3.1 Pro Preview · XHighGoogle19.6%$0.89
GPT 5.6 Luna · MediumOpenAI18.8%$0.15
Opus 4.8 · LowAnthropic18.4%$1.92
Gemini 3.1 Pro Preview · MaxGoogle18.4%$0.94
Muse Spark 1.1 · LowMeta17.6%$1.01
Gemini 3.5 Flash · LowGoogle17.3%$1.17
Sonnet 5 · LowAnthropic16.9%$0.68
Composer 2.5Cursor13.3%$0.16
Gemini 3.1 Pro Preview · LowGoogle11.0%$0.35
GPT 5.6 Luna · LowOpenAI11.0%$0.07
Inkling SmallThinking Machines7.5%$0.10
Figure 2. ReactBench score (%) against average rollout cost or output tokens.

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

Fable 5
49.1
Sonnet 5
59.6
GPT-5.6 Sol
60.9
Opus 4.8
65.8
GPT-5.6 Terra
72.1
Gemini 3.1 Pro Preview
73.0
Opus 5
74.4
GPT-5.6 Luna
79.1
Kimi K3
83.0
GLM 5.2
92.7
Kimi K2.7 Code
94.1
Grok 4.5
97.3
Composer 2.5
100.7
Grok 4.6
111.7
Inkling Small
123.0
Gemini 3.5 Flash
131.5
Muse Spark 1.1
147.7
New React Doctor issues by model and category
ModelBugs per 100 trialsPerformance per 100 trialsAccessibility per 100 trialsCorrectness per 100 trialsIssues per 100 trials
Fable 546.51.70.9049.1
Sonnet 554.42.23.0059.6
GPT-5.6 Sol49.30.40.410.760.9
Opus 4.863.41.50.9065.8
GPT-5.6 Terra67.43.11.50.172.1
Gemini 3.1 Pro Preview59.93.79.5073.0
Opus 563.35.25.9074.4
GPT-5.6 Luna74.23.01.9079.1
Kimi K382.20.70083.0
GLM 5.288.62.41.60.192.7
Kimi K2.7 Code80.76.75.21.594.1
Grok 4.584.05.47.9097.3
Composer 2.583.05.911.90100.7
Grok 4.6955.78.03.0111.7
Inkling Small109.67.45.90123.0
Gemini 3.5 Flash120.72.48.30131.5
Muse Spark 1.1138.26.22.50.7147.7
Figure 3. Newly introduced graded React Doctor issues per 100 trials across 8,640 Writing React trials and 17 model families.

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.

Explore the results

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:

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

ModelPass@1
Fable 5 · Max60.7%
Opus 5 · Max56.3%
GPT 5.6 Sol · High48.1%
GPT 5.6 Terra · Max47.4%
GPT 5.6 Luna · Max43%
Opus 4.8 · Max42.2%
Kimi K341.5%
GLM 5.2 · XHigh37.8%
Grok 4.6 · Low37.8%
Sonnet 5 · High37.8%
Grok 4.5 · Low33.3%
Kimi K2.7 Code30.4%
Muse Spark 1.1 · Medium29.6%
Gemini 3.1 Pro Preview · High29.6%
Gemini 3.5 Flash · Medium26.7%
Composer 2.519.3%
Inkling Small12.6%

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

ModelPass@1
GPT 5.6 Sol · Max47.5%
Grok 4.6 · XHigh38.3%
GPT 5.6 Terra · Max33.3%
Grok 4.5 · High33.3%
Opus 5 · Max29.2%
Fable 5 · XHigh27.5%
GPT 5.6 Luna · Max25.8%
Muse Spark 1.1 · Max23.3%
GLM 5.2 · High21.7%
Opus 4.8 · Max21.7%
Sonnet 5 · Max20%
Kimi K317.5%
Gemini 3.5 Flash · Medium17.5%
Gemini 3.1 Pro Preview · High14.2%
Kimi K2.7 Code12.5%
Composer 2.56.7%
Inkling Small1.7%

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.

Figure 4. Behavioral verification and React Doctor grade the same patch independently.

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.

ReactBench task-mining funnel23,087 candidate pull requests narrow through four stages. Rejected candidates branch out at each stage until 51 tasks remain.
Figure 5. Release task-mining funnel. Intermediate counts are derived from the mining export; 51 tasks were retained. Band thickness is scaled for legibility.
  • 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

FilterRequirement
Changed codeAt least 50 changed lines
AdditionsAt least 40 added lines
React signalChanges React product code
RecencyMerged on or after February 1, 2026
Repository sizeFewer 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.

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.