Build1 publisher3 min readPublished
Kestra 2.0 flips unmatched worker routing from waiting to failing by default
Kestra's 2.0 rewrite moves user code into a data plane the platform team has to run, and it requires a migration through 1.3.x plus a changed routing default to get there, while Prefect's Dagster deal keeps its customers where they are.
The Engineer · Build desk

What happened
- Kestra shipped version 2.0 in September with a rewritten engine, separate control and data planes, remote workers, and flows that agents can call as tools.
- The same release removes or changes several constructs, requires the upgrade to pass through 1.3.x, and changes the default for unmatched worker routing from waiting to failing.
- A Reddit thread on which orchestrator to pick produced the expected spread of answers, from staying on Dagster to buying managed, alongside a few vendors recommending their own products.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- decision Reaching the split-plane topology means scheduling two upgrades. The team that owns the maintenance window does that work, and the change mainly benefits whoever wants code running near the data.
- exposure Any flow aimed at a worker group that is not connected stops queuing silently and starts erroring the moment 2.0 goes live. The on-call rota is where the stale worker-group labels get discovered.
- constraint Running user code in your own data plane only delivers self-service if data teams can change worker images themselves; where a Python dependency needs a platform ticket, splitting the planes just relocates the queue.
- contradiction The same post tells Dagster customers nothing changes and calls long-term product direction an open question. A platform team is left with two different planning horizons for one tool.
The outbound stream is what makes the topology possible. In Kestra 2.0 the worker opens a gRPC stream out to the control plane, user code runs in the data plane, and that plane can sit in another region, another cloud, or a network with no inbound path [4]. Because the worker dials, the control plane needs no route into the network holding the data [15]. If a firewall review is what has been blocking a central orchestration service, read that line of the release notes before the feature list.
The same notes set out the migration. Several constructs are removed or changed, the upgrade has to pass through 1.3.x, and unmatched worker routing now fails by default where it used to wait [5]. That last default is the one that shows up on upgrade day. A task pointed at a worker group nobody has connected used to sit in a queue until someone noticed; now it errors. That is better behaviour, and it will surface every stale worker-group label in the repository.
Prefect's announcement runs the other way. Prefect said in July that it is acquiring Dagster Labs, and the announcement has Dagster keeping its name, its support and its open-source license, with no migration required for customers [1][2]. A post on dev.to that reads both events together allows that the deal "creates legitimate questions about long-term product direction" [13].
Five items go to the platform team in that post's proposed boundary: control plane, identity and secrets, worker environments, deployment path, shared monitoring. Five go to the data teams: workflow definitions, transformation code, data-quality rules, schedules and dependencies, domain runbooks [8][14]. The line falls between the worker environment and the code that runs inside it. "If every data team needs the platform team to install a Python dependency, self-service is mostly a logo," the post says [9]. Push the other way and workflow authors run arbitrary code with shared production credentials, at which point, the post says, "self-service has gone too far in the other direction" [10].
Task-versus-asset gets the same treatment. A task model asks what should run next; an asset model asks what data should exist and what it depends on; neither is universally better [11]. The test offered is which sentence your incidents actually use, "this job did not run" or "the customer dimension is missing yesterday's partition" [12].
The evidence that orchestrator selection has become an ownership question is one argument and one Reddit thread. Its answers were stay with Dagster, use Airflow because it is established, buy managed, or go smaller for a lean team. A few vendors turned up to recommend their own products, "because some laws of distributed systems are social" [6][7]. For the split-plane topology to be worth a two-hop upgrade, two things have to hold in your shop: data that cannot leave the network it lives in, and a platform team that can own worker images without becoming a ticket queue [4][9].
What to watch
- Whether Prefect publishes a roadmap that keeps Dagster's asset model and Prefect's task model as separate products under the promised licence and support terms.
- Upgrade reports from teams running Kestra with per-environment worker groups, where the new failing default for unmatched routing will show up first.
- Whether flows callable by agents as tools get an authorisation story separate from the worker's own credentials.