PlotterBench

Can coding agents recreate financial widgets from a screenshot?

Based on reporting widgets from a proprietary financial analysis platform and framework for a private equity business, PlotterBench asks agents to rebuild a live financial chart from a screenshot. The agent has to work out the metric, time grain and reporting window from the image and express them as SQL and a chart config. We grade what the chart draws, and each task represents a distinct graph input.

Financial analytics · Multimodal

Tasks
10
Public tasks
10
Models evaluated
4
Published trials
40
Leading model
Muse Spark 1.3 ContributorOpenCode
Leading mean reward
70.9%± 7.6 pp
Mean reward
Average of task means across the task versions that match the dataset’s rules.
± SE
Standard error across task means; directional when a dataset has few tasks.
Model · harnessMean reward± SETasksTrials
Muse Spark 1.3 ContributorOpenCode70.9%Task means: 30.7%, 35.0%, 56.0%, 58.0%, 84.0%, 84.0%, 88.0%, 89.7%, 91.0%, 93.0%.7.6 pp10 / 1030
GPT 5.6 SolOpenCode59.3%Task means: 51.0%, 67.5%.8.3 pp2 / 104
gemini-3.1-pro-previewOpenCode40.8%Task means: 32.0%, 49.5%.8.8 pp2 / 104
GPT 5.6 LunaOpenCode39.0%Task means: 32.0%, 46.0%.7.0 pp2 / 102

How PlotterBench works

  1. 1 · The agent gets a screenshot

    A real reporting-pack chart, recreated in an anonymized environment. The instruction is a few sentences; house conventions live in the repo docs.

    Example target: the Net & Gross Dollar Retention chart
  2. 2 · It ships a widget definition

    One JSON object against a typed widget contract: a SQL query over the warehouse plus serializable AG Charts config. Every key the config references must come out of the query.

    {
      "widgetId": "agChart",
      "config": { "chartOptions": {
        "axes": { "y": { "label": { "format": ".0%" } }, … },
        "series": [ { "type": "line",
          "xKey": "periodLabel", "yKey": "ndr",
          "stroke": "var(--chart-series-1)",
          "appLabel": { "valueKey": "ndrLabel" } }, … ]
      } },
      "query": { "text": "with coverage as (
        -- latest month every company has actuals
        … ) select … from metrics.metric_points" }
    }
  3. 3 · Grading is what the chart draws

    Execute → Extract → Compare → Perturb

    Both definitions run against the same warehouse and are compared by what they render; then new data lands and both re-run. Below: gpt-5.6-luna scoring 0.28.

    Chart rendered from the example attempt on pe-widget-arr-waterfall-mom
    Result
    Target chart for pe-widget-arr-waterfall-mom
    Expected
Pass rate per task
Tasks05100: 100102030405060708090100median 0%

Pass rate (%) · 0.0% of 40 scored trials pass

Agent steps per task
Tasks024601020: 52030: 53040506070+median 29

Median steps per trial · 10 tasks

Trial runtime
Trials01020<5m: 10<5m5–10m: 205–10m10–15m: 610–15m15–20m: 115–20m20–25m: 120–25m25–30m30m+: 230m+median 7m

Elapsed runtime · 40 timed trials

10 of 10 tasks
Public trials
v0.1.193.0%3 attempts0 / 36m 50s
v0.1.184.0%3 attempts0 / 33m 45s
v0.1.136.3%8 attempts0 / 88m 5s
v0.1.184.0%3 attempts0 / 36m 26s
v0.1.191.0%3 attempts0 / 34m 17s
v0.1.189.7%3 attempts0 / 38m 43s
v0.1.156.8%8 attempts0 / 75m 33s
v0.1.156.0%3 attempts0 / 27m 32s
v0.1.188.0%3 attempts0 / 36m 0s
v0.1.135.0%3 attempts0 / 311m 17s