A session is a real Linux machine. The agent installs what it needs, runs the query, does the work in a script you can read, and commits it. What lands is the analysis and the code that produced it — reproducible by definition, because it is a file in your repo.
Real shell · real packages · the notebook lands in the repo
Most of the queue is not modelling. It is the fourth variation of a question someone already asked, a pipeline that broke overnight, or a definition of "active" that three teams disagree about. That queue is the handoff.
Somebody asks what happened to conversion in week 27. It writes the query, runs it, checks the result against a second cut, and answers with both the number and the SQL. The next person to ask does not need you either.
It reads the failure, reproduces the transformation on its own machine against a sample, finds the row shape that broke it, and opens a change request with the fix and a test that would have caught it.
Nulls where there should not be, distributions that shifted, joins that started fanning out, a dimension that grew 40% overnight. It reports what moved and what it thinks moved it — and says when it does not know.
It finds every place a metric is computed, diffs the definitions against each other, and reports where they disagree. This is unglamorous, genuinely hard to schedule, and the reason two dashboards show different revenue.
Profile the dataset, plot the distributions, check for leakage and imbalance, and write the first honest paragraph about what is in the data. You start from a briefed position rather than from an empty cell.
The weekly cohort cut, the monthly retention curve, the quarterly segment refresh. Same code, new period, run by a trigger, landing as a change request with the chart regenerated.
A chat answer is unfalsifiable and unrepeatable. So an analysis session commits its work: the query, the script, the notebook, the chart, and the note about what it checked. That is what arrives for review.
-- Week 27 conversion, split by first-touch surface.-- Excludes internal domains: they run the smoke suite hourly and-- accounted for 4.1% of week-27 signups before this filter.with first_touch as (select account_id,min(occurred_at) as first_seen,argmin(surface, occurred_at) as surfacefrom eventswhere occurred_at >= date "2026-06-29"and email not like "%@acme-internal.example"group by account_id)select surface,count(*) as accounts,countif(converted_at is not null) as converted,round(countif(converted_at is not null)/ count(*), 4) as ratefrom first_touch join accounts using (account_id)group by surfaceorder by accounts desc;
The agent has a shell and a filesystem. It can install a package, pull a sample down, run it, look at the output, and try again — the loop an analyst actually works in, rather than one shot at a fixed set of tools.
The answer and the thing that produced the answer arrive together in the same change request. Re-running it next month is a re-run, not a reconstruction.
The filters, the date boundaries, the rows it dropped and why. An analysis whose exclusions are undocumented is not an analysis, and a comment in the query is the cheapest possible place to keep them.
We are not going to list a row of warehouse logos we have not verified. Here is what is genuinely true about how an analysis session reaches data, including the part where it does the work locally.
Easy connect covers 3,000+ apps through their own OAuth screens, and it is the right route for the SaaS sources around the edges of a data stack. For the warehouse itself the direct connector types are usually the honest answer — most warehouses are reached through a driver or an API, not an OAuth catalogue entry.
The same session machinery started three ways. The isolation and the review path do not change with the trigger.
Somebody asks in a channel. The mention starts a session, the session does the work on its own machine, and the answer lands back in the same thread with the query attached.
Set the read actions to Allow and anything that writes to a warehouse or overwrites a table to Ask. The run pauses at the call with the statement in front of you and resumes from that exact point when you approve.
A cron trigger re-runs the recurring analysis against the new period and opens a change request with the regenerated output. A second one runs the quality sweep and only says something when a check fails.
An analysis agent is mostly a read problem — right up until the moment it is not. Be exact about both halves.
One project, one set of connectors, one memory that compounds. Each team writes the skills for its own work; nobody stands up a second system.
Open source and self-hostable. Any model, your keys. Kortix Cloud, your own VPC, or your own on-prem network.