AboutExpertiseWorkR&DBlogToolsStartContact

One agent is an integration. A hundred is a governance problem.

Agents got production identities before they got a stable way to record what they did. Microsoft Entra Agent ID is generally available, with sponsors and expiry dates. The OpenTelemetry conventions for agent traces are still experimental. That gap is not a detail: it decides what you can responsibly put into production this year, and it turns an AI question into a governance one.

pH7x Systems® · · 10 min read

The interesting question about agents stopped being whether they work. In the projects we see, one agent that reads a supplier email and proposes the matching purchase order works well enough to keep. The interesting question is what happens on the day you have forty of them, built by four teams, three of which have moved on to something else.

That is not an AI problem. Every part of it is a problem the industry already knows by name: identity, entitlement, audit, cost attribution, blast radius, change control. The difficulty is that they all arrive at once, attached to something that makes its own decisions.

Three waves, and only the third is hard

The first wave was about models. Which one, how big, how much per million tokens. It felt decisive at the time and turned out to be the least durable question: the model in production today will be replaced twice before this article is old.

The second wave was about agents. How to connect one to a real system, where the line falls between what it decides and what code executes. We wrote about that line in agents decide, code executes, and the answer holds: judgement on one side, guarantees on the other.

The third wave is not about better agents. It is about a fleet of them. And a fleet behaves nothing like an integration, because the failure mode changes. One agent that gets a permission wrong is a bug. Forty agents sharing one service principal is an incident with no way to tell which of them did it.

What actually changed in the last year

Two things happened that are worth being precise about, because the precision is the argument.

Agents got real identities. Microsoft Entra Agent ID introduces four new object types: an agent identity blueprint, a blueprint principal, an agent identity, and an agent user. An agent identity is an account in Entra ID, governed with the same lifecycle machinery as a person: access packages, entitlement management, Conditional Access applied at blueprint level so every agent created from it inherits the policy, and risk signals from Identity Protection.

The part of that design worth pausing on is the sponsor. Every agent identity has a human being accountable for its access and its lifecycle. If that person leaves the organisation, sponsorship transfers automatically to their manager. Someone is always answerable for the agent, by construction, and the system refuses to let that be nobody.

Agents did not get a stable way to record what they did. The OpenTelemetry GenAI semantic conventions, the vendor-neutral vocabulary for agent traces, moved into a dedicated repository in the v1.42.0 release of 12 June 2026 and remain pre-stable. There is no 1.0. The shape is good and widely emitted, and it is still explicitly expected to churn.

Put those side by side and the asymmetry is the whole story:

Concern Where it stands What that means in practice
Identity Generally available, governed You can give an agent a name, a sponsor and an expiry date
Entitlement Generally available Access arrives through a package, with an approver and an end date
Access conditions Generally available Conditional Access evaluates agent risk before granting
Trace and audit Pre-stable, no 1.0 You can instrument it, and you pin the version and expect churn
Evaluation quality Pre-stable Whether the agent did the right thing is still yours to define

We can now say who an agent is, what it may touch, and who answers for it. Saying exactly what it did, in a format that will still parse next year, is the part that has not landed. Anyone planning a fleet this year is planning around that gap, whether or not they have noticed it.

The protocol grew a governance structure

There is a second piece of evidence, and it is not an analogy.

The Model Context Protocol spent its first year being a description layer: this tool exists, here is how to call it. The revisions since have been almost entirely about control. The June 2025 revision classified MCP servers as OAuth 2.0 Resource Servers, made protected resource metadata mandatory under RFC 9728, and required clients to bind each access token to a specific server with the resource parameter from RFC 8707. The November 2025 revision added incremental scope consent through the WWW-Authenticate header, OAuth client ID metadata documents for registration, and an experimental tasks mechanism for durable requests with polling and deferred results.

That last one matters more than it looks. Tasks exist because agents started doing work that outlives a request. Work that outlives a request is work that needs a status, an owner and a way to be cancelled, which is the definition of something you have to govern.

And then the protocol did the thing that infrastructure does when it becomes load bearing: it formalised its own governance. Working groups, interest groups, a documented governance structure, an SDK tiering system with maintenance commitments. Protocols that stay toys do not grow committees.

What a fleet needs, and who owns each part

The nine concerns below are the ones we have watched go wrong. Grouping them this way is useful because it shows that almost none of them belong to the AI team.

Concern The failing question Who owns it
Identity Which agent did this? Identity
Entitlement Who approved that access, and when does it end? Identity and the business owner
Isolation What else could it reach when it went wrong? Platform
Audit Can we reconstruct the decision six months later? Platform and compliance
Observability Is it failing right now, and how would we know? Platform
Cost Which team pays for that loop? Finance and platform
Policy What is it never allowed to do, regardless of prompt? Security
Approval Which actions need a person before they commit? The business owner
Responsibility Who signs when it is wrong? A named human

Only the last row is new, and it is new only in the sense that the industry has not yet built the habit.

One identity per agent, and why the shortcut is expensive

The single most common shortcut we see is one service principal shared by every agent a team ships. It is easy, it works on day one, and it destroys three properties at once.

You lose attribution: the audit log records the principal, not which agent used it, and the answer to "which one did this" becomes a reconstruction exercise across application logs that may not exist. You lose least privilege: the shared principal accumulates the union of every permission any agent needed, so the newest and least reviewed agent inherits the rights of the oldest and most trusted. And you lose the ability to revoke: turning off the compromised agent turns off all of them.

The shape that survives is boring and familiar:

Blueprint: policy and inherited scopesAgent identity: one per agentAccess package: approver and expiryConditional Access: risk evaluated per call

One blueprint carries the policy. Each agent gets its own identity from it. Access arrives through a package with an approver and an end date, rather than as a permanent grant that outlives the project that needed it.

The detail that deserves a decision, not a default

Entra Agent ID allows an agent identity to request an access package programmatically, on its own behalf, by creating an assignment request. The sponsor can also request on the agent's behalf, and an administrator can assign directly.

Read that first pathway again. An agent can ask for more access.

This is not a flaw. It is the correct primitive for a system where work is discovered at runtime, and the request still lands in an approval workflow with a human approver. But it is a genuine architectural fork, and it should be a decision your organisation makes deliberately rather than one it discovers in an audit.

Our position, from the same reasoning we apply to any privilege escalation path: the ability to request is fine, the approval must never be automatic, and the approver must be someone who understands what the resource is. An approval workflow that routes to a person who cannot evaluate the request is a rubber stamp with better logging.

Approval belongs at the irreversible step

The instinct, once a team realises how much an agent can do, is to put a human in front of everything. That fails within a fortnight: the reviewers stop reading, and you have added latency without adding judgement.

The line that holds is the same one that governs the rest of the system. Ask for a person where the action is irreversible or externally visible, and nowhere else.

Approve Do not approve
Money leaving the organisation Reading data the requester can already read
Anything sent to a customer Summarising, ranking, drafting
Permission and role changes Querying systems of record
Deleting or overwriting records Proposing an action for review
Publishing to a public surface Anything trivially undone

The test is not how important the action feels. It is whether an unnoticed mistake can still be corrected on Monday.

Cost is a control, not a report

Token spend is usually treated as a finance question discovered at the end of the month. In a fleet it is a safety mechanism, because runaway cost and runaway behaviour are the same event seen from two angles. An agent stuck in a retry loop against a tool that keeps failing produces exactly one visible symptom before anyone notices the behaviour: the bill.

Which means the budget belongs at the identity, not in a dashboard:

python
# The limit belongs to the agent identity, not to a monthly review.
# An agent stuck in a loop spends its own budget and stops. It does not
# spend the team's, and it does not spend the next agent's.
def call_model(agent: AgentIdentity, request: Request) -> Response:
    if budget.spent(agent.id, today()) >= agent.daily_limit:
        raise BudgetExhausted(agent.id)          # fail closed, and alert
    response = model.invoke(request)
    budget.record(agent.id, response.tokens, response.cost)
    return response

Per-agent limits give you three things a monthly report cannot: the loop stops itself, the failure is attributed to one agent instead of one team, and the alert fires while the cause is still on screen.

Audit, when the reason is a probability

Traditional audit answers what happened and under whose authority. With agents there is a third question, and it is the one that gets asked in the room after an incident: why did it choose that.

That answer cannot be a model explanation, because a post hoc explanation from a model is a plausible narrative, not a record. What can be recorded is everything around the decision, and it turns out to be enough:

  • the agent identity, not the shared principal;
  • the tools available at that moment, and their versions;
  • the inputs the agent actually received, including what a retrieval step returned;
  • the tool calls made, in order, with parameters;
  • the approvals granted, by whom, and when;
  • the model and version, because behaviour changes between them.

Recreate those and you can reproduce the decision, which is what an auditor wants. This is also precisely the surface the OpenTelemetry GenAI conventions describe, and precisely why their pre-stable status is a planning constraint rather than a footnote. Instrument now, pin the convention version, and expect to migrate.

The uncomfortable conclusion

An organisation with clean identity, working entitlement management, real audit and honest cost attribution can put a fleet of agents into production this year. An organisation without those is not slow because it lacks agents. It is slow because that foundation was never built, and agents make the absence measurable in a way that nothing before them did.

We wrote something similar about the assistant that only reads what the user can read and about what to put in order before switching Copilot on. The pattern repeats because it is not really about AI. Each wave of automation asks the same question of an organisation, and asks it louder: do you know who is allowed to do what, and can you prove what was done?

Agents are the loudest version of that question so far. They are also the first that will keep asking it several hundred times a day, without getting tired, until someone answers.

Keep reading