Skip to content

Evaluation ​

This page defines how eyeful is evaluated. The plan is frozen in the proposal; where this page and the proposal differ, the proposal wins. The scripts in eval/ are built; the runs are still to do (Roadmap). Results will be added once the main experiment has run.

Research questions ​

Does planned multi-expert review with execution-based verification find more of the defects that matter, with less noise and with evidence a maintainer can check, than simpler LLM reviewers, and at what cost?

QuestionAsks
RQ1, detectionDoes a planned panel find more known defects, and more categories of problem, than a single agent with the same model and skills?
RQ2, noiseWhat proportion of reported findings is valid under each verification condition?
RQ3, verifiability and costHow many findings can execution reproduce and fix, how many genuine defects does it fail to confirm, and at what cost?

No direction is assumed for RQ2. If read-only findings are already mostly valid, execution's value lies in RQ3.

Datasets ​

A subject is one change with known defects, from a public benchmark. Only SWE-bench has tests that run, so it alone answers RQ3. No output is labelled by hand.

DatasetSubjectsKnown defectsAnswers
SWE-bench Verified, revertedAbout 30 tasks from seven Python projectsThe task, resolved by its own testsRQ1, RQ2, RQ3
Code Review Bench, offline50 pull requests173 comments human reviewers confirmedRQ1, RQ2
ReviewBench50 of its 219 pull requests, sampled by language from the 194 not used in developmentThe benchmark's accepted golden findingsRQ1, RQ2
  • A SWE-bench subject puts the reference fix in the base and takes it out in the change. It is built from the task's Docker image under a neutral name, with the issue text withheld, and its tests run in the task's container without a network. The seven projects are those subjects.py has a test runner for.
  • ReviewBench's 25 test pull requests are the ones eyeful was developed on and are never sampled. The 50 are allotted to each language by its share of the other 194, and picked by hash, so the sample is the same every time.
  • The datasets live under .eval/, which git ignores. A subject's description, which names the defect, is kept apart from its repository, and every review runs in a sandbox that reads only that repository. A run whose agents read outside it is excluded and counted.

Configurations and conditions ​

The configuration decides who finds. The condition decides how findings are verified.

ConfigurationRun asWho reviews
paneleyeful reviewThe planner groups the change and Go picks the experts
singleeyeful review generalistOne agent with every skill (the roster)
fixedeyeful review correctness securityTwo named experts and no planner, for the ablation
ConditionReported
noneEvery finding
read-onlyThe findings the judge does not dispute
executionThe findings reproduced or, lacking a reproduction, not disputed

The three conditions verify one archive of findings, so verification is the only thing that differs. The unit is the comment: findings merged into one problem count once. Without runnable tests execution equals read-only, so on Code Review Bench and ReviewBench only read-only and none are compared.

Procedure ​

The design is within-subject. Every subject is reviewed by the panel and by the single agent, three times each. Execution runs first and the other conditions reuse its findings. The fixed configuration runs once, on SWE-bench and Code Review Bench, and is compared with the panel's first run. That is about 860 reviews. A review that fails is retried up to three times.

Every agent and judge uses DeepSeek V4.1 Flash, the benchmarks' official judges included, so the results are internal comparisons, not leaderboard scores. Prompts, budgets and this plan are fixed before the main experiment starts.

Measures and analysis ​

Each dataset's own scorer decides whether a finding is valid:

DatasetA known defect is found whenScored by
SWE-benchthe official harness resolves the task with the fix agent's fix for a reported finding: its FAIL_TO_PASS and PASS_TO_PASS tests passresolve.py
Code Review Benchthe benchmark's judge matches a finding to the golden comment, under its default Core profilematch.py
ReviewBenchthe benchmark's judge matches a finding to the golden finding; its classifier also credits valid unmatched onesreviewbench.py
QuestionMeasureAnalysis
RQ1Recall: a known defect counts when two of a configuration's three runs find it. Categories found, in each benchmark's own labelsMcNemar's exact test
RQ2Precision: the share of reported findings that resolve the SWE-bench task or match a Code Review Bench golden comment; ReviewBench's augmented precisionPaired bootstrap over subjects
RQ3Verifiable rate: executed findings whose reproduction passes all six gates. Verification loss: findings that resolve a SWE-bench task but execution does not confirm. Tokens, money, secondsBootstrap over subjects

The panel is also compared with the union of the single agent's three runs, which costs about as much as one panel run. Every estimate carries a 95% interval from 10,000 resamples of whole subjects.

Ablations ​

A part whose removal changes nothing measured is removed from eyeful.

RemovedRun asExpected effect
The plannerThe fixed configuration, against the panel's first runRecall on mixed changes drops, or nothing changes
Oracle gradingThe archived reproductions rescored with every one allowed to blockMore findings block, and their precision drops

Threats to validity ​

  • The LLM judges may be lenient.
  • The golden sets are incomplete, so precision is a lower bound.
  • One model is reviewer, judge and scorer.
  • SWE-bench's projects predate the model's cut-off, so the model may know the issue, and on a reverted subject the removed code is in the diff.
  • RQ3 rests on about 30 Python subjects.

Tooling ​

The scripts in eval/ use only Python's standard library. resolve.py runs SWE-bench's harness with uv, and match.py and ReviewBench's judge run from the benchmarks' own checkouts. mise run test runs the scripts' tests.

ScriptDoes
subjects.pyBuilds subjects from SWE-bench rows or Code Review Bench's golden comments
reviewbench.pyBuilds the ReviewBench sample, hands each review's reported comments to the benchmark's judge, reads its scores
run.pyReviews each subject with eyeful: each configuration finds, then the conditions verify
confine.pyStarts pi in a macOS sandbox that reads the repository under review and nothing else of the user's
audit.pyLists what a reviewer's agents opened outside the repository
resolve.pyRuns each fix through SWE-bench's harness and scores the SWE-bench reviews
match.pyRuns Code Review Bench's judge on the reviews and scores them under the Core profile
analyze.pyComputes the measures from the reviews and the scores, one dataset at a time
revmux.pyReviews each subject with revmux, an optional extension scored on Code Review Bench