Five production agents in daily business use: retrieve, reason, act, with a guardrail on every write
Five Copilot Studio agents I designed, built and shipped are in production use every working day, covering helpdesk, sales, procurement, reporting and security. They are not pilots or demos. People open them instead of raising a ticket, hunting through a record, or interrupting a colleague.
They share one architecture. Every agent grounds its answers in real business data rather than in whatever the model happens to know, reasons over the request in the user's own words, and where it needs to change something, acts through a narrow set of operations that are defined in advance, permissioned, and logged. The model never writes to the database directly, not once, anywhere in the suite.
The knowledge people needed was already in the business. It was just in places that required you to learn a system before you could get an answer: documentation nobody had time to read, Dataverse records behind forms and views that take training to navigate, and Power BI reports behind a filter pane. Every one of those is a toll booth between a simple question and its answer.
The obvious response, put a chat box on it, is also the easy way to build something worse than what you had. The failure mode of a bad business agent is not that it is unhelpful. It is that it is confidently wrong, because it answered from the model's general knowledge instead of your data; or that it quietly changed a record it should never have been able to touch.
So the design problem was never "can an agent answer this". It was: how do you make an agent that is only ever able to answer from what is actually true here, and only ever able to do the small number of things it is supposed to be able to do?
Each agent owns one domain, with its own grounding sources and its own action surface. Keeping them separate is deliberate: a single do-everything agent has the union of every permission and every failure mode.
Every agent in the suite runs the same three-stage pattern. Naming it made the suite maintainable; adding the fifth agent was mostly a matter of deciding what went into each stage.
The important property is that the blast radius of a reasoning mistake is bounded by the action surface, not by the model's creativity. A confused agent calls the wrong flow and fails a validation check. It cannot construct an arbitrary write.
Users reach the agents through the channels they already have open. Each agent retrieves from its own grounded sources and, when it needs to change something, hands off to Power Automate, which is the only component in the diagram with write access to Dataverse. The security agent has one additional path that none of the others have: out to a human.
Splitting retrieval from action is what makes the suite auditable. Everything on the retrieve path is read-only by construction, so the entire question of "what is this agent allowed to change" reduces to one list: the flows on the act path. That list is short, it is reviewable, and it does not grow unless someone deliberately grows it.
The measure I care about is not accuracy on a test set; it is that these are open on people's screens on an ordinary Tuesday. Agents that survive contact with real users are the ones that are honest about their limits and boring about their permissions.
The pattern turned out to be the reusable part. Once retrieve → reason → act was established with the first agent, the remaining four were largely a question of choosing grounding sources and defining an action surface, which is exactly the shape you want, because it means the security properties are inherited rather than re-argued every time.
Building agents on the Power Platform, or trying to get one past a pilot? I am happy to talk it through.
Get in Touch →