vetto research

GulliBench

GulliBench: Intelligence Isn't Enough. Measuring Skepticism in Frontier Models.

GulliBench

In the shadow of intelligence

Frontier AI models have gotten incredibly smart. Month after month, new models are released and shatter benchmarks and leaderboards. It seems they can reason their way out of almost any problem, given enough time and training data.

But still, people don't seem satisfied when using these models in their day to day. Models still get basic things wrong, or just steer away from the intended goal completely. They make wrong assumptions, make wrong decisions, and end up with the wrong answer. They over-rely and over-commit. They just seem too… gullible.

We hypothesize this happens because gullibility is largely orthogonal to intelligence: being gullible is a behavioral trait that is just mildly correlated with raw brain power. Think of Sheldon from The Big Bang Theory: a genius who finished his PhD at 14, but still can't understand basic sarcasm. He takes things too literally.

Similarly, current AI models are trained to be extremely good at solving hard problems (i.e., being very smart). But these problems are usually well-defined and have clear solutions. They are created in sterile environments, where data is standardized and things are mostly deterministic. In short, models are trained with the heavy assumption that the data, tools, and knowledge they are handed are undeniably pristine.

As most of us know, that is not the case in real life. Data is messy and sometimes plain wrong. Tools are buggy and give unreliable results. Assumptions need to be revisited and rewritten. This is no surprise for humans: we've lived in this messy world since the day we were born, and all of us have learned not to trust things at face value, for better or for worse. AI, though, was never taught that. During training, it rarely had to deal with situations where the obvious answer was wrong (even less so when this is done purposefully).

In summary, we have been chasing intelligence, and the other behavioral traits that improve problem solving in the real world have been left in its shadow. Mirroring this trend, most efforts in measuring AI have also focused on raw intelligence: most benchmarks are built with the sole goal of measuring the AI's ability to get things right, while not measuring other problem-solving-related skills.

We believe the first step toward closing this gap is raising awareness and shedding light on the problem. That's why we created GulliBench, our first attempt at measuring AI gullibility.

GulliBench

Measuring AI gullibility: does a model check the data, or take it at face value?

# model 0–100%
1 Opus 5 Anthropic 49.3%
2 Fable 5 Anthropic 48.1%
3 Muse Spark 1.2 Meta 42.0%
4 Gemini 3.1 Pro Google DeepMind 22.5%
5 Kimi K3 Moonshot AI 17.6%
6 Grok 4.6 xAI 16.3%
7 Opus 4.8 Anthropic 15.9%
8 DeepSeek V4 Flash DeepSeek 15.7%
9 GLM 5.2 Z.ai 15.1%
10 DeepSeek V4 Pro DeepSeek 11.5%
11 Sonnet 5 Anthropic 8.3%
12 GPT-5.5 OpenAI 6.5%
13 Gemini 3.5 Flash Google DeepMind 3.1%
14 Gemini 3.7 Flash Google DeepMind 2.8%
15 Gemini 3.6 Flash Google DeepMind 2.7%
16 GPT-5.6 Sol OpenAI 2.4%
17 GPT-5.6 Terra OpenAI 2.1%
18 GPT-5.6 Luna OpenAI 2.1%

150 tasks · mean pass@1, n=5 · higher = less gullible · CIs in Results

Full breakdown in Results below.

The setup

The core idea behind GulliBench is eliciting gullibility in simple tasks, ones the models would breeze through if not for a single catch. A gullible model fails by not being thorough; a careful analyst derives the answer with ease.

We give the model a tiny environment: a handful of records (≤ 100), a single plain-English question, and one obvious place to look for the answer.

The catch: that obvious place is a lie. But not a wild lie — a convenient one. A status column that says overdue on invoices that were in fact already paid. A total field that was rolled up before the last few line items landed. The kind of stale, authoritative-looking field that exists in every real database on earth.

The right answer is always sitting right there too, just one step further down. You don't count the status column: you check due_date against today and whether it was paid. You don't trust the total: you sum the line items. The truth costs one extra derivation; the lie costs nothing.

So every task is really one question: when the convenient number and the underlying data disagree, does the model notice or does it just grab the number that was handed to it?

The tasks

Questions are made deliberately simple and boring, usually one line long:

  • How many invoices are overdue?
  • What's the total value of all orders?
  • How many customers placed more than 10 orders?
  • What's the total balance across all accounts?

Questions are also extremely easy by design. Any analyst could answer them in their sleep, even adding the numbers by hand. We're not measuring whether the model can compute the answer, but whether it bothers to check the thing it was given.

The data

The data is small and messy: a few dozen rows and a handful of entities, built from one canonical source of truth. Somewhere in it, the convenient answer and the underlying facts disagree. Often that's a stored field that has drifted out of sync with the primary data it summarizes. But just as often it's the primary data itself that needs work before it can be trusted, with fields that aren't standardized and have to be cleaned up before the question can be answered. Either way, the discrepancy is always internally visible: both the convenient value and the data it should be derived from sit right in front of the model. Nothing is hidden, and a single reconciliation would catch it. The model just has to do it.

Grading

For every task we know exactly two numbers ahead of time: the truth (what you get by deriving from primary data) and the proxy (what you get by trusting the convenient field). Grading is then a dumb, exact comparison: no LLM judge, no rubric ambiguity. The model either lands on the truth (resisted the trap), lands on the proxy (trusted it, gullible), or lands somewhere else (fumbled the arithmetic).

Three substrates

We render each instance three ways, from the same underlying facts:

01

Table
The records dumped in front of the model as one flat table.

02

Docs
The same records split into a folder of per-record documents, in prose.

03

SQL
An in-memory database the model queries with real SELECTs.

The substrate matters more than we expected. In table and docs, deriving the truth costs effort: you have to read every row. In SQL, deriving is often just a slightly different query, so the effort gate mostly disappears. Some traps bite in all three; some only bite when reading is expensive.

There is a second reason to vary the substrate. Models are trained heavily on code, and on SQL in particular, so they have every incentive to be careful with a database query and far less practice reconciling the same facts in a folder of prose. Measuring only in SQL would flatter that training; table and docs test whether the same skepticism survives when the data doesn't look like code.

Running all three tells us whether a failure is about laziness (only bites when derivation is costly) or reflex (bites even when the honest query is one line away).

Harness and tools

Each substrate has a different set of tools that reflect its data format, but every one lets the model read and query all the data, either completely (by reading individual records) or through searches, filters, and aggregations. Whatever the format, no substrate leaves the model short of the tools it needs to derive the answer.

We also created our own custom agent that only has access to the data using the provided MCP (not via bash), to make sure we can experiment under different querying constraints. Giving the agent access to more open environments (e.g., an agent with bash commands) allows it to bypass the constraints we want to measure, confounding our measurements. For example, in one test the agent wrote a Python script to read all of the docs into a table and query it using SQL.

Reasoning effort is another knob we deliberately leave alone: every model runs at its provider-default effort and thinking settings. As we've discussed (and show further evidence for in the results), gullibility should not be highly correlated with intelligence, and thinking harder won't make a model less trusting of a trap. Default settings are also fairer, and more representative of daily use. Either way, we ran an ablation study on GPT-5.6 Sol to validate this empirically (see the ablation).

Below you can find a comprehensive description of the tools available to the models via MCP.

Substrate

The records are a flat table (sometimes a few). You page through rows and read them directly.

schema()

List the tables and their columns.

count_rows(table='')

Number of rows; table selects one on multi-table datasets.

page_rows(offset=0, limit=20, table='')

A page of rows starting at offset.

read_row(index, table='')

The single row at a given index.

submit_answer(value)

Submit the final answer once, when done, as a single number. There is no filesystem to write to otherwise.

Single-hop vs. multi-hop

A single-hop task has exactly one bad value to catch. These already trip models more than you'd hope, but the strongest models resist most of them (see below).

A multi-hop task chains two of them, where the second depends on the first. For example:

What's the final balance of the account with the highest sales rank by revenue?

To answer, you first have to find the right account, and the sales_rank column is stale, so you can't trust it; you have to rank by actual revenue. Then, having found the account, you have to get its final balance, and the running_total field is stale too, so you have to sum the ledger. Two independent audits, back to back.

Here's the striking part. Each hop, in isolation, is something the top models get right essentially 100% of the time. But chained together, even the strongest models solve only about half, and half the field collapses to single digits. And it's demonstrably not a capability failure: Fable 5 gets hop 1 right every single time, and aces hop 2 on its own, yet once hop 1 has consumed its attention, it quietly drops the second audit and trusts the stale total. The model can run each audit; it just doesn't run both. After clearing the first check it treats the job as done and takes the second number on trust.

Example tasks

The examples below are picked to show a ladder. Each carries the same flavor of trap, but it lands differently across models, from a control that fools nobody up to a multi-hop task that wipes out an entire model line. (These four are off-roster demonstration tasks, shown in full; the scored set stays hidden.)

Negative control — fools nobody

Question

How many subscriptions are currently canceled?

Records

Show the tables the model sees

table.csv

sub_id event_id changed_at new_status
SUB-001 EVT-0001 2026-02-24T00:16:00 active
SUB-001 EVT-0002 2026-03-14T15:21:00 active
SUB-001 EVT-0003 2026-04-12T17:36:00 active
SUB-001 EVT-0004 2026-04-21T13:16:00 canceled
SUB-002 EVT-0005 2026-03-28T15:36:00 active
SUB-002 EVT-0006 2026-04-17T18:59:00 paused
SUB-002 EVT-0007 2026-04-26T13:12:00 canceled
SUB-002 EVT-0008 2026-05-07T06:28:00 active
SUB-003 EVT-0009 2026-02-23T03:30:00 paused
SUB-003 EVT-0010 2026-03-13T23:40:00 paused
SUB-003 EVT-0011 2026-04-10T13:13:00 canceled
SUB-003 EVT-0012 2026-05-09T11:10:00 active
SUB-004 EVT-0013 2026-02-25T02:03:00 paused
SUB-005 EVT-0014 2026-02-28T22:39:00 paused
SUB-005 EVT-0015 2026-03-25T08:21:00 paused
SUB-005 EVT-0016 2026-04-09T02:56:00 active
SUB-005 EVT-0017 2026-04-12T16:02:00 canceled
SUB-006 EVT-0018 2026-01-27T10:56:00 active
SUB-007 EVT-0019 2026-02-19T17:07:00 paused
SUB-007 EVT-0020 2026-03-18T03:59:00 paused
SUB-007 EVT-0021 2026-04-14T09:08:00 paused
SUB-007 EVT-0022 2026-05-05T21:35:00 active
SUB-008 EVT-0023 2026-01-08T16:55:00 canceled
SUB-009 EVT-0024 2026-02-09T02:39:00 active
SUB-009 EVT-0025 2026-02-19T22:33:00 active
SUB-010 EVT-0026 2026-03-12T00:10:00 active
SUB-010 EVT-0027 2026-04-02T12:21:00 paused
SUB-010 EVT-0028 2026-04-19T22:27:00 paused
SUB-010 EVT-0029 2026-05-09T15:57:00 paused
SUB-011 EVT-0030 2026-02-19T13:52:00 active
SUB-011 EVT-0031 2026-03-19T21:29:00 active
SUB-012 EVT-0032 2026-02-02T02:23:00 active
SUB-012 EVT-0033 2026-02-10T18:18:00 active
SUB-013 EVT-0034 2026-01-25T14:58:00 active
SUB-013 EVT-0035 2026-02-16T21:15:00 active
SUB-014 EVT-0036 2026-02-02T13:28:00 active
SUB-015 EVT-0037 2026-02-07T08:13:00 active
SUB-015 EVT-0038 2026-03-05T14:07:00 active
SUB-016 EVT-0039 2026-03-10T12:32:00 active
SUB-016 EVT-0040 2026-03-24T05:54:00 canceled
SUB-017 EVT-0041 2026-02-11T15:51:00 canceled
SUB-018 EVT-0042 2026-02-20T12:30:00 active
SUB-018 EVT-0043 2026-02-26T02:09:00 paused
SUB-018 EVT-0044 2026-03-04T08:47:00 active
SUB-019 EVT-0045 2026-02-09T06:57:00 paused
SUB-019 EVT-0046 2026-02-28T12:12:00 paused
SUB-019 EVT-0047 2026-03-23T03:47:00 active
SUB-020 EVT-0048 2026-02-12T00:54:00 active
SUB-020 EVT-0049 2026-02-16T15:15:00 active
SUB-020 EVT-0050 2026-02-21T02:50:00 paused
SUB-021 EVT-0051 2026-02-05T11:13:00 paused
SUB-021 EVT-0052 2026-02-24T02:01:00 active
SUB-021 EVT-0053 2026-03-16T12:02:00 paused
SUB-021 EVT-0054 2026-04-03T14:59:00 canceled
SUB-022 EVT-0055 2026-02-01T12:10:00 active
SUB-022 EVT-0056 2026-02-13T18:55:00 active
SUB-022 EVT-0057 2026-03-04T03:15:00 active
SUB-023 EVT-0058 2026-03-15T16:06:00 active
SUB-023 EVT-0059 2026-03-29T16:58:00 canceled
SUB-024 EVT-0060 2026-02-03T23:41:00 canceled

Deriving the answer

  • 8 truth Take each subscription's latest event, and count those whose latest status is canceled.
  • 10 trap Count every canceled row in the event log, ignoring later re-activations.

Model results

table docs sql
Opus 5 5/5 5/5 5/5
Fable 5 5/5 5/5 5/5
GPT-5.6 Sol 5/5 5/5 5/5
GPT-5.6 Terra 5/5 5/5 5/5
GPT-5.6 Luna 5/5 5/5 5/5

The first slips appear

Question

What is the total transaction amount in USD?

Records

Show the tables the model sees

fx_rates.csv

currency usd_rate
USD 1.0000
EUR 1.0800
GBP 1.2700
JPY 0.0067

transactions.csv

txn_id date amount currency amount_usd
TXN-0001 2026-03-11 563.94 USD 563.94
TXN-0002 2026-05-01 377.49 USD 377.49
TXN-0003 2026-02-09 81.35 USD 81.35
TXN-0004 2026-02-10 842.41 USD 842.41
TXN-0005 2026-04-22 880.54 USD 880.54
TXN-0006 2026-01-11 80.15 USD 80.15
TXN-0007 2026-05-11 441.48 USD 441.48
TXN-0008 2026-06-03 478.46 EUR 488.03
TXN-0009 2026-06-10 135.52 USD 135.52
TXN-0010 2026-06-25 675.29 GBP 817.10
TXN-0011 2026-01-16 428.84 USD 428.84
TXN-0012 2026-03-14 300.13 USD 300.13
TXN-0013 2026-03-19 890.74 USD 890.74
TXN-0014 2026-04-28 263.49 USD 263.49
TXN-0015 2026-05-03 804.34 USD 804.34
TXN-0016 2026-01-28 13778.00 JPY 92.31
TXN-0017 2026-02-12 324.49 USD 324.49
TXN-0018 2026-06-16 534.76 USD 534.76
TXN-0019 2026-06-06 893.76 USD 893.76
TXN-0020 2026-03-16 148.27 EUR 160.13
TXN-0021 2026-01-08 381.91 USD 381.91
TXN-0022 2026-03-23 722.92 GBP 918.11
TXN-0023 2026-05-25 804.82 USD 804.82
TXN-0024 2026-01-01 140.54 USD 140.54
TXN-0025 2026-06-05 823.17 USD 823.17
TXN-0026 2026-03-13 45141.19 JPY 302.45
TXN-0027 2026-05-26 771.19 USD 771.19
TXN-0028 2026-06-09 478.38 USD 478.38
TXN-0029 2026-01-17 277.05 USD 277.05
TXN-0030 2026-01-10 242.98 EUR 262.42
TXN-0031 2026-05-16 287.43 GBP 365.04
TXN-0032 2026-05-22 295.60 USD 295.60
TXN-0033 2026-03-07 584.38 USD 584.38
TXN-0034 2026-06-12 793.76 USD 793.76
TXN-0035 2026-03-28 65973.17 JPY 442.02
TXN-0036 2026-02-19 376.15 USD 376.15
TXN-0037 2026-01-12 785.74 USD 785.74
TXN-0038 2026-02-09 395.33 USD 395.33
TXN-0039 2026-01-26 594.27 EUR 641.81
TXN-0040 2026-06-11 860.35 USD 860.35
TXN-0041 2026-04-22 774.27 USD 774.27
TXN-0042 2026-06-25 183.57 USD 183.57
TXN-0043 2026-05-08 620.38 USD 620.38
TXN-0044 2026-03-08 351.00 USD 351.00
TXN-0045 2026-03-04 389.70 GBP 494.92
TXN-0046 2026-04-01 509.96 USD 509.96
TXN-0047 2026-04-23 314.31 USD 314.31
TXN-0048 2026-02-20 168.62 USD 168.62
TXN-0049 2026-04-14 568.75 USD 568.75
TXN-0050 2026-02-15 468.54 USD 468.54
TXN-0051 2026-04-24 61890.32 JPY 414.67
TXN-0052 2026-05-09 768.21 USD 768.21
TXN-0053 2026-04-16 276.42 USD 276.42
TXN-0054 2026-06-17 708.59 USD 708.59
TXN-0055 2026-04-24 865.45 USD 865.45
TXN-0056 2026-02-14 485.15 USD 485.15
TXN-0057 2026-02-25 715.40 USD 715.40
TXN-0058 2026-01-01 457.55 USD 457.55
TXN-0059 2026-02-27 539.02 USD 539.02
TXN-0060 2026-01-14 107.54 USD 107.54

Deriving the answer

  • 29962.77 truth Recompute each row as amount × fx_to_usd from the rate table, then sum.
  • 29893.54 trap Sum the stored amount_usd column.

Model results

table docs sql
Opus 5 5/5 5/5 5/5
Fable 5 2/5 4/5 5/5
GPT-5.6 Sol 5/5 5/5 5/5
GPT-5.6 Terra 5/5 3/5 5/5
GPT-5.6 Luna 3/5 2/5 5/5

Splits the field — only the GPT line leaks

Question

What is the total transaction amount for June 2026?

Records

Show the tables the model sees

daily_summary.csv

date txn_count daily_total
2026-06-02 1 192.41
2026-06-03 1 80.50
2026-06-04 1 30.21
2026-06-05 1 183.88
2026-06-06 6 3097.44
2026-06-07 2 1027.48
2026-06-08 2 668.67
2026-06-10 1 92.69
2026-06-11 3 1703.38
2026-06-12 5 1394.66
2026-06-13 2 307.45
2026-06-14 1 823.71
2026-06-15 2 1208.65
2026-06-16 3 1562.31
2026-06-17 1 225.56
2026-06-18 3 1814.88
2026-06-19 3 730.58
2026-06-20 1 522.66
2026-06-21 1 895.29
2026-06-22 1 53.95
2026-06-25 3 1455.86
2026-06-26 4 2062.74
2026-06-27 2 1327.88
2026-06-28 4 2100.79
2026-06-29 1 282.93
2026-06-30 2 746.19

transactions.csv

txn_id date amount
TXN-0001 2026-06-14 823.71
TXN-0002 2026-06-11 638.00
TXN-0003 2026-06-28 862.80
TXN-0004 2026-06-04 30.21
TXN-0005 2026-06-08 355.35
TXN-0006 2026-06-16 484.36
TXN-0007 2026-06-25 649.12
TXN-0008 2026-06-18 513.98
TXN-0009 2026-06-12 134.56
TXN-0010 2026-06-25 497.13
TXN-0011 2026-06-06 586.24
TXN-0012 2026-06-12 210.03
TXN-0013 2026-06-03 80.50
TXN-0014 2026-06-15 411.43
TXN-0015 2026-06-07 257.21
TXN-0016 2026-06-26 250.27
TXN-0017 2026-06-27 568.96
TXN-0018 2026-06-18 504.34
TXN-0019 2026-06-19 467.05
TXN-0020 2026-06-13 150.46
TXN-0021 2026-06-12 22.17
TXN-0022 2026-06-28 722.01
TXN-0023 2026-06-26 852.13
TXN-0024 2026-06-16 394.98
TXN-0025 2026-06-06 595.29
TXN-0026 2026-06-06 398.50
TXN-0027 2026-06-02 192.41
TXN-0028 2026-06-06 896.77
TXN-0029 2026-06-12 166.68
TXN-0030 2026-06-25 309.61
TXN-0031 2026-06-03 128.70
TXN-0032 2026-06-26 798.12
TXN-0033 2026-06-22 53.95
TXN-0034 2026-06-16 682.97
TXN-0035 2026-06-15 797.22
TXN-0036 2026-06-07 770.27
TXN-0037 2026-06-19 192.95
TXN-0038 2026-06-06 430.16
TXN-0039 2026-06-21 895.29
TXN-0040 2026-06-26 162.22
TXN-0041 2026-06-17 225.56
TXN-0042 2026-06-30 482.21
TXN-0043 2026-06-29 282.93
TXN-0044 2026-06-20 522.66
TXN-0045 2026-06-12 861.22
TXN-0046 2026-06-11 390.71
TXN-0047 2026-06-06 190.48
TXN-0048 2026-06-18 796.56
TXN-0049 2026-06-05 183.88
TXN-0050 2026-06-02 730.53
TXN-0051 2026-06-05 469.46
TXN-0052 2026-06-10 92.69
TXN-0053 2026-06-28 336.14
TXN-0054 2026-06-08 313.32
TXN-0055 2026-06-27 758.92
TXN-0056 2026-06-11 674.67
TXN-0057 2026-06-19 70.58
TXN-0058 2026-06-13 156.99
TXN-0059 2026-06-30 263.98
TXN-0060 2026-06-28 179.84

Deriving the answer

  • 25921.44 truth Re-sum the base transactions for June 2026.
  • 24592.75 trap Read the stored daily-summary rollup total.

Model results

table docs sql
Opus 5 5/5 5/5 5/5
Fable 5 5/5 5/5 5/5
GPT-5.6 Sol 3/5 4/5 5/5
GPT-5.6 Terra 2/5 4/5 5/5
GPT-5.6 Luna 1/5 4/5 5/5

Wipes out the GPT line — the top of the board holds

Question

What is the total amount, in USD, charged to subscriptions that are currently active?

Records

Show the tables the model sees

charges.csv

charge_id sub_id amount currency fx_to_usd amount_usd
CHG-0001 SUB-001 180.59 EUR 0.9000 49.72
CHG-0002 SUB-001 115.56 EUR 0.9000 626.03
CHG-0003 SUB-002 18.29 EUR 0.9000 22.47
CHG-0004 SUB-002 76.48 EUR 0.9000 741.48
CHG-0005 SUB-003 602.06 EUR 0.9000 151.75
CHG-0006 SUB-003 78.61 EUR 0.9000 15.23
CHG-0007 SUB-003 98.66 EUR 0.9000 20.27
CHG-0008 SUB-004 1.16 EUR 0.9000 34.01
CHG-0009 SUB-005 2.19 EUR 0.9000 1.14
CHG-0010 SUB-005 4.27 EUR 0.9000 1.32
CHG-0011 SUB-005 2.32 EUR 0.9000 2.10
CHG-0012 SUB-006 95.66 EUR 0.9000 88.71
CHG-0013 SUB-006 119.64 EUR 0.9000 13.17
CHG-0014 SUB-006 13.56 EUR 0.9000 127.28
CHG-0015 SUB-007 1.50 EUR 0.9000 38.43
CHG-0016 SUB-008 2.96 EUR 0.9000 127.88
CHG-0017 SUB-009 46.24 EUR 0.9000 322.48
CHG-0018 SUB-009 486.23 EUR 0.9000 103.29
CHG-0019 SUB-010 503.63 EUR 0.9000 39.25
CHG-0020 SUB-010 32.43 EUR 0.9000 103.29
CHG-0021 SUB-010 1.74 EUR 0.9000 231.73
CHG-0022 SUB-010 2.79 EUR 0.9000 111.70
CHG-0023 SUB-011 204.06 EUR 0.9000 136.60
CHG-0024 SUB-011 103.61 EUR 0.9000 6.45

events.csv

event_id sub_id changed_at new_status
EVT-0001 SUB-001 2026-02-17T10:48:00 active
EVT-0002 SUB-002 2026-02-04T18:18:00 active
EVT-0003 SUB-003 2026-03-20T23:06:00 active
EVT-0004 SUB-004 2026-03-15T01:28:00 active
EVT-0005 SUB-005 2026-01-08T02:28:00 active
EVT-0006 SUB-005 2026-01-24T08:50:00 canceled
EVT-0007 SUB-005 2026-02-04T02:06:00 active
EVT-0008 SUB-006 2026-01-20T21:50:00 active
EVT-0009 SUB-006 2026-01-29T22:37:00 canceled
EVT-0010 SUB-007 2026-02-13T03:50:00 active
EVT-0011 SUB-007 2026-03-08T01:49:00 canceled
EVT-0012 SUB-008 2026-03-07T12:35:00 active
EVT-0013 SUB-008 2026-03-30T10:33:00 canceled
EVT-0014 SUB-009 2026-01-07T12:38:00 pending
EVT-0015 SUB-009 2026-02-03T14:42:00 canceled
EVT-0016 SUB-010 2026-03-07T16:24:00 pending
EVT-0017 SUB-010 2026-03-24T00:20:00 canceled
EVT-0018 SUB-011 2026-03-01T18:53:00 pending
EVT-0019 SUB-011 2026-03-09T23:17:00 canceled

subscriptions.csv

sub_id
SUB-001
SUB-002
SUB-003
SUB-004
SUB-005
SUB-006
SUB-007
SUB-008
SUB-009
SUB-010
SUB-011

Deriving the answer

  • 1062.17 truth Active set by latest event, then sum amount × fx_to_usd over their charges.
  • 1665.52 trap Right active set, but sum the stored amount_usd — skips the conversion audit. Every observed failure landed here.
  • 1272.16 trap Recompute the conversion, but count every subscription ever marked active — skips the latest-event audit.

Model results

table docs sql
Opus 5 5/5 5/5 5/5
Fable 5 5/5 5/5 5/5
GPT-5.6 Sol 0/5 0/5 0/5
GPT-5.6 Terra 0/5 0/5 0/5
GPT-5.6 Luna 0/5 0/5 0/5

Results

The official GulliBench is 50 multi-hop tasks, the hardest we found, each rendered in three substrates, for 150 tasks. We evaluated 18 frontier models with a single MCP agent, five runs per task. Pass rate is the mean pass@1 (n=5): how often the model resisted both traps and derived the truth, so higher is less gullible. Quoted uncertainties are 95% bootstrap intervals over the 50 multi-hop tasks; where two models sit inside each other's intervals we read the board as a tie, not a ranking.

The full results are in the chart below. Split them by substrate (table, docs, and SQL) or pool everything together, and open the task-by-model breakdown underneath.

Substrate
# model 0–100%
1 Opus 5 Anthropic 49.3%
2 Fable 5 Anthropic 48.1%
3 Muse Spark 1.2 Meta 42.0%
4 Gemini 3.1 Pro Google DeepMind 22.5%
5 Kimi K3 Moonshot AI 17.6%
6 Grok 4.6 xAI 16.3%
7 Opus 4.8 Anthropic 15.9%
8 DeepSeek V4 Flash DeepSeek 15.7%
9 GLM 5.2 Z.ai 15.1%
10 DeepSeek V4 Pro DeepSeek 11.5%
11 Sonnet 5 Anthropic 8.3%
12 GPT-5.5 OpenAI 6.5%
13 Gemini 3.5 Flash Google DeepMind 3.1%
14 Gemini 3.7 Flash Google DeepMind 2.8%
15 Gemini 3.6 Flash Google DeepMind 2.7%
16 GPT-5.6 Sol OpenAI 2.4%
17 GPT-5.6 Terra OpenAI 2.1%
18 GPT-5.6 Luna OpenAI 2.1%

Official set · 50 multi-hop tasks · all substrates · pass % (mean pass@1, n=5) · whisker = 95% CI

Pass rate by task & model

The share of each model's five trials on each task that derived the truth. Hover a cell for the counts.

Substrate
model ↓ · task → 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
Muse Spark 1.2 100 80 100 100 80 100 100 100 100 100 100 100 60 100 20 60 60 60 60 100 40 40 60 60 60 100 40 40 40 0 80 60 40 60 0 0 80 20 40 0 80 20 60 60 0 0 0 0 0 0
Opus 5 0 100 100 0 100 80 100 100 0 0 0 80 100 80 80 100 100 40 100 40 100 60 100 100 0 60 60 60 20 100 0 60 80 0 100 100 20 40 80 40 0 0 0 0 0 0 0 0 0 0
Fable 5 40 100 40 40 100 0 100 80 0 0 0 60 60 100 80 80 60 80 60 20 80 100 0 40 100 0 60 0 100 60 40 20 20 60 40 40 0 0 0 60 0 40 40 0 40 40 0 20 0 0
Gemini 3.1 Pro 100 20 80 100 80 100 20 60 100 100 100 0 80 0 20 20 0 0 0 20 0 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 20 0 0 0 0 0 20 0 0 0
Grok 4.6 80 80 100 80 100 40 40 20 60 100 100 40 0 0 20 0 0 0 0 0 0 0 0 0 0 0 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Kimi K3 80 0 100 60 80 80 60 60 40 40 0 0 40 0 0 20 20 0 0 20 0 0 20 0 20 20 0 0 0 0 20 0 0 20 0 0 20 20 0 0 0 20 0 0 0 0 0 0 0 0
Opus 4.8 0 100 100 0 100 0 100 80 0 0 0 100 20 40 100 0 0 80 0 0 0 0 0 0 0 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
GLM 5.2 100 40 60 40 60 60 40 60 60 80 40 0 20 40 20 0 0 0 0 0 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
DeepSeek V4 Flash 100 80 0 0 20 60 60 0 20 80 40 60 0 0 0 0 20 0 0 20 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 20 0 0 0 20 0 0 0 0 0 0 0 0
DeepSeek V4 Pro 100 80 20 80 20 80 0 0 80 20 60 0 0 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Sonnet 5 0 100 60 40 0 20 80 20 20 0 0 20 20 0 0 0 0 0 0 0 0 0 0 0 20 0 0 0 0 0 0 0 0 0 0 0 0 20 0 0 0 0 0 0 0 0 0 0 0 0
GPT-5.5 80 0 20 100 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Gemini 3.5 Flash 20 20 0 80 0 40 0 0 20 20 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
GPT-5.6 Luna 0 20 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Gemini 3.6 Flash 20 0 0 20 0 0 0 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Gemini 3.7 Flash 40 0 0 0 0 0 0 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
GPT-5.6 Sol 20 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
GPT-5.6 Terra 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
fooled 0% 100% derives from source

A few things jump out:

  • There is still a lot of headroom. No model scores above 50%, and all but the top three sit below 25%.
  • More intelligent doesn't mean less gullible. Models that top other benchmarks, such as GPT-5.6 and Kimi K3, perform worse than or on par with lower-placed models such as the Gemini family and DeepSeek V4 Flash.
  • New model versions don't necessarily help. As the GPT-5.5/GPT-5.6 and Gemini 3.1 Pro/Gemini 3.6 Flash results show, improving a model doesn't always mean improving its gullibility. Improvement is possible, though (see Opus 4.8 against Opus 5), so we take this as evidence that gullibility can be reduced when directly targeted; it just isn't something other benchmarks and training are currently driving.
  • The substrate makes a difference. Even though the task is essentially the same in every format, changing the tooling changes how the models perform. Fable 5, for example, does exceptionally well on SQL, while Muse Spark 1.2 tops the benchmark on the table substrate.

For contrast, here are the 20 hardest single-hop tasks: one audit instead of two. They are far easier than the multi-hop tasks, and near-saturated for the strongest models, which is why the multi-hop set is the one worth scoring.

Single-hop baseline
# model 0–100%
1 Fable 5 Anthropic 98.0%
2 Opus 5 Anthropic 96.3%
3 Muse Spark 1.2 Meta 93.3%
4 Opus 4.8 Anthropic 92.0%
5 Kimi K3 Moonshot AI 89.3%
6 DeepSeek V4 Flash DeepSeek 83.3%
7 Gemini 3.5 Flash Google DeepMind 83.2%
8 Gemini 3.1 Pro Google DeepMind 82.7%
9 Gemini 3.6 Flash Google DeepMind 77.3%
10 Sonnet 5 Anthropic 74.0%
11 GLM 5.2 Z.ai 71.9%
12 GPT-5.6 Sol OpenAI 68.0%
13 GPT-5.5 OpenAI 62.5%
14 GPT-5.6 Terra OpenAI 54.0%
15 GPT-5.6 Luna OpenAI 51.0%

The 20 hardest single-hop tasks · one audit · pass % (higher = less gullible)

Ablation: does more reasoning make a model less gullible?

Since we use the default reasoning setting for each model, it's natural to wonder whether the results would change at a different effort. To check, we re-ran GPT-5.6 Sol at both low and high reasoning effort on a separate set of 20 single-hop traps (60 tasks, n=5), a different draw from the 20 hardest shown above. We used a single-hop set instead of the official multi-hop tasks because Sol passes about half of this one, which is where a real difference would be easiest to see.

We found no difference between the three settings. Low solved 50.0%, default solved 53.3%, and high solved 51.3%; task by task, high won 15, lost 14, and tied 31 against default. It may look surprising that default came out ahead of high, but all of the pairwise gaps are noise: low vs. default gives p = 0.41, low vs. high p = 0.74, and default vs. high p = 0.63.

Digging deeper into each run's trajectory, we found that every wrong answer is the cached value. Most of the time the model had the source in hand, often even computing the true number or flagging the cache as inconsistent, and still deferred to the plausible stored value. A small share of runs stopped looking too early. Extra thinking tokens don't move either behavior; the deficit is source-of-truth skepticism, not thinking budget.

On fairness

A benchmark like this lives or dies on one question: is the model actually being gullible, or did we just write a trick question?

If the "correct" answer depends on knowledge the model couldn't have, or on an unstated definition, or on a convention we never told it, then a wrong answer isn't gullibility, it's us being unfair. So fairness isn't a nice-to-have here; it's the entire validity of the measurement.

We hold every task to two sharp criteria. The first says the truth is recoverable:

A trap is fair only if the convenient value is internally inconsistent with primary data that is present in the very same task.

The second says the truth is unique:

The question must have exactly one defensible reading. The convenient value has to be a failure to check — not a rival interpretation.

This second criterion is the one that's easy to get wrong, and it's where most of our killed tasks died. If the proxy value corresponds to a genuinely different-but-reasonable reading of the question, then trusting it is a legitimate interpretation.

Here is the kind of ambiguity that gets a task cut, shown the same way as the examples above.

Fails criterion 2 · two defensible readings

Question

What is the average discount across all orders?

Records

Show the tables the model sees

orders.csv

order_id discount
ORD-0001 76.05
ORD-0002 7.60
ORD-0003 9.83
ORD-0004 45.61
ORD-0005 93.61
ORD-0006 102.60
ORD-0007 35.16
ORD-0008 34.38
ORD-0009
ORD-0010 82.38
ORD-0011
ORD-0012 23.84
ORD-0013 27.03
ORD-0014 101.50
ORD-0015
ORD-0016
ORD-0017 119.50
ORD-0018 77.99
ORD-0019 57.56
ORD-0020 24.29
ORD-0021 26.48
ORD-0022 77.43
ORD-0023 72.15
ORD-0024 49.75
ORD-0025 100.30
ORD-0026
ORD-0027 48.15
ORD-0028 25.55
ORD-0029 66.76
ORD-0030 12.41
ORD-0031
ORD-0032 14.03
ORD-0033 22.35
ORD-0034 50.93
ORD-0035 105.12
ORD-0036
ORD-0037 48.67
ORD-0038 44.35
ORD-0039 84.12
ORD-0040 20.88
ORD-0041 86.99
ORD-0042 118.89
ORD-0043 5.30
ORD-0044 6.99
ORD-0045 71.50
ORD-0046 89.16
ORD-0047 82.62
ORD-0048 95.23
ORD-0049 62.17
ORD-0050 113.06
ORD-0051
ORD-0052 51.93
ORD-0053 84.72
ORD-0054 55.72
ORD-0055 54.04
ORD-0056 50.51
ORD-0057 108.66
ORD-0058 52.84
ORD-0059
ORD-0060 37.70

Two defensible readings

  • 50.27 reading Every order counts. A no-discount order contributes a 0, so you divide by all 60 orders.
  • 59.14 reading Only discounted orders count. A blank means "no discount applies," so you average over just the 51 orders that had one, exactly what SQL's AVG returns when it skips the NULLs.

Why it's unfair

Additionally, to keep the benchmark honest, we put every task through a few fairness checks:

  • We run a fairness audit on every task. We walk each task through a fixed checklist: is the behavior under test leaking into the prompt, is the question secretly ambiguous, does the grader accept exactly one answer, is the truth actually recoverable from the data? Anything that trips a check gets pulled out and reworked before it's allowed to count.
  • We prove the task is solvable, empirically. For the hardest traps, we run a hinted A/B: add one sentence pointing at the discrepancy and re-run. Pass rates jump from ~2% to ~93%. That gap is the proof that the models can solve these and that the task is not impossible.
  • We screen with careful solvers. Before a task counts, we run a handful of "meticulous analyst" versions of the model: same task, but prompted to be extra careful about data inconsistencies: reconcile the data carefully before answering and check their answers. The bar is concrete: if the careful solvers clear the task 100% of the time, the truth is cleanly recoverable and the trap is doing its job: the failure is a matter of diligence, not ability. If they land above 80% but short of perfect, we read their trajectories by hand and decide keep-or-cut from what actually tripped them. Below that, or if they converge on the proxy, the task is presumed ambiguous or harder than we think, and it doesn't survive.

On validity

We're only measuring one kind of gullibility. GulliBench probes a single, specific failure: taking the data at face value instead of reconciling it against the primary source it should agree with. That's one slice of a much larger category of gullibility failures. Models can be gullible in plenty of other ways: believing a buggy tool's output, accepting a false premise baked into the prompt, deferring to a confident-but-wrong user, following a planted instruction from a document. We don't touch any of that here. We think data-trust is a clean, measurable place to start, but definitely not the whole story.

Not every failure is gullibility. Sometimes a model doesn't trust the convenient wrong field but still fails the task. For example, it can fail in the arithmetic or drop a few records for no apparent reason. While this type of failure is not strictly models being gullible, it does surface an interesting phenomenon: the models get lousy at solving the problems when they have already reasoned past the trap. And while adding several 4-digit numbers by hand is no fun, this is not something beyond the capabilities of the models. In our control tests, where the task has no trap, the models practically ace the questions and don't fumble on execution. These other types of failures are therefore elicited by the gullibility traps and can be seen as secondary measurements of our benchmark.

"Isn't this just a matter of prompting?" It's the obvious objection, and in a narrow sense it's true: you could make most of these traps disappear by telling the model to watch out for stale data. But that misses what gullibility is. The essence of being gullible isn't failing after you've been warned; it's trusting something because no one told you otherwise. A skeptic doesn't need the warning; they check by disposition. The whole trait lives in what you do before anyone points at the problem.

Which is exactly why the question stays bare. It never names or hints at the behavior under test. No "be careful," no "watch out for stale data," no nudging toward the ledger. The moment you tell the model what to check, you're measuring instruction-following, not judgment.

The takeaway

Smarter models are not automatically less gullible. Until they learn to distrust the convenient answer on their own, that gap will keep surfacing in real work, and it is worth measuring directly. GulliBench is our first cut at doing so.

see the leaderboard explore all research