Direct answer: They govern the boundary, not the behavior inside it. Permissions define which systems an agent may touch. Which it touches, in what order, with what data in the prompt, is chosen at runtime by a non-deterministic model. For traditional software the grant determined behavior. For agents it only bounds it, so governing them requires observing what they actually did.


Every security lead I talk to has invested real work in permissions for their AI agents, and that work is not wasted. Scoped tokens, least-privilege service accounts, a careful access list per agent. The question worth sitting with is whether that investment governs agent behavior the way it governed the behavior of every system you granted permissions to before. My claim is that it used to be a complete control and is now a partial one, and the change came from the thing you pointed it at rather than from your permission model itself.

Name the two ideas that permissions live between, because the whole argument turns on keeping them separate. There is the boundary, which is the set of actions and systems an actor is allowed to reach, and there is the path, which is the specific sequence of actions the actor actually takes through that boundary on a given run. A permission grant defines the boundary. It has never, on its own, defined the path. The reason permissions felt like complete governance for decades is that for traditional software something else pinned the path down for you.

Why did permissions feel like enough before?

That something was determinism. A conventional service does what its code says, every time. Given the same input it takes the same path, and that path was written by an engineer, reviewed in a pull request, and fixed at deploy. So the boundary and the path were effectively locked together: the code chose one path, the grant made sure that path stayed legal, and knowing the permissions plus the code told you the behavior. You could reason about what the system would do because a human had already decided it, and the permission model only had to keep that decided behavior inside safe limits.

What do agents change about that?

Agentic AI severs that link, and the severing is the entire reason this is a new problem rather than an old one restated. An agent is handed a goal, not a path. It decides at runtime which permitted tools to call, in what order, with what arguments, and it can take a different path through the identical boundary on two runs of the same task. The boundary is still enforced, exactly as designed. But the path inside it is now chosen by a non-deterministic actor at execution time, not by an engineer at review time. The grant still tells you what is possible. It no longer tells you what happened, because what happened is decided after the grant, by something you did not write.

Sit with a concrete run and the gap gets vivid. An agent has legitimate permission to read a repository, call an internal pricing API, and query a model. Those three grants are all correct and all necessary. On one run the agent reads a file, notices a database URL in it, includes that URL with its embedded credential in the prompt it sends to the model, then calls the pricing API. Every action was permitted. The sequence, the decision to pull that particular file into context, and the credential riding inside the outbound prompt were all chosen at runtime and appear nowhere in your permission model. Your controls performed perfectly and still did not govern the behavior that mattered.

Can't I just tighten the permissions?

The governance move that follows is not tighter permissions, and reaching for tighter permissions first is the trap. You can narrow the boundary, and you should where a grant is genuinely unnecessary, but you cannot narrow your way to knowing the path. The agent needs to read repositories to do its job; forbidding it defeats the point of having it. The path taken through a legitimate boundary is only observable after the agent takes it, which means governance of agents has a component that permissions structurally cannot provide: after-the-fact behavioral visibility into what the agent actually did on each run.

What does behavioral visibility actually mean?

Behavioral visibility here has a specific and checkable meaning, not a vague one. It is the recorded path: the sequence of tool calls the agent made, the arguments it passed, the content it assembled into each prompt, tied to the session that produced them. That record is what lets you answer the questions a permission list cannot, such as which agents included credential-shaped strings in a prompt this week, or what the full sequence was behind a single flagged request. Those spans usually already exist if your agents emit OpenTelemetry or route through a gateway, so the raw material for the path is typically sitting in telemetry you already collect and do not yet read as behavior.

Grounding that in a concrete trace makes the difference from permissions sharp. A single agent run emits a span for each step: a retrieval span with the files it pulled, a tool-call span with the arguments it passed to the pricing API, a model span with the assembled prompt. Read in sequence and tied to one session, those spans are the path, and they show you the choice the agent made that no permission could have anticipated, such as pulling a config file into context on this run and not the last one. Your access list contained the same three grants both times. The trace is the only artifact that records which of the permitted moves the agent actually chose, and choice is the thing determinism used to remove from the picture.

Once the path is visible, permissions and behavioral visibility do complementary jobs, and seeing the division of labor is what makes both worth running. Permissions are preventive and set the outer limit of what is possible, which is necessary and cheap to enforce. Behavioral visibility is detective and tells you what happened inside that limit, which is the half agents made non-optional. One keeps the impossible impossible. The other tells you which of the many permitted paths your agents actually walked, and that second question did not need answering when a human chose the path in advance.

We built Oberhahn to give you that second half, reconstructing what each agent actually did from the telemetry and gateway traffic you already run, tracing every tool call and prompt to its session, workflow, and team so you can govern the path and not only the boundary. The demo shows the behavioral view against sample data before you connect a real source.

Two honesty rails belong on this. First, behavioral visibility is a record of what an agent did, not a claim about intent, and the useful unit is the workflow you fix or approve, not a person you rank. Attribution to a team exists so you can remediate the right pipe. Second, none of this replaces permissions. Removing the boundary because you can now see the path would be reckless. The argument is that the boundary was always half the control, that determinism quietly supplied the other half for traditional software, and that agents took that half away and left it for you to rebuild by watching what they do.


Frequently Asked Questions

Do permission controls govern what my AI agents actually do?

They govern what the agent is allowed to do, which is the boundary, not the specific path it takes through that boundary on a given run. An agent decides at runtime which permitted tools to call, in what order, and what to put in each prompt. Permissions keep the impossible impossible; they cannot tell you which of the many permitted paths the agent actually walked.

Why aren't permissions enough for agentic AI when they were enough before?

Because traditional software is deterministic. Its path was written by an engineer and fixed at deploy, so permissions plus code told you the behavior. An agent is given a goal, not a path, and chooses its actions at runtime, so it can take different paths through the same boundary on two runs. The grant still bounds what is possible but no longer determines what happens.

What is behavioral visibility for AI agents?

It is a record of the path an agent actually took: the sequence of tool calls, the arguments passed, the content assembled into each prompt, tied to the session that produced them. It is detective rather than preventive, answering what happened inside your permission boundary. The spans usually already exist in OpenTelemetry or gateway traffic, so it is mostly a matter of reading telemetry you already collect as behavior.

Should I just tighten permissions instead of monitoring behavior?

Tighten any grant that is genuinely unnecessary, but you cannot narrow your way to knowing the path. Agents need broad, legitimate access to do their work, and the risk lives in how they use that access on a given run. Permissions and behavioral visibility do different jobs: one sets the outer limit, the other shows what happened inside it, and agents made the second one necessary.