[ use case · migration ]
Migrations that prove themselves.
Your agent rewrites every model. Each one runs against a 4.20% scale model of the warehouse you're leaving, and has to match its numbers before it moves. The cutover date is the day the last model matches.
8
days, Snowflake → Iceberg
400
models migrated
0
models with drift
100+
attempts an hour
[ runs on ]
StarRocks
Spark
Trino
DuckDBSnowflake
Databricks
[ paths ]
From the stack you have to the one you want.
[ how a migration runs ]
Model by model. Never big-bang.
- 01
Scale model
We sample the warehouse you're leaving: 4.20% of the bytes, whole customers, full history, joins intact.
- 02
Rewrite
Your agent translates each model to the new engine or dialect. Claude Code, Codex, or your own harness.
- 03
Check
Row counts, sums, nulls and distributions, against the original. If the numbers don't match, it goes again.
- 04
Run in parallel
Matched models run beside the originals on full data, for as long as your team wants to watch.
- 05
Cut over
One model at a time, in the order your team picks. The last match is the cutover date.
# matched on attempt 2
✓ stg_users · zero drift
✓ stg_orders · zero drift
✓ dim_date · zero drift
✓ dim_geo · zero drift
# matched on attempt 6
✓ fct_sessions · zero drift
✓ fct_orders_daily · zero drift
✓ int_order_items · zero drift
# matched on attempt 14
✓ fct_revenue · zero drift
✓ mart_finance_pl · zero drift
✓ rpt_ltv · zero drift
# matched on attempt 40
✓ fct_attribution · zero drift
✓ mart_growth · zero drift
… 389 more models. Same verdict.
[ who does what ]
Your engineers run the migration. The agent does the typing.
The agent
- Rewrites all 400 models
- Reruns every miss until it matches
- Writes the evidence for each one
Your team
- Picks the order
- Reviews evidence, not SQL
- Owns the cutover
“We stopped arguing about the cutover date. The log was the cutover date.”
[ read next ]
Working on something like this? Chat with Founders →

dbt