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

> Dex + Claude Sonnet 5 resolves 59 of 103 tasks (57.3%) on Snowflake's data-eng-bench at k=1, the highest published figure for any Sonnet 5 configuration, and passes 94.7% of the verifiers' 2,850 individual assertions.

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.

- Benchmark: [data-eng-bench](https://www.exmergo.com/benchmarks/data-eng-bench) (Data Engineering Agent Benchmark), published by Snowflake
- Run date: 2026-08-11
- Headline result: 59 / 103 tasks resolved (57.3%) with Claude Sonnet 5
- Benchmark repository: https://github.com/snowflake-labs/data-eng-bench
- Raw results: https://github.com/exmergo/dex/tree/main/benchmarks/data-eng-bench
- Conditions: 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

## Headline numbers

| Metric | Value | Detail |
| --- | --- | --- |
| 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 |

## 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**: 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.

## Results

Fifty-nine of 103 tasks scored a clean pass, with zero errored trials and zero retries. Underneath that binary reward, 2,699 of 2,850 individual verifier assertions passed, and 19 of the 44 failed tasks were blocked by exactly one assertion. The binary number is what a leaderboard records; the assertion record is where the remaining work actually is.

Snowflake published their own data-eng-bench numbers on 6 August 2026, five days before this run. Their Pass@1 is the comparable measure, and on it this run lands at the top of the Sonnet 5 group by 0.7 points, a margin with no statistical content at this sample size.

## 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.

| Harness | Model | Attempts | Pass@1 | Pass^3 | Tokens/trial |
| --- | --- | --- | --- | --- | --- |
| Snowflake CoCo | Opus 5 | k=3 | 73.8% | 64.1% | 1,070,515 |
| Claude Code | Opus 5 | k=3 | 69.6% | 60.2% | 4,810,868 |
| Snowflake CoCo | GPT 5.6 Sol | k=3 | 64.1% | 55.3% | 436,236 |
| Codex | GPT 5.6 Sol | k=3 | 60.5% | 49.5% | 812,306 |
| **Claude Code + dex** (ours) | Claude Sonnet 5 | k=1 | 57.3% | not measured | 5,385,156 |
| Snowflake CoCo | Claude Sonnet 5 | k=3 | 56.6% | 40.8% | 2,879,678 |
| Claude Code | Claude Sonnet 5 | k=3 | 56.6% | 40.8% | 7,914,293 |

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.

Source: 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.

### Dex fired on 98% of trials (101 of 103)

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.

*Caveat: 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.*

### The more Dex ran, the more tasks passed (71% against 50%)

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.

*Caveat: 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.*

### On hard tasks the gap is widest (70% against 20%)

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%.

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

### Nearly right almost everywhere (94.7%)

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.

### The failure surface is semantic, not structural (38 of 44)

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.

### 32% fewer tokens for the same score (5.39 M)

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.

*Caveat: 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.

| Bucket | Value | Trials |
| --- | --- | --- |
| 0 calls | 50% | n = 10 |
| 1 to 4 | 28% | n = 18 |
| 5 to 9 | 59% | n = 27 |
| 10 to 19 | 67% | n = 27 |
| 20 or more | 71% | n = 21 |

*Caveat: 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.

| Measure | Value | What it counts |
| --- | --- | --- |
| Task reward, binary | 57.3% | 59 of 103 tasks. What a leaderboard records. |
| Assertions, pooled | 94.7% | 2,699 of 2,850 individual verifier assertions. |
| Assertions, task-weighted | 90.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.

*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.

| Bucket | Failure mode | Tasks | Within two assertions | Description |
| --- | --- | --- | --- | --- |
| E | Classification threshold or tie-break | 12 of 44 | 9 of 12 | Scores correct, the bucket they land in is not. Percentile edges, tier waterfalls, ties. |
| D | Population boundary (row count) | 8 of 44 | 8 of 8 | Right shape, wrong row count. Off by an edge case, not by a formula. |
| A | Deliverable missing or unbuildable | 6 of 44 | 0 of 6 | The model, or a model it depends on, was never produced. Nothing about the SQL was judged. |
| B | Order-status population semantics | 6 of 44 | 2 of 6 | Cancelled, returned, or failed orders included or excluded against what the verifier expects. |
| C | Grain and join fan-out | 4 of 44 | 4 of 4 | A join multiplied rows, so totals inflate by a roughly integer factor. |
| F | NULL handling | 4 of 44 | 3 of 4 | A NULL survived into a column the verifier requires to be populated. |
| G | Type, precision, or format | 2 of 44 | 2 of 2 | Numerically right, typed or truncated wrong. |
| H | Stateful algorithm | 2 of 44 | 1 of 2 | FIFO and LIFO layer allocation. Sequential state the SQL has to carry. |

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.

## 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 added

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.

```text
# 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.

| Result | Task | Difficulty | Assertions | Cost | Steps | Agent | dex calls | Bucket | Short by | First failing assertion |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| pass | `dbt-abc-classification` | medium | 49/49 | $3.49 | 68 | 790s | 20 |  |  |  |
| pass | `dbt-basket-composition-analysis` | hard | 85/85 | $3.45 | 37 | 704s | 13 |  |  |  |
| pass | `dbt-calculate-running-balance` | medium | 27/27 | $1.91 | 47 | 474s | 40 |  |  |  |
| pass | `dbt-campaign-performance` | medium | 1/1 | $1.24 | 30 | 367s | 3 |  |  |  |
| pass | `dbt-cart-abandonment-recovery` | medium | 1/1 | $2.48 | 52 | 683s | 24 |  |  |  |
| pass | `dbt-consolidate` | medium | 1/1 | $0.95 | 40 | 246s | 8 |  |  |  |
| pass | `dbt-coupon-effectiveness` | medium | 60/60 | $3.13 | 51 | 766s | 6 |  |  |  |
| pass | `dbt-customer-churn-cohorts` | very hard | 3/3 | $2.62 | 55 | 822s | 17 |  |  |  |
| pass | `dbt-customer-cohort-retention` | medium | 45/45 | $3.50 | 58 | 876s | 16 |  |  |  |
| pass | `dbt-customer-cross-sell-insights` | hard | 18/18 | $4.66 | 80 | 1180s | 5 |  |  |  |
| pass | `dbt-customer-geographic` | easy | 9/9 | $1.33 | 47 | 383s | 23 |  |  |  |
| pass | `dbt-customer-lifecycle-journey` | medium | 1/1 | $1.70 | 45 | 401s | 6 |  |  |  |
| pass | `dbt-customer-lifetime-value` | hard | 72/72 | $3.19 | 51 | 711s | 38 |  |  |  |
| pass | `dbt-customer-order-analytics` | medium | 13/13 | $1.94 | 55 | 580s | 19 |  |  |  |
| pass | `dbt-customer-risk-scoring` | hard | 11/11 | $1.42 | 37 | 406s | 0 |  |  |  |
| pass | `dbt-daily-order-summary` | easy | 13/13 | $0.59 | 21 | 124s | 0 |  |  |  |
| pass | `dbt-dq-macro-enforcement` | hard | 26/26 | $3.03 | 44 | 777s | 5 |  |  |  |
| pass | `dbt-email-campaign-tracker` | medium | 1/1 | $1.75 | 54 | 492s | 19 |  |  |  |
| pass | `dbt-fix-cac-payback-waterfall` | medium | 14/14 | $2.33 | 64 | 589s | 8 |  |  |  |
| pass | `dbt-fix-customer-churn` | medium | 8/8 | $1.23 | 32 | 260s | 8 |  |  |  |
| pass | `dbt-fix-customer-snapshot-and-build-dimension` | hard | 20/20 | $1.79 | 45 | 402s | 6 |  |  |  |
| pass | `dbt-fix-daily-cohorts` | medium | 11/11 | $1.61 | 36 | 410s | 15 |  |  |  |
| pass | `dbt-fix-daily-revenue` | medium | 13/13 | $1.91 | 48 | 414s | 11 |  |  |  |
| pass | `dbt-fix-email-attribution` | medium | 10/10 | $3.06 | 66 | 667s | 19 |  |  |  |
| pass | `dbt-fix-inventory-model` | medium | 1/1 | $2.61 | 47 | 641s | 11 |  |  |  |
| pass | `dbt-fix-paid-search-attribution` | medium | n/a | $2.51 | 55 | 594s | 8 |  |  |  |
| pass | `dbt-fix-refund-reconciliation` | medium | 1/1 | $0.68 | 20 | 214s | 0 |  |  |  |
| pass | `dbt-fix-timezone-sales` | medium | 10/10 | $2.47 | 59 | 690s | 11 |  |  |  |
| pass | `dbt-fraud-detection-model` | hard | 13/13 | $3.17 | 73 | 825s | 32 |  |  |  |
| pass | `dbt-gl-reconciliation` | very hard | 26/26 | $1.83 | 45 | 580s | 2 |  |  |  |
| pass | `dbt-harbor-product-affinity` | hard | 25/25 | $3.31 | 56 | 854s | 29 |  |  |  |
| pass | `dbt-harbor-warehouse-capacity` | hard | 42/42 | $3.40 | 73 | 601s | 20 |  |  |  |
| pass | `dbt-hr-analytics` | hard | 32/32 | $4.35 | 95 | 850s | 10 |  |  |  |
| pass | `dbt-inventory-stockout-risk` | medium | 18/18 | $3.31 | 50 | 669s | 9 |  |  |  |
| pass | `dbt-loyalty-points-analysis` | hard | 11/11 | $1.57 | 44 | 480s | 18 |  |  |  |
| pass | `dbt-order-fulfillment-analytics` | hard | 64/64 | $5.40 | 99 | 853s | 20 |  |  |  |
| pass | `dbt-order-fulfillment-metrics` | hard | 19/19 | $2.04 | 53 | 414s | 2 |  |  |  |
| pass | `dbt-order-reconciliation` | hard | 47/47 | $2.07 | 56 | 505s | 16 |  |  |  |
| pass | `dbt-price-elasticity` | hard | 13/13 | $1.57 | 48 | 553s | 5 |  |  |  |
| pass | `dbt-product-affinity` | hard | 63/63 | $3.98 | 73 | 967s | 18 |  |  |  |
| pass | `dbt-product-category-analytics` | hard | 11/11 | $1.46 | 43 | 460s | 25 |  |  |  |
| pass | `dbt-product-sales-velocity` | hard | 60/60 | $2.84 | 44 | 700s | 22 |  |  |  |
| pass | `dbt-receivables-aging-buckets` | hard | 4/4 | $3.26 | 64 | 749s | 7 |  |  |  |
| pass | `dbt-retail-task-01-channel-revenue` | easy | 10/10 | $1.73 | 44 | 716s | 12 |  |  |  |
| pass | `dbt-retail-task-04-market-roi` | medium | 10/10 | $1.85 | 49 | 590s | 28 |  |  |  |
| pass | `dbt-rfm-customer-tiering` | very hard | 5/5 | $4.83 | 74 | 1066s | 1 |  |  |  |
| pass | `dbt-session-attribution` | very hard | 1/1 | $1.96 | 36 | 639s | 6 |  |  |  |
| pass | `dbt-test-orders-filter` | medium | 15/15 | $2.35 | 42 | 442s | 11 |  |  |  |
| pass | `dbt-three-way-matching` | hard | 52/52 | $2.42 | 46 | 730s | 22 |  |  |  |
| pass | `dbt-warehouse-fulfillment-analytics` | medium | 1/1 | $1.84 | 41 | 624s | 8 |  |  |  |
| pass | `dbt-web-session-analytics` | medium | 22/22 | $2.39 | 49 | 700s | 0 |  |  |  |
| pass | `dbt-weekly-sales-growth` | medium | 29/29 | $1.91 | 51 | 357s | 2 |  |  |  |
| pass | `deferred-revenue-recognition` | hard | 20/20 | $1.91 | 41 | 408s | 5 |  |  |  |
| pass | `late-arriving-orders-reconciliation` | hard | 19/19 | $3.11 | 53 | 736s | 0 |  |  |  |
| pass | `payment-risk-scoring` | medium | 83/83 | $2.89 | 57 | 808s | 18 |  |  |  |
| pass | `pos-operations` | hard | 69/69 | $8.20 | 125 | 1720s | 26 |  |  |  |
| pass | `shipping-fulfillment-quality-scoring` | medium | 125/125 | $2.02 | 45 | 399s | 15 |  |  |  |
| pass | `web-session-quality-scoring` | medium | 69/69 | $2.21 | 39 | 717s | 9 |  |  |  |
| pass | `workforce-analytics` | hard | 134/134 | $8.11 | 105 | 1856s | 52 |  |  |  |
| fail | `dbt-product-performance-metrics` | medium | 29/33 | $3.36 | 56 | 668s | 4 | A | 4 | Staging model stg_order_lines__products does not exist |
| fail | `dbt-channel-attribution-analysis` | medium | 37/49 | $3.63 | 58 | 667s | 16 | A | 12 | Staging model stg_orders__channels does not exist |
| fail | `dbt-incremental-late-arriving-sales` | hard | 4/34 | $4.30 | 81 | 796s | 4 | A | 30 | Missing columns in order_version_history: valid_from, valid_to, version_num, order_id, channel_id and others |
| fail | `dbt-payment-analytics` | medium | 1/12 | $0.55 | 17 | 298s | 10 | A | 11 | component_2_no_inf_nan_values: Catalog Error: Table with name rpt_payment_analytics does not exist |
| fail | `dbt-inventory-analysis` | medium | 0/6 | $1.74 | 46 | 413s | 16 | A | 6 | Missing required columns: inventory_value, max_single_item_value |
| fail | `dbt-inventory-turnover-analysis` | medium | n/a | $4.88 | 76 | 1013s | 0 | A |  | dbt run failed: could not find profile named 'dbt_project'. No tests ran. |
| fail | `dbt-fix-division-by-zero` | medium | 14/15 | $2.08 | 41 | 602s | 6 | B | 1 | component_3_row_count: Row count mismatch: 390 vs 382 |
| fail | `dbt-customer-cltv-forecasting` | hard | 4/5 | $1.33 | 35 | 360s | 2 | B | 1 | Total current_lifetime_revenue 7,935,436.41 does not match source 599,569.28 |
| fail | `dbt-fix-customer-ltv` | medium | 10/13 | $2.89 | 61 | 679s | 2 | B | 3 | Calculation mismatch for customer 007f4385 |
| fail | `dbt-fix-product-metrics` | medium | 7/11 | $1.67 | 39 | 537s | 10 | B | 4 | Revenue mismatch: report=643,615.84, actual=596,282.96 (tolerance 0.01) |
| fail | `dbt-customer-ltv-fix` | hard | 14/23 | $4.27 | 75 | 1045s | 2 | B | 9 | Total LTV 5,229,842.66 differs from expected 621,893.43 |
| fail | `dbt-fix-category-revenue` | hard | 4/10 | $1.19 | 35 | 297s | 1 | B | 6 | Revenue mismatch: report=722,313.24, actual=719,362.46, diff=2,950.78 |
| fail | `promotional-lift-analysis` | very hard | 14/16 | $1.86 | 45 | 388s | 3 | C | 2 | Targeted products count mismatch: expected 2, got 11 |
| fail | `dbt-customer-acquisition-channel-performance` | hard | 4/5 | $2.38 | 47 | 692s | 16 | C | 1 | Customer count mismatch: out=395, src=135, diff=260 |
| fail | `dbt-customer-churn-early-warning` | medium | 3/4 | $2.22 | 50 | 604s | 7 | C | 1 | Order counts mismatch: src=368, out=2,558 |
| fail | `dbt-fix-repeat-purchase-cohort-revenue` | medium | 4/6 | $2.12 | 48 | 608s | 5 | C | 2 | Cohort size mismatches across three cohorts |
| fail | `dbt-order-interval-metrics` | medium | 61/63 | $2.67 | 40 | 587s | 0 | D | 2 | Segment 'Champion': expected 14, got 2 |
| fail | `dbt-retail-task-07-cart-recovery` | hard | 44/46 | $2.84 | 55 | 734s | 5 | D | 2 | Row mismatch for fct_cart_recovery_priority: missing=100, extra=100 |
| fail | `dbt-retail-task-10-trust-risk` | hard | 27/29 | $4.55 | 85 | 819s | 24 | D | 2 | Row mismatch for int_reviews__enriched: missing=100, extra=100 |
| fail | `tier-migration-analysis` | hard | 25/27 | $3.85 | 66 | 661s | 8 | D | 2 | Total transitions mismatch: expected 500, got 499 |
| fail | `dbt-rfm-customer-segmentation` | hard | 12/13 | $1.84 | 44 | 485s | 16 | D | 1 | Expected 213 customers, got 208 |
| fail | `dbt-sales-funnel-analysis` | hard | 12/13 | $1.30 | 33 | 353s | 6 | D | 1 | BEFORE_VIEW count 4,011 does not equal expected 4,550 |
| fail | `dbt-exchange-rate-settlement-date` | hard | 18/20 | $1.64 | 29 | 623s | 0 | D | 2 | Missing keys in fact_revenue |
| fail | `dbt-multi-warehouse-stock-rebalance` | hard | 7/8 | $1.56 | 32 | 443s | 1 | D | 1 | component_3_row_count: Row count mismatch: output=1,029, expected=1,220 |
| fail | `dbt-rfm-customer-segmentation-2` | medium | 56/57 | $1.64 | 36 | 399s | 2 | E | 1 | Customer 66ce3f95 with q4=0, q3=1, q2=1: expected 'decelerating', got 'churning' |
| fail | `dbt-monthly-channel-revenue` | hard | 93/95 | $2.51 | 34 | 555s | 22 | E | 2 | Row 47 (2024-12-01, MOBILE): strategic_recommendation expected 'Invest Heavily', got 'Scale Up' |
| fail | `time-decay-attribution-model` | hard | 25/26 | $3.20 | 63 | 798s | 2 | E | 1 | Campaign bc816a68 channels should have equal attribution |
| fail | `cohort-retention-matrix` | hard | 23/24 | $3.12 | 58 | 739s | 3 | E | 1 | early_churned_count mismatches |
| fail | `dbt-customer-retention-risk` | hard | 17/18 | $4.01 | 70 | 962s | 0 | E | 1 | component_16_above_type_avg_frequency: 30 mismatches |
| fail | `dbt-payment-fraud-analysis` | hard | 17/18 | $1.71 | 40 | 537s | 21 | E | 1 | pct_of_total_orders should sum to 1.0, got 98.18 |
| fail | `dbt-carrier-delivery-performance` | medium | 15/16 | $1.39 | 29 | 450s | 9 | E | 1 | component_14_efficiency_index_formula: efficiency index formula errors |
| fail | `dbt-harbor-marketing-mix-model` | hard | 38/41 | $6.84 | 101 | 2026s | 3 | E | 3 | Should identify at least one over-saturated channel |
| fail | `dbt-campaign-roi-analysis` | medium | 11/12 | $5.00 | 81 | 1169s | 36 | E | 1 | component_8_cpa_percentile_inverted: campaign 3632acf1 with low CPA 999.00 has a low percentile |
| fail | `dbt-product-return-analysis` | medium | 11/13 | $3.24 | 64 | 921s | 25 | E | 2 | component_11_moderate_risk_tier_logic: moderate risk product 37d567d9 should be high_risk |
| fail | `dbt-product-return-rate-analysis` | medium | 13/17 | $5.50 | 92 | 1230s | 14 | E | 4 | Return rate logic violated in 10 rows |
| fail | `dbt-fix-marketing-attribution` | medium | 9/13 | $2.11 | 39 | 602s | 5 | E | 4 |  |
| fail | `dbt-fulfillment-sla` | medium | 76/77 | $3.29 | 44 | 656s | 9 | F | 1 | NULL found in column shipping_method_name |
| fail | `dbt-fix-inventory-balance` | medium | 17/19 | $1.74 | 44 | 430s | 6 | F | 2 | Found 124 products with more than 5% revenue mismatch |
| fail | `dbt-supplier-payment-optimization` | very hard | 7/8 | $2.13 | 34 | 1299s | 16 | F | 1 | NULL values found in early_payment_discount_pct |
| fail | `dbt-supplier-scorecard` | very hard | 14/19 | $1.97 | 57 | 603s | 7 | F | 5 | Cost score mismatch for SUP0008: variance=0, expected 66.67, got 0 |
| fail | `marketing-campaigns-harbor` | hard | 218/219 | $3.02 | 78 | 578s | 0 | G | 1 | first_redemption_date mismatch for 007f4385: 2025-11-26 against 2025-11-26 00:32:51 |
| fail | `dbt-fix-multi-touch-attribution` | hard | 9/10 | $2.63 | 44 | 721s | 4 | G | 1 | component_3_schema: conversions must be INTEGER type |
| fail | `fifo-inventory-cogs` | hard | 39/50 | $5.30 | 73 | 1622s | 14 | H | 11 | FIFO VIOLATED: 110 allocations do not match expected overlap |
| fail | `dbt-multicurrency-lifo` | very hard | 0/1 | $5.15 | 81 | 1163s | 25 | H | 1 | sale_cogs validation errors |

Raw verifier output and harness configuration: https://github.com/exmergo/dex/tree/main/benchmarks/data-eng-bench

Measured by Exmergo on Snowflake’s data-eng-bench. Canonical page: https://www.exmergo.com/benchmarks/data-eng-bench/2026-08-11
