Autonomy is a runtime decision, not a model decision
Agents get more capable by default. They only get bounded on purpose.

Search for a command to run...
Agents get more capable by default. They only get bounded on purpose.

This hit home! The practical insights here are genuinely helpful. How do you measure the success metrics for a setup like this?
The runtime an agent actually needs. Execution boundaries, a tool registry that doubles as an access control list, four kinds of state, idempotent job runners, and scheduled runs nobody is watching.
One question settles most of these arguments: will more than one AI application need this capability?

Connector correctness and agent behaviour are separate problems. Most teams only test the first one.

Choosing the wrong primitive hands the model authority a person was supposed to hold.

Transport looks like a technical detail during the demo. It is really a choice about ownership, reachability and trust.

The Production Layer
66 posts
The Production Layer is a practical publication for builders moving from AI demos to reliable production systems. Sixty posts in order, plus eight specialist tracks, covering the real engineering decisions behind LLM apps, RAG, agents, multi-agent workflows, evaluation, observability, safety and governance.
An agent run once produced a perfectly reasonable plan, executed it cleanly, and wrote the output into the wrong workspace. No exception. No alert. The model behaved exactly as intended. The runtime had simply never been told where the run ended.
That is the shape of most early agent incidents. Nothing crashes. Something correct happens somewhere it should not.
The control plane decides what a run is permitted to do: which tools are enabled, which environment it targets, what budget it has, whether it is switched on at all. The runtime does the work inside those limits.
Teams collapse the two because it is faster. The agent process reads its own configuration, resolves its own credentials, picks its own target environment. Now the only record of what the agent was authorised to do is the code path it happened to take, and you can reconstruct it only by reading logs afterwards.
Keep them separate and permission becomes something you can query before a run rather than infer after one.
Most agent work is harmless. The dangerous part is small and easy to name: the moment a side effect leaves the process.
Marking those phases explicitly gives you somewhere to put a gate. Reads and planning run free. Actions execute in a sandbox with a scoped credential. Commits are the only phase that touches shared state, which makes them the phase you can require approval for, rate limit, or refuse outright in a given environment.
The alternative is one undifferentiated run() where a retry might resend an email.
The last one catches people. A kill switch that only prevents new runs is a launch control, not a stop control. Both are worth having. They are not the same thing, and during an incident you will badly want the second.
Every runtime permission your agent holds should be visible somewhere other than the source code. If the only way to answer "what was it allowed to do" is to read the implementation, you do not have a boundary. You have a habit that has held up so far.
Part 1 of 5 Days of Agent Infrastructure.