Skip to content

Add gx and gx-pro to the offline benchmark - #1

Open
joelachance wants to merge 1 commit into
mainfrom
gx-submission
Open

Add gx and gx-pro to the offline benchmark#1
joelachance wants to merge 1 commit into
mainfrom
gx-submission

Conversation

@joelachance

@joelachance joelachance commented Aug 21, 2026

Copy link
Copy Markdown

Adds two entries for gx, an AI code review CLI. This PR targets our own fork for review — it is not the submission to withmartian.

Submission requirements

  • Fork all 50 benchmark PRs into a GitHub organization — satoricorp-benchmarks, one repo per PR per entry, under the naming convention step1_download_prs.py parses.
  • Let gx review every PR — 100 PRs, 383 review comments.
  • Add gx to the download configuration — both entries added to _NON_BOT_TOOLS, since gx posts under a user account rather than a GitHub App.
  • Generate dashboard results — candidates, dedup groups, evaluations for all three judges, plus regenerated dashboard JSON and HTML.

Entries

Two entries, following the existing convention for multiple configurations (qodo-v2 / qodo-extended-v2, greptile-v4-1 / greptile-v5):

entry configuration
gx full-coverage configuration
gx-pro higher-precision configuration

Every finding is verified before it is reported.

Results — all three judges

Core profile, the dashboard default:

judge entry precision recall F1
sonnet-4.5 gx 38.6% 57.0% 46.0
sonnet-4.5 gx-pro 47.7% 46.8% 47.3
opus-4.5 gx 41.2% 57.6% 48.0
opus-4.5 gx-pro 49.7% 44.9% 47.2
gpt-5.2 gx 34.3% 55.1% 42.2
gpt-5.2 gx-pro 43.6% 45.6% 44.6

On the 66 Critical and High severity goldens, gx finds 43 and gx-pro 38.

Reproducible from the forks

benchmark_data.json can be regenerated rather than taken on trust:

uv run python -m code_review_benchmark.step1_download_prs \
    --org satoricorp-benchmarks --tool gx

Repos are named as the parser expects, with each entry's reviews on PR #1:

keycloak__keycloak__gx__PR37429__20260823
cal_dot_com__cal.com__gx-pro__PR8087__20260823

Verified: all 100 repo names round-trip through parse_repo_namefind_golden_url to the correct golden entry, and live comment counts match the submitted data exactly (383/383, zero mismatches).

No repository-specific configuration was used: none of the five benchmark repos carries a REVIEW.md, so every review reflects gx's defaults.

One bug found along the way

find_golden_url matches by substring:

if f"/{original_repo}/pull/{pr_number}" in url:

/discourse-graphite/pull/1 is a substring of /discourse-graphite/pull/10, so a repo named …__PR1__… can resolve to PR 10's golden set. It is correct today only because pull/1 precedes pull/10 in the golden file; reordering that file silently mis-scores. An anchored match would fix it. Not touched here — happy to send it separately.

What's in the diff

Same file set as withmartian#20, the maintainer's own tool-addition PR, plus the _NON_BOT_TOOLS entry:

  • offline/README.md — one vendor row
  • offline/code_review_benchmark/step1_download_prs.py_NON_BOT_TOOLS
  • offline/analysis/benchmark_dashboard.pyTOOL_COLORS and TOOL_DISPLAY_NAMES
  • offline/analysis/benchmark_dashboard.{html,json} — regenerated
  • offline/results/benchmark_data.json and <judge>/{candidates,dedup_groups,evaluations}.json for all three judges

Both entries went through step 2.5 dedup.

Integrity

  • Stripping gx and gx-pro from benchmark_data.json, candidates.json, and evaluations.json reproduces origin/main exactly, for all three judges — verified programmatically.
  • Regenerating the dashboard changes no existing tool's metrics. Remaining churn in benchmark_dashboard.json is key ordering, which the generator does not preserve.
  • JSON files are written in each file's own upstream serialization style, so benchmark_data.json is an additions-only diff.
  • ruff check clean, pytest tests/ 28 passed.

@joelachance joelachance changed the title Add gx to the offline benchmark Add gx and gx-pro to the offline benchmark Aug 22, 2026
@joelachance joelachance changed the title Add gx and gx-pro to the offline benchmark Add gx and gx-extended to the offline benchmark Aug 22, 2026
@joelachance joelachance changed the title Add gx and gx-extended to the offline benchmark Add gx and gx-pro to the offline benchmark Aug 22, 2026
@joelachance
joelachance force-pushed the gx-submission branch 2 times, most recently from e1acf1f to aa89043 Compare August 23, 2026 02:50
@joelachance

joelachance commented Aug 23, 2026

Copy link
Copy Markdown
Author

Icon for gx / gx-pro

gx

Every entry on the leaderboard carries a mark, so here's ours. One icon covers both entries, the way qodo / qodo-extended and greptile-v4-1 / greptile-v5 share theirs.

Inline SVG, ~1.1 KB, same shape as the other entries (width="20" height="20", single viewBox, one path, no external references):

<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 512 512" fill="none" role="img" aria-label="gx" class="shrink-0"><rect width="512" height="512" fill="#0A0A0A"/><path fill="#FAFAFA" d="M109.8 352.5Q109.8 341.3 113.9 330.9Q118.1 320.5 126 312.2L169.3 267.6Q174.3 262.7 174.3 256Q174.3 249.3 169.3 244.4L126 200.3Q108.1 182.4 108.1 159.1Q108.1 135.8 126 120.4Q143.1 103.3 165.9 103.3Q177.2 103.3 187.6 107.7Q198 112.1 206.3 120.4L241.2 155.3Q247.5 161.6 256.2 161.6Q264.9 161.6 271.2 155.3L306.1 120.4Q314.4 112.1 324.8 107.7Q335.2 103.3 346.5 103.3Q357.7 103.3 368.1 107.7Q378.5 112.1 386.4 120.4Q403.9 138.3 403.9 159.9Q403.9 171.1 399.1 181.7Q394.3 192.4 386.4 200.3L342.7 243.9Q337.7 248.9 337.7 256Q337.7 263.1 342.7 268.1L386.4 312.2Q394.7 320.1 398.9 330.5Q403.1 340.9 403.1 352.1Q403.1 375.4 386.4 392Q378.5 399.9 368.1 404.3Q357.7 408.7 346.5 408.7Q335.7 408.7 325.1 404.3Q314.4 399.9 306.1 392L271.2 357.1Q264.9 350.8 256.2 350.8Q247.5 350.8 241.2 357.1L206.3 392Q198 400.4 187.6 404.5Q177.2 408.7 166.4 408.7Q142.6 408.7 126 392Q118.1 384.1 113.9 373.7Q109.8 363.3 109.8 352.5Z"/></svg>

Or as a base64 data URI, ready to drop in:

data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iZ3giIGNsYXNzPSJzaHJpbmstMCI+PHJlY3Qgd2lkdGg9IjUxMiIgaGVpZ2h0PSI1MTIiIGZpbGw9IiMwQTBBMEEiLz48cGF0aCBmaWxsPSIjRkFGQUZBIiBkPSJNMTA5LjggMzUyLjVRMTA5LjggMzQxLjMgMTEzLjkgMzMwLjlRMTE4LjEgMzIwLjUgMTI2IDMxMi4yTDE2OS4zIDI2Ny42UTE3NC4zIDI2Mi43IDE3NC4zIDI1NlExNzQuMyAyNDkuMyAxNjkuMyAyNDQuNEwxMjYgMjAwLjNRMTA4LjEgMTgyLjQgMTA4LjEgMTU5LjFRMTA4LjEgMTM1LjggMTI2IDEyMC40UTE0My4xIDEwMy4zIDE2NS45IDEwMy4zUTE3Ny4yIDEwMy4zIDE4Ny42IDEwNy43UTE5OCAxMTIuMSAyMDYuMyAxMjAuNEwyNDEuMiAxNTUuM1EyNDcuNSAxNjEuNiAyNTYuMiAxNjEuNlEyNjQuOSAxNjEuNiAyNzEuMiAxNTUuM0wzMDYuMSAxMjAuNFEzMTQuNCAxMTIuMSAzMjQuOCAxMDcuN1EzMzUuMiAxMDMuMyAzNDYuNSAxMDMuM1EzNTcuNyAxMDMuMyAzNjguMSAxMDcuN1EzNzguNSAxMTIuMSAzODYuNCAxMjAuNFE0MDMuOSAxMzguMyA0MDMuOSAxNTkuOVE0MDMuOSAxNzEuMSAzOTkuMSAxODEuN1EzOTQuMyAxOTIuNCAzODYuNCAyMDAuM0wzNDIuNyAyNDMuOVEzMzcuNyAyNDguOSAzMzcuNyAyNTZRMzM3LjcgMjYzLjEgMzQyLjcgMjY4LjFMMzg2LjQgMzEyLjJRMzk0LjcgMzIwLjEgMzk4LjkgMzMwLjVRNDAzLjEgMzQwLjkgNDAzLjEgMzUyLjFRNDAzLjEgMzc1LjQgMzg2LjQgMzkyUTM3OC41IDM5OS45IDM2OC4xIDQwNC4zUTM1Ny43IDQwOC43IDM0Ni41IDQwOC43UTMzNS43IDQwOC43IDMyNS4xIDQwNC4zUTMxNC40IDM5OS45IDMwNi4xIDM5MkwyNzEuMiAzNTcuMVEyNjQuOSAzNTAuOCAyNTYuMiAzNTAuOFEyNDcuNSAzNTAuOCAyNDEuMiAzNTcuMUwyMDYuMyAzOTJRMTk4IDQwMC40IDE4Ny42IDQwNC41UTE3Ny4yIDQwOC43IDE2Ni40IDQwOC43UTE0Mi42IDQwOC43IDEyNiAzOTJRMTE4LjEgMzg0LjEgMTEzLjkgMzczLjdRMTA5LjggMzYzLjMgMTA5LjggMzUyLjVaIi8+PC9zdmc+

Raw files, if that's easier:

They live on the assets branch of this fork, deliberately outside the submission diff.

Flat #0A0A0A background, matching our own favicon. Happy to send a rounded-corner variant if you'd rather it match Cubic's or Greptile's.

@joelachance
joelachance force-pushed the gx-submission branch 2 times, most recently from b05c6f5 to a4eab3d Compare August 24, 2026 02:57
joelachance added a commit that referenced this pull request Aug 24, 2026
gx is an AI code review CLI. Two entries, matching how it ships:

  gx      two independent Claude Opus 4.6 passes, findings merged
  gx-pro  a single, more selective pass

Both verify every finding through gx's own Claude Haiku 4.5 verification
stage before reporting it.

Scored through the documented pipeline (extract, dedup, judge) on all three
judge models. Core profile, the dashboard default:

                  gx                      gx-pro
              prec  recall    F1      prec  recall    F1
  sonnet-4.5  38.6%  57.0%   46.0     47.7%  46.8%   47.3
  opus-4.5    41.2%  57.6%   48.0     49.7%  44.9%   47.2
  gpt-5.2     34.3%  55.1%   42.2     43.6%  45.6%   44.6

The two trade coverage against precision. On the 66 Critical and High
severity goldens, gx finds 43 and gx-pro 38.

Both entries follow the documented "adding a new tool" flow. The benchmark
PRs are forked one repo per PR per tool under the naming convention
step1_download_prs.py expects, with the reviews posted on PR #1 of each:

  https://github.com/satoricorp-benchmarks

100 repos, 100 PRs, 383 review comments. To regenerate benchmark_data.json
from scratch:

  uv run python -m code_review_benchmark.step1_download_prs \
      --org satoricorp-benchmarks --tool gx

gx posts under a user account rather than a GitHub App, so both entries are
added to _NON_BOT_TOOLS alongside claude.

No repository-specific configuration was used: none of the five benchmark
repos carries a REVIEW.md, so every review reflects gx's defaults.

Dashboard artifacts are regenerated with `python -m analysis.benchmark_dashboard`.
No existing tool's metrics change; the two new entries are the only additions.
gx is an AI code review CLI. Two entries, matching the two configurations
it ships with:

  gx      full-coverage configuration
  gx-pro  higher-precision configuration

Every finding is verified before it is reported.

Scored through the documented pipeline (extract, dedup, judge) on all three
judge models. Core profile, the dashboard default:

                  gx                      gx-pro
              prec  recall    F1      prec  recall    F1
  sonnet-4.5  38.6%  57.0%   46.0     47.7%  46.8%   47.3
  opus-4.5    41.2%  57.6%   48.0     49.7%  44.9%   47.2
  gpt-5.2     34.3%  55.1%   42.2     43.6%  45.6%   44.6

The two trade coverage against precision. On the 66 Critical and High
severity goldens, gx finds 43 and gx-pro 38.

Both entries follow the documented "adding a new tool" flow. The benchmark
PRs are forked one repo per PR per tool under the naming convention
step1_download_prs.py expects, with the reviews posted on PR #1 of each:

  https://github.com/satoricorp-benchmarks

100 repos, 100 PRs, 383 review comments. To regenerate benchmark_data.json
from scratch:

  uv run python -m code_review_benchmark.step1_download_prs \
      --org satoricorp-benchmarks --tool gx

gx posts under a user account rather than a GitHub App, so both entries are
added to _NON_BOT_TOOLS alongside claude.

No repository-specific configuration was used: none of the five benchmark
repos carries a REVIEW.md, so every review reflects gx's defaults.

Dashboard artifacts are regenerated with `python -m analysis.benchmark_dashboard`.
No existing tool's metrics change; the two new entries are the only additions.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant