Bytes & Miles · AI
Every product is "AI-powered" now, and the phrase has stopped meaning anything. But there's a real, sharp line between an app that just calls a model somewhere inside it and an app that's genuinely agentic, and it has nothing to do with how clever the model is. It comes down to one question: who decides what the app does next, step to step: you, or the model?
In this post we'll work through a problem you've lived if you've ever run a data warehouse: one morning a dashboard that used to load instantly is crawling, nobody shipped anything new, and the cause is a single query that used to take four seconds and now takes ninety, scanning half a terabyte every time someone hits refresh.
Somebody has to notice it, work out why, fix it, and prove the fix actually held, and we'll solve that exact problem three times over. We'll build on Snowflake, though the shape is universal to any warehouse or pipeline, and the goal stays the same across all three versions; what changes is how much of the thinking we hand to the model:
Option A as a flow, left to right: a nightly job reads the query history that Snowflake already records, aggregates it, runs it through a rules engine you wrote by hand, and sends an email. There is no model anywhere in this path.
A nightly job pulls the history, rolls it up, runs it through rules you wrote, and emails what it found.
Option B as a flow, left to right: your code picks the slow queries, then a model rewrites the SQL. In Snowflake that model call is Cortex. Your code then checks the rewrite returns the same rows, benchmarks it, and emails the result. The model fills one step; your code controls everything around it.
Now the rewrite step is a model, but the model is on a leash.
Option C as a loop: you give the model a goal and a toolbox of allowed actions, such as reading a query's profile, inspecting the table, checking how it's clustered, or benchmarking a change. The model thinks about what to try next, picks one tool, observes the result, then loops back to decide its next move on its own, repeating until it judges the job is done and sends an email.
↻ the model loops on its own · until it decides it's done
This time you don't hand over a list of steps at all. You hand over two things:
And you don't have to build this loop from scratch: Snowflake's own Cortex Agents are this exact shape, an LLM handed a set of tools and left to loop inside the warehouse until the goal is met.
Think of hiring an expert and pointing at a wall of tools. You don't tell them which one to grab, or in what order: you say what "done" looks like and let them work. The model picks one tool, looks at what comes back, decides the next move, and repeats, looping on its own until it judges the job is finished. You stopped writing the steps; you only wrote the goal. That's the line.
Every step hand-written. Reliable, but blind to anything you didn't foresee.
YOU · all of itOne smart step, slotted into your line. This is what "AI-powered" usually means.
still YOUYou set the goal; the agent picks the steps. Control flow lives inside the agent.
the AGENTThe three options side by side: Option A is a straight line with no model, where you own every step. Option B is a straight line with one model dropped into it, where you still own the flow. Option C is a loop where the agent owns the choice of what happens next. On a control spectrum running from you deciding every step to the model deciding, A and B sit close to you, and C sits at the far end.
Watch the jump. A → B feels like progress, but the shape never changes; it's still a line you drew, with one box made smarter. B → C changes the shape itself: the line becomes a loop, and the decision of "what next?" moves out of your code and into the model. That jump, not the cleverness of the model, is where agentic begins.
And it doesn't take a swarm. One model running one loop has already crossed the line; multiple agents handing work back and forth is just that same idea scaled up, not what makes something agentic in the first place.