Skip to content
← All data-eng-bench runs

Snowflake’s data-eng-bench · Run

Dex passes 57.3% of data-eng-bench, and 94.7% of what the verifiers check.

The highest published figure for any Claude Sonnet 5 configuration on Snowflake's 103-task suite, measured at k=1: one attempt per task, all 103 tasks attempted, zero errored trials, and no best-of selection.

  • k=1, one attempt per task
  • 103 of 103 tasks
  • 0 errored trials
  • 0 retries
  • Claude Sonnet 5 at xhigh
  • Dex on 98% of trials
Pass rate on data-eng-benchDex + Claude Sonnet 5
57.3%

59 / 103 tasks resolved · 95% CI 47.6 to 66.4

Verifier assertions passed
94.7%

2,699 of 2,850 · 90.6% task-weighted

Headline figuresRun 11 August 2026

Pass rate, k=1

57.3%

59 of 103 tasks

95% CI 47.6 to 66.4

Verifier assertions

90.6%

task-weighted mean

95% CI 86.4 to 94.3

Dex trigger rate

98%

101 of 103 trials

Cost per trial

$2.74

list pricing, $1.82 introductory

Errored trials

0

and zero retries

Against the published board

Snowflake define Pass@1 as the mean single-attempt pass rate over a k=3 run, which is the same quantity a k=1 pass rate estimates, measured on three times the sample. Pass^3 counts a task only when all three attempts succeed, and a k=1 run cannot produce one.

Against the published board
HarnessModelAttemptsPass@1Pass^3Tokens / trial
Snowflake CoCoOpus 5k=373.8%64.1%1.07 M
Claude CodeOpus 5k=369.6%60.2%4.81 M
Snowflake CoCoGPT 5.6 Solk=364.1%55.3%0.44 M
CodexGPT 5.6 Solk=360.5%49.5%0.81 M
Claude Code + dexClaude Sonnet 5k=157.3%—5.39 M
Snowflake CoCoClaude Sonnet 5k=356.6%40.8%2.88 M
Claude CodeClaude Sonnet 5k=356.6%40.8%7.91 M

This run is first among every published Sonnet 5 configuration, and fifth of seven overall. The margin over the two Snowflake published at 56.6% is 0.7 points, a single task on a 103-task suite, so the honest reading is that all three are statistically indistinguishable and this one is nominally at the top. A genuinely 56.6% agent produces a draw at least this good about half the time. Snowflake publish identical figures for both of their Sonnet 5 configurations, so treat those two rows as one reference point rather than two.

Snowflake engineering blog, 6 August 2026. Their rows are k=3; ours is k=1.

Where Dex shines

What the run shows about the tool, separated from what it shows about the model. Every figure here carries its bound in the same place as the number.

Item 01101 of 103
101 of 103

Dex fired on 98% of trials

This is a measurement of Dex rather than of a tool that happened to be installed. The CLI carried 90% of the trials and the Skill wrapper 18%, for roughly 1,200 invocations in total. Every one of them was dex explore: the agent used it to verify real columns, types, null rates, grain and join keys before writing SQL.

NOTE — Usage is counted from the agent transcript, not from the installed skill files. A naive scan of the agent directory reports 100% on any run where the skills were merely present.

Item 0271% against 50%
71% against 50%

The more Dex ran, the more tasks passed

Trials that made twenty or more dex calls passed at 71%, against 50% for trials that made none at all. The gradient is monotonic from five calls upward, and the heaviest-usage bucket is 67% hard or harder yet still passed above the run average.

NOTE — Observational, and not a causal claim. There is no control arm in this run, the strata are small, and the arrow could point either way: an agent that has already lost the thread may also stop reaching for tools, which would make low usage a symptom rather than a cause.

Item 0370% against 20%
70% against 20%

On hard tasks the gap is widest

Stratified by difficulty, so the gradient is not simply easier tasks attracting more tool use. Among hard tasks, trials that leaned on Dex passed at 70% against 20% for trials that barely touched it. Among medium tasks it is 63% against 44%.

NOTE — Same caution as above. The thin cell here is three passes out of fifteen, so the 20% figure is a very small denominator.

Item 0494.7%
94.7%

Nearly right almost everywhere

2,699 of 2,850 individual verifier assertions passed. Even across the 44 tasks that failed, 87.6% of assertions still passed, 19 of them were blocked by exactly one assertion, and 29 by two or fewer. marketing-campaigns-harbor passed 218 of 219: the single failure compared a date against a timestamp.

Item 0538 of 44
38 of 44

The failure surface is semantic, not structural

In 38 of the 44 failed tasks the agent produced a buildable, correctly shaped model and then lost on a boundary condition or a reading of an ambiguous spec. Only six never produced a working deliverable at all. Getting the shape right is the part that depends on knowing what is actually in the warehouse.

Item 065.39 M
5.39 M

32% fewer tokens for the same score

Against the identical harness and model on the published board, this run used 5.39 M tokens per trial against 7.91 M, while running at reasoning_effort: xhigh, a setting that pushes token use up rather than down. 97.8% of the prompt volume was cache reads.

NOTE — Snowflake's published cost and token columns do not reconcile with each other, so at least one of them is on a basis we cannot see. We state our own basis and make no cost comparison.

Pass rate by dex calls per trial

Each bar is a bucket of the 103 trials, split by how many dex subcommand invocations appear in the agent transcript.

0 calls50%

n = 10

1 to 428%

n = 18

5 to 959%

n = 27

10 to 1967%

n = 27

20 or more71%

n = 21

NOTE — Bucket sizes are small and the 1-to-4 bucket sits below the zero-call bucket, so read the overall shape rather than any single pair.

Two scales, one run

The reward is binary and total: a task scores only when pytest exits with zero failures and zero skips. Because the verifiers are written as many independent components, the run also produced a much finer record underneath the binary one, and reading it changes what the 57.3% means.

Scales
Task reward, binary57.3%

59 of 103 tasks. What a leaderboard records.

Assertions, pooled94.7%

2,699 of 2,850 individual verifier assertions.

Assertions, task-weighted90.6%

Mean of per-task assertion fractions, each task counted once.

Across the 44 failed tasks alone, 87.6% of assertions still passed. Nineteen of the 44 were blocked by exactly one assertion and 29 by two or fewer. The binary reward is doing what it is designed to do, but it compresses “built the wrong thing” and “got one boundary condition wrong on a 219-assertion suite” into the same zero.

NOTE — Two cautions on reading this. These are not free points: a near-miss only converts if its cause is stochastic, and most of these look systematic, so the assertion rate describes where the remaining work is rather than a pass rate in waiting. And prefer the task-weighted 90.6% to the pooled 94.7% when quoting a single figure, because pooling overweights the one task that carries 219 assertions.

Where the other 44 lost

Every failed trial was classified from its verifier output. The distribution is lopsided in a useful direction: the agent almost always produced a buildable, correctly shaped model and then lost on semantics.

Where the other 44 lost
BucketFailure modeTrialsNear misses
EClassification threshold or tie-breakScores correct, the bucket they land in is not. Percentile edges, tier waterfalls, ties.129 of 12
DPopulation boundary (row count)Right shape, wrong row count. Off by an edge case, not by a formula.88 of 8
ADeliverable missing or unbuildableThe model, or a model it depends on, was never produced. Nothing about the SQL was judged.60 of 6
BOrder-status population semanticsCancelled, returned, or failed orders included or excluded against what the verifier expects.62 of 6
CGrain and join fan-outA join multiplied rows, so totals inflate by a roughly integer factor.44 of 4
FNULL handlingA NULL survived into a column the verifier requires to be populated.43 of 4
GType, precision, or formatNumerically right, typed or truncated wrong.22 of 2
HStateful algorithmFIFO and LIFO layer allocation. Sequential state the SQL has to carry.21 of 2

Buckets D and E together are 20 of the 44, and both are boundary problems rather than modeling problems. Bucket B deserves its own attention: six separate tasks turned on whether cancelled, returned, or failed orders belong in the population. The tickets frequently do not say, and the verifiers always have an opinion. Bucket A is the only group where nothing about the SQL was judged, and it is six tasks.

How we ran it

data-eng-bench drops an agent into a 2,356-model dbt project with a ticket, then scores whether the task's own pytest verifier runs clean afterwards. This was one full pass over all 103 tasks, one attempt each, with no re-runs and no best-of selection.

Run record
Run
full-dex-20260810-221947. Started 2026-08-10 22:19:47 UTC, main pass finished 2026-08-11 09:20:36 UTC.
Tasks
All 103, one attempt each (k=1). 84 build tasks and 19 fix tasks; 3 easy, 47 medium, 45 hard, 8 very hard.
Model
anthropic/claude-sonnet-5 at reasoning_effort: xhigh
Agent
claude-code 2.1.226, median 49 steps per trial
Dex
v1.6.3 at commit 1554d248, exmergo-dex-core 1.6.3, warm cache in the image
Image
ghcr.io/snowflake-labs/data-eng-bench-base:1.0.0, dex arm
Dataset
snowflake-labs/data-eng-bench@v1.0, task digests unmodified
Throughput
11.01 h wall clock at n=2 concurrency, 9.4 trials per hour, 22 core-hours total
Headroom
Longest agent execution 2,026 s against a 4,000 s ceiling. Nothing was truncated.
Reliability
Zero errored trials and zero retries. One trial hit a host-side network failure during agent setup, 38 s in and before any tokens were spent, and was re-run to completion on a provably identical configuration.
Reading the numbers
  • This is a k=1 run: one attempt per task. The 57.3% carries a Wilson 95% interval of 47.6% to 66.4%, roughly plus or minus 9.4 points, and a single task is 0.97 points. Any comparison narrower than about ten points is noise at this sample size.
  • The assertion-level interval is about two and a half times tighter than the binary one on the same run, 7.9 points against 19.4. Where a single figure is needed, the task-weighted 90.6% is the more sensitive instrument.
  • The benchmark's own difficulty labels barely separate the outcomes. Medium tasks passed at 60% and hard at 53%, a seven-point spread inside a plus or minus nine-point interval. The failure taxonomy above predicts this model's misses far better than the label does.
  • Build and fix tasks scored 58.3% (49 of 84) and 52.6% (10 of 19). Snowflake characterise the suite as 84 build and 19 fix but do not publish the split, so this is a first. At n=19 the fix-task interval runs from 31.7% to 72.7% and carries almost no information.
  • Cost per trial was essentially flat between passes ($2.64) and failures ($2.87), so the failures are not agents burning budget while flailing.
  • Every trial's assertion tally, cost, step count and dex call count is in the table at the foot of this page, and the raw verifier output is committed alongside the harness configuration.

Reading this run

The arithmetic here is easy for anyone to check, so everything that qualifies the number sits on this page rather than in a footnote.

  • This is a k=1 run: one attempt per task, below the leaderboard's k=3 minimum. It sizes a submission; it is not one.
  • There is no baseline arm in this run, so no delta is attributable to Dex. Nothing here measures what the same loop would have scored without it, and the usage gradient above is observational.
  • Snowflake's published rows are k=3 and ours is k=1. Both estimate the same quantity, but ours is the noisier estimate on roughly a third of the sample.
  • We publish no Pass^3 figure. A k=1 run cannot produce one, and no reanalysis will conjure it.
  • Our arm modifies the base image. It adds uv, a warm dex-core cache, the dex CLI on PATH, and an /app/CLAUDE.md, reproduced verbatim below.
  • The model ran at reasoning_effort: xhigh. Snowflake do not state their setting.
  • Different day, different hardware, different operator, and no shared control arm. This is a cross-report comparison, not a controlled experiment.
  • Task digests match snowflake-labs/data-eng-bench@v1.0. Nothing under tasks/ was modified.
  • Cost is reported at list pricing ($3 and $15 per MTok, $3.75 cache write, $0.30 cache read), which reconstructs the harness figure of $282.12 exactly. The same token ledger at the introductory pricing running through 2026-08-31 comes to $187.95.
  • Snowflake's published cost and token columns do not reconcile with each other, so we make no cost comparison against the board.
The CLAUDE.md this arm addedVerbatim

94 of the 103 tickets already instruct the agent to run echo $DB_TYPE, and 100 of 103 already instruct it to create a profiles.yml with profile name retail_dw_master. Steps 1, 2 and 5 therefore restate what the tickets already say, and the marginal prompt content is step 3.

# Project setup sequence

Every task in this project follows the same order. Do not skip a step.

1. `echo $DB_TYPE` to determine the backend.
2. Write `profiles.yml` for that backend, profile name `retail_dw_master`.
3. **`dex explore profile <table>` for every source table the ticket names.**
   This returns real columns, types, null rates, grain and verified join keys.
4. Write or edit the model SQL.
5. `dbt run -s <model>` to verify it builds.

Profiling tells you what the data *is*. It does not tell you what the ticket
wants. Where the two seem to disagree, the ticket and the existing model are the
specification: implement the change that was asked for, and leave the surrounding
logic alone.

## dex commands

    dex explore profile <table>          columns, types, null rates, grain, PII
    dex explore inventory --rank         what exists, ranked by relevance
    dex explore relationships --verify   join keys, verified against the data
    dex explore query "<SELECT ...>"     guarded ad-hoc probe

The connector and database path default from `$DB_TYPE` and `$DUCKDB_PATH`, so
no flags are needed. Output is JSON on stdout. It is read-only and writes only a
`.dex/` cache, which dbt ignores.

All 103 trials

Every trial in the run, with its assertion tally, cost, step count and dex call count. Failures also carry their taxonomy bucket, how many assertions stood between the trial and a pass, and the first assertion that failed.

103 of 103 trials shown

Trial record
TaskAssertionsCost
✓
dbt-abc-classification
49 / 49$3.49
✓
dbt-basket-composition-analysis
85 / 85$3.45
✓
dbt-calculate-running-balance
27 / 27$1.91
✓
dbt-campaign-performance
1 / 1$1.24
✓
dbt-cart-abandonment-recovery
1 / 1$2.48
✓
dbt-consolidate
1 / 1$0.95
✓
dbt-coupon-effectiveness
60 / 60$3.13
✓
dbt-customer-churn-cohorts
3 / 3$2.62
✓
dbt-customer-cohort-retention
45 / 45$3.50
✓
dbt-customer-cross-sell-insights
18 / 18$4.66
✓
dbt-customer-geographic
9 / 9$1.33
✓
dbt-customer-lifecycle-journey
1 / 1$1.70
✓
dbt-customer-lifetime-value
72 / 72$3.19
✓
dbt-customer-order-analytics
13 / 13$1.94
✓
dbt-customer-risk-scoring
11 / 11$1.42
✓
dbt-daily-order-summary
13 / 13$0.59
✓
dbt-dq-macro-enforcement
26 / 26$3.03
✓
dbt-email-campaign-tracker
1 / 1$1.75
✓
dbt-fix-cac-payback-waterfall
14 / 14$2.33
✓
dbt-fix-customer-churn
8 / 8$1.23
✓
dbt-fix-customer-snapshot-and-build-dimension
20 / 20$1.79
✓
dbt-fix-daily-cohorts
11 / 11$1.61
✓
dbt-fix-daily-revenue
13 / 13$1.91
✓
dbt-fix-email-attribution
10 / 10$3.06
✓
dbt-fix-inventory-model
1 / 1$2.61
✓
dbt-fix-paid-search-attribution
n/a$2.51
✓
dbt-fix-refund-reconciliation
1 / 1$0.68
✓
dbt-fix-timezone-sales
10 / 10$2.47
✓
dbt-fraud-detection-model
13 / 13$3.17
✓
dbt-gl-reconciliation
26 / 26$1.83
✓
dbt-harbor-product-affinity
25 / 25$3.31
✓
dbt-harbor-warehouse-capacity
42 / 42$3.40
✓
dbt-hr-analytics
32 / 32$4.35
✓
dbt-inventory-stockout-risk
18 / 18$3.31
✓
dbt-loyalty-points-analysis
11 / 11$1.57
✓
dbt-order-fulfillment-analytics
64 / 64$5.40
✓
dbt-order-fulfillment-metrics
19 / 19$2.04
✓
dbt-order-reconciliation
47 / 47$2.07
✓
dbt-price-elasticity
13 / 13$1.57
✓
dbt-product-affinity
63 / 63$3.98
✓
dbt-product-category-analytics
11 / 11$1.46
✓
dbt-product-sales-velocity
60 / 60$2.84
✓
dbt-receivables-aging-buckets
4 / 4$3.26
✓
dbt-retail-task-01-channel-revenue
10 / 10$1.73
✓
dbt-retail-task-04-market-roi
10 / 10$1.85
✓
dbt-rfm-customer-tiering
5 / 5$4.83
✓
dbt-session-attribution
1 / 1$1.96
✓
dbt-test-orders-filter
15 / 15$2.35
✓
dbt-three-way-matching
52 / 52$2.42
✓
dbt-warehouse-fulfillment-analytics
1 / 1$1.84
✓
dbt-web-session-analytics
22 / 22$2.39
✓
dbt-weekly-sales-growth
29 / 29$1.91
✓
deferred-revenue-recognition
20 / 20$1.91
✓
late-arriving-orders-reconciliation
19 / 19$3.11
✓
payment-risk-scoring
83 / 83$2.89
✓
pos-operations
69 / 69$8.20
✓
shipping-fulfillment-quality-scoring
125 / 125$2.02
✓
web-session-quality-scoring
69 / 69$2.21
✓
workforce-analytics
134 / 134$8.11
×
dbt-product-performance-metrics[A]short by 4. Staging model stg_order_lines__products does not exist
29 / 33$3.36
×
dbt-channel-attribution-analysis[A]short by 12. Staging model stg_orders__channels does not exist
37 / 49$3.63
×
dbt-incremental-late-arriving-sales[A]short by 30. Missing columns in order_version_history: valid_from, valid_to, version_num, order_id, channel_id and others
4 / 34$4.30
×
dbt-payment-analytics[A]short by 11. component_2_no_inf_nan_values: Catalog Error: Table with name rpt_payment_analytics does not exist
1 / 12$0.55
×
dbt-inventory-analysis[A]short by 6. Missing required columns: inventory_value, max_single_item_value
0 / 6$1.74
×
dbt-inventory-turnover-analysis[A]dbt run failed: could not find profile named 'dbt_project'. No tests ran.
n/a$4.88
×
dbt-fix-division-by-zero[B]short by 1. component_3_row_count: Row count mismatch: 390 vs 382
14 / 15$2.08
×
dbt-customer-cltv-forecasting[B]short by 1. Total current_lifetime_revenue 7,935,436.41 does not match source 599,569.28
4 / 5$1.33
×
dbt-fix-customer-ltv[B]short by 3. Calculation mismatch for customer 007f4385
10 / 13$2.89
×
dbt-fix-product-metrics[B]short by 4. Revenue mismatch: report=643,615.84, actual=596,282.96 (tolerance 0.01)
7 / 11$1.67
×
dbt-customer-ltv-fix[B]short by 9. Total LTV 5,229,842.66 differs from expected 621,893.43
14 / 23$4.27
×
dbt-fix-category-revenue[B]short by 6. Revenue mismatch: report=722,313.24, actual=719,362.46, diff=2,950.78
4 / 10$1.19
×
promotional-lift-analysis[C]short by 2. Targeted products count mismatch: expected 2, got 11
14 / 16$1.86
×
dbt-customer-acquisition-channel-performance[C]short by 1. Customer count mismatch: out=395, src=135, diff=260
4 / 5$2.38
×
dbt-customer-churn-early-warning[C]short by 1. Order counts mismatch: src=368, out=2,558
3 / 4$2.22
×
dbt-fix-repeat-purchase-cohort-revenue[C]short by 2. Cohort size mismatches across three cohorts
4 / 6$2.12
×
dbt-order-interval-metrics[D]short by 2. Segment 'Champion': expected 14, got 2
61 / 63$2.67
×
dbt-retail-task-07-cart-recovery[D]short by 2. Row mismatch for fct_cart_recovery_priority: missing=100, extra=100
44 / 46$2.84
×
dbt-retail-task-10-trust-risk[D]short by 2. Row mismatch for int_reviews__enriched: missing=100, extra=100
27 / 29$4.55
×
tier-migration-analysis[D]short by 2. Total transitions mismatch: expected 500, got 499
25 / 27$3.85
×
dbt-rfm-customer-segmentation[D]short by 1. Expected 213 customers, got 208
12 / 13$1.84
×
dbt-sales-funnel-analysis[D]short by 1. BEFORE_VIEW count 4,011 does not equal expected 4,550
12 / 13$1.30
×
dbt-exchange-rate-settlement-date[D]short by 2. Missing keys in fact_revenue
18 / 20$1.64
×
dbt-multi-warehouse-stock-rebalance[D]short by 1. component_3_row_count: Row count mismatch: output=1,029, expected=1,220
7 / 8$1.56
×
dbt-rfm-customer-segmentation-2[E]short by 1. Customer 66ce3f95 with q4=0, q3=1, q2=1: expected 'decelerating', got 'churning'
56 / 57$1.64
×
dbt-monthly-channel-revenue[E]short by 2. Row 47 (2024-12-01, MOBILE): strategic_recommendation expected 'Invest Heavily', got 'Scale Up'
93 / 95$2.51
×
time-decay-attribution-model[E]short by 1. Campaign bc816a68 channels should have equal attribution
25 / 26$3.20
×
cohort-retention-matrix[E]short by 1. early_churned_count mismatches
23 / 24$3.12
×
dbt-customer-retention-risk[E]short by 1. component_16_above_type_avg_frequency: 30 mismatches
17 / 18$4.01
×
dbt-payment-fraud-analysis[E]short by 1. pct_of_total_orders should sum to 1.0, got 98.18
17 / 18$1.71
×
dbt-carrier-delivery-performance[E]short by 1. component_14_efficiency_index_formula: efficiency index formula errors
15 / 16$1.39
×
dbt-harbor-marketing-mix-model[E]short by 3. Should identify at least one over-saturated channel
38 / 41$6.84
×
dbt-campaign-roi-analysis[E]short by 1. component_8_cpa_percentile_inverted: campaign 3632acf1 with low CPA 999.00 has a low percentile
11 / 12$5.00
×
dbt-product-return-analysis[E]short by 2. component_11_moderate_risk_tier_logic: moderate risk product 37d567d9 should be high_risk
11 / 13$3.24
×
dbt-product-return-rate-analysis[E]short by 4. Return rate logic violated in 10 rows
13 / 17$5.50
×
dbt-fix-marketing-attribution[E]short by 4.
9 / 13$2.11
×
dbt-fulfillment-sla[F]short by 1. NULL found in column shipping_method_name
76 / 77$3.29
×
dbt-fix-inventory-balance[F]short by 2. Found 124 products with more than 5% revenue mismatch
17 / 19$1.74
×
dbt-supplier-payment-optimization[F]short by 1. NULL values found in early_payment_discount_pct
7 / 8$2.13
×
dbt-supplier-scorecard[F]short by 5. Cost score mismatch for SUP0008: variance=0, expected 66.67, got 0
14 / 19$1.97
×
marketing-campaigns-harbor[G]short by 1. first_redemption_date mismatch for 007f4385: 2025-11-26 against 2025-11-26 00:32:51
218 / 219$3.02
×
dbt-fix-multi-touch-attribution[G]short by 1. component_3_schema: conversions must be INTEGER type
9 / 10$2.63
×
fifo-inventory-cogs[H]short by 11. FIFO VIOLATED: 110 allocations do not match expected overlap
39 / 50$5.30
×
dbt-multicurrency-lifo[H]short by 1. sale_cogs validation errors
0 / 1$5.15

Letters mark the failure taxonomy above. “Short by” is the number of assertions between the trial and a clean pass; n/a where a verifier emitted no parseable summary or no tests ran. Raw verifier output ↗