The Control Plane and Execution Plane Split (Why AI Systems Are Forcing a New Architecture)
| Date | 2026-06-25 |
| Tags | #coding #ai-agents |
Most engineering pain in AI systems today comes from a single mistake:
We keep trying to run execution inside systems designed for control.
CRUD frameworks, web servers, and monolithic apps were never meant to run work. They were meant to describe it.
AI agents make that distinction impossible to ignore.
Two Planes, One System
In distributed systems, there’s an old idea that’s suddenly relevant again:
Separate the control plane from the execution plane.
You already know this pattern — even if you’ve never named it.
Control Plane answers:
-
What should happen?
-
Who is allowed to do it?
-
What is the current state?
-
What is the desired configuration?
Execution Plane answers:
-
How does it actually happen?
-
What is running right now?
-
What failed?
-
What needs to be retried?
-
What’s waiting on what?
Most traditional web apps collapse these into one.
AI systems cannot.
Why CRUD Systems Collapse Under Agents
CRUD frameworks assume:
-
Requests are short-lived
-
State is the source of truth
-
Time is incidental
-
Execution is synchronous or near-synchronous
Agentic systems assume the opposite:
-
Work is long-lived
-
Progress is incremental
-
Failure is expected
-
Time is central
-
Execution happens without users watching
Trying to force agents into CRUD systems leads to:
-
Status columns pretending to be workflows
-
Background jobs pretending to be orchestration
-
Controllers pretending to be schedulers
-
Databases pretending to be message buses
The result works, but feels wrong — because it is.
The Control Plane (What CRUD Is Actually Good At)
CRUD systems shine when modeling intent and authority.
The control plane should own:
-
User intent
-
Configuration
-
Permissions
-
Policies
-
Canonical state
-
Final outcomes
This includes:
-
“Run the agent”
-
“Cancel the task”
-
“Retry with new parameters”
-
“This is allowed”
-
“This is complete”
Think stable, inspectable, durable state.
Control Plane Diagram
+----------------------+
| Control Plane |
|----------------------|
| Users |
| API / UI |
| Auth |
| Permissions |
| Configuration |
| Canonical State |
+----------------------+
|
| commands / intent
v
CRUD is excellent here.
This is where Rails, Django, and similar frameworks still dominate.
The Execution Plane (Where Agents Actually Live)
The execution plane owns motion.
It deals with:
- Tasks
- Messages
- Events
- Retries
- Partial progress
- Timeouts
- Backpressure
- Concurrency
- Streaming output
Execution systems assume:
- Work may fail
- Work may resume
- Work may branch
- Work may outlive any single request
- Work must be observable while it runs
Execution Plane Diagram
+----------------------+
| Execution Plane |
|----------------------|
| Queues |
| Workers |
| Agents |
| Tool Runners |
| Workflow Engine |
| Event Stream |
+----------------------+
This is where:
- Agents think
- Tools execute
- Logs stream
- Progress accumulates
Trying to do this inside a CRUD framework is what causes pain.
How the Two Planes Interact
The planes communicate via commands and events — not shared logic.
Full System Diagram
+----------------------+
| Control Plane |
|----------------------|
| UI / API |
| Auth |
| Config |
| State |
+----------------------+
|
| Command: "Run agent"
v
+----------------------+
| Execution Plane |
|----------------------|
| Queue |
| Agent Coordinator |
| Workers |
| Tools |
+----------------------+
|
| Events: progress, output, failure
v
+----------------------+
| Control Plane |
|----------------------|
| Update state |
| Persist outcomes |
| Expose status |
+----------------------+
Key rule:
The control plane never blocks on execution.
It observes execution. It does not host it.
Streaming Makes the Split Obvious
Streaming output (tokens, logs, diffs) exposes the lie immediately.
If execution lives in the control plane:
- Threads get tied up
- Capacity collapses
- Latency spikes
- Backpressure becomes invisible
If execution lives in the execution plane:
- Streaming is natural
- Workers emit events
- The UI listens
- The system stays honest about time
This is why SSE + queues works so well — and SSE + Rails controllers feels brittle.
Why This Pattern Keeps Reappearing
You’ve seen this split before:
- Kubernetes
- Control plane: API server
- Execution plane: nodes, pods
- CI systems
- Control plane: pipeline definition
- Execution plane: runners
- Databases
- Control plane: metadata, schema
- Execution plane: query workers
AI agents are just the next system to force the same realization.
The Failure Mode When You Don’t Split
When you don’t separate planes, you get:
- Controllers doing orchestration
- Background jobs doing coordination
- Databases doing scheduling
- Redis doing locking
- Humans debugging timing bugs at 3am
Every workaround is a symptom.
The architecture is asking one system to be two things at once.
What This Means for Engineers
This split is becoming a career boundary.
Engineers who only know CRUD will:
- Build control planes
- Work on config, auth, and state
- Stay important — but peripheral
Engineers who understand execution systems will:
- Design agent workflows
- Own reliability
- Shape AI platforms
- Decide how systems actually behave
Both are needed — but they are no longer the same job.
The Quiet Shift
The most important architectural shift of the AI era isn’t models.
It’s this:
Execution is moving out of web frameworks. Control is staying behind.
Once you see the control plane / execution plane split, a lot of modern system design suddenly makes sense.
And once you don’t see it — everything feels painful.